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