]>
git.ipfire.org Git - people/ms/ipfire-3.x.git/blob - naoki/backend.py
5 import urlgrabber
.progress
11 from constants
import *
14 "package_names" : None,
18 def find_package_info(name
, toolchain
=False):
19 for repo
in get_repositories(toolchain
):
20 if not os
.path
.exists(os
.path
.join(repo
.path
, name
, name
+ ".nm")):
23 return PackageInfo(name
, repo
=repo
)
25 def find_package(name
, toolchain
=False):
26 package
= find_package_info(name
, toolchain
)
28 package
= backend
.Package(package
)
32 def parse_package_info(names
, toolchain
=False):
35 package
= find_package_info(name
, toolchain
)
37 packages
.append(package
)
41 def parse_package(names
, toolchain
=False, naoki
=None):
42 packages
= parse_package_info(names
, toolchain
)
44 return [Package(package
.name
, naoki
=naoki
, toolchain
=toolchain
) \
45 for package
in packages
]
47 def get_package_names(toolchain
=False):
48 if not __cache
["package_names"]:
50 for repo
in get_repositories(toolchain
):
51 names
.extend(repo
.package_names
)
53 __cache
["package_names"] = sorted(names
)
55 return __cache
["package_names"]
57 def get_group_names():
58 if not __cache
["group_names"]:
60 for package
in parse_package_info(get_package_names()):
61 if not package
.group
in groups
:
62 groups
.append(package
.group
)
64 __cache
["group_names"] = sorted(groups
)
66 return __cache
["group_names"]
68 def find_package_name(name
, toolchain
=False):
69 if name
in get_package_names(toolchain
):
72 for package
in get_package_names(toolchain
):
73 if os
.path
.basename(package
) == name
:
76 def depsolve(packages
, recursive
=False, build
=False, toolchain
=False):
78 for package
in packages
:
79 if not package
in deps
:
82 if not recursive
or not deps
:
88 deps
.extend(dep
.dependencies
)
89 if build
and not toolchain
:
90 deps
.extend(dep
.dependencies_build
)
94 if not dep
in new_deps
:
99 if length
== len(deps
):
105 def deptree(packages
, toolchain
=False):
111 for package
in stage
[:]:
112 for dep
in package
.dependencies_all
:
114 stage
.remove(package
)
127 def depsort(packages
, toolchain
=False):
129 for l1
in deptree(packages
, toolchain
=toolchain
):
133 def download(files
, logger
=None):
135 filepath
= os
.path
.join(TARBALLDIR
, file)
137 if not os
.path
.exists(TARBALLDIR
):
138 os
.makedirs(TARBALLDIR
)
140 if os
.path
.exists(filepath
):
143 url
= config
["sources_download_url"] + "/" + file
146 logger
.debug("Retrieving %s" % url
)
148 g
= urlgrabber
.grabber
.URLGrabber(
149 user_agent
= "%sSourceGrabber/%s" % (config
["distro_name"], config
["distro_version"],),
150 progress_obj
= urlgrabber
.progress
.TextMeter(),
155 gobj
= g
.urlopen(url
)
156 except urlgrabber
.grabber
.URLGrabError
, e
:
157 logger
.error("Could not retrieve %s - %s" % (url
, e
))
160 # XXX Need to check SHA1 sum here
162 fobj
= open(filepath
, "w")
163 fobj
.write(gobj
.read())
167 class PackageInfo(object):
170 def __init__(self
, name
, repo
=None):
174 self
.arch
= arches
.current
["name"]
176 #def __cmp__(self, other):
177 # return cmp(self.name, other.name)
180 return "<PackageInfo %s>" % self
.name
183 if not self
.__data
.has_key(self
.name
):
184 self
.__data
[self
.name
] = self
.fetch()
186 return self
.__data
[self
.name
]
188 def set_data(self
, data
):
189 self
.__data
[self
.name
] = data
191 _data
= property(get_data
, set_data
)
194 env
= os
.environ
.copy()
195 env
.update(config
.environment
)
197 "PKG_ARCH" : self
.arch
,
200 output
= util
.do("make -f %s" % self
.filename
, shell
=True,
201 cwd
=os
.path
.join(PKGSDIR
, self
.repo
.name
, self
.name
), returnOutput
=1, env
=env
)
204 for line
in output
.splitlines():
205 a
= line
.split("=", 1)
206 if not len(a
) == 2: continue
208 ret
[key
] = val
.strip("\"")
210 ret
["FINGERPRINT"] = self
.fingerprint
217 def getPackage(self
, naoki
):
218 return Package(self
.name
, naoki
)
223 "build_deps" : [dep
.name
for dep
in self
.dependencies_build
],
224 "deps" : [dep
.name
for dep
in self
.dependencies
],
225 "description" : self
.description
,
226 "filename" : self
.filename
,
227 "fingerprint" : self
.fingerprint
,
228 "files" : self
.package_files
,
229 "group" : self
.group
,
230 "license" : self
.license
,
231 "maintainer" : self
.maintainer
,
233 "objects" : self
.objects
,
234 "patches" : self
.patches
,
235 "release" : self
.release
,
236 "summary" : self
.summary
,
238 "version" : self
.version
,
243 return self
.dependencies_unbuilt
== []
247 for file in self
.package_files
:
248 if not os
.path
.exists(os
.path
.join(PACKAGESDIR
, file)):
253 def _dependencies(self
, s
, recursive
=False, toolchain
=False):
255 if not self
._data
.has_key(c
):
256 deps
= parse_package(self
._data
.get(s
).split(" "), toolchain
=toolchain
)
257 self
._data
.update({c
: depsolve(deps
, recursive
)})
259 return self
._data
.get(c
)
262 def dependencies(self
):
264 return self
.dependencies_toolchain
266 return self
._dependencies
("PKG_DEPENDENCIES")
269 def dependencies_build(self
):
270 return self
._dependencies
("PKG_BUILD_DEPENDENCIES")
273 def dependencies_built(self
):
275 for dep
in self
.dependencies_all
:
282 def dependencies_unbuilt(self
):
284 for dep
in self
.dependencies_all
:
291 def dependencies_all(self
):
292 deps
= self
.dependencies
293 if not self
.__toolchain
:
294 deps
.extend(self
.dependencies_build
)
295 return depsolve(deps
, build
=True, recursive
=True, toolchain
=self
.__toolchain
)
298 def dependencies_toolchain(self
):
299 return self
._dependencies
("PKG_TOOLCHAIN_DEPENDENCIES", toolchain
=True)
302 def description(self
):
303 return self
._data
.get("PKG_DESCRIPTION")
307 return os
.path
.join(PKGSDIR
, self
.repo
.name
, self
.name
,
308 os
.path
.basename(self
.name
)) + ".nm"
311 def fingerprint(self
):
312 return "%d" % os
.stat(self
.filename
).st_mtime
316 return self
._data
.get("PKG_GROUP")
320 return "%s-%s-%s" % (self
.name
, self
.version
, self
.release
)
324 return self
._data
.get("PKG_LICENSE")
327 def maintainer(self
):
328 return self
._data
.get("PKG_MAINTAINER")
336 return self
._data
.get("PKG_OBJECTS").split(" ")
339 def package_files(self
):
340 return self
._data
.get("PKG_PACKAGES_FILES").split(" ")
344 return self
._data
.get("PKG_PATCHES").split(" ")
348 return self
._data
.get("PKG_REL")
352 return self
._data
.get("PKG_SUMMARY")
356 return self
._data
.get("PKG_URL")
360 return self
._data
.get("PKG_VER")
363 def __toolchain(self
):
364 return self
.repo
.name
== "toolchain"
367 class Package(object):
368 def __init__(self
, name
, naoki
, toolchain
=False):
369 self
.info
= find_package_info(name
, toolchain
)
372 #self.log.debug("Initialized package object %s" % name)
375 return "<Package %s>" % self
.info
.name
377 def __cmp__(self
, other
):
378 return cmp(self
.name
, other
.name
)
380 def __getattr__(self
, attr
):
381 return getattr(self
.info
, attr
)
384 environment
= chroot
.Environment(self
)
388 download(self
.info
.objects
, logger
=self
.log
)
390 def extract(self
, dest
):
391 files
= [os
.path
.join(PACKAGESDIR
, file) for file in self
.package_files
]
395 self
.log
.debug("Extracting %s..." % files
)
396 util
.do("%s --root=%s %s" % (os
.path
.join(TOOLSDIR
, "decompressor"),
397 dest
, " ".join(files
)), shell
=True)
401 return self
.naoki
.logging
.getBuildLogger(self
.info
.id)
404 def get_repositories(toolchain
=False):
406 return [Repository("toolchain")]
409 for repo
in os
.listdir(PKGSDIR
):
410 if os
.path
.isdir(os
.path
.join(PKGSDIR
, repo
)):
413 repos
.remove("toolchain")
415 return [Repository(repo
) for repo
in repos
]
417 class Repository(object):
418 def __init__(self
, name
):
422 return "<Repository %s>" % self
.name
427 for package
in os
.listdir(self
.path
):
428 package
= PackageInfo(package
, repo
=self
)
429 packages
.append(package
)
434 def package_names(self
):
435 return [package
.name
for package
in self
.packages
]
439 return os
.path
.join(PKGSDIR
, self
.name
)
441 if __name__
== "__main__":
442 pi
= PackageInfo("core/grub")
444 print pi
.dependencies