Remove the old ad-hoc parser for commit objects
[webgit] / src / object_commit.c
1 /*
2     cehtehs git web frontend
3
4   Copyright (C)
5     2007, 2008,         Christian Thaeter <ct@pipapo.org>
6
7   This program is free software: you can redistribute it and/or modify
8   it under the terms of the GNU Affero General Public License as published by
9   the Free Software Foundation, either version 3 of the License, or
10   (at your option) any later version.
11
12   This program is distributed in the hope that it will be useful,
13   but WITHOUT ANY WARRANTY; without even the implied warranty of
14   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15   GNU Affero General Public License for more details.
16
17   You should have received a copy of the GNU Affero General Public License
18   along with this program.  If not, see <http://www.gnu.org/licenses/>.
19 */
20
21 #include "object.h"
22 #include "repo.h"
23 #include "actions.h"
24 #include "summary.h"
25
26 char*
27 webgit_object_commit_tree_parse (struct commit* commit)
28 {
29   char* tree = strstr (commit->buffer, "tree ");
30   if (!tree)
31     return NULL;
32   return strncpy (cwa_buffer_provide (41), tree+5, 40);
33 }
34
35 time_t
36 webgit_object_commit_author_date_parse (struct commit* commit, struct tm* tm)
37 {
38   struct tm tmp;
39   if (!tm)
40     tm = &tmp;
41
42   char* author = strstr (commit->buffer, "author ");
43   if (!author)
44     return (time_t)-1;
45
46   char* beg = strchr (author, '>');
47   if (!beg)
48     return (time_t)-1;
49
50   if (!strptime (beg + 2, "%s %Z", tm))
51     return (time_t)-1;
52
53   return mktime (tm);
54 }
55
56
57 Html
58 webgit_object_commit_parents_parse (struct commit* commit, struct webgit_repo_info* repo)
59 {
60   Html parents = html_list ();
61
62   struct commit* parent;
63   while ((parent = pop_commit(&commit->parents)))
64     {
65       char* sha1 = sha1_to_hex (parent->object.sha1);
66
67       html_list_append (parents,
68                         html (
69                             "Parent: ",
70                             webgit_object_link (repo->query,
71                                                 repo->query->repo, strlen (repo->query->repo),
72                                                 repo->query->head, strlen (repo->query->head),
73                                                 sha1, 40,
74                                                 NULL, 0,
75                                                 NULL,
76                                                 html_fmt ("%.40s", sha1))
77                             )
78                       );
79     }
80
81   return parents;
82 }
83
84
85 Html
86 webgit_object_commit_author_name_parse (struct commit* commit)
87 {
88   char* author = strstr (commit->buffer, "author ");
89   if (!author)
90     return NULL;
91
92   char* end = strchr (author, '<');
93   if (!end)
94     return NULL;
95
96   return html_fmt ("%.*s", end-author-8, author+7);
97 }
98
99
100 Html
101 webgit_object_commit_author_email_parse (struct commit* commit)
102 {
103   char* author = strstr (commit->buffer, "author ");
104   if (!author)
105     return NULL;
106
107   char* beg = strchr (author, '<');
108   if (!beg)
109     return NULL;
110
111   char* end = strchr (beg, '>');
112   if (!end)
113     return NULL;
114
115
116   return html_fmt ("%.*s", end-beg-1, beg+1);
117 }
118
119
120 time_t
121 webgit_object_commit_committer_date_parse (struct commit* commit, struct tm* tm)
122 {
123   struct tm tmp;
124   if (!tm)
125     tm = &tmp;
126
127   char* committer = strstr (commit->buffer, "committer ");
128   if (!committer)
129     return (time_t)-1;
130
131   char* beg = strchr (committer, '>');
132   if (!beg)
133     return (time_t)-1;
134
135   if (!strptime (beg + 2, "%s %Z", tm))
136     return (time_t)-1;
137
138   return mktime (tm);
139 }
140
141
142 Html
143 webgit_object_commit_committer_name_parse (struct commit* commit)
144 {
145   char* committer = strstr (commit->buffer, "committer ");
146   if (!committer)
147     return NULL;
148
149   char* end = strchr (committer, '<');
150   if (!end)
151     return NULL;
152
153   return html_fmt ("%.*s", end-committer-11, committer+10);
154 }
155
156
157 Html
158 webgit_object_commit_committer_email_parse (struct commit* commit)
159 {
160   char* committer = strstr (commit->buffer, "committer ");
161   if (!committer)
162     return NULL;
163
164   char* beg = strchr (committer, '<');
165   if (!beg)
166     return NULL;
167
168   char* end = strchr (beg, '>');
169   if (!end)
170     return NULL;
171
172
173   return html_fmt ("%.*s", end-beg-1, beg+1);
174 }
175
176
177 Html
178 webgit_object_commit_header_parse (struct commit* commit)
179 {
180   char* header = strstr (commit->buffer, "\n\n");
181   if (!header)
182     return NULL;
183
184   char* end = strchr (header+2, '\n');
185   if (!end)
186     end = header + strlen (header+2);
187   else
188     --end;
189
190   return html_fmt ("%.*s", end-header, header+2);
191 }
192
193
194 Html
195 webgit_object_commit_message_parse (struct commit* commit)
196 {
197   char* header = strstr (commit->buffer, "\n\n");
198   if (!header)
199     return NULL;
200
201   header = strchr (header+2, '\n');
202   if (!header)
203     return html ();
204   else
205     ++header;
206
207   return html_fmt ("%.*s", strlen (header), header);
208 }
209
210
211 /*
212   Display commits
213 */
214 static Html
215 webgit_object_commit_menu_action (struct webgit_repo_info* repo, unsigned char* sha1, struct commit* commit)
216 {
217   (void) repo;
218   (void) sha1;
219   return html (html_tag ("div"),
220                webgit_repo_logo (repo), "<br />",
221                // TODO: "diff against.. <br />",
222                // TODO: "log <br />",
223                // TODO: "create branch <br />",
224                // TODO: "cherry pick? <br />",
225                // TODO: "log <br />",
226                webgit_summary_link (repo->query, repo, html("Summary")), "<br />",
227                webgit_main_link (repo->query, html ("Main"))
228                );
229 }
230
231
232 static Html
233 webgit_object_commit_content_action (struct webgit_repo_info* repo, unsigned char* sha1, struct commit* commit)
234 {
235   char* tree = webgit_object_commit_tree_parse (commit);
236
237   return html (
238                html (html_tag ("h3"), webgit_object_commit_header_parse (commit)),
239                html (html_tag ("div"),
240                      "Tree: ",
241                      webgit_object_link (repo->query,
242                                          repo->query->repo, strlen (repo->query->repo),
243                                          repo->query->head, strlen (repo->query->head),
244                                          tree, 40,
245                                          "", 0,
246                                          NULL,
247                                          html_strndup (tree, 40)
248                                          )
249                      ), html_nl (),
250                html (html_tag ("div"), webgit_object_commit_parents_parse (commit, repo)), html_nl (),
251                html (html_tag ("div"),
252                      webgit_object_commit_author_name_parse (commit), " ",
253                      webgit_object_commit_author_email_parse (commit), " ",
254                      webgit_pretty_date (webgit_object_commit_author_date_parse (commit, NULL))
255                      ), html_nl (),
256                html (html_tag ("div"),
257                      webgit_object_commit_committer_name_parse (commit), " ",
258                      webgit_object_commit_committer_email_parse (commit), " ",
259                      webgit_pretty_date (webgit_object_commit_committer_date_parse (commit, NULL))
260                      ), html_nl (),
261                html (html_tag ("pre"), webgit_object_commit_message_parse (commit))
262                );
263 }
264
265 Html
266 webgit_object_commit_action (struct webgit_repo_info* repo, unsigned char* sha1)
267 {
268   struct commit* commit = lookup_commit_reference (sha1);
269   parse_commit (commit);
270
271   return html(
272               html (html_tag("div", html_attr ("id", "sub-menu")),
273                     webgit_object_commit_menu_action (repo, sha1, commit)
274                     ), html_nl (),
275               html (html_tag("div", html_attr ("id", "object-commit")),
276                     webgit_object_commit_content_action (repo, sha1, commit)
277                     ), html_nl ()
278               );
279 }
280
281 /*
282 //      Local Variables:
283 //      mode: C
284 //      c-file-style: "gnu"
285 //      indent-tabs-mode: nil
286 //      End:
287 */