~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/workingtree_4.py

Merge from bzr.dev.

Show diffs side-by-side

added added

removed removed

Lines of Context:
49
49
    errors,
50
50
    generate_ids,
51
51
    globbing,
52
 
    hashcache,
53
52
    ignores,
54
53
    merge,
55
54
    osutils,
132
131
        """
133
132
        self._format = _format
134
133
        self.bzrdir = _bzrdir
135
 
        from bzrlib.trace import note, mutter
136
134
        assert isinstance(basedir, basestring), \
137
135
            "base directory %r is not a string" % basedir
138
136
        basedir = safe_unicode(basedir)
272
270
        self._dirstate = dirstate.DirState.on_file(local_path)
273
271
        return self._dirstate
274
272
 
275
 
    def _directory_is_tree_reference(self, relpath):
276
 
        # as a special case, if a directory contains control files then 
277
 
        # it's a tree reference, except that the root of the tree is not
278
 
        return relpath and osutils.isdir(self.abspath(relpath) + u"/.bzr")
279
 
        # TODO: We could ask all the control formats whether they
280
 
        # recognize this directory, but at the moment there's no cheap api
281
 
        # to do that.  Since we probably can only nest bzr checkouts and
282
 
        # they always use this name it's ok for now.  -- mbp 20060306
283
 
        #
284
 
        # FIXME: There is an unhandled case here of a subdirectory
285
 
        # containing .bzr but not a branch; that will probably blow up
286
 
        # when you try to commit it.  It might happen if there is a
287
 
        # checkout in a subdirectory.  This can be avoided by not adding
288
 
        # it.  mbp 20070306
289
 
 
290
273
    def filter_unversioned_files(self, paths):
291
274
        """Filter out paths that are versioned.
292
275
 
947
930
            if not all_versioned:
948
931
                raise errors.PathsNotVersionedError(paths)
949
932
        # -- remove redundancy in supplied paths to prevent over-scanning --
950
 
        search_paths = set()
951
 
        for path in paths:
952
 
            other_paths = paths.difference(set([path]))
953
 
            if not osutils.is_inside_any(other_paths, path):
954
 
                # this is a top level path, we must check it.
955
 
                search_paths.add(path)
 
933
        search_paths = osutils.minimum_path_selection(paths)
956
934
        # sketch: 
957
935
        # for all search_indexs in each path at or under each element of
958
936
        # search_paths, if the detail is relocated: add the id, and add the
1113
1091
        if state._dirblock_state == dirstate.DirState.IN_MEMORY_MODIFIED:
1114
1092
            self._make_dirty(reset_inventory=True)
1115
1093
 
 
1094
    def _sha_from_stat(self, path, stat_result):
 
1095
        """Get a sha digest from the tree's stat cache.
 
1096
 
 
1097
        The default implementation assumes no stat cache is present.
 
1098
 
 
1099
        :param path: The path.
 
1100
        :param stat_result: The stat result being looked up.
 
1101
        """
 
1102
        state = self.current_dirstate()
 
1103
        # XXX: should we make the path be passed in as utf8 ?
 
1104
        entry = state._get_entry(0, path_utf8=cache_utf8.encode(path))
 
1105
        tree_details = entry[1][0]
 
1106
        packed_stat = dirstate.pack_stat(stat_result)
 
1107
        if tree_details[4] == packed_stat:
 
1108
            return tree_details[1]
 
1109
        else:
 
1110
            return None
 
1111
 
1116
1112
    @needs_read_lock
1117
1113
    def supports_tree_reference(self):
1118
1114
        return self._repo_supports_tree_reference
1575
1571
    def kind(self, file_id):
1576
1572
        return self.inventory[file_id].kind
1577
1573
 
 
1574
    def path_content_summary(self, path):
 
1575
        """See Tree.path_content_summary."""
 
1576
        id = self.inventory.path2id(path)
 
1577
        if id is None:
 
1578
            return ('missing', None, None, None)
 
1579
        entry = self._inventory[id]
 
1580
        kind = entry.kind
 
1581
        if kind == 'file':
 
1582
            return (kind, entry.text_size, entry.executable, entry.text_sha1)
 
1583
        elif kind == 'symlink':
 
1584
            return (kind, None, None, entry.symlink_target)
 
1585
        else:
 
1586
            return (kind, None, None, None)
 
1587
 
1578
1588
    def is_executable(self, file_id, path=None):
1579
1589
        ie = self.inventory[file_id]
1580
1590
        if ie.kind != "file":
1717
1727
        # TODO: handle extra trees in the dirstate.
1718
1728
        # TODO: handle comparisons as an empty tree as a different special
1719
1729
        # case? mbp 20070226
1720
 
        if extra_trees or (self.source._revision_id == NULL_REVISION):
 
1730
        if (extra_trees or (self.source._revision_id == NULL_REVISION)
 
1731
            or specific_files == []):
1721
1732
            # we can't fast-path these cases (yet)
1722
1733
            for f in super(InterDirStateTree, self)._iter_changes(
1723
1734
                include_unchanged, specific_files, pb, extra_trees,