##// END OF EJS Templates
debugdeltachain: detect a special case where parents are "skipped"...
marmoute -
r50118:13e52322 default
parent child Browse files
Show More
@@ -768,6 +768,10 b' def debugdeltachain(ui, repo, file_=None'
768 - snap: an intermediate snapshot
768 - snap: an intermediate snapshot
769 - p1: a delta against the first parent
769 - p1: a delta against the first parent
770 - p2: a delta against the second parent
770 - p2: a delta against the second parent
771 - skip1: a delta against the same base as p1
772 (when p1 has empty delta
773 - skip2: a delta against the same base as p2
774 (when p2 has empty delta
771 - prev: a delta against the previous revision
775 - prev: a delta against the previous revision
772 - other: a delta against an arbitrary revision
776 - other: a delta against an arbitrary revision
773 :``compsize``: compressed size of revision
777 :``compsize``: compressed size of revision
@@ -803,6 +807,9 b' def debugdeltachain(ui, repo, file_=None'
803 generaldelta = r._generaldelta
807 generaldelta = r._generaldelta
804 withsparseread = getattr(r, '_withsparseread', False)
808 withsparseread = getattr(r, '_withsparseread', False)
805
809
810 # security to avoid crash on corrupted revlogs
811 total_revs = len(index)
812
806 def revinfo(rev):
813 def revinfo(rev):
807 e = index[rev]
814 e = index[rev]
808 compsize = e[revlog_constants.ENTRY_DATA_COMPRESSED_LENGTH]
815 compsize = e[revlog_constants.ENTRY_DATA_COMPRESSED_LENGTH]
@@ -813,6 +820,39 b' def debugdeltachain(ui, repo, file_=None'
813 p1 = e[revlog_constants.ENTRY_PARENT_1]
820 p1 = e[revlog_constants.ENTRY_PARENT_1]
814 p2 = e[revlog_constants.ENTRY_PARENT_2]
821 p2 = e[revlog_constants.ENTRY_PARENT_2]
815
822
823 # If the parents of a revision has an empty delta, we never try to delta
824 # against that parent, but directly against the delta base of that
825 # parent (recursively). It avoids adding a useless entry in the chain.
826 #
827 # However we need to detect that as a special case for delta-type, that
828 # is not simply "other".
829 p1_base = p1
830 if p1 != nullrev and p1 < total_revs:
831 e1 = index[p1]
832 while e1[revlog_constants.ENTRY_DATA_COMPRESSED_LENGTH] == 0:
833 new_base = e1[revlog_constants.ENTRY_DELTA_BASE]
834 if (
835 new_base == p1_base
836 or new_base == nullrev
837 or new_base >= total_revs
838 ):
839 break
840 p1_base = new_base
841 e1 = index[p1_base]
842 p2_base = p2
843 if p2 != nullrev and p2 < total_revs:
844 e2 = index[p2]
845 while e2[revlog_constants.ENTRY_DATA_COMPRESSED_LENGTH] == 0:
846 new_base = e2[revlog_constants.ENTRY_DELTA_BASE]
847 if (
848 new_base == p2_base
849 or new_base == nullrev
850 or new_base >= total_revs
851 ):
852 break
853 p2_base = new_base
854 e2 = index[p2_base]
855
816 if generaldelta:
856 if generaldelta:
817 if base == p1:
857 if base == p1:
818 deltatype = b'p1'
858 deltatype = b'p1'
@@ -820,6 +860,10 b' def debugdeltachain(ui, repo, file_=None'
820 deltatype = b'p2'
860 deltatype = b'p2'
821 elif base == rev:
861 elif base == rev:
822 deltatype = b'base'
862 deltatype = b'base'
863 elif base == p1_base:
864 deltatype = b'skip1'
865 elif base == p2_base:
866 deltatype = b'skip2'
823 elif r.issnapshot(rev):
867 elif r.issnapshot(rev):
824 deltatype = b'snap'
868 deltatype = b'snap'
825 elif base == rev - 1:
869 elif base == rev - 1:
General Comments 0
You need to be logged in to leave comments. Login now