From: Junio C Hamano Date: Wed, 16 Sep 2009 22:52:37 GMT Subject: Re: [RFC/PATCH 0/2] Speed up fetch with large number of tags Message-ID: <7vtyz2wlhm.fsf@alter.siamese.dyndns.org> In-Reply-To: <20090916224253.GB14660@spearce.org> "Shawn O. Pearce" writes: > JGit depends on the fact that the refs list is sorted by the remote > peer, and that foo^{} immediately follows foo. I don't think this > has ever been documented, but all sane implementations[1] follow > this convention and it may be something we could simply codify as > part of the protocol standard. > > [1] Sane implementations are defined to be what I consider to be > the two stable implementations in deployed use, git.git and JGit. There is no strong reason for ordering of refs between themselves (i.e. refs/heads/master comes before refs/heads/next) other than the fact that we sort and then walk due to packed-refs reasons. But emitting tag X and then its peeled representation X^{} immediately after it is quite fundamental in the way how anybody sane would implement ls-remote. There is no reason to violate the established order other than "I could do so", and in order not to show X and X^{} next to each other, you would need _more_ processing. So I would say it is very safe to assume this. Also, you might not have noticed, but my illustration patch was merely using it as a hint to optimize, and if the last ref we saw was not X when it is turn to handle X^{}, it simply falled back to the original logic, iow, the patch never compromised the correctness.