Merge branch 'jc/log-stdin'
* jc/log-stdin: Add trivial tests for --stdin option to log family Make --stdin option to "log" family read also pathspecs setup_revisions(): do not call get_pathspec() too early Teach --stdin option to "log" family read_revision_from_stdin(): use strbuf Conflicts: revision.c
This commit is contained in:
106
revision.c
106
revision.c
@ -953,21 +953,59 @@ int handle_revision_arg(const char *arg, struct rev_info *revs,
|
||||
return 0;
|
||||
}
|
||||
|
||||
void read_revisions_from_stdin(struct rev_info *revs)
|
||||
static void read_pathspec_from_stdin(struct rev_info *revs, struct strbuf *sb, const char ***prune_data)
|
||||
{
|
||||
char line[1000];
|
||||
const char **prune = *prune_data;
|
||||
int prune_nr;
|
||||
int prune_alloc;
|
||||
|
||||
while (fgets(line, sizeof(line), stdin) != NULL) {
|
||||
int len = strlen(line);
|
||||
if (len && line[len - 1] == '\n')
|
||||
line[--len] = '\0';
|
||||
/* count existing ones */
|
||||
if (!prune)
|
||||
prune_nr = 0;
|
||||
else
|
||||
for (prune_nr = 0; prune[prune_nr]; prune_nr++)
|
||||
;
|
||||
prune_alloc = prune_nr; /* not really, but we do not know */
|
||||
|
||||
while (strbuf_getwholeline(sb, stdin, '\n') != EOF) {
|
||||
int len = sb->len;
|
||||
if (len && sb->buf[len - 1] == '\n')
|
||||
sb->buf[--len] = '\0';
|
||||
ALLOC_GROW(prune, prune_nr+1, prune_alloc);
|
||||
prune[prune_nr++] = xstrdup(sb->buf);
|
||||
}
|
||||
if (prune) {
|
||||
ALLOC_GROW(prune, prune_nr+1, prune_alloc);
|
||||
prune[prune_nr] = NULL;
|
||||
}
|
||||
*prune_data = prune;
|
||||
}
|
||||
|
||||
static void read_revisions_from_stdin(struct rev_info *revs, const char ***prune)
|
||||
{
|
||||
struct strbuf sb;
|
||||
int seen_dashdash = 0;
|
||||
|
||||
strbuf_init(&sb, 1000);
|
||||
while (strbuf_getwholeline(&sb, stdin, '\n') != EOF) {
|
||||
int len = sb.len;
|
||||
if (len && sb.buf[len - 1] == '\n')
|
||||
sb.buf[--len] = '\0';
|
||||
if (!len)
|
||||
break;
|
||||
if (line[0] == '-')
|
||||
if (sb.buf[0] == '-') {
|
||||
if (len == 2 && sb.buf[1] == '-') {
|
||||
seen_dashdash = 1;
|
||||
break;
|
||||
}
|
||||
die("options not supported in --stdin mode");
|
||||
if (handle_revision_arg(line, revs, 0, 1))
|
||||
die("bad revision '%s'", line);
|
||||
}
|
||||
if (handle_revision_arg(sb.buf, revs, 0, 1))
|
||||
die("bad revision '%s'", sb.buf);
|
||||
}
|
||||
if (seen_dashdash)
|
||||
read_pathspec_from_stdin(revs, &sb, prune);
|
||||
strbuf_release(&sb);
|
||||
}
|
||||
|
||||
static void add_grep(struct rev_info *revs, const char *ptn, enum grep_pat_token what)
|
||||
@ -1229,6 +1267,34 @@ static int for_each_good_bisect_ref(each_ref_fn fn, void *cb_data)
|
||||
return for_each_ref_in("refs/bisect/good", fn, cb_data);
|
||||
}
|
||||
|
||||
static void append_prune_data(const char ***prune_data, const char **av)
|
||||
{
|
||||
const char **prune = *prune_data;
|
||||
int prune_nr;
|
||||
int prune_alloc;
|
||||
|
||||
if (!prune) {
|
||||
*prune_data = av;
|
||||
return;
|
||||
}
|
||||
|
||||
/* count existing ones */
|
||||
for (prune_nr = 0; prune[prune_nr]; prune_nr++)
|
||||
;
|
||||
prune_alloc = prune_nr; /* not really, but we do not know */
|
||||
|
||||
while (*av) {
|
||||
ALLOC_GROW(prune, prune_nr+1, prune_alloc);
|
||||
prune[prune_nr++] = *av;
|
||||
av++;
|
||||
}
|
||||
if (prune) {
|
||||
ALLOC_GROW(prune, prune_nr+1, prune_alloc);
|
||||
prune[prune_nr] = NULL;
|
||||
}
|
||||
*prune_data = prune;
|
||||
}
|
||||
|
||||
/*
|
||||
* Parse revision information, filling in the "rev_info" structure,
|
||||
* and removing the used arguments from the argument list.
|
||||
@ -1238,7 +1304,8 @@ static int for_each_good_bisect_ref(each_ref_fn fn, void *cb_data)
|
||||
*/
|
||||
int setup_revisions(int argc, const char **argv, struct rev_info *revs, const char *def)
|
||||
{
|
||||
int i, flags, left, seen_dashdash;
|
||||
int i, flags, left, seen_dashdash, read_from_stdin;
|
||||
const char **prune_data = NULL;
|
||||
|
||||
/* First, search for "--" */
|
||||
seen_dashdash = 0;
|
||||
@ -1249,13 +1316,14 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, const ch
|
||||
argv[i] = NULL;
|
||||
argc = i;
|
||||
if (argv[i + 1])
|
||||
revs->prune_data = get_pathspec(revs->prefix, argv + i + 1);
|
||||
prune_data = argv + i + 1;
|
||||
seen_dashdash = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
/* Second, deal with arguments and options */
|
||||
flags = 0;
|
||||
read_from_stdin = 0;
|
||||
for (left = i = 1; i < argc; i++) {
|
||||
const char *arg = argv[i];
|
||||
if (*arg == '-') {
|
||||
@ -1300,6 +1368,16 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, const ch
|
||||
revs->no_walk = 0;
|
||||
continue;
|
||||
}
|
||||
if (!strcmp(arg, "--stdin")) {
|
||||
if (revs->disable_stdin) {
|
||||
argv[left++] = arg;
|
||||
continue;
|
||||
}
|
||||
if (read_from_stdin++)
|
||||
die("--stdin given twice?");
|
||||
read_revisions_from_stdin(revs, &prune_data);
|
||||
continue;
|
||||
}
|
||||
|
||||
opts = handle_revision_opt(revs, argc - i, argv + i, &left, argv);
|
||||
if (opts > 0) {
|
||||
@ -1325,12 +1403,14 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, const ch
|
||||
for (j = i; j < argc; j++)
|
||||
verify_filename(revs->prefix, argv[j]);
|
||||
|
||||
revs->prune_data = get_pathspec(revs->prefix,
|
||||
argv + i);
|
||||
append_prune_data(&prune_data, argv + i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (prune_data)
|
||||
revs->prune_data = get_pathspec(revs->prefix, prune_data);
|
||||
|
||||
if (revs->def == NULL)
|
||||
revs->def = def;
|
||||
if (revs->show_merge)
|
||||
|
Reference in New Issue
Block a user