comparison mercurial/commands.py @ 23254:d23834b871ac

debugrevlog: fix computing chain length in debugrevlog -d The chain length was computed correctly only when generaldelta feature was enabled. Now it's fixed. When generaldelta is disabled the base revision in revlog index is not the revision we have delta against - it's always previous revision. Instead of incorrect chainbaseandlen in command.py we are now using two single-responsibility functions in revlog.py: - chainbase(rev) - chainlen(rev) Only chainlen(rev) was missing so it was written to mimic the way the chain of deltas is actually found during file reconstruction.
author Mateusz Kwapich <mitrandir@fb.com>
date Thu, 06 Nov 2014 14:08:25 -0800
parents 7867f15b4a38
children 41c03b7592ed
comparison
equal deleted inserted replaced
23253:8d84b7a2dd91 23254:d23834b871ac
2651 numrevs = len(r) 2651 numrevs = len(r)
2652 ui.write("# rev p1rev p2rev start end deltastart base p1 p2" 2652 ui.write("# rev p1rev p2rev start end deltastart base p1 p2"
2653 " rawsize totalsize compression heads chainlen\n") 2653 " rawsize totalsize compression heads chainlen\n")
2654 ts = 0 2654 ts = 0
2655 heads = set() 2655 heads = set()
2656 rindex = r.index
2657
2658 def chainbaseandlen(rev):
2659 clen = 0
2660 base = rindex[rev][3]
2661 while base != rev:
2662 clen += 1
2663 rev = base
2664 base = rindex[rev][3]
2665 return base, clen
2666 2656
2667 for rev in xrange(numrevs): 2657 for rev in xrange(numrevs):
2668 dbase = r.deltaparent(rev) 2658 dbase = r.deltaparent(rev)
2669 if dbase == -1: 2659 if dbase == -1:
2670 dbase = rev 2660 dbase = rev
2671 cbase, clen = chainbaseandlen(rev) 2661 cbase = r.chainbase(rev)
2662 clen = r.chainlen(rev)
2672 p1, p2 = r.parentrevs(rev) 2663 p1, p2 = r.parentrevs(rev)
2673 rs = r.rawsize(rev) 2664 rs = r.rawsize(rev)
2674 ts = ts + rs 2665 ts = ts + rs
2675 heads -= set(r.parentrevs(rev)) 2666 heads -= set(r.parentrevs(rev))
2676 heads.add(rev) 2667 heads.add(rev)