diff -r 7dc8b9e25f19 -r 99cafcae25d9 mercurial/cmdutil.py --- a/mercurial/cmdutil.py Sun Aug 15 22:44:15 2010 +0900 +++ b/mercurial/cmdutil.py Sun Aug 15 23:17:53 2010 +0900 @@ -1059,8 +1059,14 @@ # We only have to read through the filelog to find wanted revisions minrev, maxrev = min(revs), max(revs) - # Only files, no patterns. Check the history of each file. def filerevgen(filelog, last): + """ + Only files, no patterns. Check the history of each file. + + Examines filelog entries within minrev, maxrev linkrev range + Returns an iterator yielding (linkrev, parentlinkrevs, copied) + tuples in backwards order + """ cl_count = len(repo) revs = [] for j in xrange(0, last + 1): @@ -1071,8 +1077,13 @@ # happen while doing "hg log" during a pull or commit if linkrev > maxrev or linkrev >= cl_count: break + + parentlinkrevs = [] + for p in filelog.parentrevs(j): + if p != nullrev: + parentlinkrevs.append(filelog.linkrev(p)) n = filelog.node(j) - revs.append((filelog.linkrev(j), + revs.append((linkrev, parentlinkrevs, follow and filelog.renamed(n))) for rev in reversed(revs): @@ -1101,7 +1112,18 @@ else: last = filelog.rev(node) - for rev, copied in filerevgen(filelog, last): + + # keep track of all ancestors of the file + ancestors = set([filelog.linkrev(last)]) + + # iterate from latest to oldest revision + for rev, flparentlinkrevs, copied in filerevgen(filelog, last): + if rev not in ancestors: + continue + # XXX insert 1327 fix here + if flparentlinkrevs: + ancestors.update(flparentlinkrevs) + fncache.setdefault(rev, []) fncache[rev].append(file_) wanted.add(rev)