git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH] graph API: eliminate unnecessary indentation

From
Adam Simpkins <adam@adamsimpkins.net>
Date
May 5, 2008, 07:57 UTC
Message-ID
<1209974223-2875-1-git-send-email-adam@adamsimpkins.net>
In-Reply-To
<1209897414-10091-4-git-send-email-adam@adamsimpkins.net>

This change improves the calculation of the amount of horizontal padding, so that there is always exactly 1 space of padding. Previously, most commits had 3 spaces of padding, but commits that didn't have any children in the graph had only 1 space of padding.

Signed-off-by: Adam Simpkins <adam@adamsimpkins.net>
---
This fixes the issue reported by Ping Yin.
 graph.c |   66 +++++++++++++++++++++++++++++++++++++++++++++++++-------------
 1 files changed, 52 insertions(+), 14 deletions(-)
diff --git a/graph.c b/graph.c
index b575d10..809a582 100644
--- a/graph.c
+++ b/graph.c
@@ -61,6 +61,12 @@ struct git_graph {
 	 */
 	int num_parents;
 	/*
+	 * The width of the graph output for this commit.
+	 * All rows for this commit are padded to this width, so that
+	 * messages printed after the graph output are aligned.
+	 */
+	int width;
+	/*
 	 * The next expansion row to print
 	 * when state is GRAPH_PRE_COMMIT
 	 */
@@ -207,13 +213,48 @@ static void graph_insert_into_new_columns(struct git_graph *graph,
 	graph->num_new_columns++;
 }
 
+static void graph_update_width(struct git_graph *graph,
+			       int is_commit_in_existing_columns)
+{
+	/*
+	 * Compute the width needed to display the graph for this commit.
+	 * This is the maximum width needed for any row.  All other rows
+	 * will be padded to this width.
+	 *
+	 * Compute the number of columns in the widest row:
+	 * Count each existing column (graph->num_columns), and each new
+	 * column added by this commit.
+	 */
+	int max_cols = graph->num_columns + graph->num_parents;
+
+	/*
+	 * Even if the current commit has no parents, it still takes up a
+	 * column for itself.
+	 */
+	if (graph->num_parents < 1)
+		max_cols++;
+
+	/*
+	 * We added a column for the the current commit as part of
+	 * graph->num_parents.  If the current commit was already in
+	 * graph->columns, then we have double counted it.
+	 */
+	if (is_commit_in_existing_columns)
+		max_cols--;
+
+	/*
+	 * Each column takes up 2 spaces
+	 */
+	graph->width = max_cols * 2;
+}
+
 static void graph_update_columns(struct git_graph *graph)
 {
 	struct commit_list *parent;
 	struct column *tmp_columns;
 	int max_new_columns;
 	int mapping_idx;
-	int i, seen_this;
+	int i, seen_this, is_commit_in_columns;
 
 	/*
 	 * Swap graph->columns with graph->new_columns
@@ -259,11 +300,13 @@ static void graph_update_columns(struct git_graph *graph)
 	 */
 	seen_this = 0;
 	mapping_idx = 0;
+	is_commit_in_columns = 1;
 	for (i = 0; i <= graph->num_columns; i++) {
 		struct commit *col_commit;
 		if (i == graph->num_columns) {
 			if (seen_this)
 				break;
+			is_commit_in_columns = 0;
 			col_commit = graph->commit;
 		} else {
 			col_commit = graph->columns[i].commit;
@@ -290,6 +333,11 @@ static void graph_update_columns(struct git_graph *graph)
 	while (graph->mapping_size > 1 &&
 	       graph->mapping[graph->mapping_size - 1] < 0)
 		graph->mapping_size--;
+
+	/*
+	 * Compute graph->width for this commit
+	 */
+	graph_update_width(graph, is_commit_in_columns);
 }
 
 void graph_update(struct git_graph *graph, struct commit *commit)
@@ -368,22 +416,12 @@ static void graph_pad_horizontally(struct git_graph *graph, struct strbuf *sb)
 	 *
 	 * This way, fields printed to the right of the graph will remain
 	 * aligned for the entire commit.
-	 *
-	 * This computation results in 3 extra space to the right in most
-	 * cases, but only 1 extra space if the commit doesn't have any
-	 * children that have already been displayed in the graph (i.e.,
-	 * if the current commit isn't in graph->columns).
 	 */
-	size_t extra;
-	size_t final_width = graph->num_columns + graph->num_parents;
-	if (graph->num_parents < 1)
-		final_width++;
-	final_width *= 2;
-
-	if (sb->len >= final_width)
+	int extra;
+	if (sb->len >= graph->width)
 		return;
 
-	extra = final_width - sb->len;
+	extra = graph->width - sb->len;
 	strbuf_addf(sb, "%*s", extra, "");
 }
 
-- 
1.5.3.6
Previous: Adam SimpkinsNext: Ping Yin
Message 5 of 13 in “log --graph and rev-list --graph”
  1. 0/3 log --graph and rev-list --graphAdam Simpkins, May 4, 2008
  2. 1/3 revision API: split parent rewriting and parent printing optionsAdam Simpkins, May 4, 2008
  3. 2/3 Add history graph APIAdam Simpkins, May 4, 2008
  4. 3/3 log and rev-list: add --graph optionAdam Simpkins, May 4, 2008
  5. graph API: eliminate unnecessary indentationAdam Simpkins, May 5, 2008
  6. Ping YinMay 5, 2008
  7. Junio C HamanoMay 6, 2008
  8. Adam SimpkinsMay 6, 2008
  9. Junio C HamanoMay 6, 2008
  10. bash: Add more option completions for 'git log'Teemu Likonen, May 4, 2008
  11. Ping YinMay 5, 2008
  12. Adam SimpkinsMay 5, 2008
  13. Teemu LikonenMay 6, 2008

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.