~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/inventory.py

  • Committer: Martin Pool
  • Date: 2005-05-10 06:21:52 UTC
  • Revision ID: mbp@sourcefrog.net-20050510062152-41db56a62921b23a
- Always call it 'statcache' not 'work cache'.

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"
32
29
    from elementtree.ElementTree import Element, ElementTree, SubElement
33
30
 
34
31
from xml import XMLMixin
35
 
from errors import bailout, BzrError
 
32
from errors import bailout, BzrError, BzrCheckError
36
33
 
37
34
import bzrlib
38
35
from bzrlib.osutils import uuid, quotefn, splitpath, joinpath, appendpath
101
98
 
102
99
    # TODO: split InventoryEntry into subclasses for files,
103
100
    # 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
 
        BzrError: ("InventoryEntry name is not a simple filename: 'src/hello.c'", [])
 
118
        BzrCheckError: InventoryEntry name 'src/hello.c' is invalid
119
119
        """
120
 
        
121
 
        if len(splitpath(name)) != 1:
122
 
            bailout('InventoryEntry name is not a simple filename: %r'
123
 
                    % name)
 
120
        if '/' in name or '\\' in name:
 
121
            raise BzrCheckError('InventoryEntry name %r is invalid' % name)
124
122
        
125
123
        self.file_id = file_id
126
124
        self.name = name
127
125
        self.kind = kind
128
126
        self.text_id = text_id
129
127
        self.parent_id = parent_id
130
 
        self.text_sha1 = None
131
 
        self.text_size = None
132
128
        if kind == 'directory':
133
129
            self.children = {}
134
130
        elif kind == 'file':
290
286
    </inventory>
291
287
 
292
288
    """
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
289
    def __init__(self):
310
290
        """Create or read an inventory.
311
291
 
391
371
        >>> inv['123123'].name
392
372
        'hello.c'
393
373
        """
394
 
        if file_id == None:
395
 
            raise BzrError("can't look up file_id None")
396
 
            
397
374
        try:
398
375
            return self._byid[file_id]
399
376
        except KeyError:
400
 
            raise BzrError("file_id {%s} not in inventory" % file_id)
 
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)
401
381
 
402
382
 
403
383
    def get_child(self, parent_id, filename):