Rev 372: Fix annoying bug in file id assignment code. "bzr status" works again in http://people.samba.org/bzr/jelmer/bzr-svn/bzr.dev

Jelmer Vernooij jelmer at samba.org
Wed Jan 3 11:20:09 GMT 2007


------------------------------------------------------------
revno: 372
revision-id: jelmer at samba.org-20070103111926-pxiao209rh4rw3x9
parent: jelmer at samba.org-20070103104612-w2honujsz10jww2s
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: main
timestamp: Wed 2007-01-03 12:19:26 +0100
message:
  Fix annoying bug in file id assignment code. "bzr status" works again 
  now on my Samba checkouts.
modified:
  fileids.py                     fileids.py-20060714013623-u5iiyqqnko11grcf-1
  repository.py                  repository.py-20060306123302-1f8c5069b3fe0265
  tests/test_fileids.py          test_fileids.py-20060622131341-19gyrlgqy8yl2od5-1
=== modified file 'fileids.py'
--- a/fileids.py	2007-01-03 10:46:12 +0000
+++ b/fileids.py	2007-01-03 11:19:26 +0000
@@ -1,4 +1,4 @@
-# Copyright (C) 2006 Jelmer Vernooij <jelmer at samba.org>
+# Copyright (C) 2006-2007 Jelmer Vernooij <jelmer at samba.org>
 
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -170,47 +170,48 @@
         
         pb = ui_factory.nested_progress_bar()
 
-        i = 1
-        for (revid, global_changes) in todo:
-            changes = get_local_changes(global_changes, self.repos.scheme,
-                                        uuid, self.repos._log.find_children)
-            pb.update('generating file id map', i, len(todo))
-
-            def find_children(path, revid):
-                (bp, revnum) = self.repos.parse_revision_id(revid)
-                for p in self.repos._log.find_children(bp+"/"+path, revnum):
-                    yield self.repos.scheme.unprefix(p)[1]
-
-            parent_revs = next_parent_revs
-
-            renames = renames_cb(revid)
-
-            def new_file_id(x):
-                if renames.has_key(x):
-                    return renames[x]
-                return generate_file_id(revid, x)
-            
-            revmap = self._apply_changes(new_file_id, changes, find_children)
-            for p in changes:
-                if changes[p][0] == 'M':
-                    revmap[p] = map[p][0]
-
-            map.update(dict([(x, (revmap[x], revid)) for x in revmap]))
-
-            # Mark all parent paths as changed
-            for p in revmap:
-                parts = p.split("/")
-                for j in range(1, len(parts)+1):
-                    parent = "/".join(parts[0:len(parts)-j])
-                    assert map.has_key(parent), "Parent item %s of %s doesn't exist in map" % (parent, p)
-                    if map[parent][1] == revid:
-                        break
-                    map[parent] = map[parent][0], revid
-                    
-            next_parent_revs = [revid]
-            i += 1
-
-        pb.finished()
+        try:
+            i = 1
+            for (revid, global_changes) in todo:
+                changes = get_local_changes(global_changes, self.repos.scheme,
+                                            uuid, self.repos._log.find_children)
+                pb.update('generating file id map', i, len(todo))
+
+                def find_children(path, revid):
+                    (bp, revnum) = self.repos.parse_revision_id(revid)
+                    for p in self.repos._log.find_children(bp+"/"+path, revnum):
+                        yield self.repos.scheme.unprefix(p)[1]
+
+                parent_revs = next_parent_revs
+
+                renames = renames_cb(revid)
+
+                def new_file_id(x):
+                    if renames.has_key(x):
+                        return renames[x]
+                    return generate_file_id(revid, x)
+                
+                revmap = self._apply_changes(new_file_id, changes, find_children)
+                for p in changes:
+                    if changes[p][0] == 'M' and not revmap.has_key(p):
+                        revmap[p] = map[p][0]
+
+                map.update(dict([(x, (revmap[x], revid)) for x in revmap]))
+
+                # Mark all parent paths as changed
+                for p in revmap:
+                    parts = p.split("/")
+                    for j in range(1, len(parts)+1):
+                        parent = "/".join(parts[0:len(parts)-j])
+                        assert map.has_key(parent), "Parent item %s of %s doesn't exist in map" % (parent, p)
+                        if map[parent][1] == revid:
+                            break
+                        map[parent] = map[parent][0], revid
+                        
+                next_parent_revs = [revid]
+                i += 1
+        finally:
+            pb.finished()
         self.save(revid, parent_revs, map)
         return map
 
@@ -232,7 +233,7 @@
                     if find_children is not None:
                         for c in find_children(data[1], data[2]):
                             path = c.replace(data[1], p+"/", 1).replace("//", "/")
-                            map[path] = new_file_id(c)
+                            map[path] = new_file_id(path)
                             mutter('added mapping %r -> %r' % (path, map[path]))
 
         return map

=== modified file 'repository.py'
--- a/repository.py	2007-01-02 17:31:01 +0000
+++ b/repository.py	2007-01-03 11:19:26 +0000
@@ -261,8 +261,9 @@
 
         (bp, rp) = self.scheme.unprefix(path)
 
+        map = self.get_fileid_map(revnum, bp)
         try:
-            return self.get_fileid_map(revnum, bp)[rp]
+            return map[rp]
         except KeyError:
             raise NoSuchFile(path=rp)
 

=== modified file 'tests/test_fileids.py'
--- a/tests/test_fileids.py	2007-01-03 05:24:19 +0000
+++ b/tests/test_fileids.py	2007-01-03 11:19:26 +0000
@@ -300,3 +300,39 @@
         self.build_tree({"dc/trunk/file": 'otherdata'})
         self.client_commit("dc", "Msg")
         self.assertEqual({"": (ROOT_ID, "svn-v%d:3@%s-trunk" % (MAPPING_VERSION, self.repos.uuid)), "bar": (generate_svn_file_id(self.repos.uuid, 2, "trunk", "bar"), "svn-v%d:2@%s-trunk" % (MAPPING_VERSION, self.repos.uuid)), "file": (generate_svn_file_id(self.repos.uuid, 2, "trunk", "file"), "svn-v%d:3@%s-trunk" % (MAPPING_VERSION, self.repos.uuid))}, self.repos.get_fileid_map(3, "trunk"))
+
+    def test_copy(self):
+        self.repos.set_branching_scheme(TrunkBranchingScheme())
+        self.build_tree({"dc/trunk": None})
+        self.client_add("dc/trunk")
+        self.client_commit("dc", "Msg")
+        self.build_tree({"dc/trunk/file": 'data'})
+        self.client_add("dc/trunk/file")
+        self.client_commit("dc", "Msg")
+        self.client_copy("dc/trunk/file", "dc/trunk/bar")
+        self.client_commit("dc", "Msg")
+        self.assertEqual({"": (ROOT_ID, "svn-v%d:3@%s-trunk" % (MAPPING_VERSION, self.repos.uuid)), "bar": (generate_svn_file_id(self.repos.uuid, 3, "trunk", "bar"), "svn-v%d:3@%s-trunk" % (MAPPING_VERSION, self.repos.uuid)), "file": (generate_svn_file_id(self.repos.uuid, 2, "trunk", "file"), "svn-v%d:2@%s-trunk" % (MAPPING_VERSION, self.repos.uuid))}, self.repos.get_fileid_map(3, "trunk"))
+
+    def test_copy_nested_modified(self):
+        self.repos.set_branching_scheme(TrunkBranchingScheme())
+        self.build_tree({"dc/trunk": None})
+        self.client_add("dc/trunk")
+        self.client_commit("dc", "Msg")
+        self.build_tree({"dc/trunk/dir/file": 'data'})
+        self.client_add("dc/trunk/dir")
+        self.client_commit("dc", "Msg")
+        self.client_copy("dc/trunk/dir", "dc/trunk/bar")
+        self.build_tree({"dc/trunk/bar/file": "data2"})
+        self.client_commit("dc", "Msg")
+        self.assertEqual({
+          "": (ROOT_ID, 
+            "svn-v%d:3@%s-trunk" % (MAPPING_VERSION, self.repos.uuid)), 
+          "dir": (generate_svn_file_id(self.repos.uuid, 2, "trunk", "dir"), 
+               "svn-v%d:2@%s-trunk" % (MAPPING_VERSION, self.repos.uuid)), 
+          "dir/file": (generate_svn_file_id(self.repos.uuid, 2, "trunk", "dir/file"), 
+            "svn-v%d:2@%s-trunk" % (MAPPING_VERSION, self.repos.uuid)), 
+          "bar": (generate_svn_file_id(self.repos.uuid, 3, "trunk", "bar"), 
+               "svn-v%d:3@%s-trunk" % (MAPPING_VERSION, self.repos.uuid)), 
+          "bar/file": (generate_svn_file_id(self.repos.uuid, 3, "trunk", "bar/file"), 
+               "svn-v%d:3@%s-trunk" % (MAPPING_VERSION, self.repos.uuid))}, 
+            self.repos.get_fileid_map(3, "trunk"))




More information about the bazaar-commits mailing list