~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/check.py

  • Committer: Martin Pool
  • Date: 2005-07-11 07:33:45 UTC
  • Revision ID: mbp@sourcefrog.net-20050711073345-177b10e674961bda
- merge John's code to give the tree root an explicit file id

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.
29
84
    from bzrlib.errors import BzrCheckError
30
85
    from bzrlib.osutils import fingerprint_file
31
86
    from bzrlib.progress import ProgressBar
 
87
    from bzrlib.inventory import ROOT_ID
 
88
    from bzrlib.branch import gen_root_id
32
89
 
33
90
    branch.lock_read()
34
91