Mercurial > treepkg > treepkg
annotate treepkg/packager.py @ 10:59d6055493f5
Fix typo in logging message
author | Bernhard Herzog <bh@intevation.de> |
---|---|
date | Fri, 09 Mar 2007 15:03:20 +0100 |
parents | 16689c948bbc |
children | 6efe0bd3d8c1 |
rev | line source |
---|---|
0 | 1 # Copyright (C) 2007 by Intevation GmbH |
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 | |
15 import traceback | |
16 | |
17 import util | |
18 import subversion | |
19 import run | |
20 | |
21 | |
22 def _filenameproperty(relative_dir): | |
23 def get(self): | |
24 return os.path.join(self.base_dir, relative_dir) | |
25 return property(get) | |
26 | |
27 | |
28 class SourcePackager(object): | |
29 | |
4
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
30 # Derived classes must supply the package basename |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
31 pkg_basename = None |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
32 |
9
16689c948bbc
Rename the instance variable plant to pkg_line in some classes
Bernhard Herzog <bh@intevation.de>
parents:
8
diff
changeset
|
33 def __init__(self, pkg_line, status, work_dir, src_dir, revision): |
16689c948bbc
Rename the instance variable plant to pkg_line in some classes
Bernhard Herzog <bh@intevation.de>
parents:
8
diff
changeset
|
34 self.pkg_line = pkg_line |
0 | 35 self.status = status |
36 self.work_dir = work_dir | |
37 self.src_dir = src_dir | |
38 self.revision = revision | |
4
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
39 assert(self.pkg_basename) |
0 | 40 |
41 def determine_package_version(self, directory): | |
4
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
42 """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
|
43 |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
44 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
|
45 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
|
46 export_sources method. |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
47 |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
48 The default implementation simply returns the revision converted |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
49 to a string. |
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 return str(self.revision) |
0 | 52 |
53 def export_sources(self): | |
4
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
54 """Export the sources from the subversion working directory |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
55 |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
56 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
|
57 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
|
58 |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
59 <pkg_basename>-<version> |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
60 |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
61 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
|
62 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
|
63 """ |
0 | 64 temp_dir = os.path.join(self.work_dir, "temp") |
9
16689c948bbc
Rename the instance variable plant to pkg_line in some classes
Bernhard Herzog <bh@intevation.de>
parents:
8
diff
changeset
|
65 self.pkg_line.export_sources(temp_dir) |
0 | 66 |
67 pkgbaseversion = self.determine_package_version(temp_dir) | |
4
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
68 pkgbasedir = os.path.join(self.work_dir, |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
69 self.pkg_basename + "-" + pkgbaseversion) |
0 | 70 |
71 os.rename(temp_dir, pkgbasedir) | |
72 return pkgbaseversion, pkgbasedir | |
73 | |
74 | |
75 def update_version_numbers(self, pkgbasedir): | |
4
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
76 """Updates the version numbers in the code in pkgbasedir. |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
77 |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
78 The default implementation does nothing. Derived classes should |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
79 override this method if necessary. |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
80 """ |
0 | 81 |
82 def create_tarball(self, tarballname, workdir, basedir): | |
4
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
83 """Creates a new tarball. |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
84 |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
85 Parameters: |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
86 |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
87 tarballname -- the filename of the new tarball |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
88 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
|
89 (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
|
90 basedir -- The basedirectory of the files that are packaged |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
91 into the tarfile. This should be a relative |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
92 filename directly in workdir. |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
93 """ |
0 | 94 logging.info("Creating tarball %r", tarballname) |
95 run.call(["tar", "czf", tarballname, "-C", workdir, basedir]) | |
96 | |
97 def copy_debian_directory(self, pkgbasedir, pkgbaseversion, changemsg): | |
4
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
98 """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
|
99 |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
100 Parameter: |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
101 pkgbasedir -- The directory holding the unpacked source package |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
102 pkgbaseversion -- The version to update the changelog to |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
103 changemsg -- The message for the changelog |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
104 |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
105 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
|
106 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
|
107 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
|
108 prefix is prepended to the pkgbaseversion parameter. Debian |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
109 uses such prefixes for the kde packages. |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
110 """ |
0 | 111 debian_dir = os.path.join(pkgbasedir, "debian") |
112 changelog = os.path.join(debian_dir, "changelog") | |
113 | |
9
16689c948bbc
Rename the instance variable plant to pkg_line in some classes
Bernhard Herzog <bh@intevation.de>
parents:
8
diff
changeset
|
114 self.pkg_line.copy_debian_directory(debian_dir) |
0 | 115 |
116 logging.info("Updating %r", changelog) | |
117 oldversion = util.debian_changelog_version(changelog) | |
118 if ":" in oldversion: | |
119 oldversionprefix = oldversion.split(":")[0] + ":" | |
120 else: | |
121 oldversionprefix = "" | |
122 run.call(["debchange", "-c", changelog, | |
123 "-v", oldversionprefix + pkgbaseversion + "-kk1", | |
124 changemsg], | |
9
16689c948bbc
Rename the instance variable plant to pkg_line in some classes
Bernhard Herzog <bh@intevation.de>
parents:
8
diff
changeset
|
125 env=self.pkg_line.debian_environment()) |
0 | 126 |
127 | |
128 def create_source_package(self, pkgbasedir, origtargz): | |
4
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
129 """Creates a new source package from pkgbasedir and origtargz""" |
0 | 130 logging.info("Creating new source package") |
131 run.call(["dpkg-source", "-b", os.path.basename(pkgbasedir), | |
132 os.path.basename(origtargz)], | |
133 cwd=os.path.dirname(pkgbasedir), | |
134 suppress_output=True, | |
9
16689c948bbc
Rename the instance variable plant to pkg_line in some classes
Bernhard Herzog <bh@intevation.de>
parents:
8
diff
changeset
|
135 env=self.pkg_line.debian_environment()) |
0 | 136 |
4
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
137 def move_source_package(self, pkgbasename): |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
138 """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
|
139 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
|
140 util.ensure_directory(self.src_dir) |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
141 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
|
142 if filename.startswith(pkgbasename)]: |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
143 os.rename(os.path.join(self.work_dir, filename), |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
144 os.path.join(self.src_dir, filename)) |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
145 |
0 | 146 def package(self): |
4
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
147 """Creates a source package from a subversion checkout. |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
148 |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
149 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
|
150 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
|
151 work directory is removed. |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
152 """ |
0 | 153 util.ensure_directory(self.work_dir) |
154 try: | |
155 self.status.set("creating_source_package") | |
4
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
156 self.do_package() |
0 | 157 self.status.set("source_package_created") |
158 finally: | |
159 logging.info("Removing workdir %r", self.work_dir) | |
160 shutil.rmtree(self.work_dir) | |
161 | |
4
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
162 def do_package(self): |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
163 """Does the work of creating a source package |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
164 This method must be overriden by derived classes. |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
165 |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
166 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
|
167 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
|
168 self.src_dir. |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
169 """ |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
170 raise NotImplementedError |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
171 |
0 | 172 |
173 class BinaryPackager(object): | |
174 | |
9
16689c948bbc
Rename the instance variable plant to pkg_line in some classes
Bernhard Herzog <bh@intevation.de>
parents:
8
diff
changeset
|
175 def __init__(self, pkg_line, status, binary_dir, dsc_file, logfile): |
16689c948bbc
Rename the instance variable plant to pkg_line in some classes
Bernhard Herzog <bh@intevation.de>
parents:
8
diff
changeset
|
176 self.pkg_line = pkg_line |
0 | 177 self.status = status |
178 self.binary_dir = binary_dir | |
179 self.dsc_file = dsc_file | |
180 self.logfile = logfile | |
181 | |
182 def package(self): | |
183 self.status.set("creating_binary_package") | |
184 util.ensure_directory(self.binary_dir) | |
185 logging.info("Building binary package; loging to %r", self.logfile) | |
2
e6a9f4037f68
readconfig.py is smarter now about conversions and supports shlex
Bernhard Herzog <bh@intevation.de>
parents:
0
diff
changeset
|
186 cmd = ["/usr/sbin/pbuilder", "build", "--logfile", self.logfile, |
e6a9f4037f68
readconfig.py is smarter now about conversions and supports shlex
Bernhard Herzog <bh@intevation.de>
parents:
0
diff
changeset
|
187 "--buildresult", self.binary_dir, self.dsc_file] |
9
16689c948bbc
Rename the instance variable plant to pkg_line in some classes
Bernhard Herzog <bh@intevation.de>
parents:
8
diff
changeset
|
188 run.call(self.pkg_line.root_cmd + cmd, suppress_output=True) |
0 | 189 self.status.set("binary_package_created") |
190 | |
191 | |
192 class RevisionPackager(object): | |
193 | |
4
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
194 source_packager_cls = SourcePackager |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
195 binary_packager_cls = BinaryPackager |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
196 |
9
16689c948bbc
Rename the instance variable plant to pkg_line in some classes
Bernhard Herzog <bh@intevation.de>
parents:
8
diff
changeset
|
197 def __init__(self, pkg_line, revision): |
16689c948bbc
Rename the instance variable plant to pkg_line in some classes
Bernhard Herzog <bh@intevation.de>
parents:
8
diff
changeset
|
198 self.pkg_line = pkg_line |
0 | 199 self.revision = revision |
9
16689c948bbc
Rename the instance variable plant to pkg_line in some classes
Bernhard Herzog <bh@intevation.de>
parents:
8
diff
changeset
|
200 self.base_dir = self.pkg_line.pkg_dir_for_revision(self.revision, 1) |
0 | 201 self.status = util.StatusFile(os.path.join(self.base_dir, "status")) |
202 | |
203 work_dir = _filenameproperty("work") | |
204 binary_dir = _filenameproperty("binary") | |
205 src_dir = _filenameproperty("src") | |
206 | |
207 def find_dsc_file(self): | |
208 for filename in os.listdir(self.src_dir): | |
209 if filename.endswith(".dsc"): | |
210 return os.path.join(self.src_dir, filename) | |
211 return None | |
212 | |
213 def package(self): | |
214 try: | |
9
16689c948bbc
Rename the instance variable plant to pkg_line in some classes
Bernhard Herzog <bh@intevation.de>
parents:
8
diff
changeset
|
215 src_packager = self.source_packager_cls(self.pkg_line, self.status, |
4
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
216 self.work_dir, self.src_dir, |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
217 self.revision) |
0 | 218 src_packager.package() |
219 | |
220 dsc_file = self.find_dsc_file() | |
221 if dsc_file is None: | |
222 raise RuntimeError("Cannot find dsc File in %r" % self.src_dir) | |
223 | |
9
16689c948bbc
Rename the instance variable plant to pkg_line in some classes
Bernhard Herzog <bh@intevation.de>
parents:
8
diff
changeset
|
224 bin_packager = self.binary_packager_cls(self.pkg_line, self.status, |
4
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
225 self.binary_dir, dsc_file, |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
226 os.path.join(self.base_dir, |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
227 "build.log")) |
0 | 228 bin_packager.package() |
229 except: | |
230 self.status.set("failed", traceback.format_exc()) | |
231 raise | |
232 | |
233 def remove_package_dir(self): | |
234 logging.info("Removing pkgdir %r", self.base_dir) | |
235 shutil.rmtree(self.base_dir) | |
236 | |
237 | |
8
574506a022f6
Rename AssemblyLine to PackageLine
Bernhard Herzog <bh@intevation.de>
parents:
7
diff
changeset
|
238 class PackageLine(object): |
0 | 239 |
4
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
240 revision_packager_cls = RevisionPackager |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
241 |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
242 svn_external_subdirs = [] |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
243 |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
244 extra_config_desc = [] |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
245 |
0 | 246 def __init__(self, name, base_dir, svn_url, root_cmd, deb_email, |
4
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
247 deb_fullname, packager_class="treepkg.packager"): |
0 | 248 self.name = name |
249 self.base_dir = base_dir | |
250 self.svn_url = svn_url | |
251 self.root_cmd = root_cmd | |
252 self.deb_email = deb_email | |
253 self.deb_fullname = deb_fullname | |
254 self.pkg_dir_template = "%(revision)d-%(increment)d" | |
255 self.pkg_dir_regex \ | |
256 = re.compile(r"(?P<revision>[0-9]+)-(?P<increment>[0-9]+)$") | |
257 | |
258 checkout_dir = _filenameproperty("checkout") | |
259 debian_dir = _filenameproperty("debian") | |
260 pkg_dir = _filenameproperty("pkg") | |
261 | |
262 def pkg_dir_for_revision(self, revision, increment): | |
263 return os.path.join(self.pkg_dir, | |
264 self.pkg_dir_template % locals()) | |
265 | |
266 def last_changed_revision(self): | |
4
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
267 revisions = [] |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
268 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
|
269 directory = os.path.join(self.checkout_dir, directory) |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
270 revisions.append(subversion.last_changed_revision(directory)) |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
271 return max(revisions) |
0 | 272 |
273 def last_packaged_revision(self): | |
274 """Returns the revision number of the highest packaged revision. | |
275 | |
276 If the revision cannot be determined because no already packaged | |
277 revisions can be found, the function returns -1. | |
278 """ | |
279 revisions = [-1] | |
280 if os.path.exists(self.pkg_dir): | |
281 for filename in os.listdir(self.pkg_dir): | |
282 match = self.pkg_dir_regex.match(filename) | |
283 if match: | |
284 revisions.append(int(match.group("revision"))) | |
285 return max(revisions) | |
286 | |
287 def debian_source(self): | |
288 return util.extract_value_for_key(open(os.path.join(self.debian_dir, | |
289 "control")), | |
290 "Source:") | |
291 | |
292 def update_checkout(self): | |
293 """Updates the working copy of self.svn_url in self.checkout_dir. | |
294 | |
295 If self.checkout_dir doesn't exist yet, self.svn_url is checked | |
296 out into that directory. | |
297 """ | |
298 localdir = self.checkout_dir | |
299 if os.path.exists(localdir): | |
300 logging.info("Updating the working copy in %r", localdir) | |
301 subversion.update(localdir) | |
302 else: | |
303 logging.info("The working copy in %r doesn't exist yet." | |
304 " Checking out fromo %r", localdir, | |
305 self.svn_url) | |
306 subversion.checkout(self.svn_url, localdir) | |
307 | |
308 def export_sources(self, to_dir): | |
309 logging.info("Exporting sources for tarball to %r", to_dir) | |
310 subversion.export(self.checkout_dir, to_dir) | |
311 # some versions of svn (notably version 1.4.2 shipped with etch) | |
312 # do export externals such as the admin subdirectory. We may | |
313 # have to do that in an extra step. | |
4
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
314 for subdir in self.svn_external_subdirs: |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
315 absdir = os.path.join(to_dir, subdir) |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
316 if not os.path.isdir(absdir): |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
317 subversion.export(os.path.join(self.checkout_dir, subdir), |
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
318 absdir) |
0 | 319 |
320 def copy_debian_directory(self, to_dir): | |
321 logging.info("Copying debian directory to %r", to_dir) | |
322 shutil.copytree(self.debian_dir, to_dir) | |
323 | |
324 def debian_environment(self): | |
325 """Returns the environment variables for the debian commands""" | |
326 env = os.environ.copy() | |
327 env["DEBFULLNAME"] = self.deb_fullname | |
328 env["DEBEMAIL"] = self.deb_email | |
329 return env | |
330 | |
331 def package_if_updated(self): | |
332 """Checks if the checkout changed and returns a new packager if so""" | |
333 self.update_checkout() | |
334 current_revision = self.last_changed_revision() | |
335 logging.info("New revision is %d", current_revision) | |
336 previous_revision = self.last_packaged_revision() | |
337 logging.info("Previously packaged revision was %d", previous_revision) | |
338 if current_revision > previous_revision: | |
339 logging.info("New revision is not packaged yet") | |
4
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
340 return self.revision_packager_cls(self, current_revision) |
0 | 341 else: |
342 logging.info("New revision already packaged.") | |
343 | |
344 | |
8
574506a022f6
Rename AssemblyLine to PackageLine
Bernhard Herzog <bh@intevation.de>
parents:
7
diff
changeset
|
345 def create_package_line(packager_class, **kw): |
4
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
346 module = util.import_dotted_name(packager_class) |
8
574506a022f6
Rename AssemblyLine to PackageLine
Bernhard Herzog <bh@intevation.de>
parents:
7
diff
changeset
|
347 return module.PackageLine(**kw) |
4
fee641fec94e
Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents:
2
diff
changeset
|
348 |
0 | 349 |
7
96f4f58c62b5
Rename the Packager class to PackagerGroup
Bernhard Herzog <bh@intevation.de>
parents:
4
diff
changeset
|
350 class PackagerGroup(object): |
0 | 351 |
8
574506a022f6
Rename AssemblyLine to PackageLine
Bernhard Herzog <bh@intevation.de>
parents:
7
diff
changeset
|
352 def __init__(self, package_lines, check_interval): |
574506a022f6
Rename AssemblyLine to PackageLine
Bernhard Herzog <bh@intevation.de>
parents:
7
diff
changeset
|
353 self.package_lines = package_lines |
0 | 354 self.check_interval = check_interval |
355 | |
356 def run(self): | |
7
96f4f58c62b5
Rename the Packager class to PackagerGroup
Bernhard Herzog <bh@intevation.de>
parents:
4
diff
changeset
|
357 """Runs the packager group indefinitely""" |
96f4f58c62b5
Rename the Packager class to PackagerGroup
Bernhard Herzog <bh@intevation.de>
parents:
4
diff
changeset
|
358 logging.info("Tree packager starts. Will check every %d seconds", |
0 | 359 self.check_interval) |
360 last_check = -1 | |
361 while 1: | |
362 now = time.time() | |
363 if now > last_check + self.check_interval: | |
8
574506a022f6
Rename AssemblyLine to PackageLine
Bernhard Herzog <bh@intevation.de>
parents:
7
diff
changeset
|
364 self.check_package_lines() |
0 | 365 last_check = now |
366 next_check = now + self.check_interval | |
367 to_sleep = next_check - time.time() | |
368 if to_sleep > 0: | |
369 logging.info("Next check at %s", | |
370 time.strftime("%Y-%m-%d %H:%M:%S", | |
371 time.localtime(next_check))) | |
372 time.sleep(to_sleep) | |
373 else: | |
374 logging.info("Next check now") | |
375 | |
8
574506a022f6
Rename AssemblyLine to PackageLine
Bernhard Herzog <bh@intevation.de>
parents:
7
diff
changeset
|
376 def check_package_lines(self): |
574506a022f6
Rename AssemblyLine to PackageLine
Bernhard Herzog <bh@intevation.de>
parents:
7
diff
changeset
|
377 logging.info("Checking package lines") |
574506a022f6
Rename AssemblyLine to PackageLine
Bernhard Herzog <bh@intevation.de>
parents:
7
diff
changeset
|
378 for line in self.package_lines: |
0 | 379 try: |
380 packager = line.package_if_updated() | |
381 if packager: | |
382 packager.package() | |
383 except: | |
384 logging.exception("An error occurred while" | |
8
574506a022f6
Rename AssemblyLine to PackageLine
Bernhard Herzog <bh@intevation.de>
parents:
7
diff
changeset
|
385 " checking packager line %r", line.name) |
10
59d6055493f5
Fix typo in logging message
Bernhard Herzog <bh@intevation.de>
parents:
9
diff
changeset
|
386 logging.info("Checked all package lines") |