diff options
| -rw-r--r-- | cgit.h | 8 | ||||
| -rw-r--r-- | parsing.c | 47 |
2 files changed, 55 insertions, 0 deletions
| @@ -27,6 +27,13 @@ struct commitinfo { | |||
| 27 | char *msg; | 27 | char *msg; |
| 28 | }; | 28 | }; |
| 29 | 29 | ||
| 30 | struct taginfo { | ||
| 31 | char *tagger; | ||
| 32 | char *tagger_email; | ||
| 33 | int tagger_date; | ||
| 34 | char *msg; | ||
| 35 | }; | ||
| 36 | |||
| 30 | extern const char cgit_version[]; | 37 | extern const char cgit_version[]; |
| 31 | 38 | ||
| 32 | extern char *cgit_root; | 39 | extern char *cgit_root; |
| @@ -87,6 +94,7 @@ extern void html_filemode(unsigned short mode); | |||
| 87 | extern int cgit_read_config(const char *filename, configfn fn); | 94 | extern int cgit_read_config(const char *filename, configfn fn); |
| 88 | extern int cgit_parse_query(char *txt, configfn fn); | 95 | extern int cgit_parse_query(char *txt, configfn fn); |
| 89 | extern struct commitinfo *cgit_parse_commit(struct commit *commit); | 96 | extern struct commitinfo *cgit_parse_commit(struct commit *commit); |
| 97 | extern struct taginfo *cgit_parse_tag(struct tag *tag); | ||
| 90 | 98 | ||
| 91 | extern char *cache_safe_filename(const char *unsafe); | 99 | extern char *cache_safe_filename(const char *unsafe); |
| 92 | extern int cache_lock(struct cacheitem *item); | 100 | extern int cache_lock(struct cacheitem *item); |
| @@ -196,3 +196,50 @@ struct commitinfo *cgit_parse_commit(struct commit *commit) | |||
| 196 | } | 196 | } |
| 197 | return ret; | 197 | return ret; |
| 198 | } | 198 | } |
| 199 | |||
| 200 | |||
| 201 | struct taginfo *cgit_parse_tag(struct tag *tag) | ||
| 202 | { | ||
| 203 | void *data; | ||
| 204 | char type[20]; | ||
| 205 | unsigned long size; | ||
| 206 | char *p, *t; | ||
| 207 | struct taginfo *ret; | ||
| 208 | |||
| 209 | data = read_sha1_file(tag->object.sha1, type, &size); | ||
| 210 | if (!data || strcmp(type, tag_type)) { | ||
| 211 | free(data); | ||
| 212 | return 0; | ||
| 213 | } | ||
| 214 | |||
| 215 | ret = xmalloc(sizeof(*ret)); | ||
| 216 | ret->tagger = NULL; | ||
| 217 | ret->tagger_email = NULL; | ||
| 218 | ret->tagger_date = 0; | ||
| 219 | ret->msg = NULL; | ||
| 220 | |||
| 221 | p = data; | ||
| 222 | |||
| 223 | while (p) { | ||
| 224 | if (*p == '\n') | ||
| 225 | break; | ||
| 226 | |||
| 227 | if (!strncmp(p, "tagger ", 7)) { | ||
| 228 | p += 7; | ||
| 229 | t = strchr(p, '<') - 1; | ||
| 230 | ret->tagger = substr(p, t); | ||
| 231 | p = t; | ||
| 232 | t = strchr(t, '>') + 1; | ||
| 233 | ret->tagger_email = substr(p, t); | ||
| 234 | ret->tagger_date = atol(++t); | ||
| 235 | } | ||
| 236 | p = strchr(p, '\n') + 1; | ||
| 237 | } | ||
| 238 | |||
| 239 | while (p && (*p == '\n')) | ||
| 240 | p = strchr(p, '\n') + 1; | ||
| 241 | if (p) | ||
| 242 | ret->msg = xstrdup(p); | ||
| 243 | free(data); | ||
| 244 | return ret; | ||
| 245 | } | ||
