+ switch (info->status) {
+ case DIFF_STATUS_ADDED:
+ class = "add";
+ break;
+ case DIFF_STATUS_COPIED:
+ class = "cpy";
+ break;
+ case DIFF_STATUS_DELETED:
+ class = "del";
+ break;
+ case DIFF_STATUS_MODIFIED:
+ class = "upd";
+ break;
+ case DIFF_STATUS_RENAMED:
+ class = "mov";
+ break;
+ case DIFF_STATUS_TYPE_CHANGED:
+ class = "typ";
+ break;
+ case DIFF_STATUS_UNKNOWN:
+ class = "unk";
+ break;
+ case DIFF_STATUS_UNMERGED:
+ class = "stg";
+ break;
+ default:
+ die("bug: unhandled diff status %c", info->status);
+ }
+
+ html("<tr>");
+ htmlf("<td class='mode'>");
+ if (is_null_sha1(info->new_sha1)) {
+ html_filemode(info->old_mode);
+ } else {
+ html_filemode(info->new_mode);
+ }
+
+ if (info->old_mode != info->new_mode &&
+ !is_null_sha1(info->old_sha1) &&
+ !is_null_sha1(info->new_sha1)) {
+ html("<span class='modechange'>[");
+ html_filemode(info->old_mode);
+ html("]</span>");
+ }
+ htmlf("</td><td class='%s'>", class);
+ query = fmt("id=%s&id2=%s&path=%s", sha1_to_hex(info->old_sha1),
+ sha1_to_hex(info->new_sha1), info->new_path);
+ html_link_open(cgit_pageurl(cgit_query_repo, "diff", query),
+ NULL, NULL);
+ if (info->status == DIFF_STATUS_COPIED ||
+ info->status == DIFF_STATUS_RENAMED) {
+ html_txt(info->new_path);
+ htmlf("</a> (%s from ", info->status == DIFF_STATUS_COPIED ?
+ "copied" : "renamed");
+ query2 = fmt("id=%s", sha1_to_hex(info->old_sha1));
+ html_link_open(cgit_pageurl(cgit_query_repo, "view", query2),
+ NULL, NULL);
+ html_txt(info->old_path);
+ html("</a>)");
+ } else {
+ html_txt(info->new_path);
+ html("</a>");
+ }
+ html("</td><td class='right'>");
+ htmlf("%d", info->added + info->removed);
+ html("</td><td class='graph'>");
+ htmlf("<table width='%d%%'><tr>", (max_changes > 100 ? 100 : max_changes));
+ htmlf("<td class='add' style='width: %.1f%%;'/>",
+ info->added * 100.0 / max_changes);
+ htmlf("<td class='rem' style='width: %.1f%%;'/>",
+ info->removed * 100.0 / max_changes);
+ htmlf("<td class='none' style='width: %.1f%%;'/>",
+ (max_changes - info->removed - info->added) * 100.0 / max_changes);
+ html("</tr></table></td></tr>\n");
+}
+
+void cgit_count_diff_lines(char *line, int len)
+{
+ if (line && (len > 0)) {
+ if (line[0] == '+')
+ lines_added++;
+ else if (line[0] == '-')
+ lines_removed++;
+ }