~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/foreign.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2009-04-15 16:24:51 UTC
  • mfrom: (4285.3.2 dpush)
  • Revision ID: pqm@pqm.ubuntu.com-20090415162451-bmgy1sh0fgs1cv7p
(aaron,
        jelmer) Use TreeTransform to update file ids in working tree after
        dpush.

Show diffs side-by-side

added added

removed removed

Lines of Context:
28
28
    errors,
29
29
    osutils,
30
30
    registry,
 
31
    transform,
31
32
    )
32
33
""")
33
34
 
269
270
        raise NotImplementedError(self.dpull)
270
271
 
271
272
 
272
 
def _determine_fileid_renames(old_inv, new_inv):
273
 
    """Determine the file ids based on a old and a new inventory that 
274
 
    are equal in content.
275
 
 
276
 
    :param old_inv: Old inventory
277
 
    :param new_inv: New inventory
278
 
    :return: Dictionary a (old_id, new_id) tuple for each path in the 
279
 
        inventories.
280
 
    """
281
 
    ret = {}
282
 
    if len(old_inv) != len(new_inv):
283
 
        raise AssertionError("Inventories are not of the same size")
284
 
    for old_file_id in old_inv:
285
 
        path = old_inv.id2path(old_file_id)
286
 
        new_file_id = new_inv.path2id(path)
287
 
        if new_file_id is None:
288
 
            raise AssertionError(
289
 
                "Unable to find %s in new inventory" % old_file_id)
290
 
        ret[path] = (old_file_id, new_file_id)
291
 
    return ret
292
 
 
293
 
 
294
 
def update_workinginv_fileids(wt, old_inv, new_inv):
295
 
    """Update all file ids in wt according to old_tree/new_tree. 
296
 
 
297
 
    old_tree and new_tree should be two RevisionTree's that differ only
298
 
    in file ids.
299
 
    """
300
 
    fileid_renames = _determine_fileid_renames(old_inv, new_inv)
301
 
    old_fileids = []
302
 
    new_fileids = []
303
 
    new_root_id = None
304
 
    # Adjust file ids in working tree
305
 
    # Sorted, so we process parents before children
306
 
    for path in sorted(fileid_renames.keys()):
307
 
        (old_fileid, new_fileid) = fileid_renames[path]
308
 
        if path != "":
309
 
            new_fileids.append((path, new_fileid))
310
 
            # unversion() works recursively so we only have to unversion the 
311
 
            # top-level. Unfortunately unversioning / is not supported yet, 
312
 
            # so unversion its children instead and use set_root_id() for /
313
 
            if old_inv[old_fileid].parent_id == old_inv.root.file_id:
314
 
                old_fileids.append(old_fileid)
315
 
        else:
316
 
            new_root_id = new_fileid
317
 
    new_fileids.reverse()
318
 
    wt.unversion(old_fileids)
319
 
    if new_root_id is not None:
320
 
        wt.set_root_id(new_root_id)
321
 
    wt.add([x[0] for x in new_fileids], [x[1] for x in new_fileids])
322
 
    wt.set_last_revision(new_inv.revision_id)
 
273
def update_workingtree_fileids(wt, target_tree):
 
274
    """Update the file ids in a working tree based on another tree.
 
275
 
 
276
    :param wt: Working tree in which to update file ids
 
277
    :param target_tree: Tree to retrieve new file ids from, based on path
 
278
    """
 
279
    tt = transform.TreeTransform(wt)
 
280
    try:
 
281
        for f, p, c, v, d, n, k, e in target_tree.iter_changes(wt):
 
282
            if v == (True, False):
 
283
                trans_id = tt.trans_id_tree_path(p[0])
 
284
                tt.unversion_file(trans_id)
 
285
            elif v == (False, True):
 
286
                trans_id = tt.trans_id_tree_path(p[1])
 
287
                tt.version_file(f, trans_id)
 
288
        tt.apply()
 
289
    finally:
 
290
        tt.finalize()
 
291
    if len(wt.get_parent_ids()) == 1:
 
292
        wt.set_parent_trees([(target_tree.get_revision_id(), target_tree)])
 
293
    else:
 
294
        wt.set_last_revision(target_tree.get_revision_id())
323
295
 
324
296
 
325
297
class cmd_dpush(Command):
385
357
                if source_wt is not None and old_last_revid != new_last_revid:
386
358
                    source_wt.lock_write()
387
359
                    try:
388
 
                        update_workinginv_fileids(source_wt, 
389
 
                            source_wt.branch.repository.get_inventory(
390
 
                                old_last_revid),
391
 
                            source_wt.branch.repository.get_inventory(
392
 
                                new_last_revid))
 
360
                        target = source_wt.branch.repository.revision_tree(
 
361
                            new_last_revid)
 
362
                        update_workingtree_fileids(source_wt, target)
393
363
                    finally:
394
364
                        source_wt.unlock()
395
365
        finally:
396
366
            target_branch.unlock()
397
 
 
398