~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/inventory.py

  • Committer: Martin Pool
  • Date: 2005-06-10 06:34:26 UTC
  • Revision ID: mbp@sourcefrog.net-20050610063426-cfcf5c0f96c271ec
- split out updated progress indicator

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