Sketch menu contents
[webgit] / src / object_tag.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
23 #define SHA1_HEADER <openssl/sha.h>
24 #include "git/tag.h"
25
26
27 time_t
28 webgit_object_tag_date_parse (void* buffer, unsigned long size, struct tm* tm)
29 {
30   struct tm tmp;
31   if (!tm)
32     tm = &tmp;
33
34   char* tagger = cwa_memmem (buffer, size, "tagger ", 7);
35   if (!tagger)
36     return (time_t)-1;
37
38   char* beg = strchr (tagger, '>');
39   if (!beg)
40     return (time_t)-1;
41
42   if (!strptime (beg + 2, "%s %Z", tm))
43     return (time_t)-1;
44
45   return mktime (tm);
46 }
47
48
49 int
50 webgit_object_tag_type_parse (char* dest, void* buffer, unsigned long size)
51 {
52   char* type = cwa_memmem (buffer, size, "type ", 5);
53   if (!type)
54     return -1;
55
56   char* end = strchr (type, '\n');
57   if (!end)
58     return -1;
59
60   return snprintf (dest, 16, "%.*s", end-type-5, type+5);
61 }
62
63
64 Html
65 webgit_object_tag_name_parse (void* buffer, unsigned long size)
66 {
67   char* tagger = cwa_memmem (buffer, size, "tagger ", 7);
68   if (!tagger)
69     return NULL;
70
71   char* end = strchr (tagger, '<');
72   if (!end)
73     return NULL;
74
75   return html_fmt ("%.*s", end-tagger-8, tagger+7);
76 }
77
78 Html
79 webgit_object_tag_email_parse (void* buffer, unsigned long size)
80 {
81   char* tagger = cwa_memmem (buffer, size, "tagger ", 7);
82   if (!tagger)
83     return NULL;
84
85   char* beg = strchr (tagger, '<');
86   if (!beg)
87     return NULL;
88
89   char* end = strchr (beg, '>');
90   if (!end)
91     return NULL;
92
93
94   return html_fmt ("%.*s", end-beg-1, beg+1);
95 }
96
97
98 Html
99 webgit_object_tag_header_parse (void* buffer, unsigned long size)
100 {
101   char* header = cwa_memmem (buffer, size, "\n\n", 2);
102   if (!header)
103     return NULL;
104
105   char* end = strchr (header+2, '\n');
106   if (!end)
107     end = header + strlen (header+2);
108   else
109     --end;
110
111   return html_fmt ("%.*s", end-header, header+2);
112 }
113
114
115 Html
116 webgit_object_tag_message_parse (void* buffer, unsigned long size)
117 {
118   char* header = cwa_memmem (buffer, size, "\n\n", 2);
119   if (!header)
120     return NULL;
121
122   char* beg = strchr (header+2, '\n');
123   if (!beg)
124     return html ();
125
126   return html_strndup (beg+1, size - (beg-header) - 1);
127 }
128
129
130
131
132
133 /*
134   Display Tags
135 */
136 static Html
137 webgit_object_tag_menu_action (struct webgit_repo_info* repo, struct tag* tag, void *buffer, unsigned long size)
138 {
139   (void) repo;
140   (void) tag;
141   (void) buffer;
142   (void) size;
143
144   return html (html_tag ("div"),
145                "Project or webgit logo<br />",
146                "commit <br />",
147                "log <br />",
148                "gpg info <br />",
149                "snapshot <br />",
150                "link to project summary <br />",
151                "link to main page <br />"
152                );
153 }
154
155 static Html
156 webgit_object_tag_content_action (struct webgit_repo_info* repo, struct tag* tag, void* buf, unsigned long size)
157 {
158   struct object* derefed = deref_tag ((struct object*)tag, NULL, 0);
159
160   char type[16];
161
162   webgit_object_tag_type_parse (type, buf, size);
163
164   char* sha1hex = sha1_to_hex (derefed->sha1);
165
166   struct tm tm;
167   webgit_object_tag_date_parse (buf, size, &tm);
168   char pretty_date[256];
169   strftime (pretty_date, 255, "%c", &tm);
170
171   Html ret;
172
173   ret= html (
174              html (
175                    html_tag ("h1"),
176                    html_strndup (tag->tag, SIZE_MAX),
177                    " - ",
178                    webgit_object_tag_header_parse (buf, size)
179                    ),
180              html_fmt ("Type '%s': ", type),
181              webgit_object_link (repo->query,
182                                  repo->name, strlen(repo->name),
183                                  sha1hex, 40,
184                                  NULL,
185                                  NULL,
186                                  html (sha1hex)),
187              !strcmp (type, "commit") ?
188              html (
189                    " ",
190                    webgit_object_link (repo->query,
191                                        repo->name, strlen(repo->name),
192                                        sha1hex, 40,
193                                        NULL,
194                                        "tree",
195                                        html ("Tree"))
196                    ) : html (),
197              html (html_tag ("br")),
198              "Tagger: ",
199              webgit_email_link (
200                                 webgit_object_tag_name_parse (buf, size),
201                                 webgit_object_tag_email_parse (buf, size)
202                                 ),
203              html_strndup (pretty_date, 255),
204              html (html_tag ("br")),
205              html (html_tag ("pre"),
206                    webgit_object_tag_message_parse (buf, size)
207                    )
208              );
209
210   return ret;
211 }
212
213 Html
214 webgit_object_tag_action (struct webgit_repo_info* repo, unsigned char* sha1)
215 {
216   struct tag* tag = lookup_tag (sha1);
217   enum object_type type;
218   void *buffer;
219   unsigned long size;
220
221   buffer = read_sha1_file (tag->object.sha1, &type, &size);
222
223   if (!tag->object.parsed)
224     parse_tag_buffer (tag, buffer, size);
225
226   parse_tag_buffer (tag, buffer, size);
227
228   return html(
229               html (html_tag("div", html_attr("id", "sub-menu")), webgit_object_tag_menu_action (repo, tag, buffer, size)), html_nl (),
230               html(html_tag("div", html_attr("id", "content")), webgit_object_tag_content_action (repo, tag, buffer, size)), html_nl ()
231               );
232 }
233
234
235
236 /*
237 //      Local Variables:
238 //      mode: C
239 //      c-file-style: "gnu"
240 //      indent-tabs-mode: nil
241 //      End:
242 */