author | Lars Hjemli <hjemli@gmail.com> | 2007-10-25 07:30:06 (UTC) |
---|---|---|
committer | Lars Hjemli <hjemli@gmail.com> | 2007-10-27 07:34:15 (UTC) |
commit | e397ff7024293223f48f235fcf072fc526cae7af (patch) (unidiff) | |
tree | cc88ee930bfc40dc1ebaad237345f79ad1085386 /shared.c | |
parent | 47bae9f58d5ecae437767b8e7835b23ad1804d0b (diff) | |
download | cgit-e397ff7024293223f48f235fcf072fc526cae7af.zip cgit-e397ff7024293223f48f235fcf072fc526cae7af.tar.gz cgit-e397ff7024293223f48f235fcf072fc526cae7af.tar.bz2 |
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>
-rw-r--r-- | shared.c | 41 |
1 files changed, 41 insertions, 0 deletions
@@ -278,32 +278,73 @@ char *trim_end(const char *str, char c) | |||
278 | return NULL; | 278 | return NULL; |
279 | t = (char *)str; | 279 | t = (char *)str; |
280 | len = strlen(t); | 280 | len = strlen(t); |
281 | while(len > 0 && t[len - 1] == c) | 281 | while(len > 0 && t[len - 1] == c) |
282 | len--; | 282 | len--; |
283 | 283 | ||
284 | if (len == 0) | 284 | if (len == 0) |
285 | return NULL; | 285 | return NULL; |
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 | ||
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 | { |
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; |
302 | ((filepair_fn)data)(q->queue[i]); | 343 | ((filepair_fn)data)(q->queue[i]); |
303 | } | 344 | } |
304 | } | 345 | } |
305 | 346 | ||
306 | static int load_mmfile(mmfile_t *file, const unsigned char *sha1) | 347 | static int load_mmfile(mmfile_t *file, const unsigned char *sha1) |
307 | { | 348 | { |
308 | enum object_type type; | 349 | enum object_type type; |
309 | 350 | ||