At http://people.canonical.com/~robertc/baz2.0/plugins/builddeb/upstream-trunk
------------------------------------------------------------ revno: 462 [merge] revision-id: [email protected] parent: [email protected] parent: [email protected] fixes bug(s): https://launchpad.net/bugs/524253 author: Karl Goetz <[email protected]> committer: Robert Collins <[email protected]> branch nick: upstream-trunk timestamp: Wed 2010-07-07 15:18:32 +1000 message: Fix readme rstification from Karl Goetz modified: README readme-20060917150309-xbse5n20p61fw62z-1 bzrtools_import.py bzrtools_import.py-20091225110630-djynb152jiihq7n5-1 debian/changelog changelog-20060815213430-chhbjkje3exq7kj6-3 dh_make.py dh_make.py-20100209173800-daxd9ozp7518xp4k-1 tests/blackbox/test_merge_upstream.py test_merge_upstream.-20070930094111-cz5s8xspcv2jkc8g-1 === modified file 'README' --- a/README 2009-12-25 13:14:13 +0000 +++ b/README 2010-07-07 05:18:32 +0000 @@ -20,7 +20,7 @@ This plugin requires `python-debian`_ (at least version 0.1.11), and a version of bzr at least 1.2. These are available in Debian (though maybe not at the required versions for a development version - of builddeb). +of builddeb). .. _python-debian: http://bzr.debian.org/pkg-python-debian/trunk/ @@ -260,7 +260,7 @@ $ bzr ci There are two options when you want to build a Debian package, whether -it is a native package or not. Most packages are non-native so I will desribe +it is a native package or not. Most packages are non-native so I will describe that first. To create a non-native package you need an upstream tarball to build against. === modified file 'bzrtools_import.py' --- a/bzrtools_import.py 2010-05-28 00:36:04 +0000 +++ b/bzrtools_import.py 2010-07-04 10:30:22 +0000 @@ -197,12 +197,20 @@ import_archive(tree, dir_file, file_ids_from=file_ids_from) def import_archive(tree, archive_file, file_ids_from=None): + if file_ids_from is None: + file_ids_from = [] + for other_tree in file_ids_from: + other_tree.lock_read() + try: + return _import_archive(tree, archive_file, file_ids_from) + finally: + for other_tree in file_ids_from: + other_tree.unlock() + + +def _import_archive(tree, archive_file, file_ids_from): prefix = common_directory(names_of_files(archive_file)) tt = TreeTransform(tree) - - if file_ids_from is None: - file_ids_from = [] - removed = set() for path, entry in tree.inventory.iter_entries(): if entry.parent_id is None: @@ -231,6 +239,26 @@ add_implied_parents(implied_parents, relative_path) trans_id = tt.trans_id_tree_path(relative_path) added.add(relative_path.rstrip('/')) + # To handle renames, we need to not use the preserved file id, rather + # we need to lookup the file id in a from_tree, if there is one. If + # there isn't, we should use the one in the current tree, and failing + # that we will allocate one. In this importer we want the file_ids_from + # tree to authoritative about id2path, which is why we consult it + # first. + existing_file_id = tt.tree_file_id(trans_id) + for other_tree in file_ids_from: + found_file_id = other_tree.path2id(relative_path) + if found_file_id: + if found_file_id != existing_file_id: + # Found a specific file id in one of the source trees + tt.version_file(found_file_id, trans_id) + break + if not found_file_id and not existing_file_id: + # No file_id in any of the source trees and no file id in the base + # tree. + name = basename(member.name.rstrip('/')) + file_id = generate_ids.gen_file_id(name) + tt.version_file(file_id, trans_id) path = tree.abspath(relative_path) if member.name in seen: if tt.final_kind(trans_id) == 'file': @@ -248,23 +276,6 @@ tt.create_symlink(member.linkname, trans_id) else: raise UnknownType(relative_path) - if tt.tree_file_id(trans_id) is None: - found = False - for other_tree in file_ids_from: - other_tree.lock_read() - try: - if other_tree.has_filename(relative_path): - file_id = other_tree.path2id(relative_path) - if file_id is not None: - tt.version_file(file_id, trans_id) - found = True - break - finally: - other_tree.unlock() - if not found: - name = basename(member.name.rstrip('/')) - file_id = generate_ids.gen_file_id(name) - tt.version_file(file_id, trans_id) for relative_path in implied_parents.difference(added): if relative_path == "": === modified file 'debian/changelog' --- a/debian/changelog 2010-05-31 17:33:49 +0000 +++ b/debian/changelog 2010-07-04 10:30:22 +0000 @@ -1,3 +1,10 @@ +bzr-builddeb (2.5lifeless1) UNRELEASED; urgency=low + + * (No tests yet) treat the upstream branch as authoritative for file ids - + causes renamed to be honoured. (LP: #588060) + + -- Robert Collins <[email protected]> Sun, 04 Jul 2010 20:29:17 +1000 + bzr-builddeb (2.5) UNRELEASED; urgency=low [ Colin Watson ] === modified file 'dh_make.py' --- a/dh_make.py 2010-05-05 07:20:17 +0000 +++ b/dh_make.py 2010-07-06 05:32:59 +0000 @@ -108,8 +108,17 @@ tree.add("debian/source/format") command = ["dh_make", "--addmissing", "--packagename", "%s_%s" % (package_name, version)] + if getattr(sys.stdin, 'fileno', None) is None: + # running in a test or something + stdin = subprocess.PIPE + input = "s\n\n" + else: + stdin = sys.stdin + input = None proc = subprocess.Popen(command, cwd=tree.basedir, - preexec_fn=util.subprocess_setup, stdin=sys.stdin) + preexec_fn=util.subprocess_setup, stdin=stdin) + if input: + proc.stdin.write(input) retcode = proc.wait() if retcode != 0: raise bzr_errors.BzrCommandError("dh_make failed.") === modified file 'tests/blackbox/test_merge_upstream.py' --- a/tests/blackbox/test_merge_upstream.py 2008-03-05 17:00:51 +0000 +++ b/tests/blackbox/test_merge_upstream.py 2010-07-06 05:32:59 +0000 @@ -18,12 +18,141 @@ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # -from bzrlib.plugins.builddeb.tests import BuilddebTestCase +import os.path + +import bzrlib.export + +from bzrlib.plugins.builddeb.tests import ( + BuilddebTestCase, + SourcePackageBuilder, + ) + + +class Fixture(object): + """A test fixture.""" + + def __init__(self): + pass + + def setUp(self, test_case): + test_case.addCleanup(self.tearDown) + + def tearDown(self): + pass + + +class Upstream(Fixture): + """An upstream. + + :ivar tree: The tree of the upstream. + """ + + def setUp(self, test_case): + Fixture.setUp(self, test_case) + treename = test_case.getUniqueString() + tree = test_case.make_branch_and_tree(treename) + filename = test_case.getUniqueString() + test_case.build_tree(["%s/%s" % (treename, filename)]) + tree.add([filename]) + tree.commit(test_case.getUniqueString()) + self.tree = tree + + +class ExportedTarball(Fixture): + """An exported tarball 'release'.""" + + def __init__(self, upstream, version): + self.upstream = upstream + self.version = version + + def setUp(self, test_case): + filename = "project-%s.tar.gz" % self.version + tree = self.upstream.tree.branch.repository.revision_tree( + self.upstream.tree.branch.last_revision()) + bzrlib.export.export(tree, filename) + self.tarball = filename + + +class DHMadePackage(Fixture): + """A package made via dh-make.""" + + def __init__(self, tar, upstream): + self.tar = tar + self.upstream = upstream + + def setUp(self, test_case): + branchpath = test_case.getUniqueString() + tree = self.upstream.tree.bzrdir.sprout(branchpath).open_workingtree() + # UGH: spews, because the subprocess output isn't captured. Be nicer to + # use closer to the metal functions here, but I'm overwhelmed by the + # API today, and there is a grue. + test_case.run_bzr(['dh-make', 'package', str(self.tar.version), + os.path.abspath(self.tar.tarball)], working_dir=branchpath) + tree.smart_add([tree.basedir]) + tree.commit('debianised.') # Honestly. + self.tree = tree + + +class FileMovedReplacedUpstream(Fixture): + """An upstream that has been changed by moving and replacing a file.""" + + def __init__(self, upstream): + self.upstream = upstream + + def setUp(self, test_case): + branchpath = test_case.getUniqueString() + tree = self.upstream.tree.bzrdir.sprout(branchpath).open_workingtree() + self.tree = tree + tree.lock_write() + try: + newpath = test_case.getUniqueString() + for child in tree.inventory.root.children.values(): + if child.kind == 'file': + oldpath = child.name + tree.rename_one(oldpath, newpath) + test_case.build_tree(["%s/%s" % (os.path.basename(tree.basedir), + oldpath)]) + tree.add([oldpath]) + tree.commit('yo, renaming and replacing') + finally: + tree.unlock() + class TestMergeUpstream(BuilddebTestCase): - def test_merge_upstream_available(self): - self.run_bzr('merge-upstream --help') - -# vim: ts=2 sts=2 sw=2 + def test_merge_upstream_available(self): + self.run_bzr('merge-upstream --help') + + def make_upstream(self): + result = Upstream() + result.setUp(self) + return result + + def release_upstream(self, upstream): + tar = ExportedTarball(upstream, version=self.getUniqueInteger()) + tar.setUp(self) + return tar + + def import_upstream(self, tar, upstream): + packaging = DHMadePackage(tar, upstream) + packaging.setUp(self) + return packaging + + def file_moved_replaced_upstream(self, upstream): + result = FileMovedReplacedUpstream(upstream) + result.setUp(self) + return result + + def test_smoke_renamed_file(self): + # When a file is renamed by upstream, it should still import ok. + upstream = self.make_upstream() + rel1 = self.release_upstream(upstream) + package = self.import_upstream(rel1, upstream) + changed_upstream = self.file_moved_replaced_upstream(upstream) + rel2 = self.release_upstream(changed_upstream) + self.run_bzr(['merge-upstream', '--version', str(rel2.version), + os.path.abspath(rel2.tarball), changed_upstream.tree.basedir], + working_dir=package.tree.basedir) + +# vim: ts=4 sts=4 sw=4 -- bazaar-commits mailing list [email protected] https://lists.ubuntu.com/mailman/listinfo/bazaar-commits
