~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tree.py

  • Committer: Martin Pool
  • Date: 2009-08-11 02:58:23 UTC
  • mfrom: (4595.3.1 1.18)
  • mto: This revision was merged to the branch mainline in revision 4597.
  • Revision ID: mbp@sourcefrog.net-20090811025823-aa20gm1shxe2nmd7
Merge back 1.18 and update NEWS

Show diffs side-by-side

added added

removed removed

Lines of Context:
19
19
 
20
20
import os
21
21
from collections import deque
22
 
from cStringIO import StringIO
23
22
 
24
23
import bzrlib
25
24
from bzrlib import (
30
29
    osutils,
31
30
    revision as _mod_revision,
32
31
    rules,
33
 
    symbol_versioning,
34
32
    )
35
33
from bzrlib.decorators import needs_read_lock
36
 
from bzrlib.errors import BzrError, BzrCheckError, NoSuchId
 
34
from bzrlib.errors import BzrError, NoSuchId
37
35
from bzrlib import errors
38
 
from bzrlib.inventory import Inventory, InventoryFile
 
36
from bzrlib.inventory import InventoryFile
39
37
from bzrlib.inter import InterObject
40
38
from bzrlib.osutils import fingerprint_file
41
39
import bzrlib.revision
42
40
from bzrlib.symbol_versioning import deprecated_function, deprecated_in
43
 
from bzrlib.trace import mutter, note
 
41
from bzrlib.trace import note
44
42
 
45
43
 
46
44
class Tree(object):
135
133
        return self.has_id(file_id)
136
134
 
137
135
    def has_or_had_id(self, file_id):
138
 
        if file_id == self.inventory.root.file_id:
139
 
            return True
140
136
        return self.inventory.has_id(file_id)
141
137
 
142
138
    def is_ignored(self, filename):
202
198
            specific_file_ids=specific_file_ids)
203
199
 
204
200
    def iter_references(self):
205
 
        for path, entry in self.iter_entries_by_dir():
206
 
            if entry.kind == 'tree-reference':
207
 
                yield path, entry.file_id
 
201
        if self.supports_tree_reference():
 
202
            for path, entry in self.iter_entries_by_dir():
 
203
                if entry.kind == 'tree-reference':
 
204
                    yield path, entry.file_id
208
205
 
209
206
    def kind(self, file_id):
210
207
        raise NotImplementedError("Tree subclass %s must implement kind"
262
259
        """
263
260
        raise NotImplementedError(self.get_file)
264
261
 
 
262
    def get_file_with_stat(self, file_id, path=None):
 
263
        """Get a file handle and stat object for file_id.
 
264
 
 
265
        The default implementation returns (self.get_file, None) for backwards
 
266
        compatibility.
 
267
 
 
268
        :param file_id: The file id to read.
 
269
        :param path: The path of the file, if it is known.
 
270
        :return: A tuple (file_handle, stat_value_or_None). If the tree has
 
271
            no stat facility, or need for a stat cache feedback during commit,
 
272
            it may return None for the second element of the tuple.
 
273
        """
 
274
        return (self.get_file(file_id, path), None)
 
275
 
265
276
    def get_file_text(self, file_id, path=None):
266
277
        """Return the byte content of a file.
267
278
 
422
433
        raise NotImplementedError(self.annotate_iter)
423
434
 
424
435
    def _get_plan_merge_data(self, file_id, other, base):
425
 
        from bzrlib import merge, versionedfile
 
436
        from bzrlib import versionedfile
426
437
        vf = versionedfile._PlanMergeVersionedFile(file_id)
427
438
        last_revision_a = self._get_file_revision(file_id, vf, 'this:')
428
439
        last_revision_b = other._get_file_revision(file_id, vf, 'other:')
657
668
            return None
658
669
 
659
670
    def iter_search_rules(self, path_names, pref_names=None,
660
 
        _default_searcher=rules._per_user_searcher):
 
671
        _default_searcher=None):
661
672
        """Find the preferences for filenames in a tree.
662
673
 
663
674
        :param path_names: an iterable of paths to find attributes for.
667
678
        :return: an iterator of tuple sequences, one per path-name.
668
679
          See _RulesSearcher.get_items for details on the tuple sequence.
669
680
        """
 
681
        if _default_searcher is None:
 
682
            _default_searcher = rules._per_user_searcher
670
683
        searcher = self._get_rules_searcher(_default_searcher)
671
684
        if searcher is not None:
672
685
            if pref_names is not None:
810
823
        new_pending = set()
811
824
        for file_id in pending:
812
825
            for tree in trees:
813
 
                if not tree.has_id(file_id):
 
826
                if not tree.has_or_had_id(file_id):
814
827
                    continue
815
828
                for child_id in tree.iter_children(file_id):
816
829
                    if child_id not in interesting_ids: