Re: [PATCH v2 4/5] check-ignore: allow incremental streaming of queries via --stdin

2013-04-24 Thread Adam Spiers
On Mon, Apr 22, 2013 at 11:03:44AM -0700, Junio C Hamano wrote:
 Adam Spiers g...@adamspiers.org writes:
 
  On Thu, Apr 11, 2013 at 03:11:32PM -0400, Jeff King wrote:
  I always get a little nervous with sleeps in the test suite, as they are
  indicative that we are trying to avoid some race condition, which means
  that the test can fail when the system is under load, or when a tool
  like valgrind is used which drastically alters the timing (e.g., if
  check-ignore takes longer than 1 second to produce its answer, we may
  fail here).
 
  Agreed, especially here where my btrfs filesystems see fit to kindly
  freeze my system for a few seconds many times each day :-/
  
  Is there a simpler way to test this?
  
  Like:
  ...
  I'll re-roll using your approach.
 
 I think I missed this one and it already is in 'next'.
 
 I'll hold it back so please make your re-roll into an incremental
 update.

Will do - will probably take a few days more though, since I'm
currently catching up on a post-travel work backlog.
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v2 4/5] check-ignore: allow incremental streaming of queries via --stdin

2013-04-22 Thread Junio C Hamano
Adam Spiers g...@adamspiers.org writes:

 On Thu, Apr 11, 2013 at 03:11:32PM -0400, Jeff King wrote:
 I always get a little nervous with sleeps in the test suite, as they are
 indicative that we are trying to avoid some race condition, which means
 that the test can fail when the system is under load, or when a tool
 like valgrind is used which drastically alters the timing (e.g., if
 check-ignore takes longer than 1 second to produce its answer, we may
 fail here).

 Agreed, especially here where my btrfs filesystems see fit to kindly
 freeze my system for a few seconds many times each day :-/
 
 Is there a simpler way to test this?
 
 Like:
 ...
 I'll re-roll using your approach.

I think I missed this one and it already is in 'next'.

I'll hold it back so please make your re-roll into an incremental
update.

Thanks.
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v2 4/5] check-ignore: allow incremental streaming of queries via --stdin

2013-04-11 Thread Adam Spiers
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 g...@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 21
+   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:oneone 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

--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v2 4/5] check-ignore: allow incremental streaming of queries via --stdin

2013-04-11 Thread Jeff King
On Thu, Apr 11, 2013 at 01:05:12PM +0100, Adam Spiers wrote:

 +test_expect_success 'setup: have stdbuf?' '
 + if which stdbuf /dev/null 21
 + 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:oneone out 
 + test $( wc -l out ) = 1 
 + sleep 2 
 + grep ^::   two out 
 + test $( wc -l out ) = 2 
 + ( wait $pid || kill $pid || : ) 2/dev/null
 +'

I always get a little nervous with sleeps in the test suite, as they are
indicative that we are trying to avoid some race condition, which means
that the test can fail when the system is under load, or when a tool
like valgrind is used which drastically alters the timing (e.g., if
check-ignore takes longer than 1 second to produce its answer, we may
fail here).

Is there a simpler way to test this?

Like:

  # Set up a long-running check-ignore connected by pipes.
  mkfifo in out 
  (git check-ignore ... in out ) 

  # We cannot just echo in because check-ignore
  # would get EOF after echo exited; instead we open
  # the descriptor in our shell, and then echo to the
  # fd. We make sure to close it at the end, so that
  # the subprocess does get EOF and dies properly.
  exec 9in 
  test_when_finished exec 9- 

  # Now we can do interactive tests
  echo 9 one 
  read response out 
  test $response = ... 
  echo 9 two 
  read response out 
  test $response = ...

Hmm. Maybe simpler wasn't the right word. :) But it avoids any sleeps or
race conditions.

-Peff
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v2 4/5] check-ignore: allow incremental streaming of queries via --stdin

2013-04-11 Thread Adam Spiers
On Thu, Apr 11, 2013 at 03:11:32PM -0400, Jeff King wrote:
 I always get a little nervous with sleeps in the test suite, as they are
 indicative that we are trying to avoid some race condition, which means
 that the test can fail when the system is under load, or when a tool
 like valgrind is used which drastically alters the timing (e.g., if
 check-ignore takes longer than 1 second to produce its answer, we may
 fail here).

Agreed, especially here where my btrfs filesystems see fit to kindly
freeze my system for a few seconds many times each day :-/

 Is there a simpler way to test this?
 
 Like:
 
   # Set up a long-running check-ignore connected by pipes.
   mkfifo in out 
   (git check-ignore ... in out ) 
 
   # We cannot just echo in because check-ignore
   # would get EOF after echo exited; instead we open
   # the descriptor in our shell, and then echo to the
   # fd. We make sure to close it at the end, so that
   # the subprocess does get EOF and dies properly.
   exec 9in 
   test_when_finished exec 9- 
 
   # Now we can do interactive tests
   echo 9 one 
   read response out 
   test $response = ... 
   echo 9 two 
   read response out 
   test $response = ...
 
 Hmm. Maybe simpler wasn't the right word. :) But it avoids any sleeps or
 race conditions.

The shell source is strong with this one ;-)

Congrats - I first tried with FIFOs (hence my other patch which moves
the PIPE test prerequisite definition into the core framework - the
original intention was to reuse it here) but failed to get it working.
I'll re-roll using your approach.
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v2 4/5] check-ignore: allow incremental streaming of queries via --stdin

2013-04-11 Thread Jeff King
On Thu, Apr 11, 2013 at 09:31:41PM +0100, Adam Spiers wrote:

 The shell source is strong with this one ;-)
 
 Congrats - I first tried with FIFOs (hence my other patch which moves
 the PIPE test prerequisite definition into the core framework - the
 original intention was to reuse it here) but failed to get it working.
 I'll re-roll using your approach.

Thanks. If it make you feel any better, it took about 20 minutes of
experimenting and at least three head-scratching wait, that _should_
have worked moments to get it right. :)

The rest of the series looked good to me, though I admit I did not think
too hard about the --non-matching patch, as it looked like you and
Junio had already given some thought to the output format, which is the
tricky part.

-Peff
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v2 4/5] check-ignore: allow incremental streaming of queries via --stdin

2013-04-11 Thread Aaron Schrab

At 13:05 +0100 11 Apr 2013, Adam Spiers g...@adamspiers.org wrote:

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.


The last in there looks to be misplaced.  Was that originally 
something like in the case?  If so the removed words should be 
restored or the lingering one removed as well.

--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v2 4/5] check-ignore: allow incremental streaming of queries via --stdin

2013-04-11 Thread Adam Spiers
On Thu, Apr 11, 2013 at 05:04:30PM -0400, Aaron Schrab wrote:
 At 13:05 +0100 11 Apr 2013, Adam Spiers g...@adamspiers.org wrote:
 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.
 
 The last in there looks to be misplaced.  Was that originally
 something like in the case?  If so the removed words should be
 restored or the lingering one removed as well.

I'll remove it; thanks.
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html