~beuno/loggerhead/zpt.cleaner_urls

« back to all changes in this revision

Viewing changes to loggerhead/history.py

  • Committer: Martin Albisetti
  • Date: 2008-06-18 04:08:52 UTC
  • mfrom: (128.22.4 trunk)
  • Revision ID: argentina@gmail.com-20080618040852-qess1m7633apk3h5
MergeĀ fromĀ trunk

Show diffs side-by-side

added added

removed removed

Lines of Context:
191
191
class History (object):
192
192
 
193
193
    def __init__(self):
194
 
        self._change_cache = None
195
194
        self._file_change_cache = None
196
 
        self._index = None
197
195
        self._lock = threading.RLock()
198
196
 
199
197
    @classmethod
277
275
            return True
278
276
        return self._branch.last_revision() != self._last_revid
279
277
 
280
 
    def use_cache(self, cache):
281
 
        self._change_cache = cache
282
 
 
283
278
    def use_file_cache(self, cache):
284
279
        self._file_change_cache = cache
285
280
 
286
 
    def use_search_index(self, index):
287
 
        self._index = index
288
 
 
289
281
    @property
290
282
    def has_revisions(self):
291
283
        return not bzrlib.revision.is_null(self.last_revid)
292
284
 
293
 
    @with_branch_lock
294
 
    def detach(self):
295
 
        # called when a new history object needs to be created, because the
296
 
        # branch history has changed.  we need to immediately close and stop
297
 
        # using our caches, because a new history object will be created to
298
 
        # replace us, using the same cache files.
299
 
        # (may also be called during server shutdown.)
300
 
        if self._change_cache is not None:
301
 
            self._change_cache.close()
302
 
            self._change_cache = None
303
 
        if self._index is not None:
304
 
            self._index.close()
305
 
            self._index = None
306
 
 
307
 
    def flush_cache(self):
308
 
        if self._change_cache is None:
309
 
            return
310
 
        self._change_cache.flush()
311
 
 
312
 
    def check_rebuild(self):
313
 
        if self._change_cache is not None:
314
 
            self._change_cache.check_rebuild()
315
 
        #if self._index is not None:
316
 
        #    self._index.check_rebuild()
317
 
 
318
285
    last_revid = property(lambda self: self._last_revid, None, None)
319
286
 
320
287
    @with_branch_lock
385
352
        return revid_list[index:]
386
353
 
387
354
    @with_branch_lock
388
 
    def get_revision_history_matching(self, revid_list, text):
389
 
        self.log.debug('searching %d revisions for %r', len(revid_list), text)
390
 
        z = time.time()
391
 
        # this is going to be painfully slow. :(
392
 
        out = []
393
 
        text = text.lower()
394
 
        for revid in revid_list:
395
 
            change = self.get_changes([ revid ])[0]
396
 
            if text in change.comment.lower():
397
 
                out.append(revid)
398
 
        self.log.debug('searched %d revisions for %r in %r secs', len(revid_list), text, time.time() - z)
399
 
        return out
400
 
 
401
 
    def get_revision_history_matching_indexed(self, revid_list, text):
402
 
        self.log.debug('searching %d revisions for %r', len(revid_list), text)
403
 
        z = time.time()
404
 
        if self._index is None:
405
 
            return self.get_revision_history_matching(revid_list, text)
406
 
        out = self._index.find(text, revid_list)
407
 
        self.log.debug('searched %d revisions for %r in %r secs: %d results', len(revid_list), text, time.time() - z, len(out))
408
 
        # put them in some coherent order :)
409
 
        out = [r for r in self._full_history if r in out]
410
 
        return out
411
 
 
412
 
    @with_branch_lock
413
355
    def get_search_revid_list(self, query, revid_list):
414
356
        """
415
357
        given a "quick-search" query, try a few obvious possible meanings:
451
393
                revid_list = list(self.get_revids_from(None, self._last_revid))
452
394
            return self.get_revision_history_since(revid_list, date)
453
395
 
454
 
        # check comment fields.
455
 
        if revid_list is None:
456
 
            revid_list = self._full_history
457
 
        return self.get_revision_history_matching_indexed(revid_list, query)
458
 
 
459
396
    revno_re = re.compile(r'^[\d\.]+$')
460
397
    # the date regex are without a final '$' so that queries like
461
398
    # "2006-11-30 12:15" still mostly work.  (i think it's better to give
540
477
            revid_list = None
541
478
 
542
479
        revid_list = self.get_search_revid_list(query, revid_list)
543
 
        if len(revid_list) > 0:
 
480
        if revid_list and len(revid_list) > 0:
544
481
            if revid not in revid_list:
545
482
                revid = revid_list[0]
546
483
            return revid, start_revid, revid_list
547
484
        else:
548
 
            # no results
549
485
            return None, None, []
550
486
 
551
487
    @with_branch_lock
567
503
            path = '/' + path
568
504
        return self._branch.repository.get_revision_inventory(revid).path2id(path)
569
505
 
570
 
 
571
506
    def get_merge_point_list(self, revid):
572
507
        """
573
508
        Return the list of revids that have merged this node.
647
582
 
648
583
        Revisions not present and NULL_REVISION will be ignored.
649
584
        """
650
 
        if self._change_cache is None:
651
 
            changes = self.get_changes_uncached(revid_list)
652
 
        else:
653
 
            changes = self._change_cache.get_changes(revid_list)
 
585
        changes = self.get_changes_uncached(revid_list)
654
586
        if len(changes) == 0:
655
587
            return changes
656
588
 
660
592
            merge_revids = self.simplify_merge_point_list(self.get_merge_point_list(change.revid))
661
593
            change.merge_points = [util.Container(revid=r, revno=self.get_revno(r)) for r in merge_revids]
662
594
            if len(change.parents) > 0:
663
 
                if isinstance(change.parents[0], util.Container):
664
 
                    # old cache stored a potentially-bogus revno
665
 
                    change.parents = [util.Container(revid=p.revid, revno=self.get_revno(p.revid)) for p in change.parents]
666
 
                else:
667
 
                    change.parents = [util.Container(revid=r, revno=self.get_revno(r)) for r in change.parents]
 
595
                change.parents = [util.Container(revid=r, 
 
596
                    revno=self.get_revno(r)) for r in change.parents]
668
597
            change.revno = self.get_revno(change.revid)
669
598
 
670
599
        parity = 0
674
603
 
675
604
        return changes
676
605
 
677
 
    # alright, let's profile this sucka. (FIXME remove this eventually...)
678
 
    def _get_changes_profiled(self, revid_list):
679
 
        from loggerhead.lsprof import profile
680
 
        import cPickle
681
 
        ret, stats = profile(self.get_changes_uncached, revid_list)
682
 
        stats.sort()
683
 
        stats.freeze()
684
 
        cPickle.dump(stats, open('lsprof.stats', 'w'), 2)
685
 
        self.log.info('lsprof complete!')
686
 
        return ret
687
 
 
688
606
    @with_branch_lock
689
607
    @with_bzrlib_read_lock
690
608
    def get_changes_uncached(self, revid_list):
691
609
        # FIXME: deprecated method in getting a null revision
692
610
        revid_list = filter(lambda revid: not bzrlib.revision.is_null(revid),
693
611
                            revid_list)
694
 
        repo = self._branch.repository
695
 
        parent_map = repo.get_graph().get_parent_map(revid_list)
 
612
        parent_map = self._branch.repository.get_graph().get_parent_map(revid_list)
696
613
        # We need to return the answer in the same order as the input,
697
614
        # less any ghosts.
698
615
        present_revids = [revid for revid in revid_list
699
616
                          if revid in parent_map]
700
 
        rev_list = repo.get_revisions(present_revids)
 
617
        rev_list = self._branch.repository.get_revisions(present_revids)
701
618
 
702
619
        return [self._change_from_revision(rev) for rev in rev_list]
703
620