~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/workingtree.py

  • Committer: Martin Pool
  • Date: 2011-06-19 02:24:39 UTC
  • mfrom: (5985 +trunk)
  • mto: This revision was merged to the branch mainline in revision 6001.
  • Revision ID: mbp@canonical.com-20110619022439-u68683yb2bw302x0
resolve conflicts against trunk

Show diffs side-by-side

added added

removed removed

Lines of Context:
973
973
        file and change the file_id. That is the normal mode. Second, it can
974
974
        only change the file_id without touching any physical file.
975
975
 
976
 
        rename_one uses the second mode if 'after == True' and 'to_rel' is not
977
 
        versioned but present in the working tree.
 
976
        rename_one uses the second mode if 'after == True' and 'to_rel' is
 
977
        either not versioned or newly added, and present in the working tree.
978
978
 
979
979
        rename_one uses the second mode if 'after == False' and 'from_rel' is
980
980
        versioned but no longer in the working tree, and 'to_rel' is not
1385
1385
    def revert(self, filenames=None, old_tree=None, backups=True,
1386
1386
               pb=None, report_changes=False):
1387
1387
        from bzrlib.conflicts import resolve
1388
 
        if filenames == []:
1389
 
            filenames = None
1390
 
            symbol_versioning.warn('Using [] to revert all files is deprecated'
1391
 
                ' as of bzr 0.91.  Please use None (the default) instead.',
1392
 
                DeprecationWarning, stacklevel=2)
1393
1388
        if old_tree is None:
1394
1389
            basis_tree = self.basis_tree()
1395
1390
            basis_tree.lock_read()
2571
2566
        inventory. The second mode only updates the inventory without
2572
2567
        touching the file on the filesystem.
2573
2568
 
2574
 
        move uses the second mode if 'after == True' and the target is not
2575
 
        versioned but present in the working tree.
 
2569
        move uses the second mode if 'after == True' and the target is
 
2570
        either not versioned or newly added, and present in the working tree.
2576
2571
 
2577
2572
        move uses the second mode if 'after == False' and the source is
2578
2573
        versioned but no longer in the working tree, and the target is not
2725
2720
 
2726
2721
    class _RenameEntry(object):
2727
2722
        def __init__(self, from_rel, from_id, from_tail, from_parent_id,
2728
 
                     to_rel, to_tail, to_parent_id, only_change_inv=False):
 
2723
                     to_rel, to_tail, to_parent_id, only_change_inv=False,
 
2724
                     change_id=False):
2729
2725
            self.from_rel = from_rel
2730
2726
            self.from_id = from_id
2731
2727
            self.from_tail = from_tail
2733
2729
            self.to_rel = to_rel
2734
2730
            self.to_tail = to_tail
2735
2731
            self.to_parent_id = to_parent_id
 
2732
            self.change_id = change_id
2736
2733
            self.only_change_inv = only_change_inv
2737
2734
 
2738
2735
    def _determine_mv_mode(self, rename_entries, after=False):
2750
2747
            to_rel = rename_entry.to_rel
2751
2748
            to_id = inv.path2id(to_rel)
2752
2749
            only_change_inv = False
 
2750
            change_id = False
2753
2751
 
2754
2752
            # check the inventory for source and destination
2755
2753
            if from_id is None:
2756
2754
                raise errors.BzrMoveFailedError(from_rel,to_rel,
2757
2755
                    errors.NotVersionedError(path=from_rel))
2758
2756
            if to_id is not None:
2759
 
                raise errors.BzrMoveFailedError(from_rel,to_rel,
2760
 
                    errors.AlreadyVersionedError(path=to_rel))
 
2757
                allowed = False
 
2758
                # allow it with --after but only if dest is newly added
 
2759
                if after:
 
2760
                    basis = self.basis_tree()
 
2761
                    basis.lock_read()
 
2762
                    try:
 
2763
                        if not basis.has_id(to_id):
 
2764
                            rename_entry.change_id = True
 
2765
                            allowed = True
 
2766
                    finally:
 
2767
                        basis.unlock()
 
2768
                if not allowed:
 
2769
                    raise errors.BzrMoveFailedError(from_rel,to_rel,
 
2770
                        errors.AlreadyVersionedError(path=to_rel))
2761
2771
 
2762
2772
            # try to determine the mode for rename (only change inv or change
2763
2773
            # inv and file system)
2834
2844
            except OSError, e:
2835
2845
                raise errors.BzrMoveFailedError(entry.from_rel,
2836
2846
                    entry.to_rel, e[1])
 
2847
        if entry.change_id:
 
2848
            to_id = inv.path2id(entry.to_rel)
 
2849
            inv.remove_recursive_id(to_id)
2837
2850
        inv.rename(entry.from_id, entry.to_parent_id, entry.to_tail)
2838
2851
 
2839
2852
    @needs_tree_write_lock