Mercurial > treepkg > treepkg
annotate treepkg/packager.py @ 113:312949e7628d
Add a smarter way to load the packager modules: Add the function
treepkg.packager.import_packager_module and use it to load the packager
modules. Also add corresponding tests.
author | Bernhard Herzog <bh@intevation.de> |
---|---|
date | Tue, 01 Apr 2008 12:30:39 +0000 |
parents | cea98d4e4a6a |
children | 34e08d52956e |
rev | line source |
---|---|
99
7888fe374e11
Add support for notification mails in case of build errors
Bernhard Herzog <bh@intevation.de>
parents:
98
diff
changeset
|
1 # Copyright (C) 2007, 2008 by Intevation GmbH |
0 | 2 # Authors: |
3 # Bernhard Herzog <bh@intevation.de> | |
4 # | |
5 # This program is free software under the GPL (>=v2) | |
6 # Read the file COPYING coming with the software for details. | |
7 | |
8 """Classes to automatically build debian packages from subversion checkouts""" | |
9 | |
10 import os | |
11 import time | |
12 import re | |
13 import logging | |
14 import shutil | |
16
7c55f3879c4d
Use the new status class and report start/stop time too
Bernhard Herzog <bh@intevation.de>
parents:
14
diff
changeset
|
15 import datetime |
113
312949e7628d
Add a smarter way to load the packager modules: Add the function
Bernhard Herzog <bh@intevation.de>
parents:
112
diff
changeset
|
16 import new |
0 | 17 |
18 import util | |
19 import subversion | |
20 import run | |
16
7c55f3879c4d
Use the new status class and report start/stop time too
Bernhard Herzog <bh@intevation.de>
parents:
14
diff
changeset
|
21 import status |
45
3e610233ccfe
use cmdexpand when calling subprocesses
Bernhard Herzog <bh@intevation.de>
parents:
41
diff
changeset
|
22 from cmdexpand import cmdexpand |
112
cea98d4e4a6a
Abstract the pbuilder calls into the new class treepkg.builder.PBuilder.
Bernhard Herzog <bh@intevation.de>
parents:
106
diff
changeset
|
23 from builder import PBuilder |
0 | 24 |
25 def _filenameproperty(relative_dir): | |
26 def get(self): | |
27 return os.path.join(self.base_dir, relative_dir) | |
28 return property(get) | |
29 | |
30 | |
31 class SourcePackager(object): | |
32 | |
4
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
33 # Derived classes must supply the package basename |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
34 pkg_basename = None |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
35 |
53
74cd21b6400b
rename some variables from pkg_track to track
Bernhard Herzog <bh@intevation.de>
parents:
52
diff
changeset
|
36 def __init__(self, track, status, work_dir, src_dir, revision): |
74cd21b6400b
rename some variables from pkg_track to track
Bernhard Herzog <bh@intevation.de>
parents:
52
diff
changeset
|
37 self.track = track |
0 | 38 self.status = status |
39 self.work_dir = work_dir | |
40 self.src_dir = src_dir | |
41 self.revision = revision | |
4
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
42 assert(self.pkg_basename) |
0 | 43 |
44 def determine_package_version(self, directory): | |
4
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
45 """Returns the version number of the new package as a string |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
46 |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
47 The directory parameter is the name of the directory containing |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
48 the newly exported sources. The sources were exported with the |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
49 export_sources method. |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
50 |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
51 The default implementation simply returns the revision converted |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
52 to a string. |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
53 """ |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
54 return str(self.revision) |
0 | 55 |
56 def export_sources(self): | |
4
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
57 """Export the sources from the subversion working directory |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
58 |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
59 This method first exports the sources to a temporary directory |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
60 and then renames the directory. The new name is of the form |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
61 |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
62 <pkg_basename>-<version> |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
63 |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
64 Where pkg_basename is the value of self.pkg_basename and version |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
65 is the return value of the determine_package_version() method. |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
66 """ |
0 | 67 temp_dir = os.path.join(self.work_dir, "temp") |
53
74cd21b6400b
rename some variables from pkg_track to track
Bernhard Herzog <bh@intevation.de>
parents:
52
diff
changeset
|
68 self.track.export_sources(temp_dir) |
0 | 69 |
70 pkgbaseversion = self.determine_package_version(temp_dir) | |
4
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
71 pkgbasedir = os.path.join(self.work_dir, |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
72 self.pkg_basename + "-" + pkgbaseversion) |
0 | 73 |
74 os.rename(temp_dir, pkgbasedir) | |
75 return pkgbaseversion, pkgbasedir | |
76 | |
77 | |
78 def update_version_numbers(self, pkgbasedir): | |
4
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
79 """Updates the version numbers in the code in pkgbasedir. |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
80 |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
81 The default implementation does nothing. Derived classes should |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
82 override this method if necessary. |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
83 """ |
0 | 84 |
85 def create_tarball(self, tarballname, workdir, basedir): | |
4
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
86 """Creates a new tarball. |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
87 |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
88 Parameters: |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
89 |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
90 tarballname -- the filename of the new tarball |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
91 workdir -- The directory into which to change before running tar. |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
92 (actually this is done with GNUI tar's -C option) |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
93 basedir -- The basedirectory of the files that are packaged |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
94 into the tarfile. This should be a relative |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
95 filename directly in workdir. |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
96 """ |
0 | 97 logging.info("Creating tarball %r", tarballname) |
45
3e610233ccfe
use cmdexpand when calling subprocesses
Bernhard Herzog <bh@intevation.de>
parents:
41
diff
changeset
|
98 run.call(cmdexpand("tar czf $tarballname -C $workdir $basedir", |
3e610233ccfe
use cmdexpand when calling subprocesses
Bernhard Herzog <bh@intevation.de>
parents:
41
diff
changeset
|
99 **locals())) |
0 | 100 |
101 def copy_debian_directory(self, pkgbasedir, pkgbaseversion, changemsg): | |
4
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
102 """Copies the debian directory and updates the copy's changelog |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
103 |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
104 Parameter: |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
105 pkgbasedir -- The directory holding the unpacked source package |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
106 pkgbaseversion -- The version to update the changelog to |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
107 changemsg -- The message for the changelog |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
108 |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
109 When determining the actual version for the new package, this |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
110 function looks at the previous version in the changelog. If it |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
111 has a prefix separated from the version number by a colon this |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
112 prefix is prepended to the pkgbaseversion parameter. Debian |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
113 uses such prefixes for the kde packages. |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
114 """ |
0 | 115 debian_dir = os.path.join(pkgbasedir, "debian") |
116 changelog = os.path.join(debian_dir, "changelog") | |
117 | |
53
74cd21b6400b
rename some variables from pkg_track to track
Bernhard Herzog <bh@intevation.de>
parents:
52
diff
changeset
|
118 self.track.copy_debian_directory(debian_dir) |
0 | 119 |
120 logging.info("Updating %r", changelog) | |
121 oldversion = util.debian_changelog_version(changelog) | |
122 if ":" in oldversion: | |
123 oldversionprefix = oldversion.split(":")[0] + ":" | |
124 else: | |
125 oldversionprefix = "" | |
93
73c67372c7f7
Make the prefix used in the debian revision number configurable.
Bernhard Herzog <bh@intevation.de>
parents:
91
diff
changeset
|
126 debrev = self.track.debrevision_prefix + "1" |
45
3e610233ccfe
use cmdexpand when calling subprocesses
Bernhard Herzog <bh@intevation.de>
parents:
41
diff
changeset
|
127 run.call(cmdexpand("debchange -c $changelog" |
93
73c67372c7f7
Make the prefix used in the debian revision number configurable.
Bernhard Herzog <bh@intevation.de>
parents:
91
diff
changeset
|
128 " -v ${oldversionprefix}${pkgbaseversion}-${debrev}" |
45
3e610233ccfe
use cmdexpand when calling subprocesses
Bernhard Herzog <bh@intevation.de>
parents:
41
diff
changeset
|
129 " $changemsg", **locals()), |
53
74cd21b6400b
rename some variables from pkg_track to track
Bernhard Herzog <bh@intevation.de>
parents:
52
diff
changeset
|
130 env=self.track.debian_environment()) |
0 | 131 |
132 | |
133 def create_source_package(self, pkgbasedir, origtargz): | |
4
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
134 """Creates a new source package from pkgbasedir and origtargz""" |
0 | 135 logging.info("Creating new source package") |
45
3e610233ccfe
use cmdexpand when calling subprocesses
Bernhard Herzog <bh@intevation.de>
parents:
41
diff
changeset
|
136 run.call(cmdexpand("dpkg-source -b $directory $tarball", |
3e610233ccfe
use cmdexpand when calling subprocesses
Bernhard Herzog <bh@intevation.de>
parents:
41
diff
changeset
|
137 directory=os.path.basename(pkgbasedir), |
3e610233ccfe
use cmdexpand when calling subprocesses
Bernhard Herzog <bh@intevation.de>
parents:
41
diff
changeset
|
138 tarball=os.path.basename(origtargz)), |
0 | 139 cwd=os.path.dirname(pkgbasedir), |
140 suppress_output=True, | |
53
74cd21b6400b
rename some variables from pkg_track to track
Bernhard Herzog <bh@intevation.de>
parents:
52
diff
changeset
|
141 env=self.track.debian_environment()) |
0 | 142 |
4
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
143 def move_source_package(self, pkgbasename): |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
144 """Moves the new source package from the work_dir to the src_dir""" |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
145 logging.info("Moving source package to %r", self.src_dir) |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
146 util.ensure_directory(self.src_dir) |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
147 for filename in [filename for filename in os.listdir(self.work_dir) |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
148 if filename.startswith(pkgbasename)]: |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
149 os.rename(os.path.join(self.work_dir, filename), |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
150 os.path.join(self.src_dir, filename)) |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
151 |
0 | 152 def package(self): |
4
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
153 """Creates a source package from a subversion checkout. |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
154 |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
155 After setting up the working directory, this method calls the |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
156 do_package method to do the actual packaging. Afterwards the |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
157 work directory is removed. |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
158 """ |
0 | 159 util.ensure_directory(self.work_dir) |
160 try: | |
41
f7ec40638a06
use the enums for the status field of RevisionStatus
Bernhard Herzog <bh@intevation.de>
parents:
36
diff
changeset
|
161 self.status.creating_source_package() |
4
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
162 self.do_package() |
41
f7ec40638a06
use the enums for the status field of RevisionStatus
Bernhard Herzog <bh@intevation.de>
parents:
36
diff
changeset
|
163 self.status.source_package_created() |
0 | 164 finally: |
165 logging.info("Removing workdir %r", self.work_dir) | |
166 shutil.rmtree(self.work_dir) | |
167 | |
4
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
168 def do_package(self): |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
169 """Does the work of creating a source package |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
170 This method must be overriden by derived classes. |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
171 |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
172 The method should do the work in self.work_dir. When the |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
173 package is done, the source package files should be in |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
174 self.src_dir. |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
175 """ |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
176 raise NotImplementedError |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
177 |
0 | 178 |
179 class BinaryPackager(object): | |
180 | |
53
74cd21b6400b
rename some variables from pkg_track to track
Bernhard Herzog <bh@intevation.de>
parents:
52
diff
changeset
|
181 def __init__(self, track, status, binary_dir, dsc_file, logfile): |
74cd21b6400b
rename some variables from pkg_track to track
Bernhard Herzog <bh@intevation.de>
parents:
52
diff
changeset
|
182 self.track = track |
0 | 183 self.status = status |
184 self.binary_dir = binary_dir | |
185 self.dsc_file = dsc_file | |
186 self.logfile = logfile | |
187 | |
188 def package(self): | |
41
f7ec40638a06
use the enums for the status field of RevisionStatus
Bernhard Herzog <bh@intevation.de>
parents:
36
diff
changeset
|
189 self.status.creating_binary_package() |
0 | 190 util.ensure_directory(self.binary_dir) |
54 | 191 logging.info("Building binary package; logging to %r", self.logfile) |
112
cea98d4e4a6a
Abstract the pbuilder calls into the new class treepkg.builder.PBuilder.
Bernhard Herzog <bh@intevation.de>
parents:
106
diff
changeset
|
192 self.track.builder.build(self.dsc_file, self.binary_dir, self.logfile) |
41
f7ec40638a06
use the enums for the status field of RevisionStatus
Bernhard Herzog <bh@intevation.de>
parents:
36
diff
changeset
|
193 self.status.binary_package_created() |
0 | 194 |
195 | |
196 class RevisionPackager(object): | |
197 | |
4
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
198 source_packager_cls = SourcePackager |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
199 binary_packager_cls = BinaryPackager |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
200 |
53
74cd21b6400b
rename some variables from pkg_track to track
Bernhard Herzog <bh@intevation.de>
parents:
52
diff
changeset
|
201 def __init__(self, track, revision): |
74cd21b6400b
rename some variables from pkg_track to track
Bernhard Herzog <bh@intevation.de>
parents:
52
diff
changeset
|
202 self.track = track |
0 | 203 self.revision = revision |
53
74cd21b6400b
rename some variables from pkg_track to track
Bernhard Herzog <bh@intevation.de>
parents:
52
diff
changeset
|
204 self.base_dir = self.track.pkg_dir_for_revision(self.revision, 1) |
36
086c68ca51d2
rename Status to RevisionStatus
Bernhard Herzog <bh@intevation.de>
parents:
26
diff
changeset
|
205 self.status = status.RevisionStatus(os.path.join(self.base_dir, |
086c68ca51d2
rename Status to RevisionStatus
Bernhard Herzog <bh@intevation.de>
parents:
26
diff
changeset
|
206 "status")) |
0 | 207 |
208 work_dir = _filenameproperty("work") | |
209 binary_dir = _filenameproperty("binary") | |
210 src_dir = _filenameproperty("src") | |
18
d5c24cfce05e
Improve access to a RevisionPackager's build_log
Bernhard Herzog <bh@intevation.de>
parents:
16
diff
changeset
|
211 build_log = _filenameproperty("build.log") |
0 | 212 |
213 def find_dsc_file(self): | |
214 for filename in os.listdir(self.src_dir): | |
215 if filename.endswith(".dsc"): | |
216 return os.path.join(self.src_dir, filename) | |
217 return None | |
218 | |
18
d5c24cfce05e
Improve access to a RevisionPackager's build_log
Bernhard Herzog <bh@intevation.de>
parents:
16
diff
changeset
|
219 def has_build_log(self): |
d5c24cfce05e
Improve access to a RevisionPackager's build_log
Bernhard Herzog <bh@intevation.de>
parents:
16
diff
changeset
|
220 return os.path.exists(self.build_log) |
d5c24cfce05e
Improve access to a RevisionPackager's build_log
Bernhard Herzog <bh@intevation.de>
parents:
16
diff
changeset
|
221 |
88
3ae54f99db26
Add methods RevisionPackager.list_source_files and
Bernhard Herzog <bh@intevation.de>
parents:
85
diff
changeset
|
222 def list_source_files(self): |
3ae54f99db26
Add methods RevisionPackager.list_source_files and
Bernhard Herzog <bh@intevation.de>
parents:
85
diff
changeset
|
223 """Returns a list with the names of the files of the source package. |
3ae54f99db26
Add methods RevisionPackager.list_source_files and
Bernhard Herzog <bh@intevation.de>
parents:
85
diff
changeset
|
224 The implementation assumes that all files in self.src_dir belong |
3ae54f99db26
Add methods RevisionPackager.list_source_files and
Bernhard Herzog <bh@intevation.de>
parents:
85
diff
changeset
|
225 to the source package. |
3ae54f99db26
Add methods RevisionPackager.list_source_files and
Bernhard Herzog <bh@intevation.de>
parents:
85
diff
changeset
|
226 """ |
3ae54f99db26
Add methods RevisionPackager.list_source_files and
Bernhard Herzog <bh@intevation.de>
parents:
85
diff
changeset
|
227 return sorted(util.listdir_abs(self.src_dir)) |
3ae54f99db26
Add methods RevisionPackager.list_source_files and
Bernhard Herzog <bh@intevation.de>
parents:
85
diff
changeset
|
228 |
3ae54f99db26
Add methods RevisionPackager.list_source_files and
Bernhard Herzog <bh@intevation.de>
parents:
85
diff
changeset
|
229 def list_binary_files(self): |
3ae54f99db26
Add methods RevisionPackager.list_source_files and
Bernhard Herzog <bh@intevation.de>
parents:
85
diff
changeset
|
230 """Returns a list with the names of the files of the binary packages. |
3ae54f99db26
Add methods RevisionPackager.list_source_files and
Bernhard Herzog <bh@intevation.de>
parents:
85
diff
changeset
|
231 The implementation assumes that all files in self.binary_dir belong |
3ae54f99db26
Add methods RevisionPackager.list_source_files and
Bernhard Herzog <bh@intevation.de>
parents:
85
diff
changeset
|
232 to the binary packages. |
3ae54f99db26
Add methods RevisionPackager.list_source_files and
Bernhard Herzog <bh@intevation.de>
parents:
85
diff
changeset
|
233 """ |
3ae54f99db26
Add methods RevisionPackager.list_source_files and
Bernhard Herzog <bh@intevation.de>
parents:
85
diff
changeset
|
234 return sorted(util.listdir_abs(self.binary_dir)) |
3ae54f99db26
Add methods RevisionPackager.list_source_files and
Bernhard Herzog <bh@intevation.de>
parents:
85
diff
changeset
|
235 |
0 | 236 def package(self): |
237 try: | |
16
7c55f3879c4d
Use the new status class and report start/stop time too
Bernhard Herzog <bh@intevation.de>
parents:
14
diff
changeset
|
238 util.ensure_directory(self.work_dir) |
7c55f3879c4d
Use the new status class and report start/stop time too
Bernhard Herzog <bh@intevation.de>
parents:
14
diff
changeset
|
239 self.status.start = datetime.datetime.utcnow() |
53
74cd21b6400b
rename some variables from pkg_track to track
Bernhard Herzog <bh@intevation.de>
parents:
52
diff
changeset
|
240 src_packager = self.source_packager_cls(self.track, self.status, |
4
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
241 self.work_dir, self.src_dir, |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
242 self.revision) |
0 | 243 src_packager.package() |
244 | |
245 dsc_file = self.find_dsc_file() | |
246 if dsc_file is None: | |
247 raise RuntimeError("Cannot find dsc File in %r" % self.src_dir) | |
248 | |
53
74cd21b6400b
rename some variables from pkg_track to track
Bernhard Herzog <bh@intevation.de>
parents:
52
diff
changeset
|
249 bin_packager = self.binary_packager_cls(self.track, self.status, |
4
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
250 self.binary_dir, dsc_file, |
18
d5c24cfce05e
Improve access to a RevisionPackager's build_log
Bernhard Herzog <bh@intevation.de>
parents:
16
diff
changeset
|
251 self.build_log) |
0 | 252 bin_packager.package() |
16
7c55f3879c4d
Use the new status class and report start/stop time too
Bernhard Herzog <bh@intevation.de>
parents:
14
diff
changeset
|
253 self.status.stop = datetime.datetime.utcnow() |
0 | 254 except: |
41
f7ec40638a06
use the enums for the status field of RevisionStatus
Bernhard Herzog <bh@intevation.de>
parents:
36
diff
changeset
|
255 self.status.error() |
16
7c55f3879c4d
Use the new status class and report start/stop time too
Bernhard Herzog <bh@intevation.de>
parents:
14
diff
changeset
|
256 self.status.stop = datetime.datetime.utcnow() |
99
7888fe374e11
Add support for notification mails in case of build errors
Bernhard Herzog <bh@intevation.de>
parents:
98
diff
changeset
|
257 # set the notification status last to avoid race conditions. |
7888fe374e11
Add support for notification mails in case of build errors
Bernhard Herzog <bh@intevation.de>
parents:
98
diff
changeset
|
258 # The pending notification is for now the only situation |
7888fe374e11
Add support for notification mails in case of build errors
Bernhard Herzog <bh@intevation.de>
parents:
98
diff
changeset
|
259 # where another process might modify the status file (the |
7888fe374e11
Add support for notification mails in case of build errors
Bernhard Herzog <bh@intevation.de>
parents:
98
diff
changeset
|
260 # listpendingnotifications program will set it to |
7888fe374e11
Add support for notification mails in case of build errors
Bernhard Herzog <bh@intevation.de>
parents:
98
diff
changeset
|
261 # "notification_sent") |
7888fe374e11
Add support for notification mails in case of build errors
Bernhard Herzog <bh@intevation.de>
parents:
98
diff
changeset
|
262 self.status.notification_pending() |
0 | 263 raise |
264 | |
265 def remove_package_dir(self): | |
266 logging.info("Removing pkgdir %r", self.base_dir) | |
267 shutil.rmtree(self.base_dir) | |
268 | |
269 | |
52
78cf5f6778ec
Rename 'packagel ine' -> 'package track'
Bernhard Herzog <bh@intevation.de>
parents:
49
diff
changeset
|
270 class PackageTrack(object): |
0 | 271 |
4
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
272 revision_packager_cls = RevisionPackager |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
273 |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
274 svn_external_subdirs = [] |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
275 |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
276 extra_config_desc = [] |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
277 |
47
2802be410156
add config options pbuilderrc and use it when calling pbuilder
Bernhard Herzog <bh@intevation.de>
parents:
16
diff
changeset
|
278 def __init__(self, name, base_dir, svn_url, root_cmd, pbuilderrc, deb_email, |
93
73c67372c7f7
Make the prefix used in the debian revision number configurable.
Bernhard Herzog <bh@intevation.de>
parents:
91
diff
changeset
|
279 deb_fullname, packager_class="treepkg.packager", |
73c67372c7f7
Make the prefix used in the debian revision number configurable.
Bernhard Herzog <bh@intevation.de>
parents:
91
diff
changeset
|
280 debrevision_prefix="treepkg"): |
0 | 281 self.name = name |
282 self.base_dir = base_dir | |
283 self.svn_url = svn_url | |
112
cea98d4e4a6a
Abstract the pbuilder calls into the new class treepkg.builder.PBuilder.
Bernhard Herzog <bh@intevation.de>
parents:
106
diff
changeset
|
284 self.builder = PBuilder(pbuilderrc, root_cmd) |
0 | 285 self.deb_email = deb_email |
286 self.deb_fullname = deb_fullname | |
93
73c67372c7f7
Make the prefix used in the debian revision number configurable.
Bernhard Herzog <bh@intevation.de>
parents:
91
diff
changeset
|
287 self.debrevision_prefix = debrevision_prefix |
0 | 288 self.pkg_dir_template = "%(revision)d-%(increment)d" |
289 self.pkg_dir_regex \ | |
290 = re.compile(r"(?P<revision>[0-9]+)-(?P<increment>[0-9]+)$") | |
291 | |
292 checkout_dir = _filenameproperty("checkout") | |
293 debian_dir = _filenameproperty("debian") | |
294 pkg_dir = _filenameproperty("pkg") | |
295 | |
106
66cbfc772f84
Add bin/inittreepkg.py, a script to automate some of the installation
Bernhard Herzog <bh@intevation.de>
parents:
99
diff
changeset
|
296 def init_treepkg(self): |
66cbfc772f84
Add bin/inittreepkg.py, a script to automate some of the installation
Bernhard Herzog <bh@intevation.de>
parents:
99
diff
changeset
|
297 print "Initializing", self.name |
66cbfc772f84
Add bin/inittreepkg.py, a script to automate some of the installation
Bernhard Herzog <bh@intevation.de>
parents:
99
diff
changeset
|
298 if not os.path.exists(self.base_dir): |
66cbfc772f84
Add bin/inittreepkg.py, a script to automate some of the installation
Bernhard Herzog <bh@intevation.de>
parents:
99
diff
changeset
|
299 print "creating %s" % (self.base_dir,) |
66cbfc772f84
Add bin/inittreepkg.py, a script to automate some of the installation
Bernhard Herzog <bh@intevation.de>
parents:
99
diff
changeset
|
300 util.ensure_directory(self.base_dir) |
66cbfc772f84
Add bin/inittreepkg.py, a script to automate some of the installation
Bernhard Herzog <bh@intevation.de>
parents:
99
diff
changeset
|
301 if not os.path.exists(self.debian_dir): |
66cbfc772f84
Add bin/inittreepkg.py, a script to automate some of the installation
Bernhard Herzog <bh@intevation.de>
parents:
99
diff
changeset
|
302 print ("TODO: the debian directory %s still has to be created" |
66cbfc772f84
Add bin/inittreepkg.py, a script to automate some of the installation
Bernhard Herzog <bh@intevation.de>
parents:
99
diff
changeset
|
303 % (self.debian_dir,)) |
66cbfc772f84
Add bin/inittreepkg.py, a script to automate some of the installation
Bernhard Herzog <bh@intevation.de>
parents:
99
diff
changeset
|
304 |
0 | 305 def pkg_dir_for_revision(self, revision, increment): |
306 return os.path.join(self.pkg_dir, | |
307 self.pkg_dir_template % locals()) | |
308 | |
309 def last_changed_revision(self): | |
4
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
310 revisions = [] |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
311 for directory in [self.checkout_dir] + self.svn_external_subdirs: |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
312 directory = os.path.join(self.checkout_dir, directory) |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
313 revisions.append(subversion.last_changed_revision(directory)) |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
314 return max(revisions) |
0 | 315 |
11
6efe0bd3d8c1
Add method RevisionPackager.get_revision_numbers
Bernhard Herzog <bh@intevation.de>
parents:
10
diff
changeset
|
316 def get_revision_numbers(self): |
6efe0bd3d8c1
Add method RevisionPackager.get_revision_numbers
Bernhard Herzog <bh@intevation.de>
parents:
10
diff
changeset
|
317 """Returns a list of the numbers of the packaged revisions""" |
6efe0bd3d8c1
Add method RevisionPackager.get_revision_numbers
Bernhard Herzog <bh@intevation.de>
parents:
10
diff
changeset
|
318 revisions = [] |
6efe0bd3d8c1
Add method RevisionPackager.get_revision_numbers
Bernhard Herzog <bh@intevation.de>
parents:
10
diff
changeset
|
319 if os.path.exists(self.pkg_dir): |
6efe0bd3d8c1
Add method RevisionPackager.get_revision_numbers
Bernhard Herzog <bh@intevation.de>
parents:
10
diff
changeset
|
320 for filename in os.listdir(self.pkg_dir): |
6efe0bd3d8c1
Add method RevisionPackager.get_revision_numbers
Bernhard Herzog <bh@intevation.de>
parents:
10
diff
changeset
|
321 match = self.pkg_dir_regex.match(filename) |
6efe0bd3d8c1
Add method RevisionPackager.get_revision_numbers
Bernhard Herzog <bh@intevation.de>
parents:
10
diff
changeset
|
322 if match: |
6efe0bd3d8c1
Add method RevisionPackager.get_revision_numbers
Bernhard Herzog <bh@intevation.de>
parents:
10
diff
changeset
|
323 revisions.append(int(match.group("revision"))) |
85
31b0567df051
Make PackageTrack.get_revision_numbers return the revisions as a sorted
Bernhard Herzog <bh@intevation.de>
parents:
84
diff
changeset
|
324 revisions.sort() |
11
6efe0bd3d8c1
Add method RevisionPackager.get_revision_numbers
Bernhard Herzog <bh@intevation.de>
parents:
10
diff
changeset
|
325 return revisions |
6efe0bd3d8c1
Add method RevisionPackager.get_revision_numbers
Bernhard Herzog <bh@intevation.de>
parents:
10
diff
changeset
|
326 |
0 | 327 def last_packaged_revision(self): |
328 """Returns the revision number of the highest packaged revision. | |
329 | |
330 If the revision cannot be determined because no already packaged | |
331 revisions can be found, the function returns -1. | |
332 """ | |
11
6efe0bd3d8c1
Add method RevisionPackager.get_revision_numbers
Bernhard Herzog <bh@intevation.de>
parents:
10
diff
changeset
|
333 return max([-1] + self.get_revision_numbers()) |
0 | 334 |
335 def debian_source(self): | |
336 return util.extract_value_for_key(open(os.path.join(self.debian_dir, | |
337 "control")), | |
338 "Source:") | |
339 | |
80
0af2fa3790e0
Add revision parameter to PackagerGroup.__init__ and some other methods
Bernhard Herzog <bh@intevation.de>
parents:
78
diff
changeset
|
340 def update_checkout(self, revision=None): |
0 | 341 """Updates the working copy of self.svn_url in self.checkout_dir. |
342 | |
343 If self.checkout_dir doesn't exist yet, self.svn_url is checked | |
80
0af2fa3790e0
Add revision parameter to PackagerGroup.__init__ and some other methods
Bernhard Herzog <bh@intevation.de>
parents:
78
diff
changeset
|
344 out into that directory. The value of the revision parameter is |
0af2fa3790e0
Add revision parameter to PackagerGroup.__init__ and some other methods
Bernhard Herzog <bh@intevation.de>
parents:
78
diff
changeset
|
345 passed through to subversion.update. |
0 | 346 """ |
347 localdir = self.checkout_dir | |
348 if os.path.exists(localdir): | |
349 logging.info("Updating the working copy in %r", localdir) | |
80
0af2fa3790e0
Add revision parameter to PackagerGroup.__init__ and some other methods
Bernhard Herzog <bh@intevation.de>
parents:
78
diff
changeset
|
350 subversion.update(localdir, revision=revision) |
0 | 351 else: |
352 logging.info("The working copy in %r doesn't exist yet." | |
26 | 353 " Checking out from %r", localdir, |
0 | 354 self.svn_url) |
355 subversion.checkout(self.svn_url, localdir) | |
356 | |
357 def export_sources(self, to_dir): | |
358 logging.info("Exporting sources for tarball to %r", to_dir) | |
359 subversion.export(self.checkout_dir, to_dir) | |
360 # some versions of svn (notably version 1.4.2 shipped with etch) | |
361 # do export externals such as the admin subdirectory. We may | |
362 # have to do that in an extra step. | |
4
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
363 for subdir in self.svn_external_subdirs: |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
364 absdir = os.path.join(to_dir, subdir) |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
365 if not os.path.isdir(absdir): |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
366 subversion.export(os.path.join(self.checkout_dir, subdir), |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
367 absdir) |
0 | 368 |
369 def copy_debian_directory(self, to_dir): | |
370 logging.info("Copying debian directory to %r", to_dir) | |
371 shutil.copytree(self.debian_dir, to_dir) | |
372 | |
373 def debian_environment(self): | |
374 """Returns the environment variables for the debian commands""" | |
375 env = os.environ.copy() | |
376 env["DEBFULLNAME"] = self.deb_fullname | |
377 env["DEBEMAIL"] = self.deb_email | |
378 return env | |
379 | |
80
0af2fa3790e0
Add revision parameter to PackagerGroup.__init__ and some other methods
Bernhard Herzog <bh@intevation.de>
parents:
78
diff
changeset
|
380 def package_if_updated(self, revision=None): |
0 | 381 """Checks if the checkout changed and returns a new packager if so""" |
80
0af2fa3790e0
Add revision parameter to PackagerGroup.__init__ and some other methods
Bernhard Herzog <bh@intevation.de>
parents:
78
diff
changeset
|
382 self.update_checkout(revision=revision) |
0 | 383 current_revision = self.last_changed_revision() |
384 logging.info("New revision is %d", current_revision) | |
98
f7b9c7113c46
Make packaging a specific revision work even if newer revisions have already
Bernhard Herzog <bh@intevation.de>
parents:
93
diff
changeset
|
385 if current_revision not in self.get_revision_numbers(): |
f7b9c7113c46
Make packaging a specific revision work even if newer revisions have already
Bernhard Herzog <bh@intevation.de>
parents:
93
diff
changeset
|
386 logging.info("Revision %d has not been packaged yet", |
f7b9c7113c46
Make packaging a specific revision work even if newer revisions have already
Bernhard Herzog <bh@intevation.de>
parents:
93
diff
changeset
|
387 current_revision) |
4
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
388 return self.revision_packager_cls(self, current_revision) |
0 | 389 else: |
98
f7b9c7113c46
Make packaging a specific revision work even if newer revisions have already
Bernhard Herzog <bh@intevation.de>
parents:
93
diff
changeset
|
390 logging.info("Revision %d has already been packaged.", |
f7b9c7113c46
Make packaging a specific revision work even if newer revisions have already
Bernhard Herzog <bh@intevation.de>
parents:
93
diff
changeset
|
391 current_revision) |
0 | 392 |
14
dfd89f81e66c
Add simple status report tool. Still using the old status files
Bernhard Herzog <bh@intevation.de>
parents:
11
diff
changeset
|
393 def get_revisions(self): |
dfd89f81e66c
Add simple status report tool. Still using the old status files
Bernhard Herzog <bh@intevation.de>
parents:
11
diff
changeset
|
394 """Returns RevisionPackager objects for each packaged revision""" |
dfd89f81e66c
Add simple status report tool. Still using the old status files
Bernhard Herzog <bh@intevation.de>
parents:
11
diff
changeset
|
395 return [self.revision_packager_cls(self, revision) |
dfd89f81e66c
Add simple status report tool. Still using the old status files
Bernhard Herzog <bh@intevation.de>
parents:
11
diff
changeset
|
396 for revision in self.get_revision_numbers()] |
dfd89f81e66c
Add simple status report tool. Still using the old status files
Bernhard Herzog <bh@intevation.de>
parents:
11
diff
changeset
|
397 |
0 | 398 |
113
312949e7628d
Add a smarter way to load the packager modules: Add the function
Bernhard Herzog <bh@intevation.de>
parents:
112
diff
changeset
|
399 def import_packager_module(packager_class): |
312949e7628d
Add a smarter way to load the packager modules: Add the function
Bernhard Herzog <bh@intevation.de>
parents:
112
diff
changeset
|
400 """Import the packager module named by packager_class. |
312949e7628d
Add a smarter way to load the packager modules: Add the function
Bernhard Herzog <bh@intevation.de>
parents:
112
diff
changeset
|
401 |
312949e7628d
Add a smarter way to load the packager modules: Add the function
Bernhard Herzog <bh@intevation.de>
parents:
112
diff
changeset
|
402 The packager_class must be the full absolute module name for the |
312949e7628d
Add a smarter way to load the packager modules: Add the function
Bernhard Herzog <bh@intevation.de>
parents:
112
diff
changeset
|
403 packager. The module must either contain a class called |
312949e7628d
Add a smarter way to load the packager modules: Add the function
Bernhard Herzog <bh@intevation.de>
parents:
112
diff
changeset
|
404 'PackageTrack' or a class called called 'SourcePackager'. If it |
312949e7628d
Add a smarter way to load the packager modules: Add the function
Bernhard Herzog <bh@intevation.de>
parents:
112
diff
changeset
|
405 doesn't have a 'PackageTrack' class, a 'PackageTrack' class and a |
312949e7628d
Add a smarter way to load the packager modules: Add the function
Bernhard Herzog <bh@intevation.de>
parents:
112
diff
changeset
|
406 'RevisionPackager' class will be created the latter of which will |
312949e7628d
Add a smarter way to load the packager modules: Add the function
Bernhard Herzog <bh@intevation.de>
parents:
112
diff
changeset
|
407 use the module's 'SourcePackager' class as source_packager_cls. |
312949e7628d
Add a smarter way to load the packager modules: Add the function
Bernhard Herzog <bh@intevation.de>
parents:
112
diff
changeset
|
408 """ |
312949e7628d
Add a smarter way to load the packager modules: Add the function
Bernhard Herzog <bh@intevation.de>
parents:
112
diff
changeset
|
409 module = util.import_dotted_name(packager_class) |
312949e7628d
Add a smarter way to load the packager modules: Add the function
Bernhard Herzog <bh@intevation.de>
parents:
112
diff
changeset
|
410 if not hasattr(module, "PackageTrack"): |
312949e7628d
Add a smarter way to load the packager modules: Add the function
Bernhard Herzog <bh@intevation.de>
parents:
112
diff
changeset
|
411 module.RevisionPackager \ |
312949e7628d
Add a smarter way to load the packager modules: Add the function
Bernhard Herzog <bh@intevation.de>
parents:
112
diff
changeset
|
412 = new.classobj("RevisionPackager", (RevisionPackager,), |
312949e7628d
Add a smarter way to load the packager modules: Add the function
Bernhard Herzog <bh@intevation.de>
parents:
112
diff
changeset
|
413 dict(source_packager_cls=module.SourcePackager)) |
312949e7628d
Add a smarter way to load the packager modules: Add the function
Bernhard Herzog <bh@intevation.de>
parents:
112
diff
changeset
|
414 module.PackageTrack \ |
312949e7628d
Add a smarter way to load the packager modules: Add the function
Bernhard Herzog <bh@intevation.de>
parents:
112
diff
changeset
|
415 = new.classobj("PackageTrack", (PackageTrack,), |
312949e7628d
Add a smarter way to load the packager modules: Add the function
Bernhard Herzog <bh@intevation.de>
parents:
112
diff
changeset
|
416 dict(revision_packager_cls=module.RevisionPackager)) |
312949e7628d
Add a smarter way to load the packager modules: Add the function
Bernhard Herzog <bh@intevation.de>
parents:
112
diff
changeset
|
417 return module |
312949e7628d
Add a smarter way to load the packager modules: Add the function
Bernhard Herzog <bh@intevation.de>
parents:
112
diff
changeset
|
418 |
52
78cf5f6778ec
Rename 'packagel ine' -> 'package track'
Bernhard Herzog <bh@intevation.de>
parents:
49
diff
changeset
|
419 def create_package_track(packager_class, **kw): |
113
312949e7628d
Add a smarter way to load the packager modules: Add the function
Bernhard Herzog <bh@intevation.de>
parents:
112
diff
changeset
|
420 module = import_packager_module(packager_class) |
52
78cf5f6778ec
Rename 'packagel ine' -> 'package track'
Bernhard Herzog <bh@intevation.de>
parents:
49
diff
changeset
|
421 return module.PackageTrack(**kw) |
4
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
422 |
0 | 423 |
7
96f4f58c62b5
Rename the Packager class to PackagerGroup
Bernhard Herzog <bh@intevation.de>
parents:
4
diff
changeset
|
424 class PackagerGroup(object): |
0 | 425 |
91
3ed079a7174a
Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents:
90
diff
changeset
|
426 def __init__(self, package_tracks, check_interval, revision=None, |
3ed079a7174a
Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents:
90
diff
changeset
|
427 instructions_file=None): |
52
78cf5f6778ec
Rename 'packagel ine' -> 'package track'
Bernhard Herzog <bh@intevation.de>
parents:
49
diff
changeset
|
428 self.package_tracks = package_tracks |
0 | 429 self.check_interval = check_interval |
80
0af2fa3790e0
Add revision parameter to PackagerGroup.__init__ and some other methods
Bernhard Herzog <bh@intevation.de>
parents:
78
diff
changeset
|
430 self.revision = revision |
91
3ed079a7174a
Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents:
90
diff
changeset
|
431 self.instructions_file = instructions_file |
3ed079a7174a
Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents:
90
diff
changeset
|
432 self.instructions_file_removed = False |
0 | 433 |
434 def run(self): | |
7
96f4f58c62b5
Rename the Packager class to PackagerGroup
Bernhard Herzog <bh@intevation.de>
parents:
4
diff
changeset
|
435 """Runs the packager group indefinitely""" |
78
9a602d8eaa60
initial revision of the subversion repository
Thomas Arendsen Hein <thomas@intevation.de>
parents:
55
diff
changeset
|
436 logging.info("Starting in periodic check mode." |
9a602d8eaa60
initial revision of the subversion repository
Thomas Arendsen Hein <thomas@intevation.de>
parents:
55
diff
changeset
|
437 " Will check every %d seconds", self.check_interval) |
0 | 438 last_check = -1 |
439 while 1: | |
440 now = time.time() | |
441 if now > last_check + self.check_interval: | |
91
3ed079a7174a
Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents:
90
diff
changeset
|
442 if self.check_package_tracks(): |
3ed079a7174a
Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents:
90
diff
changeset
|
443 break |
0 | 444 last_check = now |
445 next_check = now + self.check_interval | |
446 to_sleep = next_check - time.time() | |
447 if to_sleep > 0: | |
448 logging.info("Next check at %s", | |
449 time.strftime("%Y-%m-%d %H:%M:%S", | |
450 time.localtime(next_check))) | |
451 time.sleep(to_sleep) | |
452 else: | |
453 logging.info("Next check now") | |
91
3ed079a7174a
Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents:
90
diff
changeset
|
454 if self.should_stop(): |
3ed079a7174a
Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents:
90
diff
changeset
|
455 logging.info("Received stop instruction. Stopping.") |
3ed079a7174a
Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents:
90
diff
changeset
|
456 return |
0 | 457 |
52
78cf5f6778ec
Rename 'packagel ine' -> 'package track'
Bernhard Herzog <bh@intevation.de>
parents:
49
diff
changeset
|
458 def check_package_tracks(self): |
78cf5f6778ec
Rename 'packagel ine' -> 'package track'
Bernhard Herzog <bh@intevation.de>
parents:
49
diff
changeset
|
459 logging.info("Checking package tracks") |
91
3ed079a7174a
Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents:
90
diff
changeset
|
460 self.clear_instruction() |
52
78cf5f6778ec
Rename 'packagel ine' -> 'package track'
Bernhard Herzog <bh@intevation.de>
parents:
49
diff
changeset
|
461 for track in self.package_tracks: |
0 | 462 try: |
80
0af2fa3790e0
Add revision parameter to PackagerGroup.__init__ and some other methods
Bernhard Herzog <bh@intevation.de>
parents:
78
diff
changeset
|
463 packager = track.package_if_updated(revision=self.revision) |
0 | 464 if packager: |
465 packager.package() | |
91
3ed079a7174a
Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents:
90
diff
changeset
|
466 if self.should_stop(): |
3ed079a7174a
Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents:
90
diff
changeset
|
467 logging.info("Received stop instruction. Stopping.") |
3ed079a7174a
Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents:
90
diff
changeset
|
468 return True |
0 | 469 except: |
470 logging.exception("An error occurred while" | |
52
78cf5f6778ec
Rename 'packagel ine' -> 'package track'
Bernhard Herzog <bh@intevation.de>
parents:
49
diff
changeset
|
471 " checking packager track %r", track.name) |
78cf5f6778ec
Rename 'packagel ine' -> 'package track'
Bernhard Herzog <bh@intevation.de>
parents:
49
diff
changeset
|
472 logging.info("Checked all package tracks") |
14
dfd89f81e66c
Add simple status report tool. Still using the old status files
Bernhard Herzog <bh@intevation.de>
parents:
11
diff
changeset
|
473 |
52
78cf5f6778ec
Rename 'packagel ine' -> 'package track'
Bernhard Herzog <bh@intevation.de>
parents:
49
diff
changeset
|
474 def get_package_tracks(self): |
78cf5f6778ec
Rename 'packagel ine' -> 'package track'
Bernhard Herzog <bh@intevation.de>
parents:
49
diff
changeset
|
475 return self.package_tracks |
91
3ed079a7174a
Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents:
90
diff
changeset
|
476 |
3ed079a7174a
Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents:
90
diff
changeset
|
477 def read_instruction(self): |
3ed079a7174a
Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents:
90
diff
changeset
|
478 if not self.instructions_file: |
3ed079a7174a
Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents:
90
diff
changeset
|
479 return "" |
3ed079a7174a
Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents:
90
diff
changeset
|
480 try: |
3ed079a7174a
Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents:
90
diff
changeset
|
481 f = open(self.instructions_file) |
3ed079a7174a
Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents:
90
diff
changeset
|
482 except (IOError, OSError): |
3ed079a7174a
Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents:
90
diff
changeset
|
483 return "" |
3ed079a7174a
Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents:
90
diff
changeset
|
484 try: |
3ed079a7174a
Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents:
90
diff
changeset
|
485 return f.read().strip() |
3ed079a7174a
Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents:
90
diff
changeset
|
486 finally: |
3ed079a7174a
Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents:
90
diff
changeset
|
487 f.close() |
3ed079a7174a
Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents:
90
diff
changeset
|
488 self.clear_instruction() |
3ed079a7174a
Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents:
90
diff
changeset
|
489 |
3ed079a7174a
Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents:
90
diff
changeset
|
490 def clear_instruction(self, force=False): |
3ed079a7174a
Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents:
90
diff
changeset
|
491 if self.instructions_file and (not self.instructions_file_removed |
3ed079a7174a
Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents:
90
diff
changeset
|
492 or force): |
3ed079a7174a
Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents:
90
diff
changeset
|
493 util.writefile(self.instructions_file, "") |
3ed079a7174a
Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents:
90
diff
changeset
|
494 self.instructions_file_removed = True |
3ed079a7174a
Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents:
90
diff
changeset
|
495 |
3ed079a7174a
Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents:
90
diff
changeset
|
496 def should_stop(self): |
3ed079a7174a
Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents:
90
diff
changeset
|
497 return self.read_instruction() == "stop" |