Re: [PATCH v2 0/8] ref-filter: ahead/behind counting, faster --merged option
From: Junio C Hamano <hidden>
Date: 2023-03-15 19:34:15
Jeff King [off-list ref] writes:
E.g., imagine resolving "main" to 1234abcd in step one, then somebody updates it to 5678cdef, then you run "for-each-ref" to compute ahead/behind, and now you show an inconsistent result: you say that "main" points to 1234abcd, but show the wrong ahead/behind information. Showing 1234abcd at all is out-of-date, of course, but the real problem is the lack of atomicity. Most porcelain scripts deal with this by resolving the refs immediately, assuming object ids are immutable (which they are modulo games like refs/replace), and then working with them.
A really paranoid caller can use %(ahead-behind-detail:refs/heads/main)
and get a report on refs/heads/topic, something that conveys
refs/heads/topic (at 67f9f40d) is ahead by 2 commits and behind
by 4 commits relative to refs/heads/main (at d7c3a768).
in a machine readable form. And when the "ahead by 2 commits"
disappears, we know 67f9f40d is merged to main sometime before
d7c3a768. Then it can say "update-ref -d refs/heads/topic 67f9f40d"
to avoid racing with simultanous updaters.