278
276
return self._branch.last_revision() != self._last_revid
280
def use_cache(self, cache):
281
self._change_cache = cache
283
278
def use_file_cache(self, cache):
284
279
self._file_change_cache = cache
286
def use_search_index(self, index):
290
282
def has_revisions(self):
291
283
return not bzrlib.revision.is_null(self.last_revid)
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:
307
def flush_cache(self):
308
if self._change_cache is None:
310
self._change_cache.flush()
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()
318
285
last_revid = property(lambda self: self._last_revid, None, None)
320
287
@with_branch_lock
385
352
return revid_list[index:]
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)
391
# this is going to be painfully slow. :(
394
for revid in revid_list:
395
change = self.get_changes([ revid ])[0]
396
if text in change.comment.lower():
398
self.log.debug('searched %d revisions for %r in %r secs', len(revid_list), text, time.time() - z)
401
def get_revision_history_matching_indexed(self, revid_list, text):
402
self.log.debug('searching %d revisions for %r', len(revid_list), text)
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]
413
355
def get_search_revid_list(self, query, revid_list):
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)
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)
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
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
549
485
return None, None, []
551
487
@with_branch_lock
648
583
Revisions not present and NULL_REVISION will be ignored.
650
if self._change_cache is None:
651
changes = self.get_changes_uncached(revid_list)
653
changes = self._change_cache.get_changes(revid_list)
585
changes = self.get_changes_uncached(revid_list)
654
586
if len(changes) == 0:
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]
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)
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
681
ret, stats = profile(self.get_changes_uncached, revid_list)
684
cPickle.dump(stats, open('lsprof.stats', 'w'), 2)
685
self.log.info('lsprof complete!')
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),
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)
702
619
return [self._change_from_revision(rev) for rev in rev_list]