Merge branch 'master' of git://repo.or.cz/alt-git into jn/autodep
authorJonathan Nieder <jrnieder@gmail.com>
Tue, 26 Jan 2010 16:08:44 +0000 (10:08 -0600)
committerJonathan Nieder <jrnieder@gmail.com>
Tue, 26 Jan 2010 16:08:44 +0000 (10:08 -0600)
* 'master' of git://repo.or.cz/alt-git: (384 commits)
am: fix patch format detection for Thunderbird "Save As" emails
t0022: replace non-portable literal CR
tests: consolidate CR removal/addition functions
commit-tree: remove unused #define
t5541-http-push: make grep expression check for one line only
rebase: replace antiquated sed invocation
Add test-run-command to .gitignore
git_connect: use use_shell instead of explicit "sh", "-c"
gitweb.js: Workaround for IE8 bug
Make test numbers unique
Windows: Remove dependency on pthreadGC2.dll
Documentation: move away misplaced 'push --upstream' description
Documentation: add missing :: in config.txt
pull: re-fix command line generation
Documentation: merge: use MERGE_HEAD to refer to the remote branch
Documentation: simplify How Merge Works
Documentation: merge: add a section about fast-forward
Documentation: emphasize when git merge terminates early
Documentation: merge: add an overview
Documentation: merge: move merge strategy list to end
...

Conflicts:
Makefile

1  2 
Makefile
diff --combined Makefile
index 98810b246b426a1bc000e4aeb7e5bfc716e1a1fb,af08c8f452d24d4fdbed9c08dfb3a31e318d7672..6f0f64753d176f41299df6cbcf38e7de69b0c36a
+++ b/Makefile
@@@ -168,6 -168,8 +168,8 @@@ all:
  #
  # Define NO_PERL if you do not want Perl scripts or libraries at all.
  #
+ # Define NO_PYTHON if you do not want Python scripts or libraries at all.
+ #
  # Define NO_TCLTK if you do not want Tcl/Tk GUI.
  #
  # The TCL_PATH variable governs the location of the Tcl interpreter
  # is a simplified version of the merge sort used in glibc. This is
  # recommended if Git triggers O(n^2) behavior in your platform's qsort().
  #
- # Define NO_EXTERNAL_GREP if you don't want "git grep" to ever call
- # your external grep (e.g., if your system lacks grep, if its grep is
- # broken, or spawning external process is slower than built-in grep git has).
- #
  # Define UNRELIABLE_FSTAT if your system's fstat does not return the same
  # information on a not yet closed file that lstat would return for the same
  # file after it was closed.
  #   DEFAULT_EDITOR='$GIT_FALLBACK_EDITOR',
  #   DEFAULT_EDITOR='"C:\Program Files\Vim\gvim.exe" --nofork'
  
- GIT-VERSION-FILE: .FORCE-GIT-VERSION-FILE
+ GIT-VERSION-FILE: FORCE
        @$(SHELL_PATH) ./GIT-VERSION-GEN
  -include GIT-VERSION-FILE
  
@@@ -341,8 -339,9 +339,9 @@@ LIB_H 
  LIB_OBJS =
  PROGRAMS =
  SCRIPT_PERL =
+ SCRIPT_PYTHON =
  SCRIPT_SH =
--TEST_PROGRAMS =
++TEST_PROGRAMS_NEED_X =
  
  SCRIPT_SH += git-am.sh
  SCRIPT_SH += git-bisect.sh
@@@ -379,6 -378,7 +378,7 @@@ SCRIPT_PERL += git-svn.per
  
  SCRIPTS = $(patsubst %.sh,%,$(SCRIPT_SH)) \
          $(patsubst %.perl,%,$(SCRIPT_PERL)) \
+         $(patsubst %.py,%,$(SCRIPT_PYTHON)) \
          git-instaweb
  
  # Empty...
@@@ -387,33 -387,12 +387,28 @@@ EXTRA_PROGRAMS 
  # ... and all the rest that could be moved out of bindir to gitexecdir
  PROGRAMS += $(EXTRA_PROGRAMS)
  PROGRAMS += git-fast-import$X
- PROGRAMS += git-hash-object$X
  PROGRAMS += git-imap-send$X
- PROGRAMS += git-index-pack$X
- PROGRAMS += git-merge-index$X
- PROGRAMS += git-merge-tree$X
- PROGRAMS += git-mktag$X
- PROGRAMS += git-pack-redundant$X
- PROGRAMS += git-patch-id$X
  PROGRAMS += git-shell$X
  PROGRAMS += git-show-index$X
- PROGRAMS += git-unpack-file$X
  PROGRAMS += git-upload-pack$X
- PROGRAMS += git-var$X
  PROGRAMS += git-http-backend$X
  
- TEST_PROGRAMS += test-chmtime$X
- TEST_PROGRAMS += test-ctype$X
- TEST_PROGRAMS += test-date$X
- TEST_PROGRAMS += test-delta$X
- TEST_PROGRAMS += test-dump-cache-tree$X
- TEST_PROGRAMS += test-genrandom$X
- TEST_PROGRAMS += test-match-trees$X
- TEST_PROGRAMS += test-parse-options$X
- TEST_PROGRAMS += test-path-utils$X
- TEST_PROGRAMS += test-sha1$X
- TEST_PROGRAMS += test-sigchain$X
++TEST_PROGRAMS_NEED_X += test-chmtime
++TEST_PROGRAMS_NEED_X += test-ctype
++TEST_PROGRAMS_NEED_X += test-date
++TEST_PROGRAMS_NEED_X += test-delta
++TEST_PROGRAMS_NEED_X += test-dump-cache-tree
++TEST_PROGRAMS_NEED_X += test-genrandom
++TEST_PROGRAMS_NEED_X += test-match-trees
++TEST_PROGRAMS_NEED_X += test-parse-options
++TEST_PROGRAMS_NEED_X += test-path-utils
++TEST_PROGRAMS_NEED_X += test-run-command
++TEST_PROGRAMS_NEED_X += test-sha1
++TEST_PROGRAMS_NEED_X += test-sigchain
++TEST_PROGRAMS_NEED_X += test-index-version
++
++TEST_PROGRAMS := $(patsubst %,%$X,$(TEST_PROGRAMS_NEED_X))
 +
  # List built-in command $C whose implementation cmd_$C() is not in
  # builtin-$C.o but is linked in as part of some other command.
  BUILT_INS += $(patsubst builtin-%.o,git-%$X,$(BUILTIN_OBJS))
@@@ -439,6 -418,15 +434,15 @@@ ALL_PROGRAMS = $(PROGRAMS) $(SCRIPTS
  # what 'all' will build but not install in gitexecdir
  OTHER_PROGRAMS = git$X
  
+ # what test wrappers are needed and 'install' will install, in bindir
+ BINDIR_PROGRAMS_NEED_X += git
+ BINDIR_PROGRAMS_NEED_X += git-upload-pack
+ BINDIR_PROGRAMS_NEED_X += git-receive-pack
+ BINDIR_PROGRAMS_NEED_X += git-upload-archive
+ BINDIR_PROGRAMS_NEED_X += git-shell
+ BINDIR_PROGRAMS_NO_X += git-cvsserver
  # Set paths to tools early so that they can be used for version tests.
  ifndef SHELL_PATH
        SHELL_PATH = /bin/sh
@@@ -446,8 -434,12 +450,12 @@@ endi
  ifndef PERL_PATH
        PERL_PATH = /usr/bin/perl
  endif
+ ifndef PYTHON_PATH
+       PYTHON_PATH = /usr/bin/python
+ endif
  
  export PERL_PATH
+ export PYTHON_PATH
  
  LIB_FILE=libgit.a
  XDIFF_LIB=xdiff/lib.a
@@@ -459,18 -451,17 +467,19 @@@ LIB_H += blob.
  LIB_H += builtin.h
  LIB_H += cache.h
  LIB_H += cache-tree.h
 +LIB_H += color.h
  LIB_H += commit.h
  LIB_H += compat/bswap.h
  LIB_H += compat/cygwin.h
  LIB_H += compat/mingw.h
+ LIB_H += compat/win32/pthread.h
  LIB_H += csum-file.h
  LIB_H += decorate.h
  LIB_H += delta.h
  LIB_H += diffcore.h
  LIB_H += diff.h
  LIB_H += dir.h
 +LIB_H += exec_cmd.h
  LIB_H += fsck.h
  LIB_H += git-compat-util.h
  LIB_H += graph.h
@@@ -497,6 -488,7 +506,7 @@@ LIB_H += reflog-walk.
  LIB_H += refs.h
  LIB_H += remote.h
  LIB_H += rerere.h
+ LIB_H += resolve-undo.h
  LIB_H += revision.h
  LIB_H += run-command.h
  LIB_H += sha1-lookup.h
@@@ -512,8 -504,7 +522,8 @@@ LIB_H += tree-walk.
  LIB_H += unpack-trees.h
  LIB_H += userdiff.h
  LIB_H += utf8.h
 -LIB_H += wt-status.h
 +LIB_H += xdiff-interface.h
 +LIB_H += xdiff/xdiff.h
  
  LIB_OBJS += abspath.o
  LIB_OBJS += advice.o
@@@ -559,6 -550,7 +569,7 @@@ LIB_OBJS += graph.
  LIB_OBJS += grep.o
  LIB_OBJS += hash.o
  LIB_OBJS += help.o
+ LIB_OBJS += hex.o
  LIB_OBJS += ident.o
  LIB_OBJS += levenshtein.o
  LIB_OBJS += list-objects.o
@@@ -593,6 -585,7 +604,7 @@@ LIB_OBJS += refs.
  LIB_OBJS += remote.o
  LIB_OBJS += replace_object.o
  LIB_OBJS += rerere.o
+ LIB_OBJS += resolve-undo.o
  LIB_OBJS += revision.o
  LIB_OBJS += run-command.o
  LIB_OBJS += server-info.o
@@@ -657,7 -650,9 +669,9 @@@ BUILTIN_OBJS += builtin-for-each-ref.
  BUILTIN_OBJS += builtin-fsck.o
  BUILTIN_OBJS += builtin-gc.o
  BUILTIN_OBJS += builtin-grep.o
+ BUILTIN_OBJS += builtin-hash-object.o
  BUILTIN_OBJS += builtin-help.o
+ BUILTIN_OBJS += builtin-index-pack.o
  BUILTIN_OBJS += builtin-init-db.o
  BUILTIN_OBJS += builtin-log.o
  BUILTIN_OBJS += builtin-ls-files.o
@@@ -668,13 -663,18 +682,18 @@@ BUILTIN_OBJS += builtin-mailsplit.
  BUILTIN_OBJS += builtin-merge.o
  BUILTIN_OBJS += builtin-merge-base.o
  BUILTIN_OBJS += builtin-merge-file.o
+ BUILTIN_OBJS += builtin-merge-index.o
  BUILTIN_OBJS += builtin-merge-ours.o
  BUILTIN_OBJS += builtin-merge-recursive.o
+ BUILTIN_OBJS += builtin-merge-tree.o
+ BUILTIN_OBJS += builtin-mktag.o
  BUILTIN_OBJS += builtin-mktree.o
  BUILTIN_OBJS += builtin-mv.o
  BUILTIN_OBJS += builtin-name-rev.o
  BUILTIN_OBJS += builtin-pack-objects.o
+ BUILTIN_OBJS += builtin-pack-redundant.o
  BUILTIN_OBJS += builtin-pack-refs.o
+ BUILTIN_OBJS += builtin-patch-id.o
  BUILTIN_OBJS += builtin-prune-packed.o
  BUILTIN_OBJS += builtin-prune.o
  BUILTIN_OBJS += builtin-push.o
@@@ -697,17 -697,17 +716,19 @@@ BUILTIN_OBJS += builtin-stripspace.
  BUILTIN_OBJS += builtin-symbolic-ref.o
  BUILTIN_OBJS += builtin-tag.o
  BUILTIN_OBJS += builtin-tar-tree.o
+ BUILTIN_OBJS += builtin-unpack-file.o
  BUILTIN_OBJS += builtin-unpack-objects.o
  BUILTIN_OBJS += builtin-update-index.o
  BUILTIN_OBJS += builtin-update-ref.o
  BUILTIN_OBJS += builtin-update-server-info.o
  BUILTIN_OBJS += builtin-upload-archive.o
+ BUILTIN_OBJS += builtin-var.o
  BUILTIN_OBJS += builtin-verify-pack.o
  BUILTIN_OBJS += builtin-verify-tag.o
  BUILTIN_OBJS += builtin-write-tree.o
  
 +TEST_OBJS := $(patsubst test-%$X,test-%.o,$(TEST_PROGRAMS))
 +
  GITLIBS = $(LIB_FILE) $(XDIFF_LIB)
  EXTLIBS =
  
@@@ -794,7 -794,6 +815,6 @@@ ifeq ($(uname_S),SunOS
        NO_MKDTEMP = YesPlease
        NO_MKSTEMPS = YesPlease
        NO_REGEX = YesPlease
-       NO_EXTERNAL_GREP = YesPlease
        THREADED_DELTA_SEARCH = YesPlease
        ifeq ($(uname_R),5.7)
                NEEDS_RESOLV = YesPlease
@@@ -913,7 -912,6 +933,6 @@@ ifeq ($(uname_S),IRIX
        # NO_MMAP.  If you suspect that your compiler is not affected by this
        # issue, comment out the NO_MMAP statement.
        NO_MMAP = YesPlease
-       NO_EXTERNAL_GREP = UnfortunatelyYes
        SNPRINTF_RETURNS_BOGUS = YesPlease
        SHELL_PATH = /usr/gnu/bin/bash
        NEEDS_LIBGEN = YesPlease
@@@ -933,7 -931,6 +952,6 @@@ ifeq ($(uname_S),IRIX64
        # NO_MMAP.  If you suspect that your compiler is not affected by this
        # issue, comment out the NO_MMAP statement.
        NO_MMAP = YesPlease
-       NO_EXTERNAL_GREP = UnfortunatelyYes
        SNPRINTF_RETURNS_BOGUS = YesPlease
        SHELL_PATH=/usr/gnu/bin/bash
        NEEDS_LIBGEN = YesPlease
@@@ -985,17 -982,19 +1003,19 @@@ ifeq ($(uname_S),Windows
        OBJECT_CREATION_USES_RENAMES = UnfortunatelyNeedsTo
        NO_REGEX = YesPlease
        NO_CURL = YesPlease
-       NO_PTHREADS = YesPlease
+       NO_PYTHON = YesPlease
        BLK_SHA1 = YesPlease
+       THREADED_DELTA_SEARCH = YesPlease
  
        CC = compat/vcbuild/scripts/clink.pl
        AR = compat/vcbuild/scripts/lib.pl
        CFLAGS =
        BASIC_CFLAGS = -nologo -I. -I../zlib -Icompat/vcbuild -Icompat/vcbuild/include -DWIN32 -D_CONSOLE -DHAVE_STRING_H -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_DEPRECATE
-       COMPAT_OBJS = compat/msvc.o compat/fnmatch/fnmatch.o compat/winansi.o
-       COMPAT_CFLAGS = -D__USE_MINGW_ACCESS -DNOGDI -DHAVE_STRING_H -DHAVE_ALLOCA_H -Icompat -Icompat/fnmatch -Icompat/regex -Icompat/fnmatch -DSTRIP_EXTENSION=\".exe\"
+       COMPAT_OBJS = compat/msvc.o compat/fnmatch/fnmatch.o compat/winansi.o compat/win32/pthread.o
+       COMPAT_CFLAGS = -D__USE_MINGW_ACCESS -DNOGDI -DHAVE_STRING_H -DHAVE_ALLOCA_H -Icompat -Icompat/fnmatch -Icompat/regex -Icompat/fnmatch -Icompat/win32 -DSTRIP_EXTENSION=\".exe\"
        BASIC_LDFLAGS = -IGNORE:4217 -IGNORE:4049 -NOLOGO -SUBSYSTEM:CONSOLE -NODEFAULTLIB:MSVCRT.lib
        EXTLIBS = advapi32.lib shell32.lib wininet.lib ws2_32.lib
+       PTHREAD_LIBS =
        lib =
  ifndef DEBUG
        BASIC_CFLAGS += -GL -Os -MT
@@@ -1035,11 -1034,15 +1055,15 @@@ ifneq (,$(findstring MINGW,$(uname_S))
        UNRELIABLE_FSTAT = UnfortunatelyYes
        OBJECT_CREATION_USES_RENAMES = UnfortunatelyNeedsTo
        NO_REGEX = YesPlease
+       NO_PYTHON = YesPlease
        BLK_SHA1 = YesPlease
-       COMPAT_CFLAGS += -D__USE_MINGW_ACCESS -DNOGDI -Icompat -Icompat/fnmatch
+       THREADED_DELTA_SEARCH = YesPlease
+       COMPAT_CFLAGS += -D__USE_MINGW_ACCESS -DNOGDI -Icompat -Icompat/fnmatch -Icompat/win32
        COMPAT_CFLAGS += -DSTRIP_EXTENSION=\".exe\"
-       COMPAT_OBJS += compat/mingw.o compat/fnmatch/fnmatch.o compat/winansi.o
+       COMPAT_OBJS += compat/mingw.o compat/fnmatch/fnmatch.o compat/winansi.o \
+               compat/win32/pthread.o
        EXTLIBS += -lws2_32
+       PTHREAD_LIBS =
        X = .exe
  ifneq (,$(wildcard ../THIS_IS_MSYSGIT))
        htmldir=doc/git/html/
        EXTLIBS += /mingw/lib/libz.a
        NO_R_TO_GCC_LINKER = YesPlease
        INTERNAL_QSORT = YesPlease
-       THREADED_DELTA_SEARCH = YesPlease
  else
        NO_CURL = YesPlease
-       NO_PTHREADS = YesPlease
  endif
  endif
  
@@@ -1099,6 -1100,9 +1121,9 @@@ endi
  
  ifdef NO_CURL
        BASIC_CFLAGS += -DNO_CURL
+       REMOTE_CURL_PRIMARY =
+       REMOTE_CURL_ALIASES =
+       REMOTE_CURL_NAMES =
  else
        ifdef CURLDIR
                # Try "-Wl,-rpath=$(CURLDIR)/$(lib)" in such a case.
        else
                CURL_LIBCURL = -lcurl
        endif
-       PROGRAMS += git-remote-curl$X git-http-fetch$X
+       REMOTE_CURL_PRIMARY = git-remote-http$X
+       REMOTE_CURL_ALIASES = git-remote-https$X git-remote-ftp$X git-remote-ftps$X
+       REMOTE_CURL_NAMES = $(REMOTE_CURL_PRIMARY) $(REMOTE_CURL_ALIASES)
+       PROGRAMS += $(REMOTE_CURL_NAMES) git-http-fetch$X
        curl_check := $(shell (echo 070908; curl-config --vernum) | sort -r | sed -ne 2p)
        ifeq "$(curl_check)" "070908"
                ifndef NO_EXPAT
@@@ -1298,12 -1305,10 +1326,12 @@@ endi
  ifdef BLK_SHA1
        SHA1_HEADER = "block-sha1/sha1.h"
        LIB_OBJS += block-sha1/sha1.o
 +      LIB_H += block-sha1/sha1.h
  else
  ifdef PPC_SHA1
        SHA1_HEADER = "ppc/sha1.h"
        LIB_OBJS += ppc/sha1.o ppc/sha1ppc.o
 +      LIB_H += ppc/sha1.h
  else
        SHA1_HEADER = <openssl/sha.h>
        EXTLIBS += $(LIB_4_CRYPTO)
@@@ -1342,9 -1347,6 +1370,6 @@@ endi
  ifdef DIR_HAS_BSD_GROUP_SEMANTICS
        COMPAT_CFLAGS += -DDIR_HAS_BSD_GROUP_SEMANTICS
  endif
- ifdef NO_EXTERNAL_GREP
-       BASIC_CFLAGS += -DNO_EXTERNAL_GREP
- endif
  ifdef UNRELIABLE_FSTAT
        BASIC_CFLAGS += -DUNRELIABLE_FSTAT
  endif
@@@ -1366,6 -1368,10 +1391,10 @@@ ifeq ($(PERL_PATH),
  NO_PERL=NoThanks
  endif
  
+ ifeq ($(PYTHON_PATH),)
+ NO_PYTHON=NoThanks
+ endif
  QUIET_SUBDIR0  = +$(MAKE) -C # space to separate -C and subdir
  QUIET_SUBDIR1  =
  
@@@ -1413,6 -1419,7 +1442,7 @@@ prefix_SQ = $(subst ','\'',$(prefix)
  
  SHELL_PATH_SQ = $(subst ','\'',$(SHELL_PATH))
  PERL_PATH_SQ = $(subst ','\'',$(PERL_PATH))
+ PYTHON_PATH_SQ = $(subst ','\'',$(PYTHON_PATH))
  TCLTK_PATH_SQ = $(subst ','\'',$(TCLTK_PATH))
  
  LIBS = $(GITLIBS) $(EXTLIBS)
@@@ -1459,6 -1466,9 +1489,9 @@@ ifndef NO_TCLT
  endif
  ifndef NO_PERL
        $(QUIET_SUBDIR0)perl $(QUIET_SUBDIR1) PERL_PATH='$(PERL_PATH_SQ)' prefix='$(prefix_SQ)' all
+ endif
+ ifndef NO_PYTHON
+       $(QUIET_SUBDIR0)git_remote_helpers $(QUIET_SUBDIR1) PYTHON_PATH='$(PYTHON_PATH_SQ)' prefix='$(prefix_SQ)' all
  endif
        $(QUIET_SUBDIR0)templates $(QUIET_SUBDIR1)
  
@@@ -1470,20 -1480,19 +1503,19 @@@ shell_compatibility_test: please_set_SH
  strip: $(PROGRAMS) git$X
        $(STRIP) $(STRIP_OPTS) $(PROGRAMS) git$X
  
- git.o: git.c common-cmds.h GIT-CFLAGS
-       $(QUIET_CC)$(CC) -DGIT_VERSION='"$(GIT_VERSION)"' \
-               '-DGIT_HTML_PATH="$(htmldir_SQ)"' \
-               $(ALL_CFLAGS) -o $@ -c $(filter %.c,$^)
+ git.o: common-cmds.h
+ git.s git.o: ALL_CFLAGS += -DGIT_VERSION='"$(GIT_VERSION)"' \
+       '-DGIT_HTML_PATH="$(htmldir_SQ)"'
  
  git$X: git.o $(BUILTIN_OBJS) $(GITLIBS)
        $(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ git.o \
                $(BUILTIN_OBJS) $(ALL_LDFLAGS) $(LIBS)
  
- builtin-help.o: builtin-help.c common-cmds.h GIT-CFLAGS
      $(QUIET_CC)$(CC) -o $*.o -c $(ALL_CFLAGS) \
-               '-DGIT_HTML_PATH="$(htmldir_SQ)"' \
-               '-DGIT_MAN_PATH="$(mandir_SQ)"' \
-               '-DGIT_INFO_PATH="$(infodir_SQ)"' $<
+ builtin-help.o: common-cmds.h
builtin-help.s builtin-help.o: ALL_CFLAGS += \
+       '-DGIT_HTML_PATH="$(htmldir_SQ)"' \
+       '-DGIT_MAN_PATH="$(mandir_SQ)"' \
+       '-DGIT_INFO_PATH="$(infodir_SQ)"'
  
  $(BUILT_INS): git$X
        $(QUIET_BUILT_IN)$(RM) $@ && \
@@@ -1586,11 -1595,41 +1618,41 @@@ $(patsubst %.perl,%,$(SCRIPT_PERL)) git
        mv $@+ $@
  endif # NO_PERL
  
  ifdef JSMIN
  gitweb/gitweb.min.js: gitweb/gitweb.js
        $(QUIET_GEN)$(JSMIN) <$< >$@
  endif # JSMIN
  
+ ifndef NO_PYTHON
+ $(patsubst %.py,%,$(SCRIPT_PYTHON)): GIT-CFLAGS
+ $(patsubst %.py,%,$(SCRIPT_PYTHON)): % : %.py
+       $(QUIET_GEN)$(RM) $@ $@+ && \
+       INSTLIBDIR=`MAKEFLAGS= $(MAKE) -C git_remote_helpers -s \
+               --no-print-directory prefix='$(prefix_SQ)' DESTDIR='$(DESTDIR_SQ)' \
+               instlibdir` && \
+       sed -e '1{' \
+           -e '        s|#!.*python|#!$(PYTHON_PATH_SQ)|' \
+           -e '}' \
+           -e 's|^import sys.*|&; \\\
+                  import os; \\\
+                  sys.path[0] = os.environ.has_key("GITPYTHONLIB") and \\\
+                                os.environ["GITPYTHONLIB"] or \\\
+                                "@@INSTLIBDIR@@"|' \
+           -e 's|@@INSTLIBDIR@@|'"$$INSTLIBDIR"'|g' \
+           $@.py >$@+ && \
+       chmod +x $@+ && \
+       mv $@+ $@
+ else # NO_PYTHON
+ $(patsubst %.py,%,$(SCRIPT_PYTHON)): % : unimplemented.sh
+       $(QUIET_GEN)$(RM) $@ $@+ && \
+       sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \
+           -e 's|@@REASON@@|NO_PYTHON=$(NO_PYTHON)|g' \
+           unimplemented.sh >$@+ && \
+       chmod +x $@+ && \
+       mv $@+ $@
+ endif # NO_PYTHON
  configure: configure.ac
        $(QUIET_GEN)$(RM) $@ $<+ && \
        sed -e 's/@@GIT_VERSION@@/$(GIT_VERSION)/g' \
@@@ -1606,30 -1645,26 +1668,25 @@@ git.o git.spec 
  
  %.o: %.c GIT-CFLAGS
        $(QUIET_CC)$(CC) -o $*.o -c $(ALL_CFLAGS) $<
- %.s: %.c GIT-CFLAGS
+ %.s: %.c GIT-CFLAGS FORCE
        $(QUIET_CC)$(CC) -S $(ALL_CFLAGS) $<
- %.o: %.S
+ %.o: %.S GIT-CFLAGS
        $(QUIET_CC)$(CC) -o $*.o -c $(ALL_CFLAGS) $<
  
- exec_cmd.o: exec_cmd.c GIT-CFLAGS
-       $(QUIET_CC)$(CC) -o $*.o -c $(ALL_CFLAGS) \
-               '-DGIT_EXEC_PATH="$(gitexecdir_SQ)"' \
-               '-DBINDIR="$(bindir_relative_SQ)"' \
-               '-DPREFIX="$(prefix_SQ)"' \
-               $<
+ exec_cmd.s exec_cmd.o: ALL_CFLAGS += \
+       '-DGIT_EXEC_PATH="$(gitexecdir_SQ)"' \
+       '-DBINDIR="$(bindir_relative_SQ)"' \
+       '-DPREFIX="$(prefix_SQ)"'
  
- builtin-init-db.o: builtin-init-db.c GIT-CFLAGS
-       $(QUIET_CC)$(CC) -o $*.o -c $(ALL_CFLAGS) -DDEFAULT_GIT_TEMPLATE_DIR='"$(template_dir_SQ)"' $<
+ builtin-init-db.s builtin-init-db.o: ALL_CFLAGS += \
+       -DDEFAULT_GIT_TEMPLATE_DIR='"$(template_dir_SQ)"'
  
- config.o: config.c GIT-CFLAGS
-       $(QUIET_CC)$(CC) -o $*.o -c $(ALL_CFLAGS) -DETC_GITCONFIG='"$(ETC_GITCONFIG_SQ)"' $<
+ config.s config.o: ALL_CFLAGS += -DETC_GITCONFIG='"$(ETC_GITCONFIG_SQ)"'
  
- http.o: http.c GIT-CFLAGS
-       $(QUIET_CC)$(CC) -o $*.o -c $(ALL_CFLAGS) -DGIT_USER_AGENT='"git/$(GIT_VERSION)"' $<
+ http.s http.o: ALL_CFLAGS += -DGIT_USER_AGENT='"git/$(GIT_VERSION)"'
  
  ifdef NO_EXPAT
- http-walker.o: http-walker.c GIT-CFLAGS
-       $(QUIET_CC)$(CC) -o $*.o -c $(ALL_CFLAGS) -DNO_EXPAT $<
 -http-walker.o: http.h
+ http-walker.s http-walker.o: ALL_CFLAGS += -DNO_EXPAT
  endif
  
  git-%$X: %.o $(GITLIBS)
@@@ -1639,9 -1674,9 +1696,9 @@@ git-imap-send$X: imap-send.o $(GITLIBS
        $(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
                $(LIBS) $(OPENSSL_LINK) $(OPENSSL_LIBSSL)
  
 -http.o http-walker.o http-push.o: http.h
 +http.o http-walker.o http-push.o remote-curl.o: http.h
  
 -http.o http-walker.o: $(LIB_H)
 +http.o http-walker.o remote-curl.o: $(LIB_H)
  
  git-http-fetch$X: revision.o http.o http-walker.o http-fetch.o $(GITLIBS)
        $(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
@@@ -1650,31 -1685,26 +1707,37 @@@ git-http-push$X: revision.o http.o http
        $(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
                $(LIBS) $(CURL_LIBCURL) $(EXPAT_LIBEXPAT)
  
- git-remote-curl$X: remote-curl.o http.o http-walker.o $(GITLIBS)
+ $(REMOTE_CURL_ALIASES): $(REMOTE_CURL_PRIMARY)
+       $(QUIET_LNCP)$(RM) $@ && \
+       ln $< $@ 2>/dev/null || \
+       ln -s $< $@ 2>/dev/null || \
+       cp $< $@
+ $(REMOTE_CURL_PRIMARY): remote-curl.o http.o http-walker.o $(GITLIBS)
        $(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
                $(LIBS) $(CURL_LIBCURL) $(EXPAT_LIBEXPAT)
  
  $(LIB_OBJS) $(BUILTIN_OBJS): $(LIB_H)
 -$(patsubst git-%$X,%.o,$(PROGRAMS)) git.o: $(LIB_H) $(wildcard */*.h)
 -builtin-revert.o wt-status.o: wt-status.h
 +$(patsubst git-%$X,%.o,$(PROGRAMS)) $(TEST_OBJS) git.o: $(LIB_H)
 +builtin-branch.o builtin-checkout.o builtin-clone.o builtin-reset.o branch.o: branch.h
 +builtin-bundle.o bundle.o transport.o: bundle.h
 +builtin-bisect--helper.o builtin-rev-list.o bisect.o: bisect.h
 +builtin-clone.o builtin-fetch-pack.o transport.o: fetch-pack.h
 +builtin-send-pack.o transport.o: send-pack.h
 +builtin-log.o builtin-shortlog.o: shortlog.h
 +builtin-prune.o builtin-reflog.o reachable.o: reachable.h
 +builtin-commit.o builtin-revert.o wt-status.o: wt-status.h
 +builtin-tar-tree.o archive-tar.o: tar.h
 +builtin-pack-objects.o: thread-utils.h
 +http-fetch.o http-walker.o remote-curl.o transport.o walker.o: walker.h
  
  $(LIB_FILE): $(LIB_OBJS)
        $(QUIET_AR)$(RM) $@ && $(AR) rcs $@ $(LIB_OBJS)
  
  XDIFF_OBJS=xdiff/xdiffi.o xdiff/xprepare.o xdiff/xutils.o xdiff/xemit.o \
        xdiff/xmerge.o xdiff/xpatience.o
 -$(XDIFF_OBJS): xdiff/xinclude.h xdiff/xmacros.h xdiff/xdiff.h xdiff/xtypes.h \
 +xdiff-interface.o $(XDIFF_OBJS): \
 +      xdiff/xinclude.h xdiff/xmacros.h xdiff/xdiff.h xdiff/xtypes.h \
        xdiff/xutils.h xdiff/xprepare.h xdiff/xdiffi.h xdiff/xemit.h
  
  $(XDIFF_LIB): $(XDIFF_OBJS)
@@@ -1712,7 -1742,7 +1775,7 @@@ cscope
  TRACK_CFLAGS = $(subst ','\'',$(ALL_CFLAGS)):\
               $(bindir_SQ):$(gitexecdir_SQ):$(template_dir_SQ):$(prefix_SQ)
  
- GIT-CFLAGS: .FORCE-GIT-CFLAGS
+ GIT-CFLAGS: FORCE
        @FLAGS='$(TRACK_CFLAGS)'; \
            if test x"$$FLAGS" != x"`cat GIT-CFLAGS 2>/dev/null`" ; then \
                echo 1>&2 "    * new build flags or prefix"; \
  # We need to apply sq twice, once to protect from the shell
  # that runs GIT-BUILD-OPTIONS, and then again to protect it
  # and the first level quoting from the shell that runs "echo".
- GIT-BUILD-OPTIONS: .FORCE-GIT-BUILD-OPTIONS
+ GIT-BUILD-OPTIONS: FORCE
        @echo SHELL_PATH=\''$(subst ','\'',$(SHELL_PATH_SQ))'\' >$@
        @echo PERL_PATH=\''$(subst ','\'',$(PERL_PATH_SQ))'\' >>$@
        @echo TAR=\''$(subst ','\'',$(subst ','\'',$(TAR)))'\' >>$@
        @echo NO_CURL=\''$(subst ','\'',$(subst ','\'',$(NO_CURL)))'\' >>$@
        @echo NO_PERL=\''$(subst ','\'',$(subst ','\'',$(NO_PERL)))'\' >>$@
+       @echo NO_PYTHON=\''$(subst ','\'',$(subst ','\'',$(NO_PYTHON)))'\' >>$@
  
  ### Detect Tck/Tk interpreter path changes
  ifndef NO_TCLTK
  TRACK_VARS = $(subst ','\'',-DTCLTK_PATH='$(TCLTK_PATH_SQ)')
  
- GIT-GUI-VARS: .FORCE-GIT-GUI-VARS
+ GIT-GUI-VARS: FORCE
        @VARS='$(TRACK_VARS)'; \
            if test x"$$VARS" != x"`cat $@ 2>/dev/null`" ; then \
                echo 1>&2 "    * new Tcl/Tk interpreter location"; \
                echo "$$VARS" >$@; \
              fi
- .PHONY: .FORCE-GIT-GUI-VARS
  endif
  
--### Testing rules
 -
 -TEST_PROGRAMS_NEED_X += test-chmtime
 -TEST_PROGRAMS_NEED_X += test-ctype
 -TEST_PROGRAMS_NEED_X += test-date
 -TEST_PROGRAMS_NEED_X += test-delta
 -TEST_PROGRAMS_NEED_X += test-dump-cache-tree
 -TEST_PROGRAMS_NEED_X += test-genrandom
 -TEST_PROGRAMS_NEED_X += test-match-trees
 -TEST_PROGRAMS_NEED_X += test-parse-options
 -TEST_PROGRAMS_NEED_X += test-path-utils
 -TEST_PROGRAMS_NEED_X += test-run-command
 -TEST_PROGRAMS_NEED_X += test-sha1
 -TEST_PROGRAMS_NEED_X += test-sigchain
 -TEST_PROGRAMS_NEED_X += test-index-version
 -
 -TEST_PROGRAMS = $(patsubst %,%$X,$(TEST_PROGRAMS_NEED_X))
 -
+ test_bindir_programs := $(patsubst %,bin-wrappers/%,$(BINDIR_PROGRAMS_NEED_X) $(BINDIR_PROGRAMS_NO_X) $(TEST_PROGRAMS_NEED_X))
  
- all:: $(TEST_PROGRAMS)
+ all:: $(TEST_PROGRAMS) $(test_bindir_programs)
+ bin-wrappers/%: wrap-for-bin.sh
+       @mkdir -p bin-wrappers
+       $(QUIET_GEN)sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \
+            -e 's|@@BUILD_DIR@@|$(shell pwd)|' \
+            -e 's|@@PROG@@|$(@F)|' < $< > $@ && \
+       chmod +x $@
  
  # GNU make supports exporting all variables by "export" without parameters.
  # However, the environment gets quite big, and some programs have problems
  
  export NO_SVN_TESTS
  
++### Testing rules
++
  test: all
        $(MAKE) -C t/ all
  
@@@ -1764,7 -1818,9 +1835,7 @@@ test-delta$X: diff-delta.o patch-delta.
  
  test-parse-options$X: parse-options.o
  
 -test-parse-options.o: parse-options.h
 -
 -.PRECIOUS: $(patsubst test-%$X,test-%.o,$(TEST_PROGRAMS))
 +.PRECIOUS: $(TEST_OBJS)
  
  test-%$X: test-%.o $(GITLIBS)
        $(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) $(LIBS)
@@@ -1804,15 -1860,20 +1875,20 @@@ endi
  gitexec_instdir_SQ = $(subst ','\'',$(gitexec_instdir))
  export gitexec_instdir
  
+ install_bindir_programs := $(patsubst %,%$X,$(BINDIR_PROGRAMS_NEED_X)) $(BINDIR_PROGRAMS_NO_X)
  install: all
        $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(bindir_SQ)'
        $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
        $(INSTALL) $(ALL_PROGRAMS) '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
-       $(INSTALL) git$X git-upload-pack$X git-receive-pack$X git-upload-archive$X git-shell$X git-cvsserver '$(DESTDIR_SQ)$(bindir_SQ)'
+       $(INSTALL) $(install_bindir_programs) '$(DESTDIR_SQ)$(bindir_SQ)'
        $(MAKE) -C templates DESTDIR='$(DESTDIR_SQ)' install
  ifndef NO_PERL
        $(MAKE) -C perl prefix='$(prefix_SQ)' DESTDIR='$(DESTDIR_SQ)' install
  endif
+ ifndef NO_PYTHON
+       $(MAKE) -C git_remote_helpers prefix='$(prefix_SQ)' DESTDIR='$(DESTDIR_SQ)' install
+ endif
  ifndef NO_TCLTK
        $(MAKE) -C gitk-git install
        $(MAKE) -C git-gui gitexecdir='$(gitexec_instdir_SQ)' install
@@@ -1820,6 -1881,7 +1896,7 @@@ endi
  ifneq (,$X)
        $(foreach p,$(patsubst %$X,%,$(filter %$X,$(ALL_PROGRAMS) $(BUILT_INS) git$X)), test '$(DESTDIR_SQ)$(gitexec_instdir_SQ)/$p' -ef '$(DESTDIR_SQ)$(gitexec_instdir_SQ)/$p$X' || $(RM) '$(DESTDIR_SQ)$(gitexec_instdir_SQ)/$p';)
  endif
        bindir=$$(cd '$(DESTDIR_SQ)$(bindir_SQ)' && pwd) && \
        execdir=$$(cd '$(DESTDIR_SQ)$(gitexec_instdir_SQ)' && pwd) && \
        { test "$$bindir/" = "$$execdir/" || \
                ln -s "git$X" "$$execdir/$$p" 2>/dev/null || \
                cp "$$execdir/git$X" "$$execdir/$$p" || exit; \
          done; } && \
+       { for p in $(REMOTE_CURL_ALIASES); do \
+               $(RM) "$$execdir/$$p" && \
+               ln "$$execdir/git-remote-http$X" "$$execdir/$$p" 2>/dev/null || \
+               ln -s "git-remote-http$X" "$$execdir/$$p" 2>/dev/null || \
+               cp "$$execdir/git-remote-http$X" "$$execdir/$$p" || exit; \
+         done; } && \
        ./check_bindir "z$$bindir" "z$$execdir" "$$bindir/git-add$X"
  
  install-doc:
@@@ -1919,6 -1987,7 +2002,7 @@@ clean
                $(LIB_FILE) $(XDIFF_LIB)
        $(RM) $(ALL_PROGRAMS) $(BUILT_INS) git$X
        $(RM) $(TEST_PROGRAMS)
+       $(RM) -r bin-wrappers
        $(RM) *.spec *.pyc *.pyo */*.pyc */*.pyo common-cmds.h TAGS tags cscope*
        $(RM) -r autom4te.cache
        $(RM) config.log config.mak.autogen config.mak.append config.status config.cache
  ifndef NO_PERL
        $(RM) gitweb/gitweb.cgi
        $(MAKE) -C perl clean
+ endif
+ ifndef NO_PYTHON
+       $(MAKE) -C git_remote_helpers clean
  endif
        $(MAKE) -C templates/ clean
        $(MAKE) -C t/ clean
@@@ -1940,8 -2012,7 +2027,7 @@@ endi
  
  .PHONY: all install clean strip
  .PHONY: shell_compatibility_test please_set_SHELL_PATH_to_a_more_modern_shell
- .PHONY: .FORCE-GIT-VERSION-FILE TAGS tags cscope .FORCE-GIT-CFLAGS
- .PHONY: .FORCE-GIT-BUILD-OPTIONS
+ .PHONY: FORCE TAGS tags cscope
  
  ### Check documentation
  #