~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to tools/history2weaves.py

  • Committer: Martin Pool
  • Date: 2005-08-18 07:26:09 UTC
  • Revision ID: mbp@sourcefrog.net-20050818072609-fd93b6b335bafc13
- lift imports

Show diffs side-by-side

added added

removed removed

Lines of Context:
18
18
 
19
19
"""Experiment in converting existing bzr branches to weaves."""
20
20
 
21
 
try:
22
 
    import psyco
23
 
    psyco.full()
24
 
except ImportError:
25
 
    pass
26
 
 
27
21
 
28
22
import bzrlib.branch
29
23
from bzrlib.revfile import Revfile
41
35
    inv_weave = Weave()
42
36
 
43
37
    last_text_sha = {}
44
 
 
45
 
    # holds in-memory weaves for all files
46
 
    text_weaves = {}
 
38
    text_rfs = {}
47
39
 
48
40
    b = bzrlib.branch.find_branch('.')
49
41
 
50
42
    revno = 1
51
43
    rev_history = b.revision_history()
52
44
    last_idx = None
53
 
    inv_parents = []
54
 
    text_count = 0
 
45
    parents = []
55
46
    
56
47
    for rev_id in rev_history:
57
 
        pb.update('converting revision', revno, len(rev_history))
 
48
        pb.update('converting inventory', revno, len(rev_history))
58
49
        
59
50
        inv_xml = b.get_inventory_xml(rev_id).readlines()
60
51
 
61
 
        new_idx = inv_weave.add(rev_id, inv_parents, inv_xml)
62
 
        inv_parents = [new_idx]
63
 
 
64
 
        tree = b.revision_tree(rev_id)
65
 
        inv = tree.inventory
66
 
 
67
 
        # for each file in the inventory, put it into its own revfile
68
 
        for file_id in inv:
69
 
            ie = inv[file_id]
70
 
            if ie.kind != 'file':
71
 
                continue
72
 
            if last_text_sha.get(file_id) == ie.text_sha1:
73
 
                # same as last time
74
 
                continue
75
 
            last_text_sha[file_id] = ie.text_sha1
76
 
 
77
 
            # new text (though possibly already stored); need to store it
78
 
            text_lines = tree.get_file(file_id).readlines()
79
 
 
80
 
            # if the file's created for the first time in this
81
 
            # revision then make a new weave; else find the old one
82
 
            if file_id not in text_weaves:
83
 
                text_weaves[file_id] = Weave()
84
 
                
85
 
            w = text_weaves[file_id]
86
 
 
87
 
            # base the new text version off whatever was last
88
 
            # (actually it'd be better to track this, to allow for
89
 
            # files that are deleted and then reappear)
90
 
            last = len(w)
91
 
            if last == 0:
92
 
                parents = []
93
 
            else:
94
 
                parents = [last-1]
95
 
 
96
 
            w.add(rev_id, parents, text_lines)
97
 
            text_count += 1
 
52
        new_idx = inv_weave.add(parents, inv_xml)
 
53
        parents = [new_idx]
 
54
 
 
55
#         tree = b.revision_tree(rev_id)
 
56
#         inv = tree.inventory
 
57
 
 
58
#         # for each file in the inventory, put it into its own revfile
 
59
#         for file_id in inv:
 
60
#             ie = inv[file_id]
 
61
#             if ie.kind != 'file':
 
62
#                 continue
 
63
#             if last_text_sha.get(file_id) == ie.text_sha1:
 
64
#                 # same as last time
 
65
#                 continue
 
66
#             last_text_sha[file_id] = ie.text_sha1
 
67
 
 
68
#             # new text (though possibly already stored); need to store it
 
69
#             text = tree.get_file(file_id).read()
 
70
            
 
71
#             if file_id not in text_rfs:
 
72
#                 text_rfs[file_id] = Revfile('revfiles/' + file_id, 'w')
 
73
#             rf = text_rfs[file_id]
 
74
 
 
75
#             last = len(rf)
 
76
#             if last == 0:
 
77
#                 last = None
 
78
#             else:
 
79
#                 last -= 1
 
80
#             rf.add(text, last, compress=True)
98
81
 
99
82
        revno += 1
100
83
 
101
 
    pb.clear()
102
 
    print '%6d revisions and inventories' % revno
103
 
    print '%6d texts' % text_count
104
 
 
105
 
    i = 0
106
 
    # TODO: commit them all atomically at the end, not one by one
107
 
    write_atomic_weave(inv_weave, 'weaves/inventory.weave')
108
 
    for file_id, file_weave in text_weaves.items():
109
 
        pb.update('writing weave', i, len(text_weaves))
110
 
        write_atomic_weave(file_weave, 'weaves/%s.weave' % file_id)
111
 
        i += 1
112
 
 
113
 
    pb.clear()
114
 
 
115
 
 
116
 
def write_atomic_weave(weave, filename):
117
 
    inv_wf = AtomicFile(filename)
 
84
    inv_wf = AtomicFile('inventory.weave')
118
85
    try:
119
 
        write_weave(weave, inv_wf)
 
86
        write_weave(inv_weave, inv_wf)
120
87
        inv_wf.commit()
121
88
    finally:
122
89
        inv_wf.close()
123
90
 
124
 
    
 
91
    pb.clear()
125
92
 
126
93
 
127
94
def profile_convert():