Skip to content

Commit

Permalink
peel_ref(): fix return value for non-peelable, not-current reference
Browse files Browse the repository at this point in the history
The old version was inconsistent: when a reference was
REF_KNOWS_PEELED but with a null peeled value, it returned non-zero
for the current reference but zero for other references.  Change the
behavior for non-current references to match that of current_ref,
which is what callers expect.  Document the behavior.

Current callers only call peel_ref() from within a for_each_ref-style
iteration and only for the current ref; therefore, the buggy code path
was never reached.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Michael Haggerty authored and Junio C Hamano committed May 1, 2013
1 parent 68cf870 commit 2312a79
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 1 deletion.
5 changes: 4 additions & 1 deletion refs.c
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,8 @@ struct ref_value {
/*
* If REF_KNOWS_PEELED, then this field holds the peeled value
* of this reference, or null if the reference is known not to
* be peelable.
* be peelable. See the documentation for peel_ref() for an
* exact definition of "peelable".
*/
unsigned char peeled[20];
};
Expand Down Expand Up @@ -1340,6 +1341,8 @@ int peel_ref(const char *refname, unsigned char *sha1)
struct ref_entry *r = get_packed_ref(refname);

if (r && (r->flag & REF_KNOWS_PEELED)) {
if (is_null_sha1(r->u.value.peeled))
return -1;
hashcpy(sha1, r->u.value.peeled);
return 0;
}
Expand Down
8 changes: 8 additions & 0 deletions refs.h
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,14 @@ extern void add_packed_ref(const char *refname, const unsigned char *sha1);

extern int ref_exists(const char *);

/*
* If refname is a non-symbolic reference that refers to a tag object,
* and the tag can be (recursively) dereferenced to a non-tag object,
* store the SHA1 of the referred-to object to sha1 and return 0. If
* any of these conditions are not met, return a non-zero value.
* Symbolic references are considered unpeelable, even if they
* ultimately resolve to a peelable tag.
*/
extern int peel_ref(const char *refname, unsigned char *sha1);

/** Locks a "refs/" ref returning the lock on success and NULL on failure. **/
Expand Down

0 comments on commit 2312a79

Please sign in to comment.