]>
git.ipfire.org Git - people/ms/ipfire-3.x.git/blob - naoki/backend.py
10 from constants
import *
13 "package_names" : None,
17 def get_package_names(toolchain
=False):
18 if not __cache
["package_names"]:
20 for repo
in get_repositories(toolchain
):
21 names
.extend(repo
.package_names
)
23 __cache
["package_names"] = sorted(names
)
25 return __cache
["package_names"]
27 def get_group_names():
28 if not __cache
["group_names"]:
30 for package
in get_package_names():
31 package
= PackageInfo(package
)
32 if not package
.group
in groups
:
33 groups
.append(package
.group
)
35 __cache
["group_names"] = sorted(groups
)
37 return __cache
["group_names"]
39 def find_package_name(name
, toolchain
=False):
40 if name
in get_package_names(toolchain
):
43 for package
in get_package_names(toolchain
):
44 if os
.path
.basename(package
) == name
:
47 def depsolve(packages
, recursive
=False):
49 for package
in packages
:
50 if not package
in deps
:
53 if not recursive
or not deps
:
59 deps
.extend(dep
.dependencies
)
63 if not dep
in new_deps
:
68 if length
== len(deps
):
74 def deptree(packages
):
80 for package
in stage
[:]:
81 for dep
in package
.info
.dependencies_all
:
96 def depsort(packages
):
98 for l1
in deptree(packages
):
102 def download(files
, logger
=None):
104 filepath
= os
.path
.join(TARBALLDIR
, file)
106 if not os
.path
.exists(TARBALLDIR
):
107 os
.makedirs(TARBALLDIR
)
109 if os
.path
.exists(filepath
):
112 url
= config
["sources_download_url"] + "/%s" % urllib
.pathname2url(file)
115 logger
.debug("Retrieving %s" % url
)
117 g
= urlgrabber
.grabber
.URLGrabber(
118 user_agent
= "%sSourceGrabber/%s" % (config
["distro_name"], config
["distro_version"],),
119 progress_obj
= urlgrabber
.progress
.TextMeter(),
123 gobj
= g
.urlopen(url
)
124 except urlgrabber
.grabber
.URLGrabError
, e
:
125 logger
.error("Could not retrieve %s - %s" % (url
, e
))
128 # XXX Need to check SHA1 sum here
130 fobj
= open(filepath
, "w")
131 fobj
.write(gobj
.read())
135 class PackageInfo(object):
138 def __init__(self
, name
):
142 return "<PackageInfo %s>" % self
.name
145 if not self
.__data
.has_key(self
.name
):
146 self
.__data
[self
.name
] = self
.fetch()
148 return self
.__data
[self
.name
]
150 def set_data(self
, data
):
151 self
.__data
[self
.name
] = data
153 _data
= property(get_data
, set_data
)
156 env
= os
.environ
.copy()
157 env
.update(config
.environment
)
158 env
["PKGROOT"] = PKGSDIR
159 output
= util
.do("make -f %s" % self
.filename
, shell
=True,
160 cwd
=os
.path
.join(PKGSDIR
, self
.name
), returnOutput
=1, env
=env
)
163 for line
in output
.splitlines():
164 a
= line
.split("=", 1)
165 if not len(a
) == 2: continue
167 ret
[key
] = val
.strip("\"")
169 ret
["FINGERPRINT"] = self
.fingerprint
176 def getPackage(self
, naoki
):
177 return Package(self
.name
, naoki
)
182 "description" : self
.description
,
183 "filename" : self
.filename
,
184 "fingerprint" : self
.fingerprint
,
185 "group" : self
.group
,
186 "license" : self
.license
,
187 "maintainer" : self
.maintainer
,
189 "objects" : self
.objects
,
190 "patches" : self
.patches
,
191 "release" : self
.release
,
192 "summary" : self
.summary
,
193 "version" : self
.version
,
196 def _dependencies(self
, s
, recursive
=False):
198 if not self
._data
.has_key(c
):
200 for name
in self
._data
.get(s
).split(" "):
201 name
= find_package_name(name
)
203 deps
.append(Dependency(name
))
205 self
._data
.update({c
: depsolve(deps
, recursive
)})
207 return self
._data
.get(c
)
210 def dependencies(self
):
211 return self
._dependencies
("PKG_DEPENDENCIES")
214 def dependencies_build(self
):
215 return self
._dependencies
("PKG_BUILD_DEPENDENCIES")
218 def dependencies_all(self
):
219 return depsolve(self
.dependencies
+ self
.dependencies_build
, recursive
=True)
222 def description(self
):
223 return self
._data
.get("PKG_DESCRIPTION")
227 return os
.path
.join(PKGSDIR
, self
.name
, os
.path
.basename(self
.name
)) + ".nm"
230 def fingerprint(self
):
231 return "%d" % os
.stat(self
.filename
).st_mtime
235 return self
._data
.get("PKG_GROUP")
239 return "%s-%s-%s" % (self
.name
, self
.version
, self
.release
)
243 return self
._data
.get("PKG_LICENSE")
246 def maintainer(self
):
247 return self
._data
.get("PKG_MAINTAINER")
255 return self
._data
.get("PKG_OBJECTS").split(" ")
258 def package_files(self
):
259 return self
._data
.get("PKG_PACKAGES_FILES").split(" ")
263 return self
._data
.get("PKG_PATCHES").split(" ")
267 return self
._data
.get("PKG_REL")
271 return self
._data
.get("PKG_SUMMARY")
275 return self
._data
.get("PKG_VER")
278 class Dependency(PackageInfo
):
280 return "<Dependency %s>" % self
.name
283 class Package(object):
284 def __init__(self
, name
, naoki
):
285 self
.info
= PackageInfo(name
)
288 #self.log.debug("Initialized package object %s" % name)
291 environment
= chroot
.Environment(self
)
295 download(self
.info
.objects
, logger
=self
.log
)
297 def extract(self
, dest
):
298 files
= [os
.path
.join(PACKAGESDIR
, file) for file in self
.info
.package_files
]
302 self
.log
.debug("Extracting %s..." % files
)
303 util
.do("%s --root=%s %s" % (os
.path
.join(TOOLSDIR
, "decompressor"),
304 dest
, " ".join(files
)), shell
=True)
308 return self
.naoki
.logging
.getBuildLogger(self
.info
.id)
311 def get_repositories(toolchain
=False):
313 return Repository("toolchain")
316 for repo
in os
.listdir(PKGSDIR
):
317 if os
.path
.isdir(os
.path
.join(PKGSDIR
, repo
)):
320 repos
.remove("toolchain")
322 return [Repository(repo
) for repo
in repos
]
324 class Repository(object):
325 def __init__(self
, name
):
329 return "<Repository %s>" % self
.name
334 for package
in os
.listdir(self
.path
):
335 package
= PackageInfo(os
.path
.join(self
.name
, package
))
336 packages
.append(package
)
341 def package_names(self
):
342 return [package
.name
for package
in self
.packages
]
346 return os
.path
.join(PKGSDIR
, self
.name
)
348 if __name__
== "__main__":
349 pi
= PackageInfo("core/grub")
351 print pi
.dependencies