~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/check.py

  • Committer: mbp at sourcefrog
  • Date: 2005-04-09 06:21:44 UTC
  • Revision ID: mbp@sourcefrog.net-20050409062144-e47a4b64106e4c21af99beaf
debugĀ output

Show diffs side-by-side

added added

removed removed

Lines of Context:
20
20
######################################################################
21
21
# consistency checks
22
22
 
23
 
 
 
23
import sys
24
24
from sets import Set
25
25
 
26
 
import bzrlib
27
26
from trace import mutter
28
27
from errors import bailout
29
 
 
30
 
 
31
 
def check(branch):
32
 
    mutter('checking tree %r' % branch.base)
33
 
 
34
 
    mutter('checking revision history')
 
28
import osutils
 
29
 
 
30
def check(branch, progress=True):
 
31
    out = sys.stdout
 
32
 
 
33
    if progress:
 
34
        def p(m):
 
35
            mutter('checking ' + m)
 
36
            out.write('\rchecking: %-50.50s' % m)
 
37
            out.flush()
 
38
    else:
 
39
        def p(m):
 
40
            mutter('checking ' + m)
 
41
 
 
42
    p('history of %r' % branch.base)
35
43
    last_ptr = None
36
44
    checked_revs = Set()
37
 
    for rid in branch.revision_history():
 
45
    
 
46
    history = branch.revision_history()
 
47
    revno = 0
 
48
    revcount = len(history)
 
49
 
 
50
    checked_texts = {}
 
51
    
 
52
    for rid in history:
 
53
        revno += 1
 
54
        p('revision %d/%d' % (revno, revcount))
38
55
        mutter('    revision {%s}' % rid)
39
56
        rev = branch.get_revision(rid)
40
57
        if rev.revision_id != rid:
49
66
        ## TODO: Check all the required fields are present on the revision.
50
67
 
51
68
        inv = branch.get_inventory(rev.inventory_id)
52
 
        check_inventory(branch, inv)
53
 
 
54
 
    mutter('branch %s is OK' % branch.base)
55
 
 
56
 
 
57
 
 
58
 
def check_inventory(branch, inv):
59
 
    seen_ids = Set()
60
 
    seen_names = Set()
61
 
 
62
 
    for path, ie in inv.iter_entries():
63
 
        if path in seen_names:
64
 
            bailout('duplicated path %r in inventory' % path)
65
 
        seen_names.add(path)
66
 
        if ie.kind == 'file':
67
 
            if not ie.text_id in branch.text_store:
68
 
                bailout('text {%s} not in text_store' % ie.text_id)
69
 
        
 
69
        seen_ids = Set()
 
70
        seen_names = Set()
 
71
 
 
72
        p('revision %d/%d file ids' % (revno, revcount))
 
73
        for file_id in inv:
 
74
            if file_id in seen_ids:
 
75
                bailout('duplicated file_id {%s} in inventory for revision {%s}'
 
76
                        % (file_id, rid))
 
77
            seen_ids.add(file_id)
 
78
 
 
79
        i = 0
 
80
        len_inv = len(inv)
 
81
        for file_id in inv:
 
82
            i += 1
 
83
            if (i % 100) == 0:
 
84
                p('revision %d/%d file text %d/%d' % (revno, revcount, i, len_inv))
 
85
 
 
86
            ie = inv[file_id]
 
87
 
 
88
            if ie.parent_id != None:
 
89
                if ie.parent_id not in seen_ids:
 
90
                    bailout('missing parent {%s} in inventory for revision {%s}'
 
91
                            % (ie.parent_id, rid))
 
92
 
 
93
            if ie.kind == 'file':
 
94
                if ie.text_id in checked_texts:
 
95
                    fp = checked_texts[ie.text_id]
 
96
                else:
 
97
                    if not ie.text_id in branch.text_store:
 
98
                        bailout('text {%s} not in text_store' % ie.text_id)
 
99
 
 
100
                    tf = branch.text_store[ie.text_id]
 
101
                    fp = osutils.fingerprint_file(tf)
 
102
                    checked_texts[ie.text_id] = fp
 
103
 
 
104
                if ie.text_size != fp['size']:
 
105
                    bailout('text {%s} wrong size' % ie.text_id)
 
106
                if ie.text_sha1 != fp['sha1']:
 
107
                    bailout('text {%s} wrong sha1' % ie.text_id)
 
108
            elif ie.kind == 'directory':
 
109
                if ie.text_sha1 != None or ie.text_size != None or ie.text_id != None:
 
110
                    bailout('directory {%s} has text in revision {%s}'
 
111
                            % (file_id, rid))
 
112
 
 
113
        p('revision %d/%d file paths' % (revno, revcount))
 
114
        for path, ie in inv.iter_entries():
 
115
            if path in seen_names:
 
116
                bailout('duplicated path %r in inventory for revision {%s}' % (path, revid))
 
117
            seen_names.add(path)
 
118
 
 
119
 
 
120
    p('done')
 
121
    if progress:
 
122
        print 
 
123
 
 
124