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