~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/inventory.py

  • Committer: Martin Pool
  • Date: 2005-05-17 07:01:47 UTC
  • Revision ID: mbp@sourcefrog.net-20050517070147-c38da17418ea6711
- Add patch to give symlink support

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
24
25
 
25
26
try:
26
27
    from cElementTree import Element, ElementTree, SubElement
210
211
 
211
212
    from_element = classmethod(from_element)
212
213
 
213
 
    def __eq__(self, other):
 
214
    def __cmp__(self, other):
 
215
        if self is other:
 
216
            return 0
214
217
        if not isinstance(other, InventoryEntry):
215
218
            return NotImplemented
216
219
 
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')
 
220
        return cmp(self.file_id, other.file_id) \
 
221
               or cmp(self.name, other.name) \
 
222
               or cmp(self.text_sha1, other.text_sha1) \
 
223
               or cmp(self.text_size, other.text_size) \
 
224
               or cmp(self.text_id, other.text_id) \
 
225
               or cmp(self.parent_id, other.parent_id) \
 
226
               or cmp(self.kind, other.kind)
231
227
 
232
228
 
233
229
 
239
235
        self.parent_id = None
240
236
        self.name = ''
241
237
 
242
 
    def __eq__(self, other):
 
238
    def __cmp__(self, other):
 
239
        if self is other:
 
240
            return 0
243
241
        if not isinstance(other, RootEntry):
244
242
            return NotImplemented
245
 
        
246
 
        return (self.file_id == other.file_id) \
247
 
               and (self.children == other.children)
 
243
        return cmp(self.file_id, other.file_id) \
 
244
               or cmp(self.children, other.children)
248
245
 
249
246
 
250
247
 
329
326
            if ie.kind == 'directory':
330
327
                for cn, cie in self.iter_entries(from_dir=ie.file_id):
331
328
                    yield os.path.join(name, cn), cie
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.
 
329
                    
 
330
 
 
331
 
 
332
    def directories(self):
 
333
        """Return (path, entry) pairs for all directories.
338
334
        """
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))
 
335
        def descend(parent_ie):
 
336
            parent_name = parent_ie.name
 
337
            yield parent_name, parent_ie
 
338
 
 
339
            # directory children in sorted order
 
340
            dn = []
 
341
            for ie in parent_ie.children.itervalues():
346
342
                if ie.kind == 'directory':
347
 
                    descend(ie, child_path)
348
 
 
349
 
        descend(self.root, '')
350
 
        return accum
351
 
 
352
 
 
353
 
    def directories(self):
354
 
        """Return (path, entry) pairs for all directories, including the root.
355
 
        """
356
 
        accum = []
357
 
        def descend(parent_ie, parent_path):
358
 
            accum.append((parent_path, parent_ie))
 
343
                    dn.append((ie.name, ie))
 
344
            dn.sort()
359
345
            
360
 
            kids = [(ie.name, ie) for ie in parent_ie.children.itervalues() if ie.kind == 'directory']
361
 
            kids.sort()
 
346
            for name, child_ie in dn:
 
347
                for sub_name, sub_ie in descend(child_ie):
 
348
                    yield appendpath(parent_name, sub_name), sub_ie
362
349
 
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
        for name, ie in descend(self.root):
 
351
            yield name, ie
368
352
        
369
353
 
370
354
 
470
454
        del self[ie.parent_id].children[ie.name]
471
455
 
472
456
 
 
457
    def id_set(self):
 
458
        return Set(self._byid)
 
459
 
 
460
 
473
461
    def to_element(self):
474
462
        """Convert to XML Element"""
475
463
        e = Element('inventory')
498
486
    from_element = classmethod(from_element)
499
487
 
500
488
 
501
 
    def __eq__(self, other):
 
489
    def __cmp__(self, other):
502
490
        """Compare two sets by comparing their contents.
503
491
 
504
492
        >>> i1 = Inventory()
512
500
        >>> i1 == i2
513
501
        True
514
502
        """
 
503
        if self is other:
 
504
            return 0
 
505
        
515
506
        if not isinstance(other, Inventory):
516
507
            return NotImplemented
517
508
 
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
 
 
 
509
        if self.id_set() ^ other.id_set():
 
510
            return 1
 
511
 
 
512
        for file_id in self._byid:
 
513
            c = cmp(self[file_id], other[file_id])
 
514
            if c: return c
 
515
 
 
516
        return 0
532
517
 
533
518
 
534
519
    def get_idpath(self, file_id):