~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/inventory.py

  • Committer: Martin Pool
  • Date: 2005-05-16 02:19:13 UTC
  • Revision ID: mbp@sourcefrog.net-20050516021913-3a933f871079e3fe
- patch from ddaa to create api/ directory 
  before building API docs

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':
149
145
                               self.parent_id, text_id=self.text_id)
150
146
        other.text_sha1 = self.text_sha1
151
147
        other.text_size = self.text_size
 
148
        # note that children are *not* copied; they're pulled across when
 
149
        # others are added
152
150
        return other
153
151
 
154
152
 
290
288
    </inventory>
291
289
 
292
290
    """
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
291
    def __init__(self):
310
292
        """Create or read an inventory.
311
293
 
391
373
        >>> inv['123123'].name
392
374
        'hello.c'
393
375
        """
394
 
        if file_id == None:
395
 
            raise BzrError("can't look up file_id None")
396
 
            
397
376
        try:
398
377
            return self._byid[file_id]
399
378
        except KeyError:
400
 
            raise BzrError("file_id {%s} not in inventory" % file_id)
401
 
 
 
379
            if file_id == None:
 
380
                raise BzrError("can't look up file_id None")
 
381
            else:
 
382
                raise BzrError("file_id {%s} not in inventory" % file_id)
 
383
 
 
384
 
 
385
    def get_file_kind(self, file_id):
 
386
        return self._byid[file_id].kind
402
387
 
403
388
    def get_child(self, parent_id, filename):
404
389
        return self[parent_id].children.get(filename)