~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/inventory.py

  • Committer: Robert Collins
  • Date: 2005-08-23 06:52:09 UTC
  • mto: (974.1.50) (1185.1.10) (1092.3.1)
  • mto: This revision was merged to the branch mainline in revision 1139.
  • Revision ID: robertc@robertcollins.net-20050823065209-81cd5962c401751b
move io redirection into each test case from the global runner

Show diffs side-by-side

added added

removed removed

Lines of Context:
27
27
 
28
28
from bzrlib.osutils import uuid, quotefn, splitpath, joinpath, appendpath
29
29
from bzrlib.trace import mutter
 
30
from bzrlib.errors import NotVersionedError
 
31
        
30
32
 
31
33
class InventoryEntry(object):
32
34
    """Description of a versioned file.
92
94
    # TODO: split InventoryEntry into subclasses for files,
93
95
    # directories, etc etc.
94
96
 
95
 
    text_sha1 = None
96
 
    text_size = None
97
 
    
 
97
    __slots__ = ['text_sha1', 'text_size', 'file_id', 'name', 'kind',
 
98
                 'text_id', 'parent_id', 'children', ]
 
99
 
98
100
    def __init__(self, file_id, name, kind, parent_id, text_id=None):
99
101
        """Create an InventoryEntry
100
102
        
113
115
        if '/' in name or '\\' in name:
114
116
            raise BzrCheckError('InventoryEntry name %r is invalid' % name)
115
117
        
 
118
        self.text_sha1 = None
 
119
        self.text_size = None
 
120
    
116
121
        self.file_id = file_id
117
122
        self.name = name
118
123
        self.kind = kind
277
282
 
278
283
    >>> [x[0] for x in inv.iter_entries()]
279
284
    ['hello.c']
 
285
    >>> inv = Inventory('TREE_ROOT-12345678-12345678')
 
286
    >>> inv.add(InventoryEntry('123-123', 'hello.c', 'file', ROOT_ID))
280
287
    """
281
 
    def __init__(self):
 
288
    def __init__(self, root_id=ROOT_ID):
282
289
        """Create or read an inventory.
283
290
 
284
291
        If a working directory is specified, the inventory is read
288
295
        The inventory is created with a default root directory, with
289
296
        an id of None.
290
297
        """
291
 
        self.root = RootEntry(ROOT_ID)
 
298
        # We are letting Branch(init=True) create a unique inventory
 
299
        # root id. Rather than generating a random one here.
 
300
        #if root_id is None:
 
301
        #    root_id = bzrlib.branch.gen_file_id('TREE_ROOT')
 
302
        self.root = RootEntry(root_id)
292
303
        self._byid = {self.root.file_id: self.root}
293
304
 
294
305
 
400
411
        if entry.file_id in self._byid:
401
412
            raise BzrError("inventory already contains entry with id {%s}" % entry.file_id)
402
413
 
 
414
        if entry.parent_id == ROOT_ID or entry.parent_id is None:
 
415
            entry.parent_id = self.root.file_id
 
416
 
403
417
        try:
404
418
            parent = self._byid[entry.parent_id]
405
419
        except KeyError:
417
431
        """Add entry from a path.
418
432
 
419
433
        The immediate parent must already be versioned"""
420
 
        from bzrlib.errors import NotVersionedError
 
434
        from bzrlib.branch import gen_file_id
421
435
        
422
436
        parts = bzrlib.osutils.splitpath(relpath)
423
437
        if len(parts) == 0:
424
438
            raise BzrError("cannot re-add root of inventory")
425
439
 
426
440
        if file_id == None:
427
 
            from bzrlib.branch import gen_file_id
428
441
            file_id = gen_file_id(relpath)
429
442
 
430
443
        parent_path = parts[:-1]
469
482
        
470
483
        e = Element('inventory')
471
484
        e.text = '\n'
 
485
        if self.root.file_id not in (None, ROOT_ID):
 
486
            e.set('file_id', self.root.file_id)
472
487
        for path, ie in self.iter_entries():
473
488
            e.append(ie.to_element())
474
489
        return e
476
491
 
477
492
    def from_element(cls, elt):
478
493
        """Construct from XML Element
479
 
 
 
494
        
480
495
        >>> inv = Inventory()
481
496
        >>> inv.add(InventoryEntry('foo.c-123981239', 'foo.c', 'file', ROOT_ID))
482
497
        >>> elt = inv.to_element()
484
499
        >>> inv2 == inv
485
500
        True
486
501
        """
 
502
        # XXXX: doctest doesn't run this properly under python2.3
487
503
        assert elt.tag == 'inventory'
488
 
        o = cls()
 
504
        root_id = elt.get('file_id') or ROOT_ID
 
505
        o = cls(root_id)
489
506
        for e in elt:
490
 
            o.add(InventoryEntry.from_element(e))
 
507
            ie = InventoryEntry.from_element(e)
 
508
            if ie.parent_id == ROOT_ID:
 
509
                ie.parent_id = root_id
 
510
            o.add(ie)
491
511
        return o
492
512
        
493
513
    from_element = classmethod(from_element)
549
569
        """Return as a list the path to file_id."""
550
570
 
551
571
        # get all names, skipping root
552
 
        p = [self[fid].name for fid in self.get_idpath(file_id)[1:]]
 
572
        p = [self._byid[fid].name for fid in self.get_idpath(file_id)[1:]]
553
573
        return os.sep.join(p)
554
574
            
555
575
 
624
644
 
625
645
 
626
646
 
627
 
_NAME_RE = re.compile(r'^[^/\\]+$')
 
647
_NAME_RE = None
628
648
 
629
649
def is_valid_name(name):
 
650
    global _NAME_RE
 
651
    if _NAME_RE == None:
 
652
        _NAME_RE = re.compile(r'^[^/\\]+$')
 
653
        
630
654
    return bool(_NAME_RE.match(name))