Rev 1432: Add functions for modifying mergeinfo. in http://people.samba.org/bzr/jelmer/bzr-svn/trunk

Jelmer Vernooij jelmer at samba.org
Thu Jul 3 23:59:05 BST 2008


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

------------------------------------------------------------
revno: 1432
revision-id: jelmer at samba.org-20080703225904-8cvq81lrweryeaz6
parent: jelmer at samba.org-20080703223116-qdllxs4qgtn0pck3
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: 0.4
timestamp: Fri 2008-07-04 00:59:04 +0200
message:
  Add functions for modifying mergeinfo.
modified:
  properties.py                  util.py-20080502170127-o220e9py99vt69s6-1
  tests/test_properties.py       test_properties.py-20080703215223-t5ydp87wwi7dtyas-1
=== modified file 'properties.py'
--- a/properties.py	2008-07-03 22:31:16 +0000
+++ b/properties.py	2008-07-03 22:59:04 +0000
@@ -13,6 +13,7 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
+import bisect
 from bzrlib import urlutils
 from bzrlib.errors import BzrError
 
@@ -104,6 +105,49 @@
     return text
 
 
+def range_includes_revnum(ranges, revnum):
+    i = bisect.bisect(ranges, (revnum, revnum))
+    if i == 0:
+        return False
+    (start, end) = ranges[i-1]
+    return (start <= revnum <= end)
+
+
+def range_add_revnum(ranges, revnum):
+    item = (revnum, revnum)
+    if len(ranges) == 0:
+        ranges.append(item)
+        return ranges
+    i = bisect.bisect(ranges, item)
+    if i > 0:
+        (start, end) = ranges[i-1]
+        if (start <= revnum <= end):
+            # already there
+            return ranges
+        if end == revnum-1:
+            # Extend previous range
+            ranges[i-1] = (start, end+1)
+            return ranges
+    if i < len(ranges):
+        (start, end) = ranges[i]
+        if start-1 == revnum:
+            # Extend next range
+            ranges[i] = (start-1, end)
+            return ranges
+    ranges.insert(i, item)
+    return ranges
+
+
+def mergeinfo_includes_revision(merges, path, revnum):
+    assert path.startswith("/")
+    try:
+        ranges = merges[path]
+    except KeyError:
+        return False
+
+    return range_includes_revnum(ranges, revnum)
+
+
 PROP_EXECUTABLE = 'svn:executable'
 PROP_EXECUTABLE_VALUE = '*'
 PROP_EXTERNALS = 'svn:externals'

=== modified file 'tests/test_properties.py'
--- a/tests/test_properties.py	2008-07-03 22:31:16 +0000
+++ b/tests/test_properties.py	2008-07-03 22:59:04 +0000
@@ -106,3 +106,44 @@
         self.assertEquals("", properties.generate_mergeinfo_property({}))
 
 
+class RevnumRangeTests(TestCase):
+    def test_add_revnum_empty(self):
+        self.assertEquals([(1,1)], properties.range_add_revnum([], 1))
+
+    def test_add_revnum_before(self):
+        self.assertEquals([(2,2), (8,8)], properties.range_add_revnum([(2,2)], 8))
+
+    def test_add_revnum_included(self):
+        self.assertEquals([(1,3)], properties.range_add_revnum([(1,3)], 2))
+        
+    def test_add_revnum_after(self):
+        self.assertEquals([(1,3),(5,5)], properties.range_add_revnum([(1,3)], 5))
+
+    def test_add_revnum_extend_before(self):
+        self.assertEquals([(1,3)], properties.range_add_revnum([(2,3)], 1))
+
+    def test_add_revnum_extend_after(self):
+        self.assertEquals([(1,3)], properties.range_add_revnum([(1,2)], 3))
+
+    def test_revnum_includes_empty(self):
+        self.assertFalse(properties.range_includes_revnum([], 2))
+
+    def test_revnum_includes_oor(self):
+        self.assertFalse(properties.range_includes_revnum([(1,3), (4,5)], 10))
+
+    def test_revnum_includes_in(self):
+        self.assertTrue(properties.range_includes_revnum([(1,3), (4,5)], 2))
+
+
+class MergeInfoIncludeTests(TestCase):
+    def test_includes_individual(self):
+        self.assertTrue(properties.mergeinfo_includes_revision({"/trunk": [(1,1)]}, "/trunk", 1))
+
+    def test_includes_range(self):
+        self.assertTrue(properties.mergeinfo_includes_revision({"/trunk": [(1,5)]}, "/trunk", 3))
+
+    def test_includes_invalid_path(self):
+        self.assertFalse(properties.mergeinfo_includes_revision({"/somepath": [(1,5)]}, "/trunk", 3))
+
+    def test_includes_invalid_revnum(self):
+        self.assertFalse(properties.mergeinfo_includes_revision({"/trunk": [(1,5)]}, "/trunk", 30))




More information about the bazaar-commits mailing list