~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/workingtree.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2011-06-16 07:51:28 UTC
  • mfrom: (5911.1.7 mv_after_with_dest_added)
  • Revision ID: pqm@pqm.ubuntu.com-20110616075128-g8hdusp4sr0bwipz
(spiv) "bzr mv --after old_name new_name" now works if new_name is newly
 added. (Benoit PIERRE)

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
2568
2568
        inventory. The second mode only updates the inventory without
2569
2569
        touching the file on the filesystem.
2570
2570
 
2571
 
        move uses the second mode if 'after == True' and the target is not
2572
 
        versioned but present in the working tree.
 
2571
        move uses the second mode if 'after == True' and the target is
 
2572
        either not versioned or newly added, and present in the working tree.
2573
2573
 
2574
2574
        move uses the second mode if 'after == False' and the source is
2575
2575
        versioned but no longer in the working tree, and the target is not
2722
2722
 
2723
2723
    class _RenameEntry(object):
2724
2724
        def __init__(self, from_rel, from_id, from_tail, from_parent_id,
2725
 
                     to_rel, to_tail, to_parent_id, only_change_inv=False):
 
2725
                     to_rel, to_tail, to_parent_id, only_change_inv=False,
 
2726
                     change_id=False):
2726
2727
            self.from_rel = from_rel
2727
2728
            self.from_id = from_id
2728
2729
            self.from_tail = from_tail
2730
2731
            self.to_rel = to_rel
2731
2732
            self.to_tail = to_tail
2732
2733
            self.to_parent_id = to_parent_id
 
2734
            self.change_id = change_id
2733
2735
            self.only_change_inv = only_change_inv
2734
2736
 
2735
2737
    def _determine_mv_mode(self, rename_entries, after=False):
2747
2749
            to_rel = rename_entry.to_rel
2748
2750
            to_id = inv.path2id(to_rel)
2749
2751
            only_change_inv = False
 
2752
            change_id = False
2750
2753
 
2751
2754
            # check the inventory for source and destination
2752
2755
            if from_id is None:
2753
2756
                raise errors.BzrMoveFailedError(from_rel,to_rel,
2754
2757
                    errors.NotVersionedError(path=from_rel))
2755
2758
            if to_id is not None:
2756
 
                raise errors.BzrMoveFailedError(from_rel,to_rel,
2757
 
                    errors.AlreadyVersionedError(path=to_rel))
 
2759
                allowed = False
 
2760
                # allow it with --after but only if dest is newly added
 
2761
                if after:
 
2762
                    basis = self.basis_tree()
 
2763
                    basis.lock_read()
 
2764
                    try:
 
2765
                        if not basis.has_id(to_id):
 
2766
                            rename_entry.change_id = True
 
2767
                            allowed = True
 
2768
                    finally:
 
2769
                        basis.unlock()
 
2770
                if not allowed:
 
2771
                    raise errors.BzrMoveFailedError(from_rel,to_rel,
 
2772
                        errors.AlreadyVersionedError(path=to_rel))
2758
2773
 
2759
2774
            # try to determine the mode for rename (only change inv or change
2760
2775
            # inv and file system)
2831
2846
            except OSError, e:
2832
2847
                raise errors.BzrMoveFailedError(entry.from_rel,
2833
2848
                    entry.to_rel, e[1])
 
2849
        if entry.change_id:
 
2850
            to_id = inv.path2id(entry.to_rel)
 
2851
            inv.remove_recursive_id(to_id)
2834
2852
        inv.rename(entry.from_id, entry.to_parent_id, entry.to_tail)
2835
2853
 
2836
2854
    @needs_tree_write_lock