Author: Lars Hjemli <hjemli@gmail.com>
Add functions and types for ref lists This adds two structs, refinfo and reflist, and functions for building a list of refs. Signed-off-by: Lars Hjemli <hjemli@gmail.com>
cgit.h | 19 +++++++++++++++++++ shared.c | 41 +++++++++++++++++++++++++++++++++++++++++
diff --git a/cgit.h b/cgit.h index e96311fbda39fbc6bd03e52d73349a652a7e5e83..75e919b739ad1b95ee7321b87a624fa8f2a6b2d8 100644 --- a/cgit.h +++ b/cgit.h @@ -98,6 +98,21 @@ int tagger_date; char *msg; }; +struct refinfo { + const char *refname; + struct object *object; + union { + struct taginfo *tag; + struct commitinfo *commit; + }; +}; + +struct reflist { + struct refinfo **refs; + int alloc; + int count; +}; + extern const char *cgit_version; extern struct repolist cgit_repolist; @@ -161,6 +176,10 @@ extern int chk_non_negative(int result, char *msg); extern int hextoint(char c); extern char *trim_end(const char *str, char c); + +extern void cgit_add_ref(struct reflist *list, struct refinfo *ref); +extern int cgit_refs_cb(const char *refname, const unsigned char *sha1, + int flags, void *cb_data); extern void *cgit_free_commitinfo(struct commitinfo *info); diff --git a/shared.c b/shared.c index 3d4feeac2e415db10405f7f81eac3658f1d17b5b..d815cb1c5b9e47522e160926f80f9b23b7b54bce 100644 --- a/shared.c +++ b/shared.c @@ -291,6 +291,47 @@ t[len] = c; return s; } +void cgit_add_ref(struct reflist *list, struct refinfo *ref) +{ + size_t size; + + if (list->count >= list->alloc) { + list->alloc += (list->alloc ? list->alloc : 4); + size = list->alloc * sizeof(struct refinfo *); + list->refs = xrealloc(list->refs, size); + } + list->refs[list->count++] = ref; +} + +struct refinfo *cgit_mk_refinfo(const char *refname, const unsigned char *sha1) +{ + struct refinfo *ref; + + ref = xmalloc(sizeof (struct refinfo)); + ref->refname = xstrdup(refname); + ref->object = parse_object(sha1); + switch (ref->object->type) { + case OBJ_TAG: + ref->tag = cgit_parse_tag((struct tag *)ref->object); + break; + case OBJ_COMMIT: + ref->commit = cgit_parse_commit((struct commit *)ref->object); + break; + } + return ref; +} + +int cgit_refs_cb(const char *refname, const unsigned char *sha1, int flags, + void *cb_data) +{ + struct reflist *list = (struct reflist *)cb_data; + struct refinfo *info = cgit_mk_refinfo(refname, sha1); + + if (info) + cgit_add_ref(list, info); + return 0; +} + void cgit_diff_tree_cb(struct diff_queue_struct *q, struct diff_options *options, void *data) {