/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to upgrade.py

  • Committer: Jelmer Vernooij
  • Date: 2008-11-10 16:14:20 UTC
  • mto: (0.219.2 trunk)
  • mto: This revision was merged to the branch mainline in revision 6960.
  • Revision ID: jelmer@samba.org-20081110161420-bax1raw5jkm1p67h
Import fixes from bzr-svn.

Show diffs side-by-side

added added

removed removed

Lines of Context:
22
22
 
23
23
import itertools
24
24
 
25
 
 
26
25
class RebaseNotPresent(DependencyNotPresent):
27
26
    _fmt = "Unable to import bzr-rebase (required for upgrade support): %(error)s"
28
27
 
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
            continue
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
79
80
 
80
81
 
81
82
def upgrade_workingtree(wt, foreign_repository, new_mapping, mapping_registry, 
87
88
    wt.lock_write()
88
89
    try:
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:
 
96
            return revid_renames
 
97
 
 
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))])
 
99
        old_fileids = []
 
100
        new_fileids = []
 
101
        new_root_id = None
 
102
        # Adjust file ids in working tree
 
103
        for path in sorted(fileid_renames.keys(), reverse=True):
 
104
            if path != "":
 
105
                old_fileids.append(fileid_renames[path][0])
 
106
                new_fileids.append((path, fileid_renames[path][1]))
 
107
            else:
 
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)
95
 
 
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)
99
 
            wt.remove(path)
100
 
            wt.add([path], [new_fileid])
101
115
    finally:
102
116
        wt.unlock()
103
117
 
104
 
    return renames
 
118
    return revid_renames
 
119
 
 
120
 
 
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()
 
125
    try:
 
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
 
131
            else:
 
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)
 
136
            if revid in renames:
 
137
                tags.set_tag(name, renames[revid])
 
138
    finally:
 
139
        pb.finished()
105
140
 
106
141
 
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])
123
161
    return renames
144
182
             dictionary.
145
183
    """
146
184
    rename_map = {}
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)
150
188
        try:
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
154
192
            continue
202
240
        heads = [revision_id]
203
241
 
204
242
    plan = generate_transpose_plan(graph.iter_ancestry(heads), upgrade_map, 
205
 
      graph,
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())))