refs.c: refuse to lock badly named refs in lock_ref_sha1_basic

Move the check for check_refname_format from lock_any_ref_for_update to lock_ref_sha1_basic. At some later stage we will get rid of lock_any_ref_for_update completely. This has no visible impact to callers except for the inability to lock badly named refs, which is not possible today already for other reasons.(*) Keep lock_any_ref_for_update as a no-op wrapper. It is the public facing version of this interface and keeping it as a separate function will make it easier to experiment with the internal lock_ref_sha1_basic signature. (*) For example, if lock_ref_sha1_basic checks the refname format and refuses to lock badly named refs, it will not be possible to delete such refs because the first step of deletion is to lock the ref. We currently already fail in that case because these refs are not recognized to exist: $ cp .git/refs/heads/master .git/refs/heads/echo...\*\* $ git branch -D .git/refs/heads/echo...\*\* error: branch '.git/refs/heads/echo...**' not found. This has been broken for a while. Later patches in the series will start repairing the handling of badly named refs. Signed-off-by: Ronnie Sahlberg <sahlberg@google.com> Reviewed-by: Michael Haggerty <mhagger@alum.mit.edu> Signed-off-by: Jonathan Nieder <jrnieder@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Ronnie Sahlberg committed May 1, 2014 at 10:40 UTC 8a9df90d9a726fa9b1a1ebd13b9e43409e18c606
1 file changed +5 -2
refs.c
+5 -2
@@ -2150,6 +2150,11 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname,
2150 int missing = 0;
2151 int attempts_remaining = 3;
2152
2153 + if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
2154 + errno = EINVAL;
2155 + return NULL;
2156 + }
2157 +
2158 lock = xcalloc(1, sizeof(struct ref_lock));
2159 lock->lock_fd = -1;
2160
@@ -2241,8 +2246,6 @@ struct ref_lock *lock_any_ref_for_update(const char *refname,
2246 const unsigned char *old_sha1,
2247 int flags, int *type_p)
2248 {
2244 - if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL))
2245 - return NULL;
2249 return lock_ref_sha1_basic(refname, old_sha1, flags, type_p);
2250 }
2251