diff options
| -rw-r--r-- | cgit.h | 19 | ||||
| -rw-r--r-- | shared.c | 41 |
2 files changed, 60 insertions, 0 deletions
| @@ -98,6 +98,21 @@ struct taginfo { | |||
| 98 | char *msg; | 98 | char *msg; |
| 99 | }; | 99 | }; |
| 100 | 100 | ||
| 101 | struct refinfo { | ||
| 102 | const char *refname; | ||
| 103 | struct object *object; | ||
| 104 | union { | ||
| 105 | struct taginfo *tag; | ||
| 106 | struct commitinfo *commit; | ||
| 107 | }; | ||
| 108 | }; | ||
| 109 | |||
| 110 | struct reflist { | ||
| 111 | struct refinfo **refs; | ||
| 112 | int alloc; | ||
| 113 | int count; | ||
| 114 | }; | ||
| 115 | |||
| 101 | extern const char *cgit_version; | 116 | extern const char *cgit_version; |
| 102 | 117 | ||
| 103 | extern struct repolist cgit_repolist; | 118 | extern struct repolist cgit_repolist; |
| @@ -162,6 +177,10 @@ extern int chk_non_negative(int result, char *msg); | |||
| 162 | extern int hextoint(char c); | 177 | extern int hextoint(char c); |
| 163 | extern char *trim_end(const char *str, char c); | 178 | extern char *trim_end(const char *str, char c); |
| 164 | 179 | ||
| 180 | extern void cgit_add_ref(struct reflist *list, struct refinfo *ref); | ||
| 181 | extern int cgit_refs_cb(const char *refname, const unsigned char *sha1, | ||
| 182 | int flags, void *cb_data); | ||
| 183 | |||
| 165 | extern void *cgit_free_commitinfo(struct commitinfo *info); | 184 | extern void *cgit_free_commitinfo(struct commitinfo *info); |
| 166 | 185 | ||
| 167 | extern int cgit_diff_files(const unsigned char *old_sha1, | 186 | extern int cgit_diff_files(const unsigned char *old_sha1, |
| @@ -291,6 +291,47 @@ char *trim_end(const char *str, char c) | |||
| 291 | return s; | 291 | return s; |
| 292 | } | 292 | } |
| 293 | 293 | ||
| 294 | void cgit_add_ref(struct reflist *list, struct refinfo *ref) | ||
| 295 | { | ||
| 296 | size_t size; | ||
| 297 | |||
| 298 | if (list->count >= list->alloc) { | ||
| 299 | list->alloc += (list->alloc ? list->alloc : 4); | ||
| 300 | size = list->alloc * sizeof(struct refinfo *); | ||
| 301 | list->refs = xrealloc(list->refs, size); | ||
| 302 | } | ||
| 303 | list->refs[list->count++] = ref; | ||
| 304 | } | ||
| 305 | |||
| 306 | struct refinfo *cgit_mk_refinfo(const char *refname, const unsigned char *sha1) | ||
| 307 | { | ||
| 308 | struct refinfo *ref; | ||
| 309 | |||
| 310 | ref = xmalloc(sizeof (struct refinfo)); | ||
| 311 | ref->refname = xstrdup(refname); | ||
| 312 | ref->object = parse_object(sha1); | ||
| 313 | switch (ref->object->type) { | ||
| 314 | case OBJ_TAG: | ||
| 315 | ref->tag = cgit_parse_tag((struct tag *)ref->object); | ||
| 316 | break; | ||
| 317 | case OBJ_COMMIT: | ||
| 318 | ref->commit = cgit_parse_commit((struct commit *)ref->object); | ||
| 319 | break; | ||
| 320 | } | ||
| 321 | return ref; | ||
| 322 | } | ||
| 323 | |||
| 324 | int cgit_refs_cb(const char *refname, const unsigned char *sha1, int flags, | ||
| 325 | void *cb_data) | ||
| 326 | { | ||
| 327 | struct reflist *list = (struct reflist *)cb_data; | ||
| 328 | struct refinfo *info = cgit_mk_refinfo(refname, sha1); | ||
| 329 | |||
| 330 | if (info) | ||
| 331 | cgit_add_ref(list, info); | ||
| 332 | return 0; | ||
| 333 | } | ||
| 334 | |||
| 294 | void cgit_diff_tree_cb(struct diff_queue_struct *q, | 335 | void cgit_diff_tree_cb(struct diff_queue_struct *q, |
| 295 | struct diff_options *options, void *data) | 336 | struct diff_options *options, void *data) |
| 296 | { | 337 | { |
