From: Adam Spiers <git@adamspiers.org>
To: git list <git@vger.kernel.org>
Subject: [PATCH v2 4/5] check-ignore: allow incremental streaming of queries via --stdin
Date: Thu, 11 Apr 2013 13:05:12 +0100 [thread overview]
Message-ID: <1365681913-7059-4-git-send-email-git@adamspiers.org> (raw)
In-Reply-To: <1365681913-7059-1-git-send-email-git@adamspiers.org>
Some callers, such as the git-annex web assistant, find it useful to
invoke git check-ignore as a persistent background process, which can
then have queries fed to its STDIN at any point, and the corresponding
response consumed from its STDOUT. For this we need to invoke
check_ignore() once per line of standard input, and flush standard
output after each result.
The above use case suggests that empty STDIN is actually a reasonable
scenario (e.g. when the caller doesn't know in advance whether any
queries need to be fed to the background process until after it's
already started), so we make the minor behavioural change that "no
pathspec given." is no longer emitted in when STDIN is empty.
Even though check_ignore() could now be changed to operate on a single
pathspec, we keep it operating on an array of pathspecs since that is
a more convenient way of consuming the existing pathspec API.
Signed-off-by: Adam Spiers <git@adamspiers.org>
---
builtin/check-ignore.c | 15 +++++----------
t/t0008-ignores.sh | 28 +++++++++++++++++++++++-----
2 files changed, 28 insertions(+), 15 deletions(-)
diff --git a/builtin/check-ignore.c b/builtin/check-ignore.c
index e2d3006..c00a7d6 100644
--- a/builtin/check-ignore.c
+++ b/builtin/check-ignore.c
@@ -107,10 +107,9 @@ static int check_ignore(struct path_exclude_check *check,
static int check_ignore_stdin_paths(struct path_exclude_check *check, const char *prefix)
{
struct strbuf buf, nbuf;
- char **pathspec = NULL;
- size_t nr = 0, alloc = 0;
+ char *pathspec[2] = { NULL, NULL };
int line_termination = null_term_line ? 0 : '\n';
- int num_ignored;
+ int num_ignored = 0;
strbuf_init(&buf, 0);
strbuf_init(&nbuf, 0);
@@ -121,14 +120,10 @@ static int check_ignore_stdin_paths(struct path_exclude_check *check, const char
die("line is badly quoted");
strbuf_swap(&buf, &nbuf);
}
- ALLOC_GROW(pathspec, nr + 1, alloc);
- pathspec[nr] = xcalloc(strlen(buf.buf) + 1, sizeof(*buf.buf));
- strcpy(pathspec[nr++], buf.buf);
+ pathspec[0] = buf.buf;
+ num_ignored += check_ignore(check, prefix, (const char **)pathspec);
+ maybe_flush_or_die(stdout, "check-ignore to stdout");
}
- ALLOC_GROW(pathspec, nr + 1, alloc);
- pathspec[nr] = NULL;
- num_ignored = check_ignore(check, prefix, (const char **)pathspec);
- maybe_flush_or_die(stdout, "attribute to stdout");
strbuf_release(&buf);
strbuf_release(&nbuf);
return num_ignored;
diff --git a/t/t0008-ignores.sh b/t/t0008-ignores.sh
index 7af93ba..fbf12ae 100755
--- a/t/t0008-ignores.sh
+++ b/t/t0008-ignores.sh
@@ -216,11 +216,7 @@ test_expect_success_multi 'empty command line' '' '
test_expect_success_multi '--stdin with empty STDIN' '' '
test_check_ignore "--stdin" 1 </dev/null &&
- if test -n "$quiet_opt"; then
- test_stderr ""
- else
- test_stderr "no pathspec given."
- fi
+ test_stderr ""
'
test_expect_success '-q with multiple args' '
@@ -692,5 +688,27 @@ do
'
done
+test_expect_success 'setup: have stdbuf?' '
+ if which stdbuf >/dev/null 2>&1
+ then
+ test_set_prereq STDBUF
+ fi
+'
+
+test_expect_success STDBUF 'streaming support for --stdin' '
+ (
+ echo one
+ sleep 2
+ echo two
+ ) | stdbuf -oL git check-ignore -v -n --stdin >out &
+ pid=$! &&
+ sleep 1 &&
+ grep "^\.gitignore:1:one one" out &&
+ test $( wc -l <out ) = 1 &&
+ sleep 2 &&
+ grep "^:: two" out &&
+ test $( wc -l <out ) = 2 &&
+ ( wait $pid || kill $pid || : ) 2>/dev/null
+'
test_done
--
1.8.2.1.342.gfa7285d
next prev parent reply other threads:[~2013-04-11 12:05 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-04-08 18:13 RFC: two minor tweaks to check-ignore to help git-annex assistant Adam Spiers
2013-04-08 21:56 ` Junio C Hamano
2013-04-08 22:20 ` Jeff King
2013-04-11 1:59 ` [PATCH 1/5] check-ignore: move setup into cmd_check_ignore() Adam Spiers
2013-04-11 1:59 ` [PATCH 2/5] check-ignore: allow incremental streaming of queries via --stdin Adam Spiers
2013-04-11 5:31 ` Jeff King
2013-04-11 10:55 ` Adam Spiers
2013-04-11 11:20 ` Adam Spiers
2013-04-11 18:33 ` Jeff King
2013-04-11 1:59 ` [PATCH 3/5] Documentation: add caveats about I/O buffering for check-{attr,ignore} Adam Spiers
2013-04-11 5:31 ` Jeff King
2013-04-11 1:59 ` [PATCH 4/5] t0008: remove duplicated test fixture data Adam Spiers
2013-04-11 1:59 ` [PATCH 5/5] check-ignore: add -n / --non-matching option Adam Spiers
2013-04-11 5:25 ` [PATCH 1/5] check-ignore: move setup into cmd_check_ignore() Jeff King
2013-04-11 11:05 ` Adam Spiers
2013-04-11 12:05 ` [PATCH v2 1/5] t0008: remove duplicated test fixture data Adam Spiers
2013-04-11 12:05 ` [PATCH v2 2/5] check-ignore: add -n / --non-matching option Adam Spiers
2013-04-11 12:05 ` [PATCH v2 3/5] check-ignore: move setup into cmd_check_ignore() Adam Spiers
2013-04-11 12:05 ` Adam Spiers [this message]
2013-04-11 19:11 ` [PATCH v2 4/5] check-ignore: allow incremental streaming of queries via --stdin Jeff King
2013-04-11 20:31 ` Adam Spiers
2013-04-11 20:40 ` Jeff King
2013-04-22 18:03 ` Junio C Hamano
2013-04-24 8:02 ` Adam Spiers
2013-04-29 22:55 ` [PATCH] t0008: use named pipe (FIFO) to test check-ignore streaming Adam Spiers
2013-04-11 21:04 ` [PATCH v2 4/5] check-ignore: allow incremental streaming of queries via --stdin Aaron Schrab
2013-04-11 22:55 ` Adam Spiers
2013-04-11 12:05 ` [PATCH v2 5/5] Documentation: add caveats about I/O buffering for check-{attr,ignore} Adam Spiers
2013-04-11 18:09 ` Junio C Hamano
2013-04-11 20:12 ` [PATCH v3 " Adam Spiers
2013-04-12 2:12 ` Junio C Hamano
2013-04-12 11:00 ` Adam Spiers
2013-04-11 18:35 ` [PATCH 1/5] check-ignore: move setup into cmd_check_ignore() Jeff King
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1365681913-7059-4-git-send-email-git@adamspiers.org \
--to=git@adamspiers.org \
--cc=git@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).