341
return refs->loose;
342
}
343
344
-static int files_read_raw_ref(struct ref_store *ref_store,
345
- const char *refname, struct object_id *oid,
346
- struct strbuf *referent, unsigned int *type)
344
+static int files_read_raw_ref(struct ref_store *ref_store, const char *refname,
345
+ struct object_id *oid, struct strbuf *referent,
346
+ unsigned int *type, int *failure_errno)
347
{
348
struct files_ref_store *refs =
349
files_downcast(ref_store, REF_STORE_READ, "read_raw_ref");
354
struct stat st;
355
int fd;
356
int ret = -1;
357
- int save_errno;
357
int remaining_retries = 3;
358
359
*type = 0;
458
ret = parse_loose_ref_contents(buf, oid, referent, type);
459
460
out:
462
- save_errno = errno;
461
+ *failure_errno = errno;
462
strbuf_release(&sb_path);
463
strbuf_release(&sb_contents);
465
- errno = save_errno;
464
return ret;
465
}
466
538
struct strbuf ref_file = STRBUF_INIT;
539
int attempts_remaining = 3;
540
int ret = TRANSACTION_GENERIC_ERROR;
541
+ int failure_errno;
542
543
assert(err);
544
files_assert_main_repository(refs, "lock_raw_ref");
609
if (hold_lock_file_for_update_timeout(
610
&lock->lk, ref_file.buf, LOCK_NO_DEREF,
611
get_files_ref_lock_timeout_ms()) < 0) {
613
- if (errno == ENOENT && --attempts_remaining > 0) {
612
+ int myerr = errno;
613
+ errno = 0;
614
+ if (myerr == ENOENT && --attempts_remaining > 0) {
615
/*
616
* Maybe somebody just deleted one of the
617
* directories leading to ref_file. Try
619
*/
620
goto retry;
621
} else {
621
- unable_to_lock_message(ref_file.buf, errno, err);
622
+ unable_to_lock_message(ref_file.buf, myerr, err);
623
goto error_return;
624
}
625
}
629
* fear that its value will change.
630
*/
631
631
- if (files_read_raw_ref(&refs->base, refname,
632
- &lock->old_oid, referent, type)) {
633
- if (errno == ENOENT) {
632
+ if (files_read_raw_ref(&refs->base, refname, &lock->old_oid, referent,
633
+ type, &failure_errno)) {
634
+ if (failure_errno == ENOENT) {
635
if (mustexist) {
636
/* Garden variety missing reference. */
637
strbuf_addf(err, "unable to resolve reference '%s'",
655
* reference named "refs/foo/bar/baz".
656
*/
657
}
657
- } else if (errno == EISDIR) {
658
+ } else if (failure_errno == EISDIR) {
659
/*
660
* There is a directory in the way. It might have
661
* contained references that have been deleted. If
693
goto error_return;
694
}
695
}
695
- } else if (errno == EINVAL && (*type & REF_ISBROKEN)) {
696
+ } else if (failure_errno == EINVAL && (*type & REF_ISBROKEN)) {
697
strbuf_addf(err, "unable to resolve reference '%s': "
698
"reference broken", refname);
699
goto error_return;
700
} else {
701
strbuf_addf(err, "unable to resolve reference '%s': %s",
701
- refname, strerror(errno));
702
+ refname, strerror(failure_errno));
703
goto error_return;
704
}
705