Merge branch 'jc/gitpm'
authorJunio C Hamano <junkio@cox.net>
Sun, 1 Oct 2006 06:38:24 +0000 (23:38 -0700)
committerJunio C Hamano <junkio@cox.net>
Sun, 1 Oct 2006 06:38:24 +0000 (23:38 -0700)
* jc/gitpm: (52 commits)
Remove -fPIC which was only needed for Git.xs
Git.pm: Kill Git.xs for now
Revert "Make it possible to set up libgit directly (instead of from the environment)"
Revert "Git.pm: Introduce fast get_object() method"
Revert "Convert git-annotate to use Git.pm"
Fix compilation with Sun CC
pass DESTDIR to the generated perl/Makefile
Eliminate Scalar::Util usage from private-Error.pm
Convert git-annotate to use Git.pm
Git.pm: Introduce fast get_object() method
Make it possible to set up libgit directly (instead of from the environment)
Work around sed and make interactions on the backslash at the end of line.
Git.pm: Introduce ident() and ident_person() methods
Convert git-send-email to use Git.pm
Git.pm: Add config() method
Use $GITPERLLIB instead of $RUNNING_GIT_TESTS and centralize @INC munging
INSTALL: a tip for running after building but without installing.
Perly Git: make sure we do test the freshly built one.
Git.pm: Don't #define around die
Git.xs: older perl do not know const char *
...

1  2 
Makefile
builtin-repo-config.c
config.mak.in
configure.ac
git-send-email.perl
t/test-lib.sh
diff --combined Makefile
index e649d72f605c4b8a7d310464319d728eba52440f,187596573faa6791650b12ad47a367c7f8a14a0d..dd3315852911ca8d40b5ca04f66c7ad277f72d74
+++ b/Makefile
@@@ -1,11 -1,6 +1,6 @@@
  # The default target of this Makefile is...
  all:
  
- # Define MOZILLA_SHA1 environment variable when running make to make use of
- # a bundled SHA1 routine coming from Mozilla. It is GPL'd and should be fast
- # on non-x86 architectures (e.g. PowerPC), while the OpenSSL version (default
- # choice) has very fast version optimized for i586.
- #
  # Define NO_OPENSSL environment variable if you do not have OpenSSL.
  # This also implies MOZILLA_SHA1.
  #
  # Define ARM_SHA1 environment variable when running make to make use of
  # a bundled SHA1 routine optimized for ARM.
  #
+ # Define MOZILLA_SHA1 environment variable when running make to make use of
+ # a bundled SHA1 routine coming from Mozilla. It is GPL'd and should be fast
+ # on non-x86 architectures (e.g. PowerPC), while the OpenSSL version (default
+ # choice) has very fast version optimized for i586.
+ #
  # Define NEEDS_SSL_WITH_CRYPTO if you need -lcrypto with -lssl (Darwin).
  #
  # Define NEEDS_LIBICONV if linking with libc is not enough (Darwin).
  # Define NO_ACCURATE_DIFF if your diff program at least sometimes misses
  # a missing newline at the end of the file.
  #
 -# Define NO_PYTHON if you want to lose all benefits of the recursive merge.
 -#
  # Define COLLISION_CHECK below if you believe that SHA1's
  # 1461501637330902918203684832716283019655932542976 hashes do not give you
  # sufficient guarantee that no collisions between objects will ever happen.
+ #
  # Define USE_NSEC below if you want git to care about sub-second file mtimes
  # and ctimes. Note that you need recent glibc (at least 2.2.4) for this, and
  # it will BREAK YOUR LOCAL DIFFS! show-diff and anything using it will likely
  # randomly break unless your underlying filesystem supports those sub-second
  # times (my ext3 doesn't).
+ #
  # Define USE_STDEV below if you want git to care about the underlying device
  # change being considered an inode change from the update-cache perspective.
  
@@@ -124,14 -126,10 +124,14 @@@ GITWEB_CONFIG = gitweb_config.per
  GITWEB_HOME_LINK_STR = projects
  GITWEB_SITENAME =
  GITWEB_PROJECTROOT = /pub/git
 +GITWEB_EXPORT_OK =
 +GITWEB_STRICT_EXPORT =
 +GITWEB_BASE_URL =
  GITWEB_LIST =
  GITWEB_HOMETEXT = indextext.html
  GITWEB_CSS = gitweb.css
  GITWEB_LOGO = git-logo.png
 +GITWEB_FAVICON = git-favicon.png
  
  export prefix bindir gitexecdir template_dir GIT_PYTHON_DIR
  
@@@ -149,6 -147,12 +149,12 @@@ SPARSE_FLAGS = -D__BIG_ENDIAN__ -D__pow
  
  ### --- END CONFIGURATION SECTION ---
  
+ # Those must not be GNU-specific; they are shared with perl/ which may
+ # be built by a different compiler. (Note that this is an artifact now
+ # but it still might be nice to keep that distinction.)
+ BASIC_CFLAGS =
+ BASIC_LDFLAGS =
  SCRIPT_SH = \
        git-bisect.sh git-branch.sh git-checkout.sh \
        git-cherry.sh git-clean.sh git-clone.sh git-commit.sh \
@@@ -172,7 -176,7 +178,7 @@@ SCRIPT_PERL = 
        git-send-email.perl git-svn.perl
  
  SCRIPT_PYTHON = \
 -      git-merge-recursive.py
 +      git-merge-recursive-old.py
  
  SCRIPTS = $(patsubst %.sh,%,$(SCRIPT_SH)) \
          $(patsubst %.perl,%,$(SCRIPT_PERL)) \
@@@ -196,12 -200,7 +202,12 @@@ PROGRAMS = 
        git-update-server-info$X \
        git-upload-pack$X git-verify-pack$X \
        git-pack-redundant$X git-var$X \
 -      git-describe$X git-merge-tree$X git-blame$X git-imap-send$X
 +      git-describe$X git-merge-tree$X git-blame$X git-imap-send$X \
 +      git-merge-recursive$X \
 +      $(EXTRA_PROGRAMS)
 +
 +# Empty...
 +EXTRA_PROGRAMS =
  
  BUILT_INS = \
        git-format-patch$X git-show$X git-whatchanged$X \
@@@ -232,8 -231,8 +238,8 @@@ LIB_FILE=libgit.
  XDIFF_LIB=xdiff/lib.a
  
  LIB_H = \
 -      blob.h cache.h commit.h csum-file.h delta.h \
 -      diff.h object.h pack.h pkt-line.h quote.h refs.h \
 +      archive.h blob.h cache.h commit.h csum-file.h delta.h grep.h \
 +      diff.h object.h pack.h pkt-line.h quote.h refs.h list-objects.h sideband.h \
        run-command.h strbuf.h tag.h tree.h git-compat-util.h revision.h \
        tree-walk.h log-tree.h dir.h path-list.h unpack-trees.h builtin.h
  
@@@ -244,22 -243,17 +250,22 @@@ DIFF_OBJS = 
  
  LIB_OBJS = \
        blob.o commit.o connect.o csum-file.o cache-tree.o base85.o \
 -      date.o diff-delta.o entry.o exec_cmd.o ident.o lockfile.o \
 -      object.o pack-check.o patch-delta.o path.o pkt-line.o \
 +      date.o diff-delta.o entry.o exec_cmd.o ident.o \
 +      interpolate.o \
 +      lockfile.o \
 +      object.o pack-check.o patch-delta.o path.o pkt-line.o sideband.o \
        quote.o read-cache.o refs.o run-command.o dir.o object-refs.o \
        server-info.o setup.o sha1_file.o sha1_name.o strbuf.o \
        tag.o tree.o usage.o config.o environment.o ctype.o copy.o \
        fetch-clone.o revision.o pager.o tree-walk.o xdiff-interface.o \
 -      alloc.o merge-file.o path-list.o help.o unpack-trees.o $(DIFF_OBJS)
 +      write_or_die.o trace.o list-objects.o grep.o \
 +      alloc.o merge-file.o path-list.o help.o unpack-trees.o $(DIFF_OBJS) \
 +      color.o wt-status.o archive-zip.o archive-tar.o
  
  BUILTIN_OBJS = \
        builtin-add.o \
        builtin-apply.o \
 +      builtin-archive.o \
        builtin-cat-file.o \
        builtin-checkout-index.o \
        builtin-check-ref-format.o \
        builtin-rev-list.o \
        builtin-rev-parse.o \
        builtin-rm.o \
 +      builtin-runstatus.o \
        builtin-show-branch.o \
        builtin-stripspace.o \
        builtin-symbolic-ref.o \
        builtin-unpack-objects.o \
        builtin-update-index.o \
        builtin-update-ref.o \
 -      builtin-upload-tar.o \
 +      builtin-upload-archive.o \
        builtin-verify-pack.o \
        builtin-write-tree.o
  
  GITLIBS = $(LIB_FILE) $(XDIFF_LIB)
LIBS = $(GITLIBS) -lz
EXTLIBS = -lz
  
  #
  # Platform specific tweaks
@@@ -324,14 -317,14 +330,14 @@@ ifeq ($(uname_S),Darwin
        NO_STRLCPY = YesPlease
        ifndef NO_FINK
                ifeq ($(shell test -d /sw/lib && echo y),y)
-                       ALL_CFLAGS += -I/sw/include
-                       ALL_LDFLAGS += -L/sw/lib
+                       BASIC_CFLAGS += -I/sw/include
+                       BASIC_LDFLAGS += -L/sw/lib
                endif
        endif
        ifndef NO_DARWIN_PORTS
                ifeq ($(shell test -d /opt/local/lib && echo y),y)
-                       ALL_CFLAGS += -I/opt/local/include
-                       ALL_LDFLAGS += -L/opt/local/lib
+                       BASIC_CFLAGS += -I/opt/local/include
+                       BASIC_LDFLAGS += -L/opt/local/lib
                endif
        endif
  endif
@@@ -344,16 -337,14 +350,16 @@@ ifeq ($(uname_S),SunOS
                NEEDS_LIBICONV = YesPlease
                NO_UNSETENV = YesPlease
                NO_SETENV = YesPlease
 +              NO_C99_FORMAT = YesPlease
        endif
        ifeq ($(uname_R),5.9)
                NO_UNSETENV = YesPlease
                NO_SETENV = YesPlease
 +              NO_C99_FORMAT = YesPlease
        endif
        INSTALL = ginstall
        TAR = gtar
-       ALL_CFLAGS += -D__EXTENSIONS__
+       BASIC_CFLAGS += -D__EXTENSIONS__
  endif
  ifeq ($(uname_O),Cygwin)
        NO_D_TYPE_IN_DIRENT = YesPlease
  endif
  ifeq ($(uname_S),FreeBSD)
        NEEDS_LIBICONV = YesPlease
-       ALL_CFLAGS += -I/usr/local/include
-       ALL_LDFLAGS += -L/usr/local/lib
+       BASIC_CFLAGS += -I/usr/local/include
+       BASIC_LDFLAGS += -L/usr/local/lib
  endif
  ifeq ($(uname_S),OpenBSD)
        NO_STRCASESTR = YesPlease
        NEEDS_LIBICONV = YesPlease
-       ALL_CFLAGS += -I/usr/local/include
-       ALL_LDFLAGS += -L/usr/local/lib
+       BASIC_CFLAGS += -I/usr/local/include
+       BASIC_LDFLAGS += -L/usr/local/lib
  endif
  ifeq ($(uname_S),NetBSD)
        ifeq ($(shell expr "$(uname_R)" : '[01]\.'),2)
                NEEDS_LIBICONV = YesPlease
        endif
-       ALL_CFLAGS += -I/usr/pkg/include
-       ALL_LDFLAGS += -L/usr/pkg/lib -Wl,-rpath,/usr/pkg/lib
+       BASIC_CFLAGS += -I/usr/pkg/include
+       BASIC_LDFLAGS += -L/usr/pkg/lib
+       ALL_LDFLAGS += -Wl,-rpath,/usr/pkg/lib
  endif
  ifeq ($(uname_S),AIX)
        NO_STRCASESTR=YesPlease
@@@ -399,9 -391,9 +406,9 @@@ ifeq ($(uname_S),IRIX64
        NO_STRLCPY = YesPlease
        NO_SOCKADDR_STORAGE=YesPlease
        SHELL_PATH=/usr/gnu/bin/bash
-       ALL_CFLAGS += -DPATH_MAX=1024
+       BASIC_CFLAGS += -DPATH_MAX=1024
        # for now, build 32-bit version
-       ALL_LDFLAGS += -L/usr/lib32
+       BASIC_LDFLAGS += -L/usr/lib32
  endif
  ifneq (,$(findstring arm,$(uname_M)))
        ARM_SHA1 = YesPlease
@@@ -423,7 -415,7 +430,7 @@@ endi
  ifndef NO_CURL
        ifdef CURLDIR
                # This is still problematic -- gcc does not always want -R.
-               ALL_CFLAGS += -I$(CURLDIR)/include
+               BASIC_CFLAGS += -I$(CURLDIR)/include
                CURL_LIBCURL = -L$(CURLDIR)/lib -R$(CURLDIR)/lib -lcurl
        else
                CURL_LIBCURL = -lcurl
@@@ -444,13 -436,13 +451,13 @@@ ifndef NO_OPENSS
        OPENSSL_LIBSSL = -lssl
        ifdef OPENSSLDIR
                # Again this may be problematic -- gcc does not always want -R.
-               ALL_CFLAGS += -I$(OPENSSLDIR)/include
+               BASIC_CFLAGS += -I$(OPENSSLDIR)/include
                OPENSSL_LINK = -L$(OPENSSLDIR)/lib -R$(OPENSSLDIR)/lib
        else
                OPENSSL_LINK =
        endif
  else
-       ALL_CFLAGS += -DNO_OPENSSL
+       BASIC_CFLAGS += -DNO_OPENSSL
        MOZILLA_SHA1 = 1
        OPENSSL_LIBSSL =
  endif
@@@ -462,32 -454,32 +469,32 @@@ endi
  ifdef NEEDS_LIBICONV
        ifdef ICONVDIR
                # Again this may be problematic -- gcc does not always want -R.
-               ALL_CFLAGS += -I$(ICONVDIR)/include
+               BASIC_CFLAGS += -I$(ICONVDIR)/include
                ICONV_LINK = -L$(ICONVDIR)/lib -R$(ICONVDIR)/lib
        else
                ICONV_LINK =
        endif
-       LIBS += $(ICONV_LINK) -liconv
+       EXTLIBS += $(ICONV_LINK) -liconv
  endif
  ifdef NEEDS_SOCKET
-       LIBS += -lsocket
+       EXTLIBS += -lsocket
        SIMPLE_LIB += -lsocket
  endif
  ifdef NEEDS_NSL
-       LIBS += -lnsl
+       EXTLIBS += -lnsl
        SIMPLE_LIB += -lnsl
  endif
  ifdef NO_D_TYPE_IN_DIRENT
-       ALL_CFLAGS += -DNO_D_TYPE_IN_DIRENT
+       BASIC_CFLAGS += -DNO_D_TYPE_IN_DIRENT
  endif
  ifdef NO_D_INO_IN_DIRENT
-       ALL_CFLAGS += -DNO_D_INO_IN_DIRENT
+       BASIC_CFLAGS += -DNO_D_INO_IN_DIRENT
  endif
  ifdef NO_C99_FORMAT
        ALL_CFLAGS += -DNO_C99_FORMAT
  endif
  ifdef NO_SYMLINK_HEAD
-       ALL_CFLAGS += -DNO_SYMLINK_HEAD
+       BASIC_CFLAGS += -DNO_SYMLINK_HEAD
  endif
  ifdef NO_STRCASESTR
        COMPAT_CFLAGS += -DNO_STRCASESTR
@@@ -501,7 -493,7 +508,7 @@@ ifdef NO_SETEN
        COMPAT_CFLAGS += -DNO_SETENV
        COMPAT_OBJS += compat/setenv.o
  endif
 -ifdef NO_SETENV
 +ifdef NO_UNSETENV
        COMPAT_CFLAGS += -DNO_UNSETENV
        COMPAT_OBJS += compat/unsetenv.o
  endif
@@@ -510,24 -502,21 +517,24 @@@ ifdef NO_MMA
        COMPAT_OBJS += compat/mmap.o
  endif
  ifdef NO_IPV6
-       ALL_CFLAGS += -DNO_IPV6
+       BASIC_CFLAGS += -DNO_IPV6
  endif
  ifdef NO_SOCKADDR_STORAGE
  ifdef NO_IPV6
-       ALL_CFLAGS += -Dsockaddr_storage=sockaddr_in
+       BASIC_CFLAGS += -Dsockaddr_storage=sockaddr_in
  else
-       ALL_CFLAGS += -Dsockaddr_storage=sockaddr_in6
+       BASIC_CFLAGS += -Dsockaddr_storage=sockaddr_in6
  endif
  endif
  ifdef NO_INET_NTOP
        LIB_OBJS += compat/inet_ntop.o
  endif
 +ifdef NO_INET_PTON
 +      LIB_OBJS += compat/inet_pton.o
 +endif
  
  ifdef NO_ICONV
-       ALL_CFLAGS += -DNO_ICONV
+       BASIC_CFLAGS += -DNO_ICONV
  endif
  
  ifdef PPC_SHA1
@@@ -543,12 -532,12 +550,12 @@@ ifdef MOZILLA_SHA
        LIB_OBJS += mozilla-sha1/sha1.o
  else
        SHA1_HEADER = <openssl/sha.h>
-       LIBS += $(LIB_4_CRYPTO)
+       EXTLIBS += $(LIB_4_CRYPTO)
  endif
  endif
  endif
  ifdef NO_ACCURATE_DIFF
-       ALL_CFLAGS += -DNO_ACCURATE_DIFF
+       BASIC_CFLAGS += -DNO_ACCURATE_DIFF
  endif
  
  # Shell quote (do not use $(call) to accommodate ancient setups);
@@@ -566,15 -555,23 +573,24 @@@ PERL_PATH_SQ = $(subst ','\'',$(PERL_PA
  PYTHON_PATH_SQ = $(subst ','\'',$(PYTHON_PATH))
  GIT_PYTHON_DIR_SQ = $(subst ','\'',$(GIT_PYTHON_DIR))
  
- ALL_CFLAGS += -DSHA1_HEADER='$(SHA1_HEADER_SQ)' $(COMPAT_CFLAGS)
+ LIBS = $(GITLIBS) $(EXTLIBS)
+ BASIC_CFLAGS += -DSHA1_HEADER='$(SHA1_HEADER_SQ)' $(COMPAT_CFLAGS)
  LIB_OBJS += $(COMPAT_OBJS)
+ ALL_CFLAGS += $(BASIC_CFLAGS)
+ ALL_LDFLAGS += $(BASIC_LDFLAGS)
  export prefix TAR INSTALL DESTDIR SHELL_PATH template_dir
  ### Build rules
  
 -all: $(ALL_PROGRAMS) $(BUILT_INS) git$X gitk gitweb/gitweb.cgi
 +all: $(ALL_PROGRAMS) $(BUILT_INS) git$X gitk gitweb/gitweb.cgi \
 +      git-merge-recur$X
  
- all:
+ all: perl/Makefile
+       $(MAKE) -C perl
        $(MAKE) -C templates
  
  strip: $(PROGRAMS) git$X
@@@ -587,9 -584,6 +603,9 @@@ git$X: git.c common-cmds.h $(BUILTIN_OB
  
  help.o: common-cmds.h
  
 +git-merge-recur$X: git-merge-recursive$X
 +      rm -f $@ && ln git-merge-recursive$X $@
 +
  $(BUILT_INS): git$X
        rm -f $@ && ln git$X $@
  
@@@ -608,9 -602,18 +624,18 @@@ $(patsubst %.sh,%,$(SCRIPT_SH)) : % : %
        chmod +x $@+
        mv $@+ $@
  
- $(patsubst %.perl,%,$(SCRIPT_PERL)) : % : %.perl
+ $(patsubst %.perl,%,$(SCRIPT_PERL)): perl/Makefile
+ $(patsubst %.perl,%,$(SCRIPT_PERL)): % : %.perl
        rm -f $@ $@+
-       sed -e '1s|#!.*perl|#!$(PERL_PATH_SQ)|' \
+       INSTLIBDIR=`$(MAKE) -C perl -s --no-print-directory instlibdir` && \
+       sed -e '1{' \
+           -e '        s|#!.*perl|#!$(PERL_PATH_SQ)|' \
+           -e '        h' \
+           -e '        s=.*=use lib (split(/:/, $$ENV{GITPERLLIB} || "@@INSTLIBDIR@@"));=' \
+           -e '        H' \
+           -e '        x' \
+           -e '}' \
+           -e 's|@@INSTLIBDIR@@|'"$$INSTLIBDIR"'|g' \
            -e 's/@@GIT_VERSION@@/$(GIT_VERSION)/g' \
            $@.perl >$@+
        chmod +x $@+
@@@ -642,14 -645,10 +667,14 @@@ gitweb/gitweb.cgi: gitweb/gitweb.per
            -e 's|++GITWEB_HOME_LINK_STR++|$(GITWEB_HOME_LINK_STR)|g' \
            -e 's|++GITWEB_SITENAME++|$(GITWEB_SITENAME)|g' \
            -e 's|++GITWEB_PROJECTROOT++|$(GITWEB_PROJECTROOT)|g' \
 +          -e 's|++GITWEB_EXPORT_OK++|$(GITWEB_EXPORT_OK)|g' \
 +          -e 's|++GITWEB_STRICT_EXPORT++|$(GITWEB_STRICT_EXPORT)|g' \
 +          -e 's|++GITWEB_BASE_URL++|$(GITWEB_BASE_URL)|g' \
            -e 's|++GITWEB_LIST++|$(GITWEB_LIST)|g' \
            -e 's|++GITWEB_HOMETEXT++|$(GITWEB_HOMETEXT)|g' \
            -e 's|++GITWEB_CSS++|$(GITWEB_CSS)|g' \
            -e 's|++GITWEB_LOGO++|$(GITWEB_LOGO)|g' \
 +          -e 's|++GITWEB_FAVICON++|$(GITWEB_FAVICON)|g' \
            $< >$@+
        chmod +x $@+
        mv $@+ $@
@@@ -740,6 -739,10 +765,10 @@@ $(XDIFF_LIB): $(XDIFF_OBJS
        rm -f $@ && $(AR) rcs $@ $(XDIFF_OBJS)
  
  
+ perl/Makefile: perl/Git.pm perl/Makefile.PL GIT-CFLAGS
+       (cd perl && $(PERL_PATH) Makefile.PL \
+               PREFIX='$(prefix_SQ)')
  doc:
        $(MAKE) -C Documentation all
  
@@@ -802,6 -805,7 +831,7 @@@ install: al
        $(INSTALL) $(ALL_PROGRAMS) '$(DESTDIR_SQ)$(gitexecdir_SQ)'
        $(INSTALL) git$X gitk '$(DESTDIR_SQ)$(bindir_SQ)'
        $(MAKE) -C templates DESTDIR='$(DESTDIR_SQ)' install
+       $(MAKE) -C perl install
        $(INSTALL) -d -m755 '$(DESTDIR_SQ)$(GIT_PYTHON_DIR_SQ)'
        $(INSTALL) $(PYMODULES) '$(DESTDIR_SQ)$(GIT_PYTHON_DIR_SQ)'
        if test 'z$(bindir_SQ)' != 'z$(gitexecdir_SQ)'; \
@@@ -872,7 -876,9 +902,9 @@@ clean
        rm -f $(htmldocs).tar.gz $(manpages).tar.gz
        rm -f gitweb/gitweb.cgi
        $(MAKE) -C Documentation/ clean
-       $(MAKE) -C templates clean
+       [ ! -f perl/Makefile ] || $(MAKE) -C perl/ clean || $(MAKE) -C perl/ clean
+       rm -f perl/ppport.h perl/Makefile.old
+       $(MAKE) -C templates/ clean
        $(MAKE) -C t/ clean
        rm -f GIT-VERSION-FILE GIT-CFLAGS
  
@@@ -886,8 -892,7 +918,8 @@@ check-docs:
        do \
                case "$$v" in \
                git-merge-octopus | git-merge-ours | git-merge-recursive | \
 -              git-merge-resolve | git-merge-stupid | \
 +              git-merge-resolve | git-merge-stupid | git-merge-recur | \
 +              git-merge-recursive-old | \
                git-ssh-pull | git-ssh-push ) continue ;; \
                esac ; \
                test -f "Documentation/$$v.txt" || \
diff --combined builtin-repo-config.c
index 9cf12d32e5bc0be8034b16551336afee1e7d3a00,1d9373977d94f0391c068a5ba13a96e561e21d0b..f60cee1dc54497d8ba00069a56e14b431f6a0852
@@@ -5,14 -5,14 +5,14 @@@
  static const char git_config_set_usage[] =
  "git-repo-config [ --bool | --int ] [--get | --get-all | --get-regexp | --replace-all | --unset | --unset-all] name [value [value_regex]] | --list";
  
 -static char* key = NULL;
 -static regex_t* key_regexp = NULL;
 -static regex_t* regexp = NULL;
 -static int show_keys = 0;
 -static int use_key_regexp = 0;
 -static int do_all = 0;
 -static int do_not_match = 0;
 -static int seen = 0;
 +static char *key;
 +static regex_t *key_regexp;
 +static regex_t *regexp;
 +static int show_keys;
 +static int use_key_regexp;
 +static int do_all;
 +static int do_not_match;
 +static int seen;
  static enum { T_RAW, T_INT, T_BOOL } type = T_RAW;
  
  static int show_all_config(const char *key_, const char *value_)
@@@ -72,19 -72,19 +72,19 @@@ static int get_value(const char* key_, 
                const char *home = getenv("HOME");
                local = getenv("GIT_CONFIG_LOCAL");
                if (!local)
 -                      local = repo_config = strdup(git_path("config"));
 +                      local = repo_config = xstrdup(git_path("config"));
                if (home)
 -                      global = strdup(mkpath("%s/.gitconfig", home));
 +                      global = xstrdup(mkpath("%s/.gitconfig", home));
        }
  
 -      key = strdup(key_);
 +      key = xstrdup(key_);
        for (tl=key+strlen(key)-1; tl >= key && *tl != '.'; --tl)
                *tl = tolower(*tl);
        for (tl=key; *tl && *tl != '.'; ++tl)
                *tl = tolower(*tl);
  
        if (use_key_regexp) {
 -              key_regexp = (regex_t*)malloc(sizeof(regex_t));
 +              key_regexp = (regex_t*)xmalloc(sizeof(regex_t));
                if (regcomp(key_regexp, key, REG_EXTENDED)) {
                        fprintf(stderr, "Invalid key pattern: %s\n", key_);
                        goto free_strings;
@@@ -97,7 -97,7 +97,7 @@@
                        regex_++;
                }
  
 -              regexp = (regex_t*)malloc(sizeof(regex_t));
 +              regexp = (regex_t*)xmalloc(sizeof(regex_t));
                if (regcomp(regexp, regex_, REG_EXTENDED)) {
                        fprintf(stderr, "Invalid pattern: %s\n", regex_);
                        goto free_strings;
        if (do_all)
                ret = !seen;
        else
-               ret =  (seen == 1) ? 0 : 1;
+               ret = (seen == 1) ? 0 : seen > 1 ? 2 : 1;
  
  free_strings:
 -      if (repo_config)
 -              free(repo_config);
 -      if (global)
 -              free(global);
 +      free(repo_config);
 +      free(global);
        return ret;
  }
  
diff --combined config.mak.in
index 6d20673b24552c505664c8d6983eb9ceb1b106d8,fecae802d1397e7b7d97c5edd5ca4359e363e8cf..1cafa19ed4e4b9ecb683e4bc6c4aaa3ac3322b74
@@@ -2,6 -2,7 +2,7 @@@
  # @configure_input@
  
  CC = @CC@
+ CFLAGS = @CFLAGS@
  AR = @AR@
  TAR = @TAR@
  #INSTALL = @INSTALL@          # needs install-sh or install.sh in sources
@@@ -37,5 -38,4 +38,5 @@@ NO_C99_FORMAT=@NO_C99_FORMAT
  NO_STRCASESTR=@NO_STRCASESTR@
  NO_STRLCPY=@NO_STRLCPY@
  NO_SETENV=@NO_SETENV@
 +NO_ICONV=@NO_ICONV@
  
diff --combined configure.ac
index b1a5833b40b905ae07b27c414833394ef63b0c99,819282691f2c6ac9ac622fb8005e0720325763f0..cff5722eb9927ec652e3db731fc033508bc44ef2
@@@ -75,6 -75,7 +75,6 @@@ GIT_ARG_SET_PATH(shell
  # Define PERL_PATH to provide path to Perl.
  GIT_ARG_SET_PATH(perl)
  #
 -# Define NO_PYTHON if you want to lose all benefits of the recursive merge.
  # Define PYTHON_PATH to provide path to Python.
  AC_ARG_WITH(python,[AS_HELP_STRING([--with-python=PATH], [provide PATH to python])
  AS_HELP_STRING([--without-python], [don't use python scripts])],
@@@ -94,11 -95,12 +94,11 @@@ AC_SUBST(PYTHON_PATH
  ## Checks for programs.
  AC_MSG_NOTICE([CHECKS for programs])
  #
- AC_PROG_CC
+ AC_PROG_CC([cc gcc])
  #AC_PROG_INSTALL              # needs install-sh or install.sh in sources
  AC_CHECK_TOOL(AR, ar, :)
  AC_CHECK_PROGS(TAR, [gtar tar])
  #
 -# Define NO_PYTHON if you want to lose all benefits of the recursive merge.
  # Define PYTHON_PATH to provide path to Python.
  if test -z "$NO_PYTHON"; then
        if test -z "$PYTHON_PATH"; then
@@@ -141,15 -143,10 +141,15 @@@ AC_CHECK_LIB([expat], [XML_ParserCreate
  AC_SUBST(NO_EXPAT)
  #
  # Define NEEDS_LIBICONV if linking with libc is not enough (Darwin).
 +# Define NO_ICONV if neither libc nor libiconv support iconv.
  AC_CHECK_LIB([c], [iconv],
 -[NEEDS_LIBICONV=],
 -[NEEDS_LIBICONV=YesPlease])
 +      [NEEDS_LIBICONV=],
 +      AC_CHECK_LIB([iconv], [iconv],
 +              [NEEDS_LIBICONV=YesPlease],
 +              [NO_ICONV=YesPlease]))
  AC_SUBST(NEEDS_LIBICONV)
 +AC_SUBST(NO_ICONV)
 +test -n "$NEEDS_LIBICONV" && LIBS="$LIBS -liconv"
  #
  # Define NEEDS_SOCKET if linking with libc is not enough (SunOS,
  # Patrick Mauritz).
@@@ -207,8 -204,8 +207,8 @@@ AC_SUBST(NO_IPV6
  # do not support the 'size specifiers' introduced by C99, namely ll, hh,
  # j, z, t. (representing long long int, char, intmax_t, size_t, ptrdiff_t).
  # some C compilers supported these specifiers prior to C99 as an extension.
 -AC_CACHE_CHECK(whether formatted IO functions support C99 size specifiers,
 - ac_cv_c_c99_format,
 +AC_CACHE_CHECK([whether formatted IO functions support C99 size specifiers],
 + [ac_cv_c_c99_format],
  [# Actually git uses only %z (%zu) in alloc.c, and %t (%td) in mktag.c
  AC_RUN_IFELSE(
        [AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT],
@@@ -263,16 -260,6 +263,16 @@@ AC_SUBST(NO_SETENV
  # Enable it on Windows.  By default, symrefs are still used.
  #
  # Define WITH_OWN_SUBPROCESS_PY if you want to use with python 2.3.
 +AC_CACHE_CHECK([for subprocess.py],
 + [ac_cv_python_has_subprocess_py],
 +[if $PYTHON_PATH -c 'import subprocess' 2>/dev/null; then
 +      ac_cv_python_has_subprocess_py=yes
 +else
 +      ac_cv_python_has_subprocess_py=no
 +fi])
 +if test $ac_cv_python_has_subprocess_py != yes; then
 +      GIT_CONF_APPEND_LINE([WITH_OWN_SUBPROCESS_PY=YesPlease])
 +fi
  #
  # Define NO_ACCURATE_DIFF if your diff program at least sometimes misses
  # a missing newline at the end of the file.
@@@ -342,16 -329,6 +342,16 @@@ GIT_PARSE_WITH(expat)
  # library directories by defining CFLAGS and LDFLAGS appropriately.
  #
  # Define NO_MMAP if you want to avoid mmap.
 +#
 +# Define NO_ICONV if your libc does not properly support iconv.
 +AC_ARG_WITH(iconv,
 +AS_HELP_STRING([--without-iconv],
 +[if your architecture doesn't properly support iconv])
 +AS_HELP_STRING([--with-iconv=PATH],
 +[PATH is prefix for libiconv library and headers])
 +AS_HELP_STRING([],
 +[used only if you need linking with libiconv]),
 +GIT_PARSE_WITH(iconv))
  
  ## --enable-FEATURE[=ARG] and --disable-FEATURE
  #
diff --combined git-send-email.perl
index 746c525079317491e35827f331922e17e5fbd089,1e2777c8e2bb27f092e987ffde532cb441bd06a1..4a20310841b69280a21ac4c79d95ce9ce3ea7df4
@@@ -21,6 -21,7 +21,7 @@@ use warnings
  use Term::ReadLine;
  use Getopt::Long;
  use Data::Dumper;
+ use Git;
  
  package FakeTerm;
  sub new {
@@@ -92,6 -93,7 +93,7 @@@ my $smtp_server
  # Example reply to:
  #$initial_reply_to = ''; #<20050203173208.GA23964@foobar.com>';
  
+ my $repo = Git->repository();
  my $term = eval {
        new Term::ReadLine 'git-send-email';
  };
@@@ -132,33 -134,12 +134,12 @@@ foreach my $entry (@bcclist) 
  
  # Now, let's fill any that aren't set in with defaults:
  
- sub gitvar {
-     my ($var) = @_;
-     my $fh;
-     my $pid = open($fh, '-|');
-     die "$!" unless defined $pid;
-     if (!$pid) {
-       exec('git-var', $var) or die "$!";
-     }
-     my ($val) = <$fh>;
-     close $fh or die "$!";
-     chomp($val);
-     return $val;
- }
- sub gitvar_ident {
-     my ($name) = @_;
-     my $val = gitvar($name);
-     my @field = split(/\s+/, $val);
-     return join(' ', @field[0...(@field-3)]);
- }
- my ($author) = gitvar_ident('GIT_AUTHOR_IDENT');
- my ($committer) = gitvar_ident('GIT_COMMITTER_IDENT');
+ my ($author) = $repo->ident_person('author');
+ my ($committer) = $repo->ident_person('committer');
  
  my %aliases;
chomp(my @alias_files = `git-repo-config --get-all sendemail.aliasesfile`);
chomp(my $aliasfiletype = `git-repo-config sendemail.aliasfiletype`);
my @alias_files = $repo->config('sendemail.aliasesfile');
my $aliasfiletype = $repo->config('sendemail.aliasfiletype');
  my %parse_alias = (
        # multiline formats can be supported in the future
        mutt => sub { my $fh = shift; while (<$fh>) {
                }}}
  );
  
- if (@alias_files && defined $parse_alias{$aliasfiletype}) {
+ if (@alias_files and $aliasfiletype and defined $parse_alias{$aliasfiletype}) {
        foreach my $file (@alias_files) {
                open my $fh, '<', $file or die "opening $file: $!\n";
                $parse_alias{$aliasfiletype}->($fh);
@@@ -425,10 -406,7 +406,7 @@@ sub send_messag
        my $date = format_2822_time($time++);
        my $gitversion = '@@GIT_VERSION@@';
        if ($gitversion =~ m/..GIT_VERSION../) {
-           $gitversion = `git --version`;
-           chomp $gitversion;
-           # keep only what's after the last space
-           $gitversion =~ s/^.* //;
+           $gitversion = Git::version();
        }
  
        my $header = "From: $from
@@@ -510,7 -488,7 +488,7 @@@ foreach my $t (@files) 
                                        if ($2 eq $from) {
                                                next if ($suppress_from);
                                        }
 -                                      else {
 +                                      elsif ($1 eq 'From') {
                                                $author_not_sender = $2;
                                        }
                                        printf("(mbox) Adding cc: %s from line '%s'\n",
diff --combined t/test-lib.sh
index 0fe2718845fa8ad66dfa850ac2921e33b10b51c1,b6d119af953eeba0a83d09543884dca600c850b4..b523fef339da2ac21d7edd750cc6d5431a70fe52
@@@ -28,21 -28,13 +28,21 @@@ unset GIT_DI
  unset GIT_EXTERNAL_DIFF
  unset GIT_INDEX_FILE
  unset GIT_OBJECT_DIRECTORY
 -unset GIT_TRACE
  unset SHA1_FILE_DIRECTORIES
  unset SHA1_FILE_DIRECTORY
  export GIT_AUTHOR_EMAIL GIT_AUTHOR_NAME
  export GIT_COMMITTER_EMAIL GIT_COMMITTER_NAME
  export EDITOR VISUAL
  
 +case $(echo $GIT_TRACE |tr "[A-Z]" "[a-z]") in
 +      1|2|true)
 +              echo "* warning: Some tests will not work if GIT_TRACE" \
 +                      "is set as to trace on STDERR ! *"
 +              echo "* warning: Please set GIT_TRACE to something" \
 +                      "other than 1, 2 or true ! *"
 +              ;;
 +esac
 +
  # Each test should start with something like this, after copyright notices:
  #
  # test_description='Description of this test...
@@@ -211,13 -203,15 +211,15 @@@ export PATH GIT_EXEC_PAT
  PYTHON=`sed -e '1{
        s/^#!//
        q
 -}' ../git-merge-recursive` || {
 +}' ../git-merge-recursive-old` || {
        error "You haven't built things yet, have you?"
  }
  "$PYTHON" -c 'import subprocess' 2>/dev/null || {
        PYTHONPATH=$(pwd)/../compat
        export PYTHONPATH
  }
+ GITPERLLIB=$(pwd)/../perl/blib/lib:$(pwd)/../perl/blib/arch/auto/Git
+ export GITPERLLIB
  test -d ../templates/blt || {
        error "You haven't built things yet, have you?"
  }