No subject


Mon Mar 16 18:30:53 GMT 2009


Chatting to Robert on IRC, the plan for merging brisbane-core
is to put up a series of bite-sized patches. Merge won't let me
cherrypick files so here's how I'm doing it ...

cd brisbane-core
bzr diff -rancestor:../bzr.dev x1 x2 x3 > ../bris-diffs/x.diff
cd ..
bzr branch bzr.dev bzr.bris-x
cd bzr.bris-x
bzr patch ../bris-diffs/x.diff
(review patch)
(run tests)
bzr send ...

Is there a better way? Do we care about retaining file-ids
for files added to the brisbane-core branch?

Ian C.

--------------070107020603070105090405
Content-Type: text/x-diff;
 name="bris-vf.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="bris-vf.patch"

# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: ian.clatworthy at canonical.com-20090403005329-\
#   gd1a2lc61w8pikc0
# target_branch: http://people.ubuntu.com/~ianc/bzr/ianc-integration
# testament_sha1: 6b4ae4460b9ae3e311d11624d91c6299e8dfa7ea
# timestamp: 2009-04-03 10:53:48 +1000
# base_revision_id: pqm at pqm.ubuntu.com-20090402163502-ryn8zr2giilw5bki
# 
# Begin patch
=== modified file 'bzrlib/knit.py'
--- bzrlib/knit.py	2009-03-25 02:03:41 +0000
+++ bzrlib/knit.py	2009-04-03 00:53:29 +0000
@@ -955,9 +955,13 @@
                 lines[-1] = lines[-1] + '\n'
                 line_bytes += '\n'
 
-        for element in key:
+        for element in key[:-1]:
             if type(element) != str:
                 raise TypeError("key contains non-strings: %r" % (key,))
+        if key[-1] is None:
+            key = key[:-1] + ('sha1:' + digest,)
+        elif type(key[-1]) != str:
+                raise TypeError("key contains non-strings: %r" % (key,))
         # Knit hunks are still last-element only
         version_id = key[-1]
         content = self._factory.make(lines, version_id)
@@ -1022,9 +1026,10 @@
     def _check_add(self, key, lines, random_id, check_content):
         """check that version_id and lines are safe to add."""
         version_id = key[-1]
-        if contains_whitespace(version_id):
-            raise InvalidRevisionId(version_id, self)
-        self.check_not_reserved_id(version_id)
+        if version_id is not None:
+            if contains_whitespace(version_id):
+                raise InvalidRevisionId(version_id, self)
+            self.check_not_reserved_id(version_id)
         # TODO: If random_id==False and the key is already present, we should
         # probably check that the existing content is identical to what is
         # being inserted, and otherwise raise an exception.  This would make

=== modified file 'bzrlib/tests/test_versionedfile.py'
--- bzrlib/tests/test_versionedfile.py	2009-03-24 01:53:42 +0000
+++ bzrlib/tests/test_versionedfile.py	2009-04-03 00:53:29 +0000
@@ -24,9 +24,9 @@
 from itertools import chain, izip
 from StringIO import StringIO
 
-import bzrlib
 from bzrlib import (
     errors,
+    knit as _mod_knit,
     osutils,
     progress,
     )
@@ -35,7 +35,6 @@
                            RevisionAlreadyPresent,
                            WeaveParentMismatch
                            )
-from bzrlib import knit as _mod_knit
 from bzrlib.knit import (
     cleanup_pack_knit,
     make_file_factory,
@@ -179,7 +178,7 @@
 
 
 def get_diamond_files(files, key_length, trailing_eol=True, left_only=False,
-    nograph=False):
+    nograph=False, nokeys=False):
     """Get a diamond graph to exercise deltas and merges.
 
     This creates a 5-node graph in files. If files supports 2-length keys two
@@ -192,8 +191,12 @@
     :param nograph: If True, do not provide parents to the add_lines calls;
         this is useful for tests that need inserted data but have graphless
         stores.
+    :param nokeys: If True, pass None is as the key for all insertions.
+        Currently implies nograph.
     :return: The results of the add_lines calls.
     """
+    if nokeys:
+        nograph = True
     if key_length == 1:
         prefixes = [()]
     else:
@@ -210,25 +213,30 @@
         else:
             result = [prefix + suffix for suffix in suffix_list]
             return result
+    def get_key(suffix):
+        if nokeys:
+            return (None, )
+        else:
+            return (suffix,)
     # we loop over each key because that spreads the inserts across prefixes,
     # which is how commit operates.
     for prefix in prefixes:
-        result.append(files.add_lines(prefix + ('origin',), (),
+        result.append(files.add_lines(prefix + get_key('origin'), (),
             ['origin' + last_char]))
     for prefix in prefixes:
-        result.append(files.add_lines(prefix + ('base',),
+        result.append(files.add_lines(prefix + get_key('base'),
             get_parents([('origin',)]), ['base' + last_char]))
     for prefix in prefixes:
-        result.append(files.add_lines(prefix + ('left',),
+        result.append(files.add_lines(prefix + get_key('left'),
             get_parents([('base',)]),
             ['base\n', 'left' + last_char]))
     if not left_only:
         for prefix in prefixes:
-            result.append(files.add_lines(prefix + ('right',),
+            result.append(files.add_lines(prefix + get_key('right'),
                 get_parents([('base',)]),
                 ['base\n', 'right' + last_char]))
         for prefix in prefixes:
-            result.append(files.add_lines(prefix + ('merged',),
+            result.append(files.add_lines(prefix + get_key('merged'),
                 get_parents([('left',), ('right',)]),
                 ['base\n', 'left\n', 'right\n', 'merged' + last_char]))
     return result
@@ -1487,10 +1495,11 @@
         """Each parameterised test can be constructed on a transport."""
         files = self.get_versionedfiles()
 
-    def get_diamond_files(self, files, trailing_eol=True, left_only=False):
+    def get_diamond_files(self, files, trailing_eol=True, left_only=False,
+        nokeys=False):
         return get_diamond_files(files, self.key_length,
             trailing_eol=trailing_eol, nograph=not self.graph,
-            left_only=left_only)
+            left_only=left_only, nokeys=nokeys)
 
     def test_add_lines_nostoresha(self):
         """When nostore_sha is supplied using old content raises."""
@@ -1544,6 +1553,60 @@
                 ('ed8bce375198ea62444dc71952b22cfc2b09226d', 23)],
                 results)
 
+    def test_add_lines_no_key_generates_chk_key(self):
+        files = self.get_versionedfiles()
+        # save code by using the stock data insertion helper.
+        adds = self.get_diamond_files(files, nokeys=True)
+        results = []
+        # We can only validate the first 2 elements returned from add_lines.
+        for add in adds:
+            self.assertEqual(3, len(add))
+            results.append(add[:2])
+        if self.key_length == 1:
+            self.assertEqual([
+                ('00e364d235126be43292ab09cb4686cf703ddc17', 7),
+                ('51c64a6f4fc375daf0d24aafbabe4d91b6f4bb44', 5),
+                ('a8478686da38e370e32e42e8a0c220e33ee9132f', 10),
+                ('9ef09dfa9d86780bdec9219a22560c6ece8e0ef1', 11),
+                ('ed8bce375198ea62444dc71952b22cfc2b09226d', 23)],
+                results)
+            # Check the added items got CHK keys.
+            self.assertEqual(set([
+                ('sha1:00e364d235126be43292ab09cb4686cf703ddc17',),
+                ('sha1:51c64a6f4fc375daf0d24aafbabe4d91b6f4bb44',),
+                ('sha1:9ef09dfa9d86780bdec9219a22560c6ece8e0ef1',),
+                ('sha1:a8478686da38e370e32e42e8a0c220e33ee9132f',),
+                ('sha1:ed8bce375198ea62444dc71952b22cfc2b09226d',),
+                ]),
+                files.keys())
+        elif self.key_length == 2:
+            self.assertEqual([
+                ('00e364d235126be43292ab09cb4686cf703ddc17', 7),
+                ('00e364d235126be43292ab09cb4686cf703ddc17', 7),
+                ('51c64a6f4fc375daf0d24aafbabe4d91b6f4bb44', 5),
+                ('51c64a6f4fc375daf0d24aafbabe4d91b6f4bb44', 5),
+                ('a8478686da38e370e32e42e8a0c220e33ee9132f', 10),
+                ('a8478686da38e370e32e42e8a0c220e33ee9132f', 10),
+                ('9ef09dfa9d86780bdec9219a22560c6ece8e0ef1', 11),
+                ('9ef09dfa9d86780bdec9219a22560c6ece8e0ef1', 11),
+                ('ed8bce375198ea62444dc71952b22cfc2b09226d', 23),
+                ('ed8bce375198ea62444dc71952b22cfc2b09226d', 23)],
+                results)
+            # Check the added items got CHK keys.
+            self.assertEqual(set([
+                ('FileA', 'sha1:00e364d235126be43292ab09cb4686cf703ddc17'),
+                ('FileA', 'sha1:51c64a6f4fc375daf0d24aafbabe4d91b6f4bb44'),
+                ('FileA', 'sha1:9ef09dfa9d86780bdec9219a22560c6ece8e0ef1'),
+                ('FileA', 'sha1:a8478686da38e370e32e42e8a0c220e33ee9132f'),
+                ('FileA', 'sha1:ed8bce375198ea62444dc71952b22cfc2b09226d'),
+                ('FileB', 'sha1:00e364d235126be43292ab09cb4686cf703ddc17'),
+                ('FileB', 'sha1:51c64a6f4fc375daf0d24aafbabe4d91b6f4bb44'),
+                ('FileB', 'sha1:9ef09dfa9d86780bdec9219a22560c6ece8e0ef1'),
+                ('FileB', 'sha1:a8478686da38e370e32e42e8a0c220e33ee9132f'),
+                ('FileB', 'sha1:ed8bce375198ea62444dc71952b22cfc2b09226d'),
+                ]),
+                files.keys())
+
     def test_empty_lines(self):
         """Empty files can be stored."""
         f = self.get_versionedfiles()
@@ -1591,8 +1654,9 @@
         for factory in entries:
             on_seen(factory.key)
             self.assertValidStorageKind(factory.storage_kind)
-            self.assertEqual(f.get_sha1s([factory.key])[factory.key],
-                factory.sha1)
+            if factory.sha1 is not None:
+                self.assertEqual(f.get_sha1s([factory.key])[factory.key],
+                    factory.sha1)
             self.assertEqual(parents[factory.key], factory.parents)
             self.assertIsInstance(factory.get_bytes_as(factory.storage_kind),
                 str)
@@ -1735,8 +1799,9 @@
         for factory in entries:
             seen.add(factory.key)
             self.assertValidStorageKind(factory.storage_kind)
-            self.assertEqual(files.get_sha1s([factory.key])[factory.key],
-                factory.sha1)
+            if factory.sha1 is not None:
+                self.assertEqual(files.get_sha1s([factory.key])[factory.key],
+                                 factory.sha1)
             self.assertEqual(parent_map[factory.key], factory.parents)
             # currently no stream emits mpdiff
             self.assertRaises(errors.UnavailableRepresentation,
@@ -1940,8 +2005,9 @@
                 self.assertEqual(None, factory.parents)
             else:
                 self.assertValidStorageKind(factory.storage_kind)
-                self.assertEqual(files.get_sha1s([factory.key])[factory.key],
-                    factory.sha1)
+                if factory.sha1 is not None:
+                    sha1 = files.get_sha1s([factory.key])[factory.key]
+                    self.assertEqual(sha1, factory.sha1)
                 self.assertEqual(parents[factory.key], factory.parents)
                 self.assertIsInstance(factory.get_bytes_as(factory.storage_kind),
                     str)

=== modified file 'bzrlib/versionedfile.py'
--- bzrlib/versionedfile.py	2009-03-23 14:59:43 +0000
+++ bzrlib/versionedfile.py	2009-04-03 00:53:29 +0000
@@ -794,7 +794,8 @@
         check_content=True):
         """Add a text to the store.
 
-        :param key: The key tuple of the text to add.
+        :param key: The key tuple of the text to add. If the last element is
+            None, a CHK string will be generated during the addition.
         :param parents: The parents key tuples of the text to add.
         :param lines: A list of lines. Each line must be a bytestring. And all
             of them except the last must be terminated with \n and contain no

=== modified file 'bzrlib/weave.py'
--- bzrlib/weave.py	2009-03-24 01:53:42 +0000
+++ bzrlib/weave.py	2009-04-03 00:53:29 +0000
@@ -410,6 +410,7 @@
         version_id
             Symbolic name for this version.
             (Typically the revision-id of the revision that added it.)
+            If None, a name will be allocated based on the hash. (sha1:SHAHASH)
 
         parents
             List or set of direct parent version numbers.
@@ -425,6 +426,8 @@
             sha1 = sha_strings(lines)
         if sha1 == nostore_sha:
             raise errors.ExistingContent
+        if version_id is None:
+            version_id = "sha1:" + sha1
         if version_id in self._name_map:
             return self._check_repeated_add(version_id, parents, lines, sha1)
 

# Begin bundle
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

--------------070107020603070105090405--



More information about the bazaar mailing list