git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
* git stash push -u always warns "pathspec '...' did not match any files"
@ 2018-03-03  9:44 Marc Strapetz
  2018-03-03 15:46 ` Thomas Gummerer
  0 siblings, 1 reply; 33+ messages in thread
From: Marc Strapetz @ 2018-03-03  9:44 UTC (permalink / raw)
  To: git

Reproducible in a test repository with following steps:

$ touch untracked
$ git stash push -u -- untracked
Saved working directory and index state WIP on master: 0096475 init
fatal: pathspec 'untracked' did not match any files
error: unrecognized input

The file is stashed correctly, though.

Tested with Git 2.16.2 on Linux and Windows.

-Marc

	

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: git stash push -u always warns "pathspec '...' did not match any files"
  2018-03-03  9:44 git stash push -u always warns "pathspec '...' did not match any files" Marc Strapetz
@ 2018-03-03 15:46 ` Thomas Gummerer
  2018-03-04 10:44   ` Marc Strapetz
  0 siblings, 1 reply; 33+ messages in thread
From: Thomas Gummerer @ 2018-03-03 15:46 UTC (permalink / raw)
  To: Marc Strapetz; +Cc: git

On 03/03, Marc Strapetz wrote:
> Reproducible in a test repository with following steps:
> 
> $ touch untracked
> $ git stash push -u -- untracked
> Saved working directory and index state WIP on master: 0096475 init
> fatal: pathspec 'untracked' did not match any files
> error: unrecognized input
> 
> The file is stashed correctly, though.
> 
> Tested with Git 2.16.2 on Linux and Windows.

Thanks for the bug report and the reproduction recipe.  The following
patch should fix it:

--- >8 ---
Subject: [PATCH] stash push: avoid printing errors

Currently 'git stash push -u -- <pathspec>' prints the following errors
if <pathspec> only matches untracked files:

    fatal: pathspec 'untracked' did not match any files
    error: unrecognized input

This is because we first clean up the untracked files using 'git clean
<pathspec>', and then use a command chain involving 'git add -u
<pathspec>' and 'git apply' to clear the changes to files that are in
the index and were stashed.

As the <pathspec> only includes untracked files that were already
removed by 'git clean', the 'git add' call will barf, and so will 'git
apply', as there are no changes that need to be applied.

Fix this by making sure to only call this command chain if there are
still files that match <pathspec> after the call to 'git clean'.

Reported-by: Marc Strapetz <marc.strapetz@syntevo.com>
Signed-off-by: Thomas Gummerer <t.gummerer@gmail.com>
---
 git-stash.sh     | 2 +-
 t/t3903-stash.sh | 7 +++++++
 2 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/git-stash.sh b/git-stash.sh
index fc8f8ae640..058ad0bed8 100755
--- a/git-stash.sh
+++ b/git-stash.sh
@@ -320,7 +320,7 @@ push_stash () {
 			git clean --force --quiet -d $CLEAN_X_OPTION -- "$@"
 		fi
 
-		if test $# != 0
+		if test $# != 0 && git ls-files --error-unmatch -- "$@" >/dev/null 2>/dev/null
 		then
 			git add -u -- "$@" |
 			git checkout-index -z --force --stdin
diff --git a/t/t3903-stash.sh b/t/t3903-stash.sh
index aefde7b172..506004aece 100755
--- a/t/t3903-stash.sh
+++ b/t/t3903-stash.sh
@@ -1096,4 +1096,11 @@ test_expect_success 'stash -- <subdir> works with binary files' '
 	test_path_is_file subdir/untracked
 '
 
+test_expect_success 'stash -- <untracked> doesnt print error' '
+	>untracked &&
+	git stash push -u -- untracked 2>actual&&
+	test_path_is_missing untracked &&
+	test_line_count = 0 actual
+'
+
 test_done
-- 
2.16.2.395.g2e18187dfd


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* Re: git stash push -u always warns "pathspec '...' did not match any files"
  2018-03-03 15:46 ` Thomas Gummerer
@ 2018-03-04 10:44   ` Marc Strapetz
  2018-03-09 22:18     ` Junio C Hamano
  0 siblings, 1 reply; 33+ messages in thread
From: Marc Strapetz @ 2018-03-04 10:44 UTC (permalink / raw)
  To: Thomas Gummerer; +Cc: git

On 03.03.2018 16:46, Thomas Gummerer wrote:
> On 03/03, Marc Strapetz wrote:
>> Reproducible in a test repository with following steps:
>>
>> $ touch untracked
>> $ git stash push -u -- untracked
>> Saved working directory and index state WIP on master: 0096475 init
>> fatal: pathspec 'untracked' did not match any files
>> error: unrecognized input
>>
>> The file is stashed correctly, though.
>>
>> Tested with Git 2.16.2 on Linux and Windows.
> 
> Thanks for the bug report and the reproduction recipe.  The following
> patch should fix it:

Thanks, I can confirm that the misleading warning message is fixed.

What I've noticed now is that when using -u option, Git won't warn if 
the pathspec is actually not matching a file. Also, an empty stash may 
be created. For example:

$ git stash push -u -- nonexisting
Saved working directory and index state WIP on master: 171081d initial 
import

I would probably expect to see an error message as for:

$ git stash push -- nonexisting
error: pathspec 'nonexisting' did not match any file(s) known to git.
Did you forget to 'git add'?

That said, this is no problem for us, because I know that the paths I'm 
providing to "git stash push" do exist. I just wanted to point out.

-Marc


^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: git stash push -u always warns "pathspec '...' did not match any files"
  2018-03-04 10:44   ` Marc Strapetz
@ 2018-03-09 22:18     ` Junio C Hamano
  2018-03-10  9:18       ` Marc Strapetz
  0 siblings, 1 reply; 33+ messages in thread
From: Junio C Hamano @ 2018-03-09 22:18 UTC (permalink / raw)
  To: Marc Strapetz; +Cc: Thomas Gummerer, git

Marc Strapetz <marc.strapetz@syntevo.com> writes:

> Thanks, I can confirm that the misleading warning message is fixed.
>
> What I've noticed now is that when using -u option, Git won't warn if
> the pathspec is actually not matching a file. Also, an empty stash may
> be created.

Soooo..., does it mean that the patch Thomas posted and you
confirmed trades one issue with another issue with a similar
graveness?  Is this something we want to "fix" without adding
another breakage?


^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: git stash push -u always warns "pathspec '...' did not match any files"
  2018-03-09 22:18     ` Junio C Hamano
@ 2018-03-10  9:18       ` Marc Strapetz
  2018-03-10 11:12         ` Thomas Gummerer
  0 siblings, 1 reply; 33+ messages in thread
From: Marc Strapetz @ 2018-03-10  9:18 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Thomas Gummerer, git

On 09.03.2018 23:18, Junio C Hamano wrote:
> Marc Strapetz <marc.strapetz@syntevo.com> writes:
> 
>> Thanks, I can confirm that the misleading warning message is fixed.
>>
>> What I've noticed now is that when using -u option, Git won't warn if
>> the pathspec is actually not matching a file. Also, an empty stash may
>> be created.
> 
> Soooo..., does it mean that the patch Thomas posted and you
> confirmed trades one issue with another issue with a similar
> graveness?

 From my understanding these are two separate problems for which the new 
one was somewhat hidden by the one Thomas has fixed: Thomas has fixed 
post-processing code after the stash has already been saved away. The 
problem I'm referring to is a missing check for invalid paths before the 
stash is saved away.

-Marc

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: git stash push -u always warns "pathspec '...' did not match any files"
  2018-03-10  9:18       ` Marc Strapetz
@ 2018-03-10 11:12         ` Thomas Gummerer
  2018-03-14 21:46           ` [PATCH v2 1/2] stash push: avoid printing errors Thomas Gummerer
  0 siblings, 1 reply; 33+ messages in thread
From: Thomas Gummerer @ 2018-03-10 11:12 UTC (permalink / raw)
  To: Marc Strapetz; +Cc: Junio C Hamano, git

On 03/10, Marc Strapetz wrote:
> On 09.03.2018 23:18, Junio C Hamano wrote:
> >Marc Strapetz <marc.strapetz@syntevo.com> writes:
> >
> >>Thanks, I can confirm that the misleading warning message is fixed.
> >>
> >>What I've noticed now is that when using -u option, Git won't warn if
> >>the pathspec is actually not matching a file. Also, an empty stash may
> >>be created.
> >
> >Soooo..., does it mean that the patch Thomas posted and you
> >confirmed trades one issue with another issue with a similar
> >graveness?

I've been meaning to follow up on this, but haven't found the time to
do so yet, sorry.

> From my understanding these are two separate problems for which the new one
> was somewhat hidden by the one Thomas has fixed: Thomas has fixed
> post-processing code after the stash has already been saved away. The
> problem I'm referring to is a missing check for invalid paths before the
> stash is saved away.

Yeah, just to demonstrate what the new problem Marc describes is,
currently 'git stash push -u <unknown>' would produce the following
output, and create a new stash:

    $ git stash push -u unknown
    Saved working directory and index state WIP on master: 7e31236f65 Sixth batch for 2.17
    fatal: pathspec 'unknown' did not match any files
    error: unrecognized input
    $

With the patch I posted it would just print 

    $ git stash push -u unknown
    Saved working directory and index state WIP on master: 7e31236f65 Sixth batch for 2.17
    $

and produce a new stash as before.  Both of those end up confusing to
the user, dunno which one is better.  What really should happen is

    $ git stash push -u unknown
    No local changes to save
    $

and not creating a stash.  So these were many words to basically say
that I think my patch is still the right thing to do, but it may or
may not confuse the user more if they are hitting the other bug Marc
noted.  Either way I'll try to address this as soon as I can get some
time to look at it.

> -Marc

^ permalink raw reply	[flat|nested] 33+ messages in thread

* [PATCH v2 1/2] stash push: avoid printing errors
  2018-03-10 11:12         ` Thomas Gummerer
@ 2018-03-14 21:46           ` Thomas Gummerer
  2018-03-14 21:46             ` [PATCH v2 2/2] stash push -u: don't create empty stash Thomas Gummerer
                               ` (2 more replies)
  0 siblings, 3 replies; 33+ messages in thread
From: Thomas Gummerer @ 2018-03-14 21:46 UTC (permalink / raw)
  To: git; +Cc: Marc Strapetz, Junio C Hamano, Thomas Gummerer

Currently 'git stash push -u -- <pathspec>' prints the following errors
if <pathspec> only matches untracked files:

    fatal: pathspec 'untracked' did not match any files
    error: unrecognized input

This is because we first clean up the untracked files using 'git clean
<pathspec>', and then use a command chain involving 'git add -u
<pathspec>' and 'git apply' to clear the changes to files that are in
the index and were stashed.

As the <pathspec> only includes untracked files that were already
removed by 'git clean', the 'git add' call will barf, and so will 'git
apply', as there are no changes that need to be applied.

Fix this by making sure to only call this command chain if there are
still files that match <pathspec> after the call to 'git clean'.

Reported-by: Marc Strapetz <marc.strapetz@syntevo.com>
Signed-off-by: Thomas Gummerer <t.gummerer@gmail.com>
---

> Either way I'll try to address this as soon as I can get some
> time to look at it.

I finally got around to do this.  The fix (in the second patch) turns
out to be fairly simple, I just forgot to pass the pathspec along to
one function whene originally introducing the pathspec feature in git
stash push (more explanation in the commit message for the patch
itself).  Thanks Marc for reporting the two breakages!

v2 also fixes a couple of typos in the first patch which I failed to
notice when I sent it out last time.

 git-stash.sh     | 2 +-
 t/t3903-stash.sh | 7 +++++++
 2 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/git-stash.sh b/git-stash.sh
index fc8f8ae640..058ad0bed8 100755
--- a/git-stash.sh
+++ b/git-stash.sh
@@ -320,7 +320,7 @@ push_stash () {
 			git clean --force --quiet -d $CLEAN_X_OPTION -- "$@"
 		fi
 
-		if test $# != 0
+		if test $# != 0 && git ls-files --error-unmatch -- "$@" >/dev/null 2>/dev/null
 		then
 			git add -u -- "$@" |
 			git checkout-index -z --force --stdin
diff --git a/t/t3903-stash.sh b/t/t3903-stash.sh
index aefde7b172..fbfda4b243 100755
--- a/t/t3903-stash.sh
+++ b/t/t3903-stash.sh
@@ -1096,4 +1096,11 @@ test_expect_success 'stash -- <subdir> works with binary files' '
 	test_path_is_file subdir/untracked
 '
 
+test_expect_success 'stash -u -- <untracked> doesnt print error' '
+	>untracked &&
+	git stash push -u -- untracked 2>actual &&
+	test_path_is_missing untracked &&
+	test_line_count = 0 actual
+'
+
 test_done
-- 
2.16.2.804.g6dcf76e11


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v2 2/2] stash push -u: don't create empty stash
  2018-03-14 21:46           ` [PATCH v2 1/2] stash push: avoid printing errors Thomas Gummerer
@ 2018-03-14 21:46             ` Thomas Gummerer
  2018-03-15 20:09               ` Junio C Hamano
  2018-03-15  8:51             ` [PATCH v2 1/2] stash push: avoid printing errors Marc Strapetz
  2018-03-16 20:43             ` [PATCH v3 0/2] stash push -u -- <pathspec> fixes Thomas Gummerer
  2 siblings, 1 reply; 33+ messages in thread
From: Thomas Gummerer @ 2018-03-14 21:46 UTC (permalink / raw)
  To: git; +Cc: Marc Strapetz, Junio C Hamano, Thomas Gummerer

When introducing the stash push feature, and thus allowing users to pass
in a pathspec to limit the files that would get stashed in
df6bba0937 ("stash: teach 'push' (and 'create_stash') to honor
pathspec", 2017-02-28), this developer missed one place where the
pathspec should be passed in.

Namely in the call to the 'untracked_files()' function in the
'no_changes()' function.  This resulted in 'git stash push -u --
<non-existant>' creating an empty stash when there are untracked files
in the repository other that don't match the pathspec.

As 'git stash' never creates empty stashes, this behaviour is wrong and
confusing for users.  Instead it should just show a message "No local
changes to save", and not create a stash.

Luckily the 'untracked_files()' function already correctly respects
pathspecs that are passed to it, so the fix is simply to pass the
pathspec along to the function.

Reported-by: Marc Strapetz <marc.strapetz@syntevo.com>
Signed-off-by: Thomas Gummerer <t.gummerer@gmail.com>
---
 git-stash.sh     | 2 +-
 t/t3903-stash.sh | 6 ++++++
 2 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/git-stash.sh b/git-stash.sh
index 058ad0bed8..7a4ec98f6b 100755
--- a/git-stash.sh
+++ b/git-stash.sh
@@ -39,7 +39,7 @@ fi
 no_changes () {
 	git diff-index --quiet --cached HEAD --ignore-submodules -- "$@" &&
 	git diff-files --quiet --ignore-submodules -- "$@" &&
-	(test -z "$untracked" || test -z "$(untracked_files)")
+	(test -z "$untracked" || test -z "$(untracked_files $@)")
 }
 
 untracked_files () {
diff --git a/t/t3903-stash.sh b/t/t3903-stash.sh
index fbfda4b243..5e7078c083 100755
--- a/t/t3903-stash.sh
+++ b/t/t3903-stash.sh
@@ -1103,4 +1103,10 @@ test_expect_success 'stash -u -- <untracked> doesnt print error' '
 	test_line_count = 0 actual
 '
 
+test_expect_success 'stash -u -- <non-existant> shows no changes when there are none' '
+	git stash push -u -- non-existant >actual &&
+	echo "No local changes to save" >expect &&
+	test_i18ncmp expect actual
+'
+
 test_done
-- 
2.16.2.804.g6dcf76e11


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* Re: [PATCH v2 1/2] stash push: avoid printing errors
  2018-03-14 21:46           ` [PATCH v2 1/2] stash push: avoid printing errors Thomas Gummerer
  2018-03-14 21:46             ` [PATCH v2 2/2] stash push -u: don't create empty stash Thomas Gummerer
@ 2018-03-15  8:51             ` Marc Strapetz
  2018-03-16 20:12               ` Thomas Gummerer
  2018-03-16 20:43             ` [PATCH v3 0/2] stash push -u -- <pathspec> fixes Thomas Gummerer
  2 siblings, 1 reply; 33+ messages in thread
From: Marc Strapetz @ 2018-03-15  8:51 UTC (permalink / raw)
  To: Thomas Gummerer, git; +Cc: Junio C Hamano

On 14.03.2018 22:46, Thomas Gummerer wrote:
> Currently 'git stash push -u -- <pathspec>' prints the following errors
> if <pathspec> only matches untracked files:
> 
>      fatal: pathspec 'untracked' did not match any files
>      error: unrecognized input
> 
> This is because we first clean up the untracked files using 'git clean
> <pathspec>', and then use a command chain involving 'git add -u
> <pathspec>' and 'git apply' to clear the changes to files that are in
> the index and were stashed.
> 
> As the <pathspec> only includes untracked files that were already
> removed by 'git clean', the 'git add' call will barf, and so will 'git
> apply', as there are no changes that need to be applied.
> 
> Fix this by making sure to only call this command chain if there are
> still files that match <pathspec> after the call to 'git clean'.
> 
> Reported-by: Marc Strapetz <marc.strapetz@syntevo.com>
> Signed-off-by: Thomas Gummerer <t.gummerer@gmail.com>
> ---
> 
>> Either way I'll try to address this as soon as I can get some
>> time to look at it.
> 
> I finally got around to do this.  The fix (in the second patch) turns
> out to be fairly simple, I just forgot to pass the pathspec along to
> one function whene originally introducing the pathspec feature in git
> stash push (more explanation in the commit message for the patch
> itself).  Thanks Marc for reporting the two breakages!

Thanks, I confirm that both issues are resolved. There is another issue 
now which seems to be a regression. When *successfully* stashing an 
untracked file, local modifications of other files are cleared, too.

$ git init
$ touch file1
$ git add file1
$ git commit -m "initial import"
$ echo "a" > file1
$ touch file2
$ git status --porcelain
  M file1
?? file2
$ git stash push -u -- file2
Saved working directory and index state WIP on master: 25352d7 initial 
import
$ git status
On branch master
nothing to commit, working tree clean

Hence, by stashing just "file2" the local modification of "file1" became 
reset.

-Marc





^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH v2 2/2] stash push -u: don't create empty stash
  2018-03-14 21:46             ` [PATCH v2 2/2] stash push -u: don't create empty stash Thomas Gummerer
@ 2018-03-15 20:09               ` Junio C Hamano
  2018-03-16 20:10                 ` Thomas Gummerer
  0 siblings, 1 reply; 33+ messages in thread
From: Junio C Hamano @ 2018-03-15 20:09 UTC (permalink / raw)
  To: Thomas Gummerer; +Cc: git, Marc Strapetz

Thomas Gummerer <t.gummerer@gmail.com> writes:

>  no_changes () {
>  	git diff-index --quiet --cached HEAD --ignore-submodules -- "$@" &&
>  	git diff-files --quiet --ignore-submodules -- "$@" &&
> -	(test -z "$untracked" || test -z "$(untracked_files)")
> +	(test -z "$untracked" || test -z "$(untracked_files $@)")

Don't you need a pair of double-quotes around that $@?

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH v2 2/2] stash push -u: don't create empty stash
  2018-03-15 20:09               ` Junio C Hamano
@ 2018-03-16 20:10                 ` Thomas Gummerer
  0 siblings, 0 replies; 33+ messages in thread
From: Thomas Gummerer @ 2018-03-16 20:10 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git, Marc Strapetz

On 03/15, Junio C Hamano wrote:
> Thomas Gummerer <t.gummerer@gmail.com> writes:
> 
> >  no_changes () {
> >  	git diff-index --quiet --cached HEAD --ignore-submodules -- "$@" &&
> >  	git diff-files --quiet --ignore-submodules -- "$@" &&
> > -	(test -z "$untracked" || test -z "$(untracked_files)")
> > +	(test -z "$untracked" || test -z "$(untracked_files $@)")
> 
> Don't you need a pair of double-quotes around that $@?

Ah yes indeed.  Will fix, thanks!

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH v2 1/2] stash push: avoid printing errors
  2018-03-15  8:51             ` [PATCH v2 1/2] stash push: avoid printing errors Marc Strapetz
@ 2018-03-16 20:12               ` Thomas Gummerer
  0 siblings, 0 replies; 33+ messages in thread
From: Thomas Gummerer @ 2018-03-16 20:12 UTC (permalink / raw)
  To: Marc Strapetz; +Cc: git, Junio C Hamano

On 03/15, Marc Strapetz wrote:
> On 14.03.2018 22:46, Thomas Gummerer wrote:
> >Currently 'git stash push -u -- <pathspec>' prints the following errors
> >if <pathspec> only matches untracked files:
> >
> >     fatal: pathspec 'untracked' did not match any files
> >     error: unrecognized input
> >
> >This is because we first clean up the untracked files using 'git clean
> ><pathspec>', and then use a command chain involving 'git add -u
> ><pathspec>' and 'git apply' to clear the changes to files that are in
> >the index and were stashed.
> >
> >As the <pathspec> only includes untracked files that were already
> >removed by 'git clean', the 'git add' call will barf, and so will 'git
> >apply', as there are no changes that need to be applied.
> >
> >Fix this by making sure to only call this command chain if there are
> >still files that match <pathspec> after the call to 'git clean'.
> >
> >Reported-by: Marc Strapetz <marc.strapetz@syntevo.com>
> >Signed-off-by: Thomas Gummerer <t.gummerer@gmail.com>
> >---
> >
> >>Either way I'll try to address this as soon as I can get some
> >>time to look at it.
> >
> >I finally got around to do this.  The fix (in the second patch) turns
> >out to be fairly simple, I just forgot to pass the pathspec along to
> >one function whene originally introducing the pathspec feature in git
> >stash push (more explanation in the commit message for the patch
> >itself).  Thanks Marc for reporting the two breakages!
> 
> Thanks, I confirm that both issues are resolved. There is another issue now
> which seems to be a regression. When *successfully* stashing an untracked
> file, local modifications of other files are cleared, too.
> 
> $ git init
> $ touch file1
> $ git add file1
> $ git commit -m "initial import"
> $ echo "a" > file1
> $ touch file2
> $ git status --porcelain
>  M file1
> ?? file2
> $ git stash push -u -- file2
> Saved working directory and index state WIP on master: 25352d7 initial
> import
> $ git status
> On branch master
> nothing to commit, working tree clean
> 
> Hence, by stashing just "file2" the local modification of "file1" became
> reset.

Ah yes, this is indeed a regression, thanks for catching it.  I'll fix
it in the re-roll and add another test for this case.  Sorry about the
false starts here :/

> -Marc
> 
> 
> 
> 

^ permalink raw reply	[flat|nested] 33+ messages in thread

* [PATCH v3 0/2] stash push -u -- <pathspec> fixes
  2018-03-14 21:46           ` [PATCH v2 1/2] stash push: avoid printing errors Thomas Gummerer
  2018-03-14 21:46             ` [PATCH v2 2/2] stash push -u: don't create empty stash Thomas Gummerer
  2018-03-15  8:51             ` [PATCH v2 1/2] stash push: avoid printing errors Marc Strapetz
@ 2018-03-16 20:43             ` Thomas Gummerer
  2018-03-16 20:43               ` [PATCH v3 1/2] stash push: avoid printing errors Thomas Gummerer
                                 ` (3 more replies)
  2 siblings, 4 replies; 33+ messages in thread
From: Thomas Gummerer @ 2018-03-16 20:43 UTC (permalink / raw)
  To: git; +Cc: Marc Strapetz, Junio C Hamano, Thomas Gummerer

Thanks Marc for catching the regression I almost introduced and Junio
for the review of the second patch.  Here's a re-roll that should fix
the issues of v2.

Interdiff below:

diff --git a/git-stash.sh b/git-stash.sh
index 7a4ec98f6b..dbedc7fb9f 100755
--- a/git-stash.sh
+++ b/git-stash.sh
@@ -39,7 +39,7 @@ fi
 no_changes () {
 	git diff-index --quiet --cached HEAD --ignore-submodules -- "$@" &&
 	git diff-files --quiet --ignore-submodules -- "$@" &&
-	(test -z "$untracked" || test -z "$(untracked_files $@)")
+	(test -z "$untracked" || test -z "$(untracked_files "$@")")
 }
 
 untracked_files () {
@@ -320,11 +320,14 @@ push_stash () {
 			git clean --force --quiet -d $CLEAN_X_OPTION -- "$@"
 		fi
 
-		if test $# != 0 && git ls-files --error-unmatch -- "$@" >/dev/null 2>/dev/null
+		if test $# != 0
 		then
-			git add -u -- "$@" |
-			git checkout-index -z --force --stdin
-			git diff-index -p --cached --binary HEAD -- "$@" | git apply --index -R
+			if git ls-files --error-unmatch -- "$@" >/dev/null 2>/dev/null
+			then
+				git add -u -- "$@" |
+				git checkout-index -z --force --stdin
+				git diff-index -p --cached --binary HEAD -- "$@" | git apply --index -R
+			fi
 		else
 			git reset --hard -q
 		fi
diff --git a/t/t3903-stash.sh b/t/t3903-stash.sh
index 5e7078c083..7efc52fe11 100755
--- a/t/t3903-stash.sh
+++ b/t/t3903-stash.sh
@@ -1103,6 +1103,15 @@ test_expect_success 'stash -u -- <untracked> doesnt print error' '
 	test_line_count = 0 actual
 '
 
+test_expect_success 'stash -u -- <untracked> leaves rest of working tree in place' '
+	>tracked &&
+	git add tracked &&
+	>untracked &&
+	git stash push -u -- untracked &&
+	test_path_is_missing untracked &&
+	test_path_is_file tracked
+'
+
 test_expect_success 'stash -u -- <non-existant> shows no changes when there are none' '
 	git stash push -u -- non-existant >actual &&
 	echo "No local changes to save" >expect &&

Thomas Gummerer (2):
  stash push: avoid printing errors
  stash push -u: don't create empty stash

 git-stash.sh     | 11 +++++++----
 t/t3903-stash.sh | 22 ++++++++++++++++++++++
 2 files changed, 29 insertions(+), 4 deletions(-)

-- 
2.16.2.804.g6dcf76e11

^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v3 1/2] stash push: avoid printing errors
  2018-03-16 20:43             ` [PATCH v3 0/2] stash push -u -- <pathspec> fixes Thomas Gummerer
@ 2018-03-16 20:43               ` Thomas Gummerer
  2018-03-16 21:31                 ` Junio C Hamano
  2018-03-16 20:43               ` [PATCH v3 2/2] stash push -u: don't create empty stash Thomas Gummerer
                                 ` (2 subsequent siblings)
  3 siblings, 1 reply; 33+ messages in thread
From: Thomas Gummerer @ 2018-03-16 20:43 UTC (permalink / raw)
  To: git; +Cc: Marc Strapetz, Junio C Hamano, Thomas Gummerer

Currently 'git stash push -u -- <pathspec>' prints the following errors
if <pathspec> only matches untracked files:

    fatal: pathspec 'untracked' did not match any files
    error: unrecognized input

This is because we first clean up the untracked files using 'git clean
<pathspec>', and then use a command chain involving 'git add -u
<pathspec>' and 'git apply' to clear the changes to files that are in
the index and were stashed.

As the <pathspec> only includes untracked files that were already
removed by 'git clean', the 'git add' call will barf, and so will 'git
apply', as there are no changes that need to be applied.

Fix this by making sure to only call this command chain if there are
still files that match <pathspec> after the call to 'git clean'.

Reported-by: Marc Strapetz <marc.strapetz@syntevo.com>
Signed-off-by: Thomas Gummerer <t.gummerer@gmail.com>
---
 git-stash.sh     |  9 ++++++---
 t/t3903-stash.sh | 16 ++++++++++++++++
 2 files changed, 22 insertions(+), 3 deletions(-)

diff --git a/git-stash.sh b/git-stash.sh
index fc8f8ae640..4de9f9bea8 100755
--- a/git-stash.sh
+++ b/git-stash.sh
@@ -322,9 +322,12 @@ push_stash () {
 
 		if test $# != 0
 		then
-			git add -u -- "$@" |
-			git checkout-index -z --force --stdin
-			git diff-index -p --cached --binary HEAD -- "$@" | git apply --index -R
+			if git ls-files --error-unmatch -- "$@" >/dev/null 2>/dev/null
+			then
+				git add -u -- "$@" |
+				git checkout-index -z --force --stdin
+				git diff-index -p --cached --binary HEAD -- "$@" | git apply --index -R
+			fi
 		else
 			git reset --hard -q
 		fi
diff --git a/t/t3903-stash.sh b/t/t3903-stash.sh
index aefde7b172..8b1a8d2982 100755
--- a/t/t3903-stash.sh
+++ b/t/t3903-stash.sh
@@ -1096,4 +1096,20 @@ test_expect_success 'stash -- <subdir> works with binary files' '
 	test_path_is_file subdir/untracked
 '
 
+test_expect_success 'stash -u -- <untracked> doesnt print error' '
+	>untracked &&
+	git stash push -u -- untracked 2>actual &&
+	test_path_is_missing untracked &&
+	test_line_count = 0 actual
+'
+
+test_expect_success 'stash -u -- <untracked> leaves rest of working tree in place' '
+	>tracked &&
+	git add tracked &&
+	>untracked &&
+	git stash push -u -- untracked &&
+	test_path_is_missing untracked &&
+	test_path_is_file tracked
+'
+
 test_done
-- 
2.16.2.804.g6dcf76e11


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v3 2/2] stash push -u: don't create empty stash
  2018-03-16 20:43             ` [PATCH v3 0/2] stash push -u -- <pathspec> fixes Thomas Gummerer
  2018-03-16 20:43               ` [PATCH v3 1/2] stash push: avoid printing errors Thomas Gummerer
@ 2018-03-16 20:43               ` Thomas Gummerer
  2018-03-16 22:37               ` [PATCH v4 0/3] stash push -u -- <pathspec> fixes Junio C Hamano
  2018-03-19 15:44               ` [PATCH v3 0/2] " Marc Strapetz
  3 siblings, 0 replies; 33+ messages in thread
From: Thomas Gummerer @ 2018-03-16 20:43 UTC (permalink / raw)
  To: git; +Cc: Marc Strapetz, Junio C Hamano, Thomas Gummerer

When introducing the stash push feature, and thus allowing users to pass
in a pathspec to limit the files that would get stashed in
df6bba0937 ("stash: teach 'push' (and 'create_stash') to honor
pathspec", 2017-02-28), this developer missed one place where the
pathspec should be passed in.

Namely in the call to the 'untracked_files()' function in the
'no_changes()' function.  This resulted in 'git stash push -u --
<non-existant>' creating an empty stash when there are untracked files
in the repository other that don't match the pathspec.

As 'git stash' never creates empty stashes, this behaviour is wrong and
confusing for users.  Instead it should just show a message "No local
changes to save", and not create a stash.

Luckily the 'untracked_files()' function already correctly respects
pathspecs that are passed to it, so the fix is simply to pass the
pathspec along to the function.

Reported-by: Marc Strapetz <marc.strapetz@syntevo.com>
Signed-off-by: Thomas Gummerer <t.gummerer@gmail.com>
---
 git-stash.sh     | 2 +-
 t/t3903-stash.sh | 6 ++++++
 2 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/git-stash.sh b/git-stash.sh
index 4de9f9bea8..dbedc7fb9f 100755
--- a/git-stash.sh
+++ b/git-stash.sh
@@ -39,7 +39,7 @@ fi
 no_changes () {
 	git diff-index --quiet --cached HEAD --ignore-submodules -- "$@" &&
 	git diff-files --quiet --ignore-submodules -- "$@" &&
-	(test -z "$untracked" || test -z "$(untracked_files)")
+	(test -z "$untracked" || test -z "$(untracked_files "$@")")
 }
 
 untracked_files () {
diff --git a/t/t3903-stash.sh b/t/t3903-stash.sh
index 8b1a8d2982..7efc52fe11 100755
--- a/t/t3903-stash.sh
+++ b/t/t3903-stash.sh
@@ -1112,4 +1112,10 @@ test_expect_success 'stash -u -- <untracked> leaves rest of working tree in plac
 	test_path_is_file tracked
 '
 
+test_expect_success 'stash -u -- <non-existant> shows no changes when there are none' '
+	git stash push -u -- non-existant >actual &&
+	echo "No local changes to save" >expect &&
+	test_i18ncmp expect actual
+'
+
 test_done
-- 
2.16.2.804.g6dcf76e11


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* Re: [PATCH v3 1/2] stash push: avoid printing errors
  2018-03-16 20:43               ` [PATCH v3 1/2] stash push: avoid printing errors Thomas Gummerer
@ 2018-03-16 21:31                 ` Junio C Hamano
  0 siblings, 0 replies; 33+ messages in thread
From: Junio C Hamano @ 2018-03-16 21:31 UTC (permalink / raw)
  To: Thomas Gummerer; +Cc: git, Marc Strapetz

Thomas Gummerer <t.gummerer@gmail.com> writes:

> @@ -322,9 +322,12 @@ push_stash () {
>  
>  		if test $# != 0
>  		then
> -			git add -u -- "$@" |
> -			git checkout-index -z --force --stdin

This obviously is not something this patch breaks, but I am finding
this pipeline that was already here quite puzzling.

The "add -u" is about adding the changes in paths that match the
pathspec to the index; the output from it is meant for human
consumption and certainly is not something "--stdin" should expect
to be understandable, let alone with "-z".

	... goes and digs ...

I think you mis-copied the suggestion in

    https://public-inbox.org/git/xmqqpo7byjwb.fsf@gitster.mtv.corp.google.com/

when you made bba067d2 ("stash: don't delete untracked files that
match pathspec", 2018-01-06), and nobody caught that breakage during
the review.

> -			git diff-index -p --cached --binary HEAD -- "$@" | git apply --index -R
> +			if git ls-files --error-unmatch -- "$@" >/dev/null 2>/dev/null
> +			then
> +				git add -u -- "$@" |
> +				git checkout-index -z --force --stdin

And the same breakage is inherited here; just drop "|" and
downstream "checkout-index" and you should be OK.

> +				git diff-index -p --cached --binary HEAD -- "$@" | git apply --index -R

And while at it, let's split this to two lines after "|".

> +			fi


^ permalink raw reply	[flat|nested] 33+ messages in thread

* [PATCH v4 0/3] stash push -u -- <pathspec> fixes
  2018-03-16 20:43             ` [PATCH v3 0/2] stash push -u -- <pathspec> fixes Thomas Gummerer
  2018-03-16 20:43               ` [PATCH v3 1/2] stash push: avoid printing errors Thomas Gummerer
  2018-03-16 20:43               ` [PATCH v3 2/2] stash push -u: don't create empty stash Thomas Gummerer
@ 2018-03-16 22:37               ` Junio C Hamano
  2018-03-16 22:37                 ` [PATCH v4 1/3] stash: fix nonsense pipeline Junio C Hamano
                                   ` (4 more replies)
  2018-03-19 15:44               ` [PATCH v3 0/2] " Marc Strapetz
  3 siblings, 5 replies; 33+ messages in thread
From: Junio C Hamano @ 2018-03-16 22:37 UTC (permalink / raw)
  To: git; +Cc: Thomas Gummerer

Here is a preliminary fix for an earlier copy-pasto, plus two
patches from your v3.

I tried to reduce the nesting level by swapping the order of if/elif
chain; please double check the logic to ensure I didn't make stupid
mistakes while doing so.

Junio C Hamano (1):
  stash: fix nonsense pipeline

Thomas Gummerer (2):
  stash push: avoid printing errors
  stash push -u: don't create empty stash

 git-stash.sh     | 13 +++++++------
 t/t3903-stash.sh | 22 ++++++++++++++++++++++
 2 files changed, 29 insertions(+), 6 deletions(-)

-- 
2.17.0-rc0


^ permalink raw reply	[flat|nested] 33+ messages in thread

* [PATCH v4 1/3] stash: fix nonsense pipeline
  2018-03-16 22:37               ` [PATCH v4 0/3] stash push -u -- <pathspec> fixes Junio C Hamano
@ 2018-03-16 22:37                 ` Junio C Hamano
  2018-03-16 22:37                 ` [PATCH v4 2/3] stash push: avoid printing errors Junio C Hamano
                                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 33+ messages in thread
From: Junio C Hamano @ 2018-03-16 22:37 UTC (permalink / raw)
  To: git; +Cc: Thomas Gummerer

An earlier change bba067d2 ("stash: don't delete untracked files
that match pathspec", 2018-01-06) was made by taking a suggestion in
a list discussion [1] but did not copy the suggested snippet
correctly.  And the bug was unnoticed during the review and slipped
through.

This fixes it.

[1] https://public-inbox.org/git/xmqqpo7byjwb.fsf@gitster.mtv.corp.google.com/

Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 git-stash.sh | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/git-stash.sh b/git-stash.sh
index b48b164748..4c92ec931f 100755
--- a/git-stash.sh
+++ b/git-stash.sh
@@ -315,9 +315,9 @@ push_stash () {
 
 		if test $# != 0
 		then
-			git add -u -- "$@" |
-			git checkout-index -z --force --stdin
-			git diff-index -p --cached --binary HEAD -- "$@" | git apply --index -R
+			git add -u -- "$@"
+			git diff-index -p --cached --binary HEAD -- "$@" |
+			git apply --index -R
 		else
 			git reset --hard -q
 		fi
-- 
2.17.0-rc0


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v4 2/3] stash push: avoid printing errors
  2018-03-16 22:37               ` [PATCH v4 0/3] stash push -u -- <pathspec> fixes Junio C Hamano
  2018-03-16 22:37                 ` [PATCH v4 1/3] stash: fix nonsense pipeline Junio C Hamano
@ 2018-03-16 22:37                 ` Junio C Hamano
  2018-03-16 22:37                 ` [PATCH v4 3/3] stash push -u: don't create empty stash Junio C Hamano
                                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 33+ messages in thread
From: Junio C Hamano @ 2018-03-16 22:37 UTC (permalink / raw)
  To: git; +Cc: Thomas Gummerer

From: Thomas Gummerer <t.gummerer@gmail.com>

'git stash push -u -- <pathspec>' prints the following errors if
<pathspec> only matches untracked files:

    fatal: pathspec 'untracked' did not match any files
    error: unrecognized input

This is because we first clean up the untracked files using 'git clean
<pathspec>', and then use a command chain involving 'git add -u
<pathspec>' and 'git apply' to clear the changes to files that are in
the index and were stashed.

As the <pathspec> only includes untracked files that were already
removed by 'git clean', the 'git add' call will barf, and so will 'git
apply', as there are no changes that need to be applied.

Fix this by making sure to only call this command chain if there are
still files that match <pathspec> after the call to 'git clean'.

[jc: swapped the order of if/elseif chain to reduce nesting levels]

Reported-by: Marc Strapetz <marc.strapetz@syntevo.com>
Signed-off-by: Thomas Gummerer <t.gummerer@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 git-stash.sh     |  7 ++++---
 t/t3903-stash.sh | 16 ++++++++++++++++
 2 files changed, 20 insertions(+), 3 deletions(-)

diff --git a/git-stash.sh b/git-stash.sh
index 4c92ec931f..fa61151548 100755
--- a/git-stash.sh
+++ b/git-stash.sh
@@ -313,13 +313,14 @@ push_stash () {
 			git clean --force --quiet -d $CLEAN_X_OPTION -- "$@"
 		fi
 
-		if test $# != 0
+		if test $# = 0
+		then
+			git reset --hard -q
+		elif git ls-files --error-unmatch -- "$@" >/dev/null 2>&1
 		then
 			git add -u -- "$@"
 			git diff-index -p --cached --binary HEAD -- "$@" |
 			git apply --index -R
-		else
-			git reset --hard -q
 		fi
 
 		if test "$keep_index" = "t" && test -n "$i_tree"
diff --git a/t/t3903-stash.sh b/t/t3903-stash.sh
index 1cd85e70e9..f5b102a958 100755
--- a/t/t3903-stash.sh
+++ b/t/t3903-stash.sh
@@ -1003,4 +1003,20 @@ test_expect_success 'stash -- <subdir> works with binary files' '
 	test_path_is_file subdir/untracked
 '
 
+test_expect_success 'stash -u -- <untracked> doesnt print error' '
+	>untracked &&
+	git stash push -u -- untracked 2>actual &&
+	test_path_is_missing untracked &&
+	test_line_count = 0 actual
+'
+
+test_expect_success 'stash -u -- <untracked> leaves rest of working tree in place' '
+	>tracked &&
+	git add tracked &&
+	>untracked &&
+	git stash push -u -- untracked &&
+	test_path_is_missing untracked &&
+	test_path_is_file tracked
+'
+
 test_done
-- 
2.17.0-rc0


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v4 3/3] stash push -u: don't create empty stash
  2018-03-16 22:37               ` [PATCH v4 0/3] stash push -u -- <pathspec> fixes Junio C Hamano
  2018-03-16 22:37                 ` [PATCH v4 1/3] stash: fix nonsense pipeline Junio C Hamano
  2018-03-16 22:37                 ` [PATCH v4 2/3] stash push: avoid printing errors Junio C Hamano
@ 2018-03-16 22:37                 ` Junio C Hamano
  2018-03-17 11:36                 ` [PATCH v4 0/3] stash push -u -- <pathspec> fixes Thomas Gummerer
  2018-03-19 23:21                 ` [PATCH v5 " Thomas Gummerer
  4 siblings, 0 replies; 33+ messages in thread
From: Junio C Hamano @ 2018-03-16 22:37 UTC (permalink / raw)
  To: git; +Cc: Thomas Gummerer

From: Thomas Gummerer <t.gummerer@gmail.com>

When introducing the stash push feature, and thus allowing users to pass
in a pathspec to limit the files that would get stashed in
df6bba0937 ("stash: teach 'push' (and 'create_stash') to honor
pathspec", 2017-02-28), this developer missed one place where the
pathspec should be passed in.

Namely in the call to the 'untracked_files()' function in the
'no_changes()' function.  This resulted in 'git stash push -u --
<non-existant>' creating an empty stash when there are untracked files
in the repository other that don't match the pathspec.

As 'git stash' never creates empty stashes, this behaviour is wrong and
confusing for users.  Instead it should just show a message "No local
changes to save", and not create a stash.

Luckily the 'untracked_files()' function already correctly respects
pathspecs that are passed to it, so the fix is simply to pass the
pathspec along to the function.

Reported-by: Marc Strapetz <marc.strapetz@syntevo.com>
Signed-off-by: Thomas Gummerer <t.gummerer@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 git-stash.sh     | 2 +-
 t/t3903-stash.sh | 6 ++++++
 2 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/git-stash.sh b/git-stash.sh
index fa61151548..1652f64b5c 100755
--- a/git-stash.sh
+++ b/git-stash.sh
@@ -39,7 +39,7 @@ fi
 no_changes () {
 	git diff-index --quiet --cached HEAD --ignore-submodules -- "$@" &&
 	git diff-files --quiet --ignore-submodules -- "$@" &&
-	(test -z "$untracked" || test -z "$(untracked_files)")
+	(test -z "$untracked" || test -z "$(untracked_files "$@")")
 }
 
 untracked_files () {
diff --git a/t/t3903-stash.sh b/t/t3903-stash.sh
index f5b102a958..7e0b1c248c 100755
--- a/t/t3903-stash.sh
+++ b/t/t3903-stash.sh
@@ -1019,4 +1019,10 @@ test_expect_success 'stash -u -- <untracked> leaves rest of working tree in plac
 	test_path_is_file tracked
 '
 
+test_expect_success 'stash -u -- <non-existant> shows no changes when there are none' '
+	git stash push -u -- non-existant >actual &&
+	echo "No local changes to save" >expect &&
+	test_i18ncmp expect actual
+'
+
 test_done
-- 
2.17.0-rc0


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* Re: [PATCH v4 0/3] stash push -u -- <pathspec> fixes
  2018-03-16 22:37               ` [PATCH v4 0/3] stash push -u -- <pathspec> fixes Junio C Hamano
                                   ` (2 preceding siblings ...)
  2018-03-16 22:37                 ` [PATCH v4 3/3] stash push -u: don't create empty stash Junio C Hamano
@ 2018-03-17 11:36                 ` Thomas Gummerer
  2018-03-19 23:21                 ` [PATCH v5 " Thomas Gummerer
  4 siblings, 0 replies; 33+ messages in thread
From: Thomas Gummerer @ 2018-03-17 11:36 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git

On 03/16, Junio C Hamano wrote:
> Here is a preliminary fix for an earlier copy-pasto, plus two
> patches from your v3.

Thanks for catching and fixing this!

> I tried to reduce the nesting level by swapping the order of if/elif
> chain; please double check the logic to ensure I didn't make stupid
> mistakes while doing so.

I looked over what you send, and the patches and the changes you made
look good to me.

> Junio C Hamano (1):
>   stash: fix nonsense pipeline
> 
> Thomas Gummerer (2):
>   stash push: avoid printing errors
>   stash push -u: don't create empty stash
> 
>  git-stash.sh     | 13 +++++++------
>  t/t3903-stash.sh | 22 ++++++++++++++++++++++
>  2 files changed, 29 insertions(+), 6 deletions(-)
> 
> -- 
> 2.17.0-rc0
> 

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH v3 0/2] stash push -u -- <pathspec> fixes
  2018-03-16 20:43             ` [PATCH v3 0/2] stash push -u -- <pathspec> fixes Thomas Gummerer
                                 ` (2 preceding siblings ...)
  2018-03-16 22:37               ` [PATCH v4 0/3] stash push -u -- <pathspec> fixes Junio C Hamano
@ 2018-03-19 15:44               ` Marc Strapetz
  2018-03-19 21:51                 ` Thomas Gummerer
  3 siblings, 1 reply; 33+ messages in thread
From: Marc Strapetz @ 2018-03-19 15:44 UTC (permalink / raw)
  To: Thomas Gummerer, git; +Cc: Junio C Hamano

On 16.03.2018 21:43, Thomas Gummerer wrote:
> Thanks Marc for catching the regression I almost introduced and Junio
> for the review of the second patch.  Here's a re-roll that should fix
> the issues of v2.

Thanks, existing issues are fixed, but cleanup of the stashed files 
seems to not work properly when stashing a mixture of tracked and 
untracked files:

$ git init
$ touch file1
$ touch file2
$ git add file1 file2
$ git commit -m "initial import"
$ echo "a" > file1
$ echo "b" > file2
$ touch file3
$ git status --porcelain
  M file1
  M file2
?? file3
$ git stash push -u -- file1 file3
Saved working directory and index state WIP on master: 48fb140 initial 
import
$ git status --porcelain
  M file1
  M file2

file1 and file3 are properly stashed, but file1 still remains modified 
in the working tree. When instead stashing file1 and file2, results are 
fine:

$ git stash push -u -- file1 file2
Saved working directory and index state WIP on master: 48fb140 initial 
import
$ git status
On branch master
nothing to commit, working tree clean

-Marc



^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH v3 0/2] stash push -u -- <pathspec> fixes
  2018-03-19 15:44               ` [PATCH v3 0/2] " Marc Strapetz
@ 2018-03-19 21:51                 ` Thomas Gummerer
  0 siblings, 0 replies; 33+ messages in thread
From: Thomas Gummerer @ 2018-03-19 21:51 UTC (permalink / raw)
  To: Marc Strapetz; +Cc: git, Junio C Hamano

On 03/19, Marc Strapetz wrote:
> On 16.03.2018 21:43, Thomas Gummerer wrote:
> >Thanks Marc for catching the regression I almost introduced and Junio
> >for the review of the second patch.  Here's a re-roll that should fix
> >the issues of v2.
> 
> Thanks, existing issues are fixed, but cleanup of the stashed files seems to
> not work properly when stashing a mixture of tracked and untracked files:

Thanks for the continued testing, and sorry I just can't seem to get
this right :/  The problem here was that I misunderstood what 'git
ls-files --error-unmatch' does without testing it myself.  I'll send
v5 in a bit, which will hopefully finally fix all the cases.

> $ git init
> $ touch file1
> $ touch file2
> $ git add file1 file2
> $ git commit -m "initial import"
> $ echo "a" > file1
> $ echo "b" > file2
> $ touch file3
> $ git status --porcelain
>  M file1
>  M file2
> ?? file3
> $ git stash push -u -- file1 file3
> Saved working directory and index state WIP on master: 48fb140 initial
> import
> $ git status --porcelain
>  M file1
>  M file2
> 
> file1 and file3 are properly stashed, but file1 still remains modified in
> the working tree. When instead stashing file1 and file2, results are fine:
> 
> $ git stash push -u -- file1 file2
> Saved working directory and index state WIP on master: 48fb140 initial
> import
> $ git status
> On branch master
> nothing to commit, working tree clean
> 
> -Marc
> 
> 

^ permalink raw reply	[flat|nested] 33+ messages in thread

* [PATCH v5 0/3] stash push -u -- <pathspec> fixes
  2018-03-16 22:37               ` [PATCH v4 0/3] stash push -u -- <pathspec> fixes Junio C Hamano
                                   ` (3 preceding siblings ...)
  2018-03-17 11:36                 ` [PATCH v4 0/3] stash push -u -- <pathspec> fixes Thomas Gummerer
@ 2018-03-19 23:21                 ` Thomas Gummerer
  2018-03-19 23:21                   ` [PATCH v5 1/3] stash: fix nonsense pipeline Thomas Gummerer
                                     ` (3 more replies)
  4 siblings, 4 replies; 33+ messages in thread
From: Thomas Gummerer @ 2018-03-19 23:21 UTC (permalink / raw)
  To: git; +Cc: Marc Strapetz, Junio C Hamano, Thomas Gummerer

Thanks again Marc for all the testing and Junio for fixing up my brown
paper bag copy-pasto.

This iteration addresses the breakage Marc noticed with the latest
version of the patches, adds some more tests, and moves all the new
tests to t3905 instead of t3903, which I just noticed exists and is a
much better match for the new tests.

Patch 1 and 3 are the same as in the previous round, Patch 2 is mostly
rewritten.  Instead of trying to avoid part of the pipeline we're
using to get rid of changes, we now are getting rid of the 'git clean'
call in the pathspec case, and use the existing pipeline to get rid of
changes in untracked files as well.  I'm not adding an interdiff,
because Patch 2 is mostly rewritten and the other two are unchanged,
so it is probably easiest to just review patch 2.

Junio C Hamano (1):
  stash: fix nonsense pipeline

Thomas Gummerer (2):
  stash push: avoid printing errors
  stash push -u: don't create empty stash

 git-stash.sh                       | 12 +++++----
 t/t3905-stash-include-untracked.sh | 52 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 59 insertions(+), 5 deletions(-)

-- 
2.15.1.33.g3165b24a68


^ permalink raw reply	[flat|nested] 33+ messages in thread

* [PATCH v5 1/3] stash: fix nonsense pipeline
  2018-03-19 23:21                 ` [PATCH v5 " Thomas Gummerer
@ 2018-03-19 23:21                   ` Thomas Gummerer
  2018-03-19 23:21                   ` [PATCH v5 2/3] stash push: avoid printing errors Thomas Gummerer
                                     ` (2 subsequent siblings)
  3 siblings, 0 replies; 33+ messages in thread
From: Thomas Gummerer @ 2018-03-19 23:21 UTC (permalink / raw)
  To: git; +Cc: Marc Strapetz, Junio C Hamano

From: Junio C Hamano <gitster@pobox.com>

An earlier change bba067d2 ("stash: don't delete untracked files
that match pathspec", 2018-01-06) was made by taking a suggestion in
a list discussion [1] but did not copy the suggested snippet
correctly.  And the bug was unnoticed during the review and slipped
through.

This fixes it.

[1] https://public-inbox.org/git/xmqqpo7byjwb.fsf@gitster.mtv.corp.google.com/

Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 git-stash.sh | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/git-stash.sh b/git-stash.sh
index b48b164748..4c92ec931f 100755
--- a/git-stash.sh
+++ b/git-stash.sh
@@ -315,9 +315,9 @@ push_stash () {
 
 		if test $# != 0
 		then
-			git add -u -- "$@" |
-			git checkout-index -z --force --stdin
-			git diff-index -p --cached --binary HEAD -- "$@" | git apply --index -R
+			git add -u -- "$@"
+			git diff-index -p --cached --binary HEAD -- "$@" |
+			git apply --index -R
 		else
 			git reset --hard -q
 		fi
-- 
2.15.1.33.g3165b24a68


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v5 2/3] stash push: avoid printing errors
  2018-03-19 23:21                 ` [PATCH v5 " Thomas Gummerer
  2018-03-19 23:21                   ` [PATCH v5 1/3] stash: fix nonsense pipeline Thomas Gummerer
@ 2018-03-19 23:21                   ` Thomas Gummerer
  2018-03-20 16:54                     ` Junio C Hamano
  2018-03-19 23:21                   ` [PATCH v5 3/3] stash push -u: don't create empty stash Thomas Gummerer
  2018-03-20 10:06                   ` [PATCH v5 0/3] stash push -u -- <pathspec> fixes Marc Strapetz
  3 siblings, 1 reply; 33+ messages in thread
From: Thomas Gummerer @ 2018-03-19 23:21 UTC (permalink / raw)
  To: git; +Cc: Marc Strapetz, Junio C Hamano, Thomas Gummerer

'git stash push -u -- <pathspec>' prints the following errors if
<pathspec> only matches untracked files:

    fatal: pathspec 'untracked' did not match any files
    error: unrecognized input

This is because we first clean up the untracked files using 'git clean
<pathspec>', and then use a command chain involving 'git add -u
<pathspec>' and 'git apply' to clear the changes to files that are in
the index and were stashed.

As the <pathspec> only includes untracked files that were already
removed by 'git clean', the 'git add' call will barf, and so will 'git
apply', as there are no changes that need to be applied.

Fix this by avoiding the 'git clean' if a pathspec is given, and use the
pipeline that's used for pathspec mode to get rid of the untracked files
as well.

Reported-by: Marc Strapetz <marc.strapetz@syntevo.com>
Signed-off-by: Thomas Gummerer <t.gummerer@gmail.com>
---
 git-stash.sh                       |  6 +++--
 t/t3905-stash-include-untracked.sh | 46 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 50 insertions(+), 2 deletions(-)

diff --git a/git-stash.sh b/git-stash.sh
index 4c92ec931f..5e06f96da5 100755
--- a/git-stash.sh
+++ b/git-stash.sh
@@ -308,14 +308,16 @@ push_stash () {
 	if test -z "$patch_mode"
 	then
 		test "$untracked" = "all" && CLEAN_X_OPTION=-x || CLEAN_X_OPTION=
-		if test -n "$untracked"
+		if test -n "$untracked" && test $# = 0
 		then
 			git clean --force --quiet -d $CLEAN_X_OPTION -- "$@"
 		fi
 
 		if test $# != 0
 		then
-			git add -u -- "$@"
+			test -z "$untracked" && UPDATE_OPTION="-u" || UPDATE_OPTION=
+			test "$untracked" = "all" && FORCE_OPTION="--force" || FORCE_OPTION=
+			git add $UPDATE_OPTION $FORCE_OPTION -- "$@"
 			git diff-index -p --cached --binary HEAD -- "$@" |
 			git apply --index -R
 		else
diff --git a/t/t3905-stash-include-untracked.sh b/t/t3905-stash-include-untracked.sh
index bfde4057ad..2f9045553e 100755
--- a/t/t3905-stash-include-untracked.sh
+++ b/t/t3905-stash-include-untracked.sh
@@ -228,4 +228,50 @@ test_expect_success 'stash previously ignored file' '
 	test_path_is_file ignored.d/foo
 '
 
+test_expect_success 'stash -u -- <untracked> doesnt print error' '
+	>untracked &&
+	git stash push -u -- untracked 2>actual &&
+	test_path_is_missing untracked &&
+	test_line_count = 0 actual
+'
+
+test_expect_success 'stash -u -- <untracked> leaves rest of working tree in place' '
+	>tracked &&
+	git add tracked &&
+	>untracked &&
+	git stash push -u -- untracked &&
+	test_path_is_missing untracked &&
+	test_path_is_file tracked
+'
+
+test_expect_success 'stash -u -- <tracked> <untracked> clears changes in both' '
+	>tracked &&
+	git add tracked &&
+	>untracked &&
+	git stash push -u -- tracked untracked &&
+	test_path_is_missing tracked &&
+	test_path_is_missing untracked
+'
+
+test_expect_success 'stash --all -- <ignored> stashes ignored file' '
+	>ignored.d/bar &&
+	git stash push --all -- ignored.d/bar &&
+	test_path_is_missing ignored.d/bar
+'
+
+test_expect_success 'stash --all -- <tracked> <ignored> clears changes in both' '
+	>tracked &&
+	git add tracked &&
+	>ignored.d/bar &&
+	git stash push --all -- tracked ignored.d/bar &&
+	test_path_is_missing tracked &&
+	test_path_is_missing ignored.d/bar
+'
+
+test_expect_success 'stash -u -- <ignored> leaves ignored file alone' '
+	>ignored.d/bar &&
+	git stash push -u -- ignored.d/bar &&
+	test_path_is_file ignored.d/bar
+'
+
 test_done
-- 
2.15.1.33.g3165b24a68


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v5 3/3] stash push -u: don't create empty stash
  2018-03-19 23:21                 ` [PATCH v5 " Thomas Gummerer
  2018-03-19 23:21                   ` [PATCH v5 1/3] stash: fix nonsense pipeline Thomas Gummerer
  2018-03-19 23:21                   ` [PATCH v5 2/3] stash push: avoid printing errors Thomas Gummerer
@ 2018-03-19 23:21                   ` Thomas Gummerer
  2018-03-20 10:06                   ` [PATCH v5 0/3] stash push -u -- <pathspec> fixes Marc Strapetz
  3 siblings, 0 replies; 33+ messages in thread
From: Thomas Gummerer @ 2018-03-19 23:21 UTC (permalink / raw)
  To: git; +Cc: Marc Strapetz, Junio C Hamano, Thomas Gummerer

When introducing the stash push feature, and thus allowing users to pass
in a pathspec to limit the files that would get stashed in
df6bba0937 ("stash: teach 'push' (and 'create_stash') to honor
pathspec", 2017-02-28), this developer missed one place where the
pathspec should be passed in.

Namely in the call to the 'untracked_files()' function in the
'no_changes()' function.  This resulted in 'git stash push -u --
<non-existant>' creating an empty stash when there are untracked files
in the repository other that don't match the pathspec.

As 'git stash' never creates empty stashes, this behaviour is wrong and
confusing for users.  Instead it should just show a message "No local
changes to save", and not create a stash.

Luckily the 'untracked_files()' function already correctly respects
pathspecs that are passed to it, so the fix is simply to pass the
pathspec along to the function.

Reported-by: Marc Strapetz <marc.strapetz@syntevo.com>
Signed-off-by: Thomas Gummerer <t.gummerer@gmail.com>
---
 git-stash.sh                       | 2 +-
 t/t3905-stash-include-untracked.sh | 6 ++++++
 2 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/git-stash.sh b/git-stash.sh
index 5e06f96da5..4e55f278bd 100755
--- a/git-stash.sh
+++ b/git-stash.sh
@@ -39,7 +39,7 @@ fi
 no_changes () {
 	git diff-index --quiet --cached HEAD --ignore-submodules -- "$@" &&
 	git diff-files --quiet --ignore-submodules -- "$@" &&
-	(test -z "$untracked" || test -z "$(untracked_files)")
+	(test -z "$untracked" || test -z "$(untracked_files "$@")")
 }
 
 untracked_files () {
diff --git a/t/t3905-stash-include-untracked.sh b/t/t3905-stash-include-untracked.sh
index 2f9045553e..3ea5b9bb3f 100755
--- a/t/t3905-stash-include-untracked.sh
+++ b/t/t3905-stash-include-untracked.sh
@@ -274,4 +274,10 @@ test_expect_success 'stash -u -- <ignored> leaves ignored file alone' '
 	test_path_is_file ignored.d/bar
 '
 
+test_expect_success 'stash -u -- <non-existant> shows no changes when there are none' '
+	git stash push -u -- non-existant >actual &&
+	echo "No local changes to save" >expect &&
+	test_i18ncmp expect actual
+'
+
 test_done
-- 
2.15.1.33.g3165b24a68


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* Re: [PATCH v5 0/3] stash push -u -- <pathspec> fixes
  2018-03-19 23:21                 ` [PATCH v5 " Thomas Gummerer
                                     ` (2 preceding siblings ...)
  2018-03-19 23:21                   ` [PATCH v5 3/3] stash push -u: don't create empty stash Thomas Gummerer
@ 2018-03-20 10:06                   ` Marc Strapetz
  3 siblings, 0 replies; 33+ messages in thread
From: Marc Strapetz @ 2018-03-20 10:06 UTC (permalink / raw)
  To: Thomas Gummerer, git; +Cc: Junio C Hamano

On 20.03.2018 00:21, Thomas Gummerer wrote:
> Thanks again Marc for all the testing and Junio for fixing up my brown
> paper bag copy-pasto.
> 
> This iteration addresses the breakage Marc noticed with the latest
> version of the patches, adds some more tests, and moves all the new
> tests to t3905 instead of t3903, which I just noticed exists and is a
> much better match for the new tests.
> 
> Patch 1 and 3 are the same as in the previous round, Patch 2 is mostly
> rewritten.  Instead of trying to avoid part of the pipeline we're
> using to get rid of changes, we now are getting rid of the 'git clean'
> call in the pathspec case, and use the existing pipeline to get rid of
> changes in untracked files as well.  I'm not adding an interdiff,
> because Patch 2 is mostly rewritten and the other two are unchanged,
> so it is probably easiest to just review patch 2.

Thanks, Thomas. All of my manual tests have been working fine now.

-Marc

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH v5 2/3] stash push: avoid printing errors
  2018-03-19 23:21                   ` [PATCH v5 2/3] stash push: avoid printing errors Thomas Gummerer
@ 2018-03-20 16:54                     ` Junio C Hamano
  2018-03-21 21:36                       ` Thomas Gummerer
  0 siblings, 1 reply; 33+ messages in thread
From: Junio C Hamano @ 2018-03-20 16:54 UTC (permalink / raw)
  To: Thomas Gummerer; +Cc: git, Marc Strapetz

Thomas Gummerer <t.gummerer@gmail.com> writes:

> ...
> Fix this by avoiding the 'git clean' if a pathspec is given, and use the
> pipeline that's used for pathspec mode to get rid of the untracked files
> as well.

That made me wonder if we can get rid of 'git clean' altogether by
pretending that we saw a pathspec '.' that match everything when no
pathspec is given---that way we only have to worry about a single
codepath.

But I guess doing it this way can minimize potential damage.  Those
who do not use pathspec when running "git stash" won't be affected
even if this change had some bugs ;-)

> diff --git a/git-stash.sh b/git-stash.sh
> index 4c92ec931f..5e06f96da5 100755
> --- a/git-stash.sh
> +++ b/git-stash.sh
> @@ -308,14 +308,16 @@ push_stash () {
>  	if test -z "$patch_mode"
>  	then
>  		test "$untracked" = "all" && CLEAN_X_OPTION=-x || CLEAN_X_OPTION=
> -		if test -n "$untracked"
> +		if test -n "$untracked" && test $# = 0
>  		then
>  			git clean --force --quiet -d $CLEAN_X_OPTION -- "$@"
>  		fi
>  
>  		if test $# != 0
>  		then
> -			git add -u -- "$@"
> +			test -z "$untracked" && UPDATE_OPTION="-u" || UPDATE_OPTION=
> +			test "$untracked" = "all" && FORCE_OPTION="--force" || FORCE_OPTION=
> +			git add $UPDATE_OPTION $FORCE_OPTION -- "$@"
>  			git diff-index -p --cached --binary HEAD -- "$@" |
>  			git apply --index -R
>  		else

Thanks, I'll take the change as-is.

I however wonder if we restructure the code to

	if test $# = 0
	then
		# no pathspec
		if test -n "$untracked"
		then
			git clean --force --quiet -d $CLEAN_OPTION -- "$@"
		fi
		git reset --hard -q
	else
		test -z "$untracked" && UPDATE=-u || UPDATE=
		test "$untracked" = all && FORCE=--force || FORCE=
		git add $UPDATE $FORCE-- "$@"
		git diff-index -p --cached --binary HEAD -- "$@" |
		git apply --index -R
	fi

it becomes easier to understand what is going on.

That way, once we have a plumbing command to help the else clause of
the above, i.e. "git checkout --index <tree-ish> -- <pathspec>"
[*1*], then we can lose the if/then/else and rewrite the whole "we
have created stash, so it's time to get rid of local modifications
to the paths that match the pathspec" code to:

	if test "$untracked"
	then
		git clean --force --quiet -d $CLEAN_OPTION -- "$@"
	fi
	git checkout --index HEAD -- "$@"

[Footnote]
cf. https://public-inbox.org/git/xmqq4loqplou.fsf@gitster.mtv.corp.google.com/

What we want in the case in the code in question when there is
pathspec is "match the index entries and the working tree files to
those that appear in a given tree for paths that match the given
pathspec".  This is close to "git checkout <tree-ish> -- <pathspec>"
but not quite.  Current "git checkout <tree-ish> -- <pathspec>" is
an overlay operation in that paths that match <pathspec> but do not
exist in <tree-ish> are *NOT* removed from the working tree.  We
obviously cannot change the behaviour of the command.

But we can add an option to ask for the new behaviour.  In general,
for an operation that affects the index and the working tree, we can
have "--cached" mode that affects only the index without touching
the working tree, and "--index" mode that affects both.

"git reset <tree-ish> -- <pathspec>", which is a UI mistake, is
better spelled "git checkout --cached <tree-ish> -- <pathspec>".  We
take paths that match <pathspec> from <tree-ish> and stuff into the
index, and remove entries from the index for paths that do not exist
in <tree-ish>.  And if we extend that to "--index" mode, that is
exactly what we want to happen.

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH v5 2/3] stash push: avoid printing errors
  2018-03-20 16:54                     ` Junio C Hamano
@ 2018-03-21 21:36                       ` Thomas Gummerer
  2018-03-21 21:53                         ` [PATCH] stash: drop superfluos pathspec parameter (was: Re: [PATCH v5 2/3] stash push: avoid printing errors) Thomas Gummerer
  2018-03-21 21:56                         ` [PATCH v5 2/3] stash push: avoid printing errors Junio C Hamano
  0 siblings, 2 replies; 33+ messages in thread
From: Thomas Gummerer @ 2018-03-21 21:36 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git, Marc Strapetz

On 03/20, Junio C Hamano wrote:
> Thomas Gummerer <t.gummerer@gmail.com> writes:
> 
> > ...
> > Fix this by avoiding the 'git clean' if a pathspec is given, and use the
> > pipeline that's used for pathspec mode to get rid of the untracked files
> > as well.
> 
> That made me wonder if we can get rid of 'git clean' altogether by
> pretending that we saw a pathspec '.' that match everything when no
> pathspec is given---that way we only have to worry about a single
> codepath.
> 
> But I guess doing it this way can minimize potential damage.  Those
> who do not use pathspec when running "git stash" won't be affected
> even if this change had some bugs ;-)

Heh yeah, we found enough bugs in this code so far, so it's probably
best to leave the part that's working alone at least for now.

> > diff --git a/git-stash.sh b/git-stash.sh
> > index 4c92ec931f..5e06f96da5 100755
> > --- a/git-stash.sh
> > +++ b/git-stash.sh
> > @@ -308,14 +308,16 @@ push_stash () {
> >  	if test -z "$patch_mode"
> >  	then
> >  		test "$untracked" = "all" && CLEAN_X_OPTION=-x || CLEAN_X_OPTION=
> > -		if test -n "$untracked"
> > +		if test -n "$untracked" && test $# = 0
> >  		then
> >  			git clean --force --quiet -d $CLEAN_X_OPTION -- "$@"

Argh I just noticed we could drop the "$@" here, as this is no longer
the pathspec case.  It doesn't hurt anything, except it may be a bit
confusing when reading the code.

Although if we end up implementing 'git checkout --index <pathspec>',
we'd have to add it back, but we do have a test covering this case, so
there's no worries about forgetting to add it back.

> >  		fi
> >  
> >  		if test $# != 0
> >  		then
> > -			git add -u -- "$@"
> > +			test -z "$untracked" && UPDATE_OPTION="-u" || UPDATE_OPTION=
> > +			test "$untracked" = "all" && FORCE_OPTION="--force" || FORCE_OPTION=
> > +			git add $UPDATE_OPTION $FORCE_OPTION -- "$@"
> >  			git diff-index -p --cached --binary HEAD -- "$@" |
> >  			git apply --index -R
> >  		else
> 
> Thanks, I'll take the change as-is.
> 
> I however wonder if we restructure the code to
> 
> 	if test $# = 0
> 	then
> 		# no pathspec
> 		if test -n "$untracked"
> 		then
> 			git clean --force --quiet -d $CLEAN_OPTION -- "$@"
> 		fi
> 		git reset --hard -q
> 	else
> 		test -z "$untracked" && UPDATE=-u || UPDATE=
> 		test "$untracked" = all && FORCE=--force || FORCE=
> 		git add $UPDATE $FORCE-- "$@"
> 		git diff-index -p --cached --binary HEAD -- "$@" |
> 		git apply --index -R
> 	fi
> 
> it becomes easier to understand what is going on.

I like that code structure more than what I have now.  I see you
already merged what I had to next, and I like keeping the change small
now that we're in the rc period (assuming you want to get this into
2.17?)  Maybe we can restructure the code as a separate cleanup once
2.17 is out, so this has more time to cook in master and hopefully
we'd notice regressions before the next release?

> That way, once we have a plumbing command to help the else clause of
> the above, i.e. "git checkout --index <tree-ish> -- <pathspec>"
> [*1*], then we can lose the if/then/else and rewrite the whole "we
> have created stash, so it's time to get rid of local modifications
> to the paths that match the pathspec" code to:
> 
> 	if test "$untracked"
> 	then
> 		git clean --force --quiet -d $CLEAN_OPTION -- "$@"
> 	fi
> 	git checkout --index HEAD -- "$@"

Yeah, this would be nice to have.  I wanted to have a look at what it
would take to implement 'git checkout --{cached,index}', but I'm not
familiar with the checkout code at all, so it will probably be a while
until I can get around to do it. 

> [Footnote]
> cf. https://public-inbox.org/git/xmqq4loqplou.fsf@gitster.mtv.corp.google.com/
> 
> What we want in the case in the code in question when there is
> pathspec is "match the index entries and the working tree files to
> those that appear in a given tree for paths that match the given
> pathspec".  This is close to "git checkout <tree-ish> -- <pathspec>"
> but not quite.  Current "git checkout <tree-ish> -- <pathspec>" is
> an overlay operation in that paths that match <pathspec> but do not
> exist in <tree-ish> are *NOT* removed from the working tree.  We
> obviously cannot change the behaviour of the command.
> 
> But we can add an option to ask for the new behaviour.  In general,
> for an operation that affects the index and the working tree, we can
> have "--cached" mode that affects only the index without touching
> the working tree, and "--index" mode that affects both.
> 
> "git reset <tree-ish> -- <pathspec>", which is a UI mistake, is
> better spelled "git checkout --cached <tree-ish> -- <pathspec>".  We
> take paths that match <pathspec> from <tree-ish> and stuff into the
> index, and remove entries from the index for paths that do not exist
> in <tree-ish>.  And if we extend that to "--index" mode, that is
> exactly what we want to happen.

^ permalink raw reply	[flat|nested] 33+ messages in thread

* [PATCH] stash: drop superfluos pathspec parameter (was: Re: [PATCH v5 2/3] stash push: avoid printing errors)
  2018-03-21 21:36                       ` Thomas Gummerer
@ 2018-03-21 21:53                         ` Thomas Gummerer
  2018-03-21 22:07                           ` [PATCH] stash: drop superfluos pathspec parameter Junio C Hamano
  2018-03-21 21:56                         ` [PATCH v5 2/3] stash push: avoid printing errors Junio C Hamano
  1 sibling, 1 reply; 33+ messages in thread
From: Thomas Gummerer @ 2018-03-21 21:53 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git, Marc Strapetz

On 03/21, Thomas Gummerer wrote:
>
> Argh I just noticed we could drop the "$@" here, as this is no longer
> the pathspec case.  It doesn't hurt anything, except it may be a bit
> confusing when reading the code.
> 
> Although if we end up implementing 'git checkout --index <pathspec>',
> we'd have to add it back, but we do have a test covering this case, so
> there's no worries about forgetting to add it back.

Here's a patch for that.  Not sure it's worth doing, but since we're
already touching the area, this may be a good cleanup.

This is based on top of tg/stash-untracked-with-pathspec-fix.

--- >8 ---
Subject: [PATCH] stash: drop superfluos pathspec parameter

Since 833622a945 ("stash push: avoid printing errors", 2018-03-19) we
don't use the 'git clean' call for the pathspec case anymore.  The
commit however forgot to remove the pathspec argument to the call.
Remove the superfluos argument to make the code a little more obvious.

Signed-off-by: Thomas Gummerer <t.gummerer@gmail.com>
---
 git-stash.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/git-stash.sh b/git-stash.sh
index 4e55f278bd..d31924aea3 100755
--- a/git-stash.sh
+++ b/git-stash.sh
@@ -310,7 +310,7 @@ push_stash () {
 		test "$untracked" = "all" && CLEAN_X_OPTION=-x || CLEAN_X_OPTION=
 		if test -n "$untracked" && test $# = 0
 		then
-			git clean --force --quiet -d $CLEAN_X_OPTION -- "$@"
+			git clean --force --quiet -d $CLEAN_X_OPTION
 		fi
 
 		if test $# != 0
-- 
2.15.1.33.g3165b24a68


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* Re: [PATCH v5 2/3] stash push: avoid printing errors
  2018-03-21 21:36                       ` Thomas Gummerer
  2018-03-21 21:53                         ` [PATCH] stash: drop superfluos pathspec parameter (was: Re: [PATCH v5 2/3] stash push: avoid printing errors) Thomas Gummerer
@ 2018-03-21 21:56                         ` Junio C Hamano
  1 sibling, 0 replies; 33+ messages in thread
From: Junio C Hamano @ 2018-03-21 21:56 UTC (permalink / raw)
  To: Thomas Gummerer; +Cc: git, Marc Strapetz

Thomas Gummerer <t.gummerer@gmail.com> writes:

>> > diff --git a/git-stash.sh b/git-stash.sh
>> > index 4c92ec931f..5e06f96da5 100755
>> > --- a/git-stash.sh
>> > +++ b/git-stash.sh
>> > @@ -308,14 +308,16 @@ push_stash () {
>> >  	if test -z "$patch_mode"
>> >  	then
>> >  		test "$untracked" = "all" && CLEAN_X_OPTION=-x || CLEAN_X_OPTION=
>> > -		if test -n "$untracked"
>> > +		if test -n "$untracked" && test $# = 0
>> >  		then
>> >  			git clean --force --quiet -d $CLEAN_X_OPTION -- "$@"
>
> Argh I just noticed we could drop the "$@" here, as this is no longer
> the pathspec case.  It doesn't hurt anything, except it may be a bit
> confusing when reading the code.

Yes, we could, but we do not have to.  I think it is fine to leave
it in especially if we envision that the codepaths for two cases
will be unified in the future.

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH] stash: drop superfluos pathspec parameter
  2018-03-21 21:53                         ` [PATCH] stash: drop superfluos pathspec parameter (was: Re: [PATCH v5 2/3] stash push: avoid printing errors) Thomas Gummerer
@ 2018-03-21 22:07                           ` Junio C Hamano
  0 siblings, 0 replies; 33+ messages in thread
From: Junio C Hamano @ 2018-03-21 22:07 UTC (permalink / raw)
  To: Thomas Gummerer; +Cc: git, Marc Strapetz

Thomas Gummerer <t.gummerer@gmail.com> writes:

> On 03/21, Thomas Gummerer wrote:
>>
>> Argh I just noticed we could drop the "$@" here, as this is no longer
>> the pathspec case.  It doesn't hurt anything, except it may be a bit
>> confusing when reading the code.
>> 
>> Although if we end up implementing 'git checkout --index <pathspec>',
>> we'd have to add it back, but we do have a test covering this case, so
>> there's no worries about forgetting to add it back.
>
> Here's a patch for that.  Not sure it's worth doing, but since we're
> already touching the area, this may be a good cleanup.

OK, I can go either way, and since you have already written a
change, let's not waste it ;-)

Thanks.

>
> This is based on top of tg/stash-untracked-with-pathspec-fix.
>
> --- >8 ---
> Subject: [PATCH] stash: drop superfluos pathspec parameter
>
> Since 833622a945 ("stash push: avoid printing errors", 2018-03-19) we
> don't use the 'git clean' call for the pathspec case anymore.  The
> commit however forgot to remove the pathspec argument to the call.
> Remove the superfluos argument to make the code a little more obvious.
>
> Signed-off-by: Thomas Gummerer <t.gummerer@gmail.com>
> ---
>  git-stash.sh | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/git-stash.sh b/git-stash.sh
> index 4e55f278bd..d31924aea3 100755
> --- a/git-stash.sh
> +++ b/git-stash.sh
> @@ -310,7 +310,7 @@ push_stash () {
>  		test "$untracked" = "all" && CLEAN_X_OPTION=-x || CLEAN_X_OPTION=
>  		if test -n "$untracked" && test $# = 0
>  		then
> -			git clean --force --quiet -d $CLEAN_X_OPTION -- "$@"
> +			git clean --force --quiet -d $CLEAN_X_OPTION
>  		fi
>  
>  		if test $# != 0

^ permalink raw reply	[flat|nested] 33+ messages in thread

end of thread, other threads:[~2018-03-21 22:07 UTC | newest]

Thread overview: 33+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-03-03  9:44 git stash push -u always warns "pathspec '...' did not match any files" Marc Strapetz
2018-03-03 15:46 ` Thomas Gummerer
2018-03-04 10:44   ` Marc Strapetz
2018-03-09 22:18     ` Junio C Hamano
2018-03-10  9:18       ` Marc Strapetz
2018-03-10 11:12         ` Thomas Gummerer
2018-03-14 21:46           ` [PATCH v2 1/2] stash push: avoid printing errors Thomas Gummerer
2018-03-14 21:46             ` [PATCH v2 2/2] stash push -u: don't create empty stash Thomas Gummerer
2018-03-15 20:09               ` Junio C Hamano
2018-03-16 20:10                 ` Thomas Gummerer
2018-03-15  8:51             ` [PATCH v2 1/2] stash push: avoid printing errors Marc Strapetz
2018-03-16 20:12               ` Thomas Gummerer
2018-03-16 20:43             ` [PATCH v3 0/2] stash push -u -- <pathspec> fixes Thomas Gummerer
2018-03-16 20:43               ` [PATCH v3 1/2] stash push: avoid printing errors Thomas Gummerer
2018-03-16 21:31                 ` Junio C Hamano
2018-03-16 20:43               ` [PATCH v3 2/2] stash push -u: don't create empty stash Thomas Gummerer
2018-03-16 22:37               ` [PATCH v4 0/3] stash push -u -- <pathspec> fixes Junio C Hamano
2018-03-16 22:37                 ` [PATCH v4 1/3] stash: fix nonsense pipeline Junio C Hamano
2018-03-16 22:37                 ` [PATCH v4 2/3] stash push: avoid printing errors Junio C Hamano
2018-03-16 22:37                 ` [PATCH v4 3/3] stash push -u: don't create empty stash Junio C Hamano
2018-03-17 11:36                 ` [PATCH v4 0/3] stash push -u -- <pathspec> fixes Thomas Gummerer
2018-03-19 23:21                 ` [PATCH v5 " Thomas Gummerer
2018-03-19 23:21                   ` [PATCH v5 1/3] stash: fix nonsense pipeline Thomas Gummerer
2018-03-19 23:21                   ` [PATCH v5 2/3] stash push: avoid printing errors Thomas Gummerer
2018-03-20 16:54                     ` Junio C Hamano
2018-03-21 21:36                       ` Thomas Gummerer
2018-03-21 21:53                         ` [PATCH] stash: drop superfluos pathspec parameter (was: Re: [PATCH v5 2/3] stash push: avoid printing errors) Thomas Gummerer
2018-03-21 22:07                           ` [PATCH] stash: drop superfluos pathspec parameter Junio C Hamano
2018-03-21 21:56                         ` [PATCH v5 2/3] stash push: avoid printing errors Junio C Hamano
2018-03-19 23:21                   ` [PATCH v5 3/3] stash push -u: don't create empty stash Thomas Gummerer
2018-03-20 10:06                   ` [PATCH v5 0/3] stash push -u -- <pathspec> fixes Marc Strapetz
2018-03-19 15:44               ` [PATCH v3 0/2] " Marc Strapetz
2018-03-19 21:51                 ` Thomas Gummerer

Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

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 read-only IMAP folder(s) and NNTP newsgroup(s).