about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--cgit.h19
-rw-r--r--shared.c41
2 files changed, 60 insertions, 0 deletions
diff --git a/cgit.h b/cgit.h index e96311f..75e919b 100644 --- a/cgit.h +++ b/cgit.h
@@ -98,6 +98,21 @@ struct taginfo {
98 char *msg; 98 char *msg;
99}; 99};
100 100
101struct refinfo {
102 const char *refname;
103 struct object *object;
104 union {
105 struct taginfo *tag;
106 struct commitinfo *commit;
107 };
108};
109
110struct reflist {
111 struct refinfo **refs;
112 int alloc;
113 int count;
114};
115
101extern const char *cgit_version; 116extern const char *cgit_version;
102 117
103extern struct repolist cgit_repolist; 118extern struct repolist cgit_repolist;
@@ -162,6 +177,10 @@ extern int chk_non_negative(int result, char *msg);
162extern int hextoint(char c); 177extern int hextoint(char c);
163extern char *trim_end(const char *str, char c); 178extern char *trim_end(const char *str, char c);
164 179
180extern void cgit_add_ref(struct reflist *list, struct refinfo *ref);
181extern int cgit_refs_cb(const char *refname, const unsigned char *sha1,
182 int flags, void *cb_data);
183
165extern void *cgit_free_commitinfo(struct commitinfo *info); 184extern void *cgit_free_commitinfo(struct commitinfo *info);
166 185
167extern int cgit_diff_files(const unsigned char *old_sha1, 186extern int cgit_diff_files(const unsigned char *old_sha1,
diff --git a/shared.c b/shared.c index 3d4feea..d815cb1 100644 --- a/shared.c +++ b/shared.c
@@ -291,6 +291,47 @@ char *trim_end(const char *str, char c)
291 return s; 291 return s;
292} 292}
293 293
294void 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
306struct 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
324int 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
294void cgit_diff_tree_cb(struct diff_queue_struct *q, 335void 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{