~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/check.py

  • Committer: Martin Pool
  • Date: 2005-06-10 07:13:33 UTC
  • Revision ID: mbp@sourcefrog.net-20050610071333-23ae2f973a1eb0f5
doc

Show diffs side-by-side

added added

removed removed

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