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>
This commit is contained in:
parent
323d053091
commit
b27004eb32
69
column.c
69
column.c
@ -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;
|
||||
}
|
||||
|
3
column.h
3
column.h
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user