~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/workingtree_4.py

Perform path2id lookups in dirstate revision trees from the dirstate index without requiring an inventory.

Show diffs side-by-side

added added

removed removed

Lines of Context:
862
862
        pred = self.has_filename
863
863
        return set((p for p in paths if not pred(p)))
864
864
 
 
865
    def _get_entry(self, file_id=None, path=None):
 
866
        """Get the dirstate row for file_id or path.
 
867
 
 
868
        If either file_id or path is supplied, it is used as the key to lookup.
 
869
        If both are supplied, the fastest lookup is used, and an error is
 
870
        raised if they do not both point at the same row.
 
871
        
 
872
        :param file_id: An optional unicode file_id to be looked up.
 
873
        :param path: An optional unicode path to be looked up.
 
874
        :return: The dirstate row tuple for path/file_id, or (None, None)
 
875
        """
 
876
        if file_id is None and path is None:
 
877
            raise errors.BzrError('must supply file_id or path')
 
878
        if file_id is not None:
 
879
            file_id = file_id.encode('utf8')
 
880
        if path is not None:
 
881
            path = path.encode('utf8')
 
882
        parent_index = self._dirstate.get_parent_ids().index(self._revision_id) + 1
 
883
        return self._dirstate._get_entry(parent_index, fileid_utf8=file_id, path_utf8=path)
 
884
 
865
885
    def _generate_inventory(self):
866
886
        """Create and set self.inventory from the dirstate object.
867
887
 
983
1003
            self._repository.lock_read()
984
1004
        self._locked += 1
985
1005
 
 
1006
    @needs_read_lock
986
1007
    def path2id(self, path):
987
1008
        """Return the id for path in this tree."""
988
 
        # TODO: if there is no inventory, do an optimistic lookup in the
989
 
        # dirstate by the path; commonly this will work.
990
 
        return self.inventory.path2id(path)
 
1009
        # lookup by path: faster than splitting and walking the ivnentory.
 
1010
        entry = self._get_entry(path=path)
 
1011
        if entry == (None, None):
 
1012
            return None
 
1013
        return entry[0][2].decode('utf8')
991
1014
 
992
1015
    def unlock(self):
993
1016
        """Unlock, freeing any cache memory used during the lock."""