diff -r 5f9350956c03 -r ef369d16965d mercurial/branchmap.py --- a/mercurial/branchmap.py Wed Feb 28 12:56:08 2024 +0100 +++ b/mercurial/branchmap.py Sun Feb 25 23:31:50 2024 +0100 @@ -698,26 +698,22 @@ if max_rev is not None and max_rev > self.tiprev: self.tiprev = max_rev self.tipnode = cl.node(max_rev) + else: + # We should not be here is if this is false + assert cl.node(self.tiprev) == self.tipnode if not self.validfor(repo): - # old cache key is now invalid for the repo, but we've just updated - # the cache and we assume it's valid, so let's make the cache key - # valid as well by recomputing it from the cached data - self.tipnode = repo.nullid - self.tiprev = nullrev - for heads in self.iterheads(): - if not heads: - # all revisions on a branch are obsolete - continue - # note: tiprev is not necessarily the tip revision of repo, - # because the tip could be obsolete (i.e. not a head) - tiprev = max(cl.rev(node) for node in heads) - if tiprev > self.tiprev: - self.tipnode = cl.node(tiprev) - self.tiprev = tiprev - self.filteredhash = scmutil.filteredhash( - repo, self.tiprev, needobsolete=True - ) + # the tiprev and tipnode should be aligned, so if the current repo + # is not seens as valid this is because old cache key is now + # invalid for the repo. + # + # However. we've just updated the cache and we assume it's valid, + # so let's make the cache key valid as well by recomputing it from + # the cached data + self.filteredhash = scmutil.filteredhash( + repo, self.tiprev, needobsolete=True + ) + self._state = STATE_DIRTY tr = repo.currenttransaction() if getattr(tr, 'finalized', True):