cgit

ref: v0.5

./ui-log.c


  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/* ui-log.c: functions for log output
 *
 * Copyright (C) 2006 Lars Hjemli
 *
 * Licensed under GNU General Public License v2
 *   (see COPYING for full license text)
 */

#include "cgit.h"

int files, lines;

void count_lines(char *line, int size)
{
	if (size>0 && (line[0] == '+' || line[0] == '-'))
		lines++;
}

void inspect_files(struct diff_filepair *pair)
{
	files++;
	if (cgit_repo->enable_log_linecount)
		cgit_diff_files(pair->one->sha1, pair->two->sha1, count_lines);
}

void print_commit(struct commit *commit)
{
	struct commitinfo *info;

	info = cgit_parse_commit(commit);
	html("<tr><td>");
	cgit_print_age(commit->date, TM_WEEK * 2, FMT_SHORTDATE);
	html("</td><td>");
	char *qry = fmt("h=%s", sha1_to_hex(commit->object.sha1));
	char *url = cgit_pageurl(cgit_query_repo, "commit", qry);
	html_link_open(url, NULL, NULL);
	html_ntxt(cgit_max_msg_len, info->subject);
	html_link_close();
	if (cgit_repo->enable_log_filecount) {
		files = 0;
		lines = 0;
		cgit_diff_commit(commit, inspect_files);
		html("</td><td class='right'>");
		htmlf("%d", files);
		if (cgit_repo->enable_log_linecount) {
			html("</td><td class='right'>");
			htmlf("%d", lines);
		}
	}
	html("</td><td>");
	html_txt(info->author);
	html("</td></tr>\n");
	cgit_free_commitinfo(info);
}


void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *path)
{
	struct rev_info rev;
	struct commit *commit;
	const char *argv[] = {NULL, tip, NULL, NULL, NULL};
	int argc = 2;
	int i;

	if (grep)
		argv[argc++] = fmt("--grep=%s", grep);
	if (path) {
		argv[argc++] = "--";
		argv[argc++] = path;
	}
	init_revisions(&rev, NULL);
	rev.abbrev = DEFAULT_ABBREV;
	rev.commit_format = CMIT_FMT_DEFAULT;
	rev.verbose_header = 1;
	rev.show_root_diff = 0;
	setup_revisions(argc, argv, &rev, NULL);
	if (rev.grep_filter) {
		rev.grep_filter->regflags |= REG_ICASE;
		compile_grep_patterns(rev.grep_filter);
	}
	prepare_revision_walk(&rev);

	html("<table class='list nowrap'>");
	html("<tr class='nohover'><th class='left'>Age</th>"
	     "<th class='left'>Message</th>");

	if (cgit_repo->enable_log_filecount) {
		html("<th class='left'>Files</th>");
		if (cgit_repo->enable_log_linecount)
			html("<th class='left'>Lines</th>");
	}
	html("<th class='left'>Author</th></tr>\n");

	if (ofs<0)
		ofs = 0;

	for (i = 0; i < ofs && (commit = get_revision(&rev)) != NULL; i++) {
		free(commit->buffer);
		commit->buffer = NULL;
		free_commit_list(commit->parents);
		commit->parents = NULL;
	}

	for (i = 0; i < cnt && (commit = get_revision(&rev)) != NULL; i++) {
		print_commit(commit);
		free(commit->buffer);
		commit->buffer = NULL;
		free_commit_list(commit->parents);
		commit->parents = NULL;
	}
	html("</table>\n");

	html("<div class='pager'>");
	if (ofs > 0) {
		html("&nbsp;<a href='");
		html(cgit_pageurl(cgit_query_repo, cgit_query_page,
				  fmt("h=%s&ofs=%d", tip, ofs-cnt)));
		html("'>[prev]</a>&nbsp;");
       	}

	if ((commit = get_revision(&rev)) != NULL) {
		html("&nbsp;<a href='");
		html(cgit_pageurl(cgit_query_repo, "log",
				  fmt("h=%s&ofs=%d", tip, ofs+cnt)));
		html("'>[next]</a>&nbsp;");
	}
	html("</div>");
}