author | Lars Hjemli <hjemli@gmail.com> | 2007-01-17 00:09:51 (UTC) |
---|---|---|
committer | Lars Hjemli <hjemli@gmail.com> | 2007-01-17 00:09:51 (UTC) |
commit | a69061fdb7380d73715aeb3a0da6e91a24df90e4 (patch) (unidiff) | |
tree | bb514d5bfbab6e3b2904b2633a33175802f084d2 | |
parent | 06c81d6faafff1c80bc9e2302e5b8fea393b775b (diff) | |
download | cgit-a69061fdb7380d73715aeb3a0da6e91a24df90e4.zip cgit-a69061fdb7380d73715aeb3a0da6e91a24df90e4.tar.gz cgit-a69061fdb7380d73715aeb3a0da6e91a24df90e4.tar.bz2 |
Add function cgit_parse_tag()
Teach cgit how to extract author info from a tag.
Signed-off-by: Lars Hjemli <hjemli@gmail.com>
-rw-r--r-- | cgit.h | 8 | ||||
-rw-r--r-- | parsing.c | 47 |
2 files changed, 55 insertions, 0 deletions
@@ -6,48 +6,55 @@ | |||
6 | #include <ctype.h> | 6 | #include <ctype.h> |
7 | #include <sched.h> | 7 | #include <sched.h> |
8 | 8 | ||
9 | typedef void (*configfn)(const char *name, const char *value); | 9 | typedef void (*configfn)(const char *name, const char *value); |
10 | 10 | ||
11 | struct cacheitem { | 11 | struct cacheitem { |
12 | char *name; | 12 | char *name; |
13 | struct stat st; | 13 | struct stat st; |
14 | int ttl; | 14 | int ttl; |
15 | int fd; | 15 | int fd; |
16 | }; | 16 | }; |
17 | 17 | ||
18 | struct commitinfo { | 18 | struct commitinfo { |
19 | struct commit *commit; | 19 | struct commit *commit; |
20 | char *author; | 20 | char *author; |
21 | char *author_email; | 21 | char *author_email; |
22 | unsigned long author_date; | 22 | unsigned long author_date; |
23 | char *committer; | 23 | char *committer; |
24 | char *committer_email; | 24 | char *committer_email; |
25 | unsigned long committer_date; | 25 | unsigned long committer_date; |
26 | char *subject; | 26 | char *subject; |
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; |
33 | extern char *cgit_root_title; | 40 | extern char *cgit_root_title; |
34 | extern char *cgit_css; | 41 | extern char *cgit_css; |
35 | extern char *cgit_logo; | 42 | extern char *cgit_logo; |
36 | extern char *cgit_logo_link; | 43 | extern char *cgit_logo_link; |
37 | extern char *cgit_virtual_root; | 44 | extern char *cgit_virtual_root; |
38 | extern char *cgit_cache_root; | 45 | extern char *cgit_cache_root; |
39 | 46 | ||
40 | extern int cgit_nocache; | 47 | extern int cgit_nocache; |
41 | extern int cgit_max_lock_attempts; | 48 | extern int cgit_max_lock_attempts; |
42 | extern int cgit_cache_root_ttl; | 49 | extern int cgit_cache_root_ttl; |
43 | extern int cgit_cache_repo_ttl; | 50 | extern int cgit_cache_repo_ttl; |
44 | extern int cgit_cache_dynamic_ttl; | 51 | extern int cgit_cache_dynamic_ttl; |
45 | extern int cgit_cache_static_ttl; | 52 | extern int cgit_cache_static_ttl; |
46 | extern int cgit_cache_max_create_time; | 53 | extern int cgit_cache_max_create_time; |
47 | 54 | ||
48 | extern char *cgit_repo_name; | 55 | extern char *cgit_repo_name; |
49 | extern char *cgit_repo_desc; | 56 | extern char *cgit_repo_desc; |
50 | extern char *cgit_repo_owner; | 57 | extern char *cgit_repo_owner; |
51 | 58 | ||
52 | extern int cgit_query_has_symref; | 59 | extern int cgit_query_has_symref; |
53 | extern int cgit_query_has_sha1; | 60 | extern int cgit_query_has_sha1; |
@@ -66,48 +73,49 @@ extern int htmlfd; | |||
66 | 73 | ||
67 | extern void cgit_global_config_cb(const char *name, const char *value); | 74 | extern void cgit_global_config_cb(const char *name, const char *value); |
68 | extern void cgit_repo_config_cb(const char *name, const char *value); | 75 | extern void cgit_repo_config_cb(const char *name, const char *value); |
69 | extern void cgit_querystring_cb(const char *name, const char *value); | 76 | extern void cgit_querystring_cb(const char *name, const char *value); |
70 | 77 | ||
71 | extern int hextoint(char c); | 78 | extern int hextoint(char c); |
72 | 79 | ||
73 | extern void *cgit_free_commitinfo(struct commitinfo *info); | 80 | extern void *cgit_free_commitinfo(struct commitinfo *info); |
74 | 81 | ||
75 | extern char *fmt(const char *format,...); | 82 | extern char *fmt(const char *format,...); |
76 | 83 | ||
77 | extern void html(const char *txt); | 84 | extern void html(const char *txt); |
78 | extern void htmlf(const char *format,...); | 85 | extern void htmlf(const char *format,...); |
79 | extern void html_txt(char *txt); | 86 | extern void html_txt(char *txt); |
80 | extern void html_ntxt(int len, char *txt); | 87 | extern void html_ntxt(int len, char *txt); |
81 | extern void html_attr(char *txt); | 88 | extern void html_attr(char *txt); |
82 | extern void html_hidden(char *name, char *value); | 89 | extern void html_hidden(char *name, char *value); |
83 | extern void html_link_open(char *url, char *title, char *class); | 90 | extern void html_link_open(char *url, char *title, char *class); |
84 | extern void html_link_close(void); | 91 | extern void html_link_close(void); |
85 | extern void html_filemode(unsigned short mode); | 92 | extern void html_filemode(unsigned short mode); |
86 | 93 | ||
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); |
93 | extern int cache_unlock(struct cacheitem *item); | 101 | extern int cache_unlock(struct cacheitem *item); |
94 | extern int cache_cancel_lock(struct cacheitem *item); | 102 | extern int cache_cancel_lock(struct cacheitem *item); |
95 | extern int cache_exist(struct cacheitem *item); | 103 | extern int cache_exist(struct cacheitem *item); |
96 | extern int cache_expired(struct cacheitem *item); | 104 | extern int cache_expired(struct cacheitem *item); |
97 | 105 | ||
98 | extern char *cgit_repourl(const char *reponame); | 106 | extern char *cgit_repourl(const char *reponame); |
99 | extern char *cgit_pageurl(const char *reponame, const char *pagename, | 107 | extern char *cgit_pageurl(const char *reponame, const char *pagename, |
100 | const char *query); | 108 | const char *query); |
101 | 109 | ||
102 | extern void cgit_print_error(char *msg); | 110 | extern void cgit_print_error(char *msg); |
103 | extern void cgit_print_date(unsigned long secs); | 111 | extern void cgit_print_date(unsigned long secs); |
104 | extern void cgit_print_docstart(char *title, struct cacheitem *item); | 112 | extern void cgit_print_docstart(char *title, struct cacheitem *item); |
105 | extern void cgit_print_docend(); | 113 | extern void cgit_print_docend(); |
106 | extern void cgit_print_pageheader(char *title, int show_search); | 114 | extern void cgit_print_pageheader(char *title, int show_search); |
107 | 115 | ||
108 | extern void cgit_print_repolist(struct cacheitem *item); | 116 | extern void cgit_print_repolist(struct cacheitem *item); |
109 | extern void cgit_print_summary(); | 117 | extern void cgit_print_summary(); |
110 | extern void cgit_print_log(const char *tip, int ofs, int cnt, char *grep); | 118 | extern void cgit_print_log(const char *tip, int ofs, int cnt, char *grep); |
111 | extern void cgit_print_view(const char *hex); | 119 | extern void cgit_print_view(const char *hex); |
112 | extern void cgit_print_tree(const char *hex, char *path); | 120 | extern void cgit_print_tree(const char *hex, char *path); |
113 | extern void cgit_print_commit(const char *hex); | 121 | extern void cgit_print_commit(const char *hex); |
@@ -175,24 +175,71 @@ struct commitinfo *cgit_parse_commit(struct commit *commit) | |||
175 | p += 9; | 175 | p += 9; |
176 | t = strchr(p, '<') - 1; | 176 | t = strchr(p, '<') - 1; |
177 | ret->committer = substr(p, t); | 177 | ret->committer = substr(p, t); |
178 | p = t; | 178 | p = t; |
179 | t = strchr(t, '>') + 1; | 179 | t = strchr(t, '>') + 1; |
180 | ret->committer_email = substr(p, t); | 180 | ret->committer_email = substr(p, t); |
181 | ret->committer_date = atol(++t); | 181 | ret->committer_date = atol(++t); |
182 | p = strchr(t, '\n') + 1; | 182 | p = strchr(t, '\n') + 1; |
183 | } | 183 | } |
184 | 184 | ||
185 | while (*p == '\n') | 185 | while (*p == '\n') |
186 | p = strchr(p, '\n') + 1; | 186 | p = strchr(p, '\n') + 1; |
187 | 187 | ||
188 | t = strchr(p, '\n'); | 188 | t = strchr(p, '\n'); |
189 | if (t && *t) { | 189 | if (t && *t) { |
190 | ret->subject = substr(p, t); | 190 | ret->subject = substr(p, t); |
191 | p = t + 1; | 191 | p = t + 1; |
192 | 192 | ||
193 | while (*p == '\n') | 193 | while (*p == '\n') |
194 | p = strchr(p, '\n') + 1; | 194 | p = strchr(p, '\n') + 1; |
195 | ret->msg = p; | 195 | ret->msg = p; |
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 | } | ||