Merge branch 'nd/wildmatch'
authorJunio C Hamano <gitster@pobox.com>
Thu, 10 Jan 2013 21:47:15 +0000 (13:47 -0800)
committerJunio C Hamano <gitster@pobox.com>
Thu, 10 Jan 2013 21:47:20 +0000 (13:47 -0800)
Allows pathname patterns in .gitignore and .gitattributes files
with double-asterisks "foo/**/bar" to match any number of directory
hierarchies.

* nd/wildmatch:
wildmatch: replace variable 'special' with better named ones
compat/fnmatch: respect NO_FNMATCH* even on glibc
wildmatch: fix "**" special case
t3070: Disable some failing fnmatch tests
test-wildmatch: avoid Windows path mangling
Support "**" wildcard in .gitignore and .gitattributes
wildmatch: make /**/ match zero or more directories
wildmatch: adjust "**" behavior
wildmatch: fix case-insensitive matching
wildmatch: remove static variable force_lower_case
wildmatch: make wildmatch's return value compatible with fnmatch
t3070: disable unreliable fnmatch tests
Integrate wildmatch to git
wildmatch: follow Git's coding convention
wildmatch: remove unnecessary functions
Import wildmatch from rsync
ctype: support iscntrl, ispunct, isxdigit and isprint
ctype: make sane_ctype[] const array

Conflicts:
Makefile

1  2 
.gitignore
Documentation/gitignore.txt
Makefile
compat/fnmatch/fnmatch.c
dir.c
git-compat-util.h
t/t0003-attributes.sh
diff --combined .gitignore
index 8e8dc275db9bcc1155e42daea5a6589b4802bc9c,1153a4bb3acdefd15016bee55fd47b35d91f0a2b..aa258a6bcfe105cdb872c6d77cd9bd19c84e8dc5
@@@ -1,10 -1,7 +1,10 @@@
  /GIT-BUILD-OPTIONS
  /GIT-CFLAGS
  /GIT-LDFLAGS
 -/GIT-GUI-VARS
 +/GIT-PREFIX
 +/GIT-PYTHON-VARS
 +/GIT-SCRIPT-DEFINES
 +/GIT-USER-AGENT
  /GIT-VERSION-FILE
  /bin-wrappers/
  /git
@@@ -34,7 -31,6 +34,7 @@@
  /git-commit-tree
  /git-config
  /git-count-objects
 +/git-credential
  /git-credential-cache
  /git-credential-cache--daemon
  /git-credential-store
  /git-remote-ftps
  /git-remote-fd
  /git-remote-ext
 -/git-remote-testgit
 +/git-remote-testpy
 +/git-remote-testsvn
  /git-repack
  /git-replace
  /git-repo-config
  /git-whatchanged
  /git-write-tree
  /git-core-*/?*
 -/gitk-git/gitk-wish
  /gitweb/GITWEB-BUILD-OPTIONS
  /gitweb/gitweb.cgi
  /gitweb/static/gitweb.js
  /gitweb/static/gitweb.min.*
  /test-chmtime
 -/test-credential
  /test-ctype
  /test-date
  /test-delta
  /test-run-command
  /test-sha1
  /test-sigchain
 +/test-string-list
  /test-subprocess
  /test-svn-fe
+ /test-wildmatch
  /common-cmds.h
  *.tar.gz
  *.dsc
index 1b82fe1969ed1cf965d946178a423771dd3cfe5f,d4747cee4165ebbbcb199fb66cba5f394b81066d..91a6438031949d83600abc791676bbf0397a0ddc
@@@ -41,24 -41,16 +41,24 @@@ precedence, the last matching pattern d
     variable 'core.excludesfile'.
  
  Which file to place a pattern in depends on how the pattern is meant to
 -be used. Patterns which should be version-controlled and distributed to
 -other repositories via clone (i.e., files that all developers will want
 -to ignore) should go into a `.gitignore` file. Patterns which are
 -specific to a particular repository but which do not need to be shared
 -with other related repositories (e.g., auxiliary files that live inside
 -the repository but are specific to one user's workflow) should go into
 -the `$GIT_DIR/info/exclude` file.  Patterns which a user wants git to
 -ignore in all situations (e.g., backup or temporary files generated by
 -the user's editor of choice) generally go into a file specified by
 -`core.excludesfile` in the user's `~/.gitconfig`.
 +be used.
 +
 + * Patterns which should be version-controlled and distributed to
 +   other repositories via clone (i.e., files that all developers will want
 +   to ignore) should go into a `.gitignore` file.
 +
 + * Patterns which are
 +   specific to a particular repository but which do not need to be shared
 +   with other related repositories (e.g., auxiliary files that live inside
 +   the repository but are specific to one user's workflow) should go into
 +   the `$GIT_DIR/info/exclude` file.
 +
 + * Patterns which a user wants git to
 +   ignore in all situations (e.g., backup or temporary files generated by
 +   the user's editor of choice) generally go into a file specified by
 +   `core.excludesfile` in the user's `~/.gitconfig`. Its default value is
 +   $XDG_CONFIG_HOME/git/ignore. If $XDG_CONFIG_HOME is either not set or
 +   empty, $HOME/.config/git/ignore is used instead.
  
  The underlying git plumbing tools, such as
  'git ls-files' and 'git read-tree', read
@@@ -74,15 -66,11 +74,15 @@@ PATTERN FORMA
     for readability.
  
   - A line starting with # serves as a comment.
 +   Put a backslash ("`\`") in front of the first hash for patterns
 +   that begin with a hash.
  
 - - An optional prefix '!' which negates the pattern; any
 + - An optional prefix "`!`" which negates the pattern; any
     matching file excluded by a previous pattern will become
     included again.  If a negated pattern matches, this will
     override lower precedence patterns sources.
 +   Put a backslash ("`\`") in front of the first "`!`" for patterns
 +   that begin with a literal "`!`", for example, "`\!important!.txt`".
  
   - If the pattern ends with a slash, it is removed for the
     purpose of the following description, but it would only find
     For example, "/{asterisk}.c" matches "cat-file.c" but not
     "mozilla-sha1/sha1.c".
  
+ Two consecutive asterisks ("`**`") in patterns matched against
+ full pathname may have special meaning:
+  - A leading "`**`" followed by a slash means match in all
+    directories. For example, "`**/foo`" matches file or directory
+    "`foo`" anywhere, the same as pattern "`foo`". "**/foo/bar"
+    matches file or directory "`bar`" anywhere that is directly
+    under directory "`foo`".
+  - A trailing "/**" matches everything inside. For example,
+    "abc/**" matches all files inside directory "abc", relative
+    to the location of the `.gitignore` file, with infinite depth.
+  - A slash followed by two consecutive asterisks then a slash
+    matches zero or more directories. For example, "`a/**/b`"
+    matches "`a/b`", "`a/x/b`", "`a/x/y/b`" and so on.
+  - Other consecutive asterisks are considered invalid.
  NOTES
  -----
  
diff --combined Makefile
index cd0664accb3c862354042de3b719b2ab925cd053,bc868d15485e0d65bcf44982df6323bc42e75a48..f37fb240cc11a7dc22b423cb2e09571035e237c9
+++ b/Makefile
@@@ -74,14 -74,10 +74,14 @@@ all:
  # Define NO_D_TYPE_IN_DIRENT if your platform defines DT_UNKNOWN but lacks
  # d_type in struct dirent (Cygwin 1.5, fixed in Cygwin 1.7).
  #
 +# Define HAVE_STRINGS_H if you have strings.h and need it for strcasecmp.
 +#
  # Define NO_STRCASESTR if you don't have strcasestr.
  #
  # Define NO_MEMMEM if you don't have memmem.
  #
 +# Define NO_GETPAGESIZE if you don't have getpagesize.
 +#
  # Define NO_STRLCPY if you don't have strlcpy.
  #
  # Define NO_STRTOUMAX if you don't have both strtoimax and strtoumax in the
@@@ -94,8 -90,6 +94,8 @@@
  #
  # Define NO_MKDTEMP if you don't have mkdtemp in the C library.
  #
 +# Define MKDIR_WO_TRAILING_SLASH if your mkdir() can't deal with trailing slash.
 +#
  # Define NO_MKSTEMPS if you don't have mkstemps in the C library.
  #
  # Define NO_STRTOK_R if you don't have strtok_r in the C library.
  #
  # Define NEEDS_LIBICONV if linking with libc is not enough (Darwin).
  #
 +# Define NEEDS_LIBINTL_BEFORE_LIBICONV if you need libintl before libiconv.
 +#
 +# Define NO_INTPTR_T if you don't have intptr_t nor uintptr_t.
 +#
 +# Define NO_UINTMAX_T if you don't have uintmax_t.
 +#
  # Define NEEDS_SOCKET if linking with libc is not enough (SunOS,
  # Patrick Mauritz).
  #
  #
  # Define NO_MMAP if you want to avoid mmap.
  #
 +# Define NO_SYS_POLL_H if you don't have sys/poll.h.
 +#
 +# Define NO_POLL if you do not have or don't want to use poll().
 +# This also implies NO_SYS_POLL_H.
 +#
 +# Define NEEDS_SYS_PARAM_H if you need to include sys/param.h to compile,
 +# *PLEASE* REPORT to git@vger.kernel.org if your platform needs this;
 +# we want to know more about the issue.
 +#
  # Define NO_PTHREADS if you do not have or do not want to use Pthreads.
  #
  # Define NO_PREAD if you have a problem with pread() system call (e.g.
  # cygwin1.dll before v1.5.22).
  #
 +# Define NO_SETITIMER if you don't have setitimer()
 +#
 +# Define NO_STRUCT_ITIMERVAL if you don't have struct itimerval
 +# This also implies NO_SETITIMER
 +#
  # Define NO_THREAD_SAFE_PREAD if your pread() implementation is not
  # thread-safe. (e.g. compat/pread.c or cygwin)
  #
  # Define NO_ST_BLOCKS_IN_STRUCT_STAT if your platform does not have st_blocks
  # field that counts the on-disk footprint in 512-byte blocks.
  #
 -# Define ASCIIDOC7 if you want to format documentation with AsciiDoc 7
 -#
  # Define DOCBOOK_XSL_172 if you want to format man pages with DocBook XSL v1.72
  # (not v1.73 or v1.71).
  #
  # the diff algorithm.  It gives a nice speedup if your processor has
  # fast unaligned word loads.  Does NOT work on big-endian systems!
  # Enabled by default on x86_64.
 +#
 +# Define GIT_USER_AGENT if you want to change how git identifies itself during
 +# network interactions.  The default is "git/$(GIT_VERSION)".
 +#
 +# Define DEFAULT_HELP_FORMAT to "man", "info" or "html"
 +# (defaults to "man") if you want to have a different default when
 +# "git help" is called without a parameter specifying the format.
  
  GIT-VERSION-FILE: FORCE
        @$(SHELL_PATH) ./GIT-VERSION-GEN
@@@ -382,7 -351,7 +382,7 @@@ htmldir = share/doc/git-do
  ETC_GITCONFIG = $(sysconfdir)/gitconfig
  ETC_GITATTRIBUTES = $(sysconfdir)/gitattributes
  lib = lib
 -# DESTDIR=
 +# DESTDIR =
  pathsep = :
  
  export prefix bindir sharedir sysconfdir gitwebdir localedir
@@@ -422,9 -391,12 +422,9 @@@ BUILTIN_OBJS 
  BUILT_INS =
  COMPAT_CFLAGS =
  COMPAT_OBJS =
 -XDIFF_H =
  XDIFF_OBJS =
 -VCSSVN_H =
  VCSSVN_OBJS =
 -VCSSVN_TEST_OBJS =
 -MISC_H =
 +GENERATED_H =
  EXTRA_CPPFLAGS =
  LIB_H =
  LIB_OBJS =
@@@ -478,7 -450,7 +478,7 @@@ SCRIPT_PERL += git-relink.per
  SCRIPT_PERL += git-send-email.perl
  SCRIPT_PERL += git-svn.perl
  
 -SCRIPT_PYTHON += git-remote-testgit.py
 +SCRIPT_PYTHON += git-remote-testpy.py
  SCRIPT_PYTHON += git-p4.py
  
  SCRIPTS = $(patsubst %.sh,%,$(SCRIPT_SH)) \
@@@ -503,7 -475,6 +503,7 @@@ PROGRAM_OBJS += sh-i18n--envsubst.
  PROGRAM_OBJS += shell.o
  PROGRAM_OBJS += show-index.o
  PROGRAM_OBJS += upload-pack.o
 +PROGRAM_OBJS += remote-testsvn.o
  
  # Binary suffix, set to .exe for Windows builds
  X =
  PROGRAMS += $(patsubst %.o,git-%$X,$(PROGRAM_OBJS))
  
  TEST_PROGRAMS_NEED_X += test-chmtime
 -TEST_PROGRAMS_NEED_X += test-credential
  TEST_PROGRAMS_NEED_X += test-ctype
  TEST_PROGRAMS_NEED_X += test-date
  TEST_PROGRAMS_NEED_X += test-delta
@@@ -529,9 -501,9 +529,10 @@@ TEST_PROGRAMS_NEED_X += test-run-comman
  TEST_PROGRAMS_NEED_X += test-scrap-cache-tree
  TEST_PROGRAMS_NEED_X += test-sha1
  TEST_PROGRAMS_NEED_X += test-sigchain
 +TEST_PROGRAMS_NEED_X += test-string-list
  TEST_PROGRAMS_NEED_X += test-subprocess
  TEST_PROGRAMS_NEED_X += test-svn-fe
+ TEST_PROGRAMS_NEED_X += test-wildmatch
  
  TEST_PROGRAMS = $(patsubst %,%$X,$(TEST_PROGRAMS_NEED_X))
  
@@@ -583,51 -555,58 +584,51 @@@ endi
  export PERL_PATH
  export PYTHON_PATH
  
 -LIB_FILE=libgit.a
 -XDIFF_LIB=xdiff/lib.a
 -VCSSVN_LIB=vcs-svn/lib.a
 -
 -XDIFF_H += xdiff/xinclude.h
 -XDIFF_H += xdiff/xmacros.h
 -XDIFF_H += xdiff/xdiff.h
 -XDIFF_H += xdiff/xtypes.h
 -XDIFF_H += xdiff/xutils.h
 -XDIFF_H += xdiff/xprepare.h
 -XDIFF_H += xdiff/xdiffi.h
 -XDIFF_H += xdiff/xemit.h
 -
 -VCSSVN_H += vcs-svn/line_buffer.h
 -VCSSVN_H += vcs-svn/sliding_window.h
 -VCSSVN_H += vcs-svn/repo_tree.h
 -VCSSVN_H += vcs-svn/fast_export.h
 -VCSSVN_H += vcs-svn/svndiff.h
 -VCSSVN_H += vcs-svn/svndump.h
 -
 -MISC_H += bisect.h
 -MISC_H += branch.h
 -MISC_H += bundle.h
 -MISC_H += common-cmds.h
 -MISC_H += fetch-pack.h
 -MISC_H += reachable.h
 -MISC_H += send-pack.h
 -MISC_H += shortlog.h
 -MISC_H += tar.h
 -MISC_H += thread-utils.h
 -MISC_H += url.h
 -MISC_H += walker.h
 -MISC_H += wt-status.h
 +LIB_FILE = libgit.a
 +XDIFF_LIB = xdiff/lib.a
 +VCSSVN_LIB = vcs-svn/lib.a
 +
 +LIB_H += xdiff/xinclude.h
 +LIB_H += xdiff/xmacros.h
 +LIB_H += xdiff/xdiff.h
 +LIB_H += xdiff/xtypes.h
 +LIB_H += xdiff/xutils.h
 +LIB_H += xdiff/xprepare.h
 +LIB_H += xdiff/xdiffi.h
 +LIB_H += xdiff/xemit.h
 +
 +LIB_H += vcs-svn/line_buffer.h
 +LIB_H += vcs-svn/sliding_window.h
 +LIB_H += vcs-svn/repo_tree.h
 +LIB_H += vcs-svn/fast_export.h
 +LIB_H += vcs-svn/svndiff.h
 +LIB_H += vcs-svn/svndump.h
 +
 +GENERATED_H += common-cmds.h
  
  LIB_H += advice.h
  LIB_H += archive.h
  LIB_H += argv-array.h
  LIB_H += attr.h
 +LIB_H += bisect.h
  LIB_H += blob.h
 +LIB_H += branch.h
  LIB_H += builtin.h
  LIB_H += bulk-checkin.h
 -LIB_H += cache.h
 +LIB_H += bundle.h
  LIB_H += cache-tree.h
 +LIB_H += cache.h
  LIB_H += color.h
 +LIB_H += column.h
  LIB_H += commit.h
  LIB_H += compat/bswap.h
  LIB_H += compat/cygwin.h
  LIB_H += compat/mingw.h
  LIB_H += compat/obstack.h
 +LIB_H += compat/poll/poll.h
 +LIB_H += compat/precompose_utf8.h
  LIB_H += compat/terminal.h
  LIB_H += compat/win32/dirent.h
 -LIB_H += compat/win32/poll.h
  LIB_H += compat/win32/pthread.h
  LIB_H += compat/win32/syslog.h
  LIB_H += connected.h
@@@ -640,7 -619,6 +641,7 @@@ LIB_H += diff.
  LIB_H += diffcore.h
  LIB_H += dir.h
  LIB_H += exec_cmd.h
 +LIB_H += fetch-pack.h
  LIB_H += fmt-merge-msg.h
  LIB_H += fsck.h
  LIB_H += gettext.h
@@@ -650,7 -628,6 +651,7 @@@ LIB_H += graph.
  LIB_H += grep.h
  LIB_H += hash.h
  LIB_H += help.h
 +LIB_H += http.h
  LIB_H += kwset.h
  LIB_H += levenshtein.h
  LIB_H += list-objects.h
@@@ -660,20 -637,19 +661,20 @@@ LIB_H += mailmap.
  LIB_H += merge-file.h
  LIB_H += merge-recursive.h
  LIB_H += mergesort.h
 -LIB_H += notes.h
  LIB_H += notes-cache.h
  LIB_H += notes-merge.h
 +LIB_H += notes.h
  LIB_H += object.h
 -LIB_H += pack.h
  LIB_H += pack-refs.h
  LIB_H += pack-revindex.h
 +LIB_H += pack.h
  LIB_H += parse-options.h
  LIB_H += patch-ids.h
  LIB_H += pkt-line.h
  LIB_H += progress.h
  LIB_H += prompt.h
  LIB_H += quote.h
 +LIB_H += reachable.h
  LIB_H += reflog-walk.h
  LIB_H += refs.h
  LIB_H += remote.h
@@@ -681,11 -657,9 +682,11 @@@ LIB_H += rerere.
  LIB_H += resolve-undo.h
  LIB_H += revision.h
  LIB_H += run-command.h
 +LIB_H += send-pack.h
  LIB_H += sequencer.h
  LIB_H += sha1-array.h
  LIB_H += sha1-lookup.h
 +LIB_H += shortlog.h
  LIB_H += sideband.h
  LIB_H += sigchain.h
  LIB_H += strbuf.h
@@@ -693,18 -667,15 +694,19 @@@ LIB_H += streaming.
  LIB_H += string-list.h
  LIB_H += submodule.h
  LIB_H += tag.h
 +LIB_H += tar.h
  LIB_H += thread-utils.h
  LIB_H += transport.h
 -LIB_H += tree.h
  LIB_H += tree-walk.h
 +LIB_H += tree.h
  LIB_H += unpack-trees.h
 +LIB_H += url.h
  LIB_H += userdiff.h
  LIB_H += utf8.h
  LIB_H += varint.h
 +LIB_H += walker.h
+ LIB_H += wildmatch.h
 +LIB_H += wt-status.h
  LIB_H += xdiff-interface.h
  LIB_H += xdiff/xdiff.h
  
@@@ -754,7 -725,6 +756,7 @@@ LIB_OBJS += editor.
  LIB_OBJS += entry.o
  LIB_OBJS += environment.o
  LIB_OBJS += exec_cmd.o
 +LIB_OBJS += fetch-pack.o
  LIB_OBJS += fsck.o
  LIB_OBJS += gettext.o
  LIB_OBJS += gpg-interface.o
@@@ -772,7 -742,6 +774,7 @@@ LIB_OBJS += lockfile.
  LIB_OBJS += log-tree.o
  LIB_OBJS += mailmap.o
  LIB_OBJS += match-trees.o
 +LIB_OBJS += merge.o
  LIB_OBJS += merge-file.o
  LIB_OBJS += merge-recursive.o
  LIB_OBJS += mergesort.o
@@@ -807,7 -776,6 +809,7 @@@ LIB_OBJS += rerere.
  LIB_OBJS += resolve-undo.o
  LIB_OBJS += revision.o
  LIB_OBJS += run-command.o
 +LIB_OBJS += send-pack.o
  LIB_OBJS += sequencer.o
  LIB_OBJS += server-info.o
  LIB_OBJS += setup.o
@@@ -836,8 -804,8 +838,9 @@@ LIB_OBJS += usage.
  LIB_OBJS += userdiff.o
  LIB_OBJS += utf8.o
  LIB_OBJS += varint.o
 +LIB_OBJS += version.o
  LIB_OBJS += walker.o
+ LIB_OBJS += wildmatch.o
  LIB_OBJS += wrapper.o
  LIB_OBJS += write_or_die.o
  LIB_OBJS += ws.o
@@@ -865,7 -833,6 +868,7 @@@ BUILTIN_OBJS += builtin/commit-tree.
  BUILTIN_OBJS += builtin/commit.o
  BUILTIN_OBJS += builtin/config.o
  BUILTIN_OBJS += builtin/count-objects.o
 +BUILTIN_OBJS += builtin/credential.o
  BUILTIN_OBJS += builtin/describe.o
  BUILTIN_OBJS += builtin/diff-files.o
  BUILTIN_OBJS += builtin/diff-index.o
@@@ -943,8 -910,6 +946,8 @@@ BUILTIN_OBJS += builtin/write-tree.
  GITLIBS = $(LIB_FILE) $(XDIFF_LIB)
  EXTLIBS =
  
 +GIT_USER_AGENT = git/$(GIT_VERSION)
 +
  #
  # Platform specific tweaks
  #
@@@ -1031,8 -996,6 +1034,8 @@@ ifeq ($(uname_S),Darwin
        NO_MEMMEM = YesPlease
        USE_ST_TIMESPEC = YesPlease
        HAVE_DEV_TTY = YesPlease
 +      COMPAT_OBJS += compat/precompose_utf8.o
 +      BASIC_CFLAGS += -DPRECOMPOSE_UNICODE
  endif
  ifeq ($(uname_S),SunOS)
        NEEDS_SOCKET = YesPlease
@@@ -1094,7 -1057,6 +1097,7 @@@ ifeq ($(uname_O),Cygwin
                NO_SYMLINK_HEAD = YesPlease
                NO_IPV6 = YesPlease
                OLD_ICONV = UnfortunatelyYes
 +              CYGWIN_V15_WIN32API = YesPlease
        endif
        NO_THREAD_SAFE_PREAD = YesPlease
        NEEDS_LIBICONV = YesPlease
@@@ -1147,7 -1109,7 +1150,7 @@@ ifeq ($(uname_S),NetBSD
  endif
  ifeq ($(uname_S),AIX)
        DEFAULT_PAGER = more
 -      NO_STRCASESTR=YesPlease
 +      NO_STRCASESTR = YesPlease
        NO_MEMMEM = YesPlease
        NO_MKDTEMP = YesPlease
        NO_MKSTEMPS = YesPlease
        NO_NSEC = YesPlease
        FREAD_READS_DIRECTORIES = UnfortunatelyYes
        INTERNAL_QSORT = UnfortunatelyYes
 -      NEEDS_LIBICONV=YesPlease
 +      NEEDS_LIBICONV = YesPlease
        BASIC_CFLAGS += -D_LARGE_FILES
        ifeq ($(shell expr "$(uname_V)" : '[1234]'),1)
                NO_PTHREADS = YesPlease
                PTHREAD_LIBS = -lpthread
        endif
        ifeq ($(shell expr "$(uname_V).$(uname_R)" : '5\.1'),3)
 -              INLINE=''
 +              INLINE = ''
        endif
        GIT_TEST_CMP = cmp
  endif
  ifeq ($(uname_S),GNU)
        # GNU/Hurd
 -      NO_STRLCPY=YesPlease
 +      NO_STRLCPY = YesPlease
        NO_MKSTEMPS = YesPlease
        HAVE_PATHS_H = YesPlease
        LIBC_CONTAINS_LIBINTL = YesPlease
@@@ -1195,9 -1157,9 +1198,9 @@@ ifeq ($(uname_S),IRIX
        NEEDS_LIBGEN = YesPlease
  endif
  ifeq ($(uname_S),IRIX64)
 -      NO_SETENV=YesPlease
 +      NO_SETENV = YesPlease
        NO_UNSETENV = YesPlease
 -      NO_STRCASESTR=YesPlease
 +      NO_STRCASESTR = YesPlease
        NO_MEMMEM = YesPlease
        NO_MKSTEMPS = YesPlease
        NO_MKDTEMP = YesPlease
        NO_REGEX = YesPlease
        NO_FNMATCH_CASEFOLD = YesPlease
        SNPRINTF_RETURNS_BOGUS = YesPlease
 -      SHELL_PATH=/usr/gnu/bin/bash
 +      SHELL_PATH = /usr/gnu/bin/bash
        NEEDS_LIBGEN = YesPlease
  endif
  ifeq ($(uname_S),HP-UX)
        INLINE = __inline
 -      NO_IPV6=YesPlease
 -      NO_SETENV=YesPlease
 -      NO_STRCASESTR=YesPlease
 +      NO_IPV6 = YesPlease
 +      NO_SETENV = YesPlease
 +      NO_STRCASESTR = YesPlease
        NO_MEMMEM = YesPlease
        NO_MKSTEMPS = YesPlease
        NO_STRLCPY = YesPlease
@@@ -1249,7 -1211,7 +1252,7 @@@ ifeq ($(uname_S),Windows
        NO_PREAD = YesPlease
        NEEDS_CRYPTO_WITH_SSL = YesPlease
        NO_LIBGEN_H = YesPlease
 -      NO_SYS_POLL_H = YesPlease
 +      NO_POLL = YesPlease
        NO_SYMLINK_HEAD = YesPlease
        NO_IPV6 = YesPlease
        NO_UNIX_SOCKETS = YesPlease
        BLK_SHA1 = YesPlease
        NO_POSIX_GOODIES = UnfortunatelyYes
        NATIVE_CRLF = YesPlease
 +      DEFAULT_HELP_FORMAT = html
  
        CC = compat/vcbuild/scripts/clink.pl
        AR = compat/vcbuild/scripts/lib.pl
        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/winansi.o \
                compat/win32/pthread.o compat/win32/syslog.o \
 -              compat/win32/poll.o compat/win32/dirent.o
 +              compat/win32/dirent.o
        COMPAT_CFLAGS = -D__USE_MINGW_ACCESS -DNOGDI -DHAVE_STRING_H -DHAVE_ALLOCA_H -Icompat -Icompat/regex -Icompat/win32 -DSTRIP_EXTENSION=\".exe\"
        BASIC_LDFLAGS = -IGNORE:4217 -IGNORE:4049 -NOLOGO -SUBSYSTEM:CONSOLE -NODEFAULTLIB:MSVCRT.lib
        EXTLIBS = user32.lib advapi32.lib shell32.lib wininet.lib ws2_32.lib
@@@ -1340,72 -1301,12 +1343,72 @@@ ifeq ($(uname_S),Minix
        NO_CURL =
        NO_EXPAT =
  endif
 +ifeq ($(uname_S),NONSTOP_KERNEL)
 +      # Needs some C99 features, "inline" is just one of them.
 +      # INLINE='' would just replace one set of warnings with another and
 +      # still not compile in c89 mode, due to non-const array initializations.
 +      CC = cc -c99
 +      # Disable all optimization, seems to result in bad code, with -O or -O2
 +      # or even -O1 (default), /usr/local/libexec/git-core/git-pack-objects
 +      # abends on "git push". Needs more investigation.
 +      CFLAGS = -g -O0
 +      # We'd want it to be here.
 +      prefix = /usr/local
 +      # Our's are in ${prefix}/bin (perl might also be in /usr/bin/perl).
 +      PERL_PATH = ${prefix}/bin/perl
 +      PYTHON_PATH = ${prefix}/bin/python
 +
 +      # As detected by './configure'.
 +      # Missdetected, hence commented out, see below.
 +      #NO_CURL = YesPlease
 +      # Added manually, see above.
 +      NEEDS_SSL_WITH_CURL = YesPlease
 +      HAVE_LIBCHARSET_H = YesPlease
 +      HAVE_STRINGS_H = YesPlease
 +      NEEDS_LIBICONV = YesPlease
 +      NEEDS_LIBINTL_BEFORE_LIBICONV = YesPlease
 +      NO_SYS_SELECT_H = UnfortunatelyYes
 +      NO_D_TYPE_IN_DIRENT = YesPlease
 +      NO_HSTRERROR = YesPlease
 +      NO_STRCASESTR = YesPlease
 +      NO_FNMATCH_CASEFOLD = YesPlease
 +      NO_MEMMEM = YesPlease
 +      NO_STRLCPY = YesPlease
 +      NO_SETENV = YesPlease
 +      NO_UNSETENV = YesPlease
 +      NO_MKDTEMP = YesPlease
 +      NO_MKSTEMPS = YesPlease
 +      # Currently libiconv-1.9.1.
 +      OLD_ICONV = UnfortunatelyYes
 +      NO_REGEX = YesPlease
 +      NO_PTHREADS = UnfortunatelyYes
 +
 +      # Not detected (nor checked for) by './configure'.
 +      # We don't have SA_RESTART on NonStop, unfortunalety.
 +      COMPAT_CFLAGS += -DSA_RESTART=0
 +      # Apparently needed in compat/fnmatch/fnmatch.c.
 +      COMPAT_CFLAGS += -DHAVE_STRING_H=1
 +      NO_ST_BLOCKS_IN_STRUCT_STAT = YesPlease
 +      NO_NSEC = YesPlease
 +      NO_PREAD = YesPlease
 +      NO_MMAP = YesPlease
 +      NO_POLL = YesPlease
 +      NO_INTPTR_T = UnfortunatelyYes
 +      # Bug report 10-120822-4477 submitted to HP NonStop development.
 +      MKDIR_WO_TRAILING_SLASH = YesPlease
 +      # RFE 10-120912-4693 submitted to HP NonStop development.
 +      NO_SETITIMER = UnfortunatelyYes
 +      SANE_TOOL_PATH = /usr/coreutils/bin:/usr/local/bin
 +      SHELL_PATH = /usr/local/bin/bash
 +      # as of H06.25/J06.14, we might better use this
 +      #SHELL_PATH = /usr/coreutils/bin/bash
 +endif
  ifneq (,$(findstring MINGW,$(uname_S)))
        pathsep = ;
        NO_PREAD = YesPlease
        NEEDS_CRYPTO_WITH_SSL = YesPlease
        NO_LIBGEN_H = YesPlease
 -      NO_SYS_POLL_H = YesPlease
 +      NO_POLL = YesPlease
        NO_SYMLINK_HEAD = YesPlease
        NO_UNIX_SOCKETS = YesPlease
        NO_SETENV = YesPlease
        COMPAT_CFLAGS += -DSTRIP_EXTENSION=\".exe\"
        COMPAT_OBJS += compat/mingw.o compat/winansi.o \
                compat/win32/pthread.o compat/win32/syslog.o \
 -              compat/win32/poll.o compat/win32/dirent.o
 +              compat/win32/dirent.o
        EXTLIBS += -lws2_32
        PTHREAD_LIBS =
        X = .exe
        SPARSE_FLAGS = -Wno-one-bit-signed-bitfield
  ifneq (,$(wildcard ../THIS_IS_MSYSGIT))
 -      htmldir=doc/git/html/
 +      htmldir = doc/git/html/
        prefix =
        INSTALL = /bin/install
        EXTLIBS += /mingw/lib/libz.a
        NO_CURL = YesPlease
  endif
  endif
 +ifeq ($(uname_S),QNX)
 +      COMPAT_CFLAGS += -DSA_RESTART=0
 +      HAVE_STRINGS_H = YesPlease
 +      NEEDS_SOCKET = YesPlease
 +      NO_FNMATCH_CASEFOLD = YesPlease
 +      NO_GETPAGESIZE = YesPlease
 +      NO_ICONV = YesPlease
 +      NO_MEMMEM = YesPlease
 +      NO_MKDTEMP = YesPlease
 +      NO_MKSTEMPS = YesPlease
 +      NO_NSEC = YesPlease
 +      NO_PTHREADS = YesPlease
 +      NO_R_TO_GCC_LINKER = YesPlease
 +      NO_STRCASESTR = YesPlease
 +      NO_STRLCPY = YesPlease
 +endif
  
  -include config.mak.autogen
  -include config.mak
@@@ -1584,7 -1469,7 +1587,7 @@@ els
                CURL_LIBCURL = -lcurl
        endif
        ifdef NEEDS_SSL_WITH_CURL
 -              CURL_LIBCURL += -lssl
 +              CURL_LIBCURL += -lssl
                ifdef NEEDS_CRYPTO_WITH_SSL
                        CURL_LIBCURL += -lcrypto
                endif
        REMOTE_CURL_NAMES = $(REMOTE_CURL_PRIMARY) $(REMOTE_CURL_ALIASES)
        PROGRAM_OBJS += http-fetch.o
        PROGRAMS += $(REMOTE_CURL_NAMES)
 -      curl_check := $(shell (echo 070908; curl-config --vernum) | sort -r | sed -ne 2p)
 +      curl_check := $(shell (echo 070908; curl-config --vernum) 2>/dev/null | sort -r | sed -ne 2p)
        ifeq "$(curl_check)" "070908"
                ifndef NO_EXPAT
                        PROGRAM_OBJS += http-push.o
@@@ -1652,9 -1537,6 +1655,9 @@@ ifdef NEEDS_LIBICON
        else
                ICONV_LINK =
        endif
 +      ifdef NEEDS_LIBINTL_BEFORE_LIBICONV
 +              ICONV_LINK += -lintl
 +      endif
        EXTLIBS += $(ICONV_LINK) -liconv
  endif
  ifdef NEEDS_LIBGEN
@@@ -1680,9 -1562,6 +1683,9 @@@ endi
  ifdef NO_D_INO_IN_DIRENT
        BASIC_CFLAGS += -DNO_D_INO_IN_DIRENT
  endif
 +ifdef NO_GECOS_IN_PWENT
 +      BASIC_CFLAGS += -DNO_GECOS_IN_PWENT
 +endif
  ifdef NO_ST_BLOCKS_IN_STRUCT_STAT
        BASIC_CFLAGS += -DNO_ST_BLOCKS_IN_STRUCT_STAT
  endif
@@@ -1716,11 -1595,6 +1719,11 @@@ ifdef NO_GETTEX
        BASIC_CFLAGS += -DNO_GETTEXT
        USE_GETTEXT_SCHEME ?= fallthrough
  endif
 +ifdef NO_POLL
 +      NO_SYS_POLL_H = YesPlease
 +      COMPAT_CFLAGS += -DNO_POLL -Icompat/poll
 +      COMPAT_OBJS += compat/poll/poll.o
 +endif
  ifdef NO_STRCASESTR
        COMPAT_CFLAGS += -DNO_STRCASESTR
        COMPAT_OBJS += compat/strcasestr.o
@@@ -1759,10 -1633,6 +1762,10 @@@ ifdef NO_MKDTEM
        COMPAT_CFLAGS += -DNO_MKDTEMP
        COMPAT_OBJS += compat/mkdtemp.o
  endif
 +ifdef MKDIR_WO_TRAILING_SLASH
 +      COMPAT_CFLAGS += -DMKDIR_WO_TRAILING_SLASH
 +      COMPAT_OBJS += compat/mkdir.o
 +endif
  ifdef NO_MKSTEMPS
        COMPAT_CFLAGS += -DNO_MKSTEMPS
  endif
@@@ -1776,9 -1646,6 +1779,9 @@@ endi
  ifdef NO_SYS_POLL_H
        BASIC_CFLAGS += -DNO_SYS_POLL_H
  endif
 +ifdef NEEDS_SYS_PARAM_H
 +      BASIC_CFLAGS += -DNEEDS_SYS_PARAM_H
 +endif
  ifdef NO_INTTYPES_H
        BASIC_CFLAGS += -DNO_INTTYPES_H
  endif
@@@ -1797,13 -1664,6 +1800,13 @@@ endi
  ifdef OBJECT_CREATION_USES_RENAMES
        COMPAT_CFLAGS += -DOBJECT_CREATION_MODE=1
  endif
 +ifdef NO_STRUCT_ITIMERVAL
 +      COMPAT_CFLAGS += -DNO_STRUCT_ITIMERVAL
 +      NO_SETITIMER = YesPlease
 +endif
 +ifdef NO_SETITIMER
 +      COMPAT_CFLAGS += -DNO_SETITIMER
 +endif
  ifdef NO_PREAD
        COMPAT_CFLAGS += -DNO_PREAD
        COMPAT_OBJS += compat/pread.o
@@@ -1821,9 -1681,6 +1824,9 @@@ endi
  ifdef NO_IPV6
        BASIC_CFLAGS += -DNO_IPV6
  endif
 +ifdef NO_INTPTR_T
 +      COMPAT_CFLAGS += -DNO_INTPTR_T
 +endif
  ifdef NO_UINTMAX_T
        BASIC_CFLAGS += -Duintmax_t=uint32_t
  endif
@@@ -1890,9 -1747,6 +1893,9 @@@ ifdef NO_MEMME
        COMPAT_CFLAGS += -DNO_MEMMEM
        COMPAT_OBJS += compat/memmem.o
  endif
 +ifdef NO_GETPAGESIZE
 +      COMPAT_CFLAGS += -DNO_GETPAGESIZE
 +endif
  ifdef INTERNAL_QSORT
        COMPAT_CFLAGS += -DINTERNAL_QSORT
        COMPAT_OBJS += compat/qsort.o
@@@ -1918,10 -1772,6 +1921,10 @@@ ifdef HAVE_LIBCHARSET_
        EXTLIBS += $(CHARSET_LIB)
  endif
  
 +ifdef HAVE_STRINGS_H
 +      BASIC_CFLAGS += -DHAVE_STRINGS_H
 +endif
 +
  ifdef HAVE_DEV_TTY
        BASIC_CFLAGS += -DHAVE_DEV_TTY
  endif
@@@ -1936,9 -1786,6 +1939,9 @@@ ifdef NO_REGE
        COMPAT_CFLAGS += -Icompat/regex
        COMPAT_OBJS += compat/regex/regex.o
  endif
 +ifdef CYGWIN_V15_WIN32API
 +      COMPAT_CFLAGS += -DCYGWIN_V15_WIN32API
 +endif
  
  ifdef USE_NED_ALLOCATOR
         COMPAT_CFLAGS += -Icompat/nedmalloc
@@@ -1958,15 -1805,15 +1961,15 @@@ ifneq (,$(XDL_FAST_HASH)
  endif
  
  ifeq ($(TCLTK_PATH),)
 -NO_TCLTK=NoThanks
 +NO_TCLTK = NoThanks
  endif
  
  ifeq ($(PERL_PATH),)
 -NO_PERL=NoThanks
 +NO_PERL = NoThanks
  endif
  
  ifeq ($(PYTHON_PATH),)
 -NO_PYTHON=NoThanks
 +NO_PYTHON = NoThanks
  endif
  
  QUIET_SUBDIR0  = +$(MAKE) -C # space to separate -C and subdir
@@@ -1999,6 -1846,10 +2002,6 @@@ ifndef 
  endif
  endif
  
 -ifdef ASCIIDOC7
 -      export ASCIIDOC7
 -endif
 -
  ifdef NO_INSTALL_HARDLINKS
        export NO_INSTALL_HARDLINKS
  endif
@@@ -2013,13 -1864,13 +2016,13 @@@ PROFILE_DIR := $(CURDIR
  ifeq ("$(PROFILE)","GEN")
        CFLAGS += -fprofile-generate=$(PROFILE_DIR) -DNO_NORETURN=1
        EXTLIBS += -lgcov
 -      export CCACHE_DISABLE=t
 -      V=1
 +      export CCACHE_DISABLE = t
 +      V = 1
  else
  ifneq ("$(PROFILE)","")
        CFLAGS += -fprofile-use=$(PROFILE_DIR) -fprofile-correction -DNO_NORETURN=1
 -      export CCACHE_DISABLE=t
 -      V=1
 +      export CCACHE_DISABLE = t
 +      V = 1
  endif
  endif
  
@@@ -2076,18 -1927,6 +2079,18 @@@ SHELL_PATH_CQ_SQ = $(subst ','\'',$(SHE
  BASIC_CFLAGS += -DSHELL_PATH='$(SHELL_PATH_CQ_SQ)'
  endif
  
 +GIT_USER_AGENT_SQ = $(subst ','\'',$(GIT_USER_AGENT))
 +GIT_USER_AGENT_CQ = "$(subst ",\",$(subst \,\\,$(GIT_USER_AGENT)))"
 +GIT_USER_AGENT_CQ_SQ = $(subst ','\'',$(GIT_USER_AGENT_CQ))
 +GIT-USER-AGENT: FORCE
 +      @if test x'$(GIT_USER_AGENT_SQ)' != x"`cat GIT-USER-AGENT 2>/dev/null`"; then \
 +              echo '$(GIT_USER_AGENT_SQ)' >GIT-USER-AGENT; \
 +      fi
 +
 +ifdef DEFAULT_HELP_FORMAT
 +BASIC_CFLAGS += -DDEFAULT_HELP_FORMAT='"$(DEFAULT_HELP_FORMAT)"'
 +endif
 +
  ALL_CFLAGS += $(BASIC_CFLAGS)
  ALL_LDFLAGS += $(BASIC_LDFLAGS)
  
@@@ -2134,41 -1973,8 +2137,41 @@@ shell_compatibility_test: please_set_SH
  strip: $(PROGRAMS) git$X
        $(STRIP) $(STRIP_OPTS) $(PROGRAMS) git$X
  
 -git.o: common-cmds.h
 -git.sp git.s git.o: EXTRA_CPPFLAGS = -DGIT_VERSION='"$(GIT_VERSION)"' \
 +### Target-specific flags and dependencies
 +
 +# The generic compilation pattern rule and automatically
 +# computed header dependencies (falling back to a dependency on
 +# LIB_H) are enough to describe how most targets should be built,
 +# but some targets are special enough to need something a little
 +# different.
 +#
 +# - When a source file "foo.c" #includes a generated header file,
 +#   we need to list that dependency for the "foo.o" target.
 +#
 +#   We also list it from other targets that are built from foo.c
 +#   like "foo.sp" and "foo.s", even though that is easy to forget
 +#   to do because the generated header is already present around
 +#   after a regular build attempt.
 +#
 +# - Some code depends on configuration kept in makefile
 +#   variables. The target-specific variable EXTRA_CPPFLAGS can
 +#   be used to convey that information to the C preprocessor
 +#   using -D options.
 +#
 +#   The "foo.o" target should have a corresponding dependency on
 +#   a file that changes when the value of the makefile variable
 +#   changes.  For example, targets making use of the
 +#   $(GIT_VERSION) variable depend on GIT-VERSION-FILE.
 +#
 +#   Technically the ".sp" and ".s" targets do not need this
 +#   dependency because they are force-built, but they get the
 +#   same dependency for consistency. This way, you do not have to
 +#   know how each target is implemented. And it means the
 +#   dependencies here will not need to change if the force-build
 +#   details change some day.
 +
 +git.sp git.s git.o: GIT-PREFIX
 +git.sp git.s git.o: EXTRA_CPPFLAGS = \
        '-DGIT_HTML_PATH="$(htmldir_SQ)"' \
        '-DGIT_MAN_PATH="$(mandir_SQ)"' \
        '-DGIT_INFO_PATH="$(infodir_SQ)"'
@@@ -2177,19 -1983,14 +2180,19 @@@ git$X: git.o GIT-LDFLAGS $(BUILTIN_OBJS
        $(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ git.o \
                $(BUILTIN_OBJS) $(ALL_LDFLAGS) $(LIBS)
  
 -help.sp help.o: common-cmds.h
 +help.sp help.s help.o: common-cmds.h
  
 -builtin/help.sp builtin/help.o: common-cmds.h
 +builtin/help.sp builtin/help.s builtin/help.o: common-cmds.h GIT-PREFIX
  builtin/help.sp builtin/help.s builtin/help.o: EXTRA_CPPFLAGS = \
        '-DGIT_HTML_PATH="$(htmldir_SQ)"' \
        '-DGIT_MAN_PATH="$(mandir_SQ)"' \
        '-DGIT_INFO_PATH="$(infodir_SQ)"'
  
 +version.sp version.s version.o: GIT-VERSION-FILE GIT-USER-AGENT
 +version.sp version.s version.o: EXTRA_CPPFLAGS = \
 +      '-DGIT_VERSION="$(GIT_VERSION)"' \
 +      '-DGIT_USER_AGENT=$(GIT_USER_AGENT_CQ_SQ)'
 +
  $(BUILT_INS): git$X
        $(QUIET_BUILT_IN)$(RM) $@ && \
        ln git$X $@ 2>/dev/null || \
@@@ -2201,54 -2002,35 +2204,54 @@@ common-cmds.h: ./generate-cmdlist.sh co
  common-cmds.h: $(wildcard Documentation/git-*.txt)
        $(QUIET_GEN)./generate-cmdlist.sh > $@+ && mv $@+ $@
  
 +SCRIPT_DEFINES = $(SHELL_PATH_SQ):$(DIFF_SQ):$(GIT_VERSION):\
 +      $(localedir_SQ):$(NO_CURL):$(USE_GETTEXT_SCHEME):$(SANE_TOOL_PATH_SQ):\
 +      $(gitwebdir_SQ):$(PERL_PATH_SQ)
  define cmd_munge_script
  $(RM) $@ $@+ && \
  sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \
      -e 's|@SHELL_PATH@|$(SHELL_PATH_SQ)|' \
      -e 's|@@DIFF@@|$(DIFF_SQ)|' \
 -    -e 's/@@GIT_VERSION@@/$(GIT_VERSION)/g' \
      -e 's|@@LOCALEDIR@@|$(localedir_SQ)|g' \
      -e 's/@@NO_CURL@@/$(NO_CURL)/g' \
      -e 's/@@USE_GETTEXT_SCHEME@@/$(USE_GETTEXT_SCHEME)/g' \
      -e $(BROKEN_PATH_FIX) \
 +    -e 's|@@GITWEBDIR@@|$(gitwebdir_SQ)|g' \
 +    -e 's|@@PERL@@|$(PERL_PATH_SQ)|g' \
      $@.sh >$@+
  endef
  
 -$(patsubst %.sh,%,$(SCRIPT_SH)) : % : %.sh
 +GIT-SCRIPT-DEFINES: FORCE
 +      @FLAGS='$(SCRIPT_DEFINES)'; \
 +          if test x"$$FLAGS" != x"`cat $@ 2>/dev/null`" ; then \
 +              echo >&2 "    * new script parameters"; \
 +              echo "$$FLAGS" >$@; \
 +            fi
 +
 +
 +$(patsubst %.sh,%,$(SCRIPT_SH)) : % : %.sh GIT-SCRIPT-DEFINES
        $(QUIET_GEN)$(cmd_munge_script) && \
        chmod +x $@+ && \
        mv $@+ $@
  
 -$(SCRIPT_LIB) : % : %.sh
 +$(SCRIPT_LIB) : % : %.sh GIT-SCRIPT-DEFINES
        $(QUIET_GEN)$(cmd_munge_script) && \
        mv $@+ $@
  
  ifndef NO_PERL
  $(patsubst %.perl,%,$(SCRIPT_PERL)): perl/perl.mak
  
 -perl/perl.mak: GIT-CFLAGS perl/Makefile perl/Makefile.PL
 +perl/perl.mak: perl/PM.stamp
 +
 +perl/PM.stamp: FORCE
 +      $(QUIET_GEN)$(FIND) perl -type f -name '*.pm' | sort >$@+ && \
 +      { cmp $@+ $@ >/dev/null 2>/dev/null || mv $@+ $@; } && \
 +      $(RM) $@+
 +
 +perl/perl.mak: GIT-CFLAGS GIT-PREFIX perl/Makefile perl/Makefile.PL
        $(QUIET_SUBDIR0)perl $(QUIET_SUBDIR1) PERL_PATH='$(PERL_PATH_SQ)' prefix='$(prefix_SQ)' $(@F)
  
 -$(patsubst %.perl,%,$(SCRIPT_PERL)): % : %.perl
 +$(patsubst %.perl,%,$(SCRIPT_PERL)): % : %.perl GIT-VERSION-FILE
        $(QUIET_GEN)$(RM) $@ $@+ && \
        INSTLIBDIR=`MAKEFLAGS= $(MAKE) -C perl -s --no-print-directory instlibdir` && \
        sed -e '1{' \
  gitweb:
        $(QUIET_SUBDIR0)gitweb $(QUIET_SUBDIR1) all
  
 -git-instaweb: git-instaweb.sh gitweb
 -      $(QUIET_GEN)$(RM) $@ $@+ && \
 -      sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \
 -          -e 's/@@GIT_VERSION@@/$(GIT_VERSION)/g' \
 -          -e 's/@@NO_CURL@@/$(NO_CURL)/g' \
 -          -e 's|@@GITWEBDIR@@|$(gitwebdir_SQ)|g' \
 -          -e 's|@@PERL@@|$(PERL_PATH_SQ)|g' \
 -          $@.sh > $@+ && \
 +git-instaweb: git-instaweb.sh gitweb GIT-SCRIPT-DEFINES
 +      $(QUIET_GEN)$(cmd_munge_script) && \
        chmod +x $@+ && \
        mv $@+ $@
  else # NO_PERL
@@@ -2283,7 -2071,7 +2286,7 @@@ $(patsubst %.perl,%,$(SCRIPT_PERL)) git
  endif # NO_PERL
  
  ifndef NO_PYTHON
 -$(patsubst %.py,%,$(SCRIPT_PYTHON)): GIT-CFLAGS
 +$(patsubst %.py,%,$(SCRIPT_PYTHON)): GIT-CFLAGS GIT-PREFIX GIT-PYTHON-VARS
  $(patsubst %.py,%,$(SCRIPT_PYTHON)): % : %.py
        $(QUIET_GEN)$(RM) $@ $@+ && \
        INSTLIBDIR=`MAKEFLAGS= $(MAKE) -C git_remote_helpers -s \
@@@ -2305,29 -2093,24 +2308,29 @@@ $(patsubst %.py,%,$(SCRIPT_PYTHON)): % 
        mv $@+ $@
  endif # NO_PYTHON
  
 -configure: configure.ac
 +configure: configure.ac GIT-VERSION-FILE
        $(QUIET_GEN)$(RM) $@ $<+ && \
        sed -e 's/@@GIT_VERSION@@/$(GIT_VERSION)/g' \
            $< > $<+ && \
        autoconf -o $@ $<+ && \
        $(RM) $<+
  
 -# These can record GIT_VERSION
 -git.o git.spec http.o \
 -      $(patsubst %.sh,%,$(SCRIPT_SH)) \
 -      $(patsubst %.perl,%,$(SCRIPT_PERL)) \
 -      : GIT-VERSION-FILE
 -
 -TEST_OBJS := $(patsubst test-%$X,test-%.o,$(TEST_PROGRAMS))
 -GIT_OBJS := $(LIB_OBJS) $(BUILTIN_OBJS) $(PROGRAM_OBJS) $(TEST_OBJS) \
 -      git.o
 -ifndef NO_CURL
 -      GIT_OBJS += http.o http-walker.o remote-curl.o
 +ifdef AUTOCONFIGURED
 +# We avoid depending on 'configure' here, because it gets rebuilt
 +# every time GIT-VERSION-FILE is modified, only to update the embedded
 +# version number string, which config.status does not care about.  We
 +# do want to recheck when the platform/environment detection logic
 +# changes, hence this depends on configure.ac.
 +config.status: configure.ac
 +      $(QUIET_GEN)$(MAKE) configure && \
 +      if test -f config.status; then \
 +        ./config.status --recheck; \
 +      else \
 +        ./configure; \
 +      fi
 +reconfigure config.mak.autogen: config.status
 +      $(QUIET_GEN)./config.status
 +.PHONY: reconfigure # This is a convenience target.
  endif
  
  XDIFF_OBJS += xdiff/xdiffi.o
@@@ -2345,14 -2128,9 +2348,14 @@@ VCSSVN_OBJS += vcs-svn/fast_export.
  VCSSVN_OBJS += vcs-svn/svndiff.o
  VCSSVN_OBJS += vcs-svn/svndump.o
  
 -VCSSVN_TEST_OBJS += test-line-buffer.o
 -
 -OBJECTS := $(GIT_OBJS) $(XDIFF_OBJS) $(VCSSVN_OBJS)
 +TEST_OBJS := $(patsubst test-%$X,test-%.o,$(TEST_PROGRAMS))
 +OBJECTS := $(LIB_OBJS) $(BUILTIN_OBJS) $(PROGRAM_OBJS) $(TEST_OBJS) \
 +      $(XDIFF_OBJS) \
 +      $(VCSSVN_OBJS) \
 +      git.o
 +ifndef NO_CURL
 +      OBJECTS += http.o http-walker.o remote-curl.o
 +endif
  
  dep_files := $(foreach f,$(OBJECTS),$(dir $f).depend/$(notdir $f).d)
  dep_dirs := $(addsuffix .depend,$(sort $(dir $(OBJECTS))))
  # Dependencies on automatically generated headers such as common-cmds.h
  # should _not_ be included here, since they are necessary even when
  # building an object for the first time.
 -#
 -# XXX. Please check occasionally that these include all dependencies
 -# gcc detects!
  
 -$(GIT_OBJS): $(LIB_H)
 -builtin/branch.o builtin/checkout.o builtin/clone.o builtin/reset.o branch.o transport.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/index-pack.o builtin/grep.o builtin/pack-objects.o transport-helper.o thread-utils.o: thread-utils.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
 -connect.o transport.o url.o http-backend.o: url.h
 -builtin/branch.o builtin/commit.o builtin/tag.o column.o help.o pager.o: column.h
 -http-fetch.o http-walker.o remote-curl.o transport.o walker.o: walker.h
 -http.o http-walker.o http-push.o http-fetch.o remote-curl.o: http.h url.h
 -
 -xdiff-interface.o $(XDIFF_OBJS): $(XDIFF_H)
 -
 -$(VCSSVN_OBJS) $(VCSSVN_TEST_OBJS): $(LIB_H) $(VCSSVN_H)
 +$(OBJECTS): $(LIB_H)
  endif
  
 +exec_cmd.sp exec_cmd.s exec_cmd.o: GIT-PREFIX
  exec_cmd.sp exec_cmd.s exec_cmd.o: EXTRA_CPPFLAGS = \
        '-DGIT_EXEC_PATH="$(gitexecdir_SQ)"' \
        '-DBINDIR="$(bindir_relative_SQ)"' \
        '-DPREFIX="$(prefix_SQ)"'
  
 +builtin/init-db.sp builtin/init-db.s builtin/init-db.o: GIT-PREFIX
  builtin/init-db.sp builtin/init-db.s builtin/init-db.o: EXTRA_CPPFLAGS = \
        -DDEFAULT_GIT_TEMPLATE_DIR='"$(template_dir_SQ)"'
  
 +config.sp config.s config.o: GIT-PREFIX
  config.sp config.s config.o: EXTRA_CPPFLAGS = \
        -DETC_GITCONFIG='"$(ETC_GITCONFIG_SQ)"'
  
 +attr.sp attr.s attr.o: GIT-PREFIX
  attr.sp attr.s attr.o: EXTRA_CPPFLAGS = \
        -DETC_GITATTRIBUTES='"$(ETC_GITATTRIBUTES_SQ)"'
  
 +gettext.sp gettext.s gettext.o: GIT-PREFIX
  gettext.sp gettext.s gettext.o: EXTRA_CPPFLAGS = \
        -DGIT_LOCALE_PATH='"$(localedir_SQ)"'
  
 -http.sp http.s http.o: EXTRA_CPPFLAGS = \
 -      -DGIT_HTTP_USER_AGENT='"git/$(GIT_VERSION)"'
 -
  ifdef NO_EXPAT
  http-walker.sp http-walker.s http-walker.o: EXTRA_CPPFLAGS = -DNO_EXPAT
  endif
@@@ -2505,10 -2302,6 +2508,10 @@@ 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-testsvn$X: remote-testsvn.o GIT-LDFLAGS $(GITLIBS) $(VCSSVN_LIB)
 +      $(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) $(LIBS) \
 +      $(VCSSVN_LIB)
 +
  $(REMOTE_CURL_ALIASES): $(REMOTE_CURL_PRIMARY)
        $(QUIET_LNCP)$(RM) $@ && \
        ln $< $@ 2>/dev/null || \
@@@ -2552,10 -2345,9 +2555,10 @@@ XGETTEXT_FLAGS = 
        --from-code=UTF-8
  XGETTEXT_FLAGS_C = $(XGETTEXT_FLAGS) --language=C \
        --keyword=_ --keyword=N_ --keyword="Q_:1,2"
 -XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell
 +XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
 +      --keyword=gettextln --keyword=eval_gettextln
  XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --keyword=__ --language=Perl
 -LOCALIZED_C := $(C_OBJ:o=c) $(LIB_H) $(XDIFF_H) $(VCSSVN_H) $(MISC_H)
 +LOCALIZED_C := $(C_OBJ:o=c) $(LIB_H) $(GENERATED_H)
  LOCALIZED_SH := $(SCRIPT_SH)
  LOCALIZED_PERL := $(SCRIPT_PERL)
  
@@@ -2602,22 -2394,14 +2605,22 @@@ cscope
        $(FIND_SOURCE_FILES) | xargs cscope -b
  
  ### Detect prefix changes
 -TRACK_CFLAGS = $(CC):$(subst ','\'',$(ALL_CFLAGS)):\
 -             $(bindir_SQ):$(gitexecdir_SQ):$(template_dir_SQ):$(prefix_SQ):\
 -             $(localedir_SQ):$(USE_GETTEXT_SCHEME)
 +TRACK_PREFIX = $(bindir_SQ):$(gitexecdir_SQ):$(template_dir_SQ):$(prefix_SQ):\
 +              $(localedir_SQ)
 +
 +GIT-PREFIX: FORCE
 +      @FLAGS='$(TRACK_PREFIX)'; \
 +      if test x"$$FLAGS" != x"`cat GIT-PREFIX 2>/dev/null`" ; then \
 +              echo >&2 "    * new prefix flags"; \
 +              echo "$$FLAGS" >GIT-PREFIX; \
 +      fi
 +
 +TRACK_CFLAGS = $(CC):$(subst ','\'',$(ALL_CFLAGS)):$(USE_GETTEXT_SCHEME)
  
  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"; \
 +              echo >&2 "    * new build flags"; \
                echo "$$FLAGS" >GIT-CFLAGS; \
              fi
  
@@@ -2626,7 -2410,7 +2629,7 @@@ TRACK_LDFLAGS = $(subst ','\'',$(ALL_LD
  GIT-LDFLAGS: FORCE
        @FLAGS='$(TRACK_LDFLAGS)'; \
            if test x"$$FLAGS" != x"`cat GIT-LDFLAGS 2>/dev/null`" ; then \
 -              echo 1>&2 "    * new link flags"; \
 +              echo >&2 "    * new link flags"; \
                echo "$$FLAGS" >GIT-LDFLAGS; \
              fi
  
@@@ -2668,14 -2452,14 +2671,14 @@@ ifdef GIT_PERF_MAKE_OPT
        @echo GIT_PERF_MAKE_OPTS=\''$(subst ','\'',$(subst ','\'',$(GIT_PERF_MAKE_OPTS)))'\' >>$@
  endif
  
 -### Detect Tck/Tk interpreter path changes
 -ifndef NO_TCLTK
 -TRACK_VARS = $(subst ','\'',-DTCLTK_PATH='$(TCLTK_PATH_SQ)')
 +### Detect Python interpreter path changes
 +ifndef NO_PYTHON
 +TRACK_PYTHON = $(subst ','\'',-DPYTHON_PATH='$(PYTHON_PATH_SQ)')
  
 -GIT-GUI-VARS: FORCE
 -      @VARS='$(TRACK_VARS)'; \
 +GIT-PYTHON-VARS: FORCE
 +      @VARS='$(TRACK_PYTHON)'; \
            if test x"$$VARS" != x"`cat $@ 2>/dev/null`" ; then \
 -              echo 1>&2 "    * new Tcl/Tk interpreter location"; \
 +              echo >&2 "    * new Python interpreter location"; \
                echo "$$VARS" >$@; \
              fi
  endif
@@@ -2696,7 -2480,6 +2699,7 @@@ bin-wrappers/%: wrap-for-bin.s
  # with that.
  
  export NO_SVN_TESTS
 +export TEST_NO_MALLOC_CHECK
  
  ### Testing rules
  
@@@ -2870,11 -2653,11 +2873,11 @@@ quick-install-html
  
  ### Maintainer's dist rules
  
 -git.spec: git.spec.in
 +git.spec: git.spec.in GIT-VERSION-FILE
        sed -e 's/@@VERSION@@/$(GIT_VERSION)/g' < $< > $@+
        mv $@+ $@
  
 -GIT_TARNAME=git-$(GIT_VERSION)
 +GIT_TARNAME = git-$(GIT_VERSION)
  dist: git.spec git-archive$(X) configure
        ./git-archive --format=tar \
                --prefix=$(GIT_TARNAME)/ HEAD^{tree} > $(GIT_TARNAME).tar
@@@ -2920,9 -2703,6 +2923,9 @@@ dist-doc
  
  distclean: clean
        $(RM) configure
 +      $(RM) config.log config.status config.cache
 +      $(RM) config.mak.autogen config.mak.append
 +      $(RM) -r autom4te.cache
  
  profile-clean:
        $(RM) $(addsuffix *.gcda,$(addprefix $(PROFILE_DIR)/, $(object_dirs)))
@@@ -2937,6 -2717,8 +2940,6 @@@ clean: profile-clea
        $(RM) -r $(dep_dirs)
        $(RM) -r po/build/
        $(RM) *.spec *.pyc *.pyo */*.pyc */*.pyo common-cmds.h $(ETAGS_TARGET) tags cscope*
 -      $(RM) -r autom4te.cache
 -      $(RM) config.log config.mak.autogen config.mak.append config.status config.cache
        $(RM) -r $(GIT_TARNAME) .doc-tmp-dir
        $(RM) $(GIT_TARNAME).tar.gz git-core_$(GIT_VERSION)-*.tar.gz
        $(RM) $(htmldocs).tar.gz $(manpages).tar.gz
@@@ -2954,8 -2736,7 +2957,8 @@@ ifndef NO_TCLT
        $(MAKE) -C gitk-git clean
        $(MAKE) -C git-gui clean
  endif
 -      $(RM) GIT-VERSION-FILE GIT-CFLAGS GIT-LDFLAGS GIT-GUI-VARS GIT-BUILD-OPTIONS
 +      $(RM) GIT-VERSION-FILE GIT-CFLAGS GIT-LDFLAGS GIT-BUILD-OPTIONS
 +      $(RM) GIT-USER-AGENT GIT-PREFIX GIT-SCRIPT-DEFINES GIT-PYTHON-VARS
  
  .PHONY: all install profile-clean clean strip
  .PHONY: shell_compatibility_test please_set_SHELL_PATH_to_a_more_modern_shell
  
  ### Check documentation
  #
 +ALL_COMMANDS = $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS)
 +ALL_COMMANDS += git
 +ALL_COMMANDS += gitk
 +ALL_COMMANDS += gitweb
 +ALL_COMMANDS += git-gui git-citool
  check-docs::
 -      @(for v in $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS) git gitk; \
 +      @(for v in $(ALL_COMMANDS); \
        do \
                case "$$v" in \
                git-merge-octopus | git-merge-ours | git-merge-recursive | \
                sed -e '/^#/d' \
                    -e 's/[     ].*//' \
                    -e 's/^/listed /' command-list.txt; \
 -              ls -1 Documentation/git*txt | \
 +              $(MAKE) -C Documentation print-man1 | \
 +              grep '\.txt$$' | \
                sed -e 's|Documentation/|documented |' \
                    -e 's/\.txt//'; \
        ) | while read how cmd; \
        do \
 -              case "$$how,$$cmd" in \
 -              *,git-citool | \
 -              *,git-gui | \
 -              *,git-help | \
 -              documented,gitattributes | \
 -              documented,gitignore | \
 -              documented,gitmodules | \
 -              documented,gitcli | \
 -              documented,git-tools | \
 -              documented,gitcore-tutorial | \
 -              documented,gitcvs-migration | \
 -              documented,gitdiffcore | \
 -              documented,gitglossary | \
 -              documented,githooks | \
 -              documented,gitrepository-layout | \
 -              documented,gitrevisions | \
 -              documented,gittutorial | \
 -              documented,gittutorial-2 | \
 -              documented,git-bisect-lk2009 | \
 -              documented,git-remote-helpers | \
 -              documented,gitworkflows | \
 -              sentinel,not,matching,is,ok ) continue ;; \
 -              esac; \
 -              case " $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS) git gitk " in \
 +              case " $(ALL_COMMANDS) " in \
                *" $$cmd "*)    ;; \
                *) echo "removed but $$how: $$cmd" ;; \
                esac; \
diff --combined compat/fnmatch/fnmatch.c
index b8b7dc254373fb0f7b2a7b16163fa72e1e8c5f7b,6f7387d036984ae52119a952f28a74d34536b8bd..5ef0685135662e3cefc80eed5c5ae030fe1a5d49
@@@ -55,7 -55,8 +55,8 @@@
     program understand `configure --with-gnu-libc' and omit the object files,
     it is simpler to just do this in the source for each such file.  */
  
- #if defined _LIBC || !defined __GNU_LIBRARY__
+ #if defined NO_FNMATCH || defined NO_FNMATCH_CASEFOLD || \
+     defined _LIBC || !defined __GNU_LIBRARY__
  
  
  # if defined STDC_HEADERS || !defined isascii
@@@ -135,9 -136,9 +136,9 @@@ extern int errno
  
  # if !defined HAVE___STRCHRNUL && !defined _LIBC
  static char *
 -__strchrnul (s, c)
 -     const char *s;
 -     int c;
 +__strchrnul (const char *s, int c)
 +
 +
  {
    char *result = strchr (s, c);
    if (result == NULL)
@@@ -159,11 -160,11 +160,11 @@@ static int internal_fnmatch __P ((cons
       internal_function;
  static int
  internal_function
 -internal_fnmatch (pattern, string, no_leading_period, flags)
 -     const char *pattern;
 -     const char *string;
 -     int no_leading_period;
 -     int flags;
 +internal_fnmatch (const char *pattern, const char *string, int no_leading_period, int flags)
 +
 +
 +
 +
  {
    register const char *p = pattern, *n = string;
    register unsigned char c;
  
                    for (;;)
                      {
 -                      if (c1 == CHAR_CLASS_MAX_LENGTH)
 +                      if (c1 > CHAR_CLASS_MAX_LENGTH)
                          /* The name is too long and therefore the pattern
                             is ill-formed.  */
                          return FNM_NOMATCH;
  
  
  int
 -fnmatch (pattern, string, flags)
 -     const char *pattern;
 -     const char *string;
 -     int flags;
 +fnmatch (const char *pattern, const char *string, int flags)
 +
 +
 +
  {
    return internal_fnmatch (pattern, string, flags & FNM_PERIOD, flags);
  }
diff --combined dir.c
index 095ea7ebabfa25f1ff1aba199c09daaac984dbaa,cb7328b548a2eaf6ab1490354b9e9b6a560d327d..37807550475cf488b60187872f698cbc6171dcb1
--- 1/dir.c
--- 2/dir.c
+++ b/dir.c
@@@ -8,6 -8,7 +8,7 @@@
  #include "cache.h"
  #include "dir.h"
  #include "refs.h"
+ #include "wildmatch.h"
  
  struct path_simplify {
        int len;
@@@ -34,33 -35,10 +35,33 @@@ int fnmatch_icase(const char *pattern, 
        return fnmatch(pattern, string, flags | (ignore_case ? FNM_CASEFOLD : 0));
  }
  
 +inline int git_fnmatch(const char *pattern, const char *string,
 +                     int flags, int prefix)
 +{
 +      int fnm_flags = 0;
 +      if (flags & GFNM_PATHNAME)
 +              fnm_flags |= FNM_PATHNAME;
 +      if (prefix > 0) {
 +              if (strncmp(pattern, string, prefix))
 +                      return FNM_NOMATCH;
 +              pattern += prefix;
 +              string += prefix;
 +      }
 +      if (flags & GFNM_ONESTAR) {
 +              int pattern_len = strlen(++pattern);
 +              int string_len = strlen(string);
 +              return string_len < pattern_len ||
 +                     strcmp(pattern,
 +                            string + string_len - pattern_len);
 +      }
 +      return fnmatch(pattern, string, fnm_flags);
 +}
 +
  static size_t common_prefix_len(const char **pathspec)
  {
        const char *n, *first;
        size_t max = 0;
 +      int literal = limit_pathspec_to_literal();
  
        if (!pathspec)
                return max;
@@@ -70,7 -48,7 +71,7 @@@
                size_t i, len = 0;
                for (i = 0; first == n || i < max; i++) {
                        char c = n[i];
 -                      if (!c || c != first[i] || is_glob_special(c))
 +                      if (!c || c != first[i] || (!literal && is_glob_special(c)))
                                break;
                        if (c == '/')
                                len = i + 1;
@@@ -140,7 -118,6 +141,7 @@@ int within_depth(const char *name, int 
  static int match_one(const char *match, const char *name, int namelen)
  {
        int matchlen;
 +      int literal = limit_pathspec_to_literal();
  
        /* If the match was just the prefix, we matched */
        if (!*match)
                for (;;) {
                        unsigned char c1 = tolower(*match);
                        unsigned char c2 = tolower(*name);
 -                      if (c1 == '\0' || is_glob_special(c1))
 +                      if (c1 == '\0' || (!literal && is_glob_special(c1)))
                                break;
                        if (c1 != c2)
                                return 0;
                for (;;) {
                        unsigned char c1 = *match;
                        unsigned char c2 = *name;
 -                      if (c1 == '\0' || is_glob_special(c1))
 +                      if (c1 == '\0' || (!literal && is_glob_special(c1)))
                                break;
                        if (c1 != c2)
                                return 0;
                }
        }
  
 -
        /*
         * If we don't match the matchstring exactly,
         * we need to match by fnmatch
         */
        matchlen = strlen(match);
 -      if (strncmp_icase(match, name, matchlen))
 +      if (strncmp_icase(match, name, matchlen)) {
 +              if (literal)
 +                      return 0;
                return !fnmatch_icase(match, name, 0) ? MATCHED_FNMATCH : 0;
 +      }
  
        if (namelen == matchlen)
                return MATCHED_EXACTLY;
@@@ -256,10 -231,7 +257,10 @@@ static int match_pathspec_item(const st
                        return MATCHED_RECURSIVELY;
        }
  
 -      if (item->use_wildcard && !fnmatch(match, name, 0))
 +      if (item->nowildcard_len < item->len &&
 +          !git_fnmatch(match, name,
 +                       item->flags & PATHSPEC_ONESTAR ? GFNM_ONESTAR : 0,
 +                       item->nowildcard_len - prefix))
                return MATCHED_FNMATCH;
  
        return 0;
@@@ -453,8 -425,6 +454,8 @@@ int add_excludes_from_file_to_list(cons
  
        fd = open(fname, O_RDONLY);
        if (fd < 0 || fstat(fd, &st) < 0) {
 +              if (errno != ENOENT)
 +                      warn_on_inaccessible(fname);
                if (0 <= fd)
                        close(fd);
                if (!check_index ||
@@@ -624,7 -594,8 +625,8 @@@ int match_pathname(const char *pathname
                namelen -= prefix;
        }
  
-       return fnmatch_icase(pattern, name, FNM_PATHNAME) == 0;
+       return wildmatch(pattern, name,
+                        ignore_case ? FNM_CASEFOLD : 0) == 0;
  }
  
  /* Scan the list and let the last match determine the fate.
@@@ -1394,17 -1365,12 +1396,17 @@@ int remove_dir_recursively(struct strbu
  void setup_standard_excludes(struct dir_struct *dir)
  {
        const char *path;
 +      char *xdg_path;
  
        dir->exclude_per_dir = ".gitignore";
        path = git_path("info/exclude");
 -      if (!access(path, R_OK))
 +      if (!excludes_file) {
 +              home_config_paths(NULL, &xdg_path, "ignore");
 +              excludes_file = xdg_path;
 +      }
 +      if (!access_or_warn(path, R_OK))
                add_excludes_from_file(dir, path);
 -      if (excludes_file && !access(excludes_file, R_OK))
 +      if (excludes_file && !access_or_warn(excludes_file, R_OK))
                add_excludes_from_file(dir, excludes_file);
  }
  
@@@ -1458,18 -1424,9 +1460,18 @@@ int init_pathspec(struct pathspec *path
  
                item->match = path;
                item->len = strlen(path);
 -              item->use_wildcard = !no_wildcard(path);
 -              if (item->use_wildcard)
 -                      pathspec->has_wildcard = 1;
 +              item->flags = 0;
 +              if (limit_pathspec_to_literal()) {
 +                      item->nowildcard_len = item->len;
 +              } else {
 +                      item->nowildcard_len = simple_length(path);
 +                      if (item->nowildcard_len < item->len) {
 +                              pathspec->has_wildcard = 1;
 +                              if (path[item->nowildcard_len] == '*' &&
 +                                  no_wildcard(path + item->nowildcard_len + 1))
 +                                      item->flags |= PATHSPEC_ONESTAR;
 +                      }
 +              }
        }
  
        qsort(pathspec->items, pathspec->nr,
@@@ -1483,11 -1440,3 +1485,11 @@@ void free_pathspec(struct pathspec *pat
        free(pathspec->items);
        pathspec->items = NULL;
  }
 +
 +int limit_pathspec_to_literal(void)
 +{
 +      static int flag = -1;
 +      if (flag < 0)
 +              flag = git_env_bool(GIT_LITERAL_PATHSPECS_ENVIRONMENT, 0);
 +      return flag;
 +}
diff --combined git-compat-util.h
index 2cecf56eb367ccd866250b7634c738187d6e2261,02f48f653bf833dc9b4f8d6b52651c094b5ccc67..e5a4b7450bfa7a700ce1c76f597266a9724a19f5
@@@ -74,8 -74,7 +74,8 @@@
  # define _XOPEN_SOURCE 500
  # endif
  #elif !defined(__APPLE__) && !defined(__FreeBSD__) && !defined(__USLC__) && \
 -      !defined(_M_UNIX) && !defined(__sgi) && !defined(__DragonFly__)
 +      !defined(_M_UNIX) && !defined(__sgi) && !defined(__DragonFly__) && \
 +      !defined(__TANDEM) && !defined(__QNX__)
  #define _XOPEN_SOURCE 600 /* glibc2 and AIX 5.3L need 500, OpenBSD needs 600 for S_ISLNK() */
  #define _XOPEN_SOURCE_EXTENDED 1 /* AIX 5.3L needs this */
  #endif
  #include <stdlib.h>
  #include <stdarg.h>
  #include <string.h>
 +#ifdef HAVE_STRINGS_H
 +#include <strings.h> /* for strcasecmp() */
 +#endif
  #include <errno.h>
  #include <limits.h>
 +#ifdef NEEDS_SYS_PARAM_H
  #include <sys/param.h>
 +#endif
  #include <sys/types.h>
  #include <dirent.h>
  #include <sys/time.h>
  #else
  #include <stdint.h>
  #endif
 +#ifdef NO_INTPTR_T
 +/*
 + * On I16LP32, ILP32 and LP64 "long" is the save bet, however
 + * on LLP86, IL33LLP64 and P64 it needs to be "long long",
 + * while on IP16 and IP16L32 it is "int" (resp. "short")
 + * Size needs to match (or exceed) 'sizeof(void *)'.
 + * We can't take "long long" here as not everybody has it.
 + */
 +typedef long intptr_t;
 +typedef unsigned long uintptr_t;
 +#endif
  #if defined(__CYGWIN__)
  #undef _XOPEN_SOURCE
  #include <grp.h>
  #endif
  #endif
  
 +/* used on Mac OS X */
 +#ifdef PRECOMPOSE_UNICODE
 +#include "compat/precompose_utf8.h"
 +#else
 +#define precompose_str(in,i_nfd2nfc)
 +#define precompose_argv(c,v)
 +#define probe_utf8_pathname_composition(a,b)
 +#endif
 +
 +#ifdef MKDIR_WO_TRAILING_SLASH
 +#define mkdir(a,b) compat_mkdir_wo_trailing_slash((a),(b))
 +extern int compat_mkdir_wo_trailing_slash(const char*, mode_t);
 +#endif
 +
 +#ifdef NO_STRUCT_ITIMERVAL
 +struct itimerval {
 +      struct timeval it_interval;
 +      struct timeval it_value;
 +}
 +#endif
 +
 +#ifdef NO_SETITIMER
 +#define setitimer(which,value,ovalue)
 +#endif
 +
  #ifndef NO_LIBGEN_H
  #include <libgen.h>
  #else
@@@ -290,17 -248,6 +290,17 @@@ extern NORETURN void die_errno(const ch
  extern int error(const char *err, ...) __attribute__((format (printf, 1, 2)));
  extern void warning(const char *err, ...) __attribute__((format (printf, 1, 2)));
  
 +/*
 + * Let callers be aware of the constant return value; this can help
 + * gcc with -Wuninitialized analysis. We have to restrict this trick to
 + * gcc, though, because of the variadic macro and the magic ## comma pasting
 + * behavior. But since we're only trying to help gcc, anyway, it's OK; other
 + * compilers will fall back to using the function as usual.
 + */
 +#ifdef __GNUC__
 +#define error(fmt, ...) (error((fmt), ##__VA_ARGS__), -1)
 +#endif
 +
  extern void set_die_routine(NORETURN_PTR void (*routine)(const char *err, va_list params));
  extern void set_error_routine(void (*routine)(const char *err, va_list params));
  
@@@ -424,10 -371,6 +424,10 @@@ void *gitmemmem(const void *haystack, s
                  const void *needle, size_t needlelen);
  #endif
  
 +#ifdef NO_GETPAGESIZE
 +#define getpagesize() sysconf(_SC_PAGESIZE)
 +#endif
 +
  #ifdef FREAD_READS_DIRECTORIES
  #ifdef fopen
  #undef fopen
@@@ -523,29 -466,40 +523,39 @@@ extern const char tolower_trans_tbl[256
  #undef isdigit
  #undef isalpha
  #undef isalnum
 +#undef isprint
  #undef islower
  #undef isupper
  #undef tolower
  #undef toupper
- extern unsigned char sane_ctype[256];
+ #undef iscntrl
+ #undef ispunct
+ #undef isxdigit
 -#undef isprint
++
+ extern const unsigned char sane_ctype[256];
  #define GIT_SPACE 0x01
  #define GIT_DIGIT 0x02
  #define GIT_ALPHA 0x04
  #define GIT_GLOB_SPECIAL 0x08
  #define GIT_REGEX_SPECIAL 0x10
  #define GIT_PATHSPEC_MAGIC 0x20
+ #define GIT_CNTRL 0x40
+ #define GIT_PUNCT 0x80
  #define sane_istest(x,mask) ((sane_ctype[(unsigned char)(x)] & (mask)) != 0)
  #define isascii(x) (((x) & ~0x7f) == 0)
  #define isspace(x) sane_istest(x,GIT_SPACE)
  #define isdigit(x) sane_istest(x,GIT_DIGIT)
  #define isalpha(x) sane_istest(x,GIT_ALPHA)
  #define isalnum(x) sane_istest(x,GIT_ALPHA | GIT_DIGIT)
 +#define isprint(x) ((x) >= 0x20 && (x) <= 0x7e)
  #define islower(x) sane_iscase(x, 1)
  #define isupper(x) sane_iscase(x, 0)
  #define is_glob_special(x) sane_istest(x,GIT_GLOB_SPECIAL)
  #define is_regex_special(x) sane_istest(x,GIT_GLOB_SPECIAL | GIT_REGEX_SPECIAL)
 -#define isprint(x) (sane_istest(x, GIT_ALPHA | GIT_DIGIT | GIT_SPACE | \
 -              GIT_PUNCT | GIT_REGEX_SPECIAL | GIT_GLOB_SPECIAL | \
 -              GIT_PATHSPEC_MAGIC))
+ #define iscntrl(x) (sane_istest(x,GIT_CNTRL))
+ #define ispunct(x) sane_istest(x, GIT_PUNCT | GIT_REGEX_SPECIAL | \
+               GIT_GLOB_SPECIAL | GIT_PATHSPEC_MAGIC)
+ #define isxdigit(x) (hexval_table[x] != -1)
  #define tolower(x) sane_case((unsigned char)(x), 0x20)
  #define toupper(x) sane_case((unsigned char)(x), 0)
  #define is_pathspec_magic(x) sane_istest(x,GIT_PATHSPEC_MAGIC)
@@@ -654,16 -608,6 +664,16 @@@ int rmdir_or_warn(const char *path)
   */
  int remove_or_warn(unsigned int mode, const char *path);
  
 +/*
 + * Call access(2), but warn for any error except "missing file"
 + * (ENOENT or ENOTDIR).
 + */
 +int access_or_warn(const char *path, int mode);
 +int access_or_die(const char *path, int mode);
 +
 +/* Warn on an inaccessible file that ought to be accessible */
 +void warn_on_inaccessible(const char *path);
 +
  /* Get the passwd entry for the UID of the current process. */
  struct passwd *xgetpwuid_self(void);
  
diff --combined t/t0003-attributes.sh
index 807b8b88e215df5ce39504b1858be8694499727d,c962403844690b6ffcecc9e0fd61c099aaea0b05..43b25137e9878e41557fd7d095cc991c27efdfc7
@@@ -123,6 -123,16 +123,6 @@@ test_expect_success 'attribute matchin
  
  '
  
 -test_expect_success 'check whether FS is case-insensitive' '
 -      mkdir junk &&
 -      echo good >junk/CamelCase &&
 -      echo bad >junk/camelcase &&
 -      if test "$(cat junk/CamelCase)" != good
 -      then
 -              test_set_prereq CASE_INSENSITIVE_FS
 -      fi
 -'
 -
  test_expect_success CASE_INSENSITIVE_FS 'additional case insensitivity tests' '
        test_must_fail attr_check a/B/D/g "a/b/d/*" "-c core.ignorecase=0" &&
        test_must_fail attr_check A/B/D/NO "a/b/d/*" "-c core.ignorecase=0" &&
@@@ -206,6 -216,43 +206,43 @@@ test_expect_success 'patterns starting 
        attr_check "!f" foo
  '
  
+ test_expect_success '"**" test' '
+       echo "**/f foo=bar" >.gitattributes &&
+       cat <<\EOF >expect &&
+ f: foo: bar
+ a/f: foo: bar
+ a/b/f: foo: bar
+ a/b/c/f: foo: bar
+ EOF
+       git check-attr foo -- "f" >actual 2>err &&
+       git check-attr foo -- "a/f" >>actual 2>>err &&
+       git check-attr foo -- "a/b/f" >>actual 2>>err &&
+       git check-attr foo -- "a/b/c/f" >>actual 2>>err &&
+       test_cmp expect actual &&
+       test_line_count = 0 err
+ '
+ test_expect_success '"**" with no slashes test' '
+       echo "a**f foo=bar" >.gitattributes &&
+       git check-attr foo -- "f" >actual &&
+       cat <<\EOF >expect &&
+ f: foo: unspecified
+ af: foo: bar
+ axf: foo: bar
+ a/f: foo: unspecified
+ a/b/f: foo: unspecified
+ a/b/c/f: foo: unspecified
+ EOF
+       git check-attr foo -- "f" >actual 2>err &&
+       git check-attr foo -- "af" >>actual 2>err &&
+       git check-attr foo -- "axf" >>actual 2>err &&
+       git check-attr foo -- "a/f" >>actual 2>>err &&
+       git check-attr foo -- "a/b/f" >>actual 2>>err &&
+       git check-attr foo -- "a/b/c/f" >>actual 2>>err &&
+       test_cmp expect actual &&
+       test_line_count = 0 err
+ '
  test_expect_success 'setup bare' '
        git clone --bare . bare.git &&
        cd bare.git