summaryrefslogtreecommitdiffabout
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-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
@@ -93,16 +93,31 @@ struct commitinfo {
93 93
94struct taginfo { 94struct taginfo {
95 char *tagger; 95 char *tagger;
96 char *tagger_email; 96 char *tagger_email;
97 int tagger_date; 97 int tagger_date;
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;
104extern struct repoinfo *cgit_repo; 119extern struct repoinfo *cgit_repo;
105extern int cgit_cmd; 120extern int cgit_cmd;
106 121
107extern char *cgit_root_title; 122extern char *cgit_root_title;
108extern char *cgit_css; 123extern char *cgit_css;
@@ -157,16 +172,20 @@ extern void cgit_querystring_cb(const char *name, const char *value);
157 172
158extern int chk_zero(int result, char *msg); 173extern int chk_zero(int result, char *msg);
159extern int chk_positive(int result, char *msg); 174extern int chk_positive(int result, char *msg);
160extern int chk_non_negative(int result, char *msg); 175extern int chk_non_negative(int result, char *msg);
161 176
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,
168 const unsigned char *new_sha1, 187 const unsigned char *new_sha1,
169 linediff_fn fn); 188 linediff_fn fn);
170 189
171extern void cgit_diff_tree(const unsigned char *old_sha1, 190extern void cgit_diff_tree(const unsigned char *old_sha1,
172 const unsigned char *new_sha1, 191 const unsigned char *new_sha1,
diff --git a/shared.c b/shared.c
index 3d4feea..d815cb1 100644
--- a/shared.c
+++ b/shared.c
@@ -286,16 +286,57 @@ char *trim_end(const char *str, char c)
286 286
287 c = t[len]; 287 c = t[len];
288 t[len] = '\0'; 288 t[len] = '\0';
289 s = xstrdup(t); 289 s = xstrdup(t);
290 t[len] = c; 290 t[len] = 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{
297 int i; 338 int i;
298 339
299 for (i = 0; i < q->nr; i++) { 340 for (i = 0; i < q->nr; i++) {
300 if (q->queue[i]->status == 'U') 341 if (q->queue[i]->status == 'U')
301 continue; 342 continue;