lock_ref_sha1_basic(): report errors via a "struct strbuf *err"

For now, change the callers to spew the error to stderr like before.
But soon we will change them to incorporate the reason for the failure
into their own error messages.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
This commit is contained in:
Michael Haggerty 2015-05-11 17:25:15 +02:00 коммит произвёл Junio C Hamano
Родитель 1146f17e2c
Коммит 4a32b2e08b
1 изменённых файлов: 28 добавлений и 16 удалений

44
refs.c
Просмотреть файл

@ -2333,7 +2333,8 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname,
const unsigned char *old_sha1, const unsigned char *old_sha1,
const struct string_list *extras, const struct string_list *extras,
const struct string_list *skip, const struct string_list *skip,
unsigned int flags, int *type_p) unsigned int flags, int *type_p,
struct strbuf *err)
{ {
char *ref_file; char *ref_file;
const char *orig_refname = refname; const char *orig_refname = refname;
@ -2343,7 +2344,8 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname,
int mustexist = (old_sha1 && !is_null_sha1(old_sha1)); int mustexist = (old_sha1 && !is_null_sha1(old_sha1));
int resolve_flags = 0; int resolve_flags = 0;
int attempts_remaining = 3; int attempts_remaining = 3;
struct strbuf err = STRBUF_INIT;
assert(err);
lock = xcalloc(1, sizeof(struct ref_lock)); lock = xcalloc(1, sizeof(struct ref_lock));
lock->lock_fd = -1; lock->lock_fd = -1;
@ -2367,7 +2369,8 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname,
ref_file = git_path("%s", orig_refname); ref_file = git_path("%s", orig_refname);
if (remove_empty_directories(ref_file)) { if (remove_empty_directories(ref_file)) {
last_errno = errno; last_errno = errno;
error("there are still refs under '%s'", orig_refname); strbuf_addf(err, "there are still refs under '%s'",
orig_refname);
goto error_return; goto error_return;
} }
refname = resolve_ref_unsafe(orig_refname, resolve_flags, refname = resolve_ref_unsafe(orig_refname, resolve_flags,
@ -2377,8 +2380,8 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname,
*type_p = type; *type_p = type;
if (!refname) { if (!refname) {
last_errno = errno; last_errno = errno;
error("unable to resolve reference %s: %s", strbuf_addf(err, "unable to resolve reference %s: %s",
orig_refname, strerror(errno)); orig_refname, strerror(errno));
goto error_return; goto error_return;
} }
/* /*
@ -2389,8 +2392,7 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname,
*/ */
if (is_null_sha1(lock->old_sha1) && if (is_null_sha1(lock->old_sha1) &&
verify_refname_available(refname, extras, skip, verify_refname_available(refname, extras, skip,
get_packed_refs(&ref_cache), &err)) { get_packed_refs(&ref_cache), err)) {
error("%s", err.buf);
last_errno = ENOTDIR; last_errno = ENOTDIR;
goto error_return; goto error_return;
} }
@ -2416,7 +2418,7 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname,
/* fall through */ /* fall through */
default: default:
last_errno = errno; last_errno = errno;
error("unable to create directory for %s", ref_file); strbuf_addf(err, "unable to create directory for %s", ref_file);
goto error_return; goto error_return;
} }
@ -2431,8 +2433,7 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname,
*/ */
goto retry; goto retry;
else { else {
unable_to_lock_message(ref_file, errno, &err); unable_to_lock_message(ref_file, errno, err);
error("%s", err.buf);
goto error_return; goto error_return;
} }
} }
@ -2440,7 +2441,6 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname,
error_return: error_return:
unlock_ref(lock); unlock_ref(lock);
strbuf_release(&err);
errno = last_errno; errno = last_errno;
return NULL; return NULL;
} }
@ -2854,6 +2854,7 @@ int rename_ref(const char *oldrefname, const char *newrefname, const char *logms
struct stat loginfo; struct stat loginfo;
int log = !lstat(git_path("logs/%s", oldrefname), &loginfo); int log = !lstat(git_path("logs/%s", oldrefname), &loginfo);
const char *symref = NULL; const char *symref = NULL;
struct strbuf err = STRBUF_INIT;
if (log && S_ISLNK(loginfo.st_mode)) if (log && S_ISLNK(loginfo.st_mode))
return error("reflog for %s is a symlink", oldrefname); return error("reflog for %s is a symlink", oldrefname);
@ -2896,8 +2897,10 @@ int rename_ref(const char *oldrefname, const char *newrefname, const char *logms
logmoved = log; logmoved = log;
lock = lock_ref_sha1_basic(newrefname, NULL, NULL, NULL, 0, NULL); lock = lock_ref_sha1_basic(newrefname, NULL, NULL, NULL, 0, NULL, &err);
if (!lock) { if (!lock) {
error("%s", err.buf);
strbuf_release(&err);
error("unable to lock %s for update", newrefname); error("unable to lock %s for update", newrefname);
goto rollback; goto rollback;
} }
@ -2910,8 +2913,10 @@ int rename_ref(const char *oldrefname, const char *newrefname, const char *logms
return 0; return 0;
rollback: rollback:
lock = lock_ref_sha1_basic(oldrefname, NULL, NULL, NULL, 0, NULL); lock = lock_ref_sha1_basic(oldrefname, NULL, NULL, NULL, 0, NULL, &err);
if (!lock) { if (!lock) {
error("%s", err.buf);
strbuf_release(&err);
error("unable to lock %s for rollback", oldrefname); error("unable to lock %s for rollback", oldrefname);
goto rollbacklog; goto rollbacklog;
} }
@ -3824,11 +3829,14 @@ int ref_transaction_commit(struct ref_transaction *transaction,
update->old_sha1 : NULL), update->old_sha1 : NULL),
&affected_refnames, NULL, &affected_refnames, NULL,
flags, flags,
&update->type); &update->type,
err);
if (!update->lock) { if (!update->lock) {
ret = (errno == ENOTDIR) ret = (errno == ENOTDIR)
? TRANSACTION_NAME_CONFLICT ? TRANSACTION_NAME_CONFLICT
: TRANSACTION_GENERIC_ERROR; : TRANSACTION_GENERIC_ERROR;
error("%s", err->buf);
strbuf_reset(err);
strbuf_addf(err, "Cannot lock the ref '%s'.", strbuf_addf(err, "Cannot lock the ref '%s'.",
update->refname); update->refname);
goto cleanup; goto cleanup;
@ -4088,6 +4096,7 @@ int reflog_expire(const char *refname, const unsigned char *sha1,
char *log_file; char *log_file;
int status = 0; int status = 0;
int type; int type;
struct strbuf err = STRBUF_INIT;
memset(&cb, 0, sizeof(cb)); memset(&cb, 0, sizeof(cb));
cb.flags = flags; cb.flags = flags;
@ -4099,9 +4108,12 @@ int reflog_expire(const char *refname, const unsigned char *sha1,
* reference itself, plus we might need to update the * reference itself, plus we might need to update the
* reference if --updateref was specified: * reference if --updateref was specified:
*/ */
lock = lock_ref_sha1_basic(refname, sha1, NULL, NULL, 0, &type); lock = lock_ref_sha1_basic(refname, sha1, NULL, NULL, 0, &type, &err);
if (!lock) if (!lock) {
error("%s", err.buf);
strbuf_release(&err);
return error("cannot lock ref '%s'", refname); return error("cannot lock ref '%s'", refname);
}
if (!reflog_exists(refname)) { if (!reflog_exists(refname)) {
unlock_ref(lock); unlock_ref(lock);
return 0; return 0;