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

[PATCH 06/12] Add helpers to redirect stdout to "git column"

From
Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Date
Mar 7, 2010, 12:09 UTC
Message-ID
<1267963785-473-7-git-send-email-pclouds@gmail.com>
In-Reply-To
<1267963785-473-1-git-send-email-pclouds@gmail.com>

While the columnizer can be used directly, it requires output code change. The helpers instead redirect all output to "git column" and let "git column" do all the layout work. This keeps code change minimum. All we need is:

start_columnizer(); /* do some complex computation and output to stdout */ stop_columnizer();

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
 column.h |    2 +
 pager.c  |   63 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 65 insertions(+), 0 deletions(-)
diff --git a/column.h b/column.h
index 28122e0..6eb19e3 100644
--- a/column.h
+++ b/column.h
@@ -21,3 +21,5 @@ struct columnizer {
 };
 
 extern int feed_columnizer(struct columnizer *cp, char *cell);
+extern int start_columnizer(const char **argv);
+extern int stop_columnizer();
diff --git a/pager.c b/pager.c
index ad447cf..9df727d 100644
--- a/pager.c
+++ b/pager.c
@@ -13,6 +13,8 @@
 
 static int spawned_pager;
 static int max_columns;
+static int fd_out = -1;
+static struct child_process column_process;
 
 #ifndef WIN32
 static void pager_preexec(void)
@@ -148,3 +150,64 @@ int term_columns()
 #endif
 	return 80;
 }
+
+int start_columnizer(const char **argv)
+{
+	int new_argc, argc = 0;
+	const char **column_argv;
+	char columns_param[32];
+
+	if (fd_out != -1)
+		return -1;
+
+	if (argv) {
+		while (argv[argc])
+			argc++;
+	}
+	new_argc = argc + 1; /* argv[0] = "column" */
+	if (spawned_pager && max_columns) {
+		sprintf(columns_param, "--width=%d", max_columns);
+		new_argc++;
+	}
+
+	column_argv = xmalloc(sizeof(*column_argv)*(new_argc+1));
+	column_argv[0] = "column";
+	if (spawned_pager && max_columns)
+		column_argv[1] = columns_param;
+	if (argv)
+		memcpy(column_argv + (new_argc-argc), argv, argc*sizeof(*argv));
+	column_argv[new_argc] = NULL;
+
+	fflush(stdout);
+	memset(&column_process, 0, sizeof(column_process));
+	column_process.in = -1;
+	column_process.out = dup(1);
+	column_process.git_cmd = 1;
+	column_process.argv = column_argv;
+
+	if (start_command(&column_process)) {
+		free(column_argv);
+		return -2;
+	}
+	free(column_argv);
+
+	fd_out = dup(1);
+	close(1);
+	dup2(column_process.in, 1);
+	close(column_process.in);
+	return 0;
+}
+
+int stop_columnizer()
+{
+	if (fd_out == -1)
+		return -1;
+
+	fflush(stdout);
+	close(1);
+	finish_command(&column_process);
+	dup2(fd_out, 1);
+	close(fd_out);
+	fd_out = -1;
+	return 0;
+}
-- 
1.7.0.1.370.gd3c5
Previous: Nguyễn Thái Ngọc DuyNext: Nguyễn Thái Ngọc Duy
Message 7 of 24 in “Support columinized output in tag/branch/ls-files/grep”
  1. 00/12 Support columinized output in tag/branch/ls-files/grepNguyễn Thái Ngọc Duy, Mar 7, 2010
  2. 01/12 Move term_columns() to pager.cNguyễn Thái Ngọc Duy, Mar 7, 2010
  3. 02/12 setup_pager(): save terminal width before redirecting stdoutNguyễn Thái Ngọc Duy, Mar 7, 2010
  4. 03/12 Add columnizerNguyễn Thái Ngọc Duy, Mar 7, 2010
  5. 04/12 help: use columnizerNguyễn Thái Ngọc Duy, Mar 7, 2010
  6. 05/12 Add builtin command "column"Nguyễn Thái Ngọc Duy, Mar 7, 2010
  7. 06/12 Add helpers to redirect stdout to "git column"Nguyễn Thái Ngọc Duy, Mar 7, 2010
  8. 07/12 add core.columnsNguyễn Thái Ngọc Duy, Mar 7, 2010
  9. 08/12 tag: support column output with --columnsNguyễn Thái Ngọc Duy, Mar 7, 2010
  10. 09/12 branch: support column output with --columnsNguyễn Thái Ngọc Duy, Mar 7, 2010
  11. 10/12 ls-files: support column output with --columnsNguyễn Thái Ngọc Duy, Mar 7, 2010
  12. 11/12 grep: do not return early in cmd_grep() if there is no errorNguyễn Thái Ngọc Duy, Mar 7, 2010
  13. 12/12 grep: support column output with --columnsNguyễn Thái Ngọc Duy, Mar 7, 2010
  14. René ScharfeMar 8, 2010
  15. Nguyen Thai Ngoc DuyMar 8, 2010
  16. René ScharfeMar 9, 2010
  17. Nguyen Thai Ngoc DuyMar 10, 2010
  18. Johannes SixtMar 10, 2010
  19. Nguyen Thai Ngoc DuyMar 10, 2010
  20. René ScharfeMar 11, 2010
  21. Nguyen Thai Ngoc DuyMar 12, 2010
  22. Junio C HamanoMar 8, 2010
  23. Nguyen Thai Ngoc DuyMar 9, 2010
  24. Junio C HamanoMar 9, 2010

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.