[Pkg-bazaar-commits] r129 ./bzr-builddeb/people/jdw/merge_upstream: Support importing the second set of .dsc.
James Westby
jw+debian at jameswestby.net
Tue Jun 26 17:33:10 UTC 2007
------------------------------------------------------------
revno: 129
committer: James Westby <jw+debian at jameswestby.net>
branch nick: merge_upstream
timestamp: Tue 2007-06-26 18:33:10 +0100
message:
Support importing the second set of .dsc.
Import a second set of .dsc files, with a new upstream. The new upstream
has the last upstream version as a parent, and the associated diff is added
on top, and gets a second parent of the previous head. This matches the
behaviour of merge_upstream.
Also fix the sorting of .dsc files.
modified:
import_dsc.py
tests/test_import_dsc.py
-------------- next part --------------
=== modified file 'import_dsc.py'
--- a/import_dsc.py 2007-06-25 21:37:25 +0000
+++ b/import_dsc.py 2007-06-26 17:33:10 +0000
@@ -52,28 +52,48 @@
f2.close()
v1 = Version(dsc1['Version'])
v2 = Version(dsc2['Version'])
- return v1 > v2
-
-
-def import_orig(tree, origname, version):
+ if v1 == v2:
+ return 0
+ if v1 > v2:
+ return 1
+ return -1
+
+
+def import_orig(tree, origname, version, last_upstream=None):
f = open(origname, 'rb')
try:
+ dangling_revid = None
+ if last_upstream is not None:
+ dangling_revid = tree.branch.last_revision()
+ old_upstream_revid = tree.branch.tags.lookup_tag(
+ make_upstream_tag(last_upstream))
+ tree.revert([], tree.branch.repository.revision_tree(old_upstream_revid))
import_tar(tree, f)
+ if last_upstream is not None:
+ tree.set_parent_ids([old_upstream_revid])
+ revno = tree.branch.revision_id_to_revno(old_upstream_revid)
+ tree.branch.set_last_revision_info(revno, old_upstream_revid)
tree.commit('import upstream from %s' % (os.path.basename(origname)))
+ if last_upstream is not None:
+ tree.merge_from_branch(tree.branch, to_revision=dangling_revid)
upstream_version = version.upstream_version
tree.branch.tags.set_tag(make_upstream_tag(upstream_version),
tree.branch.last_revision())
finally:
f.close()
-
-
-def import_diff(tree, diffname, version):
+ return dangling_revid
+
+
+def import_diff(tree, diffname, version, dangling_revid=None):
upstream_version = version.upstream_version
up_revid = tree.branch.tags.lookup_tag(make_upstream_tag(upstream_version))
up_tree = tree.branch.repository.revision_tree(up_revid)
- current_revid = tree.branch.last_revision()
+ if dangling_revid is None:
+ current_revid = tree.branch.last_revision()
+ else:
+ current_revid = dangling_revid
current_tree = tree.branch.repository.revision_tree(current_revid)
- tree.revert([], tree.branch.repository.revision_tree(up_revid))
+ tree.revert(['.'], tree.branch.repository.revision_tree(up_revid))
f = gzip.GzipFile(diffname, 'rb')
try:
cmd = ['patch', '--strip', '1', '--quiet', '--directory', tree.basedir]
@@ -128,7 +148,6 @@
tree.add([path])
else:
tree.add([path], [file_id])
- tree.set_parent_ids([current_revid])
tree.commit('merge packaging changes from %s' % \
(os.path.basename(diffname)))
finally:
@@ -146,6 +165,7 @@
tree.lock_write()
try:
dsc_files.sort(cmp=_dsc_sorter)
+ last_upstream = None
for dscname in dsc_files:
f = open(dscname)
try:
@@ -166,9 +186,12 @@
"package which doesn't have a single " \
".diff.gz file."
version = Version(dsc['Version'])
+ dangling_revid = None
if len(orig_files) == 1:
- import_orig(tree, orig_files[0], version)
- import_diff(tree, diff_files[0], version)
+ dangling_revid = import_orig(tree, orig_files[0], version,
+ last_upstream=last_upstream)
+ last_upstream = version.upstream_version
+ import_diff(tree, diff_files[0], version, dangling_revid=dangling_revid)
finally:
tree.unlock()
=== modified file 'tests/test_import_dsc.py'
--- a/tests/test_import_dsc.py 2007-06-25 21:37:25 +0000
+++ b/tests/test_import_dsc.py 2007-06-26 17:33:10 +0000
@@ -47,10 +47,15 @@
basedir = 'package'
target = 'target'
orig_1 = 'package_0.1.orig.tar.gz'
+ orig_2 = 'package_0.2.orig.tar.gz'
diff_1 = 'package_0.1-1.diff.gz'
diff_1b = 'package_0.1-2.diff.gz'
+ diff_1c = 'package_0.1-3.diff.gz'
+ diff_2 = 'package_0.2-1.diff.gz'
dsc_1 = 'package_0.1-1.dsc'
dsc_1b = 'package_0.1-2.dsc'
+ dsc_1c = 'package_0.1-3.dsc'
+ dsc_2 = 'package_0.2-1.dsc'
def make_base_package(self):
os.mkdir(self.basedir)
@@ -58,6 +63,10 @@
write_to_file(os.path.join(self.basedir, 'CHANGELOG'), 'version 1\n')
write_to_file(os.path.join(self.basedir, 'Makefile'), 'bad command\n')
+ def extend_base_package(self):
+ write_to_file(os.path.join(self.basedir, 'NEWS'), 'new release\n')
+ write_to_file(os.path.join(self.basedir, 'Makefile'), 'good command\n')
+
def make_orig_1(self):
self.make_base_package()
tar = tarfile.open(self.orig_1, 'w:gz')
@@ -66,6 +75,14 @@
finally:
tar.close()
+ def make_orig_2(self):
+ self.extend_base_package()
+ tar = tarfile.open(self.orig_2, 'w:gz')
+ try:
+ tar.add(self.basedir)
+ finally:
+ tar.close()
+
def make_diff_1(self):
diffdir = 'package-0.1'
shutil.copytree(self.basedir, diffdir)
@@ -86,6 +103,24 @@
os.system('diff -Nru %s %s | gzip -9 - > %s' % (self.basedir, diffdir,
self.diff_1b))
+ def make_diff_1c(self):
+ diffdir = 'package-0.1'
+ append_to_file(os.path.join(diffdir, 'debian', 'changelog'),
+ 'version 1-3\n')
+ write_to_file(os.path.join(diffdir, 'debian', 'install'), 'install\n')
+ os.system('diff -Nru %s %s | gzip -9 - > %s' % (self.basedir, diffdir,
+ self.diff_1c))
+
+ def make_diff_2(self):
+ diffdir = 'package-0.2'
+ shutil.copytree(self.basedir, diffdir)
+ os.mkdir(os.path.join(diffdir, 'debian'))
+ write_to_file(os.path.join(diffdir, 'debian', 'changelog'),
+ 'version 1-1\nversion 1-2\nversion 1-3\nversion 2-1\n')
+ write_to_file(os.path.join(diffdir, 'debian', 'install'), 'install\n')
+ os.system('diff -Nru %s %s | gzip -9 - > %s' % (self.basedir, diffdir,
+ self.diff_2))
+
def make_dsc(self, filename, version, file1, file2=None):
write_to_file(filename, """Format: 1.0
Source: package
@@ -111,6 +146,15 @@
self.make_diff_1b()
self.make_dsc(self.dsc_1b, '0.1-2', self.diff_1b)
+ def make_dsc_1c(self):
+ self.make_diff_1c()
+ self.make_dsc(self.dsc_1c, '0.1-3', self.diff_1c)
+
+ def make_dsc_2(self):
+ self.make_orig_2()
+ self.make_diff_2()
+ self.make_dsc(self.dsc_2, '0.2-1', self.orig_2, self.diff_2)
+
def import_dsc_1(self):
self.make_dsc_1()
import_dsc(self.target, [self.dsc_1])
@@ -120,6 +164,20 @@
self.make_dsc_1b()
import_dsc(self.target, [self.dsc_1, self.dsc_1b])
+ def import_dsc_1c(self):
+ self.make_dsc_1()
+ self.make_dsc_1b()
+ self.make_dsc_1c()
+ import_dsc(self.target, [self.dsc_1, self.dsc_1c, self.dsc_1b])
+
+ def import_dsc_2(self):
+ self.make_dsc_1()
+ self.make_dsc_1b()
+ self.make_dsc_1c()
+ self.make_dsc_2()
+ import_dsc(self.target,
+ [self.dsc_1, self.dsc_1b, self.dsc_1c, self.dsc_2])
+
def test_import_dsc_target_extant(self):
os.mkdir(self.target)
write_to_file('package_0.1.dsc', '')
@@ -128,7 +186,7 @@
def test_import_one_dsc_tree(self):
self.import_dsc_1()
self.failUnlessExists(self.target)
- tree = WorkingTree.open_containing(self.target)[0]
+ tree = WorkingTree.open(self.target)
tree.lock_read()
expected_inv = ['README', 'CHANGELOG', 'Makefile', 'debian/',
'debian/changelog', 'debian/install']
@@ -155,7 +213,7 @@
def test_import_one_dsc_history(self):
self.import_dsc_1()
- tree = WorkingTree.open_containing(self.target)[0]
+ tree = WorkingTree.open(self.target)
rh = tree.branch.revision_history()
self.assertEqual(len(rh), 2)
msg = tree.branch.repository.get_revision(rh[0]).message
@@ -185,7 +243,7 @@
def test_import_two_dsc_one_upstream_tree(self):
self.import_dsc_1b()
self.failUnlessExists(self.target)
- tree = WorkingTree.open_containing(self.target)[0]
+ tree = WorkingTree.open(self.target)
tree.lock_read()
expected_inv = ['README', 'CHANGELOG', 'Makefile', 'debian/',
'debian/changelog', 'debian/control']
@@ -212,7 +270,7 @@
def test_import_two_dsc_one_upstream_history(self):
self.import_dsc_1b()
- tree = WorkingTree.open_containing(self.target)[0]
+ tree = WorkingTree.open(self.target)
rh = tree.branch.revision_history()
self.assertEqual(len(rh), 3)
msg = tree.branch.repository.get_revision(rh[0]).message
@@ -237,3 +295,130 @@
self.assertEqual(modified[0][3], True)
self.assertEqual(modified[0][4], False)
+ def test_import_three_dsc_one_upstream_tree(self):
+ self.import_dsc_1c()
+ self.failUnlessExists(self.target)
+ tree = WorkingTree.open(self.target)
+ tree.lock_read()
+ expected_inv = ['README', 'CHANGELOG', 'Makefile', 'debian/',
+ 'debian/changelog', 'debian/control', 'debian/install']
+ try:
+ self.check_inventory_shape(tree.inventory, expected_inv)
+ finally:
+ tree.unlock()
+ for path in expected_inv:
+ self.failUnlessExists(os.path.join(self.target, path))
+ f = open(os.path.join(self.target, 'Makefile'))
+ try:
+ contents = f.read()
+ finally:
+ f.close()
+ self.assertEqual(contents, 'good command\n')
+ f = open(os.path.join(self.target, 'debian', 'changelog'))
+ try:
+ contents = f.read()
+ finally:
+ f.close()
+ self.assertEqual(contents, 'version 1-1\nversion 1-2\nversion 1-3\n')
+ self.assertEqual(tree.changes_from(tree.basis_tree()).has_changed(),
+ False)
+
+ def test_import_three_dsc_one_upstream_history(self):
+ self.import_dsc_1c()
+ tree = WorkingTree.open(self.target)
+ rh = tree.branch.revision_history()
+ self.assertEqual(len(rh), 4)
+ msg = tree.branch.repository.get_revision(rh[0]).message
+ self.assertEqual(msg, 'import upstream from %s' % self.orig_1)
+ msg = tree.branch.repository.get_revision(rh[1]).message
+ self.assertEqual(msg, 'merge packaging changes from %s' % self.diff_1)
+ msg = tree.branch.repository.get_revision(rh[2]).message
+ self.assertEqual(msg, 'merge packaging changes from %s' % self.diff_1b)
+ msg = tree.branch.repository.get_revision(rh[3]).message
+ self.assertEqual(msg, 'merge packaging changes from %s' % self.diff_1c)
+ changes = tree.changes_from(tree.branch.repository.revision_tree(rh[2]))
+ added = changes.added
+ self.assertEqual(len(added), 1, str(added))
+ self.assertEqual(added[0][0], 'debian/install')
+ self.assertEqual(added[0][2], 'file')
+ self.assertEqual(len(changes.removed), 0)
+ self.assertEqual(len(changes.renamed), 0)
+ modified = changes.modified
+ self.assertEqual(len(modified), 1)
+ self.assertEqual(modified[0][0], 'debian/changelog')
+ self.assertEqual(modified[0][2], 'file')
+ self.assertEqual(modified[0][3], True)
+ self.assertEqual(modified[0][4], False)
+
+ def test_import_three_dsc_two_upstream_tree(self):
+ self.import_dsc_2()
+ self.failUnlessExists(self.target)
+ tree = WorkingTree.open(self.target)
+ tree.lock_read()
+ expected_inv = ['README', 'CHANGELOG', 'Makefile', 'NEWS', 'debian/',
+ 'debian/changelog', 'debian/install']
+ try:
+ self.check_inventory_shape(tree.inventory, expected_inv)
+ finally:
+ tree.unlock()
+ for path in expected_inv:
+ self.failUnlessExists(os.path.join(self.target, path))
+ f = open(os.path.join(self.target, 'Makefile'))
+ try:
+ contents = f.read()
+ finally:
+ f.close()
+ self.assertEqual(contents, 'good command\n')
+ f = open(os.path.join(self.target, 'debian', 'changelog'))
+ try:
+ contents = f.read()
+ finally:
+ f.close()
+ self.assertEqual(contents,
+ 'version 1-1\nversion 1-2\nversion 1-3\nversion 2-1\n')
+ self.assertEqual(tree.changes_from(tree.basis_tree()).has_changed(),
+ False)
+
+ def test_import_four_dsc_two_upstream_history(self):
+ self.import_dsc_2()
+ tree = WorkingTree.open(self.target)
+ rh = tree.branch.revision_history()
+ self.assertEqual(len(rh), 3)
+ msg = tree.branch.repository.get_revision(rh[0]).message
+ self.assertEqual(msg, 'import upstream from %s' % self.orig_1)
+ msg = tree.branch.repository.get_revision(rh[1]).message
+ self.assertEqual(msg, 'import upstream from %s' % self.orig_2)
+ msg = tree.branch.repository.get_revision(rh[2]).message
+ self.assertEqual(msg, 'merge packaging changes from %s' % self.diff_2)
+ parents = tree.branch.repository.revision_tree(rh[1]).get_parent_ids()
+ self.assertEqual(parents, [rh[0]], rh)
+ parents = tree.branch.repository.revision_tree(rh[2]).get_parent_ids()
+ self.assertEqual(len(parents), 2)
+ self.assertEqual(parents[0], rh[1], rh)
+ self.assertEqual(tree.branch.repository.get_revision(parents[1]).message,
+ 'merge packaging changes from %s' % self.diff_1c)
+ # Check the diff against upstream.
+ changes = tree.changes_from(tree.branch.repository.revision_tree(rh[1]))
+ added = changes.added
+ self.assertEqual(len(added), 3, str(added))
+ self.assertEqual(added[0][0], 'debian')
+ self.assertEqual(added[0][2], 'directory')
+ self.assertEqual(added[1][0], 'debian/changelog')
+ self.assertEqual(added[1][2], 'file')
+ self.assertEqual(added[2][0], 'debian/install')
+ self.assertEqual(added[2][2], 'file')
+ self.assertEqual(changes.removed, [])
+ self.assertEqual(changes.modified, [])
+ # Check the diff against last packaging version
+ changes = tree.changes_from(
+ tree.branch.repository.revision_tree(parents[1]))
+ self.assertEqual(len(changes.added), 1)
+ self.assertEqual(changes.added[0][0], 'NEWS')
+ self.assertEqual(changes.added[0][2], 'file')
+ self.assertEqual(len(changes.removed), 1)
+ self.assertEqual(changes.removed[0][0], 'debian/control')
+ self.assertEqual(changes.removed[0][2], 'file')
+ self.assertEqual(len(changes.modified), 1)
+ self.assertEqual(changes.modified[0][0], 'debian/changelog')
+ self.assertEqual(changes.modified[0][2], 'file')
+
More information about the Pkg-bazaar-commits
mailing list