~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/workingtree.py

Move all features to bzrlib.tests.features in 2.5

Show diffs side-by-side

added added

removed removed

Lines of Context:
496
496
        finally:
497
497
            file.close()
498
498
 
499
 
    def _get_ancestors(self, default_revision):
500
 
        ancestors = set([default_revision])
501
 
        for parent_id in self.get_parent_ids():
502
 
            ancestors.update(self.branch.repository.get_ancestry(
503
 
                             parent_id, topo_sorted=False))
504
 
        return ancestors
505
 
 
506
499
    def get_parent_ids(self):
507
500
        """See Tree.get_parent_ids.
508
501
 
973
966
        file and change the file_id. That is the normal mode. Second, it can
974
967
        only change the file_id without touching any physical file.
975
968
 
976
 
        rename_one uses the second mode if 'after == True' and 'to_rel' is not
977
 
        versioned but present in the working tree.
 
969
        rename_one uses the second mode if 'after == True' and 'to_rel' is
 
970
        either not versioned or newly added, and present in the working tree.
978
971
 
979
972
        rename_one uses the second mode if 'after == False' and 'from_rel' is
980
973
        versioned but no longer in the working tree, and 'to_rel' is not
1385
1378
    def revert(self, filenames=None, old_tree=None, backups=True,
1386
1379
               pb=None, report_changes=False):
1387
1380
        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
1381
        if old_tree is None:
1394
1382
            basis_tree = self.basis_tree()
1395
1383
            basis_tree.lock_read()
2089
2077
            return True
2090
2078
        return self.inventory.has_id(file_id)
2091
2079
 
2092
 
    __contains__ = has_id
2093
 
 
2094
2080
    @symbol_versioning.deprecated_method(symbol_versioning.deprecated_in((2, 4, 0)))
2095
2081
    def __iter__(self):
2096
2082
        """Iterate through file_ids for this tree.
2272
2258
                parent_tree = self.branch.repository.revision_tree(parent_id)
2273
2259
            parent_tree.lock_read()
2274
2260
            try:
2275
 
                if file_id not in parent_tree:
 
2261
                if not parent_tree.has_id(file_id):
2276
2262
                    continue
2277
2263
                ie = parent_tree.inventory[file_id]
2278
2264
                if ie.kind != 'file':
2326
2312
            for s in _mod_rio.RioReader(hashfile):
2327
2313
                # RioReader reads in Unicode, so convert file_ids back to utf8
2328
2314
                file_id = osutils.safe_file_id(s.get("file_id"), warn=False)
2329
 
                if file_id not in self.inventory:
 
2315
                if not self.inventory.has_id(file_id):
2330
2316
                    continue
2331
2317
                text_hash = s.get("hash")
2332
2318
                if text_hash == self.get_file_sha1(file_id):
2573
2559
        inventory. The second mode only updates the inventory without
2574
2560
        touching the file on the filesystem.
2575
2561
 
2576
 
        move uses the second mode if 'after == True' and the target is not
2577
 
        versioned but present in the working tree.
 
2562
        move uses the second mode if 'after == True' and the target is
 
2563
        either not versioned or newly added, and present in the working tree.
2578
2564
 
2579
2565
        move uses the second mode if 'after == False' and the source is
2580
2566
        versioned but no longer in the working tree, and the target is not
2727
2713
 
2728
2714
    class _RenameEntry(object):
2729
2715
        def __init__(self, from_rel, from_id, from_tail, from_parent_id,
2730
 
                     to_rel, to_tail, to_parent_id, only_change_inv=False):
 
2716
                     to_rel, to_tail, to_parent_id, only_change_inv=False,
 
2717
                     change_id=False):
2731
2718
            self.from_rel = from_rel
2732
2719
            self.from_id = from_id
2733
2720
            self.from_tail = from_tail
2735
2722
            self.to_rel = to_rel
2736
2723
            self.to_tail = to_tail
2737
2724
            self.to_parent_id = to_parent_id
 
2725
            self.change_id = change_id
2738
2726
            self.only_change_inv = only_change_inv
2739
2727
 
2740
2728
    def _determine_mv_mode(self, rename_entries, after=False):
2752
2740
            to_rel = rename_entry.to_rel
2753
2741
            to_id = inv.path2id(to_rel)
2754
2742
            only_change_inv = False
 
2743
            change_id = False
2755
2744
 
2756
2745
            # check the inventory for source and destination
2757
2746
            if from_id is None:
2758
2747
                raise errors.BzrMoveFailedError(from_rel,to_rel,
2759
2748
                    errors.NotVersionedError(path=from_rel))
2760
2749
            if to_id is not None:
2761
 
                raise errors.BzrMoveFailedError(from_rel,to_rel,
2762
 
                    errors.AlreadyVersionedError(path=to_rel))
 
2750
                allowed = False
 
2751
                # allow it with --after but only if dest is newly added
 
2752
                if after:
 
2753
                    basis = self.basis_tree()
 
2754
                    basis.lock_read()
 
2755
                    try:
 
2756
                        if not basis.has_id(to_id):
 
2757
                            rename_entry.change_id = True
 
2758
                            allowed = True
 
2759
                    finally:
 
2760
                        basis.unlock()
 
2761
                if not allowed:
 
2762
                    raise errors.BzrMoveFailedError(from_rel,to_rel,
 
2763
                        errors.AlreadyVersionedError(path=to_rel))
2763
2764
 
2764
2765
            # try to determine the mode for rename (only change inv or change
2765
2766
            # inv and file system)
2836
2837
            except OSError, e:
2837
2838
                raise errors.BzrMoveFailedError(entry.from_rel,
2838
2839
                    entry.to_rel, e[1])
 
2840
        if entry.change_id:
 
2841
            to_id = inv.path2id(entry.to_rel)
 
2842
            inv.remove_recursive_id(to_id)
2839
2843
        inv.rename(entry.from_id, entry.to_parent_id, entry.to_tail)
2840
2844
 
2841
2845
    @needs_tree_write_lock
2849
2853
        :raises: NoSuchId if any fileid is not currently versioned.
2850
2854
        """
2851
2855
        for file_id in file_ids:
2852
 
            if file_id not in self._inventory:
 
2856
            if not self._inventory.has_id(file_id):
2853
2857
                raise errors.NoSuchId(self, file_id)
2854
2858
        for file_id in file_ids:
2855
2859
            if self._inventory.has_id(file_id):
3010
3014
    missing_parent_conflicts = False
3011
3015
    """If this format supports missing parent conflicts."""
3012
3016
 
 
3017
    supports_versioned_directories = None
 
3018
 
3013
3019
    @classmethod
3014
3020
    def find_format_string(klass, a_bzrdir):
3015
3021
        """Return format name for the working tree object in a_bzrdir."""