git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Junio C Hamano <gitster@pobox.com>
To: Johannes Sixt <j6t@kdbg.org>
Cc: git@vger.kernel.org
Subject: Re: [PATCH 2/3] mergetool: dissect strings with shell variable magic instead of `expr`
Date: Mon, 10 Jun 2019 10:17:41 -0700	[thread overview]
Message-ID: <xmqqblz5nyve.fsf@gitster-ct.c.googlers.com> (raw)
In-Reply-To: <2a33ca20af41d68a5bb4e2cf1e5ae32fddf2796c.1560152205.git.j6t@kdbg.org> (Johannes Sixt's message of "Mon, 10 Jun 2019 10:58:59 +0200")

Johannes Sixt <j6t@kdbg.org> writes:

> git-mergetool spawns an enormous amount of processes. For this reason,
> the test script, t7610, is exceptionally slow, in particular, on
> Windows. Most of the processes are invocations of git, but there are
> also some that can be replaced with shell builtins. Do so with `expr`.

I see these as improvements independent of whatever test may or may
not be slow ;-)  s/^.*/but there are/There are/.  Thanks for working
on it.

>  checkout_staged_file () {
> -	tmpfile=$(expr \
> -		"$(git checkout-index --temp --stage="$1" "$2" 2>/dev/null)" \
> -		: '\([^	]*\)	')

So this wants to grab leading non-HT substring that comes before an
HT; we are trying to grab the name of the temorary picked by the
checkout-index command, the output is ".merge_file_XXXXXX" followed
by HT followed by the original filename "$2".

> +	tmpfile="$(git checkout-index --temp --stage="$1" "$2" 2>/dev/null)" &&
> +	tmpfile=${tmpfile%%'	'*}

And this obviously is an equivalent, at least in the successful
case.  The ".merge_file_XXXXXX" temporary filename never has HT in
it, and we are stripping everything after the first HT.

And this rewrite makes the error behaviour much better.  In the
original, the exit code checked in the next "if test $? -eq 0" is
that of "expr" (i.e. does the pattern match?); with this version, we
are looking at the exit status of the checkout-index command.

Good.

> @@ -255,13 +254,16 @@ merge_file () {
>  		return 1
>  	fi
>  
> -	if BASE=$(expr "$MERGED" : '\(.*\)\.[^/]*$')
> -	then
> -		ext=$(expr "$MERGED" : '.*\(\.[^/]*\)$')
> -	else
> +	# extract file extension from the last path component
> +	case "${MERGED##*/}" in
> +	*.*)
> +		ext=.${MERGED##*.}
> +		BASE=${MERGED%"$ext"}

This rewrite can potentially change the behaviour, when $ext has
glob metacharacters.  Wouldn't BASE=${MERGED%.*} be more faithful
conversion?

> +		;;
> +	*)
>  		BASE=$MERGED
>  		ext=
> -	fi
> +	esac
> @@ -406,7 +408,7 @@ main () {
>  		-t|--tool*)
>  			case "$#,$1" in
>  			*,*=*)
> -				merge_tool=$(expr "z$1" : 'z-[^=]*=\(.*\)')
> +				merge_tool=${1#*=}

OK, we strip leading substring before the first '=' out of "$1" and
the case/esac ensures that there is such an equal '=' sign in "$1",
so the rewrite is correct.

Looks good.  Thanks.



  reply	other threads:[~2019-06-10 17:17 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-06-10  8:58 [PATCH 0/3] Reduce number of processes spawned by git-mergetool Johannes Sixt
2019-06-10  8:58 ` [PATCH 1/3] t7610-mergetool: do not place pipelines headed by `yes` in subshells Johannes Sixt
2019-06-10  9:59   ` SZEDER Gábor
2019-06-10 17:23     ` Junio C Hamano
2019-06-10 17:56       ` SZEDER Gábor
2019-06-10 18:29     ` Johannes Schindelin
2019-06-10 18:57       ` SZEDER Gábor
2019-06-10  8:58 ` [PATCH 2/3] mergetool: dissect strings with shell variable magic instead of `expr` Johannes Sixt
2019-06-10 17:17   ` Junio C Hamano [this message]
2019-06-10 21:34     ` Johannes Sixt
2019-06-10  8:59 ` [PATCH 3/3] mergetool: use shell variable magic instead of `awk` Johannes Sixt
2019-06-10 17:21   ` Junio C Hamano
2019-06-10 22:01     ` Johannes Sixt
2019-06-12 16:33 ` [PATCH v2 0/4] Reduce number of processes spawned by git-mergetool Johannes Sixt
2019-06-12 16:33   ` [PATCH v2 1/4] t7610-mergetool: do not place pipelines headed by `yes` in subshells Johannes Sixt
2019-06-12 16:33   ` [PATCH v2 2/4] t7610-mergetool: use test_cmp instead of test $(cat file) = $txt Johannes Sixt
2019-06-12 16:33   ` [PATCH v2 3/4] mergetool: dissect strings with shell variable magic instead of `expr` Johannes Sixt
2019-06-12 16:33   ` [PATCH v2 4/4] mergetool: use shell variable magic instead of `awk` Johannes Sixt

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=xmqqblz5nyve.fsf@gitster-ct.c.googlers.com \
    --to=gitster@pobox.com \
    --cc=git@vger.kernel.org \
    --cc=j6t@kdbg.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).