Re: [PATCH 10/10] git-submodule.sh: don't use the -a or -b option with the test command

2014-05-16 Thread Junio C Hamano
Jonathan Nieder jrnie...@gmail.com writes:

 Perhaps something like the following would work?

   tree-wide: convert test -a/-o to  and ||

   The interaction with unary operators and operator precedence
   for  and || are better known than -a and -o, and for that
   reason we prefer them.  Replace all existing instances in git
   of -a and -o to save readers from the burden of thinking
   about such things.

   Add a check-non-portable-shell.pl to avoid more instances of
   test -a and -o arising in the future.

Yeah, the title is certainly better than -a or -b option I see
above ;-) and a single tree-wide fix may be OK while the tree is
quiescent.

I however do think better known is much less of an issue than that
-a/-o is more error prone e.g. 'test -n $x -a a = b' is buggy
because it does not consider that $x could be =.



 [...]
 -test $status = D -o $status = T  echo $sm_path  
 continue
 + ( test $status = D || test $status = T )  echo 
 $sm_path  continue

 There's no need for a subshell for this.  Better to use a block:

   {
   test $status = D ||
   test $status = T
   } 
   echo $sm_path 
   continue

Yes.
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 10/10] git-submodule.sh: don't use the -a or -b option with the test command

2014-05-15 Thread Elia Pinto
I am very sorry : the comment is wrong. I will repost shortly.

Best regards

2014-05-15 16:17 GMT+02:00 Elia Pinto gitter.spi...@gmail.com:
 Even though POSIX.1 lists -a/-o as options to test, they are
 marked Obsolescent XSI. Scripts using these expressions
 should be converted  as follow:

 test $1 -a $2

 should be written as:

 test $1  test $2

 Likewise

 test $1 -o $2

 should be written as:

 test $1  test $2

 But note that, in test, -a has higher precedence than -o while
  and || have equal precedence in the shell.

 The reason for this is that the precedence rules were never well
 specified, and this made many sane-looking uses of test -a/-o problematic.

 For example, if $x is =, these work according to POSIX (it's not
 portable, but in practice it's okay):

$ test -z $x
$ test -z $x  test a = b

 but this doesn't

$ test -z $x -a a = b
bash: test: too many arguments

 because it groups test -n = -a and is left with a = b.

 Similarly, if $x is -f, these

$ test $x
$ test $x || test c = d

 correctly adds an implicit -n, but this fails:

$ test $x -o c = d
bash: test: too many arguments

 Signed-off-by: Elia Pinto gitter.spi...@gmail.com
 ---
 Inspired from this discussion 
 http://permalink.gmane.org/gmane.comp.version-control.git/137056

  git-submodule.sh |   14 +++---
  1 file changed, 7 insertions(+), 7 deletions(-)

 diff --git a/git-submodule.sh b/git-submodule.sh
 index b55d83a..d89e1d0 100755
 --- a/git-submodule.sh
 +++ b/git-submodule.sh
 @@ -864,7 +864,7 @@ Maybe you want to use 'update --init'?)
 then
 subforce=$force
 # If we don't already have a -f flag and the 
 submodule has never been checked out
 -   if test -z $subsha1 -a -z $force
 +   if test -z $subsha1 || test -z $force
 then
 subforce=-f
 fi
 @@ -1059,13 +1059,13 @@ cmd_summary() {
 while read mod_src mod_dst sha1_src sha1_dst status sm_path
 do
 # Always show modules deleted or type-changed 
 (blob-module)
 -   test $status = D -o $status = T  echo $sm_path  
 continue
 +( test $status = D || test $status = T )  echo 
 $sm_path  continue
 # Respect the ignore setting for --for-status.
 if test -n $for_status
 then
 name=$(module_name $sm_path)
 ignore_config=$(get_submodule_config $name 
 ignore none)
 -   test $status != A -a $ignore_config = all  
 continue
 +   test $status != A  test $ignore_config = 
 all  continue
 fi
 # Also show added or modified modules which are 
 checked out
 GIT_DIR=$sm_path/.git git-rev-parse --git-dir 
 /dev/null 21 
 @@ -1125,7 +1125,7 @@ cmd_summary() {
 *)
 errmsg=
 total_commits=$(
 -   if test $mod_src = 16 -a $mod_dst = 16
 +   if test $mod_src = 16  test $mod_dst = 16
 then
 range=$sha1_src...$sha1_dst
 elif test $mod_src = 16
 @@ -1162,7 +1162,7 @@ cmd_summary() {
 # i.e. deleted or changed to blob
 test $mod_dst = 16  echo $errmsg
 else
 -   if test $mod_src = 16 -a $mod_dst = 16
 +   if test $mod_src = 16  test $mod_dst = 16
 then
 limit=
 test $summary_limit -gt 0  
 limit=-$summary_limit
 @@ -1233,7 +1233,7 @@ cmd_status()
 say U$sha1 $displaypath
 continue
 fi
 -   if test -z $url || ! test -d $sm_path/.git -o -f 
 $sm_path/.git
 +   if test -z $url || ! test -d $sm_path/.git || test -f 
 $sm_path/.git
 then
 say -$sha1 $displaypath
 continue;
 @@ -1402,7 +1402,7 @@ then
  fi

  # --cached is accepted only by status and summary
 -if test -n $cached  test $command != status -a $command != summary
 +if test -n $cached  test $command != status  test $command != 
 summary
  then
 usage
  fi
 --
 1.7.10.4

--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 10/10] git-submodule.sh: don't use the -a or -b option with the test command

2014-05-15 Thread Jonathan Nieder
Elia Pinto wrote:

 Even though POSIX.1 lists -a/-o as options to test, they are
 marked Obsolescent XSI. Scripts using these expressions
 should be converted  as follow:
[... many lines snipped ...]

This is a very long description, and it doesn't leave me excited by
the change.

Is there some potential bug this prevents, or is it just a style
fix?  If the latter, do we have a way of checking for new examples
of the same thing to avoid having to repeat the same patch again in
the future?

Are there any platforms that were broken which this fixes?  Even
posh seems to understand -a and -o.

Nowadays Documentation/CodingGuidelines says

 - Fixing style violations while working on a real change as a
   preparatory clean-up step is good, but otherwise avoid useless code
   churn for the sake of conforming to the style.

   Once it _is_ in the tree, it's not really worth the patch noise to
   go and fix it up.
   Cf. http://article.gmane.org/gmane.linux.kernel/943020

which I think goes too far (some patterns really are error prone
or distracting and it can be worth fixing them tree-wide), but it
makes a reasonable case that an idiom not being preferred in the
style guide is not *on its own* enough reason to change it.

Perhaps something like the following would work?

tree-wide: convert test -a/-o to  and ||

The interaction with unary operators and operator precedence
for  and || are better known than -a and -o, and for that
reason we prefer them.  Replace all existing instances in git
of -a and -o to save readers from the burden of thinking
about such things.

Add a check-non-portable-shell.pl to avoid more instances of
test -a and -o arising in the future.

[...]
 - test $status = D -o $status = T  echo $sm_path  
 continue
 +  ( test $status = D || test $status = T )  echo 
 $sm_path  continue

There's no need for a subshell for this.  Better to use a block:

{
test $status = D ||
test $status = T
} 
echo $sm_path 
continue

or an if statement:

if test $status = D || test $status = T
then
echo $sm_path
continue
fi

or case:

case $status in
D|T)
echo $sm_path
continue
;;
esac

Hope that helps,
Jonathan
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html