git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/9] War on #! lines in shell libraries
@ 2013-11-25 20:51 Jonathan Nieder
  2013-11-25 20:52 ` [PATCH 1/9] mark Windows build scripts executable Jonathan Nieder
                   ` (8 more replies)
  0 siblings, 9 replies; 13+ messages in thread
From: Jonathan Nieder @ 2013-11-25 20:51 UTC (permalink / raw)
  To: git; +Cc: Paul Mackerras, Pat Thoyts, Clemens Buchacher, Marc Branchaud

Hi,

This is an old series that I just wanted to flush out of my working
directory.  It does two things:

On one hand, it replaces the line

	#!/bin/sh

at the start of shell libraries with a simple comment

	# Shell library for <etc, explaining how it is used>

to avoid confusing readers into thinking the shell library is going to
be run directly with /bin/sh.  And on the other hand, it sets the
executable bit on actual scripts that are run directly with /bin/sh.
(Likewise for some perl scripts, too.)

The heart of the series has been well tested in the context of Debian
git for a couple of years.  Thanks to list denizens for the
improvements last time I brought it up[1].  Hopefully this version is
more sensible.

Anyway, hopefully it can provide some amusement.

Thanks,
Jonathan Nieder (9):
  mark Windows build scripts executable
  mark perl test scripts executable
  mark contributed hooks executable
  contrib: remove git-p4import
  gitk: chmod +x po2msg
  git-gui: chmod +x po2msg, windows/git-gui.sh
  test: make FILEMODE a lazy prereq
  test: replace shebangs with descriptions in shell libraries
  remove #!interpreter line from shell libraries

[1] http://thread.gmane.org/gmane.comp.version-control.git/192582

 compat/vcbuild/scripts/clink.pl        |   0
 compat/vcbuild/scripts/lib.pl          |   0
 contrib/buildsystems/engine.pl         |   0
 contrib/buildsystems/generate          |   0
 contrib/buildsystems/parse.pl          |   0
 contrib/completion/git-completion.bash |   2 -
 contrib/completion/git-completion.tcsh |   2 -
 contrib/hooks/post-receive-email       |   1 -
 contrib/hooks/pre-auto-gc-battery      |   1 -
 contrib/hooks/setgitperms.perl         |   0
 contrib/hooks/update-paranoid          |   0
 contrib/p4import/README                |   1 -
 contrib/p4import/git-p4import.py       | 365 ---------------------------------
 contrib/p4import/git-p4import.txt      | 167 ---------------
 git-gui/po/po2msg.sh                   |   0
 git-gui/windows/git-gui.sh             |   0
 git-mergetool--lib.sh                  |   3 +-
 git-parse-remote.sh                    |   4 +-
 git-rebase--am.sh                      |   3 +-
 git-rebase--interactive.sh             |   9 +-
 git-rebase--merge.sh                   |   4 +-
 git-sh-i18n.sh                         |   5 +-
 git-sh-setup.sh                        |   9 +-
 gitk-git/po/po2msg.sh                  |   0
 t/Git-SVN/00compile.t                  |   0
 t/Git-SVN/Utils/add_path_to_url.t      |   0
 t/Git-SVN/Utils/can_compress.t         |   0
 t/Git-SVN/Utils/canonicalize_url.t     |   0
 t/Git-SVN/Utils/collapse_dotdot.t      |   0
 t/Git-SVN/Utils/fatal.t                |   0
 t/Git-SVN/Utils/join_paths.t           |   0
 t/gitweb-lib.sh                        |   3 +-
 t/lib-bash.sh                          |   7 +-
 t/lib-cvs.sh                           |   2 +-
 t/lib-diff-alternative.sh              |   3 +-
 t/lib-gettext.sh                       |   3 +-
 t/lib-git-daemon.sh                    |  18 +-
 t/lib-httpd.sh                         |  29 ++-
 t/lib-pack.sh                          |   2 -
 t/lib-pager.sh                         |   2 +-
 t/lib-prereq-FILEMODE.sh               |  11 -
 t/lib-read-tree.sh                     |   2 -
 t/lib-rebase.sh                        |   2 +-
 t/lib-terminal.sh                      |   2 +-
 t/perf/perf-lib.sh                     |   4 +-
 t/t0202/test.pl                        |   0
 t/t3701-add-interactive.sh             |   1 -
 t/t4102-apply-rename.sh                |   1 -
 t/t4120-apply-popt.sh                  |   1 -
 t/t4129-apply-samemode.sh              |   1 -
 t/t6031-merge-recursive.sh             |   1 -
 t/t9150/make-svk-dump                  |   0
 t/t9151/make-svnmerge-dump             |   0
 t/t9200-git-cvsexportcommit.sh         |   1 -
 t/test-lib-functions.sh                |   3 +-
 t/test-lib.sh                          |  12 +-
 56 files changed, 87 insertions(+), 600 deletions(-)
 mode change 100644 => 100755 compat/vcbuild/scripts/clink.pl
 mode change 100644 => 100755 compat/vcbuild/scripts/lib.pl
 mode change 100644 => 100755 contrib/buildsystems/engine.pl
 mode change 100644 => 100755 contrib/buildsystems/generate
 mode change 100644 => 100755 contrib/buildsystems/parse.pl
 mode change 100644 => 100755 contrib/hooks/pre-auto-gc-battery
 mode change 100644 => 100755 contrib/hooks/setgitperms.perl
 mode change 100644 => 100755 contrib/hooks/update-paranoid
 delete mode 100644 contrib/p4import/README
 delete mode 100644 contrib/p4import/git-p4import.py
 delete mode 100644 contrib/p4import/git-p4import.txt
 mode change 100644 => 100755 git-gui/po/po2msg.sh
 mode change 100644 => 100755 git-gui/windows/git-gui.sh
 mode change 100644 => 100755 gitk-git/po/po2msg.sh
 mode change 100644 => 100755 t/Git-SVN/00compile.t
 mode change 100644 => 100755 t/Git-SVN/Utils/add_path_to_url.t
 mode change 100644 => 100755 t/Git-SVN/Utils/can_compress.t
 mode change 100644 => 100755 t/Git-SVN/Utils/canonicalize_url.t
 mode change 100644 => 100755 t/Git-SVN/Utils/collapse_dotdot.t
 mode change 100644 => 100755 t/Git-SVN/Utils/fatal.t
 mode change 100644 => 100755 t/Git-SVN/Utils/join_paths.t
 delete mode 100644 t/lib-prereq-FILEMODE.sh
 mode change 100644 => 100755 t/t0202/test.pl
 mode change 100644 => 100755 t/t9150/make-svk-dump
 mode change 100644 => 100755 t/t9151/make-svnmerge-dump

-- 
1.8.4.1

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH 1/9] mark Windows build scripts executable
  2013-11-25 20:51 [PATCH 0/9] War on #! lines in shell libraries Jonathan Nieder
@ 2013-11-25 20:52 ` Jonathan Nieder
  2013-11-25 20:53 ` [PATCH 2/9] mark perl test " Jonathan Nieder
                   ` (7 subsequent siblings)
  8 siblings, 0 replies; 13+ messages in thread
From: Jonathan Nieder @ 2013-11-25 20:52 UTC (permalink / raw)
  To: git; +Cc: Ramsay Jones, Clemens Buchacher, Marc Branchaud

On Windows the convention is to rely on filename extensions to decide
whether a file is executable so Windows users are probably not relying
on the executable bit of these scripts, but on other platforms it can
be useful documentation.

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
 compat/vcbuild/scripts/clink.pl | 0
 compat/vcbuild/scripts/lib.pl   | 0
 contrib/buildsystems/engine.pl  | 0
 contrib/buildsystems/generate   | 0
 contrib/buildsystems/parse.pl   | 0
 5 files changed, 0 insertions(+), 0 deletions(-)
 mode change 100644 => 100755 compat/vcbuild/scripts/clink.pl
 mode change 100644 => 100755 compat/vcbuild/scripts/lib.pl
 mode change 100644 => 100755 contrib/buildsystems/engine.pl
 mode change 100644 => 100755 contrib/buildsystems/generate
 mode change 100644 => 100755 contrib/buildsystems/parse.pl

diff --git a/compat/vcbuild/scripts/clink.pl b/compat/vcbuild/scripts/clink.pl
old mode 100644
new mode 100755
diff --git a/compat/vcbuild/scripts/lib.pl b/compat/vcbuild/scripts/lib.pl
old mode 100644
new mode 100755
diff --git a/contrib/buildsystems/engine.pl b/contrib/buildsystems/engine.pl
old mode 100644
new mode 100755
diff --git a/contrib/buildsystems/generate b/contrib/buildsystems/generate
old mode 100644
new mode 100755
diff --git a/contrib/buildsystems/parse.pl b/contrib/buildsystems/parse.pl
old mode 100644
new mode 100755
-- 
1.8.4.1

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH 2/9] mark perl test scripts executable
  2013-11-25 20:51 [PATCH 0/9] War on #! lines in shell libraries Jonathan Nieder
  2013-11-25 20:52 ` [PATCH 1/9] mark Windows build scripts executable Jonathan Nieder
@ 2013-11-25 20:53 ` Jonathan Nieder
  2013-11-25 20:55 ` [PATCH 3/9] mark contributed hooks executable Jonathan Nieder
                   ` (6 subsequent siblings)
  8 siblings, 0 replies; 13+ messages in thread
From: Jonathan Nieder @ 2013-11-25 20:53 UTC (permalink / raw)
  To: git; +Cc: Michael G. Schwern, Clemens Buchacher, Marc Branchaud

These scripts are not run directly as part of a normal build, so no
one noticed that they did not have the +x bit.  Mark them executable
to make it more obvious that they can be run directly (when debugging,
for example).

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
 t/Git-SVN/00compile.t              | 0
 t/Git-SVN/Utils/add_path_to_url.t  | 0
 t/Git-SVN/Utils/can_compress.t     | 0
 t/Git-SVN/Utils/canonicalize_url.t | 0
 t/Git-SVN/Utils/collapse_dotdot.t  | 0
 t/Git-SVN/Utils/fatal.t            | 0
 t/Git-SVN/Utils/join_paths.t       | 0
 t/t0202/test.pl                    | 0
 t/t9150/make-svk-dump              | 0
 t/t9151/make-svnmerge-dump         | 0
 10 files changed, 0 insertions(+), 0 deletions(-)
 mode change 100644 => 100755 t/Git-SVN/00compile.t
 mode change 100644 => 100755 t/Git-SVN/Utils/add_path_to_url.t
 mode change 100644 => 100755 t/Git-SVN/Utils/can_compress.t
 mode change 100644 => 100755 t/Git-SVN/Utils/canonicalize_url.t
 mode change 100644 => 100755 t/Git-SVN/Utils/collapse_dotdot.t
 mode change 100644 => 100755 t/Git-SVN/Utils/fatal.t
 mode change 100644 => 100755 t/Git-SVN/Utils/join_paths.t
 mode change 100644 => 100755 t/t0202/test.pl
 mode change 100644 => 100755 t/t9150/make-svk-dump
 mode change 100644 => 100755 t/t9151/make-svnmerge-dump

diff --git a/t/Git-SVN/00compile.t b/t/Git-SVN/00compile.t
old mode 100644
new mode 100755
diff --git a/t/Git-SVN/Utils/add_path_to_url.t b/t/Git-SVN/Utils/add_path_to_url.t
old mode 100644
new mode 100755
diff --git a/t/Git-SVN/Utils/can_compress.t b/t/Git-SVN/Utils/can_compress.t
old mode 100644
new mode 100755
diff --git a/t/Git-SVN/Utils/canonicalize_url.t b/t/Git-SVN/Utils/canonicalize_url.t
old mode 100644
new mode 100755
diff --git a/t/Git-SVN/Utils/collapse_dotdot.t b/t/Git-SVN/Utils/collapse_dotdot.t
old mode 100644
new mode 100755
diff --git a/t/Git-SVN/Utils/fatal.t b/t/Git-SVN/Utils/fatal.t
old mode 100644
new mode 100755
diff --git a/t/Git-SVN/Utils/join_paths.t b/t/Git-SVN/Utils/join_paths.t
old mode 100644
new mode 100755
diff --git a/t/t0202/test.pl b/t/t0202/test.pl
old mode 100644
new mode 100755
diff --git a/t/t9150/make-svk-dump b/t/t9150/make-svk-dump
old mode 100644
new mode 100755
diff --git a/t/t9151/make-svnmerge-dump b/t/t9151/make-svnmerge-dump
old mode 100644
new mode 100755
-- 
1.8.4.1

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH 3/9] mark contributed hooks executable
  2013-11-25 20:51 [PATCH 0/9] War on #! lines in shell libraries Jonathan Nieder
  2013-11-25 20:52 ` [PATCH 1/9] mark Windows build scripts executable Jonathan Nieder
  2013-11-25 20:53 ` [PATCH 2/9] mark perl test " Jonathan Nieder
@ 2013-11-25 20:55 ` Jonathan Nieder
  2013-11-25 20:58 ` [PATCH 4/9] contrib: remove git-p4import Jonathan Nieder
                   ` (5 subsequent siblings)
  8 siblings, 0 replies; 13+ messages in thread
From: Jonathan Nieder @ 2013-11-25 20:55 UTC (permalink / raw)
  To: git; +Cc: Olivier Berger, Clemens Buchacher, Marc Branchaud

The docs in contrib/hooks/pre-auto-gc-battery suggest:

	For example, if the hook is stored in
	/usr/share/git-core/contrib/hooks/pre-auto-gc-battery:

	chmod a+x pre-auto-gc-battery
	cd /path/to/your/repository.git
	ln -sf /usr/share/git-core/contrib/hooks/pre-auto-gc-battery \
	     hooks/pre-auto-gc

Unfortunately on multi-user systems most users do not have write
access to /usr.  Better to mark the sample hooks executable in
the first place so users do not have to tweak their permissions to
use them by symlinking into .git/hooks/.

Reported-by: Olivier Berger <olivier.berger@it-sudparis.eu>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
 contrib/hooks/post-receive-email  | 1 -
 contrib/hooks/pre-auto-gc-battery | 1 -
 contrib/hooks/setgitperms.perl    | 0
 contrib/hooks/update-paranoid     | 0
 4 files changed, 2 deletions(-)
 mode change 100644 => 100755 contrib/hooks/pre-auto-gc-battery
 mode change 100644 => 100755 contrib/hooks/setgitperms.perl
 mode change 100644 => 100755 contrib/hooks/update-paranoid

diff --git a/contrib/hooks/post-receive-email b/contrib/hooks/post-receive-email
index 8ee410f..8747b84 100755
--- a/contrib/hooks/post-receive-email
+++ b/contrib/hooks/post-receive-email
@@ -22,7 +22,6 @@
 # For example, on debian the hook is stored in
 # /usr/share/git-core/contrib/hooks/post-receive-email:
 #
-#  chmod a+x post-receive-email
 #  cd /path/to/your/repository.git
 #  ln -sf /usr/share/git-core/contrib/hooks/post-receive-email hooks/post-receive
 #
diff --git a/contrib/hooks/pre-auto-gc-battery b/contrib/hooks/pre-auto-gc-battery
old mode 100644
new mode 100755
index 1f914c9..9d0c2d1
--- a/contrib/hooks/pre-auto-gc-battery
+++ b/contrib/hooks/pre-auto-gc-battery
@@ -13,7 +13,6 @@
 # For example, if the hook is stored in
 # /usr/share/git-core/contrib/hooks/pre-auto-gc-battery:
 #
-# chmod a+x pre-auto-gc-battery
 # cd /path/to/your/repository.git
 # ln -sf /usr/share/git-core/contrib/hooks/pre-auto-gc-battery \
 #	hooks/pre-auto-gc
diff --git a/contrib/hooks/setgitperms.perl b/contrib/hooks/setgitperms.perl
old mode 100644
new mode 100755
diff --git a/contrib/hooks/update-paranoid b/contrib/hooks/update-paranoid
old mode 100644
new mode 100755
-- 
1.8.4.1

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH 4/9] contrib: remove git-p4import
  2013-11-25 20:51 [PATCH 0/9] War on #! lines in shell libraries Jonathan Nieder
                   ` (2 preceding siblings ...)
  2013-11-25 20:55 ` [PATCH 3/9] mark contributed hooks executable Jonathan Nieder
@ 2013-11-25 20:58 ` Jonathan Nieder
  2013-11-26 12:31   ` Pete Wyckoff
  2013-11-25 21:00 ` [PATCH 5/9 gitk] gitk: chmod +x po2msg Jonathan Nieder
                   ` (4 subsequent siblings)
  8 siblings, 1 reply; 13+ messages in thread
From: Jonathan Nieder @ 2013-11-25 20:58 UTC (permalink / raw)
  To: git; +Cc: Pete Wyckoff, Sean Estabrooks, Clemens Buchacher, Marc Branchaud

The git p4import documentation has suggested git p4 as a better
alternative for more than 6 years.  (According to the mailing list
discussion when it was moved to contrib/, git-p4import has serious
bugs --- e.g., its incremental mode just doesn't work.) Since then,
git p4 has been actively developed and was promoted to a standard git
command alongside git svn.

Searches on google.com/trends and stackoverflow suggest that no one is
looking for git-p4import any more.  Remove it.

Noticed while considering marking the contrib/p4import/git-p4import.py
script executable as part of a wider sweep.

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
Following up on
http://thread.gmane.org/gmane.comp.version-control.git/52580

 contrib/p4import/README           |   1 -
 contrib/p4import/git-p4import.py  | 365 --------------------------------------
 contrib/p4import/git-p4import.txt | 167 -----------------
 3 files changed, 533 deletions(-)
 delete mode 100644 contrib/p4import/README
 delete mode 100644 contrib/p4import/git-p4import.py
 delete mode 100644 contrib/p4import/git-p4import.txt

diff --git a/contrib/p4import/README b/contrib/p4import/README
deleted file mode 100644
index b9892b6..0000000
--- a/contrib/p4import/README
+++ /dev/null
@@ -1 +0,0 @@
-Please see contrib/fast-import/git-p4 for a better Perforce importer.
diff --git a/contrib/p4import/git-p4import.py b/contrib/p4import/git-p4import.py
deleted file mode 100644
index 593d6a0..0000000
--- a/contrib/p4import/git-p4import.py
+++ /dev/null
@@ -1,365 +0,0 @@
-#!/usr/bin/env python
-#
-# This tool is copyright (c) 2006, Sean Estabrooks.
-# It is released under the Gnu Public License, version 2.
-#
-# Import Perforce branches into Git repositories.
-# Checking out the files is done by calling the standard p4
-# client which you must have properly configured yourself
-#
-
-import marshal
-import os
-import sys
-import time
-import getopt
-
-if sys.hexversion < 0x02020000:
-   # The behavior of the marshal module changed significantly in 2.2
-   sys.stderr.write("git-p4import.py: requires Python 2.2 or later.\n")
-   sys.exit(1)
-
-from signal import signal, \
-   SIGPIPE, SIGINT, SIG_DFL, \
-   default_int_handler
-
-signal(SIGPIPE, SIG_DFL)
-s = signal(SIGINT, SIG_DFL)
-if s != default_int_handler:
-   signal(SIGINT, s)
-
-def die(msg, *args):
-    for a in args:
-        msg = "%s %s" % (msg, a)
-    print "git-p4import fatal error:", msg
-    sys.exit(1)
-
-def usage():
-    print "USAGE: git-p4import [-q|-v]  [--authors=<file>]  [-t <timezone>]  [//p4repo/path <branch>]"
-    sys.exit(1)
-
-verbosity = 1
-logfile = "/dev/null"
-ignore_warnings = False
-stitch = 0
-tagall = True
-
-def report(level, msg, *args):
-    global verbosity
-    global logfile
-    for a in args:
-        msg = "%s %s" % (msg, a)
-    fd = open(logfile, "a")
-    fd.writelines(msg)
-    fd.close()
-    if level <= verbosity:
-        print msg
-
-class p4_command:
-    def __init__(self, _repopath):
-        try:
-            global logfile
-            self.userlist = {}
-            if _repopath[-1] == '/':
-                self.repopath = _repopath[:-1]
-            else:
-                self.repopath = _repopath
-            if self.repopath[-4:] != "/...":
-                self.repopath= "%s/..." % self.repopath
-            f=os.popen('p4 -V 2>>%s'%logfile, 'rb')
-            a = f.readlines()
-            if f.close():
-                raise
-        except:
-                die("Could not find the \"p4\" command")
-
-    def p4(self, cmd, *args):
-        global logfile
-        cmd = "%s %s" % (cmd, ' '.join(args))
-        report(2, "P4:", cmd)
-        f=os.popen('p4 -G %s 2>>%s' % (cmd,logfile), 'rb')
-        list = []
-        while 1:
-           try:
-                list.append(marshal.load(f))
-           except EOFError:
-                break
-        self.ret = f.close()
-        return list
-
-    def sync(self, id, force=False, trick=False, test=False):
-        if force:
-            ret = self.p4("sync -f %s@%s"%(self.repopath, id))[0]
-        elif trick:
-            ret = self.p4("sync -k %s@%s"%(self.repopath, id))[0]
-        elif test:
-            ret = self.p4("sync -n %s@%s"%(self.repopath, id))[0]
-        else:
-            ret = self.p4("sync    %s@%s"%(self.repopath, id))[0]
-        if ret['code'] == "error":
-             data = ret['data'].upper()
-             if data.find('VIEW') > 0:
-                 die("Perforce reports %s is not in client view"% self.repopath)
-             elif data.find('UP-TO-DATE') < 0:
-                 die("Could not sync files from perforce", self.repopath)
-
-    def changes(self, since=0):
-        try:
-            list = []
-            for rec in self.p4("changes %s@%s,#head" % (self.repopath, since+1)):
-                list.append(rec['change'])
-            list.reverse()
-            return list
-        except:
-            return []
-
-    def authors(self, filename):
-        f=open(filename)
-        for l in f.readlines():
-            self.userlist[l[:l.find('=')].rstrip()] = \
-                    (l[l.find('=')+1:l.find('<')].rstrip(),l[l.find('<')+1:l.find('>')])
-        f.close()
-        for f,e in self.userlist.items():
-                report(2, f, ":", e[0], "  <", e[1], ">")
-
-    def _get_user(self, id):
-        if not self.userlist.has_key(id):
-            try:
-                user = self.p4("users", id)[0]
-                self.userlist[id] = (user['FullName'], user['Email'])
-            except:
-                self.userlist[id] = (id, "")
-        return self.userlist[id]
-
-    def _format_date(self, ticks):
-        symbol='+'
-        name = time.tzname[0]
-        offset = time.timezone
-        if ticks[8]:
-            name = time.tzname[1]
-            offset = time.altzone
-        if offset < 0:
-            offset *= -1
-            symbol = '-'
-        localo = "%s%02d%02d %s" % (symbol, offset / 3600, offset % 3600, name)
-        tickso = time.strftime("%a %b %d %H:%M:%S %Y", ticks)
-        return "%s %s" % (tickso, localo)
-
-    def where(self):
-        try:
-            return self.p4("where %s" % self.repopath)[-1]['path']
-        except:
-            return ""
-
-    def describe(self, num):
-        desc = self.p4("describe -s", num)[0]
-        self.msg = desc['desc']
-        self.author, self.email = self._get_user(desc['user'])
-        self.date = self._format_date(time.localtime(long(desc['time'])))
-        return self
-
-class git_command:
-    def __init__(self):
-        try:
-            self.version = self.git("--version")[0][12:].rstrip()
-        except:
-            die("Could not find the \"git\" command")
-        try:
-            self.gitdir = self.get_single("rev-parse --git-dir")
-            report(2, "gdir:", self.gitdir)
-        except:
-            die("Not a git repository... did you forget to \"git init\" ?")
-        try:
-            self.cdup = self.get_single("rev-parse --show-cdup")
-            if self.cdup != "":
-                os.chdir(self.cdup)
-            self.topdir = os.getcwd()
-            report(2, "topdir:", self.topdir)
-        except:
-            die("Could not find top git directory")
-
-    def git(self, cmd):
-        global logfile
-        report(2, "GIT:", cmd)
-        f=os.popen('git %s 2>>%s' % (cmd,logfile), 'rb')
-        r=f.readlines()
-        self.ret = f.close()
-        return r
-
-    def get_single(self, cmd):
-        return self.git(cmd)[0].rstrip()
-
-    def current_branch(self):
-        try:
-            testit = self.git("rev-parse --verify HEAD")[0]
-            return self.git("symbolic-ref HEAD")[0][11:].rstrip()
-        except:
-            return None
-
-    def get_config(self, variable):
-        try:
-            return self.git("config --get %s" % variable)[0].rstrip()
-        except:
-            return None
-
-    def set_config(self, variable, value):
-        try:
-            self.git("config %s %s"%(variable, value) )
-        except:
-            die("Could not set %s to " % variable, value)
-
-    def make_tag(self, name, head):
-        self.git("tag -f %s %s"%(name,head))
-
-    def top_change(self, branch):
-        try:
-            a=self.get_single("name-rev --tags refs/heads/%s" % branch)
-            loc = a.find(' tags/') + 6
-            if a[loc:loc+3] != "p4/":
-                raise
-            return int(a[loc+3:][:-2])
-        except:
-            return 0
-
-    def update_index(self):
-        self.git("ls-files -m -d -o -z | git update-index --add --remove -z --stdin")
-
-    def checkout(self, branch):
-        self.git("checkout %s" % branch)
-
-    def repoint_head(self, branch):
-        self.git("symbolic-ref HEAD refs/heads/%s" % branch)
-
-    def remove_files(self):
-        self.git("ls-files | xargs rm")
-
-    def clean_directories(self):
-        self.git("clean -d")
-
-    def fresh_branch(self, branch):
-        report(1, "Creating new branch", branch)
-        self.git("ls-files | xargs rm")
-        os.remove(".git/index")
-        self.repoint_head(branch)
-        self.git("clean -d")
-
-    def basedir(self):
-        return self.topdir
-
-    def commit(self, author, email, date, msg, id):
-        self.update_index()
-        fd=open(".msg", "w")
-        fd.writelines(msg)
-        fd.close()
-        try:
-                current = self.get_single("rev-parse --verify HEAD")
-                head = "-p HEAD"
-        except:
-                current = ""
-                head = ""
-        tree = self.get_single("write-tree")
-        for r,l in [('DATE',date),('NAME',author),('EMAIL',email)]:
-            os.environ['GIT_AUTHOR_%s'%r] = l
-            os.environ['GIT_COMMITTER_%s'%r] = l
-        commit = self.get_single("commit-tree %s %s < .msg" % (tree,head))
-        os.remove(".msg")
-        self.make_tag("p4/%s"%id, commit)
-        self.git("update-ref HEAD %s %s" % (commit, current) )
-
-try:
-    opts, args = getopt.getopt(sys.argv[1:], "qhvt:",
-            ["authors=","help","stitch=","timezone=","log=","ignore","notags"])
-except getopt.GetoptError:
-    usage()
-
-for o, a in opts:
-    if o == "-q":
-        verbosity = 0
-    if o == "-v":
-        verbosity += 1
-    if o in ("--log"):
-        logfile = a
-    if o in ("--notags"):
-        tagall = False
-    if o in ("-h", "--help"):
-        usage()
-    if o in ("--ignore"):
-        ignore_warnings = True
-
-git = git_command()
-branch=git.current_branch()
-
-for o, a in opts:
-    if o in ("-t", "--timezone"):
-        git.set_config("perforce.timezone", a)
-    if o in ("--stitch"):
-        git.set_config("perforce.%s.path" % branch, a)
-        stitch = 1
-
-if len(args) == 2:
-    branch = args[1]
-    git.checkout(branch)
-    if branch == git.current_branch():
-        die("Branch %s already exists!" % branch)
-    report(1, "Setting perforce to ", args[0])
-    git.set_config("perforce.%s.path" % branch, args[0])
-elif len(args) != 0:
-    die("You must specify the perforce //depot/path and git branch")
-
-p4path = git.get_config("perforce.%s.path" % branch)
-if p4path == None:
-    die("Do not know Perforce //depot/path for git branch", branch)
-
-p4 = p4_command(p4path)
-
-for o, a in opts:
-    if o in ("-a", "--authors"):
-        p4.authors(a)
-
-localdir = git.basedir()
-if p4.where()[:len(localdir)] != localdir:
-    report(1, "**WARNING** Appears p4 client is misconfigured")
-    report(1, "   for sync from %s to %s" % (p4.repopath, localdir))
-    if ignore_warnings != True:
-        die("Reconfigure or use \"--ignore\" on command line")
-
-if stitch == 0:
-    top = git.top_change(branch)
-else:
-    top = 0
-changes = p4.changes(top)
-count = len(changes)
-if count == 0:
-    report(1, "Already up to date...")
-    sys.exit(0)
-
-ptz = git.get_config("perforce.timezone")
-if ptz:
-    report(1, "Setting timezone to", ptz)
-    os.environ['TZ'] = ptz
-    time.tzset()
-
-if stitch == 1:
-    git.remove_files()
-    git.clean_directories()
-    p4.sync(changes[0], force=True)
-elif top == 0 and branch != git.current_branch():
-    p4.sync(changes[0], test=True)
-    report(1, "Creating new initial commit");
-    git.fresh_branch(branch)
-    p4.sync(changes[0], force=True)
-else:
-    p4.sync(changes[0], trick=True)
-
-report(1, "processing %s changes from p4 (%s) to git (%s)" % (count, p4.repopath, branch))
-for id in changes:
-    report(1, "Importing changeset", id)
-    change = p4.describe(id)
-    p4.sync(id)
-    if tagall :
-            git.commit(change.author, change.email, change.date, change.msg, id)
-    else:
-            git.commit(change.author, change.email, change.date, change.msg, "import")
-    if stitch == 1:
-        git.clean_directories()
-        stitch = 0
diff --git a/contrib/p4import/git-p4import.txt b/contrib/p4import/git-p4import.txt
deleted file mode 100644
index 9967587..0000000
--- a/contrib/p4import/git-p4import.txt
+++ /dev/null
@@ -1,167 +0,0 @@
-git-p4import(1)
-===============
-
-NAME
-----
-git-p4import - Import a Perforce repository into git
-
-
-SYNOPSIS
---------
-[verse]
-`git-p4import` [-q|-v] [--notags] [--authors <file>] [-t <timezone>]
-               <//p4repo/path> <branch>
-`git-p4import` --stitch <//p4repo/path>
-`git-p4import`
-
-
-DESCRIPTION
------------
-Import a Perforce repository into an existing git repository.  When
-a <//p4repo/path> and <branch> are specified a new branch with the
-given name will be created and the initial import will begin.
-
-Once the initial import is complete you can do an incremental import
-of new commits from the Perforce repository.  You do this by checking
-out the appropriate git branch and then running `git-p4import` without
-any options.
-
-The standard p4 client is used to communicate with the Perforce
-repository; it must be configured correctly in order for `git-p4import`
-to operate (see below).
-
-
-OPTIONS
--------
--q::
-	Do not display any progress information.
-
--v::
-        Give extra progress information.
-
-\--authors::
-	Specify an authors file containing a mapping of Perforce user
-	ids to full names and email addresses (see Notes below).
-
-\--notags::
-	Do not create a tag for each imported commit.
-
-\--stitch::
-	Import the contents of the given perforce branch into the
-	currently checked out git branch.
-
-\--log::
-	Store debugging information in the specified file.
-
--t::
-	Specify that the remote repository is in the specified timezone.
-	Timezone must be in the format "US/Pacific" or "Europe/London"
-	etc.  You only need to specify this once, it will be saved in
-	the git config file for the repository.
-
-<//p4repo/path>::
-	The Perforce path that will be imported into the specified branch.
-
-<branch>::
-	The new branch that will be created to hold the Perforce imports.
-
-
-P4 Client
----------
-You must make the `p4` client command available in your $PATH and
-configure it to communicate with the target Perforce repository.
-Typically this means you must set the "$P4PORT" and "$P4CLIENT"
-environment variables.
-
-You must also configure a `p4` client "view" which maps the Perforce
-branch into the top level of your git repository, for example:
-
-------------
-Client: myhost
-
-Root:   /home/sean/import
-
-Options:   noallwrite clobber nocompress unlocked modtime rmdir
-
-View:
-        //public/jam/... //myhost/jam/...
-------------
-
-With the above `p4` client setup, you could import the "jam"
-perforce branch into a branch named "jammy", like so:
-
-------------
-$ mkdir -p /home/sean/import/jam
-$ cd /home/sean/import/jam
-$ git init
-$ git p4import //public/jam jammy
-------------
-
-
-Multiple Branches
------------------
-Note that by creating multiple "views" you can use `git-p4import`
-to import additional branches into the same git repository.
-However, the `p4` client has a limitation in that it silently
-ignores all but the last "view" that maps into the same local
-directory.  So the following will *not* work:
-
-------------
-View:
-        //public/jam/... //myhost/jam/...
-        //public/other/... //myhost/jam/...
-        //public/guest/... //myhost/jam/...
-------------
-
-If you want more than one Perforce branch to be imported into the
-same directory you must employ a workaround.  A simple option is
-to adjust your `p4` client before each import to only include a
-single view.
-
-Another option is to create multiple symlinks locally which all
-point to the same directory in your git repository and then use
-one per "view" instead of listing the actual directory.
-
-
-Tags
-----
-A git tag of the form p4/xx is created for every change imported from
-the Perforce repository where xx is the Perforce changeset number.
-Therefore after the import you can use git to access any commit by its
-Perforce number, e.g. git show p4/327.
-
-The tag associated with the HEAD commit is also how `git-p4import`
-determines if there are new changes to incrementally import from the
-Perforce repository.
-
-If you import from a repository with many thousands of changes
-you will have an equal number of p4/xxxx git tags.  Git tags can
-be expensive in terms of disk space and repository operations.
-If you don't need to perform further incremental imports, you
-may delete the tags.
-
-
-Notes
------
-You can interrupt the import (e.g. ctrl-c) at any time and restart it
-without worry.
-
-Author information is automatically determined by querying the
-Perforce "users" table using the id associated with each change.
-However, if you want to manually supply these mappings you can do
-so with the "--authors" option.  It accepts a file containing a list
-of mappings with each line containing one mapping in the format:
-
-------------
-    perforce_id = Full Name <email@address.com>
-------------
-
-
-Author
-------
-Written by Sean Estabrooks <seanlkml@sympatico.ca>
-
-
-GIT
----
-Part of the gitlink:git[7] suite
-- 
1.8.4.1

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH 5/9 gitk] gitk: chmod +x po2msg
  2013-11-25 20:51 [PATCH 0/9] War on #! lines in shell libraries Jonathan Nieder
                   ` (3 preceding siblings ...)
  2013-11-25 20:58 ` [PATCH 4/9] contrib: remove git-p4import Jonathan Nieder
@ 2013-11-25 21:00 ` Jonathan Nieder
  2013-11-25 21:01 ` [PATCH 6/9 git-gui] git-gui: chmod +x po2msg, windows/git-gui.sh Jonathan Nieder
                   ` (3 subsequent siblings)
  8 siblings, 0 replies; 13+ messages in thread
From: Jonathan Nieder @ 2013-11-25 21:00 UTC (permalink / raw)
  To: git; +Cc: Paul Mackerras, Clemens Buchacher, Marc Branchaud

The Makefile only runs it using tclsh, but because the fallback po2msg
script has the usual tcl preamble starting with #!/bin/sh it can also
be run directly.

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
 po/po2msg.sh | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 mode change 100644 => 100755 po/po2msg.sh

diff --git a/po/po2msg.sh b/po/po2msg.sh
old mode 100644
new mode 100755
-- 
1.8.4.1

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH 6/9 git-gui] git-gui: chmod +x po2msg, windows/git-gui.sh
  2013-11-25 20:51 [PATCH 0/9] War on #! lines in shell libraries Jonathan Nieder
                   ` (4 preceding siblings ...)
  2013-11-25 21:00 ` [PATCH 5/9 gitk] gitk: chmod +x po2msg Jonathan Nieder
@ 2013-11-25 21:01 ` Jonathan Nieder
  2013-11-25 21:02 ` [PATCH 7/9] test: make FILEMODE a lazy prereq Jonathan Nieder
                   ` (2 subsequent siblings)
  8 siblings, 0 replies; 13+ messages in thread
From: Jonathan Nieder @ 2013-11-25 21:01 UTC (permalink / raw)
  To: git; +Cc: Pat Thoyts, Clemens Buchacher, Marc Branchaud

The Makefile only runs po/po2msg.sh using tclsh, but because the
script has the usual tcl preamble starting with #!/bin/sh it can also
be run directly.

The Windows git-gui wrapper is usable in-place for the same reason.

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
 po/po2msg.sh       | 0
 windows/git-gui.sh | 0
 2 files changed, 0 insertions(+), 0 deletions(-)
 mode change 100644 => 100755 po/po2msg.sh
 mode change 100644 => 100755 windows/git-gui.sh

diff --git a/po/po2msg.sh b/po/po2msg.sh
old mode 100644
new mode 100755
diff --git a/windows/git-gui.sh b/windows/git-gui.sh
old mode 100644
new mode 100755
-- 
1.8.4.1

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH 7/9] test: make FILEMODE a lazy prereq
  2013-11-25 20:51 [PATCH 0/9] War on #! lines in shell libraries Jonathan Nieder
                   ` (5 preceding siblings ...)
  2013-11-25 21:01 ` [PATCH 6/9 git-gui] git-gui: chmod +x po2msg, windows/git-gui.sh Jonathan Nieder
@ 2013-11-25 21:02 ` Jonathan Nieder
  2013-11-25 21:03 ` [PATCH 8/9] test: replace shebangs with descriptions in shell libraries Jonathan Nieder
  2013-11-25 21:03 ` [PATCH 9/9] remove #!interpreter line from " Jonathan Nieder
  8 siblings, 0 replies; 13+ messages in thread
From: Jonathan Nieder @ 2013-11-25 21:02 UTC (permalink / raw)
  To: git
  Cc: Ævar Arnfjörð Bjarmason, Clemens Buchacher,
	Marc Branchaud

This way, test authors don't need to remember to source
lib-prereq-FILEMODE.sh before using the FILEMODE prereq to guard tests
that rely on the executable bit being honored when checking out files.

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
 t/lib-prereq-FILEMODE.sh       | 11 -----------
 t/t3701-add-interactive.sh     |  1 -
 t/t4102-apply-rename.sh        |  1 -
 t/t4120-apply-popt.sh          |  1 -
 t/t4129-apply-samemode.sh      |  1 -
 t/t6031-merge-recursive.sh     |  1 -
 t/t9200-git-cvsexportcommit.sh |  1 -
 t/test-lib.sh                  |  4 ++++
 8 files changed, 4 insertions(+), 17 deletions(-)
 delete mode 100644 t/lib-prereq-FILEMODE.sh

diff --git a/t/lib-prereq-FILEMODE.sh b/t/lib-prereq-FILEMODE.sh
deleted file mode 100644
index bce5a4c..0000000
--- a/t/lib-prereq-FILEMODE.sh
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh
-#
-# Copyright (c) 2010 Ævar Arnfjörð Bjarmason
-#
-
-if test "$(git config --bool core.filemode)" = false
-then
-	say 'filemode disabled on the filesystem'
-else
-	test_set_prereq FILEMODE
-fi
diff --git a/t/t3701-add-interactive.sh b/t/t3701-add-interactive.sh
index 9dc91d0..24ddd8a 100755
--- a/t/t3701-add-interactive.sh
+++ b/t/t3701-add-interactive.sh
@@ -2,7 +2,6 @@
 
 test_description='add -i basic tests'
 . ./test-lib.sh
-. "$TEST_DIRECTORY"/lib-prereq-FILEMODE.sh
 
 if ! test_have_prereq PERL
 then
diff --git a/t/t4102-apply-rename.sh b/t/t4102-apply-rename.sh
index e3ea3d5..49e2d6c 100755
--- a/t/t4102-apply-rename.sh
+++ b/t/t4102-apply-rename.sh
@@ -7,7 +7,6 @@ test_description='git apply handling copy/rename patch.
 
 '
 . ./test-lib.sh
-. "$TEST_DIRECTORY"/lib-prereq-FILEMODE.sh
 
 # setup
 
diff --git a/t/t4120-apply-popt.sh b/t/t4120-apply-popt.sh
index c5fecdf..497b628 100755
--- a/t/t4120-apply-popt.sh
+++ b/t/t4120-apply-popt.sh
@@ -6,7 +6,6 @@
 test_description='git apply -p handling.'
 
 . ./test-lib.sh
-. "$TEST_DIRECTORY"/lib-prereq-FILEMODE.sh
 
 test_expect_success setup '
 	mkdir sub &&
diff --git a/t/t4129-apply-samemode.sh b/t/t4129-apply-samemode.sh
index 0d36ebd..c268298 100755
--- a/t/t4129-apply-samemode.sh
+++ b/t/t4129-apply-samemode.sh
@@ -3,7 +3,6 @@
 test_description='applying patch with mode bits'
 
 . ./test-lib.sh
-. "$TEST_DIRECTORY"/lib-prereq-FILEMODE.sh
 
 test_expect_success setup '
 	echo original >file &&
diff --git a/t/t6031-merge-recursive.sh b/t/t6031-merge-recursive.sh
index 1cd649e..a953f1b 100755
--- a/t/t6031-merge-recursive.sh
+++ b/t/t6031-merge-recursive.sh
@@ -2,7 +2,6 @@
 
 test_description='merge-recursive: handle file mode'
 . ./test-lib.sh
-. "$TEST_DIRECTORY"/lib-prereq-FILEMODE.sh
 
 test_expect_success 'mode change in one branch: keep changed version' '
 	: >file1 &&
diff --git a/t/t9200-git-cvsexportcommit.sh b/t/t9200-git-cvsexportcommit.sh
index 3fb3368..812c9cd 100755
--- a/t/t9200-git-cvsexportcommit.sh
+++ b/t/t9200-git-cvsexportcommit.sh
@@ -5,7 +5,6 @@
 test_description='Test export of commits to CVS'
 
 . ./test-lib.sh
-. "$TEST_DIRECTORY"/lib-prereq-FILEMODE.sh
 
 if ! test_have_prereq PERL; then
 	skip_all='skipping git cvsexportcommit tests, perl not available'
diff --git a/t/test-lib.sh b/t/test-lib.sh
index b25249e..5968157 100644
--- a/t/test-lib.sh
+++ b/t/test-lib.sh
@@ -830,6 +830,10 @@ test_lazy_prereq SYMLINKS '
 	ln -s x y && test -h y
 '
 
+test_lazy_prereq FILEMODE '
+	test "$(git config --bool core.filemode)" = true
+'
+
 test_lazy_prereq CASE_INSENSITIVE_FS '
 	echo good >CamelCase &&
 	echo bad >camelcase &&
-- 
1.8.4.1

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH 8/9] test: replace shebangs with descriptions in shell libraries
  2013-11-25 20:51 [PATCH 0/9] War on #! lines in shell libraries Jonathan Nieder
                   ` (6 preceding siblings ...)
  2013-11-25 21:02 ` [PATCH 7/9] test: make FILEMODE a lazy prereq Jonathan Nieder
@ 2013-11-25 21:03 ` Jonathan Nieder
  2013-11-26  5:18   ` Eric Sunshine
  2013-11-25 21:03 ` [PATCH 9/9] remove #!interpreter line from " Jonathan Nieder
  8 siblings, 1 reply; 13+ messages in thread
From: Jonathan Nieder @ 2013-11-25 21:03 UTC (permalink / raw)
  To: git; +Cc: Clemens Buchacher, Marc Branchaud

A #! line in these files is misleading, since these scriptlets are
meant to be sourced with '.' (using whatever shell sources them)
instead of run directly using the interpreter named on the #! line.

Removing the #! line shouldn't hurt syntax highlighting since
these files have filenames ending with '.sh'.  For documentation,
add a brief description of how the files are meant to be used in
place of the shebang line.

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
 t/gitweb-lib.sh           |  3 ++-
 t/lib-bash.sh             |  7 +++----
 t/lib-cvs.sh              |  2 +-
 t/lib-diff-alternative.sh |  3 ++-
 t/lib-gettext.sh          |  3 ++-
 t/lib-git-daemon.sh       | 18 +++++++++++++++++-
 t/lib-httpd.sh            | 29 ++++++++++++++++++++++++++++-
 t/lib-pack.sh             |  2 --
 t/lib-pager.sh            |  2 +-
 t/lib-read-tree.sh        |  2 --
 t/lib-rebase.sh           |  2 +-
 t/lib-terminal.sh         |  2 +-
 t/perf/perf-lib.sh        |  4 +++-
 t/test-lib-functions.sh   |  3 ++-
 t/test-lib.sh             |  2 +-
 15 files changed, 64 insertions(+), 20 deletions(-)

diff --git a/t/gitweb-lib.sh b/t/gitweb-lib.sh
index 8cf909a..d5dab5a 100644
--- a/t/gitweb-lib.sh
+++ b/t/gitweb-lib.sh
@@ -1,4 +1,5 @@
-#!/bin/sh
+# Initialization and helpers for Gitweb tests, which source this
+# shell library instead of test-lib.sh.
 #
 # Copyright (c) 2007 Jakub Narebski
 #
diff --git a/t/lib-bash.sh b/t/lib-bash.sh
index 11397f7..10b76df 100644
--- a/t/lib-bash.sh
+++ b/t/lib-bash.sh
@@ -1,7 +1,6 @@
-#!/bin/sh
-#
-# Ensures that tests are run under Bash; primarily intended for running tests
-# of the completion script.
+# Shell library sourced instead of ./test-lib.sh by tests that need
+# to run under Bash; primary intended for tests of the completion
+# script.
 
 if test -n "$BASH" && test -z "$POSIXLY_CORRECT"; then
 	# we are in full-on bash mode
diff --git a/t/lib-cvs.sh b/t/lib-cvs.sh
index 44263ad..5076718 100644
--- a/t/lib-cvs.sh
+++ b/t/lib-cvs.sh
@@ -1,4 +1,4 @@
-#!/bin/sh
+# Shell library sourced instead of ./test-lib.sh by cvsimport tests.
 
 . ./test-lib.sh
 
diff --git a/t/lib-diff-alternative.sh b/t/lib-diff-alternative.sh
index 75ffd91..8b4dbf2 100644
--- a/t/lib-diff-alternative.sh
+++ b/t/lib-diff-alternative.sh
@@ -1,4 +1,5 @@
-#!/bin/sh
+# Helpers shared by the test scripts for diff algorithms (patience,
+# histogram, etc).
 
 test_diff_frobnitz() {
 	cat >file1 <<\EOF
diff --git a/t/lib-gettext.sh b/t/lib-gettext.sh
index ae8883a..eec757f 100644
--- a/t/lib-gettext.sh
+++ b/t/lib-gettext.sh
@@ -1,4 +1,5 @@
-#!/bin/sh
+# Initialization and Icelandic locale for basic git i18n tests,
+# which source this scriptlet instead of ./test-lib.sh.
 #
 # Copyright (c) 2010 Ævar Arnfjörð Bjarmason
 #
diff --git a/t/lib-git-daemon.sh b/t/lib-git-daemon.sh
index 87f0ad8..394b06b 100644
--- a/t/lib-git-daemon.sh
+++ b/t/lib-git-daemon.sh
@@ -1,4 +1,20 @@
-#!/bin/sh
+# Shell library to run git-daemon in tests.  Ends the test early if
+# GIT_TEST_GIT_DAEMON is not set.
+#
+# Usage:
+#
+#	. ./test-lib.sh
+#	. "$TEST_DIRECTORY"/lib-git-daemon.sh
+#	start_git_daemon
+#
+#	test_expect_success '...' '
+#		...
+#	'
+#
+#	test_expect_success ...
+#
+#	stop_git_daemon
+#	test_done
 
 if test -z "$GIT_TEST_GIT_DAEMON"
 then
diff --git a/t/lib-httpd.sh b/t/lib-httpd.sh
index ad8f1ef..c470784 100644
--- a/t/lib-httpd.sh
+++ b/t/lib-httpd.sh
@@ -1,4 +1,31 @@
-#!/bin/sh
+# Shell library to run an HTTP server for use in tests.
+# Ends the test early if httpd tests should not be run,
+# for example because the user has not enabled them.
+#
+# Usage:
+#
+#	. ./test-lib.sh
+#	. "$TEST_DIRECTORY"/lib-httpd.sh
+#	start_httpd
+#
+#	test_expect_success '...' '
+#		...
+#	'
+#
+#	test_expect_success ...
+#
+#	stop_httpd
+#	test_done
+#
+# Can be configured using the following variables.
+#
+#    GIT_TEST_HTTPD              enable HTTPD tests
+#    LIB_HTTPD_PATH              web server path
+#    LIB_HTTPD_MODULE_PATH       web server modules path
+#    LIB_HTTPD_PORT              listening port
+#    LIB_HTTPD_DAV               enable DAV
+#    LIB_HTTPD_SVN               enable SVN
+#    LIB_HTTPD_SSL               enable SSL
 #
 # Copyright (c) 2008 Clemens Buchacher <drizzd@aon.at>
 #
diff --git a/t/lib-pack.sh b/t/lib-pack.sh
index b96e125..7509846 100644
--- a/t/lib-pack.sh
+++ b/t/lib-pack.sh
@@ -1,5 +1,3 @@
-#!/bin/sh
-#
 # Support routines for hand-crafting weird or malicious packs.
 #
 # You can make a complete pack like:
diff --git a/t/lib-pager.sh b/t/lib-pager.sh
index ba03eab..3aa7a3f 100644
--- a/t/lib-pager.sh
+++ b/t/lib-pager.sh
@@ -1,4 +1,4 @@
-#!/bin/sh
+# Helpers for tests of git's choice of pager.
 
 test_expect_success 'determine default pager' '
 	test_might_fail git config --unset core.pager &&
diff --git a/t/lib-read-tree.sh b/t/lib-read-tree.sh
index abc2c6f..6442ae3 100644
--- a/t/lib-read-tree.sh
+++ b/t/lib-read-tree.sh
@@ -1,5 +1,3 @@
-#!/bin/sh
-#
 # Helper functions to check if read-tree would succeed/fail as expected with
 # and without the dry-run option. They also test that the dry-run does not
 # write the index and that together with -u it doesn't touch the work tree.
diff --git a/t/lib-rebase.sh b/t/lib-rebase.sh
index 8ff87fb..6bd2522 100644
--- a/t/lib-rebase.sh
+++ b/t/lib-rebase.sh
@@ -1,4 +1,4 @@
-#!/bin/sh
+# Helper functions used by interactive rebase tests.
 
 # After setting the fake editor with this function, you can
 #
diff --git a/t/lib-terminal.sh b/t/lib-terminal.sh
index 737df28..9a2dca5 100644
--- a/t/lib-terminal.sh
+++ b/t/lib-terminal.sh
@@ -1,4 +1,4 @@
-#!/bin/sh
+# Helpers for terminal output tests.
 
 test_expect_success PERL 'set up terminal for tests' '
 	# Reading from the pty master seems to get stuck _sometimes_
diff --git a/t/perf/perf-lib.sh b/t/perf/perf-lib.sh
index f4eecaa..a8c9574 100644
--- a/t/perf/perf-lib.sh
+++ b/t/perf/perf-lib.sh
@@ -1,4 +1,6 @@
-#!/bin/sh
+# Performance testing framework.  Each perf script starts much like
+# a normal test script, except it sources this library instead of
+# test-lib.sh.  See t/perf/README for documentation.
 #
 # Copyright (c) 2011 Thomas Rast
 #
diff --git a/t/test-lib-functions.sh b/t/test-lib-functions.sh
index 2f79146..aeae3ca 100644
--- a/t/test-lib-functions.sh
+++ b/t/test-lib-functions.sh
@@ -1,4 +1,5 @@
-#!/bin/sh
+# Library of functions shared by all tests scripts, included by
+# test-lib.sh.
 #
 # Copyright (c) 2005 Junio C Hamano
 #
diff --git a/t/test-lib.sh b/t/test-lib.sh
index 5968157..c306bd0 100644
--- a/t/test-lib.sh
+++ b/t/test-lib.sh
@@ -1,4 +1,4 @@
-#!/bin/sh
+# Test framework for git.  See t/README for usage.
 #
 # Copyright (c) 2005 Junio C Hamano
 #
-- 
1.8.4.1

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH 9/9] remove #!interpreter line from shell libraries
  2013-11-25 20:51 [PATCH 0/9] War on #! lines in shell libraries Jonathan Nieder
                   ` (7 preceding siblings ...)
  2013-11-25 21:03 ` [PATCH 8/9] test: replace shebangs with descriptions in shell libraries Jonathan Nieder
@ 2013-11-25 21:03 ` Jonathan Nieder
  8 siblings, 0 replies; 13+ messages in thread
From: Jonathan Nieder @ 2013-11-25 21:03 UTC (permalink / raw)
  To: git; +Cc: Paul Mackerras, Pat Thoyts, Clemens Buchacher, Marc Branchaud

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>
---
Thanks for reading.

 contrib/completion/git-completion.bash | 2 --
 contrib/completion/git-completion.tcsh | 2 --
 git-mergetool--lib.sh                  | 3 +--
 git-parse-remote.sh                    | 4 +++-
 git-rebase--am.sh                      | 3 ++-
 git-rebase--interactive.sh             | 9 +++------
 git-rebase--merge.sh                   | 4 +++-
 git-sh-i18n.sh                         | 5 ++---
 git-sh-setup.sh                        | 9 +++------
 t/test-lib.sh                          | 6 ++----
 10 files changed, 19 insertions(+), 28 deletions(-)

diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index dba3c15..be61931 100644
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -1,5 +1,3 @@
-#!bash
-#
 # bash/zsh completion support for core Git.
 #
 # Copyright (C) 2006,2007 Shawn O. Pearce <spearce@spearce.org>
diff --git a/contrib/completion/git-completion.tcsh b/contrib/completion/git-completion.tcsh
index eaacaf0..6104a42 100644
--- a/contrib/completion/git-completion.tcsh
+++ b/contrib/completion/git-completion.tcsh
@@ -1,5 +1,3 @@
-#!tcsh
-#
 # tcsh completion support for core Git.
 #
 # Copyright (C) 2012 Marc Khouzam <marc.khouzam@gmail.com>
diff --git a/git-mergetool--lib.sh b/git-mergetool--lib.sh
index a280f49..c45a020 100644
--- a/git-mergetool--lib.sh
+++ b/git-mergetool--lib.sh
@@ -1,5 +1,4 @@
-#!/bin/sh
-# git-mergetool--lib is a library for common merge tool functions
+# git-mergetool--lib is a shell library for common merge tool functions
 
 : ${MERGE_TOOLS_DIR=$(git --exec-path)/mergetools}
 
diff --git a/git-parse-remote.sh b/git-parse-remote.sh
index 0e87e09..55fe8d5 100644
--- a/git-parse-remote.sh
+++ b/git-parse-remote.sh
@@ -1,4 +1,6 @@
-#!/bin/sh
+# This is a shell library to calculate the remote repository and
+# upstream branch that should be pulled by "git pull" from the current
+# branch.
 
 # git-ls-remote could be called from outside a git managed repository;
 # this would fail in that case and would issue an error message.
diff --git a/git-rebase--am.sh b/git-rebase--am.sh
index 34e3102..a4f683a 100644
--- a/git-rebase--am.sh
+++ b/git-rebase--am.sh
@@ -1,4 +1,5 @@
-#!/bin/sh
+# This shell script fragment is sourced by git-rebase to implement
+# its default, fast, patch-based, non-interactive mode.
 #
 # Copyright (c) 2010 Junio C Hamano.
 #
diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh
index 3c6bed9..43c19e0 100644
--- a/git-rebase--interactive.sh
+++ b/git-rebase--interactive.sh
@@ -1,11 +1,8 @@
-#!/bin/sh
+# This shell script fragment is sourced by git-rebase to implement
+# its interactive mode.  "git rebase --interactive" makes it easy
+# to fix up commits in the middle of a series and rearrange commits.
 #
 # Copyright (c) 2006 Johannes E. Schindelin
-
-# SHORT DESCRIPTION
-#
-# This script makes it easy to fix up commits in the middle of a series,
-# and rearrange commits.
 #
 # The original idea comes from Eric W. Biederman, in
 # http://article.gmane.org/gmane.comp.version-control.git/22407
diff --git a/git-rebase--merge.sh b/git-rebase--merge.sh
index 16d1817..e7d96de 100644
--- a/git-rebase--merge.sh
+++ b/git-rebase--merge.sh
@@ -1,4 +1,6 @@
-#!/bin/sh
+# This shell script fragment is sourced by git-rebase to implement
+# its merge-based non-interactive mode that copes well with renamed
+# files.
 #
 # Copyright (c) 2010 Junio C Hamano.
 #
diff --git a/git-sh-i18n.sh b/git-sh-i18n.sh
index 6a27f68..e6c3116 100644
--- a/git-sh-i18n.sh
+++ b/git-sh-i18n.sh
@@ -1,9 +1,8 @@
-#!/bin/sh
+# This shell library is Git's interface to gettext.sh. See po/README
+# for usage instructions.
 #
 # Copyright (c) 2010 Ævar Arnfjörð Bjarmason
 #
-# This is Git's interface to gettext.sh. See po/README for usage
-# instructions.
 
 # Export the TEXTDOMAIN* data that we need for Git
 TEXTDOMAIN=git
diff --git a/git-sh-setup.sh b/git-sh-setup.sh
index ebfe8f7..190a539 100644
--- a/git-sh-setup.sh
+++ b/git-sh-setup.sh
@@ -1,9 +1,6 @@
-#!/bin/sh
-#
-# This is included in commands that either have to be run from the toplevel
-# of the repository, or with GIT_DIR environment variable properly.
-# If the GIT_DIR does not look like the right correct git-repository,
-# it dies.
+# This shell scriplet is meant to be included by other shell scripts
+# to set up some variables pointing at the normal git directories and
+# a few helper shell functions.
 
 # Having this variable in your environment would break scripts because
 # you would cause "cd" to be taken to unexpected places.  If you
diff --git a/t/test-lib.sh b/t/test-lib.sh
index c306bd0..c3e07b9 100644
--- a/t/test-lib.sh
+++ b/t/test-lib.sh
@@ -573,11 +573,9 @@ then
 
 	make_valgrind_symlink () {
 		# handle only executables, unless they are shell libraries that
-		# need to be in the exec-path.  We will just use "#!" as a
-		# guess for a shell-script, since we have no idea what the user
-		# may have configured as the shell path.
+		# need to be in the exec-path.
 		test -x "$1" ||
-		test "#!" = "$(head -c 2 <"$1")" ||
+		test "# " = "$(head -c 2 <"$1")" ||
 		return;
 
 		base=$(basename "$1")
-- 
1.8.4.1

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* Re: [PATCH 8/9] test: replace shebangs with descriptions in shell libraries
  2013-11-25 21:03 ` [PATCH 8/9] test: replace shebangs with descriptions in shell libraries Jonathan Nieder
@ 2013-11-26  5:18   ` Eric Sunshine
  2013-11-26 21:39     ` [PATCH 8/9 v2] " Jonathan Nieder
  0 siblings, 1 reply; 13+ messages in thread
From: Eric Sunshine @ 2013-11-26  5:18 UTC (permalink / raw)
  To: Jonathan Nieder; +Cc: Git List, Clemens Buchacher, Marc Branchaud

On Mon, Nov 25, 2013 at 4:03 PM, Jonathan Nieder <jrnieder@gmail.com> wrote:
> A #! line in these files is misleading, since these scriptlets are
> meant to be sourced with '.' (using whatever shell sources them)
> instead of run directly using the interpreter named on the #! line.
>
> Removing the #! line shouldn't hurt syntax highlighting since
> these files have filenames ending with '.sh'.  For documentation,
> add a brief description of how the files are meant to be used in
> place of the shebang line.
>
> Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
> ---
> diff --git a/t/lib-bash.sh b/t/lib-bash.sh
> index 11397f7..10b76df 100644
> --- a/t/lib-bash.sh
> +++ b/t/lib-bash.sh
> @@ -1,7 +1,6 @@
> -#!/bin/sh
> -#
> -# Ensures that tests are run under Bash; primarily intended for running tests
> -# of the completion script.
> +# Shell library sourced instead of ./test-lib.sh by tests that need
> +# to run under Bash; primary intended for tests of the completion

s/primary/primarily/

> +# script.
>
>  if test -n "$BASH" && test -z "$POSIXLY_CORRECT"; then
>         # we are in full-on bash mode

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 4/9] contrib: remove git-p4import
  2013-11-25 20:58 ` [PATCH 4/9] contrib: remove git-p4import Jonathan Nieder
@ 2013-11-26 12:31   ` Pete Wyckoff
  0 siblings, 0 replies; 13+ messages in thread
From: Pete Wyckoff @ 2013-11-26 12:31 UTC (permalink / raw)
  To: Jonathan Nieder; +Cc: git, Sean Estabrooks, Clemens Buchacher, Marc Branchaud

jrnieder@gmail.com wrote on Mon, 25 Nov 2013 12:58 -0800:
> The git p4import documentation has suggested git p4 as a better
> alternative for more than 6 years.  (According to the mailing list
> discussion when it was moved to contrib/, git-p4import has serious
> bugs --- e.g., its incremental mode just doesn't work.) Since then,
> git p4 has been actively developed and was promoted to a standard git
> command alongside git svn.
> 
> Searches on google.com/trends and stackoverflow suggest that no one is
> looking for git-p4import any more.  Remove it.
> 
> Noticed while considering marking the contrib/p4import/git-p4import.py
> script executable as part of a wider sweep.

I haven't seen git-p4import mentioned for the last 6 years either.
Thanks,

Acked-by: Pete Wyckoff <pw@padd.com> 

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH 8/9 v2] test: replace shebangs with descriptions in shell libraries
  2013-11-26  5:18   ` Eric Sunshine
@ 2013-11-26 21:39     ` Jonathan Nieder
  0 siblings, 0 replies; 13+ messages in thread
From: Jonathan Nieder @ 2013-11-26 21:39 UTC (permalink / raw)
  To: Eric Sunshine; +Cc: Git List, Clemens Buchacher, Marc Branchaud

A #! line in these files is misleading, since these scriptlets are
meant to be sourced with '.' (using whatever shell sources them)
instead of run directly using the interpreter named on the #! line.

Removing the #! line shouldn't hurt syntax highlighting since
these files have filenames ending with '.sh'.  For documentation,
add a brief description of how the files are meant to be used in
place of the shebang line.

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
Eric Sunshine wrote:
> On Mon, Nov 25, 2013 at 4:03 PM, Jonathan Nieder <jrnieder@gmail.com> wrote:

>> +++ b/t/lib-bash.sh
>> @@ -1,7 +1,6 @@
>> -#!/bin/sh
>> -#
>> -# Ensures that tests are run under Bash; primarily intended for running tests
>> -# of the completion script.
>> +# Shell library sourced instead of ./test-lib.sh by tests that need
>> +# to run under Bash; primary intended for tests of the completion
>
> s/primary/primarily/

Good eyes.  Here's an updated version of the patch with that change.

Thanks,
Jonathan

 t/gitweb-lib.sh           |  3 ++-
 t/lib-bash.sh             |  7 +++----
 t/lib-cvs.sh              |  2 +-
 t/lib-diff-alternative.sh |  3 ++-
 t/lib-gettext.sh          |  3 ++-
 t/lib-git-daemon.sh       | 18 +++++++++++++++++-
 t/lib-httpd.sh            | 29 ++++++++++++++++++++++++++++-
 t/lib-pack.sh             |  2 --
 t/lib-pager.sh            |  2 +-
 t/lib-read-tree.sh        |  2 --
 t/lib-rebase.sh           |  2 +-
 t/lib-terminal.sh         |  2 +-
 t/perf/perf-lib.sh        |  4 +++-
 t/test-lib-functions.sh   |  3 ++-
 t/test-lib.sh             |  2 +-
 15 files changed, 64 insertions(+), 20 deletions(-)

diff --git a/t/gitweb-lib.sh b/t/gitweb-lib.sh
index 8cf909a..d5dab5a 100644
--- a/t/gitweb-lib.sh
+++ b/t/gitweb-lib.sh
@@ -1,4 +1,5 @@
-#!/bin/sh
+# Initialization and helpers for Gitweb tests, which source this
+# shell library instead of test-lib.sh.
 #
 # Copyright (c) 2007 Jakub Narebski
 #
diff --git a/t/lib-bash.sh b/t/lib-bash.sh
index 11397f7..2be955f 100644
--- a/t/lib-bash.sh
+++ b/t/lib-bash.sh
@@ -1,7 +1,6 @@
-#!/bin/sh
-#
-# Ensures that tests are run under Bash; primarily intended for running tests
-# of the completion script.
+# Shell library sourced instead of ./test-lib.sh by tests that need
+# to run under Bash; primarily intended for tests of the completion
+# script.
 
 if test -n "$BASH" && test -z "$POSIXLY_CORRECT"; then
 	# we are in full-on bash mode
diff --git a/t/lib-cvs.sh b/t/lib-cvs.sh
index 44263ad..5076718 100644
--- a/t/lib-cvs.sh
+++ b/t/lib-cvs.sh
@@ -1,4 +1,4 @@
-#!/bin/sh
+# Shell library sourced instead of ./test-lib.sh by cvsimport tests.
 
 . ./test-lib.sh
 
diff --git a/t/lib-diff-alternative.sh b/t/lib-diff-alternative.sh
index 75ffd91..8b4dbf2 100644
--- a/t/lib-diff-alternative.sh
+++ b/t/lib-diff-alternative.sh
@@ -1,4 +1,5 @@
-#!/bin/sh
+# Helpers shared by the test scripts for diff algorithms (patience,
+# histogram, etc).
 
 test_diff_frobnitz() {
 	cat >file1 <<\EOF
diff --git a/t/lib-gettext.sh b/t/lib-gettext.sh
index ae8883a..eec757f 100644
--- a/t/lib-gettext.sh
+++ b/t/lib-gettext.sh
@@ -1,4 +1,5 @@
-#!/bin/sh
+# Initialization and Icelandic locale for basic git i18n tests,
+# which source this scriptlet instead of ./test-lib.sh.
 #
 # Copyright (c) 2010 Ævar Arnfjörð Bjarmason
 #
diff --git a/t/lib-git-daemon.sh b/t/lib-git-daemon.sh
index 87f0ad8..394b06b 100644
--- a/t/lib-git-daemon.sh
+++ b/t/lib-git-daemon.sh
@@ -1,4 +1,20 @@
-#!/bin/sh
+# Shell library to run git-daemon in tests.  Ends the test early if
+# GIT_TEST_GIT_DAEMON is not set.
+#
+# Usage:
+#
+#	. ./test-lib.sh
+#	. "$TEST_DIRECTORY"/lib-git-daemon.sh
+#	start_git_daemon
+#
+#	test_expect_success '...' '
+#		...
+#	'
+#
+#	test_expect_success ...
+#
+#	stop_git_daemon
+#	test_done
 
 if test -z "$GIT_TEST_GIT_DAEMON"
 then
diff --git a/t/lib-httpd.sh b/t/lib-httpd.sh
index ad8f1ef..c470784 100644
--- a/t/lib-httpd.sh
+++ b/t/lib-httpd.sh
@@ -1,4 +1,31 @@
-#!/bin/sh
+# Shell library to run an HTTP server for use in tests.
+# Ends the test early if httpd tests should not be run,
+# for example because the user has not enabled them.
+#
+# Usage:
+#
+#	. ./test-lib.sh
+#	. "$TEST_DIRECTORY"/lib-httpd.sh
+#	start_httpd
+#
+#	test_expect_success '...' '
+#		...
+#	'
+#
+#	test_expect_success ...
+#
+#	stop_httpd
+#	test_done
+#
+# Can be configured using the following variables.
+#
+#    GIT_TEST_HTTPD              enable HTTPD tests
+#    LIB_HTTPD_PATH              web server path
+#    LIB_HTTPD_MODULE_PATH       web server modules path
+#    LIB_HTTPD_PORT              listening port
+#    LIB_HTTPD_DAV               enable DAV
+#    LIB_HTTPD_SVN               enable SVN
+#    LIB_HTTPD_SSL               enable SSL
 #
 # Copyright (c) 2008 Clemens Buchacher <drizzd@aon.at>
 #
diff --git a/t/lib-pack.sh b/t/lib-pack.sh
index b96e125..7509846 100644
--- a/t/lib-pack.sh
+++ b/t/lib-pack.sh
@@ -1,5 +1,3 @@
-#!/bin/sh
-#
 # Support routines for hand-crafting weird or malicious packs.
 #
 # You can make a complete pack like:
diff --git a/t/lib-pager.sh b/t/lib-pager.sh
index ba03eab..3aa7a3f 100644
--- a/t/lib-pager.sh
+++ b/t/lib-pager.sh
@@ -1,4 +1,4 @@
-#!/bin/sh
+# Helpers for tests of git's choice of pager.
 
 test_expect_success 'determine default pager' '
 	test_might_fail git config --unset core.pager &&
diff --git a/t/lib-read-tree.sh b/t/lib-read-tree.sh
index abc2c6f..6442ae3 100644
--- a/t/lib-read-tree.sh
+++ b/t/lib-read-tree.sh
@@ -1,5 +1,3 @@
-#!/bin/sh
-#
 # Helper functions to check if read-tree would succeed/fail as expected with
 # and without the dry-run option. They also test that the dry-run does not
 # write the index and that together with -u it doesn't touch the work tree.
diff --git a/t/lib-rebase.sh b/t/lib-rebase.sh
index 8ff87fb..6bd2522 100644
--- a/t/lib-rebase.sh
+++ b/t/lib-rebase.sh
@@ -1,4 +1,4 @@
-#!/bin/sh
+# Helper functions used by interactive rebase tests.
 
 # After setting the fake editor with this function, you can
 #
diff --git a/t/lib-terminal.sh b/t/lib-terminal.sh
index 737df28..9a2dca5 100644
--- a/t/lib-terminal.sh
+++ b/t/lib-terminal.sh
@@ -1,4 +1,4 @@
-#!/bin/sh
+# Helpers for terminal output tests.
 
 test_expect_success PERL 'set up terminal for tests' '
 	# Reading from the pty master seems to get stuck _sometimes_
diff --git a/t/perf/perf-lib.sh b/t/perf/perf-lib.sh
index f4eecaa..a8c9574 100644
--- a/t/perf/perf-lib.sh
+++ b/t/perf/perf-lib.sh
@@ -1,4 +1,6 @@
-#!/bin/sh
+# Performance testing framework.  Each perf script starts much like
+# a normal test script, except it sources this library instead of
+# test-lib.sh.  See t/perf/README for documentation.
 #
 # Copyright (c) 2011 Thomas Rast
 #
diff --git a/t/test-lib-functions.sh b/t/test-lib-functions.sh
index 2f79146..aeae3ca 100644
--- a/t/test-lib-functions.sh
+++ b/t/test-lib-functions.sh
@@ -1,4 +1,5 @@
-#!/bin/sh
+# Library of functions shared by all tests scripts, included by
+# test-lib.sh.
 #
 # Copyright (c) 2005 Junio C Hamano
 #
diff --git a/t/test-lib.sh b/t/test-lib.sh
index 5968157..c306bd0 100644
--- a/t/test-lib.sh
+++ b/t/test-lib.sh
@@ -1,4 +1,4 @@
-#!/bin/sh
+# Test framework for git.  See t/README for usage.
 #
 # Copyright (c) 2005 Junio C Hamano
 #
-- 
1.8.4.1

^ permalink raw reply related	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2013-11-26 21:40 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-11-25 20:51 [PATCH 0/9] War on #! lines in shell libraries Jonathan Nieder
2013-11-25 20:52 ` [PATCH 1/9] mark Windows build scripts executable Jonathan Nieder
2013-11-25 20:53 ` [PATCH 2/9] mark perl test " Jonathan Nieder
2013-11-25 20:55 ` [PATCH 3/9] mark contributed hooks executable Jonathan Nieder
2013-11-25 20:58 ` [PATCH 4/9] contrib: remove git-p4import Jonathan Nieder
2013-11-26 12:31   ` Pete Wyckoff
2013-11-25 21:00 ` [PATCH 5/9 gitk] gitk: chmod +x po2msg Jonathan Nieder
2013-11-25 21:01 ` [PATCH 6/9 git-gui] git-gui: chmod +x po2msg, windows/git-gui.sh Jonathan Nieder
2013-11-25 21:02 ` [PATCH 7/9] test: make FILEMODE a lazy prereq Jonathan Nieder
2013-11-25 21:03 ` [PATCH 8/9] test: replace shebangs with descriptions in shell libraries Jonathan Nieder
2013-11-26  5:18   ` Eric Sunshine
2013-11-26 21:39     ` [PATCH 8/9 v2] " Jonathan Nieder
2013-11-25 21:03 ` [PATCH 9/9] remove #!interpreter line from " Jonathan Nieder

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).