~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tree.py

Merge from bzr.dev.

Show diffs side-by-side

added added

removed removed

Lines of Context:
122
122
    
123
123
    def has_filename(self, filename):
124
124
        """True if the tree has given filename."""
125
 
        raise NotImplementedError()
 
125
        raise NotImplementedError(self.has_filename)
126
126
 
127
127
    def has_id(self, file_id):
128
128
        file_id = osutils.safe_file_id(file_id)
188
188
        raise NotImplementedError("Tree subclass %s must implement kind"
189
189
            % self.__class__.__name__)
190
190
 
 
191
    def path_content_summary(self, path):
 
192
        """Get a summary of the information about path.
 
193
        
 
194
        :param path: A relative path within the tree.
 
195
        :return: A tuple containing kind, size, exec, sha1-or-link.
 
196
            Kind is always present (see tree.kind()).
 
197
            size is present if kind is file, None otherwise.
 
198
            exec is None unless kind is file and the platform supports the 'x'
 
199
                bit.
 
200
            sha1-or-link is the link target if kind is symlink, or the sha1 if
 
201
                it can be obtained without reading the file.
 
202
        """
 
203
        raise NotImplementedError(self.path_content_summary)
 
204
 
191
205
    def get_reference_revision(self, file_id, path=None):
192
206
        raise NotImplementedError("Tree subclass %s must implement "
193
207
                                  "get_reference_revision"
228
242
        raise NotImplementedError(self.get_file_mtime)
229
243
 
230
244
    def get_file_by_path(self, path):
231
 
        return self.get_file(self._inventory.path2id(path))
 
245
        return self.get_file(self._inventory.path2id(path), path)
232
246
 
233
247
    def iter_files_bytes(self, desired_files):
234
248
        """Iterate through file contents.
267
281
        raise NotImplementedError(self.get_symlink_target)
268
282
 
269
283
    def annotate_iter(self, file_id):
270
 
        """Return an iterator of revision_id, line tuples
 
284
        """Return an iterator of revision_id, line tuples.
271
285
 
272
286
        For working trees (and mutable trees in general), the special
273
287
        revision_id 'current:' will be used for lines that are new in this
277
291
        raise NotImplementedError(self.annotate_iter)
278
292
 
279
293
    def plan_file_merge(self, file_id, other):
280
 
        """Generate a merge plan based on annotations
 
294
        """Generate a merge plan based on annotations.
281
295
 
282
296
        If the file contains uncommitted changes in this tree, they will be
283
297
        attributed to the 'current:' pseudo-revision.  If the file contains
323
337
    def paths2ids(self, paths, trees=[], require_versioned=True):
324
338
        """Return all the ids that can be reached by walking from paths.
325
339
        
326
 
        Each path is looked up in each this tree and any extras provided in
 
340
        Each path is looked up in this tree and any extras provided in
327
341
        trees, and this is repeated recursively: the children in an extra tree
328
342
        of a directory that has been renamed under a provided path in this tree
329
 
        are all returned, even if none exist until a provided path in this
 
343
        are all returned, even if none exist under a provided path in this
330
344
        tree, and vice versa.
331
345
 
332
346
        :param paths: An iterable of paths to start converting to ids from.
405
419
           versioned_kind.
406
420
         - lstat is the stat data *if* the file was statted.
407
421
         - path_from_tree_root is the path from the root of the tree.
408
 
         - file_id is the file_id is the entry is versioned.
 
422
         - file_id is the file_id if the entry is versioned.
409
423
         - versioned_kind is the kind of the file as last recorded in the 
410
424
           versioning system. If 'unknown' the file is not versioned.
411
425
        One of 'kind' and 'versioned_kind' must not be 'unknown'.
545
559
    :param trees: The trees to find file_ids within
546
560
    :param require_versioned: if true, all specified filenames must occur in
547
561
        at least one tree.
548
 
    :return: a set of (path, file ids) for the specified filenames
 
562
    :return: a set of file ids for the specified filenames
549
563
    """
550
564
    not_versioned = []
551
565
    interesting_ids = set()
564
578
 
565
579
 
566
580
def _find_children_across_trees(specified_ids, trees):
567
 
    """Return a set including specified ids and their children
 
581
    """Return a set including specified ids and their children.
568
582
    
569
583
    All matches in all trees will be used.
570
584
 
596
610
    Its instances have methods like 'compare' and contain references to the
597
611
    source and target trees these operations are to be carried out on.
598
612
 
599
 
    clients of bzrlib should not need to use InterTree directly, rather they
 
613
    Clients of bzrlib should not need to use InterTree directly, rather they
600
614
    should use the convenience methods on Tree such as 'Tree.compare()' which
601
615
    will pass through to InterTree as appropriate.
602
616
    """
679
693
        lookup_trees = [self.source]
680
694
        if extra_trees:
681
695
             lookup_trees.extend(extra_trees)
682
 
        specific_file_ids = self.target.paths2ids(specific_files,
683
 
            lookup_trees, require_versioned=require_versioned)
 
696
        if specific_files == []:
 
697
            specific_file_ids = []
 
698
        else:
 
699
            specific_file_ids = self.target.paths2ids(specific_files,
 
700
                lookup_trees, require_versioned=require_versioned)
684
701
        if want_unversioned:
685
 
            all_unversioned = sorted([(p.split('/'), p) for p in self.target.extras()
686
 
                if not specific_files or
 
702
            all_unversioned = sorted([(p.split('/'), p) for p in
 
703
                                     self.target.extras()
 
704
                if specific_files is None or
687
705
                    osutils.is_inside_any(specific_files, p)])
688
706
            all_unversioned = deque(all_unversioned)
689
707
        else: