Mercurial > treepkg > treepkg
comparison treepkg/packager.py @ 55:6b5f7f7575f6
merge
author | Bernhard Herzog <bh@intevation.de> |
---|---|
date | Tue, 10 Apr 2007 12:07:39 +0200 |
parents | e1028211d34b b0014b8f6029 |
children | 9a602d8eaa60 |
comparison
equal
deleted
inserted
replaced
51:e1028211d34b | 55:6b5f7f7575f6 |
---|---|
30 class SourcePackager(object): | 30 class SourcePackager(object): |
31 | 31 |
32 # Derived classes must supply the package basename | 32 # Derived classes must supply the package basename |
33 pkg_basename = None | 33 pkg_basename = None |
34 | 34 |
35 def __init__(self, pkg_line, status, work_dir, src_dir, revision): | 35 def __init__(self, track, status, work_dir, src_dir, revision): |
36 self.pkg_line = pkg_line | 36 self.track = track |
37 self.status = status | 37 self.status = status |
38 self.work_dir = work_dir | 38 self.work_dir = work_dir |
39 self.src_dir = src_dir | 39 self.src_dir = src_dir |
40 self.revision = revision | 40 self.revision = revision |
41 assert(self.pkg_basename) | 41 assert(self.pkg_basename) |
62 | 62 |
63 Where pkg_basename is the value of self.pkg_basename and version | 63 Where pkg_basename is the value of self.pkg_basename and version |
64 is the return value of the determine_package_version() method. | 64 is the return value of the determine_package_version() method. |
65 """ | 65 """ |
66 temp_dir = os.path.join(self.work_dir, "temp") | 66 temp_dir = os.path.join(self.work_dir, "temp") |
67 self.pkg_line.export_sources(temp_dir) | 67 self.track.export_sources(temp_dir) |
68 | 68 |
69 pkgbaseversion = self.determine_package_version(temp_dir) | 69 pkgbaseversion = self.determine_package_version(temp_dir) |
70 pkgbasedir = os.path.join(self.work_dir, | 70 pkgbasedir = os.path.join(self.work_dir, |
71 self.pkg_basename + "-" + pkgbaseversion) | 71 self.pkg_basename + "-" + pkgbaseversion) |
72 | 72 |
112 uses such prefixes for the kde packages. | 112 uses such prefixes for the kde packages. |
113 """ | 113 """ |
114 debian_dir = os.path.join(pkgbasedir, "debian") | 114 debian_dir = os.path.join(pkgbasedir, "debian") |
115 changelog = os.path.join(debian_dir, "changelog") | 115 changelog = os.path.join(debian_dir, "changelog") |
116 | 116 |
117 self.pkg_line.copy_debian_directory(debian_dir) | 117 self.track.copy_debian_directory(debian_dir) |
118 | 118 |
119 logging.info("Updating %r", changelog) | 119 logging.info("Updating %r", changelog) |
120 oldversion = util.debian_changelog_version(changelog) | 120 oldversion = util.debian_changelog_version(changelog) |
121 if ":" in oldversion: | 121 if ":" in oldversion: |
122 oldversionprefix = oldversion.split(":")[0] + ":" | 122 oldversionprefix = oldversion.split(":")[0] + ":" |
123 else: | 123 else: |
124 oldversionprefix = "" | 124 oldversionprefix = "" |
125 run.call(cmdexpand("debchange -c $changelog" | 125 run.call(cmdexpand("debchange -c $changelog" |
126 " -v ${oldversionprefix}${pkgbaseversion}-kk1" | 126 " -v ${oldversionprefix}${pkgbaseversion}-kk1" |
127 " $changemsg", **locals()), | 127 " $changemsg", **locals()), |
128 env=self.pkg_line.debian_environment()) | 128 env=self.track.debian_environment()) |
129 | 129 |
130 | 130 |
131 def create_source_package(self, pkgbasedir, origtargz): | 131 def create_source_package(self, pkgbasedir, origtargz): |
132 """Creates a new source package from pkgbasedir and origtargz""" | 132 """Creates a new source package from pkgbasedir and origtargz""" |
133 logging.info("Creating new source package") | 133 logging.info("Creating new source package") |
134 run.call(cmdexpand("dpkg-source -b $directory $tarball", | 134 run.call(cmdexpand("dpkg-source -b $directory $tarball", |
135 directory=os.path.basename(pkgbasedir), | 135 directory=os.path.basename(pkgbasedir), |
136 tarball=os.path.basename(origtargz)), | 136 tarball=os.path.basename(origtargz)), |
137 cwd=os.path.dirname(pkgbasedir), | 137 cwd=os.path.dirname(pkgbasedir), |
138 suppress_output=True, | 138 suppress_output=True, |
139 env=self.pkg_line.debian_environment()) | 139 env=self.track.debian_environment()) |
140 | 140 |
141 def move_source_package(self, pkgbasename): | 141 def move_source_package(self, pkgbasename): |
142 """Moves the new source package from the work_dir to the src_dir""" | 142 """Moves the new source package from the work_dir to the src_dir""" |
143 logging.info("Moving source package to %r", self.src_dir) | 143 logging.info("Moving source package to %r", self.src_dir) |
144 util.ensure_directory(self.src_dir) | 144 util.ensure_directory(self.src_dir) |
174 raise NotImplementedError | 174 raise NotImplementedError |
175 | 175 |
176 | 176 |
177 class BinaryPackager(object): | 177 class BinaryPackager(object): |
178 | 178 |
179 def __init__(self, pkg_line, status, binary_dir, dsc_file, logfile): | 179 def __init__(self, track, status, binary_dir, dsc_file, logfile): |
180 self.pkg_line = pkg_line | 180 self.track = track |
181 self.status = status | 181 self.status = status |
182 self.binary_dir = binary_dir | 182 self.binary_dir = binary_dir |
183 self.dsc_file = dsc_file | 183 self.dsc_file = dsc_file |
184 self.logfile = logfile | 184 self.logfile = logfile |
185 | 185 |
186 def package(self): | 186 def package(self): |
187 self.status.creating_binary_package() | 187 self.status.creating_binary_package() |
188 util.ensure_directory(self.binary_dir) | 188 util.ensure_directory(self.binary_dir) |
189 logging.info("Building binary package; loging to %r", self.logfile) | 189 logging.info("Building binary package; logging to %r", self.logfile) |
190 run.call(cmdexpand("@rootcmd /usr/sbin/pbuilder build" | 190 run.call(cmdexpand("@rootcmd /usr/sbin/pbuilder build" |
191 " --configfile $pbuilderrc" | 191 " --configfile $pbuilderrc" |
192 " --logfile $logfile --buildresult $bindir $dsc", | 192 " --logfile $logfile --buildresult $bindir $dsc", |
193 rootcmd=self.pkg_line.root_cmd, | 193 rootcmd=self.track.root_cmd, |
194 pbuilderrc=self.pkg_line.pbuilderrc, | 194 pbuilderrc=self.track.pbuilderrc, |
195 logfile=self.logfile, bindir=self.binary_dir, | 195 logfile=self.logfile, bindir=self.binary_dir, |
196 dsc=self.dsc_file), | 196 dsc=self.dsc_file), |
197 suppress_output=True) | 197 suppress_output=True) |
198 self.status.binary_package_created() | 198 self.status.binary_package_created() |
199 | 199 |
201 class RevisionPackager(object): | 201 class RevisionPackager(object): |
202 | 202 |
203 source_packager_cls = SourcePackager | 203 source_packager_cls = SourcePackager |
204 binary_packager_cls = BinaryPackager | 204 binary_packager_cls = BinaryPackager |
205 | 205 |
206 def __init__(self, pkg_line, revision): | 206 def __init__(self, track, revision): |
207 self.pkg_line = pkg_line | 207 self.track = track |
208 self.revision = revision | 208 self.revision = revision |
209 self.base_dir = self.pkg_line.pkg_dir_for_revision(self.revision, 1) | 209 self.base_dir = self.track.pkg_dir_for_revision(self.revision, 1) |
210 self.status = status.RevisionStatus(os.path.join(self.base_dir, | 210 self.status = status.RevisionStatus(os.path.join(self.base_dir, |
211 "status")) | 211 "status")) |
212 | 212 |
213 work_dir = _filenameproperty("work") | 213 work_dir = _filenameproperty("work") |
214 binary_dir = _filenameproperty("binary") | 214 binary_dir = _filenameproperty("binary") |
226 | 226 |
227 def package(self): | 227 def package(self): |
228 try: | 228 try: |
229 util.ensure_directory(self.work_dir) | 229 util.ensure_directory(self.work_dir) |
230 self.status.start = datetime.datetime.utcnow() | 230 self.status.start = datetime.datetime.utcnow() |
231 src_packager = self.source_packager_cls(self.pkg_line, self.status, | 231 src_packager = self.source_packager_cls(self.track, self.status, |
232 self.work_dir, self.src_dir, | 232 self.work_dir, self.src_dir, |
233 self.revision) | 233 self.revision) |
234 src_packager.package() | 234 src_packager.package() |
235 | 235 |
236 dsc_file = self.find_dsc_file() | 236 dsc_file = self.find_dsc_file() |
237 if dsc_file is None: | 237 if dsc_file is None: |
238 raise RuntimeError("Cannot find dsc File in %r" % self.src_dir) | 238 raise RuntimeError("Cannot find dsc File in %r" % self.src_dir) |
239 | 239 |
240 bin_packager = self.binary_packager_cls(self.pkg_line, self.status, | 240 bin_packager = self.binary_packager_cls(self.track, self.status, |
241 self.binary_dir, dsc_file, | 241 self.binary_dir, dsc_file, |
242 self.build_log) | 242 self.build_log) |
243 bin_packager.package() | 243 bin_packager.package() |
244 self.status.stop = datetime.datetime.utcnow() | 244 self.status.stop = datetime.datetime.utcnow() |
245 except: | 245 except: |
250 def remove_package_dir(self): | 250 def remove_package_dir(self): |
251 logging.info("Removing pkgdir %r", self.base_dir) | 251 logging.info("Removing pkgdir %r", self.base_dir) |
252 shutil.rmtree(self.base_dir) | 252 shutil.rmtree(self.base_dir) |
253 | 253 |
254 | 254 |
255 class PackageLine(object): | 255 class PackageTrack(object): |
256 | 256 |
257 revision_packager_cls = RevisionPackager | 257 revision_packager_cls = RevisionPackager |
258 | 258 |
259 svn_external_subdirs = [] | 259 svn_external_subdirs = [] |
260 | 260 |
367 """Returns RevisionPackager objects for each packaged revision""" | 367 """Returns RevisionPackager objects for each packaged revision""" |
368 return [self.revision_packager_cls(self, revision) | 368 return [self.revision_packager_cls(self, revision) |
369 for revision in self.get_revision_numbers()] | 369 for revision in self.get_revision_numbers()] |
370 | 370 |
371 | 371 |
372 def create_package_line(packager_class, **kw): | 372 def create_package_track(packager_class, **kw): |
373 module = util.import_dotted_name(packager_class) | 373 module = util.import_dotted_name(packager_class) |
374 return module.PackageLine(**kw) | 374 return module.PackageTrack(**kw) |
375 | 375 |
376 | 376 |
377 class PackagerGroup(object): | 377 class PackagerGroup(object): |
378 | 378 |
379 def __init__(self, package_lines, check_interval): | 379 def __init__(self, package_tracks, check_interval): |
380 self.package_lines = package_lines | 380 self.package_tracks = package_tracks |
381 self.check_interval = check_interval | 381 self.check_interval = check_interval |
382 | 382 |
383 def run(self): | 383 def run(self): |
384 """Runs the packager group indefinitely""" | 384 """Runs the packager group indefinitely""" |
385 logging.info("Tree packager starts. Will check every %d seconds", | 385 logging.info("Tree packager starts. Will check every %d seconds", |
386 self.check_interval) | 386 self.check_interval) |
387 last_check = -1 | 387 last_check = -1 |
388 while 1: | 388 while 1: |
389 now = time.time() | 389 now = time.time() |
390 if now > last_check + self.check_interval: | 390 if now > last_check + self.check_interval: |
391 self.check_package_lines() | 391 self.check_package_tracks() |
392 last_check = now | 392 last_check = now |
393 next_check = now + self.check_interval | 393 next_check = now + self.check_interval |
394 to_sleep = next_check - time.time() | 394 to_sleep = next_check - time.time() |
395 if to_sleep > 0: | 395 if to_sleep > 0: |
396 logging.info("Next check at %s", | 396 logging.info("Next check at %s", |
398 time.localtime(next_check))) | 398 time.localtime(next_check))) |
399 time.sleep(to_sleep) | 399 time.sleep(to_sleep) |
400 else: | 400 else: |
401 logging.info("Next check now") | 401 logging.info("Next check now") |
402 | 402 |
403 def check_package_lines(self): | 403 def check_package_tracks(self): |
404 logging.info("Checking package lines") | 404 logging.info("Checking package tracks") |
405 for line in self.package_lines: | 405 for track in self.package_tracks: |
406 try: | 406 try: |
407 packager = line.package_if_updated() | 407 packager = track.package_if_updated() |
408 if packager: | 408 if packager: |
409 packager.package() | 409 packager.package() |
410 except: | 410 except: |
411 logging.exception("An error occurred while" | 411 logging.exception("An error occurred while" |
412 " checking packager line %r", line.name) | 412 " checking packager track %r", track.name) |
413 logging.info("Checked all package lines") | 413 logging.info("Checked all package tracks") |
414 | 414 |
415 def get_package_lines(self): | 415 def get_package_tracks(self): |
416 return self.package_lines | 416 return self.package_tracks |