]>
git.cameronkatri.com Git - cgit.git/blob - ui-log.c
1 /* ui-log.c: functions for log output
3 * Copyright (C) 2006 Lars Hjemli
5 * Licensed under GNU General Public License v2
6 * (see COPYING for full license text)
11 #include "ui-shared.h"
13 int files
, add_lines
, rem_lines
;
15 void count_lines(char *line
, int size
)
23 else if (line
[0] == '-')
27 void inspect_files(struct diff_filepair
*pair
)
30 if (ctx
.repo
->enable_log_linecount
)
31 cgit_diff_files(pair
->one
->sha1
, pair
->two
->sha1
, count_lines
);
34 void show_commit_decorations(struct commit
*commit
)
36 struct name_decoration
*deco
;
37 static char buf
[1024];
39 buf
[sizeof(buf
) - 1] = 0;
40 deco
= lookup_decoration(&name_decoration
, &commit
->object
);
42 if (!prefixcmp(deco
->name
, "refs/heads/")) {
43 strncpy(buf
, deco
->name
+ 11, sizeof(buf
) - 1);
44 cgit_log_link(buf
, NULL
, "branch-deco", buf
, NULL
, NULL
,
45 0, NULL
, NULL
, ctx
.qry
.showmsg
);
47 else if (!prefixcmp(deco
->name
, "tag: refs/tags/")) {
48 strncpy(buf
, deco
->name
+ 15, sizeof(buf
) - 1);
49 cgit_tag_link(buf
, NULL
, "tag-deco", ctx
.qry
.head
, buf
);
51 else if (!prefixcmp(deco
->name
, "refs/remotes/")) {
52 strncpy(buf
, deco
->name
+ 13, sizeof(buf
) - 1);
53 cgit_log_link(buf
, NULL
, "remote-deco", NULL
,
54 sha1_to_hex(commit
->object
.sha1
), NULL
,
55 0, NULL
, NULL
, ctx
.qry
.showmsg
);
58 strncpy(buf
, deco
->name
, sizeof(buf
) - 1);
59 cgit_commit_link(buf
, NULL
, "deco", ctx
.qry
.head
,
60 sha1_to_hex(commit
->object
.sha1
));
66 void print_commit(struct commit
*commit
)
68 struct commitinfo
*info
;
72 info
= cgit_parse_commit(commit
);
74 ctx
.qry
.showmsg
? " class='logheader'" : "");
75 tmp
= fmt("id=%s", sha1_to_hex(commit
->object
.sha1
));
76 tmp
= cgit_pageurl(ctx
.repo
->url
, "commit", tmp
);
77 html_link_open(tmp
, NULL
, NULL
);
78 cgit_print_age(commit
->date
, TM_WEEK
* 2, FMT_SHORTDATE
);
81 ctx
.qry
.showmsg
? " class='logsubject'" : "");
82 cgit_commit_link(info
->subject
, NULL
, NULL
, ctx
.qry
.head
,
83 sha1_to_hex(commit
->object
.sha1
));
84 show_commit_decorations(commit
);
86 html_txt(info
->author
);
87 if (ctx
.repo
->enable_log_filecount
) {
91 cgit_diff_commit(commit
, inspect_files
);
94 if (ctx
.repo
->enable_log_linecount
) {
96 htmlf("-%d/+%d", rem_lines
, add_lines
);
100 if (ctx
.qry
.showmsg
) {
101 if (ctx
.repo
->enable_log_filecount
) {
103 if (ctx
.repo
->enable_log_linecount
)
106 htmlf("<tr class='nohover'><td/><td colspan='%d' class='logmsg'>",
109 html("</td></tr>\n");
111 cgit_free_commitinfo(info
);
114 static const char *disambiguate_ref(const char *ref
)
116 unsigned char sha1
[20];
119 longref
= fmt("refs/heads/%s", ref
);
120 if (get_sha1(longref
, sha1
) == 0)
126 void cgit_print_log(const char *tip
, int ofs
, int cnt
, char *grep
, char *pattern
,
127 char *path
, int pager
)
130 struct commit
*commit
;
131 const char *argv
[] = {NULL
, NULL
, NULL
, NULL
, NULL
};
138 argv
[1] = disambiguate_ref(tip
);
140 if (grep
&& pattern
&& (!strcmp(grep
, "grep") ||
141 !strcmp(grep
, "author") ||
142 !strcmp(grep
, "committer")))
143 argv
[argc
++] = fmt("--%s=%s", grep
, pattern
);
149 init_revisions(&rev
, NULL
);
150 rev
.abbrev
= DEFAULT_ABBREV
;
151 rev
.commit_format
= CMIT_FMT_DEFAULT
;
152 rev
.verbose_header
= 1;
153 rev
.show_root_diff
= 0;
154 setup_revisions(argc
, argv
, &rev
, NULL
);
155 load_ref_decorations();
156 rev
.show_decorations
= 1;
157 rev
.grep_filter
.regflags
|= REG_ICASE
;
158 compile_grep_patterns(&rev
.grep_filter
);
159 prepare_revision_walk(&rev
);
162 html("<table class='list nowrap'>");
164 html("<tr class='nohover'><th class='left'>Age</th>"
165 "<th class='left'>Commit message");
168 cgit_log_link("toggle", NULL
, NULL
, ctx
.qry
.head
, ctx
.qry
.sha1
,
169 ctx
.qry
.path
, ctx
.qry
.ofs
, ctx
.qry
.grep
,
170 ctx
.qry
.search
, ctx
.qry
.showmsg
? 0 : 1);
173 html("</th><th class='left'>Author</th>");
174 if (ctx
.repo
->enable_log_filecount
) {
175 html("<th class='left'>Files</th>");
177 if (ctx
.repo
->enable_log_linecount
) {
178 html("<th class='left'>Lines</th>");
187 for (i
= 0; i
< ofs
&& (commit
= get_revision(&rev
)) != NULL
; i
++) {
188 free(commit
->buffer
);
189 commit
->buffer
= NULL
;
190 free_commit_list(commit
->parents
);
191 commit
->parents
= NULL
;
194 for (i
= 0; i
< cnt
&& (commit
= get_revision(&rev
)) != NULL
; i
++) {
195 print_commit(commit
);
196 free(commit
->buffer
);
197 commit
->buffer
= NULL
;
198 free_commit_list(commit
->parents
);
199 commit
->parents
= NULL
;
202 htmlf("</table><div class='pager'>",
205 cgit_log_link("[prev]", NULL
, NULL
, ctx
.qry
.head
,
206 ctx
.qry
.sha1
, ctx
.qry
.path
,
207 ofs
- cnt
, ctx
.qry
.grep
,
208 ctx
.qry
.search
, ctx
.qry
.showmsg
);
211 if ((commit
= get_revision(&rev
)) != NULL
) {
212 cgit_log_link("[next]", NULL
, NULL
, ctx
.qry
.head
,
213 ctx
.qry
.sha1
, ctx
.qry
.path
,
214 ofs
+ cnt
, ctx
.qry
.grep
,
215 ctx
.qry
.search
, ctx
.qry
.showmsg
);
218 } else if ((commit
= get_revision(&rev
)) != NULL
) {
219 html("<tr class='nohover'><td colspan='3'>");
220 cgit_log_link("[...]", NULL
, NULL
, ctx
.qry
.head
, NULL
, NULL
, 0,
221 NULL
, NULL
, ctx
.qry
.showmsg
);
222 html("</td></tr>\n");