~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/inventory.py

  • Committer: Martin Pool
  • Date: 2005-05-03 08:00:27 UTC
  • Revision ID: mbp@sourcefrog.net-20050503080027-908edb5b39982198
doc

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
 
18
21
# This should really be an id randomly assigned when the tree is
19
22
# created, but it's not for now.
20
23
ROOT_ID = "TREE_ROOT"
29
32
    from elementtree.ElementTree import Element, ElementTree, SubElement
30
33
 
31
34
from xml import XMLMixin
32
 
from errors import bailout, BzrError, BzrCheckError
 
35
from errors import bailout, BzrError
33
36
 
34
37
import bzrlib
35
38
from bzrlib.osutils import uuid, quotefn, splitpath, joinpath, appendpath
98
101
 
99
102
    # TODO: split InventoryEntry into subclasses for files,
100
103
    # directories, etc etc.
101
 
 
102
 
    text_sha1 = None
103
 
    text_size = None
104
104
    
105
105
    def __init__(self, file_id, name, kind, parent_id, text_id=None):
106
106
        """Create an InventoryEntry
115
115
        '123'
116
116
        >>> e = InventoryEntry('123', 'src/hello.c', 'file', ROOT_ID)
117
117
        Traceback (most recent call last):
118
 
        BzrCheckError: InventoryEntry name 'src/hello.c' is invalid
 
118
        BzrError: ("InventoryEntry name is not a simple filename: 'src/hello.c'", [])
119
119
        """
120
 
        if '/' in name or '\\' in name:
121
 
            raise BzrCheckError('InventoryEntry name %r is invalid' % name)
 
120
        
 
121
        if len(splitpath(name)) != 1:
 
122
            bailout('InventoryEntry name is not a simple filename: %r'
 
123
                    % name)
122
124
        
123
125
        self.file_id = file_id
124
126
        self.name = name
125
127
        self.kind = kind
126
128
        self.text_id = text_id
127
129
        self.parent_id = parent_id
 
130
        self.text_sha1 = None
 
131
        self.text_size = None
128
132
        if kind == 'directory':
129
133
            self.children = {}
130
134
        elif kind == 'file':
286
290
    </inventory>
287
291
 
288
292
    """
 
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
 
289
309
    def __init__(self):
290
310
        """Create or read an inventory.
291
311
 
371
391
        >>> inv['123123'].name
372
392
        'hello.c'
373
393
        """
 
394
        if file_id == None:
 
395
            raise BzrError("can't look up file_id None")
 
396
            
374
397
        try:
375
398
            return self._byid[file_id]
376
399
        except KeyError:
377
 
            if file_id == None:
378
 
                raise BzrError("can't look up file_id None")
379
 
            else:
380
 
                raise BzrError("file_id {%s} not in inventory" % file_id)
 
400
            raise BzrError("file_id {%s} not in inventory" % file_id)
381
401
 
382
402
 
383
403
    def get_child(self, parent_id, filename):