~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/workingtree.py

(jelmer) Support passing in file ids as tuples to the Tree API. (Jelmer
 Vernooij)

Show diffs side-by-side

added added

removed removed

Lines of Context:
2069
2069
 
2070
2070
    def has_id(self, file_id):
2071
2071
        # files that have been deleted are excluded
2072
 
        if not self.inventory.has_id(file_id):
 
2072
        inv, inv_file_id = self._unpack_file_id(file_id)
 
2073
        if not inv.has_id(inv_file_id):
2073
2074
            return False
2074
 
        path = self.inventory.id2path(file_id)
 
2075
        path = inv.id2path(inv_file_id)
2075
2076
        return osutils.lexists(self.abspath(path))
2076
2077
 
2077
2078
    def has_or_had_id(self, file_id):
2078
2079
        if file_id == self.inventory.root.file_id:
2079
2080
            return True
2080
 
        return self.inventory.has_id(file_id)
 
2081
        inv, inv_file_id = self._unpack_file_id(file_id)
 
2082
        return inv.has_id(inv_file_id)
2081
2083
 
2082
2084
    def all_file_ids(self):
2083
2085
        """Iterate through file_ids for this tree.
2177
2179
            raise
2178
2180
 
2179
2181
    def _is_executable_from_path_and_stat_from_basis(self, path, stat_result):
2180
 
        file_id = self.path2id(path)
 
2182
        inv, file_id = self._path2inv_file_id(path)
2181
2183
        if file_id is None:
2182
2184
            # For unversioned files on win32, we just assume they are not
2183
2185
            # executable
2184
2186
            return False
2185
 
        return self.inventory[file_id].executable
 
2187
        return inv[file_id].executable
2186
2188
 
2187
2189
    def _is_executable_from_path_and_stat_from_stat(self, path, stat_result):
2188
2190
        mode = stat_result.st_mode
2190
2192
 
2191
2193
    def is_executable(self, file_id, path=None):
2192
2194
        if not self._supports_executable():
2193
 
            return self.inventory[file_id].executable
 
2195
            inv, inv_file_id = self._unpack_file_id(file_id)
 
2196
            return inv[inv_file_id].executable
2194
2197
        else:
2195
2198
            if not path:
2196
2199
                path = self.id2path(file_id)
2457
2460
 
2458
2461
        # directory file_id, relative path, absolute path, reverse sorted children
2459
2462
        if from_dir is not None:
2460
 
            inv = self.inventory
2461
 
            from_dir_id = self.path2id(from_dir)
 
2463
            inv, from_dir_id = self._path2inv_file_id(from_dir)
2462
2464
            if from_dir_id is None:
2463
2465
                # Directory not versioned
2464
2466
                return
2606
2608
        if not self.has_filename(to_dir):
2607
2609
            raise errors.BzrMoveFailedError('',to_dir,
2608
2610
                errors.NotInWorkingDirectory(to_dir))
2609
 
        to_dir_id = self.path2id(to_dir)
 
2611
        to_inv, to_dir_id = self._path2inv_file_id(to_dir)
2610
2612
        if to_dir_id is None:
2611
2613
            raise errors.BzrMoveFailedError('',to_dir,
2612
2614
                errors.NotVersionedError(path=to_dir))
2613
2615
 
2614
 
        to_dir_ie = self.inventory[to_dir_id]
 
2616
        to_dir_ie = to_inv[to_dir_id]
2615
2617
        if to_dir_ie.kind != 'directory':
2616
2618
            raise errors.BzrMoveFailedError('',to_dir,
2617
2619
                errors.NotADirectory(to_abs))
2619
2621
        # create rename entries and tuples
2620
2622
        for from_rel in from_paths:
2621
2623
            from_tail = splitpath(from_rel)[-1]
2622
 
            from_id = self.path2id(from_rel)
 
2624
            from_inv, from_id = self._path2inv_file_id(from_rel)
2623
2625
            if from_id is None:
2624
2626
                raise errors.BzrMoveFailedError(from_rel,to_dir,
2625
2627
                    errors.NotVersionedError(path=from_rel))
2626
2628
 
2627
 
            from_entry = self.inventory[from_id]
 
2629
            from_entry = from_inv[from_id]
2628
2630
            from_parent_id = from_entry.parent_id
2629
2631
            to_rel = pathjoin(to_dir, from_tail)
2630
2632
            rename_entry = InventoryWorkingTree._RenameEntry(
2649
2651
            # restore the inventory on error
2650
2652
            self._inventory_is_modified = original_modified
2651
2653
            raise
2652
 
        self._write_inventory(self.inventory)
 
2654
        #FIXME: Should potentially also write the from_invs
 
2655
        self._write_inventory(to_inv)
2653
2656
        return rename_tuples
2654
2657
 
2655
2658
    @needs_tree_write_lock
2679
2682
 
2680
2683
        # create rename entries and tuples
2681
2684
        from_tail = splitpath(from_rel)[-1]
2682
 
        from_id = self.path2id(from_rel)
 
2685
        from_inv, from_id = self._path2inv_file_id(from_rel)
2683
2686
        if from_id is None:
2684
2687
            # if file is missing in the inventory maybe it's in the basis_tree
2685
2688
            basis_tree = self.branch.basis_tree()
2689
2692
                    errors.NotVersionedError(path=from_rel))
2690
2693
            # put entry back in the inventory so we can rename it
2691
2694
            from_entry = basis_tree.inventory[from_id].copy()
2692
 
            self.inventory.add(from_entry)
 
2695
            from_inv.add(from_entry)
2693
2696
        else:
2694
 
            from_entry = self.inventory[from_id]
 
2697
            from_inv, from_inv_id = self._unpack_file_id(from_id)
 
2698
            from_entry = from_inv[from_inv_id]
2695
2699
        from_parent_id = from_entry.parent_id
2696
2700
        to_dir, to_tail = os.path.split(to_rel)
2697
 
        to_dir_id = self.path2id(to_dir)
 
2701
        to_inv, to_dir_id = self._path2inv_file_id(to_dir)
2698
2702
        rename_entry = InventoryWorkingTree._RenameEntry(from_rel=from_rel,
2699
2703
                                     from_id=from_id,
2700
2704
                                     from_tail=from_tail,
2722
2726
               from_id, from_rel, to_rel, to_dir, to_dir_id)
2723
2727
 
2724
2728
        self._move(rename_entries)
2725
 
        self._write_inventory(self.inventory)
 
2729
        self._write_inventory(to_inv)
2726
2730
 
2727
2731
    class _RenameEntry(object):
2728
2732
        def __init__(self, from_rel, from_id, from_tail, from_parent_id,
2881
2885
 
2882
2886
    def stored_kind(self, file_id):
2883
2887
        """See Tree.stored_kind"""
2884
 
        return self.inventory[file_id].kind
 
2888
        inv, inv_file_id = self._unpack_file_id(file_id)
 
2889
        return inv[inv_file_id].kind
2885
2890
 
2886
2891
    def extras(self):
2887
2892
        """Yield all unversioned files in this WorkingTree.
2937
2942
        """
2938
2943
        _directory = 'directory'
2939
2944
        # get the root in the inventory
2940
 
        inv = self.inventory
2941
 
        top_id = inv.path2id(prefix)
 
2945
        inv, top_id = self._path2inv_file_id(prefix)
2942
2946
        if top_id is None:
2943
2947
            pending = []
2944
2948
        else: