~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to tools/history2weaves.py

  • Committer: Martin Pool
  • Date: 2005-09-19 09:28:20 UTC
  • Revision ID: mbp@sourcefrog.net-20050919092820-40e9b73d1c554241
- pull texts into weaves in a fairly lazy way

Show diffs side-by-side

added added

removed removed

Lines of Context:
62
62
# The current algorithm is dumb (O(n**2)?) but will do the job, and
63
63
# takes less than a second on the bzr.dev branch.
64
64
 
 
65
# This currently does a kind of lazy conversion of file texts, where a
 
66
# new text is written in every version.  That's unnecessary but for
 
67
# the moment saves us having to worry about when files need new
 
68
# versions.
 
69
 
 
70
 
65
71
if False:
66
72
    try:
67
73
        import psyco
85
91
from bzrlib.xml4 import serializer_v4
86
92
from bzrlib.xml5 import serializer_v5
87
93
from bzrlib.trace import mutter, note, warning, enable_default_logging
 
94
from bzrlib.osutils import sha_strings
88
95
 
89
96
 
90
97
 
95
102
        self.absent_revisions = set()
96
103
        self.text_count = 0
97
104
        self.revisions = {}
 
105
        self.inventories = {}
98
106
        self.convert()
99
107
        
100
108
 
109
117
        last_text_sha = {}
110
118
 
111
119
        # holds in-memory weaves for all files
112
 
        text_weaves = {}
 
120
        self.text_weaves = {}
113
121
 
114
122
        b = self.branch = Branch('.', relax_version_check=True)
115
123
 
129
137
                and rev_id not in self.absent_revisions):
130
138
                self._load_one_rev(rev_id)
131
139
        self.pb.clear()
132
 
        to_import = self._make_order()
 
140
        to_import = self._make_order()[:100]
133
141
        for i, rev_id in enumerate(to_import):
134
142
            self.pb.update('converting revision', i, len(to_import))
135
 
            self._import_one_rev(rev_id)
 
143
            self._convert_one_rev(rev_id)
136
144
 
137
145
        print '(not really) upgraded to weaves:'
138
146
        print '  %6d revisions and inventories' % len(self.revisions)
145
153
    def _write_all_weaves(self):
146
154
        i = 0
147
155
        write_atomic_weave(self.inv_weave, 'weaves/inventory.weave')
148
 
        return #######################
149
 
        write_atomic_weave(self.anc_weave, 'weaves/ancestry.weave')
150
 
        for file_id, file_weave in text_weaves.items():
151
 
            self.pb.update('writing weave', i, len(text_weaves))
152
 
            write_atomic_weave(file_weave, 'weaves/%s.weave' % file_id)
153
 
            i += 1
154
 
 
155
 
        self.pb.clear()
 
156
        try:
 
157
            for file_id, file_weave in self.text_weaves.items():
 
158
                self.pb.update('writing weave', i, len(self.text_weaves))
 
159
                write_atomic_weave(file_weave, 'weaves/%s.weave' % file_id)
 
160
                i += 1
 
161
        finally:
 
162
            self.pb.clear()
 
163
        ## write_atomic_weave(self.anc_weave, 'weaves/ancestry.weave')
156
164
 
157
165
        
158
166
    def _load_one_rev(self, rev_id):
176
184
                self.total_revs += 1
177
185
                self.to_read.append(parent_id)
178
186
            self.revisions[rev_id] = rev
179
 
 
180
 
 
181
 
    def _import_one_rev(self, rev_id):
182
 
        """Convert rev_id and all referenced file texts to new format."""
183
 
        old_inv_xml = self.branch.inventory_store[rev_id].read()
184
 
        inv = serializer_v4.read_inventory_from_string(old_inv_xml)
 
187
            old_inv_xml = self.branch.inventory_store[rev_id].read()
 
188
            inv = serializer_v4.read_inventory_from_string(old_inv_xml)
 
189
            self.inventories[rev_id] = inv
 
190
        
 
191
 
 
192
    def _convert_one_rev(self, rev_id):
 
193
        """Convert revision and all referenced objects to new format."""
 
194
        rev = self.revisions[rev_id]
 
195
        inv = self.inventories[rev_id]
185
196
        new_inv_xml = serializer_v5.write_inventory_to_string(inv)
186
197
        inv_parents = [x for x in self.revisions[rev_id].parent_ids
187
198
                       if x not in self.absent_revisions]
188
199
        self.inv_weave.add(rev_id, inv_parents,
189
200
                           new_inv_xml.splitlines(True))
 
201
        # TODO: Upgrade revision XML and write that out
 
202
        self._convert_revision_contents(rev, inv)
 
203
        self.converted_revs.add(rev_id)
 
204
 
 
205
 
 
206
    def _convert_revision_contents(self, rev, inv):
 
207
        """Convert all the files within a revision.
 
208
 
 
209
        Also upgrade the inventory to refer to the text revision ids."""
 
210
        rev_id = rev.revision_id
 
211
        for path, ie in inv.iter_entries():
 
212
            file_id = ie.file_id
 
213
            if ie.kind != 'file':
 
214
                continue
 
215
            w = self.text_weaves.get(file_id)
 
216
            if w is None:
 
217
                w = Weave(file_id)
 
218
                self.text_weaves[file_id] = w
 
219
            file_lines = self.branch.text_store[ie.text_id].readlines()
 
220
            assert sha_strings(file_lines) == ie.text_sha1
 
221
            assert sum(map(len, file_lines)) == ie.text_size
 
222
            file_parents = []
 
223
            for parent_id in rev.parent_ids:
 
224
                assert parent_id in self.converted_revs
 
225
                if self.inventories[parent_id].has_id(file_id):
 
226
                    file_parents.append(parent_id)
 
227
            w.add(rev_id, file_parents, file_lines)
 
228
            ie.text_version = rev_id
 
229
            ie.name_version = rev_id
 
230
            mutter('import text {%s}\n  from {%s}\n  in revision {%s}',
 
231
                   ie.text_id, file_id, rev_id)
 
232
            del ie.text_id
 
233
                   
190
234
 
191
235
 
192
236
    def _make_order(self):
237
281
    # XXX: Might like to write to stderr or the trace file instead but
238
282
    # print_stats seems hardcoded to stdout
239
283
    stats.print_stats(20)
240
 
            
 
284
 
 
285
 
 
286
enable_default_logging()
241
287
 
242
288
if '-p' in sys.argv[1:]:
243
289
    profile_convert()