~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/inventory.py

  • Committer: Martin Pool
  • Date: 2005-07-11 03:16:29 UTC
  • Revision ID: mbp@sourcefrog.net-20050711031629-924ff7343d55103c
- faster weave extraction

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 xml import XMLMixin
31
 
from errors import bailout, BzrError, BzrCheckError
32
 
 
33
25
import bzrlib
 
26
from bzrlib.errors import BzrError, BzrCheckError
 
27
 
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
68
62
    >>> i.add(InventoryEntry('2323', 'bye.c', 'file', '123'))
69
63
    Traceback (most recent call last):
70
64
    ...
71
 
    BzrError: ('inventory already contains entry with id {2323}', [])
 
65
    BzrError: inventory already contains entry with id {2323}
72
66
    >>> i.add(InventoryEntry('2324', 'bye.c', 'file', '123'))
73
67
    >>> i.add(InventoryEntry('2325', 'wibble', 'directory', '123'))
74
68
    >>> i.path2id('src/wibble')
160
154
    
161
155
    def to_element(self):
162
156
        """Convert to XML element"""
 
157
        from bzrlib.xml import Element
 
158
        
163
159
        e = Element('entry')
164
160
 
165
161
        e.set('name', self.name)
248
244
 
249
245
 
250
246
 
251
 
class Inventory(XMLMixin):
 
247
class Inventory(object):
252
248
    """Inventory of versioned files in a tree.
253
249
 
254
250
    This describes which file_id is present at each point in the tree,
266
262
    inserted, other than through the Inventory API.
267
263
 
268
264
    >>> inv = Inventory()
269
 
    >>> inv.write_xml(sys.stdout)
270
 
    <inventory>
271
 
    </inventory>
272
265
    >>> inv.add(InventoryEntry('123-123', 'hello.c', 'file', ROOT_ID))
273
266
    >>> inv['123-123'].name
274
267
    'hello.c'
284
277
 
285
278
    >>> [x[0] for x in inv.iter_entries()]
286
279
    ['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
 
 
293
280
    """
294
281
    def __init__(self):
295
282
        """Create or read an inventory.
411
398
        To add  a file to a branch ready to be committed, use Branch.add,
412
399
        which calls this."""
413
400
        if entry.file_id in self._byid:
414
 
            bailout("inventory already contains entry with id {%s}" % entry.file_id)
 
401
            raise BzrError("inventory already contains entry with id {%s}" % entry.file_id)
415
402
 
416
403
        try:
417
404
            parent = self._byid[entry.parent_id]
418
405
        except KeyError:
419
 
            bailout("parent_id {%s} not in inventory" % entry.parent_id)
 
406
            raise BzrError("parent_id {%s} not in inventory" % entry.parent_id)
420
407
 
421
408
        if parent.children.has_key(entry.name):
422
 
            bailout("%s is already versioned" %
 
409
            raise BzrError("%s is already versioned" %
423
410
                    appendpath(self.id2path(parent.file_id), entry.name))
424
411
 
425
412
        self._byid[entry.file_id] = entry
430
417
        """Add entry from a path.
431
418
 
432
419
        The immediate parent must already be versioned"""
 
420
        from bzrlib.errors import NotVersionedError
 
421
        
433
422
        parts = bzrlib.osutils.splitpath(relpath)
434
423
        if len(parts) == 0:
435
 
            bailout("cannot re-add root of inventory")
 
424
            raise BzrError("cannot re-add root of inventory")
436
425
 
437
426
        if file_id == None:
438
 
            file_id = bzrlib.branch.gen_file_id(relpath)
439
 
 
440
 
        parent_id = self.path2id(parts[:-1])
441
 
        assert parent_id != None
 
427
            from bzrlib.branch import gen_file_id
 
428
            file_id = gen_file_id(relpath)
 
429
 
 
430
        parent_path = parts[:-1]
 
431
        parent_id = self.path2id(parent_path)
 
432
        if parent_id == None:
 
433
            raise NotVersionedError(parent_path)
 
434
 
442
435
        ie = InventoryEntry(file_id, parts[-1],
443
436
                            kind=kind, parent_id=parent_id)
444
437
        return self.add(ie)
472
465
 
473
466
    def to_element(self):
474
467
        """Convert to XML Element"""
 
468
        from bzrlib.xml import Element
 
469
        
475
470
        e = Element('inventory')
476
471
        e.text = '\n'
477
472
        for path, ie in self.iter_entries():
481
476
 
482
477
    def from_element(cls, elt):
483
478
        """Construct from XML Element
484
 
 
 
479
        
485
480
        >>> inv = Inventory()
486
481
        >>> inv.add(InventoryEntry('foo.c-123981239', 'foo.c', 'file', ROOT_ID))
487
482
        >>> elt = inv.to_element()
489
484
        >>> inv2 == inv
490
485
        True
491
486
        """
 
487
        # XXXX: doctest doesn't run this properly under python2.3
492
488
        assert elt.tag == 'inventory'
493
489
        o = cls()
494
490
        for e in elt:
544
540
            try:
545
541
                ie = self._byid[file_id]
546
542
            except KeyError:
547
 
                bailout("file_id {%s} not found in inventory" % file_id)
 
543
                raise BzrError("file_id {%s} not found in inventory" % file_id)
548
544
            p.insert(0, ie.file_id)
549
545
            file_id = ie.parent_id
550
546
        return p
604
600
 
605
601
        This does not move the working file."""
606
602
        if not is_valid_name(new_name):
607
 
            bailout("not an acceptable filename: %r" % new_name)
 
603
            raise BzrError("not an acceptable filename: %r" % new_name)
608
604
 
609
605
        new_parent = self._byid[new_parent_id]
610
606
        if new_name in new_parent.children:
611
 
            bailout("%r already exists in %r" % (new_name, self.id2path(new_parent_id)))
 
607
            raise BzrError("%r already exists in %r" % (new_name, self.id2path(new_parent_id)))
612
608
 
613
609
        new_parent_idpath = self.get_idpath(new_parent_id)
614
610
        if file_id in new_parent_idpath:
615
 
            bailout("cannot move directory %r into a subdirectory of itself, %r"
 
611
            raise BzrError("cannot move directory %r into a subdirectory of itself, %r"
616
612
                    % (self.id2path(file_id), self.id2path(new_parent_id)))
617
613
 
618
614
        file_ie = self._byid[file_id]