~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/inventory.py

  • Committer: Martin Pool
  • Date: 2005-05-27 05:23:57 UTC
  • Revision ID: mbp@sourcefrog.net-20050527052357-240127f785aa3d60
- start to move toward Branch.lock and unlock methods, 
  rather than setting it in the constructor

Show diffs side-by-side

added added

removed removed

Lines of Context:
21
21
 
22
22
 
23
23
import sys, os.path, types, re
24
 
from sets import Set
25
24
 
26
25
try:
27
26
    from cElementTree import Element, ElementTree, SubElement
145
144
                               self.parent_id, text_id=self.text_id)
146
145
        other.text_sha1 = self.text_sha1
147
146
        other.text_size = self.text_size
 
147
        # note that children are *not* copied; they're pulled across when
 
148
        # others are added
148
149
        return other
149
150
 
150
151
 
209
210
 
210
211
    from_element = classmethod(from_element)
211
212
 
212
 
    def __cmp__(self, other):
213
 
        if self is other:
214
 
            return 0
 
213
    def __eq__(self, other):
215
214
        if not isinstance(other, InventoryEntry):
216
215
            return NotImplemented
217
216
 
218
 
        return cmp(self.file_id, other.file_id) \
219
 
               or cmp(self.name, other.name) \
220
 
               or cmp(self.text_sha1, other.text_sha1) \
221
 
               or cmp(self.text_size, other.text_size) \
222
 
               or cmp(self.text_id, other.text_id) \
223
 
               or cmp(self.parent_id, other.parent_id) \
224
 
               or cmp(self.kind, other.kind)
 
217
        return (self.file_id == other.file_id) \
 
218
               and (self.name == other.name) \
 
219
               and (self.text_sha1 == other.text_sha1) \
 
220
               and (self.text_size == other.text_size) \
 
221
               and (self.text_id == other.text_id) \
 
222
               and (self.parent_id == other.parent_id) \
 
223
               and (self.kind == other.kind)
 
224
 
 
225
 
 
226
    def __ne__(self, other):
 
227
        return not (self == other)
 
228
 
 
229
    def __hash__(self):
 
230
        raise ValueError('not hashable')
225
231
 
226
232
 
227
233
 
233
239
        self.parent_id = None
234
240
        self.name = ''
235
241
 
236
 
    def __cmp__(self, other):
237
 
        if self is other:
238
 
            return 0
 
242
    def __eq__(self, other):
239
243
        if not isinstance(other, RootEntry):
240
244
            return NotImplemented
241
 
        return cmp(self.file_id, other.file_id) \
242
 
               or cmp(self.children, other.children)
 
245
        
 
246
        return (self.file_id == other.file_id) \
 
247
               and (self.children == other.children)
243
248
 
244
249
 
245
250
 
324
329
            if ie.kind == 'directory':
325
330
                for cn, cie in self.iter_entries(from_dir=ie.file_id):
326
331
                    yield os.path.join(name, cn), cie
327
 
                    
 
332
 
 
333
 
 
334
    def entries(self):
 
335
        """Return list of (path, ie) for all entries except the root.
 
336
 
 
337
        This may be faster than iter_entries.
 
338
        """
 
339
        accum = []
 
340
        def descend(dir_ie, dir_path):
 
341
            kids = dir_ie.children.items()
 
342
            kids.sort()
 
343
            for name, ie in kids:
 
344
                child_path = os.path.join(dir_path, name)
 
345
                accum.append((child_path, ie))
 
346
                if ie.kind == 'directory':
 
347
                    descend(ie, child_path)
 
348
 
 
349
        descend(self.root, '')
 
350
        return accum
328
351
 
329
352
 
330
353
    def directories(self):
331
 
        """Return (path, entry) pairs for all directories.
 
354
        """Return (path, entry) pairs for all directories, including the root.
332
355
        """
333
 
        def descend(parent_ie):
334
 
            parent_name = parent_ie.name
335
 
            yield parent_name, parent_ie
336
 
 
337
 
            # directory children in sorted order
338
 
            dn = []
339
 
            for ie in parent_ie.children.itervalues():
340
 
                if ie.kind == 'directory':
341
 
                    dn.append((ie.name, ie))
342
 
            dn.sort()
 
356
        accum = []
 
357
        def descend(parent_ie, parent_path):
 
358
            accum.append((parent_path, parent_ie))
343
359
            
344
 
            for name, child_ie in dn:
345
 
                for sub_name, sub_ie in descend(child_ie):
346
 
                    yield appendpath(parent_name, sub_name), sub_ie
 
360
            kids = [(ie.name, ie) for ie in parent_ie.children.itervalues() if ie.kind == 'directory']
 
361
            kids.sort()
347
362
 
348
 
        for name, ie in descend(self.root):
349
 
            yield name, ie
 
363
            for name, child_ie in kids:
 
364
                child_path = os.path.join(parent_path, name)
 
365
                descend(child_ie, child_path)
 
366
        descend(self.root, '')
 
367
        return accum
350
368
        
351
369
 
352
370
 
380
398
                raise BzrError("file_id {%s} not in inventory" % file_id)
381
399
 
382
400
 
 
401
    def get_file_kind(self, file_id):
 
402
        return self._byid[file_id].kind
 
403
 
383
404
    def get_child(self, parent_id, filename):
384
405
        return self[parent_id].children.get(filename)
385
406
 
449
470
        del self[ie.parent_id].children[ie.name]
450
471
 
451
472
 
452
 
    def id_set(self):
453
 
        return Set(self._byid)
454
 
 
455
 
 
456
473
    def to_element(self):
457
474
        """Convert to XML Element"""
458
475
        e = Element('inventory')
481
498
    from_element = classmethod(from_element)
482
499
 
483
500
 
484
 
    def __cmp__(self, other):
 
501
    def __eq__(self, other):
485
502
        """Compare two sets by comparing their contents.
486
503
 
487
504
        >>> i1 = Inventory()
495
512
        >>> i1 == i2
496
513
        True
497
514
        """
498
 
        if self is other:
499
 
            return 0
500
 
        
501
515
        if not isinstance(other, Inventory):
502
516
            return NotImplemented
503
517
 
504
 
        if self.id_set() ^ other.id_set():
505
 
            return 1
506
 
 
507
 
        for file_id in self._byid:
508
 
            c = cmp(self[file_id], other[file_id])
509
 
            if c: return c
510
 
 
511
 
        return 0
 
518
        if len(self._byid) != len(other._byid):
 
519
            # shortcut: obviously not the same
 
520
            return False
 
521
 
 
522
        return self._byid == other._byid
 
523
 
 
524
 
 
525
    def __ne__(self, other):
 
526
        return not (self == other)
 
527
 
 
528
 
 
529
    def __hash__(self):
 
530
        raise ValueError('not hashable')
 
531
 
512
532
 
513
533
 
514
534
    def get_idpath(self, file_id):