~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tree.py

  • Committer: John Arbash Meinel
  • Date: 2006-07-13 18:38:58 UTC
  • mfrom: (1863 +trunk)
  • mto: This revision was merged to the branch mainline in revision 1869.
  • Revision ID: john@arbash-meinel.com-20060713183858-ebf4aa1f9ef8bb6e
[merge] bzr.dev 1863

Show diffs side-by-side

added added

removed removed

Lines of Context:
22
22
 
23
23
import bzrlib
24
24
from bzrlib.errors import BzrError, BzrCheckError
 
25
from bzrlib import errors
25
26
from bzrlib.inventory import Inventory
26
27
from bzrlib.osutils import fingerprint_file
27
28
import bzrlib.revision
335
336
            yield (old_name, new_name)
336
337
            
337
338
 
338
 
 
 
339
def find_ids_across_trees(filenames, trees, require_versioned=True):
 
340
    """Find the ids corresponding to specified filenames.
 
341
    
 
342
    All matches in all trees will be used, and all children of matched
 
343
    directories will be used.
 
344
 
 
345
    :param filenames: The filenames to find file_ids for
 
346
    :param trees: The trees to find file_ids within
 
347
    :param require_versioned: if true, all specified filenames must occur in
 
348
    at least one tree.
 
349
    :return: a set of file ids for the specified filenames and their children.
 
350
    """
 
351
    if not filenames:
 
352
        return None
 
353
    specified_ids = _find_filename_ids_across_trees(filenames, trees, 
 
354
                                                    require_versioned)
 
355
    return _find_children_across_trees(specified_ids, trees)
 
356
 
 
357
 
 
358
def _find_filename_ids_across_trees(filenames, trees, require_versioned):
 
359
    """Find the ids corresponding to specified filenames.
 
360
    
 
361
    All matches in all trees will be used.
 
362
 
 
363
    :param filenames: The filenames to find file_ids for
 
364
    :param trees: The trees to find file_ids within
 
365
    :param require_versioned: if true, all specified filenames must occur in
 
366
    at least one tree.
 
367
    :return: a set of file ids for the specified filenames
 
368
    """
 
369
    not_versioned = []
 
370
    interesting_ids = set()
 
371
    for tree_path in filenames:
 
372
        not_found = True
 
373
        for tree in trees:
 
374
            file_id = tree.inventory.path2id(tree_path)
 
375
            if file_id is not None:
 
376
                interesting_ids.add(file_id)
 
377
                not_found = False
 
378
        if not_found:
 
379
            not_versioned.append(tree_path)
 
380
    if len(not_versioned) > 0 and require_versioned:
 
381
        raise errors.PathsNotVersionedError(not_versioned)
 
382
    return interesting_ids
 
383
 
 
384
 
 
385
def _find_children_across_trees(specified_ids, trees):
 
386
    """Return a set including specified ids and their children
 
387
    
 
388
    All matches in all trees will be used.
 
389
 
 
390
    :param trees: The trees to find file_ids within
 
391
    :return: a set containing all specified ids and their children 
 
392
    """
 
393
    interesting_ids = set(specified_ids)
 
394
    pending = interesting_ids
 
395
    # now handle children of interesting ids
 
396
    # we loop so that we handle all children of each id in both trees
 
397
    while len(pending) > 0:
 
398
        new_pending = set()
 
399
        for file_id in pending:
 
400
            for tree in trees:
 
401
                if file_id not in tree:
 
402
                    continue
 
403
                entry = tree.inventory[file_id]
 
404
                for child in getattr(entry, 'children', {}).itervalues():
 
405
                    if child.file_id not in interesting_ids:
 
406
                        new_pending.add(child.file_id)
 
407
        interesting_ids.update(new_pending)
 
408
        pending = new_pending
 
409
    return interesting_ids