git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Junio C Hamano <gitster@pobox.com>
To: Thomas Gummerer <t.gummerer@gmail.com>
Cc: git@vger.kernel.org, "Stephan Beyer" <s-beyer@gmx.net>,
	"Marc Strapetz" <marc.strapetz@syntevo.com>,
	"Jeff King" <peff@peff.net>,
	"Johannes Schindelin" <Johannes.Schindelin@gmx.de>,
	"Øyvind A. Holm" <sunny@sunbase.org>,
	"Jakub Narębski" <jnareb@gmail.com>
Subject: Re: [PATCH v2 4/4] stash: support filename argument
Date: Mon, 30 Jan 2017 13:11:02 -0800	[thread overview]
Message-ID: <xmqqa8a8uuc9.fsf@gitster.mtv.corp.google.com> (raw)
In-Reply-To: <20170129201604.30445-5-t.gummerer@gmail.com> (Thomas Gummerer's message of "Sun, 29 Jan 2017 20:16:04 +0000")

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

> Add an optional filename argument to git stash push, which allows for
> stashing a single (or multiple) files.

You can give pathspec with one or more elements, so "an optional
argument" sounds too limiting.  

    Allow 'git stash push' to take pathspec to specify which paths
    to stash.

Also retitle

	stash: teach 'push' (and 'create') to honor pathspec

or something.

> @@ -56,6 +61,10 @@ save [-p|--patch] [-k|--[no-]keep-index] [-u|--include-untracked] [-a|--all] [-q
>  	only <message> does not trigger this action to prevent a misspelled
>  	subcommand from making an unwanted stash.
>  +
> +If the paths argument is given in 'git stash push', only these files
> +are put in the new 'stash'.  In addition only the indicated files are
> +changed in the working tree to match the index.

Actually the stash contains "all paths".  You could say that you are
placing _modifications_ to these paths in stash, even though that is
not how Git's world model works (i.e. everything is a snapshot, and
modifications are merely difference between two successive
snapshots).  A technically correct version may be:

	When pathspec is given to 'git stash push', the new stash
	records the modified states only for the files that match
	the pathspec.  The index entries and working tree files are
	then rolled back to the state in HEAD only for these files,
	too, leaving files that do not match the pathspec intact.

> diff --git a/git-stash.sh b/git-stash.sh
> index 5f08b43967..0072a38b4c 100755
> --- a/git-stash.sh
> +++ b/git-stash.sh
> @@ -41,7 +41,7 @@ no_changes () {
>  untracked_files () {
>  	excl_opt=--exclude-standard
>  	test "$untracked" = "all" && excl_opt=
> -	git ls-files -o -z $excl_opt
> +	git ls-files -o -z $excl_opt -- $1

Hmph, why "$1" is spelled without dq, implying that it is split at
$IFS boundary?  This line alone makes me suspect that this is not
prepared to deal correctly with $IFS.  Let's read on...

> @@ -59,6 +59,7 @@ create_stash () {
>  	stash_msg=
>  	untracked=
>  	new_style=
> +	files=
>  	while test $# != 0
>  	do
>  		case "$1" in
> @@ -72,6 +73,12 @@ create_stash () {
>  			untracked="$1"
>  			new_style=t
>  			;;
> +		--)
> +			shift
> +			files="$@"

Isn't this the same as writing files="$*", i.e. concatenate the
multiple arguments with the first whitespace in $IFS in between?

> @@ -134,7 +141,7 @@ create_stash () {
>  		# Untracked files are stored by themselves in a parentless commit, for
>  		# ease of unpacking later.
>  		u_commit=$(
> -			untracked_files | (
> +			untracked_files $files | (

... and this lets it split at $IFS again when passing it down to the
helper.  But the helper looks only at $1 so the second and subsequent
ones will be ignored altogether.

This cannot be correct, and any hunk in the remainder of the patch
that mentions $files will be incorrect for the same reason.

Is it possible to carry what the caller (and the end user) gave you
in "$@" without molesting it at all?  That would mean you do not
need to introduce $files variable at all, and then the places that
do things like this:

> -	create_stash -m "$stash_msg" -u "$untracked"
> +	create_stash -m "$stash_msg" -u "$untracked" -- $files

can instead do

	create_stash -m "$stash_msg" -u "$untracked" -- "$@"

That would allow you to work correctly with pathspec with $IFS
whitespaces in them.

  reply	other threads:[~2017-01-30 21:11 UTC|newest]

Thread overview: 57+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-01-21 20:08 [PATCH 0/3] stash: support filename argument Thomas Gummerer
2017-01-21 20:08 ` [PATCH 1/3] Documentation/stash: remove mention of git reset --hard Thomas Gummerer
2017-01-22  1:27   ` Øyvind A. Holm
2017-01-24 19:51   ` Jakub Narębski
2017-01-24 20:14   ` Jeff King
2017-01-25 13:02     ` Jakub Narębski
2017-01-25 21:20       ` Junio C Hamano
2017-01-25 21:20     ` Junio C Hamano
2017-01-28 19:30       ` Thomas Gummerer
2017-01-28 23:54         ` Jeff King
2017-01-21 20:08 ` [PATCH 2/3] stash: introduce push verb Thomas Gummerer
2017-01-23 18:27   ` Junio C Hamano
2017-01-29 12:39     ` Thomas Gummerer
2017-01-21 20:08 ` [PATCH 3/3] stash: support filename argument Thomas Gummerer
2017-01-23 18:50   ` Junio C Hamano
2017-01-29 13:29     ` Thomas Gummerer
2017-01-24 10:56 ` [PATCH 0/3] " Johannes Schindelin
2017-01-29 20:16 ` [PATCH v2 0/4] stash: create " Thomas Gummerer
2017-01-29 20:16   ` [PATCH v2 1/4] Documentation/stash: remove mention of git reset --hard Thomas Gummerer
2017-01-30 21:13     ` Junio C Hamano
2017-02-05 12:13       ` Thomas Gummerer
2017-01-29 20:16   ` [PATCH v2 2/4] stash: introduce push verb Thomas Gummerer
2017-01-30 21:12     ` Junio C Hamano
     [not found]     ` <xmqqy3xsux4g.fsf@gitster.mtv.corp.google.com>
2017-02-04 12:19       ` Thomas Gummerer
2017-01-29 20:16   ` [PATCH v2 3/4] introduce new format for git stash create Thomas Gummerer
2017-01-30 21:10     ` Junio C Hamano
     [not found]     ` <xmqqtw8guwfm.fsf@gitster.mtv.corp.google.com>
2017-02-04 13:18       ` Thomas Gummerer
2017-01-29 20:16   ` [PATCH v2 4/4] stash: support filename argument Thomas Gummerer
2017-01-30 21:11     ` Junio C Hamano [this message]
2017-02-05 11:02       ` Thomas Gummerer
2017-02-05 20:26   ` [PATCH v3 0/5] stash: support pathspec argument Thomas Gummerer
2017-02-05 20:26     ` [PATCH v3 1/5] Documentation/stash: remove mention of git reset --hard Thomas Gummerer
2017-02-06 15:22       ` Jeff King
2017-02-05 20:26     ` [PATCH v3 2/5] stash: introduce push verb Thomas Gummerer
2017-02-06 15:46       ` Jeff King
2017-02-11 13:33         ` Thomas Gummerer
     [not found]       ` <vpqlgtaz09q.fsf@anie.imag.fr>
2017-02-13 22:16         ` Thomas Gummerer
2017-02-05 20:26     ` [PATCH v3 3/5] stash: add test for the create command line arguments Thomas Gummerer
2017-02-06 15:50       ` Jeff King
2017-02-11 13:55         ` Thomas Gummerer
2017-02-05 20:26     ` [PATCH v3 4/5] stash: introduce new format create Thomas Gummerer
2017-02-06 15:56       ` Jeff King
2017-02-11 14:51         ` Thomas Gummerer
2017-02-13 21:57           ` Jeff King
2017-02-13 23:05             ` Jeff King
2017-02-14 21:30               ` Thomas Gummerer
2017-02-05 20:26     ` [PATCH v3 5/5] stash: teach 'push' (and 'create') to honor pathspec Thomas Gummerer
     [not found]       ` <xmqqmvdz3ied.fsf@gitster.mtv.corp.google.com>
2017-02-06 15:20         ` Jeff King
2017-02-11 16:50         ` Thomas Gummerer
2017-02-06 16:14     ` [PATCH v3 0/5] stash: support pathspec argument Jeff King
2017-02-12 19:30       ` Thomas Gummerer
     [not found]         ` <vpq7f4uxjmo.fsf@anie.imag.fr>
2017-02-13 20:09           ` Jeff King
     [not found]             ` <vpqo9y5lqos.fsf@anie.imag.fr>
2017-02-13 21:45               ` Jeff King
2017-02-13 22:33                 ` Thomas Gummerer
     [not found]                   ` <xmqqwpctabvw.fsf@gitster.mtv.corp.google.com>
2017-02-14  0:27                     ` Jeff King
     [not found]                       ` <xmqqpoila9rt.fsf@gitster.mtv.corp.google.com>
2017-02-14  0:37                         ` Jeff King
     [not found]                   ` <vpq60kdjl63.fsf@anie.imag.fr>
2017-02-14 21:36                     ` Thomas Gummerer

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

  List information: http://vger.kernel.org/majordomo-info.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=xmqqa8a8uuc9.fsf@gitster.mtv.corp.google.com \
    --to=gitster@pobox.com \
    --cc=Johannes.Schindelin@gmx.de \
    --cc=git@vger.kernel.org \
    --cc=jnareb@gmail.com \
    --cc=marc.strapetz@syntevo.com \
    --cc=peff@peff.net \
    --cc=s-beyer@gmx.net \
    --cc=sunny@sunbase.org \
    --cc=t.gummerer@gmail.com \
    /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.
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).