74
73
def determine_fileid_renames(old_tree, new_tree):
75
74
for old_file_id in old_tree:
76
75
new_file_id = new_tree.path2id(old_tree.id2path(old_file_id))
76
if old_file_id == new_file_id:
77
78
if new_file_id is not None:
78
yield old_file_id, new_file_id
79
yield new_tree.id2path(new_file_id), old_file_id, new_file_id
81
82
def upgrade_workingtree(wt, foreign_repository, new_mapping, mapping_registry,
89
90
old_revid = wt.last_revision()
90
renames = upgrade_branch(wt.branch, foreign_repository, new_mapping=new_mapping,
91
revid_renames = upgrade_branch(wt.branch, foreign_repository, new_mapping=new_mapping,
91
92
mapping_registry=mapping_registry,
92
93
allow_changes=allow_changes, verbose=verbose)
93
94
last_revid = wt.branch.last_revision()
95
if old_revid == last_revid:
98
fileid_renames = dict([(path, (old_fileid, new_fileid)) for (path, old_fileid, new_fileid) in determine_fileid_renames(wt.branch.repository.revision_tree(old_revid), wt.branch.repository.revision_tree(last_revid))])
102
# Adjust file ids in working tree
103
for path in sorted(fileid_renames.keys(), reverse=True):
105
old_fileids.append(fileid_renames[path][0])
106
new_fileids.append((path, fileid_renames[path][1]))
108
new_root_id = fileid_renames[path][1]
109
new_fileids.reverse()
110
wt.unversion(old_fileids)
111
if new_root_id is not None:
112
wt.set_root_id(new_root_id)
113
wt.add([x[0] for x in new_fileids], [x[1] for x in new_fileids])
94
114
wt.set_last_revision(last_revid)
96
# Adjust file ids in working tree
97
for (old_fileid, new_fileid) in determine_fileid_renames(wt.branch.repository.revision_tree(old_revid), wt.basis_tree()):
98
path = wt.id2path(old_fileid)
100
wt.add([path], [new_fileid])
121
def upgrade_tags(tags, repository, foreign_repository, new_mapping, mapping_registry,
122
allow_changes=False, verbose=False, branch_renames=None):
123
"""Upgrade a tags dictionary."""
124
pb = ui.ui_factory.nested_progress_bar()
126
tags_dict = tags.get_tag_dict()
127
for i, (name, revid) in enumerate(tags_dict.items()):
128
pb.update("upgrading tags", i, len(tags_dict))
129
if branch_renames is not None and revid in branch_renames:
130
renames = branch_renames
132
renames = upgrade_repository(repository, foreign_repository,
133
revision_id=revid, new_mapping=new_mapping,
134
mapping_registry=mapping_registry,
135
allow_changes=allow_changes, verbose=verbose)
137
tags.set_tag(name, renames[revid])
107
142
def upgrade_branch(branch, foreign_repository, new_mapping,
118
153
revision_id=revid, new_mapping=new_mapping,
119
154
mapping_registry=mapping_registry,
120
155
allow_changes=allow_changes, verbose=verbose)
156
upgrade_tags(branch.tags, branch.repository, foreign_repository,
157
new_mapping=new_mapping, mapping_registry=mapping_registry,
158
allow_changes=allow_changes, verbose=verbose)
121
159
if len(renames) > 0:
122
160
branch.generate_revision_history(renames[revid])
147
# Create a list of revisions that can be renamed during the upgade
185
# Create a list of revisions that can be renamed during the upgrade
148
186
for revid in revs:
149
187
assert isinstance(revid, str)
151
(foreign_revid, mapping) = mapping_registry.parse_revision_id(revid)
189
(foreign_revid, _) = mapping_registry.parse_revision_id(revid)
152
190
except InvalidRevisionId:
153
191
# Not a foreign revision, nothing to do
202
240
heads = [revision_id]
204
242
plan = generate_transpose_plan(graph.iter_ancestry(heads), upgrade_map,
206
lambda revid: create_upgraded_revid(revid, new_mapping.upgrade_suffix))
243
graph, lambda revid: create_upgraded_revid(revid, new_mapping.upgrade_suffix))
207
244
def remove_parents((oldrevid, (newrevid, parents))):
208
245
return (oldrevid, newrevid)
209
246
upgrade_map.update(dict(map(remove_parents, plan.items())))