ls-refs: filter refs using namespace-stripped name
commite2f41a0a5aaa0116c9f1463fd779ce832eb773cc
authorJonathan Tan <jonathantanmy@google.com>
Thu, 17 Jan 2019 23:33:05 +0000 (17 15:33 -0800)
committerJunio C Hamano <gitster@pobox.com>
Fri, 18 Jan 2019 20:48:41 +0000 (18 12:48 -0800)
tree68ff94301aa8b783046eb25a867c8b1df2b9e147
parent77556354bb7ac50450e3b28999e3576969869068
ls-refs: filter refs using namespace-stripped name

If a user fetches refs/heads/master from a repo with namespace "ns", the
remote is expected to (1) not send the real refs/heads/master, and (2)
send refs/namespaces/ns/refs/heads/master with the name
refs/heads/master. (1) indeed happens now, but not (2) - Git only sends
refs that have the user-given prefix, but it checks them against the
full name of the ref (the one starting with refs/namespaces), and not
the namespace-stripped one.

This is demonstrated by the patch in the test. Currently, it results in
"fatal: couldn't find remote ref refs/heads/master" despite both
unnamespaced and namespaced master being present. With the code change,
it produces the expected result.

Check the ref prefixes against the namespace-stripped name.

This bug was discovered through applying patches [1] that override
protocol.version to 2 in repositories when running tests, allowing us to
notice differences in behavior across different protocol versions.

[1] https://public-inbox.org/git/cover.1547677183.git.jonathantanmy@google.com/

Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
ls-refs.c
t/t5702-protocol-v2.sh