commit - 7e5c804bbace8241acc368ccd2087ae2aa1674d7
commit + 7a3c76f5480c716bf8b721ef7c5dac901259b222
blob - 5bf2f2a0e092c7e48d94de155fd252734cd6b21e
blob + 978e204964c04177074426b44f9e63c1823b2c20
--- lib/reference.c
+++ lib/reference.c
{
const struct got_error *err;
struct got_object_id *id;
- struct got_reflist_entry *re, *prev = NULL;
+ struct got_reflist_entry *new, *re, *prev;
int cmp;
+
+ err = got_ref_resolve(&id, repo, ref);
+ if (err)
+ return err;
+ new = malloc(sizeof(*re));
+ if (new == NULL) {
+ free(id);
+ return got_error_from_errno();
+ }
+ new->ref = ref;
+ new->id = id;
+
/*
* We must de-duplicate entries on insert because packed-refs may
* contain redundant entries. On-disk refs take precedence.
* This code assumes that on-disk revs are read before packed-refs.
* We're iterating the list anyway, so insert elements sorted by name.
*/
- SIMPLEQ_FOREACH(re, refs, entry) {
- cmp = strcmp(got_ref_get_name(re->ref), got_ref_get_name(ref));
+ re = SIMPLEQ_FIRST(refs);
+ while (re) {
+ cmp = got_path_cmp(got_ref_get_name(re->ref),
+ got_ref_get_name(ref));
if (cmp == 0) {
- free(ref);
- return NULL;
- } else if (cmp > 0)
- break;
- else
+ free(ref); /* duplicate */
+ return NULL;
+ } else if (cmp > 0) {
+ if (prev)
+ SIMPLEQ_INSERT_AFTER(refs, prev, new, entry);
+ else
+ SIMPLEQ_INSERT_HEAD(refs, new, entry);
+ return NULL;
+ } else {
prev = re;
+ re = SIMPLEQ_NEXT(re, entry);
+ }
}
- err = got_ref_resolve(&id, repo, ref);
- if (err)
- return err;
- re = malloc(sizeof(*re));
- if (re == NULL)
- return got_error_from_errno();
- re->ref = ref;
- re->id = id;
- if (prev)
- SIMPLEQ_INSERT_AFTER(refs, prev, re, entry);
- else
- SIMPLEQ_INSERT_TAIL(refs, re, entry);
-
+ SIMPLEQ_INSERT_TAIL(refs, new, entry);
return NULL;
}