~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/weave.py

  • Committer: Martin Pool
  • Date: 2005-07-11 04:53:07 UTC
  • Revision ID: mbp@sourcefrog.net-20050711045307-2b38378d043dc25c
- Refactor weave calculation of inclusions

Show diffs side-by-side

added added

removed removed

Lines of Context:
146
146
        It is only necessary to store the minimal set of parents for
147
147
        each version; the parent's parents are implied.
148
148
 
149
 
    _i
150
 
        Full set of inclusions for each revision.
151
 
 
152
149
    _sha1s
153
150
        List of hex SHA-1 of each version, or None if not recorded.
154
151
    """
156
153
        self._l = []
157
154
        self._v = []
158
155
        self._sha1s = []
159
 
        self._i = {}
160
156
 
161
157
 
162
158
    def __eq__(self, other):
238
234
        return idx
239
235
 
240
236
 
241
 
    def _expand(self, version):
242
 
        if version in self._i:
243
 
            return self._i[version]
244
 
        else:
245
 
            i = set([version])
246
 
            for pv in self._v[version]:
247
 
                i.update(self._expand(pv))
248
 
            self._i[version] = i
249
 
            return i
250
 
 
251
 
 
252
237
    def inclusions(self, versions):
253
 
        """Expand out everything included by versions."""
 
238
        """Return set of all ancestors of given version(s)."""
254
239
        i = set(versions)
 
240
        v = max(versions)
255
241
        try:
256
 
            for v in versions:
257
 
                i.update(self._expand(v))
 
242
            while v >= 0:
 
243
                if v in i:
 
244
                    # include all its parents
 
245
                    i.update(self._v[v])
 
246
                v -= 1
 
247
            return i
258
248
        except IndexError:
259
249
            raise ValueError("version %d not present in weave" % v)
260
 
        return i
261
250
 
262
251
 
263
252
    def minimal_parents(self, version):
267
256
            return []
268
257
        
269
258
        li = list(included)
270
 
        li.sort()
271
 
        li.reverse()
 
259
        li.sort(reverse=True)
272
260
 
273
261
        mininc = []
274
262
        gotit = set()
276
264
        for pv in li:
277
265
            if pv not in gotit:
278
266
                mininc.append(pv)
279
 
                gotit.update(self._v[pv])
 
267
                gotit.update(self.inclusions(pv))
280
268
 
281
269
        assert mininc[0] >= 0
282
270
        assert mininc[-1] < version
318
306
        """Yield list of (index-id, line) pairs for the specified version.
319
307
 
320
308
        The index indicates when the line originated in the weave."""
321
 
        included = self.inclusions([version])
322
 
        for origin, lineno, text in self._extract(self.inclusions(included)):
 
309
        for origin, lineno, text in self._extract([version]):
323
310
            yield origin, text
324
311
 
325
312
 
326
 
    def _extract(self, included):
 
313
    def _extract(self, versions):
327
314
        """Yield annotation of lines in included set.
328
315
 
329
316
        Yields a sequence of tuples (origin, lineno, text), where
332
319
 
333
320
        The set typically but not necessarily corresponds to a version.
334
321
        """
 
322
        included = self.inclusions(versions)
335
323
 
336
324
        istack = []
337
325
        dset = set()
381
369
 
382
370
    def get_iter(self, version):
383
371
        """Yield lines for the specified version."""
384
 
        for origin, lineno, line in self._extract(self.inclusions([version])):
 
372
        for origin, lineno, line in self._extract([version]):
385
373
            yield line
386
374
 
387
375
 
392
380
    def mash_iter(self, included):
393
381
        """Return composed version of multiple included versions."""
394
382
        included = frozenset(included)
395
 
        for origin, lineno, text in self._extract(self.inclusions(included)):
 
383
        for origin, lineno, text in self._extract(included):
396
384
            yield text
397
385
 
398
386
 
480
468
        # basis a list of (origin, lineno, line)
481
469
        basis_lineno = []
482
470
        basis_lines = []
483
 
        for origin, lineno, line in self._extract(self.inclusions(included)):
 
471
        for origin, lineno, line in self._extract(included):
484
472
            basis_lineno.append(lineno)
485
473
            basis_lines.append(line)
486
474