diff -r b999edb15f8c -r 5b65721a75eb mercurial/revlog.py --- a/mercurial/revlog.py Fri Mar 18 12:23:47 2022 -0700 +++ b/mercurial/revlog.py Tue Jul 20 15:07:10 2021 +0200 @@ -298,6 +298,7 @@ persistentnodemap=False, concurrencychecker=None, trypending=False, + canonical_parent_order=True, ): """ create a revlog object @@ -373,6 +374,13 @@ self._concurrencychecker = concurrencychecker + # parent order is supposed to be semantically irrelevant, so we + # normally resort parents to ensure that the first parent is non-null, + # if there is a non-null parent at all. + # filelog abuses the parent order as flag to mark some instances of + # meta-encoded files, so allow it to disable this behavior. + self.canonical_parent_order = canonical_parent_order + def _init_opts(self): """process options (from above/config) to setup associated default revlog mode @@ -898,7 +906,10 @@ raise error.WdirUnsupported raise - return entry[5], entry[6] + if self.canonical_parent_order and entry[5] == nullrev: + return entry[6], entry[5] + else: + return entry[5], entry[6] # fast parentrevs(rev) where rev isn't filtered _uncheckedparentrevs = parentrevs @@ -919,7 +930,11 @@ def parents(self, node): i = self.index d = i[self.rev(node)] - return i[d[5]][7], i[d[6]][7] # map revisions to nodes inline + # inline node() to avoid function call overhead + if self.canonical_parent_order and d[5] == self.nullid: + return i[d[6]][7], i[d[5]][7] + else: + return i[d[5]][7], i[d[6]][7] def chainlen(self, rev): return self._chaininfo(rev)[0]