[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