~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/workingtree_4.py

50% speedup in the dirstate->inventory conversion logic by caching the parent ids as we walk the tree. Some further work would be to maintain a stack of parents as we know we visit depth first.

Show diffs side-by-side

added added

removed removed

Lines of Context:
211
211
        rows = self._dirstate._iter_rows()
212
212
        root_row = rows.next()
213
213
        inv = Inventory(root_id=root_row[0][3].decode('utf8'))
 
214
        # we could do this straight out of the dirstate; it might be fast
 
215
        # and should be profiled - RBC 20070216
 
216
        parent_ids = {'' : inv.root.file_id}
214
217
        for line in rows:
215
218
            dirname, name, kind, fileid_utf8, size, stat, link_or_sha1 = line[0]
216
219
            if dirname == '/':
217
220
                # not in this revision tree.
218
221
                continue
219
 
            parent_id = inv[inv.path2id(dirname.decode('utf8'))].file_id
 
222
            parent_id = parent_ids[dirname]
220
223
            file_id = fileid_utf8.decode('utf8')
221
224
            entry = make_entry(kind, name.decode('utf8'), parent_id, file_id)
222
225
            if kind == 'file':
224
227
                #entry.text_size = size
225
228
                #entry.text_sha1 = sha1
226
229
                pass
 
230
            elif kind == 'directory':
 
231
                parent_ids[(dirname + '/' + name).strip('/')] = file_id
227
232
            inv.add(entry)
228
233
        self._inventory = inv
229
234
 
231
236
        #if not path:
232
237
        #    path = self.inventory.id2path(file_id)
233
238
        #    # now lookup row by path
234
 
        row, parents = self._get_row(file_id=file_id)
 
239
        row, parents = self._get_row(file_id=file_id, path=path)
235
240
        assert row is not None, 'what error should this raise'
236
241
        # TODO:
237
242
        # if row stat is valid, use cached sha1, else, get a new sha1.
238
 
        path = (row[0] + '/' + row[1]).strip('/').decode('utf8')
 
243
        if path is None:
 
244
            path = (row[0] + '/' + row[1]).strip('/').decode('utf8')
239
245
        return self._hashcache.get_sha1(path, stat_value)
240
246
 
241
247
    def _get_inventory(self):
808
814
        root_row = rows.next()
809
815
        inv = Inventory(root_id=root_row[0][3].decode('utf8'),
810
816
            revision_id=self._revision_id)
 
817
        # we could do this straight out of the dirstate; it might be fast
 
818
        # and should be profiled - RBC 20070216
 
819
        parent_ids = {'' : inv.root.file_id}
811
820
        for line in rows:
812
821
            revid, kind, dirname, name, size, executable, sha1 = line[1][parent_index]
813
822
            if not revid:
814
823
                # not in this revision tree.
815
824
                continue
816
 
            parent_id = inv[inv.path2id(dirname.decode('utf8'))].file_id
 
825
            parent_id = parent_ids[dirname]
817
826
            file_id = line[0][3].decode('utf8')
818
827
            entry = make_entry(kind, name.decode('utf8'), parent_id, file_id)
819
828
            entry.revision = revid.decode('utf8')
821
830
                entry.executable = executable
822
831
                entry.text_size = size
823
832
                entry.text_sha1 = sha1
 
833
            elif kind == 'directory':
 
834
                parent_ids[(dirname + '/' + name).strip('/')] = file_id
824
835
            inv.add(entry)
825
836
        self._inventory = inv
826
837