Re: [PATCH 0/6] Improved infrastructure for refname normalization
From: Junio C Hamano <hidden>
Date: 2016-06-15 22:52:00
Michael Haggerty [off-list ref] writes:
The library could do the normalization, but 1. It would probably cost a lot of redundant checks as reference names pass in and out of the library and back in again 2. Normalization requires copying or overwriting the incoming string, so each time a refname crosses the library perimeter there might have to be an extra memory allocation with the associated headaches of dealing with the ownership of the memory. 3. The library doesn't encapsulate all uses of reference names; for example, for_each_ref() invokes a callback function with the refname as an argument. The callback function is free to do a strcmp() of the refname (normalized by the library) with some arbitrary string that it got from the command line. Either the caller has to do the normalization itself (i.e., outside of the library) or the library has to learn how to do every possible filtering operation with refnames.
4. The caller needs to be corrected to pay attention to the normalization
the library did for it. Your code may use a string as a ref and then
create something based on the refname; illustrating with a fictitious
example:
ref = make_branch_ref("refs/heads/%s", branch_name);
update_ref(ref, sha1);
write_log("created branch '%s'", branch_name);
Even though make_branch_ref() may have removed duplicated slashes from the
name in "branch_name" when it computed "ref", the log still will record
unnormalized name.
I think the callers need to be aware of the normalization in practice
anyway for this reason, and a good way forward is to give the callers a
library interface to do so. It might even make sense to make the other
parts of the API _reject_ unnormalized input to catch offending callers.
By the way, does this series introduce new infrastructure features that
can be reused in different areas, such as Hui's "alt_odb path
normalization" patch?