Re: [PATCH] scripts/setlocalversion: Improve -dirty check with git-status --no-optional-locks

From: Alexander Kapshuk
Date: Sun Nov 11 2018 - 09:48:59 EST


On Sat, Nov 10, 2018 at 10:12 PM Genki Sky <sky@xxxxxxxx> wrote:
>
> Hi Andreas,
>
> On Sat, 10 Nov 2018 11:42:11 +0100, Andreas Schwab <schwab@xxxxxxxxxxxxxx> wrote:
> > On Nov 10 2018, Genki Sky <sky@xxxxxxxx> wrote:
> > > On Fri, 9 Nov 2018 10:34:37 -0800, Brian Norris <briannorris@xxxxxxxxxxxx> wrote:
> > >> + git_status="$(git --no-optional-locks status -uno --porcelain 2>/dev/null)"
> > >> + if [ $? -eq 0 ]; then
> > >> + if echo "$git_status" | grep -qv '^.. scripts/package'; then
> > >
> > > Shouldn't this be:
> > >
> > > if printf '%s' "$git_status" | grep -qv '^.. scripts/package'; then
> > >
> > > I.e., use printf not echo? Because of echo introducing a newline.
> >
> > The input to grep should be a text file, thus should end with a newline.
>
> Ah okay, thanks. I guess GNU grep was being lenient. Well then, I
> think the line at least needs to be changed to:
>
> if [ -n "$git_status" ] && echo "$git_status" | grep -qv '^.. scripts/package'; then
>
> I'm just trying to say that in the proposed patch, if git doesn't
> print anything, the echo adds a newline that wasn't there before. This
> causes the grep -qv to exit with status 0 (because there's at least
> one line that doesn't contain '^.. scripts/package'). Meaning it will
> print dirty.

Piping the output of the git command to grep and using the return status
of grep as the test condition within the if block, would be sufficient
to determine whether or not '-dirty' should be printed.

Sample run:
% if git --no-optional-locks \
status -uno --porcelain \
2>/dev/null |
grep -qv '^.. scripts/package'
then
printf '%s' -dirty
fi
%