diff options
author | Nguyễn Thái Ngọc Duy <pclouds@gmail.com> | 2012-04-13 17:54:40 +0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2012-04-27 09:26:38 -0700 |
commit | b27004eb32139977f8fa5c01eb235535661f9201 (patch) | |
tree | f437e72d6f075e8ecb22cea47085b806da0a2e85 | |
parent | 323d0530918f015fa28572f4477723b607bce000 (diff) | |
download | git-b27004eb32139977f8fa5c01eb235535661f9201.tar.gz |
column: support piping stdout to external git-column process
For too complicated output handling, it'd be easier to just spawn
git-column and redirect stdout to it. This patch provides helpers
to do that.
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r-- | column.c | 69 | ||||
-rw-r--r-- | column.h | 3 |
2 files changed, 72 insertions, 0 deletions
@@ -2,6 +2,7 @@ #include "column.h" #include "string-list.h" #include "parse-options.h" +#include "run-command.h" #include "utf8.h" #define XY2LINEAR(d, x, y) (COL_LAYOUT((d)->colopts) == COL_COLUMN ? \ @@ -363,3 +364,71 @@ int parseopt_column_callback(const struct option *opt, return 0; } + +static int fd_out = -1; +static struct child_process column_process; + +int run_column_filter(int colopts, const struct column_options *opts) +{ + const char *av[10]; + int ret, ac = 0; + struct strbuf sb_colopt = STRBUF_INIT; + struct strbuf sb_width = STRBUF_INIT; + struct strbuf sb_padding = STRBUF_INIT; + + if (fd_out != -1) + return -1; + + av[ac++] = "column"; + strbuf_addf(&sb_colopt, "--raw-mode=%d", colopts); + av[ac++] = sb_colopt.buf; + if (opts && opts->width) { + strbuf_addf(&sb_width, "--width=%d", opts->width); + av[ac++] = sb_width.buf; + } + if (opts && opts->indent) { + av[ac++] = "--indent"; + av[ac++] = opts->indent; + } + if (opts && opts->padding) { + strbuf_addf(&sb_padding, "--padding=%d", opts->padding); + av[ac++] = sb_padding.buf; + } + av[ac] = 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 = av; + + ret = start_command(&column_process); + + strbuf_release(&sb_colopt); + strbuf_release(&sb_width); + strbuf_release(&sb_padding); + + if (ret) + return -2; + + fd_out = dup(1); + close(1); + dup2(column_process.in, 1); + close(column_process.in); + return 0; +} + +int stop_column_filter(void) +{ + 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; +} @@ -39,4 +39,7 @@ static inline int column_active(unsigned int colopts) extern void print_columns(const struct string_list *list, unsigned int colopts, const struct column_options *opts); +extern int run_column_filter(int colopts, const struct column_options *); +extern int stop_column_filter(void); + #endif |