all repos — cgit @ 38a0f9cd89c4c5a97bd5b38e7b56da809a00fccb

a hyperfast web frontend for git written in c

ui-commit.c (view raw)

  1/* ui-commit.c: generate commit view
  2 *
  3 * Copyright (C) 2006 Lars Hjemli
  4 *
  5 * Licensed under GNU General Public License v2
  6 *   (see COPYING for full license text)
  7 */
  8
  9#include "cgit.h"
 10
 11int files = 0;
 12
 13void print_filepair(struct diff_filepair *pair)
 14{
 15	char *query;
 16	char *class;
 17
 18	switch (pair->status) {
 19	case DIFF_STATUS_ADDED:
 20		class = "add";
 21		break;
 22	case DIFF_STATUS_COPIED:
 23		class = "cpy";
 24		break;
 25	case DIFF_STATUS_DELETED:
 26		class = "del";
 27		break;
 28	case DIFF_STATUS_MODIFIED:
 29		class = "upd";
 30		break;
 31	case DIFF_STATUS_RENAMED:
 32		class = "mov";
 33		break;
 34	case DIFF_STATUS_TYPE_CHANGED:
 35		class = "typ";
 36		break;
 37	case DIFF_STATUS_UNKNOWN:
 38		class = "unk";
 39		break;
 40	case DIFF_STATUS_UNMERGED:
 41		class = "stg";
 42		break;
 43	default:
 44		die("bug: unhandled diff status %c", pair->status);
 45	}
 46
 47	html("<tr>");
 48	htmlf("<td class='mode'>");
 49	if (is_null_sha1(pair->two->sha1)) {
 50		html_filemode(pair->one->mode);
 51	} else {
 52		html_filemode(pair->two->mode);
 53	}
 54
 55	if (pair->one->mode != pair->two->mode &&
 56	    !is_null_sha1(pair->one->sha1) &&
 57	    !is_null_sha1(pair->two->sha1)) {
 58		html("<span class='modechange'>[");
 59		html_filemode(pair->one->mode);
 60		html("]</span>");
 61	}
 62	htmlf("</td><td class='%s'>", class);
 63	query = fmt("id=%s&id2=%s", sha1_to_hex(pair->one->sha1),
 64		    sha1_to_hex(pair->two->sha1));
 65	html_link_open(cgit_pageurl(cgit_query_repo, "diff", query),
 66		       NULL, NULL);
 67	if (pair->status == DIFF_STATUS_COPIED ||
 68	    pair->status == DIFF_STATUS_RENAMED) {
 69		html_txt(pair->two->path);
 70		htmlf("</a> (%s from ", pair->status == DIFF_STATUS_COPIED ?
 71		      "copied" : "renamed");
 72		query = fmt("id=%s", sha1_to_hex(pair->one->sha1));
 73		html_link_open(cgit_pageurl(cgit_query_repo, "view", query),
 74			       NULL, NULL);
 75		html_txt(pair->one->path);
 76		html("</a>)");
 77	} else {
 78		html_txt(pair->two->path);
 79		html("</a>");
 80	}
 81	html("<td>");
 82
 83	//TODO: diffstat graph
 84
 85	html("</td></tr>\n");
 86	files++;
 87}
 88
 89void cgit_print_commit(const char *hex)
 90{
 91	struct commit *commit;
 92	struct commitinfo *info;
 93	struct commit_list *p;
 94	unsigned char sha1[20];
 95	char *query;
 96	char *filename;
 97
 98	if (get_sha1(hex, sha1)) {
 99		cgit_print_error(fmt("Bad object id: %s", hex));
100		return;
101	}
102	commit = lookup_commit_reference(sha1);
103	if (!commit) {
104		cgit_print_error(fmt("Bad commit reference: %s", hex));
105		return;
106	}
107	info = cgit_parse_commit(commit);
108
109	html("<table class='commit-info'>\n");
110	html("<tr><th>author</th><td>");
111	html_txt(info->author);
112	html(" ");
113	html_txt(info->author_email);
114	html("</td><td class='right'>");
115	cgit_print_date(info->author_date);
116	html("</td></tr>\n");
117	html("<tr><th>committer</th><td>");
118	html_txt(info->committer);
119	html(" ");
120	html_txt(info->committer_email);
121	html("</td><td class='right'>");
122	cgit_print_date(info->committer_date);
123	html("</td></tr>\n");
124	html("<tr><th>tree</th><td colspan='2' class='sha1'><a href='");
125	query = fmt("id=%s", sha1_to_hex(commit->tree->object.sha1));
126	html_attr(cgit_pageurl(cgit_query_repo, "tree", query));
127	htmlf("'>%s</a></td></tr>\n", sha1_to_hex(commit->tree->object.sha1));
128      	for (p = commit->parents; p ; p = p->next) {
129		html("<tr><th>parent</th>"
130		     "<td colspan='2' class='sha1'>"
131		     "<a href='");
132		query = fmt("id=%s", sha1_to_hex(p->item->object.sha1));
133		html_attr(cgit_pageurl(cgit_query_repo, "commit", query));
134		htmlf("'>%s</a></td></tr>\n",
135		      sha1_to_hex(p->item->object.sha1));
136	}
137	if (cgit_repo->snapshots) {
138		htmlf("<tr><th>download</th><td colspan='2' class='sha1'><a href='");
139		filename = fmt("%s-%s.zip", cgit_query_repo, hex);
140		html_attr(cgit_pageurl(cgit_query_repo, "snapshot",
141				       fmt("id=%s&name=%s", hex, filename)));
142		htmlf("'>%s</a></td></tr>", filename);
143	}
144	html("</table>\n");
145	html("<div class='commit-subject'>");
146	html_txt(info->subject);
147	html("</div>");
148	html("<div class='commit-msg'>");
149	html_txt(info->msg);
150	html("</div>");
151	html("<table class='diffstat'>");
152	html("<tr><th colspan='3'>Affected files</tr>\n");
153	cgit_diff_commit(commit, print_filepair);
154	htmlf("<tr><td colspan='3' class='summary'>"
155	      "%d file%s changed</td></tr>\n", files, files > 1 ? "s" : "");
156	html("</table>");
157	cgit_free_commitinfo(info);
158}