annotate treepkg/packager.py @ 191:94fb3f3ab58b

When building a subset of tracks, make sure new packages are added to pbuilder even if the tracks that depend on them are not being built. To achieve this, the information which tracks are to be built is now stored as the do_build flag in the individual tracks and not by passing only a subset of the tracks ot the PackagerGroup. Otherwise the PackagerGroup would not determine the dependencies correctly.
author Bernhard Herzog <bh@intevation.de>
date Wed, 30 Jul 2008 19:23:10 +0000
parents e83db4482aab
children 86360f3d5611
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
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
2 # Authors:
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
3 # Bernhard Herzog <bh@intevation.de>
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
4 #
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
5 # This program is free software under the GPL (>=v2)
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
6 # Read the file COPYING coming with the software for details.
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
7
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
8 """Classes to automatically build debian packages from subversion checkouts"""
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
9
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
10 import os
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
11 import time
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
12 import re
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
13 import logging
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
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
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
17
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
18 import util
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
19 import subversion
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
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
128
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
22 import debian
45
3e610233ccfe use cmdexpand when calling subprocesses
Bernhard Herzog <bh@intevation.de>
parents: 41
diff changeset
23 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
24 from builder import PBuilder
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
25
135
e5b4dea52297 Make more of RevisionPackager available to SourcePackager and
Bernhard Herzog <bh@intevation.de>
parents: 131
diff changeset
26 def _fromparent(attr):
e5b4dea52297 Make more of RevisionPackager available to SourcePackager and
Bernhard Herzog <bh@intevation.de>
parents: 131
diff changeset
27 """Creates a property that delegates its value to self.parent.<attr>"""
e5b4dea52297 Make more of RevisionPackager available to SourcePackager and
Bernhard Herzog <bh@intevation.de>
parents: 131
diff changeset
28 def get(self):
e5b4dea52297 Make more of RevisionPackager available to SourcePackager and
Bernhard Herzog <bh@intevation.de>
parents: 131
diff changeset
29 return getattr(self.parent, attr)
e5b4dea52297 Make more of RevisionPackager available to SourcePackager and
Bernhard Herzog <bh@intevation.de>
parents: 131
diff changeset
30 return property(get)
e5b4dea52297 Make more of RevisionPackager available to SourcePackager and
Bernhard Herzog <bh@intevation.de>
parents: 131
diff changeset
31
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
32
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
33 class SourcePackager(object):
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
34
4
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
35 # Derived classes must supply the package basename
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
36 pkg_basename = None
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
37
135
e5b4dea52297 Make more of RevisionPackager available to SourcePackager and
Bernhard Herzog <bh@intevation.de>
parents: 131
diff changeset
38 track = _fromparent("track")
e5b4dea52297 Make more of RevisionPackager available to SourcePackager and
Bernhard Herzog <bh@intevation.de>
parents: 131
diff changeset
39 revision = _fromparent("revision")
e5b4dea52297 Make more of RevisionPackager available to SourcePackager and
Bernhard Herzog <bh@intevation.de>
parents: 131
diff changeset
40 status = _fromparent("status")
136
5598014b2a1d Add a log/ subdir for each revision. The filename is available as the
Bernhard Herzog <bh@intevation.de>
parents: 135
diff changeset
41 log_dir = _fromparent("log_dir")
135
e5b4dea52297 Make more of RevisionPackager available to SourcePackager and
Bernhard Herzog <bh@intevation.de>
parents: 131
diff changeset
42 work_dir = _fromparent("work_dir")
e5b4dea52297 Make more of RevisionPackager available to SourcePackager and
Bernhard Herzog <bh@intevation.de>
parents: 131
diff changeset
43 src_dir = _fromparent("src_dir")
e5b4dea52297 Make more of RevisionPackager available to SourcePackager and
Bernhard Herzog <bh@intevation.de>
parents: 131
diff changeset
44
e5b4dea52297 Make more of RevisionPackager available to SourcePackager and
Bernhard Herzog <bh@intevation.de>
parents: 131
diff changeset
45 def __init__(self, parent):
e5b4dea52297 Make more of RevisionPackager available to SourcePackager and
Bernhard Herzog <bh@intevation.de>
parents: 131
diff changeset
46 self.parent = parent
4
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
47 assert(self.pkg_basename)
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
48
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
49 def determine_package_version(self, directory):
4
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
50 """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
51
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
52 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
53 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
54 export_sources method.
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 The default implementation simply returns the revision converted
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
57 to a string.
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 return str(self.revision)
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
60
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
61 def export_sources(self):
4
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
62 """Export the sources from the subversion working directory
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 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
65 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
66
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
67 <pkg_basename>-<version>
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
68
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
69 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
70 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
71 """
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
72 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
73 self.track.export_sources(temp_dir)
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
74
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
75 pkgbaseversion = self.determine_package_version(temp_dir)
4
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
76 pkgbasedir = os.path.join(self.work_dir,
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
77 self.pkg_basename + "-" + pkgbaseversion)
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
78
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
79 os.rename(temp_dir, pkgbasedir)
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
80 return pkgbaseversion, pkgbasedir
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
81
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
82
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
83 def update_version_numbers(self, pkgbasedir):
4
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
84 """Updates the version numbers in the code in pkgbasedir.
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
85
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
86 The default implementation does nothing. Derived classes should
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
87 override this method if necessary.
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
88 """
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
89
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
90 def create_tarball(self, tarballname, workdir, basedir):
4
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
91 """Creates a new tarball.
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
92
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
93 Parameters:
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
94
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
95 tarballname -- the filename of the new tarball
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
96 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
97 (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
98 basedir -- The basedirectory of the files that are packaged
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
99 into the tarfile. This should be a relative
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
100 filename directly in workdir.
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
101 """
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
102 logging.info("Creating tarball %r", tarballname)
45
3e610233ccfe use cmdexpand when calling subprocesses
Bernhard Herzog <bh@intevation.de>
parents: 41
diff changeset
103 run.call(cmdexpand("tar czf $tarballname -C $workdir $basedir",
3e610233ccfe use cmdexpand when calling subprocesses
Bernhard Herzog <bh@intevation.de>
parents: 41
diff changeset
104 **locals()))
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
105
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
106 def copy_debian_directory(self, pkgbasedir, pkgbaseversion, changemsg):
4
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
107 """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
108
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
109 Parameter:
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
110 pkgbasedir -- The directory holding the unpacked source package
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
111 pkgbaseversion -- The version to update the changelog to
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
112 changemsg -- The message for the changelog
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
113
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
114 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
115 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
116 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
117 prefix is prepended to the pkgbaseversion parameter. Debian
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
118 uses such prefixes for the kde packages.
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
119 """
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
120 debian_dir = os.path.join(pkgbasedir, "debian")
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
121 changelog = os.path.join(debian_dir, "changelog")
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
122
53
74cd21b6400b rename some variables from pkg_track to track
Bernhard Herzog <bh@intevation.de>
parents: 52
diff changeset
123 self.track.copy_debian_directory(debian_dir)
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
124
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
125 logging.info("Updating %r", changelog)
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
126 oldversion = util.debian_changelog_version(changelog)
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
127 if ":" in oldversion:
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
128 oldversionprefix = oldversion.split(":")[0] + ":"
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
129 else:
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
130 oldversionprefix = ""
93
73c67372c7f7 Make the prefix used in the debian revision number configurable.
Bernhard Herzog <bh@intevation.de>
parents: 91
diff changeset
131 debrev = self.track.debrevision_prefix + "1"
45
3e610233ccfe use cmdexpand when calling subprocesses
Bernhard Herzog <bh@intevation.de>
parents: 41
diff changeset
132 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
133 " -v ${oldversionprefix}${pkgbaseversion}-${debrev}"
45
3e610233ccfe use cmdexpand when calling subprocesses
Bernhard Herzog <bh@intevation.de>
parents: 41
diff changeset
134 " $changemsg", **locals()),
53
74cd21b6400b rename some variables from pkg_track to track
Bernhard Herzog <bh@intevation.de>
parents: 52
diff changeset
135 env=self.track.debian_environment())
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
136
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
137
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
138 def create_source_package(self, pkgbasedir, origtargz):
4
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
139 """Creates a new source package from pkgbasedir and origtargz"""
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
140 logging.info("Creating new source package")
45
3e610233ccfe use cmdexpand when calling subprocesses
Bernhard Herzog <bh@intevation.de>
parents: 41
diff changeset
141 run.call(cmdexpand("dpkg-source -b $directory $tarball",
3e610233ccfe use cmdexpand when calling subprocesses
Bernhard Herzog <bh@intevation.de>
parents: 41
diff changeset
142 directory=os.path.basename(pkgbasedir),
3e610233ccfe use cmdexpand when calling subprocesses
Bernhard Herzog <bh@intevation.de>
parents: 41
diff changeset
143 tarball=os.path.basename(origtargz)),
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
144 cwd=os.path.dirname(pkgbasedir),
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
145 suppress_output=True,
53
74cd21b6400b rename some variables from pkg_track to track
Bernhard Herzog <bh@intevation.de>
parents: 52
diff changeset
146 env=self.track.debian_environment())
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
147
4
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
148 def move_source_package(self, pkgbasename):
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
149 """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
150 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
151 util.ensure_directory(self.src_dir)
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
152 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
153 if filename.startswith(pkgbasename)]:
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
154 os.rename(os.path.join(self.work_dir, filename),
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
155 os.path.join(self.src_dir, filename))
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
156
179
952d366f7b14 Implement optional signing of .dsc and .changes files
Bernhard Herzog <bh@intevation.de>
parents: 176
diff changeset
157 def sign_package(self):
952d366f7b14 Implement optional signing of .dsc and .changes files
Bernhard Herzog <bh@intevation.de>
parents: 176
diff changeset
158 """Signs the .dsc file created buy the instance"""
952d366f7b14 Implement optional signing of .dsc and .changes files
Bernhard Herzog <bh@intevation.de>
parents: 176
diff changeset
159 self.track.sign_file(util.listdir_abs(self.src_dir, "*.dsc")[0])
952d366f7b14 Implement optional signing of .dsc and .changes files
Bernhard Herzog <bh@intevation.de>
parents: 176
diff changeset
160
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
161 def package(self):
4
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
162 """Creates a source package from a subversion checkout.
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
163
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
164 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
165 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
166 work directory is removed.
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
167 """
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
168 util.ensure_directory(self.work_dir)
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
169 try:
41
f7ec40638a06 use the enums for the status field of RevisionStatus
Bernhard Herzog <bh@intevation.de>
parents: 36
diff changeset
170 self.status.creating_source_package()
4
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
171 self.do_package()
179
952d366f7b14 Implement optional signing of .dsc and .changes files
Bernhard Herzog <bh@intevation.de>
parents: 176
diff changeset
172 self.sign_package()
41
f7ec40638a06 use the enums for the status field of RevisionStatus
Bernhard Herzog <bh@intevation.de>
parents: 36
diff changeset
173 self.status.source_package_created()
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
174 finally:
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
175 logging.info("Removing workdir %r", self.work_dir)
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
176 shutil.rmtree(self.work_dir)
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
177
4
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
178 def do_package(self):
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
179 """Does the work of creating a source package
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
180 This method must be overriden by derived classes.
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
181
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
182 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
183 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
184 self.src_dir.
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
185 """
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
186 raise NotImplementedError
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
187
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
188
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
189 class BinaryPackager(object):
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
190
135
e5b4dea52297 Make more of RevisionPackager available to SourcePackager and
Bernhard Herzog <bh@intevation.de>
parents: 131
diff changeset
191 track = _fromparent("track")
e5b4dea52297 Make more of RevisionPackager available to SourcePackager and
Bernhard Herzog <bh@intevation.de>
parents: 131
diff changeset
192 status = _fromparent("status")
136
5598014b2a1d Add a log/ subdir for each revision. The filename is available as the
Bernhard Herzog <bh@intevation.de>
parents: 135
diff changeset
193 log_dir = _fromparent("log_dir")
135
e5b4dea52297 Make more of RevisionPackager available to SourcePackager and
Bernhard Herzog <bh@intevation.de>
parents: 131
diff changeset
194 binary_dir = _fromparent("binary_dir")
e5b4dea52297 Make more of RevisionPackager available to SourcePackager and
Bernhard Herzog <bh@intevation.de>
parents: 131
diff changeset
195
e5b4dea52297 Make more of RevisionPackager available to SourcePackager and
Bernhard Herzog <bh@intevation.de>
parents: 131
diff changeset
196 def __init__(self, parent, dsc_file, logfile):
e5b4dea52297 Make more of RevisionPackager available to SourcePackager and
Bernhard Herzog <bh@intevation.de>
parents: 131
diff changeset
197 self.parent = parent
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
198 self.dsc_file = dsc_file
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
199 self.logfile = logfile
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
200
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
201 def package(self):
41
f7ec40638a06 use the enums for the status field of RevisionStatus
Bernhard Herzog <bh@intevation.de>
parents: 36
diff changeset
202 self.status.creating_binary_package()
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
203 util.ensure_directory(self.binary_dir)
149
4526105f81a7 Make sure the log dir exists before attempting to run pbuilder build
Bernhard Herzog <bh@intevation.de>
parents: 143
diff changeset
204 util.ensure_directory(self.log_dir)
54
b0014b8f6029 fix typo in log message
Bernhard Herzog <bh@intevation.de>
parents: 53
diff changeset
205 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
206 self.track.builder.build(self.dsc_file, self.binary_dir, self.logfile)
179
952d366f7b14 Implement optional signing of .dsc and .changes files
Bernhard Herzog <bh@intevation.de>
parents: 176
diff changeset
207 self.sign_package()
41
f7ec40638a06 use the enums for the status field of RevisionStatus
Bernhard Herzog <bh@intevation.de>
parents: 36
diff changeset
208 self.status.binary_package_created()
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
209
179
952d366f7b14 Implement optional signing of .dsc and .changes files
Bernhard Herzog <bh@intevation.de>
parents: 176
diff changeset
210 def sign_package(self):
952d366f7b14 Implement optional signing of .dsc and .changes files
Bernhard Herzog <bh@intevation.de>
parents: 176
diff changeset
211 """Signs the .changes file created buy the instance"""
952d366f7b14 Implement optional signing of .dsc and .changes files
Bernhard Herzog <bh@intevation.de>
parents: 176
diff changeset
212 self.track.sign_file(util.listdir_abs(self.binary_dir, "*.changes")[0])
952d366f7b14 Implement optional signing of .dsc and .changes files
Bernhard Herzog <bh@intevation.de>
parents: 176
diff changeset
213
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
214
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
215 class RevisionPackager(object):
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
216
4
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
217 source_packager_cls = SourcePackager
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
218 binary_packager_cls = BinaryPackager
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
219
53
74cd21b6400b rename some variables from pkg_track to track
Bernhard Herzog <bh@intevation.de>
parents: 52
diff changeset
220 def __init__(self, track, revision):
74cd21b6400b rename some variables from pkg_track to track
Bernhard Herzog <bh@intevation.de>
parents: 52
diff changeset
221 self.track = track
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
222 self.revision = revision
53
74cd21b6400b rename some variables from pkg_track to track
Bernhard Herzog <bh@intevation.de>
parents: 52
diff changeset
223 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
224 self.status = status.RevisionStatus(os.path.join(self.base_dir,
086c68ca51d2 rename Status to RevisionStatus
Bernhard Herzog <bh@intevation.de>
parents: 26
diff changeset
225 "status"))
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
226
172
06af36f915f2 Move the filenameproperty factory from treepkg/packager.py to
Bernhard Herzog <bh@intevation.de>
parents: 168
diff changeset
227 log_dir = util.filenameproperty("log")
06af36f915f2 Move the filenameproperty factory from treepkg/packager.py to
Bernhard Herzog <bh@intevation.de>
parents: 168
diff changeset
228 work_dir = util.filenameproperty("work")
06af36f915f2 Move the filenameproperty factory from treepkg/packager.py to
Bernhard Herzog <bh@intevation.de>
parents: 168
diff changeset
229 binary_dir = util.filenameproperty("binary")
06af36f915f2 Move the filenameproperty factory from treepkg/packager.py to
Bernhard Herzog <bh@intevation.de>
parents: 168
diff changeset
230 src_dir = util.filenameproperty("src")
06af36f915f2 Move the filenameproperty factory from treepkg/packager.py to
Bernhard Herzog <bh@intevation.de>
parents: 168
diff changeset
231 build_log = util.filenameproperty("build_log.txt", dir_attr="log_dir")
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
232
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
233 def find_dsc_file(self):
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
234 for filename in os.listdir(self.src_dir):
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
235 if filename.endswith(".dsc"):
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
236 return os.path.join(self.src_dir, filename)
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
237 return None
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
238
18
d5c24cfce05e Improve access to a RevisionPackager's build_log
Bernhard Herzog <bh@intevation.de>
parents: 16
diff changeset
239 def has_build_log(self):
d5c24cfce05e Improve access to a RevisionPackager's build_log
Bernhard Herzog <bh@intevation.de>
parents: 16
diff changeset
240 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
241
140
0da76aee8035 Add RevisionPackager method list_log_files which returns a description
Bernhard Herzog <bh@intevation.de>
parents: 139
diff changeset
242 def list_log_files(self):
0da76aee8035 Add RevisionPackager method list_log_files which returns a description
Bernhard Herzog <bh@intevation.de>
parents: 139
diff changeset
243 """Returns a list describing the logfiles available for the revision.
0da76aee8035 Add RevisionPackager method list_log_files which returns a description
Bernhard Herzog <bh@intevation.de>
parents: 139
diff changeset
244 Each list item is a tuple of the form (TITLE, FILENAME) where
0da76aee8035 Add RevisionPackager method list_log_files which returns a description
Bernhard Herzog <bh@intevation.de>
parents: 139
diff changeset
245 TITLE is a string with a title usable in e. g. a web-page, and
0da76aee8035 Add RevisionPackager method list_log_files which returns a description
Bernhard Herzog <bh@intevation.de>
parents: 139
diff changeset
246 FILENAME is the absolute filename of the log file.
0da76aee8035 Add RevisionPackager method list_log_files which returns a description
Bernhard Herzog <bh@intevation.de>
parents: 139
diff changeset
247 """
0da76aee8035 Add RevisionPackager method list_log_files which returns a description
Bernhard Herzog <bh@intevation.de>
parents: 139
diff changeset
248 files = []
0da76aee8035 Add RevisionPackager method list_log_files which returns a description
Bernhard Herzog <bh@intevation.de>
parents: 139
diff changeset
249 if self.has_build_log():
0da76aee8035 Add RevisionPackager method list_log_files which returns a description
Bernhard Herzog <bh@intevation.de>
parents: 139
diff changeset
250 files.append(("build log", self.build_log))
0da76aee8035 Add RevisionPackager method list_log_files which returns a description
Bernhard Herzog <bh@intevation.de>
parents: 139
diff changeset
251 return files
0da76aee8035 Add RevisionPackager method list_log_files which returns a description
Bernhard Herzog <bh@intevation.de>
parents: 139
diff changeset
252
88
3ae54f99db26 Add methods RevisionPackager.list_source_files and
Bernhard Herzog <bh@intevation.de>
parents: 85
diff changeset
253 def list_source_files(self):
3ae54f99db26 Add methods RevisionPackager.list_source_files and
Bernhard Herzog <bh@intevation.de>
parents: 85
diff changeset
254 """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
255 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
256 to the source package.
3ae54f99db26 Add methods RevisionPackager.list_source_files and
Bernhard Herzog <bh@intevation.de>
parents: 85
diff changeset
257 """
3ae54f99db26 Add methods RevisionPackager.list_source_files and
Bernhard Herzog <bh@intevation.de>
parents: 85
diff changeset
258 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
259
3ae54f99db26 Add methods RevisionPackager.list_source_files and
Bernhard Herzog <bh@intevation.de>
parents: 85
diff changeset
260 def list_binary_files(self):
3ae54f99db26 Add methods RevisionPackager.list_source_files and
Bernhard Herzog <bh@intevation.de>
parents: 85
diff changeset
261 """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
262 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
263 to the binary packages.
3ae54f99db26 Add methods RevisionPackager.list_source_files and
Bernhard Herzog <bh@intevation.de>
parents: 85
diff changeset
264 """
3ae54f99db26 Add methods RevisionPackager.list_source_files and
Bernhard Herzog <bh@intevation.de>
parents: 85
diff changeset
265 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
266
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
267 def package(self):
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
268 try:
16
7c55f3879c4d Use the new status class and report start/stop time too
Bernhard Herzog <bh@intevation.de>
parents: 14
diff changeset
269 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
270 self.status.start = datetime.datetime.utcnow()
135
e5b4dea52297 Make more of RevisionPackager available to SourcePackager and
Bernhard Herzog <bh@intevation.de>
parents: 131
diff changeset
271 src_packager = self.source_packager_cls(self)
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
272 src_packager.package()
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
273
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
274 dsc_file = self.find_dsc_file()
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
275 if dsc_file is None:
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
276 raise RuntimeError("Cannot find dsc File in %r" % self.src_dir)
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
277
135
e5b4dea52297 Make more of RevisionPackager available to SourcePackager and
Bernhard Herzog <bh@intevation.de>
parents: 131
diff changeset
278 bin_packager = self.binary_packager_cls(self, dsc_file,
18
d5c24cfce05e Improve access to a RevisionPackager's build_log
Bernhard Herzog <bh@intevation.de>
parents: 16
diff changeset
279 self.build_log)
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
280 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
281 self.status.stop = datetime.datetime.utcnow()
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
282 except:
41
f7ec40638a06 use the enums for the status field of RevisionStatus
Bernhard Herzog <bh@intevation.de>
parents: 36
diff changeset
283 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
284 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
285 # 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
286 # 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
287 # 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
288 # 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
289 # "notification_sent")
7888fe374e11 Add support for notification mails in case of build errors
Bernhard Herzog <bh@intevation.de>
parents: 98
diff changeset
290 self.status.notification_pending()
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
291 raise
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
292
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
293 def remove_package_dir(self):
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
294 logging.info("Removing pkgdir %r", self.base_dir)
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
295 shutil.rmtree(self.base_dir)
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
296
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
297
52
78cf5f6778ec Rename 'packagel ine' -> 'package track'
Bernhard Herzog <bh@intevation.de>
parents: 49
diff changeset
298 class PackageTrack(object):
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
299
4
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
300 revision_packager_cls = RevisionPackager
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
301
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
302 svn_external_subdirs = []
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
303
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
304 extra_config_desc = []
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
305
47
2802be410156 add config options pbuilderrc and use it when calling pbuilder
Bernhard Herzog <bh@intevation.de>
parents: 16
diff changeset
306 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
307 deb_fullname, packager_class="treepkg.packager",
167
36004ee0b3a1 Introduce package track config option signing_key_id to specify the
Bernhard Herzog <bh@intevation.de>
parents: 149
diff changeset
308 debrevision_prefix="treepkg", handle_dependencies=False,
191
94fb3f3ab58b When building a subset of tracks, make sure new packages are added to
Bernhard Herzog <bh@intevation.de>
parents: 190
diff changeset
309 signing_key_id="", do_build=True):
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
310 self.name = name
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
311 self.base_dir = base_dir
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
312 self.svn_url = svn_url
176
7bde59aa611e Make PBuilder.update_extra_pkg_dir create Release and Release.gpg files
Bernhard Herzog <bh@intevation.de>
parents: 172
diff changeset
313 self.builder = PBuilder(pbuilderrc, root_cmd,
7bde59aa611e Make PBuilder.update_extra_pkg_dir create Release and Release.gpg files
Bernhard Herzog <bh@intevation.de>
parents: 172
diff changeset
314 release_signing_keyid=signing_key_id)
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
315 self.deb_email = deb_email
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
316 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
317 self.debrevision_prefix = debrevision_prefix
167
36004ee0b3a1 Introduce package track config option signing_key_id to specify the
Bernhard Herzog <bh@intevation.de>
parents: 149
diff changeset
318 self.signing_key_id = signing_key_id
191
94fb3f3ab58b When building a subset of tracks, make sure new packages are added to
Bernhard Herzog <bh@intevation.de>
parents: 190
diff changeset
319 self.do_build = do_build
128
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
320 self.handle_dependencies = handle_dependencies
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
321 self.dependencies = None
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
322 self.pkg_dir_template = "%(revision)d-%(increment)d"
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
323 self.pkg_dir_regex \
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
324 = re.compile(r"(?P<revision>[0-9]+)-(?P<increment>[0-9]+)$")
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
325
172
06af36f915f2 Move the filenameproperty factory from treepkg/packager.py to
Bernhard Herzog <bh@intevation.de>
parents: 168
diff changeset
326 checkout_dir = util.filenameproperty("checkout")
06af36f915f2 Move the filenameproperty factory from treepkg/packager.py to
Bernhard Herzog <bh@intevation.de>
parents: 168
diff changeset
327 debian_dir = util.filenameproperty("debian")
06af36f915f2 Move the filenameproperty factory from treepkg/packager.py to
Bernhard Herzog <bh@intevation.de>
parents: 168
diff changeset
328 pkg_dir = util.filenameproperty("pkg")
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
329
106
66cbfc772f84 Add bin/inittreepkg.py, a script to automate some of the installation
Bernhard Herzog <bh@intevation.de>
parents: 99
diff changeset
330 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
331 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
332 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
333 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
334 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
335 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
336 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
337 % (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
338
128
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
339 def determine_dependencies(self):
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
340 if self.dependencies is not None:
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
341 return
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
342
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
343 requires = ()
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
344 provides = ()
131
bea9f1cc0bef Try to determine dependencies only when treepkg is fully configured.
Bernhard Herzog <bh@intevation.de>
parents: 128
diff changeset
345 # only try to parse the control file if the debian directory
bea9f1cc0bef Try to determine dependencies only when treepkg is fully configured.
Bernhard Herzog <bh@intevation.de>
parents: 128
diff changeset
346 # exists. If the debian directory doesn't exist yet, the tree
bea9f1cc0bef Try to determine dependencies only when treepkg is fully configured.
Bernhard Herzog <bh@intevation.de>
parents: 128
diff changeset
347 # packager is likely still being configured and this code may be
bea9f1cc0bef Try to determine dependencies only when treepkg is fully configured.
Bernhard Herzog <bh@intevation.de>
parents: 128
diff changeset
348 # run indirectly from e. g. bin/inittreepkg.py in which case the
bea9f1cc0bef Try to determine dependencies only when treepkg is fully configured.
Bernhard Herzog <bh@intevation.de>
parents: 128
diff changeset
349 # init_treepkg method will report the missing debian
bea9f1cc0bef Try to determine dependencies only when treepkg is fully configured.
Bernhard Herzog <bh@intevation.de>
parents: 128
diff changeset
350 if self.handle_dependencies and os.path.exists(self.debian_dir):
128
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
351 control = debian.DebianControlFile(os.path.join(self.debian_dir,
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
352 "control"))
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
353 requires = control.build_depends
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
354 provides = (pkg[0] for pkg in control.packages)
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
355 self.dependencies = (set(requires), set(provides))
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
356 logging.debug("Track %s: build depends: %s", self.name,
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
357 " ".join(self.dependencies[0]))
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
358 logging.debug("Track %s: provides: %s", self.name,
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
359 " ".join(self.dependencies[1]))
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
360
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
361 def dependencies_required(self):
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
362 """Returns a list of required packages"""
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
363 self.determine_dependencies()
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
364 return self.dependencies[0]
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
365
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
366 def dependencies_provided(self):
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
367 """Returns a list of provided packages"""
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
368 self.determine_dependencies()
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
369 return self.dependencies[1]
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
370
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
371 def pkg_dir_for_revision(self, revision, increment):
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
372 return os.path.join(self.pkg_dir,
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
373 self.pkg_dir_template % locals())
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
374
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
375 def last_changed_revision(self):
4
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
376 revisions = []
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
377 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
378 directory = os.path.join(self.checkout_dir, directory)
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
379 revisions.append(subversion.last_changed_revision(directory))
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
380 return max(revisions)
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
381
11
6efe0bd3d8c1 Add method RevisionPackager.get_revision_numbers
Bernhard Herzog <bh@intevation.de>
parents: 10
diff changeset
382 def get_revision_numbers(self):
6efe0bd3d8c1 Add method RevisionPackager.get_revision_numbers
Bernhard Herzog <bh@intevation.de>
parents: 10
diff changeset
383 """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
384 revisions = []
6efe0bd3d8c1 Add method RevisionPackager.get_revision_numbers
Bernhard Herzog <bh@intevation.de>
parents: 10
diff changeset
385 if os.path.exists(self.pkg_dir):
6efe0bd3d8c1 Add method RevisionPackager.get_revision_numbers
Bernhard Herzog <bh@intevation.de>
parents: 10
diff changeset
386 for filename in os.listdir(self.pkg_dir):
6efe0bd3d8c1 Add method RevisionPackager.get_revision_numbers
Bernhard Herzog <bh@intevation.de>
parents: 10
diff changeset
387 match = self.pkg_dir_regex.match(filename)
6efe0bd3d8c1 Add method RevisionPackager.get_revision_numbers
Bernhard Herzog <bh@intevation.de>
parents: 10
diff changeset
388 if match:
6efe0bd3d8c1 Add method RevisionPackager.get_revision_numbers
Bernhard Herzog <bh@intevation.de>
parents: 10
diff changeset
389 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
390 revisions.sort()
11
6efe0bd3d8c1 Add method RevisionPackager.get_revision_numbers
Bernhard Herzog <bh@intevation.de>
parents: 10
diff changeset
391 return revisions
6efe0bd3d8c1 Add method RevisionPackager.get_revision_numbers
Bernhard Herzog <bh@intevation.de>
parents: 10
diff changeset
392
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
393 def last_packaged_revision(self):
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
394 """Returns the revision number of the highest packaged revision.
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
395
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
396 If the revision cannot be determined because no already packaged
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
397 revisions can be found, the function returns -1.
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
398 """
11
6efe0bd3d8c1 Add method RevisionPackager.get_revision_numbers
Bernhard Herzog <bh@intevation.de>
parents: 10
diff changeset
399 return max([-1] + self.get_revision_numbers())
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
400
80
0af2fa3790e0 Add revision parameter to PackagerGroup.__init__ and some other methods
Bernhard Herzog <bh@intevation.de>
parents: 78
diff changeset
401 def update_checkout(self, revision=None):
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
402 """Updates the working copy of self.svn_url in self.checkout_dir.
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
403
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
404 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
405 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
406 passed through to subversion.update.
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
407 """
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
408 localdir = self.checkout_dir
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
409 if os.path.exists(localdir):
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
410 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
411 subversion.update(localdir, revision=revision)
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
412 else:
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
413 logging.info("The working copy in %r doesn't exist yet."
26
06fba656dde8 fix typo
Bernhard Herzog <bh@intevation.de>
parents: 18
diff changeset
414 " Checking out from %r", localdir,
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
415 self.svn_url)
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
416 subversion.checkout(self.svn_url, localdir)
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
417
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
418 def export_sources(self, to_dir):
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
419 logging.info("Exporting sources for tarball to %r", to_dir)
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
420 subversion.export(self.checkout_dir, to_dir)
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
421 # some versions of svn (notably version 1.4.2 shipped with etch)
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
422 # do export externals such as the admin subdirectory. We may
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
423 # have to do that in an extra step.
4
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
424 for subdir in self.svn_external_subdirs:
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
425 absdir = os.path.join(to_dir, subdir)
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
426 if not os.path.isdir(absdir):
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
427 subversion.export(os.path.join(self.checkout_dir, subdir),
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
428 absdir)
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
429
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
430 def copy_debian_directory(self, to_dir):
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
431 logging.info("Copying debian directory to %r", to_dir)
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
432 shutil.copytree(self.debian_dir, to_dir)
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
433
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
434 def debian_environment(self):
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
435 """Returns the environment variables for the debian commands"""
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
436 env = os.environ.copy()
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
437 env["DEBFULLNAME"] = self.deb_fullname
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
438 env["DEBEMAIL"] = self.deb_email
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
439 return env
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
440
190
e83db4482aab Add runtreepkg.py command line option --no-svn-update to inhibit updates
Bernhard Herzog <bh@intevation.de>
parents: 179
diff changeset
441 def package_if_updated(self, revision=None, do_svn_update=True):
e83db4482aab Add runtreepkg.py command line option --no-svn-update to inhibit updates
Bernhard Herzog <bh@intevation.de>
parents: 179
diff changeset
442 """Returns a new packager if the working copy has not been packaged yet.
e83db4482aab Add runtreepkg.py command line option --no-svn-update to inhibit updates
Bernhard Herzog <bh@intevation.de>
parents: 179
diff changeset
443 If do_svn_update is true -- the default -- update the working
e83db4482aab Add runtreepkg.py command line option --no-svn-update to inhibit updates
Bernhard Herzog <bh@intevation.de>
parents: 179
diff changeset
444 copy to the the revision specified with the revision parameter
e83db4482aab Add runtreepkg.py command line option --no-svn-update to inhibit updates
Bernhard Herzog <bh@intevation.de>
parents: 179
diff changeset
445 or if revision is None, the latest revision in the repository."""
191
94fb3f3ab58b When building a subset of tracks, make sure new packages are added to
Bernhard Herzog <bh@intevation.de>
parents: 190
diff changeset
446 if not self.do_build:
94fb3f3ab58b When building a subset of tracks, make sure new packages are added to
Bernhard Herzog <bh@intevation.de>
parents: 190
diff changeset
447 return None
190
e83db4482aab Add runtreepkg.py command line option --no-svn-update to inhibit updates
Bernhard Herzog <bh@intevation.de>
parents: 179
diff changeset
448 if do_svn_update:
e83db4482aab Add runtreepkg.py command line option --no-svn-update to inhibit updates
Bernhard Herzog <bh@intevation.de>
parents: 179
diff changeset
449 self.update_checkout(revision=revision)
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
450 current_revision = self.last_changed_revision()
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
451 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
452 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
453 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
454 current_revision)
4
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
455 return self.revision_packager_cls(self, current_revision)
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
456 else:
98
f7b9c7113c46 Make packaging a specific revision work even if newer revisions have already
Bernhard Herzog <bh@intevation.de>
parents: 93
diff changeset
457 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
458 current_revision)
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
459
14
dfd89f81e66c Add simple status report tool. Still using the old status files
Bernhard Herzog <bh@intevation.de>
parents: 11
diff changeset
460 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
461 """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
462 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
463 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
464
179
952d366f7b14 Implement optional signing of .dsc and .changes files
Bernhard Herzog <bh@intevation.de>
parents: 176
diff changeset
465 def sign_file(self, filename):
952d366f7b14 Implement optional signing of .dsc and .changes files
Bernhard Herzog <bh@intevation.de>
parents: 176
diff changeset
466 """Signs a file using the debian.sign_file function.
952d366f7b14 Implement optional signing of .dsc and .changes files
Bernhard Herzog <bh@intevation.de>
parents: 176
diff changeset
467 The file is signed with the key indicated by the track's
952d366f7b14 Implement optional signing of .dsc and .changes files
Bernhard Herzog <bh@intevation.de>
parents: 176
diff changeset
468 signing_key_id attribute. If that is empty, the file is not
952d366f7b14 Implement optional signing of .dsc and .changes files
Bernhard Herzog <bh@intevation.de>
parents: 176
diff changeset
469 signed.
952d366f7b14 Implement optional signing of .dsc and .changes files
Bernhard Herzog <bh@intevation.de>
parents: 176
diff changeset
470 """
952d366f7b14 Implement optional signing of .dsc and .changes files
Bernhard Herzog <bh@intevation.de>
parents: 176
diff changeset
471 if self.signing_key_id:
952d366f7b14 Implement optional signing of .dsc and .changes files
Bernhard Herzog <bh@intevation.de>
parents: 176
diff changeset
472 logging.info("Signing %r with key %r", filename,
952d366f7b14 Implement optional signing of .dsc and .changes files
Bernhard Herzog <bh@intevation.de>
parents: 176
diff changeset
473 self.signing_key_id)
952d366f7b14 Implement optional signing of .dsc and .changes files
Bernhard Herzog <bh@intevation.de>
parents: 176
diff changeset
474 debian.sign_file(filename, self.signing_key_id)
952d366f7b14 Implement optional signing of .dsc and .changes files
Bernhard Herzog <bh@intevation.de>
parents: 176
diff changeset
475
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
476
113
312949e7628d Add a smarter way to load the packager modules: Add the function
Bernhard Herzog <bh@intevation.de>
parents: 112
diff changeset
477 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
478 """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
479
312949e7628d Add a smarter way to load the packager modules: Add the function
Bernhard Herzog <bh@intevation.de>
parents: 112
diff changeset
480 The packager_class must be the full absolute module name for the
125
34e08d52956e Make the import_packager_module function more flexible. The modules may
Bernhard Herzog <bh@intevation.de>
parents: 113
diff changeset
481 packager. The function tries to find or create a suitable
34e08d52956e Make the import_packager_module function more flexible. The modules may
Bernhard Herzog <bh@intevation.de>
parents: 113
diff changeset
482 PackageTrack class from this module using the following rules:
34e08d52956e Make the import_packager_module function more flexible. The modules may
Bernhard Herzog <bh@intevation.de>
parents: 113
diff changeset
483
34e08d52956e Make the import_packager_module function more flexible. The modules may
Bernhard Herzog <bh@intevation.de>
parents: 113
diff changeset
484 - If the module contains a class called PackageTrack, use that.
34e08d52956e Make the import_packager_module function more flexible. The modules may
Bernhard Herzog <bh@intevation.de>
parents: 113
diff changeset
485
34e08d52956e Make the import_packager_module function more flexible. The modules may
Bernhard Herzog <bh@intevation.de>
parents: 113
diff changeset
486 - Otherwise create one using the module's RevisionPackager class,
34e08d52956e Make the import_packager_module function more flexible. The modules may
Bernhard Herzog <bh@intevation.de>
parents: 113
diff changeset
487 creating RevisionPackager if necessary.
34e08d52956e Make the import_packager_module function more flexible. The modules may
Bernhard Herzog <bh@intevation.de>
parents: 113
diff changeset
488
34e08d52956e Make the import_packager_module function more flexible. The modules may
Bernhard Herzog <bh@intevation.de>
parents: 113
diff changeset
489 - If RevisionPackager needs to be created, it uses the module's
34e08d52956e Make the import_packager_module function more flexible. The modules may
Bernhard Herzog <bh@intevation.de>
parents: 113
diff changeset
490 SourcePackager as source_packager_cls and if present also the
34e08d52956e Make the import_packager_module function more flexible. The modules may
Bernhard Herzog <bh@intevation.de>
parents: 113
diff changeset
491 module's BinaryPackager as binary_packager_cls. If the module
34e08d52956e Make the import_packager_module function more flexible. The modules may
Bernhard Herzog <bh@intevation.de>
parents: 113
diff changeset
492 does not have a BinaryPackager, the default BinaryPackager is
34e08d52956e Make the import_packager_module function more flexible. The modules may
Bernhard Herzog <bh@intevation.de>
parents: 113
diff changeset
493 used.
113
312949e7628d Add a smarter way to load the packager modules: Add the function
Bernhard Herzog <bh@intevation.de>
parents: 112
diff changeset
494 """
312949e7628d Add a smarter way to load the packager modules: Add the function
Bernhard Herzog <bh@intevation.de>
parents: 112
diff changeset
495 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
496 if not hasattr(module, "PackageTrack"):
125
34e08d52956e Make the import_packager_module function more flexible. The modules may
Bernhard Herzog <bh@intevation.de>
parents: 113
diff changeset
497 if not hasattr(module, "RevisionPackager"):
34e08d52956e Make the import_packager_module function more flexible. The modules may
Bernhard Herzog <bh@intevation.de>
parents: 113
diff changeset
498 binary_packager = getattr(module, "BinaryPackager", BinaryPackager)
34e08d52956e Make the import_packager_module function more flexible. The modules may
Bernhard Herzog <bh@intevation.de>
parents: 113
diff changeset
499 module.RevisionPackager \
34e08d52956e Make the import_packager_module function more flexible. The modules may
Bernhard Herzog <bh@intevation.de>
parents: 113
diff changeset
500 = new.classobj("RevisionPackager", (RevisionPackager,),
34e08d52956e Make the import_packager_module function more flexible. The modules may
Bernhard Herzog <bh@intevation.de>
parents: 113
diff changeset
501 dict(source_packager_cls=module.SourcePackager,
34e08d52956e Make the import_packager_module function more flexible. The modules may
Bernhard Herzog <bh@intevation.de>
parents: 113
diff changeset
502 binary_packager_cls=binary_packager))
113
312949e7628d Add a smarter way to load the packager modules: Add the function
Bernhard Herzog <bh@intevation.de>
parents: 112
diff changeset
503 module.PackageTrack \
312949e7628d Add a smarter way to load the packager modules: Add the function
Bernhard Herzog <bh@intevation.de>
parents: 112
diff changeset
504 = 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
505 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
506 return module
312949e7628d Add a smarter way to load the packager modules: Add the function
Bernhard Herzog <bh@intevation.de>
parents: 112
diff changeset
507
52
78cf5f6778ec Rename 'packagel ine' -> 'package track'
Bernhard Herzog <bh@intevation.de>
parents: 49
diff changeset
508 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
509 module = import_packager_module(packager_class)
52
78cf5f6778ec Rename 'packagel ine' -> 'package track'
Bernhard Herzog <bh@intevation.de>
parents: 49
diff changeset
510 return module.PackageTrack(**kw)
4
fee641fec94e Separate the kolab specific parts.
Bernhard Herzog <bh@intevation.de>
parents: 2
diff changeset
511
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
512
128
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
513 class CyclicDependencyError(Exception):
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
514
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
515 """Exception thrown when a cycle is detected in the track dependencies"""
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
516
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
517 def __init__(self, tracks):
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
518 Exception.__init__(self,
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
519 "Cyclic dependencies between" " tracks (%s)"
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
520 % ", ".join([track.name for track in tracks]))
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
521
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
522
7
96f4f58c62b5 Rename the Packager class to PackagerGroup
Bernhard Herzog <bh@intevation.de>
parents: 4
diff changeset
523 class PackagerGroup(object):
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
524
91
3ed079a7174a Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents: 90
diff changeset
525 def __init__(self, package_tracks, check_interval, revision=None,
190
e83db4482aab Add runtreepkg.py command line option --no-svn-update to inhibit updates
Bernhard Herzog <bh@intevation.de>
parents: 179
diff changeset
526 instructions_file=None, do_svn_update=True):
52
78cf5f6778ec Rename 'packagel ine' -> 'package track'
Bernhard Herzog <bh@intevation.de>
parents: 49
diff changeset
527 self.package_tracks = package_tracks
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
528 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
529 self.revision = revision
190
e83db4482aab Add runtreepkg.py command line option --no-svn-update to inhibit updates
Bernhard Herzog <bh@intevation.de>
parents: 179
diff changeset
530 self.do_svn_update = do_svn_update
91
3ed079a7174a Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents: 90
diff changeset
531 self.instructions_file = instructions_file
3ed079a7174a Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents: 90
diff changeset
532 self.instructions_file_removed = False
128
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
533 self.sort_tracks()
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
534
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
535 def sort_tracks(self):
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
536 """Sorts tracks for dependency handling"""
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
537 todo = self.package_tracks[:]
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
538 sorted = []
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
539 seen = set()
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
540
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
541 # dependencies that can be solved by one of the tracks
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
542 known = set()
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
543 for track in todo:
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
544 known |= track.dependencies_provided()
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
545
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
546 while todo:
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
547 todo_again = []
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
548 for track in todo:
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
549 if not track.handle_dependencies:
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
550 sorted.append(track)
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
551 continue
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
552
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
553 unmet = (track.dependencies_required() & known) - seen
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
554 if unmet:
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
555 todo_again.append(track)
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
556 else:
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
557 sorted.append(track)
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
558 seen |= track.dependencies_provided()
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
559 if todo_again == todo:
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
560 raise CyclicDependencyError(todo)
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
561 todo = todo_again
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
562
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
563 self.package_tracks = sorted
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
564 self.needed_binaries = set()
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
565 for track in self.package_tracks:
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
566 self.needed_binaries |= track.dependencies_required()
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
567 self.needed_binaries &= known
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
568
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
569 logging.info("sorted track order: %s",
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
570 " ".join(track.name for track in sorted))
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
571 logging.info("binary packages needed as build dependencies: %s",
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
572 " ".join(self.needed_binaries))
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
573
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
574
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
575 def run(self):
7
96f4f58c62b5 Rename the Packager class to PackagerGroup
Bernhard Herzog <bh@intevation.de>
parents: 4
diff changeset
576 """Runs the packager group indefinitely"""
78
9a602d8eaa60 initial revision of the subversion repository
Thomas Arendsen Hein <thomas@intevation.de>
parents: 55
diff changeset
577 logging.info("Starting in periodic check mode."
9a602d8eaa60 initial revision of the subversion repository
Thomas Arendsen Hein <thomas@intevation.de>
parents: 55
diff changeset
578 " Will check every %d seconds", self.check_interval)
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
579 last_check = -1
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
580 while 1:
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
581 now = time.time()
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
582 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
583 if self.check_package_tracks():
3ed079a7174a Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents: 90
diff changeset
584 break
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
585 last_check = now
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
586 next_check = now + self.check_interval
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
587 to_sleep = next_check - time.time()
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
588 if to_sleep > 0:
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
589 logging.info("Next check at %s",
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
590 time.strftime("%Y-%m-%d %H:%M:%S",
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
591 time.localtime(next_check)))
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
592 time.sleep(to_sleep)
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
593 else:
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
594 logging.info("Next check now")
91
3ed079a7174a Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents: 90
diff changeset
595 if self.should_stop():
3ed079a7174a Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents: 90
diff changeset
596 logging.info("Received stop instruction. Stopping.")
3ed079a7174a Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents: 90
diff changeset
597 return
0
f78a02e79c84 initial checkin
Bernhard Herzog <bh@intevation.de>
parents:
diff changeset
598
52
78cf5f6778ec Rename 'packagel ine' -> 'package track'
Bernhard Herzog <bh@intevation.de>
parents: 49
diff changeset
599 def check_package_tracks(self):
78cf5f6778ec Rename 'packagel ine' -> 'package track'
Bernhard Herzog <bh@intevation.de>
parents: 49
diff changeset
600 logging.info("Checking package tracks")
91
3ed079a7174a Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents: 90
diff changeset
601 self.clear_instruction()
128
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
602 repeat = True
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
603 while repeat:
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
604 repeat = False
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
605 for track in self.package_tracks:
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
606 try:
190
e83db4482aab Add runtreepkg.py command line option --no-svn-update to inhibit updates
Bernhard Herzog <bh@intevation.de>
parents: 179
diff changeset
607 packager = track.package_if_updated(revision=self.revision,
e83db4482aab Add runtreepkg.py command line option --no-svn-update to inhibit updates
Bernhard Herzog <bh@intevation.de>
parents: 179
diff changeset
608 do_svn_update=self.do_svn_update)
128
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
609 if packager:
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
610 packager.package()
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
611 repeat = self.install_dependencies(track, packager)
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
612 if self.should_stop():
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
613 logging.info("Received stop instruction. Stopping.")
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
614 return True
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
615 except:
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
616 logging.exception("An error occurred while"
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
617 " checking packager track %r", track.name)
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
618 if repeat:
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
619 logging.info("Built binaries needed by other tracks."
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
620 " Starting over to ensure all dependencies"
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
621 " are met")
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
622 break
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
623
52
78cf5f6778ec Rename 'packagel ine' -> 'package track'
Bernhard Herzog <bh@intevation.de>
parents: 49
diff changeset
624 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
625
128
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
626
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
627 def install_dependencies(self, track, packager):
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
628 """Add the binaries built by packager to the builder, if necessary.
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
629 It is necessary if any track depends on the packages. The
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
630 method simply installs all binary files built by the packger
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
631 instead of only those which are immediately required by a track.
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
632 This is done because tracks usually depend directly only on the
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
633 -dev packages which usually require another binary package built
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
634 at the same time.
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
635 """
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
636 if (track.handle_dependencies
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
637 and track.dependencies_provided() & self.needed_binaries):
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
638 # FIXME: this basically assumes that all tracks use the same
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
639 # builder. This is true for now, but it is possible to
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
640 # configure treepkg with different builders for different
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
641 # tracks and we really should be installing the newly built
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
642 # binaries into the builder of the tracks which depends on
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
643 # them
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
644 binaries = packager.list_binary_files()
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
645 track.builder.add_binaries_to_extra_pkg(binaries)
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
646 return True
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
647 return False
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
648
5155b4f9443d Add basic dependency handling to PackageTrack and PackagerGroup.
Bernhard Herzog <bh@intevation.de>
parents: 125
diff changeset
649
52
78cf5f6778ec Rename 'packagel ine' -> 'package track'
Bernhard Herzog <bh@intevation.de>
parents: 49
diff changeset
650 def get_package_tracks(self):
78cf5f6778ec Rename 'packagel ine' -> 'package track'
Bernhard Herzog <bh@intevation.de>
parents: 49
diff changeset
651 return self.package_tracks
91
3ed079a7174a Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents: 90
diff changeset
652
3ed079a7174a Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents: 90
diff changeset
653 def read_instruction(self):
3ed079a7174a Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents: 90
diff changeset
654 if not self.instructions_file:
3ed079a7174a Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents: 90
diff changeset
655 return ""
3ed079a7174a Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents: 90
diff changeset
656 try:
3ed079a7174a Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents: 90
diff changeset
657 f = open(self.instructions_file)
3ed079a7174a Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents: 90
diff changeset
658 except (IOError, OSError):
3ed079a7174a Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents: 90
diff changeset
659 return ""
3ed079a7174a Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents: 90
diff changeset
660 try:
3ed079a7174a Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents: 90
diff changeset
661 return f.read().strip()
3ed079a7174a Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents: 90
diff changeset
662 finally:
3ed079a7174a Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents: 90
diff changeset
663 f.close()
3ed079a7174a Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents: 90
diff changeset
664 self.clear_instruction()
3ed079a7174a Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents: 90
diff changeset
665
3ed079a7174a Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents: 90
diff changeset
666 def clear_instruction(self, force=False):
3ed079a7174a Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents: 90
diff changeset
667 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
668 or force):
3ed079a7174a Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents: 90
diff changeset
669 util.writefile(self.instructions_file, "")
3ed079a7174a Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents: 90
diff changeset
670 self.instructions_file_removed = True
3ed079a7174a Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents: 90
diff changeset
671
3ed079a7174a Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents: 90
diff changeset
672 def should_stop(self):
3ed079a7174a Implement a way to stop a running treepackager.
Bernhard Herzog <bh@intevation.de>
parents: 90
diff changeset
673 return self.read_instruction() == "stop"
This site is hosted by Intevation GmbH (Datenschutzerklärung und Impressum | Privacy Policy and Imprint)