Rev 2672: Change file_names allocation to be done by the user, not the FileNames class. in http://people.ubuntu.com/~robertc/baz2.0/names-collection-user-specified

Robert Collins robertc at robertcollins.net
Mon Aug 6 06:47:35 BST 2007


At http://people.ubuntu.com/~robertc/baz2.0/names-collection-user-specified

------------------------------------------------------------
revno: 2672
revision-id: robertc at robertcollins.net-20070806054732-0w8j16bf4upvt2nu
parent: pqm at pqm.ubuntu.com-20070803043116-l7u1uypblmx1uxnr
committer: Robert Collins <robertc at robertcollins.net>
branch nick: names-collection-user-specified
timestamp: Mon 2007-08-06 15:47:32 +1000
message:
  Change file_names allocation to be done by the user, not the FileNames class.
modified:
  bzrlib/file_names.py           file_collection.py-20070714100753-j2zz4ahtk331k5zm-1
  bzrlib/tests/test_file_names.py test_file_collection-20070714093417-5gc9d821to85zo4t-1
=== modified file 'bzrlib/file_names.py'
--- a/bzrlib/file_names.py	2007-07-20 00:57:43 +0000
+++ b/bzrlib/file_names.py	2007-08-06 05:47:32 +0000
@@ -40,7 +40,11 @@
     The save method must be called to cause the state to be saved to the
     transport.
 
-    Finally, load is used to obtain a previously saved set.
+    The load method is used to obtain a previously saved set.
+
+    There is a cap in the _cap method which will error if more names are
+    added than the names collection can sensibly manage. Currently this
+    cap is 10000.
     """
 
     def __init__(self, transport, index_name):
@@ -50,12 +54,16 @@
         self._names = None
         self._cap = 10000
 
-    def allocate(self):
-        for number in xrange(self._cap):
-            if str(number) not in self._names:
-                self._names.add(str(number))
-                return str(number)
-        raise errors.BzrError('too many files')
+    def allocate(self, name=None):
+        """Allocate name in the names collection.
+
+        :param name: The name to allocate.
+        """
+        if name is not None:
+            if len(self._names) >= self._cap:
+                raise errors.BzrError('too many files')
+            self._names.add(name)
+            return name
 
     def initialise(self):
         """Initialise the collection."""

=== modified file 'bzrlib/tests/test_file_names.py'
--- a/bzrlib/tests/test_file_names.py	2007-07-19 03:37:17 +0000
+++ b/bzrlib/tests/test_file_names.py	2007-08-06 05:47:32 +0000
@@ -33,32 +33,36 @@
             names.save()
             self.assertEqual('', t.get_bytes(name))
         
-    def test_allocate_trivial(self):
-        t = self.get_transport()
-        names = FileNames(t, 'index')
-        names.initialise()
-        name = names.allocate()
-        self.assertEqual('0', name)
-        self.assertFalse(t.has('index'))
-        name = names.allocate()
-        self.assertEqual('1', name)
-        self.assertFalse(t.has('index'))
-
-    def test_allocate_overrun(self):
+    def test_allocate_name_does_not_error(self):
+        t = self.get_transport()
+        names = FileNames(t, 'index')
+        names.initialise()
+        names.allocate('0')
+        self.assertFalse(t.has('index'))
+
+    def test_allocate_two_names_succeeds(self):
+        t = self.get_transport()
+        names = FileNames(t, 'index')
+        names.initialise()
+        names.allocate('0')
+        names.allocate('1')
+        self.assertFalse(t.has('index'))
+
+    def test_exceeding_the_allocation_cap_errors(self):
         t = self.get_transport()
         names = FileNames(t, 'index')
         names.initialise()
         names._cap = 5
         for number in xrange(5):
-            name = names.allocate()
-        self.assertRaises(errors.BzrError, names.allocate)
+            name = names.allocate(str(number))
+        self.assertRaises(errors.BzrError, names.allocate, '6')
 
     def test_load(self):
         t = self.get_transport()
         names = FileNames(t, 'index')
         names.initialise()
-        names.allocate()
-        names.allocate()
+        names.allocate('0')
+        names.allocate('1')
         names.save()
         names = FileNames(t, 'index')
         names.load()
@@ -77,16 +81,16 @@
         t = self.get_transport()
         names = FileNames(t, 'index')
         names.initialise()
-        names.allocate()
-        names.allocate()
+        names.allocate('0')
+        names.allocate('1')
         self.assertEqual(set(['0', '1']), names.names())
 
     def test_names_on_unlistable_works(self):
         t = self.get_transport()
         names = FileNames(t, 'index')
         names.initialise()
-        names.allocate()
-        names.allocate()
+        names.allocate('0')
+        names.allocate('1')
         names.save()
         names = FileNames(
             get_transport('unlistable+' + self.get_url()), 'index')
@@ -97,7 +101,19 @@
         t = self.get_transport()
         names = FileNames(t, 'index')
         names.initialise()
-        name1 = names.allocate()
-        name2 = names.allocate()
-        names.remove(name1)
-        self.assertEqual(set([name2]), names.names())
+        names.allocate('0')
+        names.allocate('1')
+        names.remove('0')
+        self.assertEqual(set(['1']), names.names())
+
+    def test_roundtrip_hash_name(self):
+        t = self.get_transport()
+        names = FileNames(t, 'index')
+        names.initialise()
+        names.allocate('0123456789abcdef0123456789abcdef')
+        names.save()
+        names = FileNames(t, 'index')
+        names.load()
+        self.assertEqual(set(['0123456789abcdef0123456789abcdef']),
+            names.names())
+



More information about the bazaar-commits mailing list