All of lore.kernel.org
 help / color / mirror / Atom feed
From: Junio C Hamano <gitster@pobox.com>
To: Pasha Bolokhov <pasha.bolokhov@gmail.com>
Cc: git@vger.kernel.org, pclouds@gmail.com, peff@peff.net
Subject: Re: [PATCH alt-v2] Improve function dir.c:trim_trailing_spaces()
Date: Mon, 02 Jun 2014 13:23:41 -0700	[thread overview]
Message-ID: <xmqqha433vsi.fsf@gitster.dls.corp.google.com> (raw)
In-Reply-To: <1401727551-8871-1-git-send-email-pasha.bolokhov@gmail.com> (Pasha Bolokhov's message of "Mon, 2 Jun 2014 09:45:51 -0700")

Pasha Bolokhov <pasha.bolokhov@gmail.com> writes:

> Discard the unnecessary 'nr_spaces' variable, remove 'strlen()' and
> improve the 'if' structure. Switch to pointers instead of integers
>
> Slightly more rare occurrences of 'text  \    ' with a backslash
> in between spaces are handled correctly. Namely, the code in
> 8ba87adad6 does not reset 'last_space' when a backslash is
> encountered and the above line stays intact as a result.
> Add a test at the end of t/t0008-ignores.sh to exhibit this behavior
>
> Signed-off-by: Pasha Bolokhov <pasha.bolokhov@gmail.com>
> ---
> After correcting for the trailing backslash 'text\', a switch()
> structure gives better readability than nested 'ifs', the way I see it.
> Add a test to show that the trailing backslash 'text\' is handled
> correctly
>
>  dir.c              | 35 ++++++++++++++++++++---------------
>  t/t0008-ignores.sh | 23 +++++++++++++++++++++++
>  2 files changed, 43 insertions(+), 15 deletions(-)
>
> diff --git a/dir.c b/dir.c
> index eb6f581..06483d4 100644
> --- a/dir.c
> +++ b/dir.c
> @@ -508,21 +508,26 @@ void clear_exclude_list(struct exclude_list *el)
>  
>  static void trim_trailing_spaces(char *buf)
>  {
> -	int i, last_space = -1, nr_spaces, len = strlen(buf);
> -	for (i = 0; i < len; i++)
> -		if (buf[i] == '\\')
> -			i++;
> -		else if (buf[i] == ' ') {
> -			if (last_space == -1) {
> -				last_space = i;
> -				nr_spaces = 1;
> -			} else
> -				nr_spaces++;
> -		} else
> -			last_space = -1;
> -
> -	if (last_space != -1 && last_space + nr_spaces == len)
> -		buf[last_space] = '\0';
> +	char *p, *last_space = NULL;
> +
> +	for (p = buf; *p; p++)
> +		switch (*p) {
> +		case ' ':
> +			if (!last_space)
> +				last_space = p;
> +			break;
> +
> +		case '\\':
> +			p++;
> +			if (!*p)
> +				return;
> +

Write

			/* fallthru */

here.

> +		default:
> +			last_space = NULL;
> +		}
> +
> +	if (last_space)
> +		*last_space = '\0';
>  }

I think the loop structure is a lot simpler to follow (with or
without switch/case) with this change.  Good.

>  int add_excludes_from_file_to_list(const char *fname,
> diff --git a/t/t0008-ignores.sh b/t/t0008-ignores.sh
> index 63beb99..4cea858 100755
> --- a/t/t0008-ignores.sh
> +++ b/t/t0008-ignores.sh
> @@ -806,4 +806,27 @@ test_expect_success !MINGW 'quoting allows trailing whitespace' '
>  	test_cmp err.expect err
>  '
>  
> +test_expect_success NOT_MINGW,NOT_CYGWIN 'correct handling of backslashes' '
> +	rm -rf whitespace &&
> +	mkdir whitespace &&
> +	>"whitespace/trailing 1  "	&&
> +	>"whitespace/trailing 2 \\\\"	&&
> +	>"whitespace/trailing 3 \\\\"	&&
> +	>"whitespace/trailing 4   \\ "	&&
> +	>"whitespace/trailing 5 \\ \\ "	&&
> +	>"whitespace/trailing 6 \\a\\"	&&

Don't be cute and try to align with tabs.

> +	>whitespace/untracked &&
> +	echo "whitespace/trailing 1 \\    "			>ignore  &&
> +	echo "whitespace/trailing 2 \\\\\\\\\\\\\\\\"		>>ignore &&
> +	echo "whitespace/trailing 3 \\\\\\\\\\\\\\\\ "		>>ignore &&
> +	echo "whitespace/trailing 4   \\\\\\\\\\\\    "		>>ignore &&
> +	echo "whitespace/trailing 5 \\\\\\\\ \\\\\\\\\\\\   "	>>ignore &&
> +	echo "whitespace/trailing 6 \\\\\\\\a\\\\\\\\"		>>ignore &&
> +	echo whitespace/untracked >expect &&
> +	: >err.expect &&

Other file truncation is done with ">whitespace/filename" without an
explicit ":" aka no-op command; I know this was copied from a
previous test but perhaps we want to be consistent?

> +	git ls-files -o -X ignore whitespace >actual 2>err &&
> +	test_cmp expect actual &&
> +	test_cmp err.expect err
> +'
> +
>  test_done

      reply	other threads:[~2014-06-02 20:23 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-06-02 16:45 [PATCH alt-v2] Improve function dir.c:trim_trailing_spaces() Pasha Bolokhov
2014-06-02 20:23 ` Junio C Hamano [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

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

  git send-email \
    --in-reply-to=xmqqha433vsi.fsf@gitster.dls.corp.google.com \
    --to=gitster@pobox.com \
    --cc=git@vger.kernel.org \
    --cc=pasha.bolokhov@gmail.com \
    --cc=pclouds@gmail.com \
    --cc=peff@peff.net \
    /path/to/YOUR_REPLY

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

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.