Rev 1433: Set mergeinfo property when pushing merges. in http://people.samba.org/bzr/jelmer/bzr-svn/trunk

Jelmer Vernooij jelmer at samba.org
Fri Jul 4 00:47:52 BST 2008


At http://people.samba.org/bzr/jelmer/bzr-svn/trunk

------------------------------------------------------------
revno: 1433
revision-id: jelmer at samba.org-20080703234748-lof3z0n5j7kzhoyy
parent: jelmer at samba.org-20080703225904-8cvq81lrweryeaz6
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: 0.4
timestamp: Fri 2008-07-04 01:47:48 +0200
message:
  Set mergeinfo property when pushing merges.
modified:
  NEWS                           news-20061231030336-h9fhq245ie0de8bs-1
  commit.py                      commit.py-20060607190346-qvq128wgfubhhgm2-1
  properties.py                  util.py-20080502170127-o220e9py99vt69s6-1
  tests/test_commit.py           test_commit.py-20060624213521-l5kcufywkh9mnilk-1
=== modified file 'NEWS'
--- a/NEWS	2008-07-03 21:12:44 +0000
+++ b/NEWS	2008-07-03 23:47:48 +0000
@@ -30,6 +30,8 @@
 
    * Support proper Bazaar tags. (#81102)
 
+   * Set mergeinfo properties when pushing merges. (write part of #131323)
+
   BUG FIXES
 
    * More efficient use of mutter.

=== modified file 'commit.py'
--- a/commit.py	2008-07-01 22:15:49 +0000
+++ b/commit.py	2008-07-03 23:47:48 +0000
@@ -18,7 +18,8 @@
 from bzrlib import debug, osutils, urlutils, ui
 from bzrlib.branch import Branch
 from bzrlib.errors import (BzrError, InvalidRevisionId, DivergedBranches, 
-                           UnrelatedBranches, AppendRevisionsOnlyViolation)
+                           UnrelatedBranches, AppendRevisionsOnlyViolation,
+                           NoSuchRevision)
 from bzrlib.inventory import Inventory
 from bzrlib.repository import RootCommitBuilder, InterRepository
 from bzrlib.revision import NULL_REVISION, ensure_null
@@ -69,6 +70,41 @@
     return []
 
 
+def update_svk_features(oldvalue, merges):
+    old_svk_features = parse_svk_features(oldvalue)
+    svk_features = set(old_svk_features)
+
+    # SVK compatibility
+    for merge in merges:
+        try:
+            svk_features.add(_revision_id_to_svk_feature(merge))
+        except InvalidRevisionId:
+            pass
+
+    if old_svk_features != svk_features:
+        return serialize_svk_features(svk_features)
+    return None
+
+
+def update_mergeinfo(repository, oldvalue, baserevid, merges):
+    graph = repository.get_graph()
+    mergeinfo = properties.parse_mergeinfo_property(oldvalue)
+    for merge in merges:
+        for (revid, parents) in graph.iter_ancestry([merge]):
+            if graph.is_ancestor(revid, baserevid):
+                break
+            try:
+                (path, revnum, mapping) = repository.lookup_revision_id(revid)
+            except NoSuchRevision:
+                break
+
+            properties.mergeinfo_add_revision(mergeinfo, "/" + path, revnum)
+    newvalue = properties.generate_mergeinfo_property(mergeinfo)
+    if newvalue != oldvalue:
+        return newvalue
+    return None
+
+
 def set_svn_revprops(transport, revnum, revprops):
     """Attempt to change the revision properties on the
     specified revision.
@@ -150,18 +186,13 @@
         (self._svn_revprops, self._svnprops) = self.base_mapping.export_revision(self.branch.get_branch_path(), timestamp, timezone, committer, revprops, revision_id, self.base_revno+1, merges, base_branch_props)
 
         if len(merges) > 0:
-            old_svk_features = parse_svk_features(base_branch_props.get(SVN_PROP_SVK_MERGE, ""))
-            svk_features = set(old_svk_features)
-
-            # SVK compatibility
-            for merge in merges:
-                try:
-                    svk_features.add(_revision_id_to_svk_feature(merge))
-                except InvalidRevisionId:
-                    pass
-
-            if old_svk_features != svk_features:
-                self._svnprops[SVN_PROP_SVK_MERGE] = serialize_svk_features(svk_features)
+            new_svk_merges = update_svk_features(base_branch_props.get(SVN_PROP_SVK_MERGE, ""), merges)
+            if new_svk_merges is not None:
+                self._svnprops[SVN_PROP_SVK_MERGE] = new_svk_merges
+
+            new_mergeinfo = update_mergeinfo(self.repository, base_branch_props.get(properties.PROP_MERGEINFO, ""), self.base_revid, merges)
+            if new_mergeinfo is not None:
+                self._svnprops[properties.PROP_MERGEINFO] = new_mergeinfo
 
     def mutter(self, text, *args):
         if 'commit' in debug.debug_flags:

=== modified file 'properties.py'
--- a/properties.py	2008-07-03 22:59:04 +0000
+++ b/properties.py	2008-07-03 23:47:48 +0000
@@ -148,12 +148,19 @@
     return range_includes_revnum(ranges, revnum)
 
 
+def mergeinfo_add_revision(mergeinfo, path, revnum):
+    assert path.startswith("/")
+    mergeinfo[path] = range_add_revnum(mergeinfo.get(path, []), revnum)
+    return mergeinfo
+
+
 PROP_EXECUTABLE = 'svn:executable'
 PROP_EXECUTABLE_VALUE = '*'
 PROP_EXTERNALS = 'svn:externals'
 PROP_IGNORE = 'svn:ignore'
 PROP_KEYWORDS = 'svn:keywords'
 PROP_MIME_TYPE = 'svn:mime-type'
+PROP_MERGEINFO = 'svn:mergeinfo'
 PROP_NEEDS_LOCK = 'svn:needs-lock'
 PROP_NEEDS_LOCK_VALUE = '*'
 PROP_PREFIX = 'svn:'

=== modified file 'tests/test_commit.py'
--- a/tests/test_commit.py	2008-06-29 12:45:15 +0000
+++ b/tests/test_commit.py	2008-07-03 23:47:48 +0000
@@ -200,6 +200,44 @@
             self.client_get_prop("dc", 
                 "bzr:revision-id:v3-none", 2))
 
+    def test_commit_sets_merge_info(self):
+        repos_url = self.make_repository('d')
+
+        dc = self.get_commit_editor(repos_url)
+        foo = dc.add_dir("trunk")
+        foo.add_file("trunk/bla").modify("bla")
+        dc.add_dir("branches")
+        dc.close()
+
+        dc = self.get_commit_editor(repos_url)
+        tags = dc.add_dir("tags")
+        foobranch = tags.add_dir("tags/foo")
+        foobranch.add_file("tags/foo/afile").modify()
+        dc.close()
+
+        dc = self.get_commit_editor(repos_url)
+        tags = dc.open_dir("tags")
+        foobranch = tags.open_dir("tags/foo")
+        foobranch.add_file("tags/foo/bfile").modify()
+        dc.close()
+
+        branch = Branch.open(repos_url+"/trunk")
+        foobranch = Branch.open(repos_url+"/tags/foo")
+        builder = branch.get_commit_builder([branch.last_revision(), foobranch.last_revision()], 
+                revision_id="my-revision-id")
+        tree = branch.repository.revision_tree(branch.last_revision())
+        new_tree = copy(tree)
+        ie = new_tree.inventory.root
+        ie.revision = None
+        builder.record_entry_contents(ie, [tree.inventory], '', new_tree, 
+                                      None)
+        builder.finish_inventory()
+        builder.commit("foo")
+
+        self.assertEqual("/tags/foo:2-3\n",
+            self.client_get_prop("%s/trunk" % repos_url, 
+                "svn:mergeinfo", 4))
+
     def test_commit_metadata(self):
         repos_url = self.make_client('d', 'dc')
         wt = self.open_checkout("dc")




More information about the bazaar-commits mailing list