~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/workingtree.py

  • Committer: Robert Collins
  • Date: 2006-07-31 04:17:31 UTC
  • mto: (1852.14.2 status-benchmarks)
  • mto: This revision was merged to the branch mainline in revision 2322.
  • Revision ID: robertc@robertcollins.net-20060731041731-5e25624f04900907
Start testing behaviour of unknowns in WorkingTree.walkdirs.

Show diffs side-by-side

added added

removed removed

Lines of Context:
40
40
# memory.  (Now done? -- mbp 20060309)
41
41
 
42
42
from binascii import hexlify
 
43
from bisect import bisect_left
43
44
import collections
44
45
from copy import deepcopy
45
46
from cStringIO import StringIO
46
47
import errno
47
48
import fnmatch
 
49
import itertools
 
50
import operator
48
51
import os
49
52
import re
50
53
import stat
1481
1484
        return conflicts
1482
1485
 
1483
1486
    def walkdirs(self, prefix=""):
 
1487
        inventory_iterator = self._walkdirs(prefix)
 
1488
        disk_top = self.abspath(prefix)
 
1489
        if disk_top.endswith('/'):
 
1490
            disk_top = disk_top[:-1]
 
1491
        top_strip_len = len(disk_top) + 1
 
1492
        disk_iterator = osutils.walkdirs(disk_top, prefix)
 
1493
        current_inv = inventory_iterator.next()
 
1494
        current_disk = disk_iterator.next()
 
1495
        inv_finished = False
 
1496
        disk_finished = False
 
1497
        while not inv_finished or not disk_finished:
 
1498
            if not disk_finished:
 
1499
                # strip out .bzr dirs
 
1500
                if current_disk[0][1][top_strip_len:] == '':
 
1501
                    # osutils.walkdirs can be made nicer - 
 
1502
                    # yield the path-from-prefix rather than the pathjoined
 
1503
                    # value.
 
1504
                    bzrdir_loc = bisect_left(current_disk[1], ('.bzr', '.bzr'))
 
1505
                    if current_disk[1][bzrdir_loc][0] == '.bzr':
 
1506
                        # we dont yield the contents of, or, .bzr itself.
 
1507
                        del current_disk[1][bzrdir_loc]
 
1508
            direction = cmp(current_inv[0][0], current_disk[0][0])
 
1509
            if direction < 0:
 
1510
                # inventory is before disk - unknown.
 
1511
                dirblock = [(relpath, basename, kind, stat, top_path[top_strip_len:], None, None) for relpath, basename, kind, stat, top_path in current_disk[1]]
 
1512
                yield (current_disk[0][0], current_disk[0][1][top_strip_len:], None), dirblock
 
1513
                try:
 
1514
                    current_disk = disk_iterator.next()
 
1515
                except StopIteration:
 
1516
                    disk_finished = True
 
1517
            elif direction > 0:
 
1518
                # disk is before inventory - missing
 
1519
                try:
 
1520
                    current_inv = inventory_iterator.next()
 
1521
                except StopIteration:
 
1522
                    inv_finished = True
 
1523
            else:
 
1524
                # versioned present directory
 
1525
                # merge the inventory and disk data together
 
1526
#                dirblock = [(relpath, basename, kind, stat, top_path, None, None, None) for relpath, basename, kind, stat, top_path in current_disk[1]]
 
1527
#                yield current_inv
 
1528
                dirblock = []
 
1529
                for relpath, subiterator in itertools.groupby(sorted(current_inv[1] + current_disk[1]), operator.itemgetter(1)):
 
1530
                    path_elements = list(subiterator)
 
1531
                    if len(path_elements) == 2:
 
1532
                        # versioned, present file
 
1533
                        dirblock.append((path_elements[0][0], path_elements[0][1], path_elements[1][2], path_elements[1][3], path_elements[0][4], path_elements[0][5], path_elements[0][6]))
 
1534
                    elif len(path_elements[0]) == 5:
 
1535
                        # unknown disk file
 
1536
                        dirblock.append((path_elements[0][0], path_elements[0][1], path_elements[0][2], path_elements[0][3], path_elements[0][4][top_strip_len:], None, None))
 
1537
                yield current_inv[0], dirblock
 
1538
                try:
 
1539
                    current_inv = inventory_iterator.next()
 
1540
                except StopIteration:
 
1541
                    inv_finished = True
 
1542
                try:
 
1543
                    current_disk = disk_iterator.next()
 
1544
                except StopIteration:
 
1545
                    disk_finished = True
 
1546
 
 
1547
        #for dirinfo, dirblock in self._walkdirs(prefix):
 
1548
        #    yield dirinfo, dirblock
 
1549
 
 
1550
    def _walkdirs(self, prefix=""):
1484
1551
        _directory = 'directory'
1485
1552
        pending = [('', '', _directory, None, '', None, None)]
1486
1553
        inv = self.inventory