30
31
from debian_bundle.changelog import Version, Changelog
32
from bzrlib.tests import TestUtil, adapt_modules, TestCaseWithTransport
33
from bzrlib.tests import TestUtil, multiply_tests, TestCaseWithTransport
34
35
from bzrlib.plugins.builddeb.tests import blackbox
37
def make_new_upstream_dir(dir):
38
def _make_upstream_dir():
39
os.rename('package-0.2', dir)
40
return _make_upstream_dir
42
def make_new_upstream_tarball(tarball):
43
def _make_upstream_tarball():
44
tar = tarfile.open(tarball, 'w:gz')
46
tar.add('package-0.2')
49
shutil.rmtree('package-0.2')
50
return _make_upstream_tarball
52
def make_new_upstream_tarball_bz2(tarball):
53
def _make_upstream_tarball():
54
tar = tarfile.open(tarball, 'w:bz2')
56
tar.add('package-0.2')
59
shutil.rmtree('package-0.2')
60
return _make_upstream_tarball
62
def make_new_upstream_tarball_zip(tarball):
63
def _make_upstream_tarball():
64
zip = zipfile.ZipFile(tarball, 'w')
66
zip.writestr('package-0.2/', '')
67
for (dirpath, dirnames, names) in os.walk('package-0.2'):
69
zip.writestr(os.path.join(dirpath, dir, ''), '')
71
zip.write(os.path.join(dirpath, name))
74
shutil.rmtree('package-0.2')
75
return _make_upstream_tarball
77
def make_new_upstream_tarball_bare(tarball):
78
def _make_upstream_tarball():
79
tar = tarfile.open(tarball, 'w')
81
tar.add('package-0.2')
84
shutil.rmtree('package-0.2')
85
return _make_upstream_tarball
38
def make_new_upstream_dir(source, dest):
39
os.rename(source, dest)
42
def make_new_upstream_tarball(source, dest):
43
tar = tarfile.open(dest, 'w:gz')
51
def make_new_upstream_tarball_bz2(source, dest):
52
tar = tarfile.open(dest, 'w:bz2')
60
def make_new_upstream_tarball_zip(source, dest):
61
zip = zipfile.ZipFile(dest, 'w')
63
zip.writestr(source, '')
64
for (dirpath, dirnames, names) in os.walk(source):
66
zip.writestr(os.path.join(dirpath, dir, ''), '')
68
zip.write(os.path.join(dirpath, name))
74
def make_new_upstream_tarball_bare(source, dest):
75
tar = tarfile.open(dest, 'w')
87
83
tarball_functions = [('dir', make_new_upstream_dir, '../package-0.2'),
88
84
('.tar.gz', make_new_upstream_tarball,
153
136
for mod in doctest_mod_names:
154
suite.addTest(doctest.DocTestSuite(mod))
156
adapt_modules(['%s.test_merge_upstream' % __name__],
157
MergeUpstreamAdaptor(), loader, suite)
158
adapt_modules(['%s.test_repack_tarball' % __name__],
159
RepackTarballAdaptor(), loader, suite)
137
suite.addTest(doctest.DocTestSuite("bzrlib.plugins.builddeb." + mod))
138
repack_tarball_tests = loader.loadTestsFromModuleNames(
139
['%s.test_repack_tarball' % __name__])
140
scenarios = [('dir', dict(build_tarball=make_new_upstream_dir,
141
old_tarball='../package-0.2')),
142
('.tar.gz', dict(build_tarball=make_new_upstream_tarball,
143
old_tarball='../package-0.2.tar.gz')),
144
('.tar.bz2', dict(build_tarball=make_new_upstream_tarball_bz2,
145
old_tarball='../package-0.2.tar.bz2')),
146
('.zip', dict(build_tarball=make_new_upstream_tarball_zip,
147
old_tarball='../package-0.2.zip')),
148
('.tar', dict(build_tarball=make_new_upstream_tarball_bare,
149
old_tarball='../package-0.2.tar')),
151
suite = multiply_tests(repack_tarball_tests, scenarios, suite)
161
152
packages_to_test = [
165
156
for package in packages_to_test:
166
suite.addTest(package.test_suite())
157
suite.addTest(package.test_suite())
170
161
class BuilddebTestCase(TestCaseWithTransport):
172
package_name = 'test'
173
package_version = Version('0.1-1')
174
upstream_version = property(lambda self: \
175
self.package_version.upstream_version)
177
def make_changelog(self, version=None):
179
version = self.package_version
182
c.version = Version(version)
183
c.package = self.package_name
184
c.distributions = 'unstable'
186
c.author = 'James Westby <jw+debian@jameswestby.net>'
187
c.date = 'Thu, 3 Aug 2006 19:16:22 +0100'
189
c.add_change(' * test build')
193
def write_changelog(self, changelog, filename):
194
f = open(filename, 'w')
195
changelog.write_to_open_file(f)
198
def check_tarball_contents(self, tarball, expected, basedir=None,
163
package_name = 'test'
164
package_version = Version('0.1-1')
165
upstream_version = property(lambda self: \
166
self.package_version.upstream_version)
168
def make_changelog(self, version=None):
170
version = self.package_version
173
c.version = Version(version)
174
c.package = self.package_name
175
c.distributions = 'unstable'
177
c.author = 'James Westby <jw+debian@jameswestby.net>'
178
c.date = 'Thu, 3 Aug 2006 19:16:22 +0100'
180
c.add_change(' * test build')
184
def write_changelog(self, changelog, filename):
185
f = open(filename, 'w')
186
changelog.write_to_open_file(f)
189
def check_tarball_contents(self, tarball, expected, basedir=None,
199
190
skip_basedir=False, mode=None):
200
"""Test that the tarball has certain contents.
202
Test that the tarball has exactly expected contents. The basedir
203
is checked for and prepended if it is not None. The mode is the mode
204
used in tarfile.open defaults to r:gz. If skip_basedir is True and
205
basedir is not None then the basedir wont be tested for itself.
191
"""Test that the tarball has certain contents.
193
Test that the tarball has exactly expected contents. The basedir
194
is checked for and prepended if it is not None. The mode is the mode
195
used in tarfile.open defaults to r:gz. If skip_basedir is True and
196
basedir is not None then the basedir wont be tested for itself.
199
real_expected = expected[:]
204
real_expected = [basedir]
205
for item in expected:
206
real_expected.append(os.path.join(basedir, item).rstrip("/"))
208
tar = tarfile.open(tarball, 'r:gz')
211
if tarinfo.name in real_expected:
212
index = real_expected.index(tarinfo.name)
213
del real_expected[index:index+1]
215
extras.append(tarinfo.name)
217
if len(real_expected) > 0:
218
self.fail("Files not found in %s: %s"
219
% (tarball, ", ".join(real_expected)))
221
self.fail("Files not expected to be found in %s: %s"
222
% (tarball, ", ".join(extras)))
227
class SourcePackageBuilder(object):
228
"""An interface to ease building source packages.
230
>>> builder = SourcePackageBuilder("package", Version("0.1-1"))
231
>>> builder.add_upstream_file("foo")
232
>>> builder.add_debian_file("debian/copyright")
233
>>> builder.add_default_control()
235
>>> builder.new_version(Version("0.2-1"))
236
>>> builder.add_upstream_file("bar")
237
>>> builder.remove_upstream_file("foo")
239
>>> builder.dsc_name()
208
real_expected = expected[:]
213
real_expected = [basedir]
214
for item in expected:
215
real_expected.append(os.path.join(basedir, item))
217
tar = tarfile.open(tarball, 'r:gz')
220
if tarinfo.name in real_expected:
221
index = real_expected.index(tarinfo.name)
222
del real_expected[index:index+1]
224
extras.append(tarinfo.name)
226
if len(real_expected) > 0:
227
self.fail("Files not found in %s: %s" % (tarball,
228
", ".join(real_expected)))
230
self.fail("Files not expected to be found in %s: %s" % (tarball,
235
# vim: ts=2 sts=2 sw=2
242
def __init__(self, name, version, native=False):
243
self.upstream_files = {}
244
self.upstream_symlinks = {}
245
self.debian_files = {}
248
self._cl = Changelog()
249
self.new_version(version)
251
def add_upstream_file(self, name, content=None):
252
self.add_upstream_files([(name, content)])
254
def add_upstream_files(self, files):
255
for new_file in files:
256
self.upstream_files[new_file[0]] = new_file[1]
258
def add_upstream_symlink(self, name, target):
259
self.upstream_symlinks[name] = target
261
def remove_upstream_file(self, filename):
262
del self.upstream_files[filename]
264
def add_debian_file(self, name, content=None):
265
self.add_debian_files([(name, content)])
267
def add_debian_files(self, files):
268
for new_file in files:
269
self.debian_files[new_file[0]] = new_file[1]
271
def remove_debian_file(self, filename):
272
del self.debian_files[filename]
274
def add_default_control(self):
275
text = """Source: %s\nSection: misc\n""" % self.name
276
text += "Priority: optional\n"
277
text += "Maintainer: Maintainer <nobody@ubuntu.com>\n"
278
self.add_debian_file("debian/control", text)
280
def new_version(self, version, change_text=None):
281
self._cl.new_block(package=self.name, version=version,
282
distributions="unstable", urgency="low",
283
author="Maint <maint@maint.org>",
284
date="Wed, 19 Mar 2008 21:27:37 +0000")
285
if change_text is None:
286
self._cl.add_change(" * foo")
288
self._cl.add_change(change_text)
291
return "%s_%s.dsc" % (self.name, str(self._cl.version))
295
return "%s_%s.tar.gz" % (self.name, str(self._cl.version))
296
return "%s_%s.orig.tar.gz" % (self.name,
297
str(self._cl.version.upstream_version))
300
assert not self.native, "Can't have a diff with a native package"
301
return "%s_%s.diff.gz" % (self.name, str(self._cl.version))
303
def changes_name(self):
304
return "%s_%s_source.changes" % (self.name, str(self._cl.version))
306
def _make_files(self, files_list, basedir):
307
for (path, content) in files_list.items():
308
dirname = os.path.dirname(path)
309
if dirname is not None and dirname != "":
310
if not os.path.exists(os.path.join(basedir, dirname)):
311
os.makedirs(os.path.join(basedir, dirname))
312
f = open(os.path.join(basedir, path), 'wb')
320
def _make_symlinks(self, files_list, basedir):
321
for (path, target) in files_list.items():
322
dirname = os.path.dirname(path)
323
if dirname is not None and dirname != "":
324
if not os.path.exists(os.path.join(basedir, dirname)):
325
os.makedirs(os.path.join(basedir, dirname))
326
os.symlink(target, os.path.join(basedir, path))
329
return self.name + "-" + str(self._cl.version.upstream_version)
331
def _make_base(self):
332
basedir = self.basedir()
334
self._make_files(self.upstream_files, basedir)
335
self._make_symlinks(self.upstream_symlinks, basedir)
339
basedir = self._make_base()
341
orig_basedir = basedir + ".orig"
342
shutil.copytree(basedir, orig_basedir, symlinks=True)
343
cmd = "dpkg-source -sa -b %s" % (basedir)
344
if os.path.exists("%s_%s.orig.tar.gz"
345
% (self.name, self._cl.version.upstream_version)):
346
cmd = "dpkg-source -ss -b %s" % (basedir)
348
cmd = "dpkg-source -sn -b %s" % (basedir)
349
self._make_files(self.debian_files, basedir)
350
self._make_files({"debian/changelog": str(self._cl)}, basedir)
351
proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE,
352
stderr=subprocess.PIPE)
354
assert ret == 0, "dpkg-source failed, output:\n%s\n%s" % \
355
(proc.stdout.read(), proc.stderr.read())
356
cmd = "dpkg-genchanges -S > ../%s" % self.changes_name()
357
proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE,
358
stderr=subprocess.PIPE, cwd=basedir)
360
assert ret == 0, "dpkg-genchanges failed, output:\n%s\n%s" % \
361
(proc.stdout.read(), proc.stderr.read())
362
shutil.rmtree(basedir)