git
7 years agoMerge branch 'js/regexec-buf' into next
Junio C Hamano [Mon, 20 Mar 2017 21:03:24 +0000 (14:03 -0700)] 
Merge branch 'js/regexec-buf' into next

Fix for potential segv introduced in v2.11.0 and later (also
v2.10.2).

* js/regexec-buf:
  pickaxe: fix segfault with '-S<...> --pickaxe-regex'

7 years agoMerge branch 'jk/execv-dashed-external' into next
Junio C Hamano [Mon, 20 Mar 2017 21:03:23 +0000 (14:03 -0700)] 
Merge branch 'jk/execv-dashed-external' into next

Fix for NO_PTHREADS build.

* jk/execv-dashed-external:
  run-command: fix segfault when cleaning forked async process

7 years agoMerge branch 'dl/credential-cache-socket-in-xdg-cache' into next
Junio C Hamano [Mon, 20 Mar 2017 21:03:23 +0000 (14:03 -0700)] 
Merge branch 'dl/credential-cache-socket-in-xdg-cache' into next

The default location "~/.git-credential-cache/socket" for the
socket used to communicate with the credential-cache daemon has
been moved to "~/.cache/git/credential/socket".

* dl/credential-cache-socket-in-xdg-cache:
  credential-cache: add tests for XDG functionality
  credential-cache: use XDG_CACHE_HOME for socket
  path.c: add xdg_cache_home

7 years agoMerge branch 'sb/wt-status-cleanup' into next
Junio C Hamano [Mon, 20 Mar 2017 21:03:22 +0000 (14:03 -0700)] 
Merge branch 'sb/wt-status-cleanup' into next

Code clean-up.

* sb/wt-status-cleanup:
  wt-status: simplify by using for_each_string_list_item

7 years agoMerge branch 'js/rebase-helper' into next
Junio C Hamano [Mon, 20 Mar 2017 21:03:22 +0000 (14:03 -0700)] 
Merge branch 'js/rebase-helper' into next

Recent update to "rebase -i" started showing a message that is not
a warning with "warning:" prefix by mistake.  This has been fixed.

* js/rebase-helper:
  sequencer: drop "warning:" when stopping for edit

7 years agopickaxe: fix segfault with '-S<...> --pickaxe-regex'
SZEDER Gábor [Sat, 18 Mar 2017 18:24:08 +0000 (19:24 +0100)] 
pickaxe: fix segfault with '-S<...> --pickaxe-regex'

'git {log,diff,...} -S<...> --pickaxe-regex' can segfault as a result
of out-of-bounds memory reads.

diffcore-pickaxe.c:contains() looks for all matches of the given regex
in a buffer in a loop, advancing the buffer pointer to the end of the
last match in each iteration.  When we switched to REG_STARTEND in
b7d36ffca (regex: use regexec_buf(), 2016-09-21), we started passing
the size of that buffer to the regexp engine, too.  Unfortunately,
this buffer size is never updated on subsequent iterations, and as the
buffer pointer advances on each iteration, this "bufptr+bufsize"
points past the end of the buffer.  This results in segmentation
fault, if that memory can't be accessed.  In case of 'git log' it can
also result in erroneously listed commits, if the memory past the end
of buffer is accessible and happens to contain data matching the
regex.

Reduce the buffer size on each iteration as the buffer pointer is
advanced, thus maintaining the correct end of buffer location.
Furthermore, make sure that the buffer pointer is not dereferenced in
the control flow statements when we already reached the end of the
buffer.

The new test is flaky, I've never seen it fail on my Linux box even
without the fix, but this is expected according to db5dfa3 (regex:
-G<pattern> feeds a non NUL-terminated string to regexec() and fails,
2016-09-21).  However, it did fail on Travis CI with the first (and
incomplete) version of the fix, and based on that commit message I
would expect the new test without the fix to fail most of the time on
Windows.

Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
7 years agorun-command: fix segfault when cleaning forked async process
Jeff King [Fri, 17 Mar 2017 23:20:04 +0000 (19:20 -0400)] 
run-command: fix segfault when cleaning forked async process

Callers of the run-command API may mark a child as
"clean_on_exit"; it gets added to a list and killed when the
main process dies.  Since commit 46df6906f
(execv_dashed_external: wait for child on signal death,
2017-01-06), we respect an extra "wait_after_clean" flag,
which we expect to find in the child_process struct.

When Git is built with NO_PTHREADS, we start "struct
async" processes by forking rather than spawning a thread.
The resulting processes get added to the cleanup list but
they don't have a child_process struct, and the cleanup
function ends up dereferencing NULL.

We should notice this case and assume that the processes do
not need to be waited for (i.e., the same behavior they had
before 46df6906f).

Reported-by: Brandon Williams <bmwill@google.com>
Signed-off-by: Jeff King <peff@peff.net>
Reviewed-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
7 years agoSync with master
Junio C Hamano [Fri, 17 Mar 2017 20:54:26 +0000 (13:54 -0700)] 
Sync with master

* master:
  Fifth batch for 2.13

7 years agoMerge branch 'nd/conditional-config-include' into next
Junio C Hamano [Fri, 17 Mar 2017 20:54:15 +0000 (13:54 -0700)] 
Merge branch 'nd/conditional-config-include' into next

The configuration file learned a new "includeIf.<condition>.path"
that includes the contents of the given path only when the
condition holds.  This allows you to say "include this work-related
bit only in the repositories under my ~/work/ directory".

* nd/conditional-config-include:
  config: add conditional include
  config.txt: reflow the second include.path paragraph
  config.txt: clarify multiple key values in include.path

7 years agoFifth batch for 2.13
Junio C Hamano [Fri, 17 Mar 2017 20:51:58 +0000 (13:51 -0700)] 
Fifth batch for 2.13

Signed-off-by: Junio C Hamano <gitster@pobox.com>
7 years agoMerge branch 'jk/cherry-pick-0-mainline'
Junio C Hamano [Fri, 17 Mar 2017 20:50:28 +0000 (13:50 -0700)] 
Merge branch 'jk/cherry-pick-0-mainline'

"git revert -m 0 $merge_commit" complained that reverting a merge
needs to say relative to which parent the reversion needs to
happen, as if "-m 0" weren't given.  The correct diagnosis is that
"-m 0" does not refer to the first parent ("-m 1" does).  This has
been fixed.

* jk/cherry-pick-0-mainline:
  cherry-pick: detect bogus arguments to --mainline

7 years agoMerge branch 'js/early-config'
Junio C Hamano [Fri, 17 Mar 2017 20:50:28 +0000 (13:50 -0700)] 
Merge branch 'js/early-config'

The start-up sequence of "git" needs to figure out some configured
settings before it finds and set itself up in the location of the
repository and was quite messy due to its "chicken-and-egg" nature.
The code has been restructured.

* js/early-config:
  setup.c: mention unresolved problems
  t1309: document cases where we would want early config not to die()
  setup_git_directory_gently_1(): avoid die()ing
  t1309: test read_early_config()
  read_early_config(): really discover .git/
  read_early_config(): avoid .git/config hack when unneeded
  setup: make read_early_config() reusable
  setup: introduce the discover_git_directory() function
  setup_git_directory_1(): avoid changing global state
  setup: prepare setup_discovered_git_dir() for the root directory
  setup_git_directory(): use is_dir_sep() helper
  t7006: replace dubious test

7 years agoMerge branch 'bc/sha1-header-selection-with-cpp-macros'
Junio C Hamano [Fri, 17 Mar 2017 20:50:27 +0000 (13:50 -0700)] 
Merge branch 'bc/sha1-header-selection-with-cpp-macros'

Our source code has used the SHA1_HEADER cpp macro after "#include"
in the C code to switch among the SHA-1 implementations. Instead,
list the exact header file names and switch among implementations
using "#ifdef BLK_SHA1/#include "block-sha1/sha1.h"/.../#endif";
this helps some IDE tools.

* bc/sha1-header-selection-with-cpp-macros:
  hash.h: move SHA-1 implementation selection into a header file

7 years agoMerge branch 'mg/status-porcelain-no-i18n'
Junio C Hamano [Fri, 17 Mar 2017 20:50:27 +0000 (13:50 -0700)] 
Merge branch 'mg/status-porcelain-no-i18n'

"git status --porcelain" is supposed to give a stable output, but a
few strings were left as translatable by mistake.

* mg/status-porcelain-no-i18n:
  git-status: make porcelain more robust

7 years agoMerge branch 'jk/add-i-use-pathspecs'
Junio C Hamano [Fri, 17 Mar 2017 20:50:26 +0000 (13:50 -0700)] 
Merge branch 'jk/add-i-use-pathspecs'

"git add -p <pathspec>" unnecessarily expanded the pathspec to a
list of individual files that matches the pathspec by running "git
ls-files <pathspec>", before feeding it to "git diff-index" to see
which paths have changes, because historically the pathspec
language supported by "diff-index" was weaker.  These days they are
equivalent and there is no reason to internally expand it.  This
helps both performance and avoids command line argument limit on
some platforms.

* jk/add-i-use-pathspecs:
  add--interactive: do not expand pathspecs with ls-files

7 years agoMerge branch 'jk/http-walker-buffer-underflow-fix'
Junio C Hamano [Fri, 17 Mar 2017 20:50:26 +0000 (13:50 -0700)] 
Merge branch 'jk/http-walker-buffer-underflow-fix'

"Dumb http" transport used to misparse a nonsense http-alternates
response, which has been fixed.

* jk/http-walker-buffer-underflow-fix:
  http-walker: fix buffer underflow processing remote alternates

7 years agoMerge branch 'bw/attr-pathspec'
Junio C Hamano [Fri, 17 Mar 2017 20:50:26 +0000 (13:50 -0700)] 
Merge branch 'bw/attr-pathspec'

The pathspec mechanism learned to further limit the paths that
match the pattern to those that have specified attributes attached
via the gitattributes mechanism.

* bw/attr-pathspec:
  pathspec: allow escaped query values
  pathspec: allow querying for attributes

7 years agoMerge branch 'jk/ref-filter-flags-cleanup'
Junio C Hamano [Fri, 17 Mar 2017 20:50:25 +0000 (13:50 -0700)] 
Merge branch 'jk/ref-filter-flags-cleanup'

"git tag --contains" used to (ab)use the object bits to keep track
of the state of object reachability without clearing them after
use; this has been cleaned up and made to use the newer commit-slab
facility.

* jk/ref-filter-flags-cleanup:
  ref-filter: use separate cache for contains_tag_algo
  ref-filter: die on parse_commit errors
  ref-filter: use contains_result enum consistently
  ref-filter: move ref_cbdata definition into ref-filter.c

7 years agoMerge branch 'sb/rev-parse-show-superproject-root'
Junio C Hamano [Fri, 17 Mar 2017 20:50:25 +0000 (13:50 -0700)] 
Merge branch 'sb/rev-parse-show-superproject-root'

From a working tree of a repository, a new option of "rev-parse"
lets you ask if the repository is used as a submodule of another
project, and where the root level of the working tree of that
project (i.e. your superproject) is.

* sb/rev-parse-show-superproject-root:
  rev-parse: add --show-superproject-working-tree

7 years agoMerge branch 'bc/object-id'
Junio C Hamano [Fri, 17 Mar 2017 20:50:24 +0000 (13:50 -0700)] 
Merge branch 'bc/object-id'

"uchar [40]" to "struct object_id" conversion continues.

* bc/object-id:
  wt-status: convert to struct object_id
  builtin/merge-base: convert to struct object_id
  Convert object iteration callbacks to struct object_id
  sha1_file: introduce an nth_packed_object_oid function
  refs: simplify parsing of reflog entries
  refs: convert each_reflog_ent_fn to struct object_id
  reflog-walk: convert struct reflog_info to struct object_id
  builtin/replace: convert to struct object_id
  Convert remaining callers of resolve_refdup to object_id
  builtin/merge: convert to struct object_id
  builtin/clone: convert to struct object_id
  builtin/branch: convert to struct object_id
  builtin/grep: convert to struct object_id
  builtin/fmt-merge-message: convert to struct object_id
  builtin/fast-export: convert to struct object_id
  builtin/describe: convert to struct object_id
  builtin/diff-tree: convert to struct object_id
  builtin/commit: convert to struct object_id
  hex: introduce parse_oid_hex

7 years agoMerge branch 'rs/blame-code-cleanup'
Junio C Hamano [Fri, 17 Mar 2017 20:50:24 +0000 (13:50 -0700)] 
Merge branch 'rs/blame-code-cleanup'

Code clean-up.

* rs/blame-code-cleanup:
  blame: move blame_entry duplication to add_blame_entry()

7 years agoMerge branch 'jk/interop-test'
Junio C Hamano [Fri, 17 Mar 2017 20:50:23 +0000 (13:50 -0700)] 
Merge branch 'jk/interop-test'

Picking two versions of Git and running tests to make sure the
older one and the newer one interoperate happily has now become
possible.

* jk/interop-test:
  t/interop: add test of old clients against modern git-daemon
  t: add an interoperability test harness

7 years agoMerge branch 'cc/split-index-config'
Junio C Hamano [Fri, 17 Mar 2017 20:50:23 +0000 (13:50 -0700)] 
Merge branch 'cc/split-index-config'

The experimental "split index" feature has gained a few
configuration variables to make it easier to use.

* cc/split-index-config: (22 commits)
  Documentation/git-update-index: explain splitIndex.*
  Documentation/config: add splitIndex.sharedIndexExpire
  read-cache: use freshen_shared_index() in read_index_from()
  read-cache: refactor read_index_from()
  t1700: test shared index file expiration
  read-cache: unlink old sharedindex files
  config: add git_config_get_expiry() from gc.c
  read-cache: touch shared index files when used
  sha1_file: make check_and_freshen_file() non static
  Documentation/config: add splitIndex.maxPercentChange
  t1700: add tests for splitIndex.maxPercentChange
  read-cache: regenerate shared index if necessary
  config: add git_config_get_max_percent_split_change()
  Documentation/git-update-index: talk about core.splitIndex config var
  Documentation/config: add information for core.splitIndex
  t1700: add tests for core.splitIndex
  update-index: warn in case of split-index incoherency
  read-cache: add and then use tweak_split_index()
  split-index: add {add,remove}_split_index() functions
  config: add git_config_get_split_index()
  ...

7 years agocredential-cache: add tests for XDG functionality
Devin Lehmacher [Fri, 17 Mar 2017 12:36:34 +0000 (08:36 -0400)] 
credential-cache: add tests for XDG functionality

Signed-off-by: Devin Lehmacher <lehmacdj@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
7 years agocredential-cache: use XDG_CACHE_HOME for socket
Devin Lehmacher [Fri, 17 Mar 2017 12:36:33 +0000 (08:36 -0400)] 
credential-cache: use XDG_CACHE_HOME for socket

Make git-credential-cache follow the XDG base path specification by
default. This increases consistency with other applications and helps
keep clutter out of users' home directories.

Check the old socket location, ~/.git-credential-cache/, and use
~/.git-credential-cache/socket if that directory exists rather than
forcing users who have used `git credential-cache` before to migrate to
the new XDG compliant location.
Otherwise use the socket $XDG_CACHE_HOME/git/credential/socket following
XDG base path specification. Use the subdirectory credential/ in case
other files are cached under $XDG_CACHE_HOME/git/ in the future and to
make the socket's purpose clear.

Signed-off-by: Devin Lehmacher <lehmacdj@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
7 years agowt-status: simplify by using for_each_string_list_item
Stefan Beller [Thu, 16 Mar 2017 21:36:19 +0000 (14:36 -0700)] 
wt-status: simplify by using for_each_string_list_item

Improve readability by using the for_each_string_list_item helper
instead of manually iterating with an integer counter.

Signed-off-by: Stefan Beller <sbeller@google.com>
Reviewed-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
7 years agosequencer: drop "warning:" when stopping for edit
Jeff King [Fri, 17 Mar 2017 00:19:42 +0000 (20:19 -0400)] 
sequencer: drop "warning:" when stopping for edit

Since the conversion from shell to C in 56dc3ab04 (sequencer
(rebase -i): implement the 'edit' command, 2017-01-02),
stopping at an "edit" instruction went from:

  $ git rebase -i
  Stopped at 6ce6b914a... odb_pack_keep(): stop generating keepfile name
  You can amend the commit now, with
    [...more instructions...]

to:

  $ git rebase -i
  warning: stopped at 6ce6b914a... odb_pack_keep(): stop generating keepfile name
  You can amend the commit now, with
    [...more instructions...]

The "warning" implies that it's something unexpected, but
it's not. Let's switch back to the original message.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
7 years agoMerge branch 'master' into next
Junio C Hamano [Thu, 16 Mar 2017 21:04:25 +0000 (14:04 -0700)] 
Merge branch 'master' into next

* master:
  Preparing for 2.12.1

7 years agoSync with 'maint'
Junio C Hamano [Thu, 16 Mar 2017 21:03:11 +0000 (14:03 -0700)] 
Sync with 'maint'

* maint:
  Preparing for 2.12.1

7 years agoPreparing for 2.12.1
Junio C Hamano [Thu, 16 Mar 2017 21:01:00 +0000 (14:01 -0700)] 
Preparing for 2.12.1

Signed-off-by: Junio C Hamano <gitster@pobox.com>
7 years agoMerge branch 'js/realpath-pathdup-fix' into maint
Junio C Hamano [Thu, 16 Mar 2017 20:56:43 +0000 (13:56 -0700)] 
Merge branch 'js/realpath-pathdup-fix' into maint

Git v2.12 was shipped with an embarrassing breakage where various
operations that verify paths given from the user stopped dying when
seeing an issue, and instead later triggering segfault.
... and then to down to 'maint'.

* js/realpath-pathdup-fix:
  real_pathdup(): fix callsites that wanted it to die on error
  t1501: demonstrate NULL pointer access with invalid GIT_WORK_TREE

7 years agoMerge branch 'mm/two-more-xstrfmt' into maint
Junio C Hamano [Thu, 16 Mar 2017 20:56:43 +0000 (13:56 -0700)] 
Merge branch 'mm/two-more-xstrfmt' into maint

Code clean-up and a string truncation fix.

* mm/two-more-xstrfmt:
  bisect_next_all: convert xsnprintf to xstrfmt
  stop_progress_msg: convert xsnprintf to xstrfmt

7 years agoMerge branch 'vn/line-log-memcpy-size-fix' into maint
Junio C Hamano [Thu, 16 Mar 2017 20:56:42 +0000 (13:56 -0700)] 
Merge branch 'vn/line-log-memcpy-size-fix' into maint

The command-line parsing of "git log -L" copied internal data
structures using incorrect size on ILP32 systems.

* vn/line-log-memcpy-size-fix:
  line-log: use COPY_ARRAY to fix mis-sized memcpy

7 years agoMerge branch 'ax/line-log-range-merge-fix' into maint
Junio C Hamano [Thu, 16 Mar 2017 20:56:42 +0000 (13:56 -0700)] 
Merge branch 'ax/line-log-range-merge-fix' into maint

The code to parse "git log -L..." command line was buggy when there
are many ranges specified with -L; overrun of the allocated buffer
has been fixed.

* ax/line-log-range-merge-fix:
  line-log.c: prevent crash during union of too many ranges

7 years agoMerge branch 'jk/add-i-patch-do-prompt' into maint
Junio C Hamano [Thu, 16 Mar 2017 20:56:42 +0000 (13:56 -0700)] 
Merge branch 'jk/add-i-patch-do-prompt' into maint

The patch subcommand of "git add -i" was meant to have paths
selection prompt just like other subcommand, unlike "git add -p"
directly jumps to hunk selection.  Recently, this was broken and
"add -i" lost the paths selection dialog, but it now has been
fixed.

* jk/add-i-patch-do-prompt:
  add--interactive: fix missing file prompt for patch mode with "-i"

7 years agoMerge branch 'jt/http-base-url-update-upon-redirect' into maint
Junio C Hamano [Thu, 16 Mar 2017 20:56:42 +0000 (13:56 -0700)] 
Merge branch 'jt/http-base-url-update-upon-redirect' into maint

When a redirected http transport gets an error during the
redirected request, we ignored the error we got from the server,
and ended up giving a not-so-useful error message.

* jt/http-base-url-update-upon-redirect:
  http: attempt updating base URL only if no error

7 years agoMerge branch 'js/travis-32bit-linux' into maint
Junio C Hamano [Thu, 16 Mar 2017 20:56:41 +0000 (13:56 -0700)] 
Merge branch 'js/travis-32bit-linux' into maint

Add 32-bit Linux variant to the set of platforms to be tested with
Travis CI.

* js/travis-32bit-linux:
  Travis: also test on 32-bit Linux

7 years agoMerge branch 'jh/mingw-openssl-sha1' into maint
Junio C Hamano [Thu, 16 Mar 2017 20:56:41 +0000 (13:56 -0700)] 
Merge branch 'jh/mingw-openssl-sha1' into maint

Windows port wants to use OpenSSL's implementation of SHA-1
routines, so let them.

* jh/mingw-openssl-sha1:
  mingw: use OpenSSL's SHA-1 routines

7 years agoMerge branch 'jk/http-auth' into maint
Junio C Hamano [Thu, 16 Mar 2017 20:56:41 +0000 (13:56 -0700)] 
Merge branch 'jk/http-auth' into maint

Reduce authentication round-trip over HTTP when the server supports
just a single authentication method.

* jk/http-auth:
  http: add an "auto" mode for http.emptyauth
  http: restrict auth methods to what the server advertises

7 years agoMerge branch 'jk/pack-name-cleanups' into next
Junio C Hamano [Thu, 16 Mar 2017 20:26:13 +0000 (13:26 -0700)] 
Merge branch 'jk/pack-name-cleanups' into next

Code clean-up.

* jk/pack-name-cleanups:
  index-pack: make pointer-alias fallbacks safer
  replace snprintf with odb_pack_name()
  odb_pack_keep(): stop generating keepfile name
  sha1_file.c: make pack-name helper globally accessible
  move odb_* declarations out of git-compat-util.h

7 years agoMerge branch 'sb/submodule-config-parse-ignore-fix' into next
Junio C Hamano [Thu, 16 Mar 2017 20:26:13 +0000 (13:26 -0700)] 
Merge branch 'sb/submodule-config-parse-ignore-fix' into next

Code to read submodule.<name>.ignore config did not state the
variable name correctly when giving an error message diagnosing
misconfiguration.

* sb/submodule-config-parse-ignore-fix:
  submodule-config: correct error reporting for invalid ignore value

7 years agoMerge branch 'mg/prompt-describe-tags' into next
Junio C Hamano [Thu, 16 Mar 2017 20:26:13 +0000 (13:26 -0700)] 
Merge branch 'mg/prompt-describe-tags' into next

The command line prompt (in contrib/) learned a new 'tag' style
that can be specified with GIT_PS1_DESCRIBE_STYLE, to describe a
detached HEAD with "git describe --tags".

* mg/prompt-describe-tags:
  git-prompt: add a describe style for any tags

7 years agoMerge branch 'js/difftool-builtin' into next
Junio C Hamano [Thu, 16 Mar 2017 20:26:12 +0000 (13:26 -0700)] 
Merge branch 'js/difftool-builtin' into next

"git difftool --dir-diff" used to die a controlled death giving a
"fatal" message when encountering a locally modified symbolic link,
but it started segfaulting since v2.12.  This has been fixed.

* js/difftool-builtin:
  difftool: handle modified symlinks in dir-diff mode
  t7800: cleanup cruft left behind by tests
  t7800: remove whitespace before redirect

7 years agoMerge branch 'jk/rev-parse-cleanup' into next
Junio C Hamano [Thu, 16 Mar 2017 20:26:12 +0000 (13:26 -0700)] 
Merge branch 'jk/rev-parse-cleanup' into next

Code clean-up.

* jk/rev-parse-cleanup:
  rev-parse: simplify parsing of ref options
  rev-parse: add helper for parsing "--foo/--foo="
  rev-parse: use skip_prefix when parsing options

7 years agoMerge branch 'jk/cherry-pick-0-mainline' into next
Junio C Hamano [Thu, 16 Mar 2017 20:26:12 +0000 (13:26 -0700)] 
Merge branch 'jk/cherry-pick-0-mainline' into next

"git revert -m 0 $merge_commit" complained that reverting a merge
needs to say relative to which parent the reversion needs to
happen, as if "-m 0" weren't given.  The correct diagnosis is that
"-m 0" does not refer to the first parent ("-m 1" does).  This has
been fixed.

* jk/cherry-pick-0-mainline:
  cherry-pick: detect bogus arguments to --mainline

7 years agoindex-pack: make pointer-alias fallbacks safer
Jeff King [Thu, 16 Mar 2017 14:27:20 +0000 (10:27 -0400)] 
index-pack: make pointer-alias fallbacks safer

The final() function accepts a NULL value for certain
parameters, and falls back to writing into a reusable "name"
buffer, and then either:

  1. For "keep_name", requiring all uses to do "keep_name ?
     keep_name : name.buf". This is awkward, and it's easy
     to accidentally look at the maybe-NULL keep_name.

  2. For "final_index_name" and "final_pack_name", aliasing
     those pointers to the "name" buffer. This is easier to
     use, but the aliased pointers become invalid after the
     buffer is reused (this isn't a bug now, but it's a
     potential pitfall).

One way to make this safer would be to introduce an extra
pointer to do the aliasing, and have its lifetime match the
validity of the "name" buffer. But it's still easy to
accidentally use the wrong name (i.e., to use
"final_pack_name" instead of the aliased pointer).

Instead, let's use three separate buffers that will remain
valid through the function. That makes it safe to alias the
pointers and use them consistently. The extra allocations
shouldn't matter, as this function is not performance
sensitive.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
7 years agoreplace snprintf with odb_pack_name()
Jeff King [Thu, 16 Mar 2017 14:27:15 +0000 (10:27 -0400)] 
replace snprintf with odb_pack_name()

In several places we write the name of the pack filename
into a fixed-size buffer using snprintf(), but do not check
the return value.  As a result, a very long object directory
could cause us to quietly truncate the pack filename
(potentially leading to a corrupted repository, as a newly
written packfile could be missing its .pack extension).

We can use odb_pack_name() to do this with a strbuf (and
shorten the code, as well).

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
7 years agoodb_pack_keep(): stop generating keepfile name
Jeff King [Thu, 16 Mar 2017 14:27:12 +0000 (10:27 -0400)] 
odb_pack_keep(): stop generating keepfile name

The odb_pack_keep() function generates the name of a .keep
file and opens it. This has two problems:

  1. It requires a fixed-size buffer to create the filename
     and doesn't notice when the result is truncated.

  2. Of the two callers, one sometimes wants to open a
     filename it already has, which makes things awkward (it
     has to do so manually, and skips the leading-directory
     creation).

Instead, let's have odb_pack_keep() just open the file.
Generating the name isn't hard, and a future patch will
switch callers over to odb_pack_name() anyway.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
7 years agosha1_file.c: make pack-name helper globally accessible
Jeff King [Thu, 16 Mar 2017 14:27:06 +0000 (10:27 -0400)] 
sha1_file.c: make pack-name helper globally accessible

We provide sha1_pack_name() and sha1_pack_index_name(), but
the more generic form (which takes its own strbuf and an
arbitrary extension) is only used to implement the other
two.  Let's make it available, but clean up a few things:

  1. Name it odb_pack_name(), as the original
     sha1_get_pack_name() is long but not all that
     descriptive.

  2. Switch the strbuf argument to the beginning, so that it
     matches similar path-building functions like
     git_path_buf().

  3. Clean up the out-dated docstring and move it to the
     public declaration.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
7 years agomove odb_* declarations out of git-compat-util.h
Jeff King [Thu, 16 Mar 2017 14:27:00 +0000 (10:27 -0400)] 
move odb_* declarations out of git-compat-util.h

These functions were originally conceived as wrapper
functions similar to xmkstemp(). They were later moved by
463db9b10 (wrapper: move odb_* to environment.c,
2010-11-06). The more appropriate place for a declaration is
in cache.h.

While we're at it, let's add some basic docstrings.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
7 years agorev-parse: simplify parsing of ref options
Jeff King [Wed, 15 Mar 2017 20:08:02 +0000 (16:08 -0400)] 
rev-parse: simplify parsing of ref options

All of these options do the same thing "--foo" iterates over
the "foo" refs, and "--foo=<glob>" does the same with a
glob. We can factor this into its own function to avoid
repeating ourselves.

There are two subtleties to note:

  - the original called for_each_branch_ref(), etc, in the
    non-glob case. Now we will call for_each_ref_in("refs/heads/")
    which is exactly what for_each_branch_ref() did under
    the hood.

  - for --glob, we'll call for_each_glob_ref_in() with a
    NULL "prefix" argument. Which is exactly what
    for_each_glob_ref() was doing already.

So both cases should behave identically, and it seems
reasonable to assume that this will remain the same. The
functions we are calling now are the more-generic ones, and
the ones we are dropping are just convenience wrappers.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
7 years agorev-parse: add helper for parsing "--foo/--foo="
Jeff King [Wed, 15 Mar 2017 20:06:53 +0000 (16:06 -0400)] 
rev-parse: add helper for parsing "--foo/--foo="

We can't just use a bare skip_prefix() for these cases,
because we need to match both the "--foo" form and the
"--foo=<value>" form (and tell the difference between the
two in the caller).

We can wrap this in a simple helper which has two obvious
callsites, and will gain some more in the next patch.

Note that the error output for abbrev-ref changes slightly,
as we don't keep our original "arg" pointer. However, the
new output should hopefully be more clear:

  [before]
  fatal: unknown mode for --abbrev-ref=foo

  [after]
  fatal: unknown mode for --abbrev-ref: foo

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
7 years agorev-parse: use skip_prefix when parsing options
Jeff King [Wed, 15 Mar 2017 20:05:36 +0000 (16:05 -0400)] 
rev-parse: use skip_prefix when parsing options

Using skip_prefix lets us avoid manually-counted offsets
into the argument string. This patch converts the simple and
obvious cases.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
7 years agogit-prompt: add a describe style for any tags
Michael J Gruber [Wed, 15 Mar 2017 13:15:09 +0000 (14:15 +0100)] 
git-prompt: add a describe style for any tags

git-prompt has various describe styles, among them "describe" (by
annotated tags) and "default" (by exact match with any tag).

Add a mode "tag" that describes by any tag, annotated or not.

Signed-off-by: Michael J Gruber <git@drmicha.warpmail.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
7 years agocherry-pick: detect bogus arguments to --mainline
Jeff King [Wed, 15 Mar 2017 16:56:23 +0000 (12:56 -0400)] 
cherry-pick: detect bogus arguments to --mainline

The cherry-pick and revert commands use OPT_INTEGER() to
parse --mainline. The stock parser is smart enough to reject
non-numeric nonsense, but it doesn't know that parent
counting starts at 1.

Worse, the value "0" is indistinguishable from the unset
case, so a user who assumes the counting is 0-based will get
a confusing message:

  $ git cherry-pick -m 0 $merge
  error: commit ... is a merge but no -m option was given.

Let's use a custom callback that enforces our range.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
7 years agodifftool: handle modified symlinks in dir-diff mode
David Aguilar [Wed, 15 Mar 2017 09:31:30 +0000 (02:31 -0700)] 
difftool: handle modified symlinks in dir-diff mode

Detect the null object ID for symlinks in dir-diff so that difftool can
detect when symlinks are modified in the worktree.

Previously, a null symlink object ID would crash difftool.
Handle null object IDs as unknown content that must be read from
the worktree.

Helped-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: David Aguilar <davvid@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
7 years agot7800: cleanup cruft left behind by tests
David Aguilar [Wed, 15 Mar 2017 06:54:05 +0000 (23:54 -0700)] 
t7800: cleanup cruft left behind by tests

Signed-off-by: David Aguilar <davvid@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
7 years agot7800: remove whitespace before redirect
David Aguilar [Wed, 15 Mar 2017 06:54:04 +0000 (23:54 -0700)] 
t7800: remove whitespace before redirect

Signed-off-by: David Aguilar <davvid@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
7 years agosubmodule-config: correct error reporting for invalid ignore value
Stefan Beller [Tue, 14 Mar 2017 22:14:40 +0000 (15:14 -0700)] 
submodule-config: correct error reporting for invalid ignore value

As 'var' contains the whole value we get error messages that repeat
the section and key currently:

warning: Invalid parameter 'true' for config option 'submodule.submodule.plugins/hooks.ignore.ignore'

Fix this by only giving the section name in the warning.

Signed-off-by: Stefan Beller <sbeller@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
7 years agoMerge branch 'bc/sha1-header-selection-with-cpp-macros' into next
Junio C Hamano [Wed, 15 Mar 2017 18:01:21 +0000 (11:01 -0700)] 
Merge branch 'bc/sha1-header-selection-with-cpp-macros' into next

Our source code has used the SHA1_HEADER cpp macro after "#include"
in the C code to switch among the SHA-1 implementations. Instead,
list the exact header file names and switch among implementations
using "#ifdef BLK_SHA1/#include "block-sha1/sha1.h"/.../#endif";
this helps some IDE tools.

* bc/sha1-header-selection-with-cpp-macros:
  hash.h: move SHA-1 implementation selection into a header file

7 years agohash.h: move SHA-1 implementation selection into a header file
brian m. carlson [Sat, 11 Mar 2017 22:28:18 +0000 (22:28 +0000)] 
hash.h: move SHA-1 implementation selection into a header file

Many developers use functionality in their editors that allows for quick
syntax checks, including warning about questionable constructs.  This
functionality allows rapid development with fewer errors.  However, such
functionality generally does not allow the specification of
project-specific defines or command-line options.

Since the SHA1_HEADER include is not defined in such a case,
developers see spurious errors when using these tools.  Furthermore,
there are known implementations of "cc" whose '#include' is unhappy
with this construct.

Instead of using SHA1_HEADER, create a hash.h header and use #if
and #elif to select the desired header.  Have the Makefile pass an
appropriate option to help the header select the right implementation to
use.

[jc: make BLK_SHA1 the fallback default as discussed on list,
e.g. <20170314201424.vccij5z2ortq4a4o@sigill.intra.peff.net>; also
remove SHA1_HEADER and SHA1_HEADER_SQ that are no longer used].

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Reviewed-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
7 years agoRevert "Merge branch 'bc/sha1-header-selection-with-cpp-macros' into next"
Junio C Hamano [Wed, 15 Mar 2017 17:59:54 +0000 (10:59 -0700)] 
Revert "Merge branch 'bc/sha1-header-selection-with-cpp-macros' into next"

This reverts commit 60bf8c5822dd8b3d073e998f03a7ed7f730d1428, reversing
changes made to 09558958255da78c9b85dbc3e46de3eff875d968.

7 years agoSync with master
Junio C Hamano [Tue, 14 Mar 2017 22:37:42 +0000 (15:37 -0700)] 
Sync with master

* master:
  Fourth batch after 2.12

7 years agoMerge branch 'js/early-config' into next
Junio C Hamano [Tue, 14 Mar 2017 22:37:32 +0000 (15:37 -0700)] 
Merge branch 'js/early-config' into next

The start-up sequence of "git" needs to figure out some configured
settings before it finds and set itself up in the location of the
repository and was quite messy due to its "chicken-and-egg" nature.
The code has been restructured.

* js/early-config:
  setup.c: mention unresolved problems
  t1309: document cases where we would want early config not to die()
  setup_git_directory_gently_1(): avoid die()ing
  t1309: test read_early_config()
  read_early_config(): really discover .git/
  read_early_config(): avoid .git/config hack when unneeded
  setup: make read_early_config() reusable
  setup: introduce the discover_git_directory() function
  setup_git_directory_1(): avoid changing global state
  setup: prepare setup_discovered_git_dir() for the root directory
  setup_git_directory(): use is_dir_sep() helper
  t7006: replace dubious test

7 years agoMerge branch 'bc/sha1-header-selection-with-cpp-macros' into next
Junio C Hamano [Tue, 14 Mar 2017 22:37:32 +0000 (15:37 -0700)] 
Merge branch 'bc/sha1-header-selection-with-cpp-macros' into next

Our source code has used the SHA1_HEADER cpp macro after "#include"
in the C code to switch among the SHA-1 implementations. Instead,
list the exact header file names and switch among implementations
using "#ifdef BLK_SHA1/#include "block-sha1/sha1.h"/.../#endif";
this helps some IDE tools.

* bc/sha1-header-selection-with-cpp-macros:
  hash.h: move SHA-1 implementation selection into a header file

7 years agoMerge branch 'mg/status-porcelain-no-i18n' into next
Junio C Hamano [Tue, 14 Mar 2017 22:37:31 +0000 (15:37 -0700)] 
Merge branch 'mg/status-porcelain-no-i18n' into next

"git status --porcelain" is supposed to give a stable output, but a
few strings were left as translatable by mistake.

* mg/status-porcelain-no-i18n:
  git-status: make porcelain more robust

7 years agoMerge branch 'jk/add-i-use-pathspecs' into next
Junio C Hamano [Tue, 14 Mar 2017 22:37:31 +0000 (15:37 -0700)] 
Merge branch 'jk/add-i-use-pathspecs' into next

"git add -p <pathspec>" unnecessarily expanded the pathspec to a
list of individual files that matches the pathspec by running "git
ls-files <pathspec>", before feeding it to "git diff-index" to see
which paths have changes, because historically the pathspec
language supported by "diff-index" was weaker.  These days they are
equivalent and there is no reason to internally expand it.  This
helps both performance and avoids command line argument limit on
some platforms.

* jk/add-i-use-pathspecs:
  add--interactive: do not expand pathspecs with ls-files

7 years agoMerge branch 'jk/http-walker-buffer-underflow-fix' into next
Junio C Hamano [Tue, 14 Mar 2017 22:37:31 +0000 (15:37 -0700)] 
Merge branch 'jk/http-walker-buffer-underflow-fix' into next

"Dumb http" transport used to misparse a nonsense http-alternates
response, which has been fixed.

* jk/http-walker-buffer-underflow-fix:
  http-walker: fix buffer underflow processing remote alternates

7 years agoMerge branch 'bw/attr-pathspec' into next
Junio C Hamano [Tue, 14 Mar 2017 22:37:30 +0000 (15:37 -0700)] 
Merge branch 'bw/attr-pathspec' into next

The pathspec mechanism learned to further limit the paths that
match the pattern to those that have specified attributes attached
via the gitattributes mechanism.

* bw/attr-pathspec:
  pathspec: allow escaped query values
  pathspec: allow querying for attributes

7 years agoMerge branch 'jk/ref-filter-flags-cleanup' into next
Junio C Hamano [Tue, 14 Mar 2017 22:37:30 +0000 (15:37 -0700)] 
Merge branch 'jk/ref-filter-flags-cleanup' into next

"git tag --contains" used to (ab)use the object bits to keep track
of the state of object reachability without clearing them after
use; this has been cleaned up and made to use the newer commit-slab
facility.

* jk/ref-filter-flags-cleanup:
  ref-filter: use separate cache for contains_tag_algo
  ref-filter: die on parse_commit errors
  ref-filter: use contains_result enum consistently
  ref-filter: move ref_cbdata definition into ref-filter.c

7 years agoMerge branch 'sb/rev-parse-show-superproject-root' into next
Junio C Hamano [Tue, 14 Mar 2017 22:37:29 +0000 (15:37 -0700)] 
Merge branch 'sb/rev-parse-show-superproject-root' into next

From a working tree of a repository, a new option of "rev-parse"
lets you ask if the repository is used as a submodule of another
project, and where the root level of the working tree of that
project (i.e. your superproject) is.

* sb/rev-parse-show-superproject-root:
  rev-parse: add --show-superproject-working-tree

7 years agoMerge branch 'bc/object-id' into next
Junio C Hamano [Tue, 14 Mar 2017 22:37:29 +0000 (15:37 -0700)] 
Merge branch 'bc/object-id' into next

"uchar [40]" to "struct object_id" conversion continues.

* bc/object-id:
  wt-status: convert to struct object_id
  builtin/merge-base: convert to struct object_id
  Convert object iteration callbacks to struct object_id
  sha1_file: introduce an nth_packed_object_oid function
  refs: simplify parsing of reflog entries
  refs: convert each_reflog_ent_fn to struct object_id
  reflog-walk: convert struct reflog_info to struct object_id
  builtin/replace: convert to struct object_id
  Convert remaining callers of resolve_refdup to object_id
  builtin/merge: convert to struct object_id
  builtin/clone: convert to struct object_id
  builtin/branch: convert to struct object_id
  builtin/grep: convert to struct object_id
  builtin/fmt-merge-message: convert to struct object_id
  builtin/fast-export: convert to struct object_id
  builtin/describe: convert to struct object_id
  builtin/diff-tree: convert to struct object_id
  builtin/commit: convert to struct object_id
  hex: introduce parse_oid_hex

7 years agoFourth batch after 2.12
Junio C Hamano [Tue, 14 Mar 2017 22:29:40 +0000 (15:29 -0700)] 
Fourth batch after 2.12

Signed-off-by: Junio C Hamano <gitster@pobox.com>
7 years agoMerge branch 'kn/ref-filter-branch-list'
Junio C Hamano [Tue, 14 Mar 2017 22:23:20 +0000 (15:23 -0700)] 
Merge branch 'kn/ref-filter-branch-list'

"git branch --list" takes the "--abbrev" and "--no-abbrev" options
to control the output of the object name in its "-v"(erbose)
output, but a recent update started ignoring them; this fixes it
before the breakage reaches to any released version.

* kn/ref-filter-branch-list:
  branch: honor --abbrev/--no-abbrev in --list mode

7 years agoMerge branch 'jk/push-deadlock-regression-fix'
Junio C Hamano [Tue, 14 Mar 2017 22:23:20 +0000 (15:23 -0700)] 
Merge branch 'jk/push-deadlock-regression-fix'

"git push" had a handful of codepaths that could lead to a deadlock
when unexpected error happened, which has been fixed.

* jk/push-deadlock-regression-fix:
  send-pack: report signal death of pack-objects
  send-pack: read "unpack" status even on pack-objects failure
  send-pack: improve unpack-status error messages
  send-pack: use skip_prefix for parsing unpack status
  send-pack: extract parsing of "unpack" response
  receive-pack: fix deadlock when we cannot create tmpdir

7 years agoMerge branch 'js/travis-32bit-linux'
Junio C Hamano [Tue, 14 Mar 2017 22:23:20 +0000 (15:23 -0700)] 
Merge branch 'js/travis-32bit-linux'

Add 32-bit Linux variant to the set of platforms to be tested with
Travis CI.

* js/travis-32bit-linux:
  Travis: also test on 32-bit Linux

7 years agoMerge branch 'ew/http-alternates-as-redirects-warning'
Junio C Hamano [Tue, 14 Mar 2017 22:23:19 +0000 (15:23 -0700)] 
Merge branch 'ew/http-alternates-as-redirects-warning'

Recent versions of Git treats http alternates (used in dumb http
transport) just like HTTP redirects and requires the client to
enable following it, due to security concerns.  But we forgot to
give a warning when we decide not to honor the alternates.

* ew/http-alternates-as-redirects-warning:
  http: release strbuf on disabled alternates
  http: inform about alternates-as-redirects behavior

7 years agoMerge branch 'dp/filter-branch-prune-empty'
Junio C Hamano [Tue, 14 Mar 2017 22:23:19 +0000 (15:23 -0700)] 
Merge branch 'dp/filter-branch-prune-empty'

"git filter-branch --prune-empty" drops a single-parent commit that
becomes a no-op, but did not drop a root commit whose tree is empty.

* dp/filter-branch-prune-empty:
  p7000: add test for filter-branch with --prune-empty
  filter-branch: fix --prune-empty on parentless commits
  t7003: ensure --prune-empty removes entire branch when applicable
  t7003: ensure --prune-empty can prune root commit

7 years agoMerge branch 'jt/perf-updates'
Junio C Hamano [Tue, 14 Mar 2017 22:23:18 +0000 (15:23 -0700)] 
Merge branch 'jt/perf-updates'

The t/perf performance test suite was not prepared to test not so
old versions of Git, but now it covers versions of Git that are not
so ancient.

* jt/perf-updates:
  t/perf: add fallback for pre-bin-wrappers versions of git
  t/perf: use $MODERN_GIT for all repo-copying steps
  t/perf: export variable used in other blocks

7 years agoMerge branch 'mm/fetch-show-error-message-on-unadvertised-object'
Junio C Hamano [Tue, 14 Mar 2017 22:23:18 +0000 (15:23 -0700)] 
Merge branch 'mm/fetch-show-error-message-on-unadvertised-object'

"git fetch" that requests a commit by object name, when the other
side does not allow such an request, failed without much
explanation.

* mm/fetch-show-error-message-on-unadvertised-object:
  fetch-pack: add specific error for fetching an unadvertised object
  fetch_refs_via_pack: call report_unmatched_refs
  fetch-pack: move code to report unmatched refs to a function

7 years agoMerge branch 'jk/interpret-branch-name'
Junio C Hamano [Tue, 14 Mar 2017 22:23:18 +0000 (15:23 -0700)] 
Merge branch 'jk/interpret-branch-name'

"git branch @" created refs/heads/@ as a branch, and in general the
code that handled @{-1} and @{upstream} was a bit too loose in
disambiguating.

* jk/interpret-branch-name:
  checkout: restrict @-expansions when finding branch
  strbuf_check_ref_format(): expand only local branches
  branch: restrict @-expansions when deleting
  t3204: test git-branch @-expansion corner cases
  interpret_branch_name: allow callers to restrict expansions
  strbuf_branchname: add docstring
  strbuf_branchname: drop return value
  interpret_branch_name: move docstring to header file
  interpret_branch_name(): handle auto-namelen for @{-1}

7 years agoMerge branch 'ab/cond-skip-tests'
Junio C Hamano [Tue, 14 Mar 2017 22:23:17 +0000 (15:23 -0700)] 
Merge branch 'ab/cond-skip-tests'

A few tests were run conditionally under (rare) conditions where
they cannot be run (like running cvs tests under 'root' account).

* ab/cond-skip-tests:
  gitweb tests: skip tests when we don't have Time::HiRes
  gitweb tests: change confusing "skip_all" phrasing
  cvs tests: skip tests that call "cvs commit" when running as root

7 years agohash.h: move SHA-1 implementation selection into a header file
brian m. carlson [Sat, 11 Mar 2017 22:28:18 +0000 (22:28 +0000)] 
hash.h: move SHA-1 implementation selection into a header file

Many developers use functionality in their editors that allows for quick
syntax checks, including warning about questionable constructs.  This
functionality allows rapid development with fewer errors.  However, such
functionality generally does not allow the specification of
project-specific defines or command-line options.

Since the SHA1_HEADER include is not defined in such a case, developers
see spurious errors when using these tools.  Furthermore, while using a
macro as the argument to #include is permitted by C11, it isn't
permitted by C89 and C99, and there are known implementations which
reject it.

Instead of using SHA1_HEADER, create a hash.h header and use #if
and #elif to select the desired header.  Have the Makefile pass an
appropriate option to help the header select the right implementation to
use.

[jc: make BLK_SHA1 the fallback default as discussed on list,
e.g. <20170314201424.vccij5z2ortq4a4o@sigill.intra.peff.net>; also
remove SHA1_HEADER and SHA1_HEADER_SQ that are no longer used].

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Reviewed-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
7 years agosetup.c: mention unresolved problems
Johannes Schindelin [Mon, 13 Mar 2017 20:12:18 +0000 (21:12 +0100)] 
setup.c: mention unresolved problems

During the review of the `early-config` patch series, two issues
have been identified that have been with us forever.  Mark the
identified problems for later so that we do not forget them.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
7 years agot1309: document cases where we would want early config not to die()
Johannes Schindelin [Mon, 13 Mar 2017 20:11:26 +0000 (21:11 +0100)] 
t1309: document cases where we would want early config not to die()

Jeff King came up with a couple examples that demonstrate how the new
read_early_config() that looks harder for the current .git/ directory
could die() in an undesirable way.

Let's add those cases to the test script, to document what we would like
to happen when early config encounters problems.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
7 years agosetup_git_directory_gently_1(): avoid die()ing
Johannes Schindelin [Mon, 13 Mar 2017 20:11:22 +0000 (21:11 +0100)] 
setup_git_directory_gently_1(): avoid die()ing

This function now has a new caller in addition to setup_git_directory():
the newly introduced discover_git_directory(). That function wants to
discover the current .git/ directory, and in case of a corrupted one
simply pretend that there is none to be found.

Example: if a stale .git file exists in the parent directory, and the
user calls `git -p init`, we want Git to simply *not* read any
repository config for the pager (instead of aborting with a message that
the .git file is corrupt).

Let's actually pretend that there was no GIT_DIR to be found in that case
when being called from discover_git_directory(), but keep the previous
behavior (i.e. to die()) for the setup_git_directory() case.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
7 years agot1309: test read_early_config()
Johannes Schindelin [Mon, 13 Mar 2017 20:11:17 +0000 (21:11 +0100)] 
t1309: test read_early_config()

So far, we had no explicit tests of that function.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
7 years agoread_early_config(): really discover .git/
Johannes Schindelin [Mon, 13 Mar 2017 20:11:12 +0000 (21:11 +0100)] 
read_early_config(): really discover .git/

Earlier, we punted and simply assumed that we are in the top-level
directory of the project, and that there is no .git file but a .git/
directory so that we can read directly from .git/config.

However, that is not necessarily true. We may be in a subdirectory. Or
.git may be a gitfile. Or the environment variable GIT_DIR may be set.

To remedy this situation, we just refactored the way
setup_git_directory() discovers the .git/ directory, to make it
reusable, and more importantly, to leave all global variables and the
current working directory alone.

Let's discover the .git/ directory correctly in read_early_config() by
using that new function.

This fixes 4 known breakages in t7006.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
7 years agoread_early_config(): avoid .git/config hack when unneeded
Johannes Schindelin [Mon, 13 Mar 2017 20:11:08 +0000 (21:11 +0100)] 
read_early_config(): avoid .git/config hack when unneeded

So far, we only look whether the startup_info claims to have seen a
git_dir.

However, do_git_config_sequence() (and consequently the
git_config_with_options() call used by read_early_config() asks the
have_git_dir() function whether we have a .git/ directory, which in turn
also looks at git_dir and at the environment variable GIT_DIR. And when
this is the case, the repository config is handled already, so we do not
have to do that again explicitly.

Let's just use the same function, have_git_dir(), to determine whether we
have to handle .git/config explicitly.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
7 years agosetup: make read_early_config() reusable
Johannes Schindelin [Mon, 13 Mar 2017 20:11:04 +0000 (21:11 +0100)] 
setup: make read_early_config() reusable

The pager configuration needs to be read early, possibly before
discovering any .git/ directory.

Let's not hide this function in pager.c, but make it available to other
callers.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
7 years agosetup: introduce the discover_git_directory() function
Johannes Schindelin [Mon, 13 Mar 2017 20:10:45 +0000 (21:10 +0100)] 
setup: introduce the discover_git_directory() function

We modified the setup_git_directory_gently_1() function earlier to make
it possible to discover the GIT_DIR without changing global state.

However, it is still a bit cumbersome to use if you only need to figure
out the (possibly absolute) path of the .git/ directory. Let's just
provide a convenient wrapper function with an easier signature that
*just* discovers the .git/ directory.

We will use it in a subsequent patch to fix the early config.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
7 years agosetup_git_directory_1(): avoid changing global state
Johannes Schindelin [Mon, 13 Mar 2017 20:10:42 +0000 (21:10 +0100)] 
setup_git_directory_1(): avoid changing global state

For historical reasons, Git searches for the .git/ directory (or the
.git file) by changing the working directory successively to the parent
directory of the current directory, until either anything was found or
until a ceiling or a mount point is hit.

Further global state may be changed in case a .git/ directory was found.

We do have a use case, though, where we would like to find the .git/
directory without having any global state touched, though: when we read
the early config e.g. for the pager or for alias expansion.

Let's just move all of code that changes any global state out of the
function `setup_git_directory_gently_1()` into
`setup_git_directory_gently()`.

In subsequent patches, we will use the _1() function in a new
`discover_git_directory()` function that we will then use for the early
config code.

Note: the new loop is a *little* tricky, as we have to handle the root
directory specially: we cannot simply strip away the last component
including the slash, as the root directory only has that slash. To remedy
that, we introduce the `min_offset` variable that holds the minimal length
of an absolute path, and using that to special-case the root directory,
including an early exit before trying to find the parent of the root
directory.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
7 years agosetup: prepare setup_discovered_git_dir() for the root directory
Johannes Schindelin [Mon, 13 Mar 2017 20:09:44 +0000 (21:09 +0100)] 
setup: prepare setup_discovered_git_dir() for the root directory

Currently, the offset parameter (indicating what part of the cwd
parameter corresponds to the current directory after discovering the
.git/ directory) is set to 0 when we are running in the root directory.

However, in the next patches we will avoid changing the current working
directory while searching for the .git/ directory, meaning that the
offset corresponding to the root directory will have to be 1 to reflect
that this directory is characterized by the path "/" (and not "").

So let's make sure that setup_discovered_git_directory() only tries to
append the trailing slash to non-root directories.

Note: the setup_bare_git_directory() does not need a corresponding
change, as it does not want to return a prefix.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
7 years agoadd--interactive: do not expand pathspecs with ls-files
Jeff King [Tue, 14 Mar 2017 16:30:24 +0000 (12:30 -0400)] 
add--interactive: do not expand pathspecs with ls-files

When we want to get the list of modified files, we first
expand any user-provided pathspecs with "ls-files", and then
feed the resulting list of paths as arguments to
"diff-index" and "diff-files". If your pathspec expands into
a large number of paths, you may run into one of two
problems:

  1. The OS may complain about the size of the argument
     list, and refuse to run. For example:

       $ (ulimit -s 128 && git add -p drivers)
       Can't exec "git": Argument list too long at .../git-add--interactive line 177.
       Died at .../git-add--interactive line 177.

     That's on the linux.git repository, which has about 20K
     files in the "drivers" directory (none of them modified
     in this case). The "ulimit -s" trick is necessary to
     show the problem on Linux even for such a gigantic set
     of paths. Other operating systems have much smaller
     limits (e.g., a real-world case was seen with only 5K
     files on OS X).

  2. Even when it does work, it's really slow. The pathspec
     code is not optimized for huge numbers of paths. Here's
     the same case without the ulimit:

       $ time git add -p drivers
       No changes.

       real 0m16.559s
       user 0m53.140s
       sys 0m0.220s

We can improve this by skipping "ls-files" completely, and
just feeding the original pathspecs to the diff commands.
This solution was discussed in 2010:

  http://public-inbox.org/git/20100105041438.GB12574@coredump.intra.peff.net/

but at the time the diff code's pathspecs were more
primitive than those used by ls-files (e.g., they did not
support globs). Making the change would have caused a
user-visible regression, so we didn't.

Since then, the pathspec code has been unified, and the diff
commands natively understand pathspecs like '*.c'.

This patch implements that solution. That skips the
argument-list limits, and the result runs much faster:

  $ time git add -p drivers
  No changes.

  real 0m0.149s
  user 0m0.116s
  sys 0m0.080s

There are two new tests. The first just exercises the
globbing behavior to confirm that we are not causing a
regression there. The second checks the actual argument
behavior using GIT_TRACE. We _could_ do it with the "ulimit
-s" trick, as above. But that would mean the test could only
run where "ulimit -s" works. And tests of that sort are
expensive, because we have to come up with enough files to
actually bust the limit (we can't just shrink the "128" down
infinitely, since it is also the in-program stack size).

Finally, two caveats and possibilities for future work:

  a. This fixes one argument-list expansion, but there may
     be others. In fact, it's very likely that if you run
     "git add -i" and select a large number of modified
     files that the script would try to feed them all to a
     single git command.

     In practice this is probably fine. The real issue here
     is that the argument list was growing with the _total_
     number of files, not the number of modified or selected
     files.

  b. If the repository contains filenames with literal wildcard
     characters (e.g., "foo*"), the original code expanded
     them via "ls-files" and then fed those wildcard names
     to "diff-index", which would have treated them as
     wildcards. This was a bug, which is now fixed (though
     unless you really go through some contortions with
     ":(literal)", it's likely that your original pathspec
     would match whatever the accidentally-expanded wildcard
     would anyway).

     So this takes us one step closer to working correctly
     with files whose names contain wildcard characters, but
     it's likely that others remain (e.g., if "git add -i"
     feeds the selected paths to "git add").

Reported-by: Wincent Colaiuta <win@wincent.com>
Reported-by: Mislav Marohnić <mislav.marohnic@gmail.com>
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
7 years agogit-status: make porcelain more robust
Michael J Gruber [Tue, 14 Mar 2017 16:02:02 +0000 (17:02 +0100)] 
git-status: make porcelain more robust

git status provides a porcelain mode for porcelain writers with a
supposedly stable (plumbing) interface.
7a76c28ff2 ("status: disable translation when --porcelain is used", 2014-03-20)
made sure that ahead/behind info is not translated (i.e. is stable).

Make sure that the remaining two strings (initial commit, detached head)
are stable, too.

These changes are for the v1 porcelain interface. While we do have a perfectly
stable v2 porcelain interface now, some tools (such as
powerline-gitstatus) are written against v1 and profit from fixing v1
without any changes on their side.

Signed-off-by: Michael J Gruber <git@drmicha.warpmail.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
7 years agopathspec: allow escaped query values
Brandon Williams [Mon, 13 Mar 2017 18:23:22 +0000 (11:23 -0700)] 
pathspec: allow escaped query values

In our own .gitattributes file we have attributes such as:

    *.[ch] whitespace=indent,trail,space

When querying for attributes we want to be able to ask for the exact
value, i.e.

    git ls-files :(attr:whitespace=indent,trail,space)

should work, but the commas are used in the attr magic to introduce
the next attr, such that this query currently fails with

fatal: Invalid pathspec magic 'trail' in ':(attr:whitespace=indent,trail,space)'

This change allows escaping characters by a backslash, such that the query

    git ls-files :(attr:whitespace=indent\,trail\,space)

will match all path that have the value "indent,trail,space" for the
whitespace attribute. To accomplish this, we need to modify two places.
First `parse_long_magic` needs to not stop early upon seeing a comma or
closing paren that is escaped. As a second step we need to remove any
escaping from the attr value.

Based on a patch by Stefan Beller <sbeller@google.com>

Signed-off-by: Brandon Williams <bmwill@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
7 years agopathspec: allow querying for attributes
Brandon Williams [Mon, 13 Mar 2017 18:23:21 +0000 (11:23 -0700)] 
pathspec: allow querying for attributes

The pathspec mechanism is extended via the new
":(attr:eol=input)pattern/to/match" syntax to filter paths so that it
requires paths to not just match the given pattern but also have the
specified attrs attached for them to be chosen.

Based on a patch by Stefan Beller <sbeller@google.com>
Signed-off-by: Brandon Williams <bmwill@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
7 years agopath.c: add xdg_cache_home
Devin Lehmacher [Mon, 13 Mar 2017 20:43:54 +0000 (16:43 -0400)] 
path.c: add xdg_cache_home

We already have xdg_config_home to format paths relative to
XDG_CONFIG_HOME. Let's provide a similar function xdg_cache_home to do
the same for paths relative to XDG_CACHE_HOME.

Signed-off-by: Devin Lehmacher <lehmacdj@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
7 years agohttp-walker: fix buffer underflow processing remote alternates
Jeff King [Mon, 13 Mar 2017 14:04:45 +0000 (10:04 -0400)] 
http-walker: fix buffer underflow processing remote alternates

If we parse a remote alternates (or http-alternates), we
expect relative lines like:

  ../../foo.git/objects

which we convert into "$URL/../foo.git/" (and then use that
as a base for fetching more objects).

But if the remote feeds us nonsense like just:

  ../

we will try to blindly strip the last 7 characters, assuming
they contain the string "objects". Since we don't _have_ 7
characters at all, this results in feeding a small negative
value to strbuf_add(), which converts it to a size_t,
resulting in a big positive value. This should consistently
fail (since we can't generall allocate the max size_t minus
7 bytes), so there shouldn't be any security implications.

Let's fix this by using strbuf_strip_suffix() to drop the
characters we want. If they're not present, we'll ignore the
alternate (in theory we could use it as-is, but the rest of
the http-walker code unconditionally tacks "objects/" back
on, so it is it not prepared to handle such a case).

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
7 years agoSync with master
Junio C Hamano [Mon, 13 Mar 2017 06:25:40 +0000 (23:25 -0700)] 
Sync with master

* master:
  Third batch after 2.12