Skip to content
  • Jonathan Nieder's avatar
    remove #!interpreter line from shell libraries · 11d62145
    Jonathan Nieder authored and Junio C Hamano's avatar Junio C Hamano committed
    
    
    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: default avatarJonathan Nieder <jrnieder@gmail.com>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    11d62145