Add get_property_diff() function, another helper function in the logwalker and some...
authorJelmer Vernooij <jelmer@samba.org>
Sat, 23 Dec 2006 22:56:57 +0000 (23:56 +0100)
committerJelmer Vernooij <jelmer@samba.org>
Sat, 23 Dec 2006 22:56:57 +0000 (23:56 +0100)
branchprops.py
logwalker.py
repository.py
tests/test_branchprops.py
tests/test_logwalker.py

index 99400586abf474ef7213dcd07690ccaab9442d25..a4f674aeedd2a26b1c1d4084070c0d126a34043e 100644 (file)
@@ -73,11 +73,17 @@ class BranchPropertyList:
             return props[name]
         return default
 
-    def _get_branch_prop_added(self, path, revnum, name):
+    def get_property_diff(self, path, revnum, name):
         """Returns the new lines that were added to a particular property."""
         # If the path this property is set on didn't change, then 
         # the property can't have changed.
         if not self.log.touches_path(path, revnum):
             return ""
 
-        #FIXME
+        current = self.get_property(path, revnum, name, "")
+        (prev_path, prev_revnum) = self.log.get_previous(path, revnum)
+        previous = self.get_property(prev_path, prev_revnum, name, "")
+        if len(previous) > len(current) or current[0:len(previous)] != previous:
+            mutter('original part changed!')
+            return ""
+        return current[len(previous):] 
index 6c09af47833d2d77abe1cd777dfc8b69c88149c3..0ce8c6e82b77a359c2642f51ffd912aa056918fe 100644 (file)
@@ -256,10 +256,9 @@ class LogWalker(object):
         if revnum > self.saved_revnum:
             self.fetch_revisions(revnum, pb)
         (author, message, date) = self.db.execute("select author, message, date from revision where revno="+ str(revnum)).fetchone()
-        paths = self._get_revision_paths(revnum)
         if author is None:
             author = None
-        return (author, _escape_commit_message(base64.b64decode(message)), date, paths)
+        return (author, _escape_commit_message(base64.b64decode(message)), date)
 
     
     def find_latest_change(self, path, revnum):
@@ -308,3 +307,18 @@ class LogWalker(object):
             yield os.path.join(path, p)
             for c in self.find_children(os.path.join(path, p), revnum):
                 yield c
+
+    def get_previous(self, path, revnum):
+        """Return path,revnum pair specified pair was derived from.
+
+        :param path:  Path to check
+        :param revnum:  Revision to check
+        """
+        if revnum > self.saved_revnum:
+            self.fetch_revisions(revnum)
+        if revnum == 0:
+            return (None, -1)
+        row = self.db.execute("select copyfrom_path, copyfrom_rev from changed_path where path='%s' and rev=%d" % (path, revnum)).fetchone()
+        if row[1] == -1:
+            return (path, revnum-1)
+        return row
index b1f7d1a2db1c15229de7b859d70fbb97928594ab..9fb8a1f2b4ea3f818bb53c18dd6715c9dcfd170b 100644 (file)
@@ -364,7 +364,7 @@ class SvnRepository(Repository):
                 break
 
         # if the branch didn't change, bzr:merge can't have changed
-        if not path in self._log.get_revision_info(revnum)[3]:
+        if not self._log.touches_path(branch, revnum):
             return parent_ids
        
         if merged_data is None:
@@ -414,7 +414,7 @@ class SvnRepository(Repository):
 
             bzr_props[name[len(SVN_PROP_BZR_REVPROP_PREFIX):]] = svn_props[name]
 
-        (rev.committer, rev.message, date, _) = self._log.get_revision_info(revnum)
+        (rev.committer, rev.message, date) = self._log.get_revision_info(revnum)
         if rev.committer is None:
             rev.committer = ""
 
index 9f94f448ad9e302277eb9adaf1c5e949e0293d84..929e5dc3bccbf6d2d714af7b9bb4b0466df21962 100644 (file)
@@ -78,3 +78,15 @@ class TestBranchProps(TestCaseWithSubversionRepository):
         self.assertEqual('1', props["svn:entry:committed-rev"])
         self.assertTrue("svn:entry:last-author" in props)
         self.assertTrue("svn:entry:committed-date" in props)
+
+    def test_get_property_diff(self):
+        repos_url = self.make_client('d', 'dc')
+        self.client_set_prop("dc", "myprop", "data\n")
+        self.client_commit("dc", "My Message")
+        self.client_set_prop("dc", "myprop", "data\ndata2\n")
+        self.client_commit("dc", "My Message")
+
+        logwalk = LogWalker(scheme=NoBranchingScheme(), transport=SvnRaTransport(repos_url))
+
+        bp = BranchPropertyList(logwalk, self.db)
+        self.assertEqual("data2\n", bp.get_property_diff("", 2, "myprop"))
index 2e49d069f27bd5cdc2e63150fbec9c84612c31fd..2b51df239abb3e1e89feafe08dbd70eee6591802 100644 (file)
@@ -325,3 +325,45 @@ class TestLogWalker(TestCaseWithSubversionRepository):
                                      transport=SvnRaTransport(repos_url))
 
         self.assertFalse(walker.touches_path("trunk", 2))
+
+    def test_get_previous_simple(self):
+        repos_url = self.make_client("a", "dc")
+        self.build_tree({'dc/trunk/afile': "data"})
+        self.client_add("dc/trunk")
+        self.client_commit("dc", "My Message")
+        self.build_tree({'dc/trunk/afile': "data2"})
+        self.client_set_prop("dc/trunk", "myprop", "mydata")
+        self.client_commit("dc", "My Message")
+
+        walker = logwalker.LogWalker(TrunkBranchingScheme(), 
+                                     transport=SvnRaTransport(repos_url))
+
+        self.assertEqual(("trunk", 1), walker.get_previous("trunk", 2))
+
+    def test_get_previous_copy(self):
+        repos_url = self.make_client("a", "dc")
+        self.build_tree({'dc/trunk/afile': "data"})
+        self.client_add("dc/trunk")
+        self.client_commit("dc", "My Message")
+        self.client_copy("dc/trunk", "dc/anotherfile")
+        self.client_commit("dc", "My Message")
+
+        walker = logwalker.LogWalker(TrunkBranchingScheme(), 
+                                     transport=SvnRaTransport(repos_url))
+
+        self.assertEqual(("trunk", 1), walker.get_previous("anotherfile", 2))
+
+    def test_get_revision_info(self):
+        repos_url = self.make_client("a", "dc")
+        self.build_tree({'dc/trunk/afile': "data"})
+        self.client_add("dc/trunk")
+        self.client_commit("dc", "My Message")
+
+        walker = logwalker.LogWalker(TrunkBranchingScheme(), 
+                                     transport=SvnRaTransport(repos_url))
+
+        info = walker.get_revision_info(1)
+
+        self.assertEqual("", info[0])
+        self.assertEqual("My Message", info[1])
+