summaryrefslogtreecommitdiffabout
path: root/ui-shared.c
authorLars Hjemli <hjemli@gmail.com>2008-12-01 20:58:59 (UTC)
committer Lars Hjemli <hjemli@gmail.com>2008-12-01 21:01:26 (UTC)
commitc57aceb1d2f1a7d9fd3218fc8c6e9ea01b2952d2 (patch) (unidiff)
treede7a4c97a83ac348b96052be358cfd414de4afbc /ui-shared.c
parent6596268576a4f5fe2f5c8a3238856b0fb205ff76 (diff)
downloadcgit-c57aceb1d2f1a7d9fd3218fc8c6e9ea01b2952d2.zip
cgit-c57aceb1d2f1a7d9fd3218fc8c6e9ea01b2952d2.tar.gz
cgit-c57aceb1d2f1a7d9fd3218fc8c6e9ea01b2952d2.tar.bz2
ui-shared: shorten the sha1 printed by cgit_object_link
Such links was printed as the object type followed by the objects complete sha1. We still use the complete sha1 in the link but we no longer show it in all its glory; only the first 10 hex chars are printed. Signed-off-by: Lars Hjemli <hjemli@gmail.com>
Diffstat (limited to 'ui-shared.c') (more/less context) (ignore whitespace changes)
-rw-r--r--ui-shared.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/ui-shared.c b/ui-shared.c
index c4a506e..9319881 100644
--- a/ui-shared.c
+++ b/ui-shared.c
@@ -240,271 +240,273 @@ static char *repolink(char *title, char *class, char *page, char *head,
240 } 240 }
241 return fmt("%s", delim); 241 return fmt("%s", delim);
242} 242}
243 243
244static void reporevlink(char *page, char *name, char *title, char *class, 244static void reporevlink(char *page, char *name, char *title, char *class,
245 char *head, char *rev, char *path) 245 char *head, char *rev, char *path)
246{ 246{
247 char *delim; 247 char *delim;
248 248
249 delim = repolink(title, class, page, head, path); 249 delim = repolink(title, class, page, head, path);
250 if (rev && strcmp(rev, ctx.qry.head)) { 250 if (rev && strcmp(rev, ctx.qry.head)) {
251 html(delim); 251 html(delim);
252 html("id="); 252 html("id=");
253 html_url_arg(rev); 253 html_url_arg(rev);
254 } 254 }
255 html("'>"); 255 html("'>");
256 html_txt(name); 256 html_txt(name);
257 html("</a>"); 257 html("</a>");
258} 258}
259 259
260void cgit_summary_link(char *name, char *title, char *class, char *head) 260void cgit_summary_link(char *name, char *title, char *class, char *head)
261{ 261{
262 reporevlink(NULL, name, title, class, head, NULL, NULL); 262 reporevlink(NULL, name, title, class, head, NULL, NULL);
263} 263}
264 264
265void cgit_tag_link(char *name, char *title, char *class, char *head, 265void cgit_tag_link(char *name, char *title, char *class, char *head,
266 char *rev) 266 char *rev)
267{ 267{
268 reporevlink("tag", name, title, class, head, rev, NULL); 268 reporevlink("tag", name, title, class, head, rev, NULL);
269} 269}
270 270
271void cgit_tree_link(char *name, char *title, char *class, char *head, 271void cgit_tree_link(char *name, char *title, char *class, char *head,
272 char *rev, char *path) 272 char *rev, char *path)
273{ 273{
274 reporevlink("tree", name, title, class, head, rev, path); 274 reporevlink("tree", name, title, class, head, rev, path);
275} 275}
276 276
277void cgit_plain_link(char *name, char *title, char *class, char *head, 277void cgit_plain_link(char *name, char *title, char *class, char *head,
278 char *rev, char *path) 278 char *rev, char *path)
279{ 279{
280 reporevlink("plain", name, title, class, head, rev, path); 280 reporevlink("plain", name, title, class, head, rev, path);
281} 281}
282 282
283void cgit_log_link(char *name, char *title, char *class, char *head, 283void cgit_log_link(char *name, char *title, char *class, char *head,
284 char *rev, char *path, int ofs, char *grep, char *pattern) 284 char *rev, char *path, int ofs, char *grep, char *pattern)
285{ 285{
286 char *delim; 286 char *delim;
287 287
288 delim = repolink(title, class, "log", head, path); 288 delim = repolink(title, class, "log", head, path);
289 if (rev && strcmp(rev, ctx.qry.head)) { 289 if (rev && strcmp(rev, ctx.qry.head)) {
290 html(delim); 290 html(delim);
291 html("id="); 291 html("id=");
292 html_url_arg(rev); 292 html_url_arg(rev);
293 delim = "&"; 293 delim = "&";
294 } 294 }
295 if (grep && pattern) { 295 if (grep && pattern) {
296 html(delim); 296 html(delim);
297 html("qt="); 297 html("qt=");
298 html_url_arg(grep); 298 html_url_arg(grep);
299 delim = "&"; 299 delim = "&";
300 html(delim); 300 html(delim);
301 html("q="); 301 html("q=");
302 html_url_arg(pattern); 302 html_url_arg(pattern);
303 } 303 }
304 if (ofs > 0) { 304 if (ofs > 0) {
305 html(delim); 305 html(delim);
306 html("ofs="); 306 html("ofs=");
307 htmlf("%d", ofs); 307 htmlf("%d", ofs);
308 } 308 }
309 html("'>"); 309 html("'>");
310 html_txt(name); 310 html_txt(name);
311 html("</a>"); 311 html("</a>");
312} 312}
313 313
314void cgit_commit_link(char *name, char *title, char *class, char *head, 314void cgit_commit_link(char *name, char *title, char *class, char *head,
315 char *rev) 315 char *rev)
316{ 316{
317 if (strlen(name) > ctx.cfg.max_msg_len && ctx.cfg.max_msg_len >= 15) { 317 if (strlen(name) > ctx.cfg.max_msg_len && ctx.cfg.max_msg_len >= 15) {
318 name[ctx.cfg.max_msg_len] = '\0'; 318 name[ctx.cfg.max_msg_len] = '\0';
319 name[ctx.cfg.max_msg_len - 1] = '.'; 319 name[ctx.cfg.max_msg_len - 1] = '.';
320 name[ctx.cfg.max_msg_len - 2] = '.'; 320 name[ctx.cfg.max_msg_len - 2] = '.';
321 name[ctx.cfg.max_msg_len - 3] = '.'; 321 name[ctx.cfg.max_msg_len - 3] = '.';
322 } 322 }
323 reporevlink("commit", name, title, class, head, rev, NULL); 323 reporevlink("commit", name, title, class, head, rev, NULL);
324} 324}
325 325
326void cgit_refs_link(char *name, char *title, char *class, char *head, 326void cgit_refs_link(char *name, char *title, char *class, char *head,
327 char *rev, char *path) 327 char *rev, char *path)
328{ 328{
329 reporevlink("refs", name, title, class, head, rev, path); 329 reporevlink("refs", name, title, class, head, rev, path);
330} 330}
331 331
332void cgit_snapshot_link(char *name, char *title, char *class, char *head, 332void cgit_snapshot_link(char *name, char *title, char *class, char *head,
333 char *rev, char *archivename) 333 char *rev, char *archivename)
334{ 334{
335 reporevlink("snapshot", name, title, class, head, rev, archivename); 335 reporevlink("snapshot", name, title, class, head, rev, archivename);
336} 336}
337 337
338void cgit_diff_link(char *name, char *title, char *class, char *head, 338void cgit_diff_link(char *name, char *title, char *class, char *head,
339 char *new_rev, char *old_rev, char *path) 339 char *new_rev, char *old_rev, char *path)
340{ 340{
341 char *delim; 341 char *delim;
342 342
343 delim = repolink(title, class, "diff", head, path); 343 delim = repolink(title, class, "diff", head, path);
344 if (new_rev && strcmp(new_rev, ctx.qry.head)) { 344 if (new_rev && strcmp(new_rev, ctx.qry.head)) {
345 html(delim); 345 html(delim);
346 html("id="); 346 html("id=");
347 html_url_arg(new_rev); 347 html_url_arg(new_rev);
348 delim = "&amp;"; 348 delim = "&amp;";
349 } 349 }
350 if (old_rev) { 350 if (old_rev) {
351 html(delim); 351 html(delim);
352 html("id2="); 352 html("id2=");
353 html_url_arg(old_rev); 353 html_url_arg(old_rev);
354 } 354 }
355 html("'>"); 355 html("'>");
356 html_txt(name); 356 html_txt(name);
357 html("</a>"); 357 html("</a>");
358} 358}
359 359
360void cgit_patch_link(char *name, char *title, char *class, char *head, 360void cgit_patch_link(char *name, char *title, char *class, char *head,
361 char *rev) 361 char *rev)
362{ 362{
363 reporevlink("patch", name, title, class, head, rev, NULL); 363 reporevlink("patch", name, title, class, head, rev, NULL);
364} 364}
365 365
366void cgit_object_link(struct object *obj) 366void cgit_object_link(struct object *obj)
367{ 367{
368 char *page, *rev, *name; 368 char *page, *shortrev, *fullrev, *name;
369 369
370 fullrev = sha1_to_hex(obj->sha1);
371 shortrev = xstrdup(fullrev);
372 shortrev[10] = '\0';
370 if (obj->type == OBJ_COMMIT) { 373 if (obj->type == OBJ_COMMIT) {
371 cgit_commit_link(fmt("commit %s", sha1_to_hex(obj->sha1)), NULL, NULL, 374 cgit_commit_link(fmt("commit %s...", shortrev), NULL, NULL,
372 ctx.qry.head, sha1_to_hex(obj->sha1)); 375 ctx.qry.head, fullrev);
373 return; 376 return;
374 } else if (obj->type == OBJ_TREE) 377 } else if (obj->type == OBJ_TREE)
375 page = "tree"; 378 page = "tree";
376 else if (obj->type == OBJ_TAG) 379 else if (obj->type == OBJ_TAG)
377 page = "tag"; 380 page = "tag";
378 else 381 else
379 page = "blob"; 382 page = "blob";
380 rev = sha1_to_hex(obj->sha1); 383 name = fmt("%s %s...", typename(obj->type), shortrev);
381 name = fmt("%s %s", typename(obj->type), rev); 384 reporevlink(page, name, NULL, NULL, ctx.qry.head, fullrev, NULL);
382 reporevlink(page, name, NULL, NULL, ctx.qry.head, rev, NULL);
383} 385}
384 386
385void cgit_print_date(time_t secs, char *format, int local_time) 387void cgit_print_date(time_t secs, char *format, int local_time)
386{ 388{
387 char buf[64]; 389 char buf[64];
388 struct tm *time; 390 struct tm *time;
389 391
390 if (!secs) 392 if (!secs)
391 return; 393 return;
392 if(local_time) 394 if(local_time)
393 time = localtime(&secs); 395 time = localtime(&secs);
394 else 396 else
395 time = gmtime(&secs); 397 time = gmtime(&secs);
396 strftime(buf, sizeof(buf)-1, format, time); 398 strftime(buf, sizeof(buf)-1, format, time);
397 html_txt(buf); 399 html_txt(buf);
398} 400}
399 401
400void cgit_print_age(time_t t, time_t max_relative, char *format) 402void cgit_print_age(time_t t, time_t max_relative, char *format)
401{ 403{
402 time_t now, secs; 404 time_t now, secs;
403 405
404 if (!t) 406 if (!t)
405 return; 407 return;
406 time(&now); 408 time(&now);
407 secs = now - t; 409 secs = now - t;
408 410
409 if (secs > max_relative && max_relative >= 0) { 411 if (secs > max_relative && max_relative >= 0) {
410 cgit_print_date(t, format, ctx.cfg.local_time); 412 cgit_print_date(t, format, ctx.cfg.local_time);
411 return; 413 return;
412 } 414 }
413 415
414 if (secs < TM_HOUR * 2) { 416 if (secs < TM_HOUR * 2) {
415 htmlf("<span class='age-mins'>%.0f min.</span>", 417 htmlf("<span class='age-mins'>%.0f min.</span>",
416 secs * 1.0 / TM_MIN); 418 secs * 1.0 / TM_MIN);
417 return; 419 return;
418 } 420 }
419 if (secs < TM_DAY * 2) { 421 if (secs < TM_DAY * 2) {
420 htmlf("<span class='age-hours'>%.0f hours</span>", 422 htmlf("<span class='age-hours'>%.0f hours</span>",
421 secs * 1.0 / TM_HOUR); 423 secs * 1.0 / TM_HOUR);
422 return; 424 return;
423 } 425 }
424 if (secs < TM_WEEK * 2) { 426 if (secs < TM_WEEK * 2) {
425 htmlf("<span class='age-days'>%.0f days</span>", 427 htmlf("<span class='age-days'>%.0f days</span>",
426 secs * 1.0 / TM_DAY); 428 secs * 1.0 / TM_DAY);
427 return; 429 return;
428 } 430 }
429 if (secs < TM_MONTH * 2) { 431 if (secs < TM_MONTH * 2) {
430 htmlf("<span class='age-weeks'>%.0f weeks</span>", 432 htmlf("<span class='age-weeks'>%.0f weeks</span>",
431 secs * 1.0 / TM_WEEK); 433 secs * 1.0 / TM_WEEK);
432 return; 434 return;
433 } 435 }
434 if (secs < TM_YEAR * 2) { 436 if (secs < TM_YEAR * 2) {
435 htmlf("<span class='age-months'>%.0f months</span>", 437 htmlf("<span class='age-months'>%.0f months</span>",
436 secs * 1.0 / TM_MONTH); 438 secs * 1.0 / TM_MONTH);
437 return; 439 return;
438 } 440 }
439 htmlf("<span class='age-years'>%.0f years</span>", 441 htmlf("<span class='age-years'>%.0f years</span>",
440 secs * 1.0 / TM_YEAR); 442 secs * 1.0 / TM_YEAR);
441} 443}
442 444
443void cgit_print_http_headers(struct cgit_context *ctx) 445void cgit_print_http_headers(struct cgit_context *ctx)
444{ 446{
445 if (ctx->page.mimetype && ctx->page.charset) 447 if (ctx->page.mimetype && ctx->page.charset)
446 htmlf("Content-Type: %s; charset=%s\n", ctx->page.mimetype, 448 htmlf("Content-Type: %s; charset=%s\n", ctx->page.mimetype,
447 ctx->page.charset); 449 ctx->page.charset);
448 else if (ctx->page.mimetype) 450 else if (ctx->page.mimetype)
449 htmlf("Content-Type: %s\n", ctx->page.mimetype); 451 htmlf("Content-Type: %s\n", ctx->page.mimetype);
450 if (ctx->page.size) 452 if (ctx->page.size)
451 htmlf("Content-Length: %ld\n", ctx->page.size); 453 htmlf("Content-Length: %ld\n", ctx->page.size);
452 if (ctx->page.filename) 454 if (ctx->page.filename)
453 htmlf("Content-Disposition: inline; filename=\"%s\"\n", 455 htmlf("Content-Disposition: inline; filename=\"%s\"\n",
454 ctx->page.filename); 456 ctx->page.filename);
455 htmlf("Last-Modified: %s\n", http_date(ctx->page.modified)); 457 htmlf("Last-Modified: %s\n", http_date(ctx->page.modified));
456 htmlf("Expires: %s\n", http_date(ctx->page.expires)); 458 htmlf("Expires: %s\n", http_date(ctx->page.expires));
457 html("\n"); 459 html("\n");
458} 460}
459 461
460void cgit_print_docstart(struct cgit_context *ctx) 462void cgit_print_docstart(struct cgit_context *ctx)
461{ 463{
462 char *host = cgit_hosturl(); 464 char *host = cgit_hosturl();
463 html(cgit_doctype); 465 html(cgit_doctype);
464 html("<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en' lang='en'>\n"); 466 html("<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en' lang='en'>\n");
465 html("<head>\n"); 467 html("<head>\n");
466 html("<title>"); 468 html("<title>");
467 html_txt(ctx->page.title); 469 html_txt(ctx->page.title);
468 html("</title>\n"); 470 html("</title>\n");
469 htmlf("<meta name='generator' content='cgit %s'/>\n", cgit_version); 471 htmlf("<meta name='generator' content='cgit %s'/>\n", cgit_version);
470 if (ctx->cfg.robots && *ctx->cfg.robots) 472 if (ctx->cfg.robots && *ctx->cfg.robots)
471 htmlf("<meta name='robots' content='%s'/>\n", ctx->cfg.robots); 473 htmlf("<meta name='robots' content='%s'/>\n", ctx->cfg.robots);
472 html("<link rel='stylesheet' type='text/css' href='"); 474 html("<link rel='stylesheet' type='text/css' href='");
473 html_attr(ctx->cfg.css); 475 html_attr(ctx->cfg.css);
474 html("'/>\n"); 476 html("'/>\n");
475 if (ctx->cfg.favicon) { 477 if (ctx->cfg.favicon) {
476 html("<link rel='shortcut icon' href='"); 478 html("<link rel='shortcut icon' href='");
477 html_attr(ctx->cfg.favicon); 479 html_attr(ctx->cfg.favicon);
478 html("'/>\n"); 480 html("'/>\n");
479 } 481 }
480 if (host && ctx->repo) { 482 if (host && ctx->repo) {
481 html("<link rel='alternate' title='Atom feed' href='http://"); 483 html("<link rel='alternate' title='Atom feed' href='http://");
482 html_attr(cgit_hosturl()); 484 html_attr(cgit_hosturl());
483 html_attr(cgit_fileurl(ctx->repo->url, "atom", ctx->qry.path, 485 html_attr(cgit_fileurl(ctx->repo->url, "atom", ctx->qry.path,
484 fmt("h=%s", ctx->qry.head))); 486 fmt("h=%s", ctx->qry.head)));
485 html("' type='application/atom+xml'/>"); 487 html("' type='application/atom+xml'/>");
486 } 488 }
487 html("</head>\n"); 489 html("</head>\n");
488 html("<body>\n"); 490 html("<body>\n");
489} 491}
490 492
491void cgit_print_docend() 493void cgit_print_docend()
492{ 494{
493 html("</div>"); 495 html("</div>");
494 if (ctx.cfg.footer) 496 if (ctx.cfg.footer)
495 html_include(ctx.cfg.footer); 497 html_include(ctx.cfg.footer);
496 else { 498 else {
497 htmlf("<div class='footer'>generated by cgit %s at ", 499 htmlf("<div class='footer'>generated by cgit %s at ",
498 cgit_version); 500 cgit_version);
499 cgit_print_date(time(NULL), FMT_LONGDATE, ctx.cfg.local_time); 501 cgit_print_date(time(NULL), FMT_LONGDATE, ctx.cfg.local_time);
500 html("</div>\n"); 502 html("</div>\n");
501 } 503 }
502 html("</body>\n</html>\n"); 504 html("</body>\n</html>\n");
503} 505}
504 506
505int print_branch_option(const char *refname, const unsigned char *sha1, 507int print_branch_option(const char *refname, const unsigned char *sha1,
506 int flags, void *cb_data) 508 int flags, void *cb_data)
507{ 509{
508 char *name = (char *)refname; 510 char *name = (char *)refname;
509 html_option(name, name, ctx.qry.head); 511 html_option(name, name, ctx.qry.head);
510 return 0; 512 return 0;