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 | { |