diff options
Diffstat (limited to 'source')
| -rw-r--r-- | source/cmd.c | 2 | |
| -rw-r--r-- | source/ui-log.c | 27 | |
| -rw-r--r-- | source/ui-log.h | 8 | |
| -rw-r--r-- | source/ui-refs.c | 64 | |
| -rw-r--r-- | source/ui-refs.h | 10 | |
| -rw-r--r-- | source/ui-summary.c | 25 |
6 files changed, 93 insertions, 43 deletions
diff --git a/source/cmd.c b/source/cmd.c index 08de123..8f89e3b 100644 --- a/source/cmd.c +++ b/source/cmd.c @@ -96,7 +96,7 @@ static void log_fn(void) cgit_print_log( ctx.qry.oid, ctx.qry.ofs, ctx.cfg.max_commit_count, ctx.qry.grep, ctx.qry.search, ctx.qry.path, 1, ctx.repo->enable_commit_graph, - ctx.repo->commit_sort + ctx.repo->commit_sort, 0 ); } diff --git a/source/ui-log.c b/source/ui-log.c index 98efcf6..2812246 100644 --- a/source/ui-log.c +++ b/source/ui-log.c @@ -212,7 +212,15 @@ static void print_graph_padding(struct rev_info *revs, struct strbuf *graph, int html("</td>\n"); } -static void print_commit(struct commit *commit, struct rev_info *revs) +// Ends a row in a table wider than the log with an empty cell for each column +// the log has no use for. +static void print_filler(int columns) +{ + while (columns-- > 0) + html("<td></td>"); +} + +static void print_commit(struct commit *commit, struct rev_info *revs, int filler) { struct commitinfo *info; int columns = revs->graph ? 4 : 3; @@ -223,6 +231,8 @@ static void print_commit(struct commit *commit, struct rev_info *revs) columns++; if (ctx.repo->enable_log_linecount) columns++; + // The rows that span the table reach across the filler as well. + columns += filler; if (revs->graph) print_graph_above(revs, &graphbuf, columns); @@ -270,7 +280,9 @@ static void print_commit(struct commit *commit, struct rev_info *revs) htmlf("</td><td class='col-count'><span class='deletions'>-%d</span>/" "<span class='insertions'>+%d</span>", removed_lines, added_lines); - html("</td></tr>\n"); + html("</td>"); + print_filler(filler); + html("</tr>\n"); if ((revs->graph && !graph_is_commit_finished(revs->graph)) || ctx.qry.showmsg) { html("<tr class='nohover-highlight'>"); @@ -449,12 +461,12 @@ void cgit_print_commit_decorations(struct commit *commit) } void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *pattern, - const char *path, int pager, int commit_graph, int commit_sort) + const char *path, int pager, int commit_graph, int commit_sort, int table_columns) { struct rev_info rev; struct commit *commit; struct strvec rev_argv = STRVEC_INIT; - int i, columns = commit_graph ? 4 : 3; + int i, columns = commit_graph ? 4 : 3, filler = 0; int must_free_tip = 0; // setup_revisions skips the first entry the way a command skips its @@ -591,6 +603,9 @@ void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *pattern html("<th class='left col-count' scope='col'>Lines</th>"); columns++; } + if (table_columns > columns) + filler = table_columns - columns; + print_filler(filler); html("</tr>\n"); if (ofs < 0) @@ -609,7 +624,7 @@ void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *pattern counts_ready = 0; if (should_show(commit, &rev)) { i++; - print_commit(commit, &rev); + print_commit(commit, &rev, filler); } release_commit_memory(the_repository->parsed_objects, commit); commit->parents = NULL; @@ -619,7 +634,7 @@ void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *pattern cgit_print_layout_end(); } else { if (get_revision(&rev)) { - htmlf("<tr class='nohover'><td colspan='%d'>", columns); + htmlf("<tr class='nohover'><td colspan='%d'>", columns + filler); cgit_log_link( "[...]", NULL, NULL, ctx.qry.head, NULL, ctx.qry.vpath, 0, NULL, NULL, ctx.qry.showmsg, ctx.qry.follow diff --git a/source/ui-log.h b/source/ui-log.h index 8e6e3db..d01a63d 100644 --- a/source/ui-log.h +++ b/source/ui-log.h @@ -8,8 +8,14 @@ #ifndef CGIT_UI_LOG_H #define CGIT_UI_LOG_H +/* + * With pager set the log is a page of its own, in a table it opens itself. + * Without it the rows go into a table the caller holds open, and table_columns + * is that table's width, which every row is filled out to. 0 leaves the rows + * at their own width. + */ extern void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *pattern, - const char *path, int pager, int commit_graph, int commit_sort); + const char *path, int pager, int commit_graph, int commit_sort, int table_columns); extern void cgit_print_commit_decorations(struct commit *commit); #endif // CGIT_UI_LOG_H diff --git a/source/ui-refs.c b/source/ui-refs.c index 38a5773..c8e8f3f 100644 --- a/source/ui-refs.c +++ b/source/ui-refs.c @@ -76,18 +76,30 @@ static void collect_branches(struct reflist *list) refs_for_each_remote_ref(get_main_ref_store(the_repository), cgit_refs_cb, list); } -static void print_branch_header(void) +/* + * The age is the last cell of a ref row, so in a table wider than a ref row + * needs, as on a summary whose log shows counts, it stretches across the + * columns left over. + */ +static const char *age_colspan(int columns) +{ + if (columns <= REF_COLUMNS) + return ""; + return cgit_fmt(" colspan='%d'", columns - REF_COLUMNS + 1); +} + +static void print_branch_header(int columns) { html( "<tbody class='branches'>\n" "<tr class='nohover'><th class='left' scope='col'>Branch</th>" "<th class='left' scope='col'>Commit message</th>" "<th class='left col-author' scope='col'>Author</th>" - "<th colspan='2' class='left' scope='col'>Age</th></tr>\n" ); + htmlf("<th%s class='left' scope='col'>Age</th></tr>\n", age_colspan(columns)); } -static int print_branch(struct refinfo *ref) +static int print_branch(struct refinfo *ref, int columns) { struct commitinfo *info = ref->commit; const char *name = ref->refname; @@ -107,13 +119,13 @@ static int print_branch(struct refinfo *ref) ); html_txt(info->author); cgit_close_filter(ctx.repo->email_filter); - html("</td><td colspan='2'>"); + htmlf("</td><td%s>", age_colspan(columns)); cgit_print_age(info->committer_date, info->committer_tz, -1); } else { // The object link sits in the message column, and the empty // tail cells keep the row as wide as the header. cgit_object_link(ref->object, 0); - html("</td><td class='col-author'></td><td colspan='2'>"); + htmlf("</td><td class='col-author'></td><td%s>", age_colspan(columns)); } html("</td></tr>\n"); return 0; @@ -126,18 +138,18 @@ static void collect_tags(struct reflist *list) refs_for_each_tag_ref(get_main_ref_store(the_repository), cgit_refs_cb, list); } -static void print_tag_header(void) +static void print_tag_header(int columns) { html( "<tbody class='tags'>\n" "<tr class='nohover'><th class='left' scope='col'>Tag</th>" "<th class='left' scope='col'>Download</th>" "<th class='left col-author' scope='col'>Author</th>" - "<th colspan='2' class='left' scope='col'>Age</th></tr>\n" ); + htmlf("<th%s class='left' scope='col'>Age</th></tr>\n", age_colspan(columns)); } -static int print_tag(struct refinfo *ref) +static int print_tag(struct refinfo *ref, int columns) { struct taginfo *info = NULL; const char *name = ref->refname; @@ -176,7 +188,7 @@ static int print_tag(struct refinfo *ref) html_txt(ref->commit->author); cgit_close_filter(ctx.repo->email_filter); } - html("</td><td colspan='2'>"); + htmlf("</td><td%s>", age_colspan(columns)); if (info) { if (info->tagger_date > 0) cgit_print_age(info->tagger_date, info->tagger_tz, -1); @@ -188,9 +200,9 @@ static int print_tag(struct refinfo *ref) return 0; } -static void print_refs_link(const char *path) +static void print_refs_link(const char *path, int columns) { - html("<tr class='nohover'><td colspan='5'>"); + htmlf("<tr class='nohover'><td colspan='%d'>", columns); cgit_refs_link("[...]", NULL, NULL, ctx.qry.head, NULL, path); html("</td></tr>\n"); } @@ -199,7 +211,7 @@ static void print_ref_pager(int ofs, int pagesize, int count, const char *path) { char *url; - html("<tr class='nohover'><td colspan='5' class='refs-pager'>"); + htmlf("<tr class='nohover'><td colspan='%d' class='refs-pager'>", REF_COLUMNS); if (ofs > 0) { int prev_ofs = ofs > pagesize ? ofs - pagesize : 0; @@ -243,7 +255,7 @@ static void print_branches_page(int pagesize) struct ref_page page; int i; - print_branch_header(); + print_branch_header(REF_COLUMNS); collect_branches(&list); cgit_qsort(list.refs, list.count, sizeof(*list.refs), cmp_date); @@ -253,7 +265,7 @@ static void print_branches_page(int pagesize) page = page_bounds(pagesize, list.count); for (i = page.start; i < page.end; i++) - print_branch(list.refs[i]); + print_branch(list.refs[i], REF_COLUMNS); if (page.size < list.count) print_ref_pager(page.start, page.size, list.count, "heads"); @@ -275,9 +287,9 @@ static void print_tags_page(int pagesize) page = page_bounds(pagesize, list.count); - print_tag_header(); + print_tag_header(REF_COLUMNS); for (i = page.start; i < page.end; i++) - print_tag(list.refs[i]); + print_tag(list.refs[i], REF_COLUMNS); if (page.size < list.count) print_ref_pager(page.start, page.size, list.count, "tags"); @@ -286,12 +298,12 @@ static void print_tags_page(int pagesize) cgit_free_reflist_inner(&list); } -void cgit_print_branches(int maxcount) +void cgit_print_branches(int maxcount, int columns) { struct reflist list; int i; - print_branch_header(); + print_branch_header(columns); collect_branches(&list); if (maxcount <= 0 || maxcount > list.count) @@ -305,16 +317,16 @@ void cgit_print_branches(int maxcount) cgit_qsort(list.refs, maxcount, sizeof(*list.refs), cmp_name); for (i = 0; i < maxcount; i++) - print_branch(list.refs[i]); + print_branch(list.refs[i], columns); if (maxcount < list.count) - print_refs_link("heads"); + print_refs_link("heads", columns); html("</tbody>\n"); cgit_free_reflist_inner(&list); } -void cgit_print_tags(int maxcount) +void cgit_print_tags(int maxcount, int columns) { struct reflist list; int i; @@ -325,12 +337,12 @@ void cgit_print_tags(int maxcount) cgit_qsort(list.refs, list.count, sizeof(*list.refs), cmp_date); if (maxcount <= 0 || maxcount > list.count) maxcount = list.count; - print_tag_header(); + print_tag_header(columns); for (i = 0; i < maxcount; i++) - print_tag(list.refs[i]); + print_tag(list.refs[i], columns); if (maxcount < list.count) - print_refs_link("tags"); + print_refs_link("tags", columns); html("</tbody>\n"); cgit_free_reflist_inner(&list); @@ -346,8 +358,8 @@ void cgit_print_refs(void) } else if (ctx.qry.path && starts_with(ctx.qry.path, "tags")) { print_tags_page(ctx.cfg.max_ref_count); } else { - cgit_print_branches(ctx.cfg.max_ref_count); - cgit_print_tags(ctx.cfg.max_ref_count); + cgit_print_branches(ctx.cfg.max_ref_count, REF_COLUMNS); + cgit_print_tags(ctx.cfg.max_ref_count, REF_COLUMNS); } html("</table>\n"); cgit_print_layout_end(); diff --git a/source/ui-refs.h b/source/ui-refs.h index c66050b..b5d4aba 100644 --- a/source/ui-refs.h +++ b/source/ui-refs.h @@ -7,13 +7,17 @@ #ifndef CGIT_UI_REFS_H #define CGIT_UI_REFS_H +// The name, the commit message or downloads, the author and the age. +#define REF_COLUMNS 4 + /* * Rows for the newest branches or tags, at most maxcount of them, where a * maxcount of zero means every one. A section that leaves refs out ends in a - * link to the matching form of the refs page. + * link to the matching form of the refs page. columns is the width of the + * table the rows go into, which is at least REF_COLUMNS. */ -extern void cgit_print_branches(int maxcount); -extern void cgit_print_tags(int maxcount); +extern void cgit_print_branches(int maxcount, int columns); +extern void cgit_print_tags(int maxcount, int columns); /* * The whole refs page. Without a path it holds a capped section of each kind, diff --git a/source/ui-summary.c b/source/ui-summary.c index 005263a..f37650d 100644 --- a/source/ui-summary.c +++ b/source/ui-summary.c @@ -18,8 +18,7 @@ #include "ui-summary.h" // Age, commit message and author, the three columns a log row always has. -// ui-log.c adds one more for each of the two optional counts, and the rows -// this page stretches across the table have to match that width. +// ui-log.c adds one more for each of the two optional counts. #define LOG_BASE_COLUMNS 3 static int clone_urls_printed; @@ -35,9 +34,21 @@ static int log_columns(void) return columns; } +/* + * The sections share one table, which is as wide as the widest of them, and + * every row fills it, since a short row would end its stripe short of the + * table's edge. + */ +static int table_columns(void) +{ + if (ctx.cfg.summary_log > 0 && log_columns() > REF_COLUMNS) + return log_columns(); + return REF_COLUMNS; +} + static void print_clone_url(const char *url) { - int columns = log_columns(); + int columns = table_columns(); // cgit_add_clone_urls may call back no times at all, so the heading // waits for a first url rather than being printed ahead of the walk. @@ -52,14 +63,16 @@ static void print_clone_url(const char *url) void cgit_print_summary(void) { + int columns = table_columns(); + cgit_print_layout_start(); // One table, so the columns line up across the sections, each of // which is a body of its own. html("<table class='list summary' aria-label='Summary'>\n"); - cgit_print_branches(ctx.cfg.summary_branches); - cgit_print_tags(ctx.cfg.summary_tags); + cgit_print_branches(ctx.cfg.summary_branches, columns); + cgit_print_tags(ctx.cfg.summary_tags, columns); if (ctx.cfg.summary_log > 0) - cgit_print_log(ctx.qry.head, 0, ctx.cfg.summary_log, NULL, NULL, NULL, 0, 0, 0); + cgit_print_log(ctx.qry.head, 0, ctx.cfg.summary_log, NULL, NULL, NULL, 0, 0, 0, columns); clone_urls_printed = 0; cgit_add_clone_urls(print_clone_url); if (clone_urls_printed) |
