/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/inventory.py

  • Committer: Martin Pool
  • Date: 2005-09-05 09:27:11 UTC
  • Revision ID: mbp@sourcefrog.net-20050905092711-f9f5bded3fd82605
- more disentangling of xml storage format from objects

- remove pack_xml and unpack_xml function in favor of 
  serializer object

- test unpacking canned revision xml

Show diffs side-by-side

added added

removed removed

Lines of Context:
55
55
    >>> i.path2id('')
56
56
    'TREE_ROOT'
57
57
    >>> i.add(InventoryEntry('123', 'src', 'directory', ROOT_ID))
 
58
    InventoryEntry('123', 'src', kind='directory', parent_id='TREE_ROOT')
58
59
    >>> i.add(InventoryEntry('2323', 'hello.c', 'file', parent_id='123'))
 
60
    InventoryEntry('2323', 'hello.c', kind='file', parent_id='123')
59
61
    >>> for j in i.iter_entries():
60
62
    ...   print j
61
63
    ... 
66
68
    ...
67
69
    BzrError: inventory already contains entry with id {2323}
68
70
    >>> i.add(InventoryEntry('2324', 'bye.c', 'file', '123'))
 
71
    InventoryEntry('2324', 'bye.c', kind='file', parent_id='123')
69
72
    >>> i.add(InventoryEntry('2325', 'wibble', 'directory', '123'))
 
73
    InventoryEntry('2325', 'wibble', kind='directory', parent_id='123')
70
74
    >>> i.path2id('src/wibble')
71
75
    '2325'
72
76
    >>> '2325' in i
73
77
    True
74
78
    >>> i.add(InventoryEntry('2326', 'wibble.c', 'file', '2325'))
 
79
    InventoryEntry('2326', 'wibble.c', kind='file', parent_id='2325')
75
80
    >>> i['2326']
76
81
    InventoryEntry('2326', 'wibble.c', kind='file', parent_id='2325')
77
82
    >>> for j in i.iter_entries():
157
162
                   self.parent_id))
158
163
 
159
164
    
160
 
    def to_element(self):
161
 
        """Convert to XML element"""
162
 
        from bzrlib.xml import Element
163
 
        
164
 
        e = Element('entry')
165
 
 
166
 
        e.set('name', self.name)
167
 
        e.set('file_id', self.file_id)
168
 
        e.set('kind', self.kind)
169
 
 
170
 
        if self.text_size != None:
171
 
            e.set('text_size', '%d' % self.text_size)
172
 
            
173
 
        for f in ['text_id', 'text_sha1']:
174
 
            v = getattr(self, f)
175
 
            if v != None:
176
 
                e.set(f, v)
177
 
 
178
 
        # to be conservative, we don't externalize the root pointers
179
 
        # for now, leaving them as null in the xml form.  in a future
180
 
        # version it will be implied by nested elements.
181
 
        if self.parent_id != ROOT_ID:
182
 
            assert isinstance(self.parent_id, basestring)
183
 
            e.set('parent_id', self.parent_id)
184
 
 
185
 
        e.tail = '\n'
186
 
            
187
 
        return e
188
 
 
189
 
 
190
 
    def from_element(cls, elt):
191
 
        assert elt.tag == 'entry'
192
 
 
193
 
        ## original format inventories don't have a parent_id for
194
 
        ## nodes in the root directory, but it's cleaner to use one
195
 
        ## internally.
196
 
        parent_id = elt.get('parent_id')
197
 
        if parent_id == None:
198
 
            parent_id = ROOT_ID
199
 
 
200
 
        self = cls(elt.get('file_id'), elt.get('name'), elt.get('kind'), parent_id)
201
 
        self.text_id = elt.get('text_id')
202
 
        self.text_sha1 = elt.get('text_sha1')
203
 
        
204
 
        ## mutter("read inventoryentry: %r" % (elt.attrib))
205
 
 
206
 
        v = elt.get('text_size')
207
 
        self.text_size = v and int(v)
208
 
 
209
 
        return self
210
 
            
211
 
 
212
 
    from_element = classmethod(from_element)
213
 
 
214
165
    def __eq__(self, other):
215
166
        if not isinstance(other, InventoryEntry):
216
167
            return NotImplemented
268
219
 
269
220
    >>> inv = Inventory()
270
221
    >>> inv.add(InventoryEntry('123-123', 'hello.c', 'file', ROOT_ID))
 
222
    InventoryEntry('123-123', 'hello.c', kind='file', parent_id='TREE_ROOT')
271
223
    >>> inv['123-123'].name
272
224
    'hello.c'
273
225
 
284
236
    ['hello.c']
285
237
    >>> inv = Inventory('TREE_ROOT-12345678-12345678')
286
238
    >>> inv.add(InventoryEntry('123-123', 'hello.c', 'file', ROOT_ID))
 
239
    InventoryEntry('123-123', 'hello.c', kind='file', parent_id='TREE_ROOT-12345678-12345678')
287
240
    """
288
241
    def __init__(self, root_id=ROOT_ID):
289
242
        """Create or read an inventory.
371
324
 
372
325
        >>> inv = Inventory()
373
326
        >>> inv.add(InventoryEntry('123', 'foo.c', 'file', ROOT_ID))
 
327
        InventoryEntry('123', 'foo.c', kind='file', parent_id='TREE_ROOT')
374
328
        >>> '123' in inv
375
329
        True
376
330
        >>> '456' in inv
384
338
 
385
339
        >>> inv = Inventory()
386
340
        >>> inv.add(InventoryEntry('123123', 'hello.c', 'file', ROOT_ID))
 
341
        InventoryEntry('123123', 'hello.c', kind='file', parent_id='TREE_ROOT')
387
342
        >>> inv['123123'].name
388
343
        'hello.c'
389
344
        """
407
362
        """Add entry to inventory.
408
363
 
409
364
        To add  a file to a branch ready to be committed, use Branch.add,
410
 
        which calls this."""
 
365
        which calls this.
 
366
 
 
367
        Returns the new entry object.
 
368
        """
411
369
        if entry.file_id in self._byid:
412
370
            raise BzrError("inventory already contains entry with id {%s}" % entry.file_id)
413
371
 
425
383
 
426
384
        self._byid[entry.file_id] = entry
427
385
        parent.children[entry.name] = entry
 
386
        return entry
428
387
 
429
388
 
430
389
    def add_path(self, relpath, kind, file_id=None):
431
390
        """Add entry from a path.
432
391
 
433
 
        The immediate parent must already be versioned"""
 
392
        The immediate parent must already be versioned.
 
393
 
 
394
        Returns the new entry object."""
434
395
        from bzrlib.branch import gen_file_id
435
396
        
436
397
        parts = bzrlib.osutils.splitpath(relpath)
455
416
 
456
417
        >>> inv = Inventory()
457
418
        >>> inv.add(InventoryEntry('123', 'foo.c', 'file', ROOT_ID))
 
419
        InventoryEntry('123', 'foo.c', kind='file', parent_id='TREE_ROOT')
458
420
        >>> '123' in inv
459
421
        True
460
422
        >>> del inv['123']
476
438
        del self[ie.parent_id].children[ie.name]
477
439
 
478
440
 
479
 
    def to_element(self):
480
 
        """Convert to XML Element"""
481
 
        from bzrlib.xml import Element
482
 
        
483
 
        e = Element('inventory')
484
 
        e.text = '\n'
485
 
        if self.root.file_id not in (None, ROOT_ID):
486
 
            e.set('file_id', self.root.file_id)
487
 
        for path, ie in self.iter_entries():
488
 
            e.append(ie.to_element())
489
 
        return e
490
 
    
491
 
 
492
 
    def from_element(cls, elt):
493
 
        """Construct from XML Element
494
 
        
495
 
        >>> inv = Inventory()
496
 
        >>> inv.add(InventoryEntry('foo.c-123981239', 'foo.c', 'file', ROOT_ID))
497
 
        >>> elt = inv.to_element()
498
 
        >>> inv2 = Inventory.from_element(elt)
499
 
        >>> inv2 == inv
500
 
        True
501
 
        """
502
 
        # XXXX: doctest doesn't run this properly under python2.3
503
 
        assert elt.tag == 'inventory'
504
 
        root_id = elt.get('file_id') or ROOT_ID
505
 
        o = cls(root_id)
506
 
        for e in elt:
507
 
            ie = InventoryEntry.from_element(e)
508
 
            if ie.parent_id == ROOT_ID:
509
 
                ie.parent_id = root_id
510
 
            o.add(ie)
511
 
        return o
512
 
        
513
 
    from_element = classmethod(from_element)
514
 
 
515
 
 
516
441
    def __eq__(self, other):
517
442
        """Compare two sets by comparing their contents.
518
443
 
521
446
        >>> i1 == i2
522
447
        True
523
448
        >>> i1.add(InventoryEntry('123', 'foo', 'file', ROOT_ID))
 
449
        InventoryEntry('123', 'foo', kind='file', parent_id='TREE_ROOT')
524
450
        >>> i1 == i2
525
451
        False
526
452
        >>> i2.add(InventoryEntry('123', 'foo', 'file', ROOT_ID))
 
453
        InventoryEntry('123', 'foo', kind='file', parent_id='TREE_ROOT')
527
454
        >>> i1 == i2
528
455
        True
529
456
        """
545
472
        raise ValueError('not hashable')
546
473
 
547
474
 
548
 
 
549
475
    def get_idpath(self, file_id):
550
476
        """Return a list of file_ids for the path to an entry.
551
477
 
644
570
 
645
571
 
646
572
 
647
 
_NAME_RE = re.compile(r'^[^/\\]+$')
 
573
_NAME_RE = None
648
574
 
649
575
def is_valid_name(name):
 
576
    global _NAME_RE
 
577
    if _NAME_RE == None:
 
578
        _NAME_RE = re.compile(r'^[^/\\]+$')
 
579
        
650
580
    return bool(_NAME_RE.match(name))