int graph_show_remainder(struct git_graph *graph) { struct strbuf msgbuf = STRBUF_INIT; int shown = 0; if (!graph) return 0; if (graph_is_commit_finished(graph)) return 0; for (;;) { graph_next_line(graph, &msgbuf); fwrite(msgbuf.buf, sizeof(char), msgbuf.len, stdout); strbuf_setlen(&msgbuf, 0); shown = 1; if (!graph_is_commit_finished(graph)) putchar('\n'); else break; } strbuf_release(&msgbuf); return shown; }
void graph_show_commit(struct git_graph *graph) { struct strbuf msgbuf = STRBUF_INIT; int shown_commit_line = 0; if (!graph) return; /* * When showing a diff of a merge against each of its parents, we * are called once for each parent without graph_update having been * called. In this case, simply output a single padding line. */ if (graph_is_commit_finished(graph)) { graph_show_padding(graph); shown_commit_line = 1; } while (!shown_commit_line && !graph_is_commit_finished(graph)) { shown_commit_line = graph_next_line(graph, &msgbuf); fwrite(msgbuf.buf, sizeof(char), msgbuf.len, graph->revs->diffopt.file); if (!shown_commit_line) putc('\n', graph->revs->diffopt.file); strbuf_setlen(&msgbuf, 0); } strbuf_release(&msgbuf); }
static void graph_padding_line(struct git_graph *graph, struct strbuf *sb) { int i; if (graph->state != GRAPH_COMMIT) { graph_next_line(graph, sb); return; } /* * Output the row containing this commit * Iterate up to and including graph->num_columns, * since the current commit may not be in any of the existing * columns. (This happens when the current commit doesn't have any * children that we have already processed.) */ for (i = 0; i < graph->num_columns; i++) { struct column *col = &graph->columns[i]; strbuf_write_column(sb, col, '|'); if (col->commit == graph->commit && graph->num_parents > 2) strbuf_addchars(sb, ' ', (graph->num_parents - 2) * 2); else strbuf_addch(sb, ' '); } graph_pad_horizontally(graph, sb, graph->num_columns); /* * Update graph->prev_state since we have output a padding line */ graph->prev_state = GRAPH_PADDING; }
int graph_show_remainder(struct git_graph *graph) { struct strbuf msgbuf = STRBUF_INIT; int shown = 0; graph_show_line_prefix(default_diffopt); if (!graph) return 0; if (graph_is_commit_finished(graph)) return 0; for (;;) { graph_next_line(graph, &msgbuf); fwrite(msgbuf.buf, sizeof(char), msgbuf.len, graph->revs->diffopt.file); strbuf_setlen(&msgbuf, 0); shown = 1; if (!graph_is_commit_finished(graph)) { putc('\n', graph->revs->diffopt.file); graph_show_line_prefix(&graph->revs->diffopt); } else { break; } } strbuf_release(&msgbuf); return shown; }
void graph_show_oneline(struct git_graph *graph) { struct strbuf msgbuf = STRBUF_INIT; if (!graph) return; graph_next_line(graph, &msgbuf); fwrite(msgbuf.buf, sizeof(char), msgbuf.len, stdout); strbuf_release(&msgbuf); }
void graph_show_oneline(struct git_graph *graph) { struct strbuf msgbuf = STRBUF_INIT; graph_show_line_prefix(default_diffopt); if (!graph) return; graph_next_line(graph, &msgbuf); fwrite(msgbuf.buf, sizeof(char), msgbuf.len, graph->revs->diffopt.file); strbuf_release(&msgbuf); }
void graph_show_commit(struct git_graph *graph) { struct strbuf msgbuf = STRBUF_INIT; int shown_commit_line = 0; if (!graph) return; while (!shown_commit_line) { shown_commit_line = graph_next_line(graph, &msgbuf); fwrite(msgbuf.buf, sizeof(char), msgbuf.len, stdout); if (!shown_commit_line) putchar('\n'); strbuf_setlen(&msgbuf, 0); } strbuf_release(&msgbuf); }
void graph_padding_line(struct git_graph *graph, struct strbuf *sb) { int i, j; if (graph->state != GRAPH_COMMIT) { graph_next_line(graph, sb); return; } /* * Output the row containing this commit * Iterate up to and including graph->num_columns, * since the current commit may not be in any of the existing * columns. (This happens when the current commit doesn't have any * children that we have already processed.) */ for (i = 0; i < graph->num_columns; i++) { struct commit *col_commit = graph->columns[i].commit; if (col_commit == graph->commit) { strbuf_addch(sb, '|'); if (graph->num_parents < 3) strbuf_addch(sb, ' '); else { int num_spaces = ((graph->num_parents - 2) * 2); for (j = 0; j < num_spaces; j++) strbuf_addch(sb, ' '); } } else { strbuf_addstr(sb, "| "); } } graph_pad_horizontally(graph, sb); /* * Update graph->prev_state since we have output a padding line */ graph->prev_state = GRAPH_PADDING; }
void print_commit(struct commit *commit, struct rev_info *revs) { struct commitinfo *info; int cols = revs->graph ? 3 : 2; struct strbuf graphbuf = STRBUF_INIT; struct strbuf msgbuf = STRBUF_INIT; if (ctx.repo->enable_log_filecount) cols++; if (ctx.repo->enable_log_linecount) cols++; if (revs->graph) { /* Advance graph until current commit */ while (!graph_next_line(revs->graph, &graphbuf)) { /* Print graph segment in otherwise empty table row */ html("<tr class='nohover'><td class='commitgraph'>"); html(graphbuf.buf); htmlf("</td><td colspan='%d' /></tr>\n", cols); strbuf_setlen(&graphbuf, 0); } /* Current commit's graph segment is now ready in graphbuf */ } info = cgit_parse_commit(commit); htmlf("<tr%s>", ctx.qry.showmsg ? " class='logheader'" : ""); if (revs->graph) { /* Print graph segment for current commit */ html("<td class='commitgraph'>"); html(graphbuf.buf); html("</td>"); strbuf_setlen(&graphbuf, 0); } else { html("<td>"); cgit_print_age(commit->date, TM_WEEK * 2, FMT_SHORTDATE); html("</td>"); } htmlf("<td%s>", ctx.qry.showmsg ? " class='logsubject'" : ""); if (ctx.qry.showmsg) { /* line-wrap long commit subjects instead of truncating them */ size_t subject_len = strlen(info->subject); if (subject_len > ctx.cfg.max_msg_len && ctx.cfg.max_msg_len >= 15) { /* symbol for signaling line-wrap (in PAGE_ENCODING) */ const char wrap_symbol[] = { ' ', 0xE2, 0x86, 0xB5, 0 }; int i = ctx.cfg.max_msg_len - strlen(wrap_symbol); /* Rewind i to preceding space character */ while (i > 0 && !isspace(info->subject[i])) --i; if (!i) /* Oops, zero spaces. Reset i */ i = ctx.cfg.max_msg_len - strlen(wrap_symbol); /* add remainder starting at i to msgbuf */ strbuf_add(&msgbuf, info->subject + i, subject_len - i); strbuf_trim(&msgbuf); strbuf_add(&msgbuf, "\n\n", 2); /* Place wrap_symbol at position i in info->subject */ strcpy(info->subject + i, wrap_symbol); } } cgit_commit_link(info->subject, NULL, NULL, ctx.qry.head, sha1_to_hex(commit->object.sha1), ctx.qry.vpath, 0); show_commit_decorations(commit); html("</td><td>"); html_txt(info->author); if (revs->graph) { html("</td><td>"); cgit_print_age(commit->date, TM_WEEK * 2, FMT_SHORTDATE); } if (ctx.repo->enable_log_filecount || ctx.repo->enable_log_linecount) { files = 0; add_lines = 0; rem_lines = 0; cgit_diff_commit(commit, inspect_files, ctx.qry.vpath); } if (ctx.repo->enable_log_filecount) htmlf("</td><td>%d", files); if (ctx.repo->enable_log_linecount) htmlf("</td><td>-%d/+%d", rem_lines, add_lines); html("</td></tr>\n"); if (revs->graph || ctx.qry.showmsg) { /* Print a second table row */ html("<tr class='nohover'>"); if (ctx.qry.showmsg) { /* Concatenate commit message + notes in msgbuf */ if (info->msg && *(info->msg)) { strbuf_addstr(&msgbuf, info->msg); strbuf_addch(&msgbuf, '\n'); } format_note(NULL, commit->object.sha1, &msgbuf, PAGE_ENCODING, NOTES_SHOW_HEADER | NOTES_INDENT); strbuf_addch(&msgbuf, '\n'); strbuf_ltrim(&msgbuf); } if (revs->graph) { int lines = 0; /* Calculate graph padding */ if (ctx.qry.showmsg) { /* Count #lines in commit message + notes */ const char *p = msgbuf.buf; lines = 1; while ((p = strchr(p, '\n'))) { p++; lines++; } } /* Print graph padding */ html("<td class='commitgraph'>"); while (lines > 0 || !graph_is_commit_finished(revs->graph)) { if (graphbuf.len) html("\n"); strbuf_setlen(&graphbuf, 0); graph_next_line(revs->graph, &graphbuf); html(graphbuf.buf); lines--; } html("</td>\n"); } else html("<td/>"); /* Empty 'Age' column */ /* Print msgbuf into remainder of table row */ htmlf("<td colspan='%d'%s>\n", cols, ctx.qry.showmsg ? " class='logmsg'" : ""); html_txt(msgbuf.buf); html("</td></tr>\n"); } strbuf_release(&msgbuf); strbuf_release(&graphbuf); cgit_free_commitinfo(info); }