~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/inventory.py

  • Committer: Martin Pool
  • Date: 2005-05-19 09:59:49 UTC
  • Revision ID: mbp@sourcefrog.net-20050519095949-2aaed7613265e594
- More cleanups for set type

- Clean up Inventory cmp method

- Remove the Inventory.id_set and Tree.id_set methods: don't built
  sets when just using the dictionaries will do.

Show diffs side-by-side

added added

removed removed

Lines of Context:
15
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
16
 
17
17
 
18
 
# TODO: Maybe store inventory_id in the file?  Not really needed.
19
 
 
20
 
 
21
18
# This should really be an id randomly assigned when the tree is
22
19
# created, but it's not for now.
23
20
ROOT_ID = "TREE_ROOT"
24
21
 
25
22
 
26
23
import sys, os.path, types, re
27
 
from sets import Set
28
24
 
29
25
try:
30
26
    from cElementTree import Element, ElementTree, SubElement
32
28
    from elementtree.ElementTree import Element, ElementTree, SubElement
33
29
 
34
30
from xml import XMLMixin
35
 
from errors import bailout, BzrError
 
31
from errors import bailout, BzrError, BzrCheckError
36
32
 
37
33
import bzrlib
38
34
from bzrlib.osutils import uuid, quotefn, splitpath, joinpath, appendpath
101
97
 
102
98
    # TODO: split InventoryEntry into subclasses for files,
103
99
    # directories, etc etc.
 
100
 
 
101
    text_sha1 = None
 
102
    text_size = None
104
103
    
105
104
    def __init__(self, file_id, name, kind, parent_id, text_id=None):
106
105
        """Create an InventoryEntry
115
114
        '123'
116
115
        >>> e = InventoryEntry('123', 'src/hello.c', 'file', ROOT_ID)
117
116
        Traceback (most recent call last):
118
 
        BzrError: ("InventoryEntry name is not a simple filename: 'src/hello.c'", [])
 
117
        BzrCheckError: InventoryEntry name 'src/hello.c' is invalid
119
118
        """
120
 
        
121
 
        if len(splitpath(name)) != 1:
122
 
            bailout('InventoryEntry name is not a simple filename: %r'
123
 
                    % name)
 
119
        if '/' in name or '\\' in name:
 
120
            raise BzrCheckError('InventoryEntry name %r is invalid' % name)
124
121
        
125
122
        self.file_id = file_id
126
123
        self.name = name
127
124
        self.kind = kind
128
125
        self.text_id = text_id
129
126
        self.parent_id = parent_id
130
 
        self.text_sha1 = None
131
 
        self.text_size = None
132
127
        if kind == 'directory':
133
128
            self.children = {}
134
129
        elif kind == 'file':
149
144
                               self.parent_id, text_id=self.text_id)
150
145
        other.text_sha1 = self.text_sha1
151
146
        other.text_size = self.text_size
 
147
        # note that children are *not* copied; they're pulled across when
 
148
        # others are added
152
149
        return other
153
150
 
154
151
 
290
287
    </inventory>
291
288
 
292
289
    """
293
 
 
294
 
    ## TODO: Make sure only canonical filenames are stored.
295
 
 
296
 
    ## TODO: Do something sensible about the possible collisions on
297
 
    ## case-losing filesystems.  Perhaps we should just always forbid
298
 
    ## such collisions.
299
 
 
300
 
    ## TODO: No special cases for root, rather just give it a file id
301
 
    ## like everything else.
302
 
 
303
 
    ## TODO: Probably change XML serialization to use nesting rather
304
 
    ## than parent_id pointers.
305
 
 
306
 
    ## TODO: Perhaps hold the ElementTree in memory and work directly
307
 
    ## on that rather than converting into Python objects every time?
308
 
 
309
290
    def __init__(self):
310
291
        """Create or read an inventory.
311
292
 
391
372
        >>> inv['123123'].name
392
373
        'hello.c'
393
374
        """
394
 
        if file_id == None:
395
 
            raise BzrError("can't look up file_id None")
396
 
            
397
375
        try:
398
376
            return self._byid[file_id]
399
377
        except KeyError:
400
 
            raise BzrError("file_id {%s} not in inventory" % file_id)
401
 
 
 
378
            if file_id == None:
 
379
                raise BzrError("can't look up file_id None")
 
380
            else:
 
381
                raise BzrError("file_id {%s} not in inventory" % file_id)
 
382
 
 
383
 
 
384
    def get_file_kind(self, file_id):
 
385
        return self._byid[file_id].kind
402
386
 
403
387
    def get_child(self, parent_id, filename):
404
388
        return self[parent_id].children.get(filename)
469
453
        del self[ie.parent_id].children[ie.name]
470
454
 
471
455
 
472
 
    def id_set(self):
473
 
        return Set(self._byid)
474
 
 
475
 
 
476
456
    def to_element(self):
477
457
        """Convert to XML Element"""
478
458
        e = Element('inventory')
521
501
        if not isinstance(other, Inventory):
522
502
            return NotImplemented
523
503
 
524
 
        if self.id_set() ^ other.id_set():
525
 
            return 1
 
504
        byid = self._byid
 
505
        otherids = other._byid
526
506
 
527
 
        for file_id in self._byid:
528
 
            c = cmp(self[file_id], other[file_id])
 
507
        if len(byid) != len(otherids):
 
508
            # shortcut: obviously not the same
 
509
            return 1                    
 
510
        
 
511
        for file_id in byid:
 
512
            if file_id not in otherids:
 
513
                return 1
 
514
            
 
515
            c = cmp(byid[file_id], otherids[file_id])
529
516
            if c: return c
530
517
 
 
518
        for file_id in otherids:
 
519
            if file_id not in byid:
 
520
                return 1
 
521
 
531
522
        return 0
532
523
 
533
524