~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/check.py

  • Committer: Martin Pool
  • Date: 2005-07-18 13:12:43 UTC
  • Revision ID: mbp@sourcefrog.net-20050718131243-44532527fd065b31
- update convertinv to work with current weave code

Show diffs side-by-side

added added

removed removed

Lines of Context:
16
16
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17
17
 
18
18
 
19
 
 
 
19
def _update_store_entry(obj, obj_id, branch, store_name, store):
 
20
    """This is just a meta-function, which handles both revision entries
 
21
    and inventory entries.
 
22
    """
 
23
    from bzrlib.trace import mutter
 
24
    import tempfile, os, errno
 
25
    from osutils import rename
 
26
    obj_tmp = tempfile.TemporaryFile()
 
27
    obj.write_xml(obj_tmp)
 
28
    obj_tmp.seek(0)
 
29
 
 
30
    tmpfd, tmp_path = tempfile.mkstemp(prefix=obj_id, suffix='.gz',
 
31
        dir=branch.controlfilename(store_name))
 
32
    os.close(tmpfd)
 
33
    try:
 
34
        orig_obj_path = branch.controlfilename([store_name, obj_id+'.gz'])
 
35
        # Remove the old entry out of the way
 
36
        rename(orig_obj_path, tmp_path)
 
37
        try:
 
38
            # TODO: We may need to handle the case where the old
 
39
            # entry was not compressed (and thus did not end with .gz)
 
40
 
 
41
            store.add(obj_tmp, obj_id) # Add the new one
 
42
            os.remove(tmp_path) # Remove the old name
 
43
            mutter('    Updated %s entry {%s}' % (store_name, obj_id))
 
44
        except:
 
45
            # On any exception, restore the old entry
 
46
            rename(tmp_path, orig_obj_path)
 
47
            raise
 
48
    finally:
 
49
        if os.path.exists(tmp_path):
 
50
            # Unfortunately, the next command might throw
 
51
            # an exception, which will mask a previous exception.
 
52
            os.remove(tmp_path)
 
53
        obj_tmp.close()
 
54
 
 
55
def _update_revision_entry(rev, branch):
 
56
    """After updating the values in a revision, make sure to
 
57
    write out the data, but try to do it in an atomic manner.
 
58
 
 
59
    :param rev:    The Revision object to store
 
60
    :param branch: The Branch object where this Revision is to be stored.
 
61
    """
 
62
    _update_store_entry(rev, rev.revision_id, branch,
 
63
            'revision-store', branch.revision_store)
 
64
 
 
65
def _update_inventory_entry(inv, inv_id, branch):
 
66
    """When an inventory has been modified (such as by adding a unique tree root)
 
67
    this atomically re-generates the file.
 
68
 
 
69
    :param inv:     The Inventory
 
70
    :param inv_id:  The inventory id for this inventory
 
71
    :param branch:  The Branch where this entry will be stored.
 
72
    """
 
73
    _update_store_entry(inv, inv_id, branch,
 
74
            'inventory-store', branch.inventory_store)
20
75
 
21
76
def check(branch):
22
77
    """Run consistency checks on a branch.
23
78
 
24
 
    TODO: Also check non-mailine revisions mentioned as parents.
 
79
    TODO: Also check non-mainline revisions mentioned as parents.
 
80
 
 
81
    TODO: Check for extra files in the control directory.
25
82
    """
26
83
    from bzrlib.trace import mutter
27
84
    from bzrlib.errors import BzrCheckError
28
85
    from bzrlib.osutils import fingerprint_file
29
86
    from bzrlib.progress import ProgressBar
 
87
    from bzrlib.inventory import ROOT_ID
 
88
    from bzrlib.branch import gen_root_id
30
89
 
31
90
    branch.lock_read()
32
91
 
40
99
        history = branch.revision_history()
41
100
        revno = 0
42
101
        revcount = len(history)
 
102
        mismatch_inv_id = []
43
103
 
44
104
        # for all texts checked, text_id -> sha1
45
105
        checked_texts = {}
83
143
                                    "by {%s}"
84
144
                                    % (rev_id, last_rev_id))
85
145
 
 
146
            if rev.inventory_id != rev_id:
 
147
                mismatch_inv_id.append(rev_id)
 
148
 
86
149
            ## TODO: Check all the required fields are present on the revision.
87
150
 
88
151
            if rev.inventory_sha1:
164
227
    if (missing_inventory_sha_cnt
165
228
        or missing_revision_sha_cnt):
166
229
        print '  (use "bzr upgrade" to fix them)'
 
230
 
 
231
    if mismatch_inv_id:
 
232
        print '%d revisions have mismatched inventory ids:' % len(mismatch_inv_id)
 
233
        for rev_id in mismatch_inv_id:
 
234
            print '  ', rev_id