~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/inventory.py

  • Committer: Aaron Bentley
  • Date: 2005-07-26 14:06:11 UTC
  • mto: (1092.1.41) (1185.3.4) (974.1.47)
  • mto: This revision was merged to the branch mainline in revision 982.
  • Revision ID: abentley@panoramicfeedback.com-20050726140611-403e366f3c79c1f1
Fixed python invocation

Show diffs side-by-side

added added

removed removed

Lines of Context:
22
22
 
23
23
import sys, os.path, types, re
24
24
 
25
 
try:
26
 
    from cElementTree import Element, ElementTree, SubElement
27
 
except ImportError:
28
 
    from elementtree.ElementTree import Element, ElementTree, SubElement
29
 
 
30
 
from bzrlib.xml import XMLMixin
 
25
import bzrlib
31
26
from bzrlib.errors import BzrError, BzrCheckError
32
27
 
33
 
import bzrlib
34
28
from bzrlib.osutils import uuid, quotefn, splitpath, joinpath, appendpath
35
29
from bzrlib.trace import mutter
36
30
 
37
 
class InventoryEntry(XMLMixin):
 
31
class InventoryEntry(object):
38
32
    """Description of a versioned file.
39
33
 
40
34
    An InventoryEntry has the following fields, which are also
98
92
    # TODO: split InventoryEntry into subclasses for files,
99
93
    # directories, etc etc.
100
94
 
101
 
    text_sha1 = None
102
 
    text_size = None
103
 
    
 
95
    __slots__ = ['text_sha1', 'text_size', 'file_id', 'name', 'kind',
 
96
                 'text_id', 'parent_id', 'children', ]
 
97
 
104
98
    def __init__(self, file_id, name, kind, parent_id, text_id=None):
105
99
        """Create an InventoryEntry
106
100
        
119
113
        if '/' in name or '\\' in name:
120
114
            raise BzrCheckError('InventoryEntry name %r is invalid' % name)
121
115
        
 
116
        self.text_sha1 = None
 
117
        self.text_size = None
 
118
    
122
119
        self.file_id = file_id
123
120
        self.name = name
124
121
        self.kind = kind
160
157
    
161
158
    def to_element(self):
162
159
        """Convert to XML element"""
 
160
        from bzrlib.xml import Element
 
161
        
163
162
        e = Element('entry')
164
163
 
165
164
        e.set('name', self.name)
248
247
 
249
248
 
250
249
 
251
 
class Inventory(XMLMixin):
 
250
class Inventory(object):
252
251
    """Inventory of versioned files in a tree.
253
252
 
254
253
    This describes which file_id is present at each point in the tree,
266
265
    inserted, other than through the Inventory API.
267
266
 
268
267
    >>> inv = Inventory()
269
 
    >>> inv.write_xml(sys.stdout)
270
 
    <inventory>
271
 
    </inventory>
272
268
    >>> inv.add(InventoryEntry('123-123', 'hello.c', 'file', ROOT_ID))
273
269
    >>> inv['123-123'].name
274
270
    'hello.c'
284
280
 
285
281
    >>> [x[0] for x in inv.iter_entries()]
286
282
    ['hello.c']
287
 
    
288
 
    >>> inv.write_xml(sys.stdout)
289
 
    <inventory>
290
 
    <entry file_id="123-123" kind="file" name="hello.c" />
291
 
    </inventory>
292
 
 
 
283
    >>> inv = Inventory('TREE_ROOT-12345678-12345678')
 
284
    >>> inv.add(InventoryEntry('123-123', 'hello.c', 'file', ROOT_ID))
293
285
    """
294
 
    def __init__(self):
 
286
    def __init__(self, root_id=ROOT_ID):
295
287
        """Create or read an inventory.
296
288
 
297
289
        If a working directory is specified, the inventory is read
301
293
        The inventory is created with a default root directory, with
302
294
        an id of None.
303
295
        """
304
 
        self.root = RootEntry(ROOT_ID)
 
296
        # We are letting Branch(init=True) create a unique inventory
 
297
        # root id. Rather than generating a random one here.
 
298
        #if root_id is None:
 
299
        #    root_id = bzrlib.branch.gen_file_id('TREE_ROOT')
 
300
        self.root = RootEntry(root_id)
305
301
        self._byid = {self.root.file_id: self.root}
306
302
 
307
303
 
413
409
        if entry.file_id in self._byid:
414
410
            raise BzrError("inventory already contains entry with id {%s}" % entry.file_id)
415
411
 
 
412
        if entry.parent_id == ROOT_ID or entry.parent_id is None:
 
413
            entry.parent_id = self.root.file_id
 
414
 
416
415
        try:
417
416
            parent = self._byid[entry.parent_id]
418
417
        except KeyError:
437
436
            raise BzrError("cannot re-add root of inventory")
438
437
 
439
438
        if file_id == None:
440
 
            file_id = bzrlib.branch.gen_file_id(relpath)
 
439
            from bzrlib.branch import gen_file_id
 
440
            file_id = gen_file_id(relpath)
441
441
 
442
442
        parent_path = parts[:-1]
443
443
        parent_id = self.path2id(parent_path)
477
477
 
478
478
    def to_element(self):
479
479
        """Convert to XML Element"""
 
480
        from bzrlib.xml import Element
 
481
        
480
482
        e = Element('inventory')
481
483
        e.text = '\n'
 
484
        if self.root.file_id not in (None, ROOT_ID):
 
485
            e.set('file_id', self.root.file_id)
482
486
        for path, ie in self.iter_entries():
483
487
            e.append(ie.to_element())
484
488
        return e
486
490
 
487
491
    def from_element(cls, elt):
488
492
        """Construct from XML Element
489
 
 
 
493
        
490
494
        >>> inv = Inventory()
491
495
        >>> inv.add(InventoryEntry('foo.c-123981239', 'foo.c', 'file', ROOT_ID))
492
496
        >>> elt = inv.to_element()
494
498
        >>> inv2 == inv
495
499
        True
496
500
        """
 
501
        # XXXX: doctest doesn't run this properly under python2.3
497
502
        assert elt.tag == 'inventory'
498
 
        o = cls()
 
503
        root_id = elt.get('file_id') or ROOT_ID
 
504
        o = cls(root_id)
499
505
        for e in elt:
500
 
            o.add(InventoryEntry.from_element(e))
 
506
            ie = InventoryEntry.from_element(e)
 
507
            if ie.parent_id == ROOT_ID:
 
508
                ie.parent_id = root_id
 
509
            o.add(ie)
501
510
        return o
502
511
        
503
512
    from_element = classmethod(from_element)
559
568
        """Return as a list the path to file_id."""
560
569
 
561
570
        # get all names, skipping root
562
 
        p = [self[fid].name for fid in self.get_idpath(file_id)[1:]]
 
571
        p = [self._byid[fid].name for fid in self.get_idpath(file_id)[1:]]
563
572
        return os.sep.join(p)
564
573
            
565
574