refs.c: commit_packed_refs to return a meaningful errno on failure
Making errno when returning from commit_packed_refs() meaningful, which should fix * a bug in "git clone" where it prints strerror(errno) based on errno, despite errno possibly being zero and potentially having been clobbered by that point * the same kind of bug in "git pack-refs" and prepares for repack_without_refs() to get a meaningful error message when commit_packed_refs() fails without falling into the same bug. Signed-off-by: Ronnie Sahlberg <sahlberg@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com> Acked-by: Michael Haggerty <mhagger@alum.mit.edu>
This commit is contained in:

committed by
Junio C Hamano

parent
470a91ef75
commit
d3f6655505
10
refs.c
10
refs.c
@ -2239,11 +2239,16 @@ int lock_packed_refs(int flags)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Commit the packed refs changes.
|
||||||
|
* On error we must make sure that errno contains a meaningful value.
|
||||||
|
*/
|
||||||
int commit_packed_refs(void)
|
int commit_packed_refs(void)
|
||||||
{
|
{
|
||||||
struct packed_ref_cache *packed_ref_cache =
|
struct packed_ref_cache *packed_ref_cache =
|
||||||
get_packed_ref_cache(&ref_cache);
|
get_packed_ref_cache(&ref_cache);
|
||||||
int error = 0;
|
int error = 0;
|
||||||
|
int save_errno = 0;
|
||||||
|
|
||||||
if (!packed_ref_cache->lock)
|
if (!packed_ref_cache->lock)
|
||||||
die("internal error: packed-refs not locked");
|
die("internal error: packed-refs not locked");
|
||||||
@ -2253,10 +2258,13 @@ int commit_packed_refs(void)
|
|||||||
do_for_each_entry_in_dir(get_packed_ref_dir(packed_ref_cache),
|
do_for_each_entry_in_dir(get_packed_ref_dir(packed_ref_cache),
|
||||||
0, write_packed_entry_fn,
|
0, write_packed_entry_fn,
|
||||||
&packed_ref_cache->lock->fd);
|
&packed_ref_cache->lock->fd);
|
||||||
if (commit_lock_file(packed_ref_cache->lock))
|
if (commit_lock_file(packed_ref_cache->lock)) {
|
||||||
|
save_errno = errno;
|
||||||
error = -1;
|
error = -1;
|
||||||
|
}
|
||||||
packed_ref_cache->lock = NULL;
|
packed_ref_cache->lock = NULL;
|
||||||
release_packed_ref_cache(packed_ref_cache);
|
release_packed_ref_cache(packed_ref_cache);
|
||||||
|
errno = save_errno;
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
1
refs.h
1
refs.h
@ -98,6 +98,7 @@ extern void add_packed_ref(const char *refname, const unsigned char *sha1);
|
|||||||
* Write the current version of the packed refs cache from memory to
|
* Write the current version of the packed refs cache from memory to
|
||||||
* disk. The packed-refs file must already be locked for writing (see
|
* disk. The packed-refs file must already be locked for writing (see
|
||||||
* lock_packed_refs()). Return zero on success.
|
* lock_packed_refs()). Return zero on success.
|
||||||
|
* Sets errno to something meaningful on error.
|
||||||
*/
|
*/
|
||||||
extern int commit_packed_refs(void);
|
extern int commit_packed_refs(void);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user