~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/inventory.py

  • Committer: Martin Pool
  • Date: 2005-07-04 07:34:19 UTC
  • Revision ID: mbp@sourcefrog.net-20050704073419-44eb753d5556a4d0
- rename control file to pending-merges

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():
544
539
            try:
545
540
                ie = self._byid[file_id]
546
541
            except KeyError:
547
 
                bailout("file_id {%s} not found in inventory" % file_id)
 
542
                raise BzrError("file_id {%s} not found in inventory" % file_id)
548
543
            p.insert(0, ie.file_id)
549
544
            file_id = ie.parent_id
550
545
        return p
604
599
 
605
600
        This does not move the working file."""
606
601
        if not is_valid_name(new_name):
607
 
            bailout("not an acceptable filename: %r" % new_name)
 
602
            raise BzrError("not an acceptable filename: %r" % new_name)
608
603
 
609
604
        new_parent = self._byid[new_parent_id]
610
605
        if new_name in new_parent.children:
611
 
            bailout("%r already exists in %r" % (new_name, self.id2path(new_parent_id)))
 
606
            raise BzrError("%r already exists in %r" % (new_name, self.id2path(new_parent_id)))
612
607
 
613
608
        new_parent_idpath = self.get_idpath(new_parent_id)
614
609
        if file_id in new_parent_idpath:
615
 
            bailout("cannot move directory %r into a subdirectory of itself, %r"
 
610
            raise BzrError("cannot move directory %r into a subdirectory of itself, %r"
616
611
                    % (self.id2path(file_id), self.id2path(new_parent_id)))
617
612
 
618
613
        file_ie = self._byid[file_id]