At http://people.samba.org/bzr/jelmer/bzr-svn/0.5
------------------------------------------------------------ revno: 2318 revision-id: [email protected] parent: [email protected] committer: Jelmer Vernooij <[email protected]> branch nick: 0.5 timestamp: Sat 2009-01-17 00:21:38 +0100 message: Simplify file id handling. modified: fileids.py fileids.py-20060714013623-u5iiyqqnko11grcf-1 === modified file 'fileids.py' --- a/fileids.py 2009-01-16 22:37:58 +0000 +++ b/fileids.py 2009-01-16 23:21:38 +0000 @@ -32,6 +32,36 @@ iter_with_mapping, ) + +def apply_idmap_delta(map, revid, delta, changes): + """Update a file id map. + + :param map: Existing file id map. + :param revid: Revision id of the id map + :param delta: Id map for just the delta + :param changes: Changes in revid. + """ + for p in changes: + inv_p = p.decode("utf-8") + if changes[p][0] == 'M' and not delta.has_key(p): + delta[inv_p] = map[inv_p][0] + + for x in sorted(delta.keys(), reverse=True): + assert isinstance(x, unicode) + if delta[x] is None: + del map[x] + for p in map.keys(): + if p.startswith(u"%s/" % x): + del map[p] + + for x in sorted(delta.keys()): + if (delta[x] is not None and + # special case - we change metadata in svn at the branch root path + # but that's not reflected as a bzr metadata change in bzr + (x != "" or not "" in map or map[x][1] == NULL_REVISION)): + map[x] = (str(delta[x]), revid) + + def get_local_changes(paths, branch, mapping, layout, generate_revid, get_children=None): """Obtain all of the changes relative to a particular path @@ -121,11 +151,6 @@ self.apply_changes_fn = apply_changes_fn self.repos = repos - def _use_text_revids(self, mapping, revmeta, map): - for path, revid in revmeta.get_text_revisions(mapping).iteritems(): - assert path in map - map[path] = (map[path][0], revid) - def get_idmap_delta(self, revmeta, mapping, find_children=None): """Change file id map to incorporate specified changes. @@ -151,6 +176,14 @@ idmap.update(revmeta.get_fileid_map(mapping)) return (idmap, changes) + def update_idmap(self, map, revmeta, mapping, find_children=None): + (idmap, changes) = self.get_idmap_delta(revmeta, + mapping, find_children) + apply_idmap_delta(map, revmeta.get_revision_id(mapping), idmap, changes) + for path, revid in revmeta.get_text_revisions(mapping).iteritems(): + assert path in map + map[path] = (map[path][0], revid) + def get_map(self, foreign_revid, mapping): """Make sure the map is up to date until revnum.""" (uuid, branch, revnum) = foreign_revid @@ -178,44 +211,13 @@ if revmeta.is_hidden(mapping): continue revid = revmeta.get_revision_id(mapping) - (idmap, changes) = self.get_idmap_delta(revmeta, - mapping, self.repos.find_children) - self.update_map(map, revid, idmap, changes) - self._use_text_revids(mapping, revmeta, map) + self.update_idmap(map, revmeta, mapping, self.repos.find_children) parent_revs = next_parent_revs next_parent_revs = [revid] finally: pb.finished() return map - def update_map(self, map, revid, delta, changes): - """Update a file id map. - - :param map: Existing file id map. - :param revid: Revision id of the id map - :param delta: Id map for just the delta - :param changes: Changes in revid. - """ - for p in changes: - inv_p = p.decode("utf-8") - if changes[p][0] == 'M' and not delta.has_key(p): - delta[inv_p] = map[inv_p][0] - - for x in sorted(delta.keys(), reverse=True): - assert isinstance(x, unicode) - if delta[x] is None: - del map[x] - for p in map.keys(): - if p.startswith(u"%s/" % x): - del map[p] - - for x in sorted(delta.keys()): - if (delta[x] is not None and - # special case - we change metadata in svn at the branch root path - # but that's not reflected as a bzr metadata change in bzr - (x != "" or not "" in map or map[x][1] == NULL_REVISION)): - map[x] = (str(delta[x]), revid) - class FileIdMapCache(object): @@ -250,9 +252,8 @@ def __init__(self, cache_transport, actual): self.cache = FileIdMapCache(cache_transport) self.actual = actual - self.apply_changes = actual.apply_changes - self._use_text_revids = actual._use_text_revids self.repos = actual.repos + self.get_idmap_delta = actual.get_idmap_delta def get_map(self, (uuid, branch, revnum), mapping): """Make sure the map is up to date until revnum.""" @@ -297,15 +298,8 @@ for i, (revmeta, mapping) in enumerate(reversed(todo)): pb.update('generating file id map', i, len(todo)) revid = revmeta.get_revision_id(mapping) - - (idmap, changes) = self.actual.get_idmap_delta( - revmeta, mapping, self.repos.find_children) - - self.actual.update_map(map, revid, idmap, changes) - self._use_text_revids(mapping, revmeta, map) - + self.actual.update_idmap(map, revmeta, mapping, self.repos.find_children) parent_revs = next_parent_revs - self.cache.save(revid, parent_revs, map) next_parent_revs = [revid] finally: -- bazaar-commits mailing list [email protected] https://lists.ubuntu.com/mailman/listinfo/bazaar-commits
