summaryrefslogtreecommitdiffabout
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--ui-shared.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/ui-shared.c b/ui-shared.c
index a198cf2..64c237f 100644
--- a/ui-shared.c
+++ b/ui-shared.c
@@ -52,303 +52,303 @@ char *cgit_repourl(const char *reponame)
52{ 52{
53 if (cgit_virtual_root) { 53 if (cgit_virtual_root) {
54 return fmt("%s/%s/", cgit_virtual_root, reponame); 54 return fmt("%s/%s/", cgit_virtual_root, reponame);
55 } else { 55 } else {
56 return fmt("?r=%s", reponame); 56 return fmt("?r=%s", reponame);
57 } 57 }
58} 58}
59 59
60char *cgit_pageurl(const char *reponame, const char *pagename, 60char *cgit_pageurl(const char *reponame, const char *pagename,
61 const char *query) 61 const char *query)
62{ 62{
63 if (cgit_virtual_root) { 63 if (cgit_virtual_root) {
64 if (query) 64 if (query)
65 return fmt("%s/%s/%s/?%s", cgit_virtual_root, reponame, 65 return fmt("%s/%s/%s/?%s", cgit_virtual_root, reponame,
66 pagename, query); 66 pagename, query);
67 else 67 else
68 return fmt("%s/%s/%s/", cgit_virtual_root, reponame, 68 return fmt("%s/%s/%s/", cgit_virtual_root, reponame,
69 pagename); 69 pagename);
70 } else { 70 } else {
71 if (query) 71 if (query)
72 return fmt("?r=%s&p=%s&%s", reponame, pagename, query); 72 return fmt("?r=%s&p=%s&%s", reponame, pagename, query);
73 else 73 else
74 return fmt("?r=%s&p=%s", reponame, pagename); 74 return fmt("?r=%s&p=%s", reponame, pagename);
75 } 75 }
76} 76}
77 77
78char *cgit_currurl() 78char *cgit_currurl()
79{ 79{
80 if (!cgit_virtual_root) 80 if (!cgit_virtual_root)
81 return cgit_script_name; 81 return cgit_script_name;
82 else if (cgit_query_page) 82 else if (cgit_query_page)
83 return fmt("%s/%s/%s/", cgit_virtual_root, cgit_query_repo, cgit_query_page); 83 return fmt("%s/%s/%s/", cgit_virtual_root, cgit_query_repo, cgit_query_page);
84 else if (cgit_query_repo) 84 else if (cgit_query_repo)
85 return fmt("%s/%s/", cgit_virtual_root, cgit_query_repo); 85 return fmt("%s/%s/", cgit_virtual_root, cgit_query_repo);
86 else 86 else
87 return fmt("%s/", cgit_virtual_root); 87 return fmt("%s/", cgit_virtual_root);
88} 88}
89 89
90static char *repolink(char *title, char *class, char *page, char *head, 90static char *repolink(char *title, char *class, char *page, char *head,
91 char *path) 91 char *path)
92{ 92{
93 char *delim = "?"; 93 char *delim = "?";
94 94
95 html("<a"); 95 html("<a");
96 if (title) { 96 if (title) {
97 html(" title='"); 97 html(" title='");
98 html_attr(title); 98 html_attr(title);
99 html("'"); 99 html("'");
100 } 100 }
101 if (class) { 101 if (class) {
102 html(" class='"); 102 html(" class='");
103 html_attr(class); 103 html_attr(class);
104 html("'"); 104 html("'");
105 } 105 }
106 html(" href='"); 106 html(" href='");
107 if (cgit_virtual_root) { 107 if (cgit_virtual_root) {
108 html_attr(cgit_virtual_root); 108 html_attr(cgit_virtual_root);
109 if (cgit_virtual_root[strlen(cgit_virtual_root) - 1] != '/') 109 if (cgit_virtual_root[strlen(cgit_virtual_root) - 1] != '/')
110 html("/"); 110 html("/");
111 html_attr(cgit_repo->url); 111 html_attr(cgit_repo->url);
112 if (cgit_repo->url[strlen(cgit_repo->url) - 1] != '/') 112 if (cgit_repo->url[strlen(cgit_repo->url) - 1] != '/')
113 html("/"); 113 html("/");
114 if (page) { 114 if (page) {
115 html(page); 115 html(page);
116 html("/"); 116 html("/");
117 if (path) 117 if (path)
118 html_attr(path); 118 html_attr(path);
119 } 119 }
120 } else { 120 } else {
121 html(cgit_script_name); 121 html(cgit_script_name);
122 html("?url="); 122 html("?url=");
123 html_attr(cgit_repo->url); 123 html_attr(cgit_repo->url);
124 if (cgit_repo->url[strlen(cgit_repo->url) - 1] != '/') 124 if (cgit_repo->url[strlen(cgit_repo->url) - 1] != '/')
125 html("/"); 125 html("/");
126 if (page) { 126 if (page) {
127 html(page); 127 html(page);
128 html("/"); 128 html("/");
129 if (path) 129 if (path)
130 html_attr(path); 130 html_attr(path);
131 } 131 }
132 delim = "&amp;"; 132 delim = "&amp;";
133 } 133 }
134 if (head && strcmp(head, cgit_repo->defbranch)) { 134 if (head && strcmp(head, cgit_repo->defbranch)) {
135 html(delim); 135 html(delim);
136 html("h="); 136 html("h=");
137 html_attr(head); 137 html_attr(head);
138 delim = "&amp;"; 138 delim = "&amp;";
139 } 139 }
140 return fmt("%s", delim); 140 return fmt("%s", delim);
141} 141}
142 142
143static void reporevlink(char *page, char *name, char *title, char *class, 143static void reporevlink(char *page, char *name, char *title, char *class,
144 char *head, char *rev, char *path) 144 char *head, char *rev, char *path)
145{ 145{
146 char *delim; 146 char *delim;
147 147
148 delim = repolink(title, class, page, head, path); 148 delim = repolink(title, class, page, head, path);
149 if (rev && strcmp(rev, cgit_query_head)) { 149 if (rev && strcmp(rev, cgit_query_head)) {
150 html(delim); 150 html(delim);
151 html("id="); 151 html("id=");
152 html_attr(rev); 152 html_attr(rev);
153 } 153 }
154 html("'>"); 154 html("'>");
155 html_txt(name); 155 html_txt(name);
156 html("</a>"); 156 html("</a>");
157} 157}
158 158
159void cgit_tree_link(char *name, char *title, char *class, char *head, 159void cgit_tree_link(char *name, char *title, char *class, char *head,
160 char *rev, char *path) 160 char *rev, char *path)
161{ 161{
162 reporevlink("tree", name, title, class, head, rev, path); 162 reporevlink("tree", name, title, class, head, rev, path);
163} 163}
164 164
165void cgit_log_link(char *name, char *title, char *class, char *head, 165void cgit_log_link(char *name, char *title, char *class, char *head,
166 char *rev, char *path) 166 char *rev, char *path)
167{ 167{
168 reporevlink("log", name, title, class, head, rev, path); 168 reporevlink("log", name, title, class, head, rev, path);
169} 169}
170 170
171void cgit_commit_link(char *name, char *title, char *class, char *head, 171void cgit_commit_link(char *name, char *title, char *class, char *head,
172 char *rev) 172 char *rev)
173{ 173{
174 if (strlen(name) > cgit_max_msg_len && cgit_max_msg_len >= 15) { 174 if (strlen(name) > cgit_max_msg_len && cgit_max_msg_len >= 15) {
175 name[cgit_max_msg_len] = '\0'; 175 name[cgit_max_msg_len] = '\0';
176 name[cgit_max_msg_len - 1] = '.'; 176 name[cgit_max_msg_len - 1] = '.';
177 name[cgit_max_msg_len - 2] = '.'; 177 name[cgit_max_msg_len - 2] = '.';
178 name[cgit_max_msg_len - 3] = '.'; 178 name[cgit_max_msg_len - 3] = '.';
179 } 179 }
180 reporevlink("commit", name, title, class, head, rev, NULL); 180 reporevlink("commit", name, title, class, head, rev, NULL);
181} 181}
182 182
183void cgit_diff_link(char *name, char *title, char *class, char *head, 183void cgit_diff_link(char *name, char *title, char *class, char *head,
184 char *new_rev, char *old_rev, char *path) 184 char *new_rev, char *old_rev, char *path)
185{ 185{
186 char *delim; 186 char *delim;
187 187
188 delim = repolink(title, class, "diff", head, path); 188 delim = repolink(title, class, "diff", head, path);
189 if (new_rev && strcmp(new_rev, cgit_query_head)) { 189 if (new_rev && strcmp(new_rev, cgit_query_head)) {
190 html(delim); 190 html(delim);
191 html("id="); 191 html("id=");
192 html_attr(new_rev); 192 html_attr(new_rev);
193 delim = "&amp;"; 193 delim = "&amp;";
194 } 194 }
195 if (old_rev) { 195 if (old_rev) {
196 html(delim); 196 html(delim);
197 html("id2="); 197 html("id2=");
198 html_attr(old_rev); 198 html_attr(old_rev);
199 } 199 }
200 html("'>"); 200 html("'>");
201 html_txt(name); 201 html_txt(name);
202 html("</a>"); 202 html("</a>");
203} 203}
204 204
205void cgit_print_date(time_t secs, char *format) 205void cgit_print_date(time_t secs, char *format)
206{ 206{
207 char buf[64]; 207 char buf[64];
208 struct tm *time; 208 struct tm *time;
209 209
210 time = gmtime(&secs); 210 time = gmtime(&secs);
211 strftime(buf, sizeof(buf)-1, format, time); 211 strftime(buf, sizeof(buf)-1, format, time);
212 html_txt(buf); 212 html_txt(buf);
213} 213}
214 214
215void cgit_print_age(time_t t, time_t max_relative, char *format) 215void cgit_print_age(time_t t, time_t max_relative, char *format)
216{ 216{
217 time_t now, secs; 217 time_t now, secs;
218 218
219 time(&now); 219 time(&now);
220 secs = now - t; 220 secs = now - t;
221 221
222 if (secs > max_relative && max_relative >= 0) { 222 if (secs > max_relative && max_relative >= 0) {
223 cgit_print_date(t, format); 223 cgit_print_date(t, format);
224 return; 224 return;
225 } 225 }
226 226
227 if (secs < TM_HOUR * 2) { 227 if (secs < TM_HOUR * 2) {
228 htmlf("<span class='age-mins'>%.0f min.</span>", 228 htmlf("<span class='age-mins'>%.0f min.</span>",
229 secs * 1.0 / TM_MIN); 229 secs * 1.0 / TM_MIN);
230 return; 230 return;
231 } 231 }
232 if (secs < TM_DAY * 2) { 232 if (secs < TM_DAY * 2) {
233 htmlf("<span class='age-hours'>%.0f hours</span>", 233 htmlf("<span class='age-hours'>%.0f hours</span>",
234 secs * 1.0 / TM_HOUR); 234 secs * 1.0 / TM_HOUR);
235 return; 235 return;
236 } 236 }
237 if (secs < TM_WEEK * 2) { 237 if (secs < TM_WEEK * 2) {
238 htmlf("<span class='age-days'>%.0f days</span>", 238 htmlf("<span class='age-days'>%.0f days</span>",
239 secs * 1.0 / TM_DAY); 239 secs * 1.0 / TM_DAY);
240 return; 240 return;
241 } 241 }
242 if (secs < TM_MONTH * 2) { 242 if (secs < TM_MONTH * 2) {
243 htmlf("<span class='age-weeks'>%.0f weeks</span>", 243 htmlf("<span class='age-weeks'>%.0f weeks</span>",
244 secs * 1.0 / TM_WEEK); 244 secs * 1.0 / TM_WEEK);
245 return; 245 return;
246 } 246 }
247 if (secs < TM_YEAR * 2) { 247 if (secs < TM_YEAR * 2) {
248 htmlf("<span class='age-months'>%.0f months</span>", 248 htmlf("<span class='age-months'>%.0f months</span>",
249 secs * 1.0 / TM_MONTH); 249 secs * 1.0 / TM_MONTH);
250 return; 250 return;
251 } 251 }
252 htmlf("<span class='age-years'>%.0f years</span>", 252 htmlf("<span class='age-years'>%.0f years</span>",
253 secs * 1.0 / TM_YEAR); 253 secs * 1.0 / TM_YEAR);
254} 254}
255 255
256void cgit_print_docstart(char *title, struct cacheitem *item) 256void cgit_print_docstart(char *title, struct cacheitem *item)
257{ 257{
258 html("Content-Type: text/html; charset=utf-8\n"); 258 html("Content-Type: text/html; charset=utf-8\n");
259 htmlf("Last-Modified: %s\n", http_date(item->st.st_mtime)); 259 htmlf("Last-Modified: %s\n", http_date(item->st.st_mtime));
260 htmlf("Expires: %s\n", http_date(item->st.st_mtime + 260 htmlf("Expires: %s\n", http_date(item->st.st_mtime +
261 ttl_seconds(item->ttl))); 261 ttl_seconds(item->ttl)));
262 html("\n"); 262 html("\n");
263 html(cgit_doctype); 263 html(cgit_doctype);
264 html("<html>\n"); 264 html("<html>\n");
265 html("<head>\n"); 265 html("<head>\n");
266 html("<title>"); 266 html("<title>");
267 html_txt(title); 267 html_txt(title);
268 html("</title>\n"); 268 html("</title>\n");
269 htmlf("<meta name='generator' content='cgit v%s'/>\n", cgit_version); 269 htmlf("<meta name='generator' content='cgit v%s'/>\n", cgit_version);
270 html("<link rel='stylesheet' type='text/css' href='"); 270 html("<link rel='stylesheet' type='text/css' href='");
271 html_attr(cgit_css); 271 html_attr(cgit_css);
272 html("'/>\n"); 272 html("'/>\n");
273 html("</head>\n"); 273 html("</head>\n");
274 html("<body>\n"); 274 html("<body>\n");
275} 275}
276 276
277void cgit_print_docend() 277void cgit_print_docend()
278{ 278{
279 html("</td></tr></table>"); 279 html("</td></tr></table>");
280 html("</body>\n</html>\n"); 280 html("</body>\n</html>\n");
281} 281}
282 282
283void cgit_print_pageheader(char *title, int show_search) 283void cgit_print_pageheader(char *title, int show_search)
284{ 284{
285 html("<table id='layout'>"); 285 html("<table id='layout'>");
286 html("<tr><td id='header'><a href='"); 286 html("<tr><td id='header'><a href='");
287 html_attr(cgit_rooturl()); 287 html_attr(cgit_rooturl());
288 html("'>"); 288 html("'>");
289 html_txt(cgit_root_title); 289 html_txt(cgit_root_title);
290 html("</a></td><td id='logo'>"); 290 html("</a></td><td id='logo'>");
291 html("<a href='"); 291 html("<a href='");
292 html_attr(cgit_logo_link); 292 html_attr(cgit_logo_link);
293 htmlf("'><img src='%s' alt='logo'/></a>", cgit_logo); 293 htmlf("'><img src='%s' alt='logo'/></a>", cgit_logo);
294 html("</td></tr>"); 294 html("</td></tr>");
295 html("<tr><td id='crumb'>"); 295 html("<tr><td id='crumb'>");
296 if (cgit_query_repo) { 296 if (cgit_query_repo) {
297 html_txt(cgit_repo->name); 297 html_txt(cgit_repo->name);
298 html(" ("); 298 html(" (");
299 html_txt(cgit_query_head); 299 html_txt(cgit_query_head);
300 html(") : &nbsp;"); 300 html(") : &nbsp;");
301 reporevlink(NULL, "summary", NULL, NULL, cgit_query_head, 301 reporevlink(NULL, "summary", NULL, NULL, cgit_query_head,
302 NULL, NULL); 302 NULL, NULL);
303 html(" "); 303 html(" ");
304 cgit_log_link("log", NULL, NULL, cgit_query_head, 304 cgit_log_link("log", NULL, NULL, cgit_query_head,
305 cgit_query_sha1, cgit_query_path); 305 cgit_query_sha1, cgit_query_path);
306 html(" "); 306 html(" ");
307 cgit_tree_link("tree", NULL, NULL, cgit_query_head, 307 cgit_tree_link("tree", NULL, NULL, cgit_query_head,
308 cgit_query_sha1, cgit_query_path); 308 cgit_query_sha1, NULL);
309 html(" "); 309 html(" ");
310 cgit_commit_link("commit", NULL, NULL, cgit_query_head, 310 cgit_commit_link("commit", NULL, NULL, cgit_query_head,
311 cgit_query_sha1); 311 cgit_query_sha1);
312 html(" "); 312 html(" ");
313 cgit_diff_link("diff", NULL, NULL, cgit_query_head, 313 cgit_diff_link("diff", NULL, NULL, cgit_query_head,
314 cgit_query_sha1, cgit_query_sha2, 314 cgit_query_sha1, cgit_query_sha2,
315 cgit_query_path); 315 cgit_query_path);
316 } else { 316 } else {
317 html_txt("Index of repositories"); 317 html_txt("Index of repositories");
318 } 318 }
319 html("</td>"); 319 html("</td>");
320 html("<td id='search'>"); 320 html("<td id='search'>");
321 if (show_search) { 321 if (show_search) {
322 html("<form method='get' action='"); 322 html("<form method='get' action='");
323 html_attr(cgit_currurl()); 323 html_attr(cgit_currurl());
324 html("'>"); 324 html("'>");
325 if (!cgit_virtual_root) { 325 if (!cgit_virtual_root) {
326 if (cgit_query_repo) 326 if (cgit_query_repo)
327 html_hidden("r", cgit_query_repo); 327 html_hidden("r", cgit_query_repo);
328 if (cgit_query_page) 328 if (cgit_query_page)
329 html_hidden("p", cgit_query_page); 329 html_hidden("p", cgit_query_page);
330 } 330 }
331 if (cgit_query_head) 331 if (cgit_query_head)
332 html_hidden("h", cgit_query_head); 332 html_hidden("h", cgit_query_head);
333 if (cgit_query_sha1) 333 if (cgit_query_sha1)
334 html_hidden("id", cgit_query_sha1); 334 html_hidden("id", cgit_query_sha1);
335 if (cgit_query_sha2) 335 if (cgit_query_sha2)
336 html_hidden("id2", cgit_query_sha2); 336 html_hidden("id2", cgit_query_sha2);
337 html("<input type='text' name='q' value='"); 337 html("<input type='text' name='q' value='");
338 html_attr(cgit_query_search); 338 html_attr(cgit_query_search);
339 html("'/></form>"); 339 html("'/></form>");
340 } 340 }
341 html("</td></tr>"); 341 html("</td></tr>");
342 html("<tr><td id='content' colspan='2'>"); 342 html("<tr><td id='content' colspan='2'>");
343} 343}
344 344
345void cgit_print_snapshot_start(const char *mimetype, const char *filename, 345void cgit_print_snapshot_start(const char *mimetype, const char *filename,
346 struct cacheitem *item) 346 struct cacheitem *item)
347{ 347{
348 htmlf("Content-Type: %s\n", mimetype); 348 htmlf("Content-Type: %s\n", mimetype);
349 htmlf("Content-Disposition: inline; filename=\"%s\"\n", filename); 349 htmlf("Content-Disposition: inline; filename=\"%s\"\n", filename);
350 htmlf("Last-Modified: %s\n", http_date(item->st.st_mtime)); 350 htmlf("Last-Modified: %s\n", http_date(item->st.st_mtime));
351 htmlf("Expires: %s\n", http_date(item->st.st_mtime + 351 htmlf("Expires: %s\n", http_date(item->st.st_mtime +
352 ttl_seconds(item->ttl))); 352 ttl_seconds(item->ttl)));
353 html("\n"); 353 html("\n");
354} 354}