remove #!interpreter line from shell libraries
authorJonathan Nieder <jrnieder@gmail.com>
Mon, 25 Nov 2013 21:03:52 +0000 (13:03 -0800)
committerJunio C Hamano <gitster@pobox.com>
Tue, 26 Nov 2013 22:23:56 +0000 (14:23 -0800)
commit11d62145b904b81013d1ad558d68a74e22e81a91
treea003885d1479a00f31bfbb44c090b6f7528cfadb
parentc74c72034f061d1d9d5b8b1fba20ce0138d423b4
remove #!interpreter line from shell libraries

In a shell snippet meant to be sourced by other shell scripts, an
opening #! line does more harm than good.

The harm:

 - When the shell library is sourced, the interpreter and options from
   the #! line are not used.  Specifying a particular shell can
   confuse the reader into thinking it is safe for the shell library
   to rely on idiosyncrasies of that shell.

 - Using #! instead of a plain comment drops a helpful visual clue
   that this is a shell library and not a self-contained script.

 - Tools such as lintian can use a #! line to tell when an
   installation script has failed by forgetting to set a script
   executable.  This check does not work if shell libraries also start
   with a #! line.

The good:

 - Text editors notice the #! line and use it for syntax highlighting
   if you try to edit the installed scripts (without ".sh" suffix) in
   place.

The use of the #! for file type detection is not needed because Git's
shell libraries are meant to be edited in source form (with ".sh"
suffix).  Replace the opening #! lines with comments.

This involves tweaking the test harness's valgrind support to find
shell libraries by looking for "# " in the first line instead of "#!"
(see v1.7.6-rc3~7, 2011-06-17).

Suggested by Russ Allbery through lintian.  Thanks to Jeff King and
Clemens Buchacher for further analysis.

Tested by searching for non-executable scripts with #! line:

find . -name .git -prune -o -type f -not -executable |
while read file
do
read line <"$file"
case $line in
'#!'*)
echo "$file"
;;
esac
done

The only remaining scripts found are templates for shell scripts
(unimplemented.sh, wrap-for-bin.sh) and sample input used in tests
(t/t4034/perl/{pre,post}).

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
contrib/completion/git-completion.bash
contrib/completion/git-completion.tcsh
git-mergetool--lib.sh
git-parse-remote.sh
git-rebase--am.sh
git-rebase--interactive.sh
git-rebase--merge.sh
git-sh-i18n.sh
git-sh-setup.sh
t/test-lib.sh