]> Kevux Git Server - rit/log
rit
10 years agoMerge branch 'tb/complete-status'
Junio C Hamano [Mon, 27 Jun 2016 16:56:54 +0000 (09:56 -0700)]
Merge branch 'tb/complete-status'

The completion script (in contrib/) learned to complete "git
status" options.

* tb/complete-status:
  completion: add git status
  completion: add __git_get_option_value helper
  completion: factor out untracked file modes into a variable

10 years agoMerge branch 'mg/cherry-pick-multi-on-unborn'
Junio C Hamano [Mon, 27 Jun 2016 16:56:53 +0000 (09:56 -0700)]
Merge branch 'mg/cherry-pick-multi-on-unborn'

"git cherry-pick A" worked on an unborn branch, but "git
cherry-pick A..B" didn't.

* mg/cherry-pick-multi-on-unborn:
  cherry-pick: allow to pick to unborn branches

10 years agoMerge branch 'lf/receive-pack-auto-gc-to-client'
Junio C Hamano [Mon, 27 Jun 2016 16:56:52 +0000 (09:56 -0700)]
Merge branch 'lf/receive-pack-auto-gc-to-client'

Allow messages that are generated by auto gc during "git push" on
the receiving end to be explicitly passed back to the sending end
over sideband, so that they are shown with "remote: " prefix to
avoid confusing the users.

* lf/receive-pack-auto-gc-to-client:
  receive-pack: send auto-gc output over sideband 2

10 years agoMerge branch 'em/newer-freebsd-shells-are-fine-with-returns'
Junio C Hamano [Mon, 27 Jun 2016 16:56:52 +0000 (09:56 -0700)]
Merge branch 'em/newer-freebsd-shells-are-fine-with-returns'

Comments about misbehaving FreeBSD shells have been clarified with
the version number (9.x and before are broken, newer ones are OK).

* em/newer-freebsd-shells-are-fine-with-returns:
  rebase: update comment about FreeBSD /bin/sh

10 years agoMerge branch 'lv/status-say-working-tree-not-directory'
Junio C Hamano [Mon, 27 Jun 2016 16:56:51 +0000 (09:56 -0700)]
Merge branch 'lv/status-say-working-tree-not-directory'

"git status" used to say "working directory" when it meant "working
tree".

* lv/status-say-working-tree-not-directory:
  Use "working tree" instead of "working directory" for git status

10 years agoMerge branch 'nb/gnome-keyring-build'
Junio C Hamano [Mon, 27 Jun 2016 16:56:50 +0000 (09:56 -0700)]
Merge branch 'nb/gnome-keyring-build'

Build improvements for gnome-keyring (in contrib/)

* nb/gnome-keyring-build:
  gnome-keyring: Don't hard-code pkg-config executable

10 years agoMerge branch 'jc/deref-tag'
Junio C Hamano [Mon, 27 Jun 2016 16:56:49 +0000 (09:56 -0700)]
Merge branch 'jc/deref-tag'

Code clean-up.

* jc/deref-tag:
  blame, line-log: do not loop around deref_tag()

10 years agoMerge branch 'et/add-chmod-x'
Junio C Hamano [Mon, 27 Jun 2016 16:56:49 +0000 (09:56 -0700)]
Merge branch 'et/add-chmod-x'

"git update-index --add --chmod=+x file" may be usable as an escape
hatch, but not a friendly thing to force for people who do need to
use it regularly.  "git add --chmod=+x file" can be used instead.

* et/add-chmod-x:
  add: add --chmod=+x / --chmod=-x options

10 years agoMerge branch 'jk/avoid-unbounded-alloca'
Junio C Hamano [Mon, 27 Jun 2016 16:56:48 +0000 (09:56 -0700)]
Merge branch 'jk/avoid-unbounded-alloca'

* jk/avoid-unbounded-alloca:
  tree-diff: avoid alloca for large allocations

10 years agoMerge branch 'rj/compat-regex-size-max-fix'
Junio C Hamano [Mon, 27 Jun 2016 16:56:47 +0000 (09:56 -0700)]
Merge branch 'rj/compat-regex-size-max-fix'

A compilation fix.

* rj/compat-regex-size-max-fix:
  regex: fix a SIZE_MAX macro redefinition warning

10 years agoMerge branch 'vs/prompt-avoid-unset-variable'
Junio C Hamano [Mon, 27 Jun 2016 16:56:47 +0000 (09:56 -0700)]
Merge branch 'vs/prompt-avoid-unset-variable'

The git-prompt scriptlet (in contrib/) was not friendly with those
who uses "set -u", which has been fixed.

* vs/prompt-avoid-unset-variable:
  git-prompt.sh: Don't error on null ${ZSH,BASH}_VERSION, $short_sha

10 years agoMerge branch 'sg/reflog-past-root'
Junio C Hamano [Mon, 27 Jun 2016 16:56:46 +0000 (09:56 -0700)]
Merge branch 'sg/reflog-past-root'

"git reflog" stopped upon seeing an entry that denotes a branch
creation event (aka "unborn"), which made it appear as if the
reflog was truncated.

* sg/reflog-past-root:
  reflog: continue walking the reflog past root commits

10 years agoMerge branch 'pb/strbuf-read-file-doc'
Junio C Hamano [Mon, 27 Jun 2016 16:56:46 +0000 (09:56 -0700)]
Merge branch 'pb/strbuf-read-file-doc'

* pb/strbuf-read-file-doc:
  strbuf: describe the return value of strbuf_read_file

10 years agoMerge branch 'dn/gpg-doc'
Junio C Hamano [Mon, 27 Jun 2016 16:56:45 +0000 (09:56 -0700)]
Merge branch 'dn/gpg-doc'

The documentation tries to consistently spell "GPG"; when
referring to the specific program name, "gpg" is used.

* dn/gpg-doc:
  Documentation: GPG capitalization

10 years agoMerge branch 'jk/fetch-prune-doc'
Junio C Hamano [Mon, 27 Jun 2016 16:56:44 +0000 (09:56 -0700)]
Merge branch 'jk/fetch-prune-doc'

* jk/fetch-prune-doc:
  fetch: document that pruning happens before fetching

10 years agoMerge branch 'ap/git-svn-propset-doc'
Junio C Hamano [Mon, 27 Jun 2016 16:56:43 +0000 (09:56 -0700)]
Merge branch 'ap/git-svn-propset-doc'

"git svn propset" subcommand that was added in 2.3 days is
documented now.

* ap/git-svn-propset-doc:
  git-svn: document the 'git svn propset' command

10 years agoMerge branch 'tr/doc-tt'
Junio C Hamano [Mon, 27 Jun 2016 16:56:42 +0000 (09:56 -0700)]
Merge branch 'tr/doc-tt'

The documentation set has been updated so that literal commands,
configuration variables and environment variables are consistently
typeset in fixed-width font and bold in manpages.

* tr/doc-tt:
  doc: change configuration variables format
  doc: more consistency in environment variables format
  doc: change environment variables format
  doc: clearer rule about formatting literals

10 years agoMerge branch 'pc/occurred'
Junio C Hamano [Mon, 27 Jun 2016 16:56:42 +0000 (09:56 -0700)]
Merge branch 'pc/occurred'

* pc/occurred:
  config.c: fix misspelt "occurred" in an error message
  refs.h: fix misspelt "occurred" in a comment

10 years agoMerge branch 'cc/apply-introduce-state'
Junio C Hamano [Mon, 27 Jun 2016 16:56:42 +0000 (09:56 -0700)]
Merge branch 'cc/apply-introduce-state'

The "git apply" standalone program is being libified; this is the
first step to move many state variables into a structure that can
be explicitly (re)initialized to make the machinery callable more
than once.

The next step that moves some remaining state variables into the
structure and turns die()s into an error return that propagates up
to the caller is not queued yet but in flight.  It would be good to
review the above first and give the remainder of the series a solid
base to build on.

* cc/apply-introduce-state: (50 commits)
  builtin/apply: remove misleading comment on lock_file field
  builtin/apply: move 'newfd' global into 'struct apply_state'
  builtin/apply: add 'lock_file' pointer into 'struct apply_state'
  builtin/apply: move applying patches into apply_all_patches()
  builtin/apply: move 'state' check into check_apply_state()
  builtin/apply: move 'symlink_changes' global into 'struct apply_state'
  builtin/apply: move 'fn_table' global into 'struct apply_state'
  builtin/apply: move 'state_linenr' global into 'struct apply_state'
  builtin/apply: move 'max_change' and 'max_len' into 'struct apply_state'
  builtin/apply: move 'ws_ignore_action' into 'struct apply_state'
  builtin/apply: move 'ws_error_action' into 'struct apply_state'
  builtin/apply: move 'applied_after_fixing_ws' into 'struct apply_state'
  builtin/apply: move 'squelch_whitespace_errors' into 'struct apply_state'
  builtin/apply: remove whitespace_option arg from set_default_whitespace_mode()
  builtin/apply: move 'whitespace_option' into 'struct apply_state'
  builtin/apply: move 'whitespace_error' global into 'struct apply_state'
  builtin/apply: move 'root' global into 'struct apply_state'
  builtin/apply: move 'p_value_known' global into 'struct apply_state'
  builtin/apply: move 'p_value' global into 'struct apply_state'
  builtin/apply: move 'has_include' global into 'struct apply_state'
  ...

10 years agoMerge branch 'rs/xdiff-hunk-with-func-line' into maint
Junio C Hamano [Mon, 27 Jun 2016 16:56:24 +0000 (09:56 -0700)]
Merge branch 'rs/xdiff-hunk-with-func-line' into maint

"git show -W" (extend hunks to cover the entire function, delimited
by lines that match the "funcname" pattern) used to show the entire
file when a change added an entire function at the end of the file,
which has been fixed.

* rs/xdiff-hunk-with-func-line:
  xdiff: fix merging of appended hunk with -W
  grep: -W: don't extend context to trailing empty lines
  t7810: add test for grep -W and trailing empty context lines
  xdiff: don't trim common tail with -W
  xdiff: -W: don't include common trailing empty lines in context
  xdiff: ignore empty lines before added functions with -W
  xdiff: handle appended chunks better with -W
  xdiff: factor out match_func_rec()
  t4051: rewrite, add more tests

10 years agoMerge branch 'jk/rev-list-count-with-bitmap' into maint
Junio C Hamano [Mon, 27 Jun 2016 16:56:24 +0000 (09:56 -0700)]
Merge branch 'jk/rev-list-count-with-bitmap' into maint

"git rev-list --count" whose walk-length is limited with "-n"
option did not work well with the counting optimized to look at the
bitmap index.

* jk/rev-list-count-with-bitmap:
  rev-list: disable bitmaps when "-n" is used with listing objects
  rev-list: "adjust" results of "--count --use-bitmap-index -n"

10 years agoMerge branch 'et/pretty-format-c-auto' into maint
Junio C Hamano [Mon, 27 Jun 2016 16:56:23 +0000 (09:56 -0700)]
Merge branch 'et/pretty-format-c-auto' into maint

The commands in `git log` family take %C(auto) in a custom format
string.  This unconditionally turned the color on, ignoring
--no-color or with --color=auto when the output is not connected to
a tty; this was corrected to make the format truly behave as
"auto".

* et/pretty-format-c-auto:
  format_commit_message: honor `color=auto` for `%C(auto)`

10 years agoMerge branch 'ew/daemon-socket-keepalive' into maint
Junio C Hamano [Mon, 27 Jun 2016 16:56:22 +0000 (09:56 -0700)]
Merge branch 'ew/daemon-socket-keepalive' into maint

When "git daemon" is run without --[init-]timeout specified, a
connection from a client that silently goes offline can hang around
for a long time, wasting resources.  The socket-level KEEPALIVE has
been enabled to allow the OS to notice such failed connections.

* ew/daemon-socket-keepalive:
  daemon: enable SO_KEEPALIVE for all sockets

10 years agoxwrite: poll on non-blocking FDs
Eric Wong [Sun, 26 Jun 2016 23:21:12 +0000 (23:21 +0000)]
xwrite: poll on non-blocking FDs

write(2) can hit the same EAGAIN/EWOULDBLOCK errors as read(2),
so busy-looping on a non-blocking FD is a waste of resources.

Currently, I do not know of a way for this happen:

* the NonBlocking directive in systemd does not apply to stdin,
  stdout, or stderr.

* xinetd provides no way to set the non-blocking flag at all

But theoretically, it's possible a careless C10K HTTP server
could use pipe2(..., O_NONBLOCK) to setup a pipe for
git-http-backend with only the intent to use non-blocking reads;
but accidentally leave non-blocking set on the write end passed
as stdout to git-upload-pack.

Followup-to: 1079c4be0b720 ("xread: poll on non blocking fds")
Signed-off-by: Eric Wong <e@80x24.org>
Reviewed-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agoxread: retry after poll on EAGAIN/EWOULDBLOCK
Eric Wong [Mon, 27 Jun 2016 03:56:35 +0000 (03:56 +0000)]
xread: retry after poll on EAGAIN/EWOULDBLOCK

We should continue to loop after EAGAIN/EWOULDBLOCK as the
intent of xread is to try until there is available data,
EOF, or an unrecoverable error.

Fixes: 1079c4be0b720 ("xread: poll on non blocking fds")
Signed-off-by: Eric Wong <e@80x24.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agounpack-trees: fix English grammar in do-this-before-that messages
Alex Henrie [Sat, 25 Jun 2016 06:34:04 +0000 (00:34 -0600)]
unpack-trees: fix English grammar in do-this-before-that messages

Signed-off-by: Alex Henrie <alexhenrie24@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agogc: fix off-by-one error with gc.autoPackLimit
Eric Wong [Sat, 25 Jun 2016 06:46:47 +0000 (06:46 +0000)]
gc: fix off-by-one error with gc.autoPackLimit

This matches the documentation and allows gc.autoPackLimit=1
to maintain a single pack without attempting a repack on every
"git gc --auto" invocation.

Signed-off-by: Eric Wong <e@80x24.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agogrep/icase: avoid kwsset on literal non-ascii strings
Nguyễn Thái Ngọc Duy [Sat, 25 Jun 2016 05:22:30 +0000 (07:22 +0200)]
grep/icase: avoid kwsset on literal non-ascii strings

When we detect the pattern is just a literal string, we avoid heavy
regex engine and use fast substring search implemented in kwsset.c.
But kws uses git-ctype which is locale-independent so it does not know
how to fold case properly outside ascii range. Let regcomp or pcre
take care of this case instead. Slower, but accurate.

Noticed-by: Plamen Totev <plamen.totev@abv.bg>
Helped-by: René Scharfe <l.s.r@web.de>
Helped-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agotest-regex: expose full regcomp() to the command line
Nguyễn Thái Ngọc Duy [Sat, 25 Jun 2016 05:22:29 +0000 (07:22 +0200)]
test-regex: expose full regcomp() to the command line

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agotest-regex: isolate the bug test code
Nguyễn Thái Ngọc Duy [Sat, 25 Jun 2016 05:22:28 +0000 (07:22 +0200)]
test-regex: isolate the bug test code

This is in preparation to turn test-regex into some generic regex
testing command.

Helped-by: Eric Sunshine <sunshine@sunshineco.com>
Helped-by: Ramsay Jones <ramsay@ramsayjones.plus.com>
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agogrep: break down an "if" stmt in preparation for next changes
Nguyễn Thái Ngọc Duy [Sat, 25 Jun 2016 05:22:27 +0000 (07:22 +0200)]
grep: break down an "if" stmt in preparation for next changes

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agonew-command.txt: correct the command description file
Nguyễn Thái Ngọc Duy [Sat, 25 Jun 2016 13:55:14 +0000 (15:55 +0200)]
new-command.txt: correct the command description file

It has always been command-list.txt even at the time this
new-command.txt document is added.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agot4211: ensure that log respects --output=<file>
Johannes Schindelin [Wed, 22 Jun 2016 15:02:13 +0000 (17:02 +0200)]
t4211: ensure that log respects --output=<file>

The test script t4202-log.sh is already pretty long, and it is a good
idea to test --output with a more obscure option, anyway. So let's
test it in conjunction with line-log.

The most important part of this test, of course, is to ensure that the
file is not closed after writing the diff, but only at the very end
of the log output. That is the entire reason why the test tries to
generate a log that covers more than one commit.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agoshortlog: respect the --output=<file> setting
Johannes Schindelin [Wed, 22 Jun 2016 15:02:07 +0000 (17:02 +0200)]
shortlog: respect the --output=<file> setting

Thanks to the diff option parsing, we already know about this option.
We just have to make use of it.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agoformat-patch: use stdout directly
Johannes Schindelin [Wed, 22 Jun 2016 15:02:04 +0000 (17:02 +0200)]
format-patch: use stdout directly

Earlier, we freopen()ed stdout in order to write patches to files.
That forced us to duplicate stdout (naming it "realstdout") because we
*still* wanted to be able to report the file names.

As we do not abuse stdout that way anymore, we no longer need to
duplicate stdout, either.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agoformat-patch: avoid freopen()
Johannes Schindelin [Wed, 22 Jun 2016 15:01:59 +0000 (17:01 +0200)]
format-patch: avoid freopen()

We just taught the relevant functions to respect the diffopt.file field,
to allow writing somewhere else than stdout. Let's make use of it.

Technically, we do not need to avoid that call in a builtin: we assume
that builtins (as opposed to library functions) are stand-alone programs
that may do with their (global) state. Yet, we want to be able to reuse
that code in properly lib-ified code, e.g. when converting scripts into
builtins.

Further, while we did not *have* to touch the cmd_show() and cmd_cherry()
code paths (because they do not want to write anywhere but stdout as of
yet), it just makes sense to be consistent, making it easier and safer to
move the code later.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agoformat-patch: explicitly switch off color when writing to files
Johannes Schindelin [Wed, 22 Jun 2016 15:01:54 +0000 (17:01 +0200)]
format-patch: explicitly switch off color when writing to files

The --color=auto handling is done by seeing if file descriptor 1
(the standard output) is connected to a terminal.  format-patch
used freopen() to reuse the standard output stream even when sending
its output to an on-disk file, and this check is appropriate.

In the next step, however, we will stop reusing "FILE *stdout", and
instead start using arbitrary file descriptor obtained by doing an
fopen(3) ourselves.  The check --color=auto does will become useless,
as we no longer are writing to the standard output stream.

But then, we do not need to guess to begin with. As argued in the commit
message of 7787570c (format-patch: ignore ui.color, 2011-09-13), we do not
allow the ui.color setting to affect format-patch's output. The only time,
therefore, that we allow color sequences to be written to the output files
is when the user specified the --color=always command-line option explicitly.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agoshortlog: support outputting to streams other than stdout
Johannes Schindelin [Wed, 22 Jun 2016 15:01:49 +0000 (17:01 +0200)]
shortlog: support outputting to streams other than stdout

This will be needed to avoid freopen() in `git format-patch`.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agograph: respect the diffopt.file setting
Johannes Schindelin [Wed, 22 Jun 2016 15:01:44 +0000 (17:01 +0200)]
graph: respect the diffopt.file setting

When the caller overrides diffopt.file (which defaults to stdout),
the diff machinery already redirects its output, and the graph display
should also write to that file.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agoline-log: respect diffopt's configured output file stream
Johannes Schindelin [Wed, 22 Jun 2016 15:01:39 +0000 (17:01 +0200)]
line-log: respect diffopt's configured output file stream

The diff machinery can optionally output to a file stream other than
stdout, by overriding diffopt.file. In such a case, the rest of the
log tree machinery should also write to that stream.

Currently, there is no user of the line level log that wants to
redirect output to a file. Therefore, one might argue that it is
superfluous to support that now. However, it is better to be
consistent now, rather than to face hard-to-debug problems later.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agolog-tree: respect diffopt's configured output file stream
Johannes Schindelin [Wed, 22 Jun 2016 15:01:32 +0000 (17:01 +0200)]
log-tree: respect diffopt's configured output file stream

The diff options already know how to print the output anywhere else
than stdout. The same is needed for log output in general, e.g.
when writing patches to files in `git format-patch`. Let's allow
users to use log_tree_commit() *without* changing global state via
freopen().

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agolog: prepare log/log-tree to reuse the diffopt.close_file attribute
Johannes Schindelin [Wed, 22 Jun 2016 15:01:28 +0000 (17:01 +0200)]
log: prepare log/log-tree to reuse the diffopt.close_file attribute

We are about to teach the log-tree machinery to reuse the diffopt.file
field to output to a file stream other than stdout, in line with the
diff machinery already writing to diffopt.file.

However, we might want to write something after the diff in
log_tree_commit() (e.g. with the --show-linear-break option), therefore
we must not let the diff machinery close the file (as per
diffopt.close_file.

This means that log_tree_commit() itself must override the
diffopt.close_file flag and close the file, and if log_tree_commit() is
called in a loop, the caller is responsible to do the same.

Note: format-patch has an `--output-directory` option. Due to the fact
that format-patch's options are parsed first, and that the parse-options
machinery accepts uniquely abbreviated options, the diff options
`--output` (and `-o`) are shadowed. Therefore close_file is not set to 1
so that cmd_format_patch() does *not* need to handle the close_file flag
differently, even if it calls log_tree_commit() in a loop.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agolog: add log.showSignature configuration variable
Mehul Jain [Wed, 22 Jun 2016 16:51:26 +0000 (22:21 +0530)]
log: add log.showSignature configuration variable

Users may want to always use "--show-signature" while using git-log and
related commands.

When log.showSignature is set to true, git-log and related commands will
behave as if "--show-signature" was given to them.

Note that this config variable is meant to affect git-log, git-show,
git-whatchanged and git-reflog. Other commands like git-format-patch,
git-rev-list are not to be affected by this config variable.

Signed-off-by: Mehul Jain <mehul.jain2029@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agolog: add "--no-show-signature" command line option
Mehul Jain [Wed, 22 Jun 2016 16:51:25 +0000 (22:21 +0530)]
log: add "--no-show-signature" command line option

If an user creates an alias with "--show-signature" early in command
line, e.g.
[alias] logss = log --show-signature

then there is no way to countermand it through command line.

Teach git-log and related commands about "--no-show-signature" command
line option. This will make "git logss --no-show-signature" run
without showing GPG signature.

Signed-off-by: Mehul Jain <mehul.jain2029@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agot4202: refactor test
Mehul Jain [Fri, 24 Jun 2016 14:12:34 +0000 (19:42 +0530)]
t4202: refactor test

Subsequent patches will want to reuse the 'signed' branch that the
'log --graph --show-signature' test creates and uses.

Split the set-up part into a test of its own, and make the existing
test into a separate one that only inspects the history on the 'signed'
branch. This way, it becomes clearer that tests added by subsequent
patches reuse the 'signed' branch in the same way.

Signed-off-by: Mehul Jain <mehul.jain2029@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agocolor: support strike-through attribute
Jeff King [Thu, 23 Jun 2016 17:40:16 +0000 (13:40 -0400)]
color: support strike-through attribute

This is the only remaining attribute that is commonly
supported (at least by xterm) that we don't support. Let's
add it for completeness.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agocolor: support "italic" attribute
Jeff King [Thu, 23 Jun 2016 17:39:07 +0000 (13:39 -0400)]
color: support "italic" attribute

We already support bold, underline, and similar attributes.
Let's add italic to the mix.  According to the Wikipedia
page on ANSI colors, this attribute is "not widely
supported", but it does seem to work on my xterm.

We don't have to bump the maximum color size because we were
already over-allocating it (but we do adjust the comment
appropriately).

Requested-by: Simon Courtois <scourtois@cubyx.fr>
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agocolor: allow "no-" for negating attributes
Jeff King [Thu, 23 Jun 2016 17:38:44 +0000 (13:38 -0400)]
color: allow "no-" for negating attributes

Using "no-bold" rather than "nobold" is easier to read and
more natural to type (to me, anyway, even though I was the
person who introduced "nobold" in the first place). It's
easy to allow both.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agocolor: refactor parse_attr
Jeff King [Thu, 23 Jun 2016 17:38:13 +0000 (13:38 -0400)]
color: refactor parse_attr

The list of attributes we recognize is a bit unwieldy, as we
actually have two arrays that must be kept in sync. Instead,
let's have a single array-of-struct to represent our
mapping. That means we can never have an accident that
causes us to read off the end of an array, and it makes
diffs for adding new attributes much easier to read.

This also makes it easy to handle the "no" cases without
having to repeat each attribute (this shortens the list,
making it easier to read, but also also cuts the size of our
linear search in half). Technically this makes it impossible
for us to add an attribute that starts with "no" (we could
confuse "nobody" for the negation of "body"), but since this
is a constrained set of attributes, that's OK.

Since we can also store the length of each name in the
struct, that makes it easy for us to avoid reading past the
"len" parameter given to us (though in practice it was not a
bug, since all of our current callers are interested in a
subset of a NUL-terminated buffer, not a true undelimited
range of memory).

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agoadd skip_prefix_mem helper
Jeff King [Thu, 23 Jun 2016 17:33:57 +0000 (13:33 -0400)]
add skip_prefix_mem helper

The skip_prefix function has been very useful for
simplifying pointer arithmetic and avoiding repeated magic
numbers, but we have no equivalent for length-limited
buffers. So we're stuck with:

  if (3 <= len && skip_prefix(buf, "foo", &buf))
  len -= 3;

That's not that complicated, but it needs to use magic
numbers for the length of the prefix (or else write out
strlen("foo"), repeating the string). By using a helper, we
can get the string length behind the scenes (and often at
compile time for string literals).

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agodoc: refactor description of color format
Jeff King [Thu, 23 Jun 2016 17:32:30 +0000 (13:32 -0400)]
doc: refactor description of color format

This is a general cleanup of the description of colors in
git-config, mostly to address inaccuracies and confusion
that had grown over time:

  - you can have many attributes, not just one

  - the discussion flip-flopped between colors and
    attributes; now we discuss everything about colors, then
    everything about attributes

  - many concepts were lumped into the first paragraph,
    making it hard to read, and especially to find the
    actual lists of colors and attributes. I stopped short
    of breaking those out into their own lists, as it seemed
    like an excessive use of vertical screen real estate.

  - we introduced negated attributes, but then the next
    paragraph basically explains how each item starts off
    with no attributes. So why would one need negated
    attributes? We now explain.

  - minor typo, language, and typography fixes

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agocolor: fix max-size comment
Jeff King [Thu, 23 Jun 2016 17:31:44 +0000 (13:31 -0400)]
color: fix max-size comment

We use fixed-size buffers for colors, because we know our
parsing cannot grow beyond a particular bound. However, our
comment description has two issues:

  1. It has the description in two forms: a short one, and
     one with more explanation. Over time the latter has
     been updated, but the former has not. Let's just drop
     the short one (after making sure everything it says
     is in the long one).

  2. As of ff40d18 (parse_color: recognize "no$foo" to clear
     the $foo attribute, 2014-11-20), the per-attribute size
     bumped to "3" (because "nobold" is actually "21;"). But
     that's not quite enough, as somebody may use both
     "bold" and "nobold", requiring 5 characters.

     This wasn't a problem for the final count, because we
     over-estimated in other ways, but let's clarify how we
     got to the final number.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agopathspec: warn on empty strings as pathspec
Emily Xie [Wed, 22 Jun 2016 23:00:24 +0000 (19:00 -0400)]
pathspec: warn on empty strings as pathspec

An empty string as a pathspec element matches all paths.  A buggy
script, however, could accidentally assign an empty string to a
variable that then gets passed to a Git command invocation, e.g.:

path=... compute a path to be removed in $path ...
        git rm -r "$paht"

which would unintentionally remove all paths in the current
directory.

The fix for this issue requires a two-step approach. As there may be
existing scripts that knowingly use empty strings in this manner,
the first step simply gives a warning that (1) tells that an empty
string will become an invalid pathspec element and (2) asks the user
to use "." if they mean to match all.

For step two, a follow-up patch several release cycles later will
remove the warning and throw an error instead.

This patch is the first step.

Signed-off-by: Emily Xie <emilyxxie@gmail.com>
Reported-by: David Turner <novalis@novalis.org>
Mentored-by: Michail Denchev <mdenchev@gmail.com>
Thanks-to: Sarah Sharp <sarah@thesharps.us> and James Sharp <jamey@minilop.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agogit-svn: skip mergeinfo handling with --no-follow-parent
Eric Wong [Mon, 20 Jun 2016 21:52:53 +0000 (21:52 +0000)]
git-svn: skip mergeinfo handling with --no-follow-parent

For repositories without parent following enabled, finding
git parents through svn:mergeinfo or svk::parents can be
expensive and pointless.

Reported-by: Александр Овчинников <proff@proff.email>
http://mid.gmane.org/4094761466408188@web24o.yandex.ru

Signed-off-by: Eric Wong <e@80x24.org>
10 years agot2300: "git --exec-path" is not usable in $PATH on Windows as-is
Johannes Schindelin [Sat, 18 Jun 2016 10:49:11 +0000 (12:49 +0200)]
t2300: "git --exec-path" is not usable in $PATH on Windows as-is

The "git" command prepends the exec-path to the PATH environment
variable for processes it spawns.  That is how ". git-sh-setup" in
our scripted Porcelains can find the dot-sourced file in the
exec-path location that is not usually on user's PATH.

When t2300 runs, because it is not spawned by the "git" command, the
scriptlet being tested did not run with a realistic setting of PATH
environment.  It lacked the exec-path on the PATH, and failed to
find the dot-sourced file.  A recent update to t2300 attempted to
fix this, with "PATH=$(git --exec-path):$PATH", which has been the
recommended way around v1.6.0 days (a script whose original was
written before that release that survives to this day is likely to
have such a line).

However, the "git --exec-path" command outputs C:\path\to\exec\dir
(not /c/path/to/exec/dir) on Windows; the recent update failed to
consider the problem that comes from it.

Even though Git itself, when doing the equivalent internally, does
so in a platform native way (i.e. on Windows, C:\path\to\exec\dir is
prepended to the existing value of %PATH% using ';' as a component
separator), the result is further massaged by bash and gets turned
into $PATH that uses /c/path/to/exec/dir with ':' separating the
components, which is the form understood by bash, so scripted
Porcelains find commands from PATH correctly.

An end user script written in shell, however, cannot prepend
"C:\path\to\exec\dir:" to the existing value of $PATH and expect
bash to magically turn it into the form it understands.  In other
words, "PATH=$(git --exec-path):$PATH" does not work as an emulation
of what "Git" internally does to the PATH on Windows.

To correctly emulate how exec-path is prepended to the PATH
environment internally on Windows, we'd need to convert
C:\git-sdk-64\usr\src\git to at least /c\git-sdk-64\usr\src\git
ourselves before prepending it to PATH.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agop4211: explicitly disable renames in no-rename test
Jeff King [Wed, 22 Jun 2016 19:40:51 +0000 (15:40 -0400)]
p4211: explicitly disable renames in no-rename test

p4211 tests line-log performance both with and without "-M".
In v2.9.0, the case without "-M" appears to have regressed
badly, but that is only because we flipped on renames by
default.

Let's have the test explicitly disable renames to get
consistent timings (and to match the presumed intent of the
test, which is to see the effects with and without renames).

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agot/perf: fix regression in testing older versions of git
Jeff King [Wed, 22 Jun 2016 19:40:13 +0000 (15:40 -0400)]
t/perf: fix regression in testing older versions of git

Commit 7501b59 (perf: make the tests work in worktrees,
2016-05-13) introduced the use of "git rev-parse --git-path"
in the perf-lib setup code. Because the to-be-tested version
of git is at the front of the $PATH when this code runs,
this means we cannot use modern versions of t/perf to test
versions of git older than v2.5.0 (when that option was
introduced).

This is a symptom of a more general problem. The t/perf
suite is essentially independent of git versions, and
ideally we would be able to run the most modern and complete
set of tests across many historical versions (to see how
they compare). But any setup code they run is therefore
required to use the lowest common denominator we expect to
test.

So let's introduce a new variable, $MODERN_GIT, that we can
use both in perf-lib and in the test setup to get a reliable
set of git features (we might change git and break some
tests, of course, but $MODERN_GIT is tied to the same
version of git as the t/perf scripts, so they can be fixed
or adjusted together).

This commit fixes the "--git-path" case, but does not
mass-convert existing setup code to use $MODERN_GIT. Most
setup code is fairly vanilla and will work with effectively
all versions. But now the tool is there to fix any other
issues we find going forward.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agocommit.c: make find_commit_subject() more robust
Johannes Schindelin [Wed, 22 Jun 2016 20:20:20 +0000 (22:20 +0200)]
commit.c: make find_commit_subject() more robust

Just like the pretty printing machinery, we should simply ignore
blank lines at the beginning of the commit messages.

This discrepancy was noticed when an early version of the
rebase--helper produced commit objects with more than one empty line
between the header and the commit message.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agopretty: make the skip_blank_lines() function public
Johannes Schindelin [Wed, 22 Jun 2016 20:20:16 +0000 (22:20 +0200)]
pretty: make the skip_blank_lines() function public

This function will be used also in the find_commit_subject()
function.

While at it, rename the function to reflect that it skips not only
empty lines, but any lines consisting of only whitespace, too.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agodoc: git-htmldocs.googlecode.com is no more
Jonathan Nieder [Wed, 22 Jun 2016 17:38:25 +0000 (10:38 -0700)]
doc: git-htmldocs.googlecode.com is no more

http://git-htmldocs.googlecode.com/git/git.html says

 There was no service found for the uri requested.

Link to the rendered documentation on Jekyll instead.

Reported-by: Andrea Stacchiotti <andreastacchiotti@gmail.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agogit-p4: correct hasBranchPrefix verbose output
Andrew Oakley [Wed, 22 Jun 2016 09:26:11 +0000 (10:26 +0100)]
git-p4: correct hasBranchPrefix verbose output

The logic here was inverted, you got a message saying the file is
ignored for each file that is not ignored.

Signed-off-by: Andrew Oakley <aoakley@roku.com>
Acked-by: Lars Schneider <larsxschneider@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agot7810: fix duplicated test title
Charles Bailey [Tue, 21 Jun 2016 21:14:11 +0000 (14:14 -0700)]
t7810: fix duplicated test title

Signed-off-by: Charles Bailey <charles@hashpling.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agot5614: don't use subshells
Stefan Beller [Mon, 20 Jun 2016 17:21:18 +0000 (10:21 -0700)]
t5614: don't use subshells

Using a subshell for just one git command is both a waste in compute
overhead (create a new process) as well as in line count.

Suggested-by: Jeff King <peff@peff.net>
Signed-off-by: Stefan Beller <sbeller@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agot7800: readlink may not be available
Armin Kunaschik [Tue, 31 May 2016 00:26:12 +0000 (02:26 +0200)]
t7800: readlink may not be available

The readlink(1) command is not available on all platforms (notably
not on AIX and HP-UX) and can be replaced in this test with the
"workaround"

ls -ld <name> | sed -e 's/.* -> //'

This is no universal readlink replacement but works in the
controlled test environment well enough.

Signed-off-by: Armin Kunaschik <megabreit@googlemail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agoperf: accommodate for MacOSX
Johannes Schindelin [Tue, 21 Jun 2016 13:53:43 +0000 (15:53 +0200)]
perf: accommodate for MacOSX

As this developer has no access to MacOSX developer setups anymore,
Travis becomes the best bet to run performance tests on that OS.

However, on MacOSX /usr/bin/time is that good old BSD executable that
no Linux user cares about, as demonstrated by the perf-lib.sh's use
of GNU-ish extensions. And by the hard-coded path.

Let's just work around this issue by using gtime on MacOSX, the
Homebrew-provided GNU implementation onto which pretty much every
MacOSX power user falls back anyway.

To help other developers use Travis to run performance tests on
MacOSX, the .travis.yml file now sports a commented-out line that
installs GNU time via Homebrew.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Reviewed-by: Lars Schneider <larsxschneider@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agolocal_tzoffset: detect errors from tm_to_time_t
Jeff King [Mon, 20 Jun 2016 21:14:14 +0000 (17:14 -0400)]
local_tzoffset: detect errors from tm_to_time_t

When we want to know the local timezone offset at a given
timestamp, we compute it by asking for localtime() at the
given time, and comparing the offset to GMT at that time.
However, there's some juggling between time_t and "struct
tm" which happens, which involves calling our own
tm_to_time_t().

If that function returns an error (e.g., because it only
handles dates up to the year 2099), it returns "-1", which
we treat as a time_t, and is clearly bogus, leading to
bizarre timestamps (that seem to always adjust the time back
to (time_t)(uint32_t)-1, in the year 2106).

It's not a good idea for local_tzoffset() to simply die
here; it would make it hard to run "git log" on a repository
with funny timestamps. Instead, let's just treat such cases
as "zero offset".

Reported-by: Norbert Kiesel <nkiesel@gmail.com>
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agot0006: test various date formats
Jeff King [Mon, 20 Jun 2016 21:11:59 +0000 (17:11 -0400)]
t0006: test various date formats

We ended up testing some of these date formats throughout
the rest of the suite (e.g., via for-each-ref's
"$(authordate:...)" format), but we never did so
systematically. t0006 is the right place for unit-testing of
our date-handling code.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agot0006: rename test-date's "show" to "relative"
Jeff King [Mon, 20 Jun 2016 21:10:29 +0000 (17:10 -0400)]
t0006: rename test-date's "show" to "relative"

The "show" tests are really only checking relative formats;
we should make that more clear.

This also frees up the "show" name to later check other
formats. We could later fold "relative" into a more generic
"show" command, but it's not worth it.  Relative times are a
special case already because we have to munge the concept of
"now" in our tests.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agomingw: let the build succeed with DEVELOPER=1
Johannes Schindelin [Sat, 18 Jun 2016 12:38:36 +0000 (14:38 +0200)]
mingw: let the build succeed with DEVELOPER=1

The recently introduced developer flags identified a couple of
old-style function declarations in the Windows-specific code where
the parameter list was left empty instead of specifying "void"
explicitly. Let's just fix them.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agolock_ref_for_update(): avoid a symref resolution
Michael Haggerty [Tue, 7 Jun 2016 07:32:08 +0000 (09:32 +0200)]
lock_ref_for_update(): avoid a symref resolution

If we're overwriting a symref with a SHA-1, we need to resolve the value
of the symref (1) to check against update->old_sha1 and (2) to write to
its reflog. However, we've already read the symref itself and know its
referent. So there is no need to read the symref's value through the
symref; we can read the referent directly.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agolock_ref_for_update(): make error handling more uniform
Michael Haggerty [Tue, 7 Jun 2016 07:29:23 +0000 (09:29 +0200)]
lock_ref_for_update(): make error handling more uniform

To aid the effort, extract a new function, check_old_oid(), and use it
in the two places where the read value of the reference has to be
checked against update->old_sha1.

Update tests to reflect the improvements.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agot1404: add more tests of update-ref error handling
Michael Haggerty [Tue, 7 Jun 2016 10:29:02 +0000 (12:29 +0200)]
t1404: add more tests of update-ref error handling

Some of the error messages will be improved in subsequent commits.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agot1404: document function test_update_rejected
Michael Haggerty [Fri, 10 Jun 2016 06:55:40 +0000 (08:55 +0200)]
t1404: document function test_update_rejected

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agot1404: remove "prefix" argument to test_update_rejected
Michael Haggerty [Fri, 10 Jun 2016 06:50:53 +0000 (08:50 +0200)]
t1404: remove "prefix" argument to test_update_rejected

The tests already set a variable called prefix and passed its value as
the first argument to this function. The old argument handling was
overwriting the global variable with its same value rather than creating
a local variable.

So change test_update_rejected to refer to the global variable rather
than taking the prefix as an argument.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agot1404: rename file to t1404-update-ref-errors.sh
Michael Haggerty [Tue, 7 Jun 2016 08:13:04 +0000 (10:13 +0200)]
t1404: rename file to t1404-update-ref-errors.sh

I want to broaden the scope of this test file, so rename it accordingly.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agofor_each_reflog(): reimplement using iterators
Michael Haggerty [Sat, 18 Jun 2016 04:15:19 +0000 (06:15 +0200)]
for_each_reflog(): reimplement using iterators

Allow references with reflogs to be iterated over using a ref_iterator.
The latter is implemented as a files_reflog_iterator, which in turn uses
dir_iterator to read the "logs" directory.

Note that reflog iteration doesn't correctly handle per-worktree
reflogs (either before or after this patch).

Signed-off-by: Ramsay Jones <ramsay@ramsayjones.plus.com>
Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agodir_iterator: new API for iterating over a directory tree
Michael Haggerty [Sat, 18 Jun 2016 04:15:18 +0000 (06:15 +0200)]
dir_iterator: new API for iterating over a directory tree

The iterator interface is modeled on that for references, though no
vtable is necessary because there is (so far?) only one type of
dir_iterator.

There are obviously a lot of features that could easily be added to this
class:

* Skip/include directory paths in the iteration
* Shallow/deep iteration
* Letting the caller decide which subdirectories to recurse into (e.g.,
  via a dir_iterator_advance_into() function)
* Option to iterate in sorted order
* Option to iterate over directory paths before vs. after their contents

But these are not needed for the current patch series, so I refrain.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agofor_each_reflog(): don't abort for bad references
Michael Haggerty [Sat, 18 Jun 2016 04:15:17 +0000 (06:15 +0200)]
for_each_reflog(): don't abort for bad references

If there is a file under "$GIT_DIR/logs" with no corresponding
reference, the old code was emitting an error message, aborting the
reflog iteration, and returning -1. But

* None of the callers was checking the exit value

* The callers all want to find all legitimate reflogs (sometimes for the
  purpose of determining object reachability!) and wouldn't benefit from
  a truncated iteration anyway.

So instead, emit an error message and skip the "broken" reflog, but
continue with the iteration.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agodo_for_each_ref(): reimplement using reference iteration
Michael Haggerty [Sat, 18 Jun 2016 04:15:16 +0000 (06:15 +0200)]
do_for_each_ref(): reimplement using reference iteration

Use the reference iterator interface to implement do_for_each_ref().
Delete a bunch of code supporting the old for_each_ref() implementation.
And now that do_for_each_ref() is generic code (it is no longer tied to
the files backend), move it to refs.c.

The implementation is via a new function, do_for_each_ref_iterator(),
which takes a reference iterator as argument and calls a callback
function for each of the references in the iterator.

This change requires the current_ref performance hack for peel_ref() to
be implemented via ref_iterator_peel() rather than peel_entry() because
we don't have a ref_entry handy (it is hidden under three layers:
file_ref_iterator, merge_ref_iterator, and cache_ref_iterator). So:

* do_for_each_ref_iterator() records the active iterator in
  current_ref_iter while it is running.

* peel_ref() checks whether current_ref_iter is pointing at the
  requested reference. If so, it asks the iterator to peel the
  reference (which it can do efficiently via its "peel" virtual
  function). For extra safety, we do the optimization only if the
  refname *addresses* are the same, not only if the refname *strings*
  are the same, to forestall possible mixups between refnames that come
  from different ref_iterators.

Please note that this optimization of peel_ref() is only available when
iterating via do_for_each_ref_iterator() (including all of the
for_each_ref() functions, which call it indirectly). It would be
complicated to implement a similar optimization when iterating directly
using a reference iterator, because multiple reference iterators can be
in use at the same time, with interleaved calls to
ref_iterator_advance(). (In fact we do exactly that in
merge_ref_iterator.)

But that is not necessary. peel_ref() is only called while iterating
over references. Callers who iterate using the for_each_ref() functions
benefit from the optimization described above. Callers who iterate using
reference iterators directly have access to the ref_iterator, so they
can call ref_iterator_peel() themselves to get an analogous optimization
in a more straightforward manner.

If we rewrite all callers to use the reference iteration API, then we
can remove the current_ref_iter hack permanently.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agorefs: introduce an iterator interface
Michael Haggerty [Sat, 18 Jun 2016 04:15:15 +0000 (06:15 +0200)]
refs: introduce an iterator interface

Currently, the API for iterating over references is via a family of
for_each_ref()-type functions that invoke a callback function for each
selected reference. All of these eventually call do_for_each_ref(),
which knows how to do one thing: iterate in parallel through two
ref_caches, one for loose and one for packed refs, giving loose
references precedence over packed refs. This is rather complicated code,
and is quite specialized to the files backend. It also requires callers
to encapsulate their work into a callback function, which often means
that they have to define and use a "cb_data" struct to manage their
context.

The current design is already bursting at the seams, and will become
even more awkward in the upcoming world of multiple reference storage
backends:

* Per-worktree vs. shared references are currently handled via a kludge
  in git_path() rather than iterating over each part of the reference
  namespace separately and merging the results. This kludge will cease
  to work when we have multiple reference storage backends.

* The current scheme is inflexible. What if we sometimes want to bypass
  the ref_cache, or use it only for packed or only for loose refs? What
  if we want to store symbolic refs in one type of storage backend and
  non-symbolic ones in another?

In the future, each reference backend will need to define its own way of
iterating over references. The crux of the problem with the current
design is that it is impossible to compose for_each_ref()-style
iterations, because the flow of control is owned by the for_each_ref()
function. There is nothing that a caller can do but iterate through all
references in a single burst, so there is no way for it to interleave
references from multiple backends and present the result to the rest of
the world as a single compound backend.

This commit introduces a new iteration primitive for references: a
ref_iterator. A ref_iterator is a polymorphic object that a reference
storage backend can be asked to instantiate. There are three functions
that can be applied to a ref_iterator:

* ref_iterator_advance(): move to the next reference in the iteration
* ref_iterator_abort(): end the iteration before it is exhausted
* ref_iterator_peel(): peel the reference currently being looked at

Iterating using a ref_iterator leaves the flow of control in the hands
of the caller, which means that ref_iterators from multiple
sources (e.g., loose and packed refs) can be composed and presented to
the world as a single compound ref_iterator.

It also means that the backend code for implementing reference iteration
will sometimes be more complicated. For example, the
cache_ref_iterator (which iterates over a ref_cache) can't use the C
stack to recurse; instead, it must manage its own stack internally as
explicit data structures. There is also a lot of boilerplate connected
with object-oriented programming in C.

Eventually, end-user callers will be able to be written in a more
natural way—managing their own flow of control rather than having to
work via callbacks. Since there will only be a few reference backends
but there are many consumers of this API, this is a good tradeoff.

More importantly, we gain composability, and especially the possibility
of writing interchangeable parts that can work with any ref_iterator.

For example, merge_ref_iterator implements a generic way of merging the
contents of any two ref_iterators. It is used to merge loose + packed
refs as part of the implementation of the files_ref_iterator. But it
will also be possible to use it to merge other pairs of reference
sources (e.g., per-worktree vs. shared refs).

Another example is prefix_ref_iterator, which can be used to trim a
prefix off the front of reference names before presenting them to the
caller (e.g., "refs/heads/master" -> "master").

In this patch, we introduce the iterator abstraction and many utilities,
and implement a reference iterator for the files ref storage backend.
(I've written several other obvious utilities, for example a generic way
to filter references being iterated over. These will probably be useful
in the future. But they are not needed for this patch series, so I am
not including them at this time.)

In a moment we will rewrite do_for_each_ref() to work via reference
iterators (allowing some special-purpose code to be discarded), and do
something similar for reflogs. In future patch series, we will expose
the ref_iterator abstraction in the public refs API so that callers can
use it directly.

Implementation note: I tried abstracting this a layer further to allow
generic iterators (over arbitrary types of objects) and generic
utilities like a generic merge_iterator. But the implementation in C was
very cumbersome, involving (in my opinion) too much boilerplate and too
much unsafe casting, some of which would have had to be done on the
caller side. However, I did put a few iterator-related constants in a
top-level header file, iterator.h, as they will be useful in a moment to
implement iteration over directory trees and possibly other types of
iterators in the future.

Signed-off-by: Ramsay Jones <ramsay@ramsayjones.plus.com>
Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agoref_resolves_to_object(): new function
Michael Haggerty [Sat, 18 Jun 2016 04:15:14 +0000 (06:15 +0200)]
ref_resolves_to_object(): new function

Extract new function ref_resolves_to_object() from
entry_resolves_to_object(). It can be used even if there is no ref_entry
at hand.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agoentry_resolves_to_object(): rename function from ref_resolves_to_object()
Michael Haggerty [Sat, 18 Jun 2016 04:15:13 +0000 (06:15 +0200)]
entry_resolves_to_object(): rename function from ref_resolves_to_object()

Free up the old name for a more general purpose.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agoget_ref_cache(): only create an instance if there is a submodule
Michael Haggerty [Sat, 18 Jun 2016 04:15:12 +0000 (06:15 +0200)]
get_ref_cache(): only create an instance if there is a submodule

If there is not a nonbare repository where a submodule is supposedly
located, then don't instantiate a ref_cache for it.

The analogous check can be removed from resolve_gitlink_ref().

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agoremote rm: handle symbolic refs correctly
Michael Haggerty [Sat, 18 Jun 2016 04:15:11 +0000 (06:15 +0200)]
remote rm: handle symbolic refs correctly

In the modern world of reference backends, it is not OK to delete a
symref by unlink()ing the file directly. This must be done via the refs
API.

We do so by adding the symref to the list of references to delete along
with the non-symbolic references, then calling delete_refs() with the
new flags option set to REF_NODEREF.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agodelete_refs(): add a flags argument
Michael Haggerty [Sat, 18 Jun 2016 04:15:10 +0000 (06:15 +0200)]
delete_refs(): add a flags argument

This will be useful for passing REF_NODEREF through.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agorefs: use name "prefix" consistently
Michael Haggerty [Sat, 18 Jun 2016 04:15:09 +0000 (06:15 +0200)]
refs: use name "prefix" consistently

In the context of the for_each_ref() functions, call the prefix that
references must start with "prefix". (In some places it was called
"base".) This is clearer, and also prevents confusion with another
planned use of the word "base".

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agodo_for_each_ref(): move docstring to the header file
Michael Haggerty [Sat, 18 Jun 2016 04:15:08 +0000 (06:15 +0200)]
do_for_each_ref(): move docstring to the header file

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agoclone: do not let --depth imply --shallow-submodules
Junio C Hamano [Sun, 19 Jun 2016 20:51:56 +0000 (13:51 -0700)]
clone: do not let --depth imply --shallow-submodules

In v2.9.0, we prematurely flipped the default to force cloning
submodules shallowly, when the superproject is getting cloned
shallowly.  This is likely to fail when the upstream repositories
submodules are cloned from a repository that is not prepared to
serve histories that ends at a commit that is not at the tip of a
branch, and we know the world is not yet ready.

Use a safer default to clone the submodules fully, unless the user
tells us that she knows that the upstream repository of the
submodules are willing to cooperate with "--shallow-submodules"
option.

Noticed-by: Vadim Eisenberg <VADIME@il.ibm.com>
Helped-by: Jeff King <peff@peff.net>
Helped-by: Stefan Beller <sbeller@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agoStart the post-2.9 cycle
Junio C Hamano [Mon, 20 Jun 2016 18:06:49 +0000 (11:06 -0700)]
Start the post-2.9 cycle

Signed-off-by: Junio C Hamano <gitster@pobox.com>
10 years agoMerge branch 'rs/xdiff-hunk-with-func-line'
Junio C Hamano [Mon, 20 Jun 2016 18:01:04 +0000 (11:01 -0700)]
Merge branch 'rs/xdiff-hunk-with-func-line'

"git show -W" (extend hunks to cover the entire function, delimited
by lines that match the "funcname" pattern) used to show the entire
file when a change added an entire function at the end of the file,
which has been fixed.

* rs/xdiff-hunk-with-func-line:
  xdiff: fix merging of appended hunk with -W
  grep: -W: don't extend context to trailing empty lines
  t7810: add test for grep -W and trailing empty context lines
  xdiff: don't trim common tail with -W
  xdiff: -W: don't include common trailing empty lines in context
  xdiff: ignore empty lines before added functions with -W
  xdiff: handle appended chunks better with -W
  xdiff: factor out match_func_rec()
  t4051: rewrite, add more tests

10 years agoMerge branch 'jk/rev-list-count-with-bitmap'
Junio C Hamano [Mon, 20 Jun 2016 18:01:03 +0000 (11:01 -0700)]
Merge branch 'jk/rev-list-count-with-bitmap'

"git rev-list --count" whose walk-length is limited with "-n"
option did not work well with the counting optimized to look at the
bitmap index.

* jk/rev-list-count-with-bitmap:
  rev-list: disable bitmaps when "-n" is used with listing objects
  rev-list: "adjust" results of "--count --use-bitmap-index -n"

10 years agoMerge branch 'wd/userdiff-css'
Junio C Hamano [Mon, 20 Jun 2016 18:01:02 +0000 (11:01 -0700)]
Merge branch 'wd/userdiff-css'

Update the funcname definition to support css files.

* wd/userdiff-css:
  userdiff: add built-in pattern for CSS

10 years agoMerge branch 'jc/clear-pathspec'
Junio C Hamano [Mon, 20 Jun 2016 18:01:02 +0000 (11:01 -0700)]
Merge branch 'jc/clear-pathspec'

We usually call a function that clears the contents a data
structure X without freeing the structure itself clear_X(), and
call a function that does clear_X() and also frees it free_X().
free_pathspec() function has been renamed to clear_pathspec()
to avoid confusion.

* jc/clear-pathspec:
  pathspec: rename free_pathspec() to clear_pathspec()

10 years agoMerge branch 'aq/upload-pack-use-parse-options'
Junio C Hamano [Mon, 20 Jun 2016 18:01:02 +0000 (11:01 -0700)]
Merge branch 'aq/upload-pack-use-parse-options'

"git upload-pack" command has been updated to use the parse-options
API.

* aq/upload-pack-use-parse-options:
  upload-pack.c: use parse-options API

10 years agoMerge branch 'jg/dash-is-last-branch-in-worktree-add'
Junio C Hamano [Mon, 20 Jun 2016 18:01:02 +0000 (11:01 -0700)]
Merge branch 'jg/dash-is-last-branch-in-worktree-add'

"git worktree add" learned that '-' can be used as a short-hand for
"@{-1}", the previous branch.

* jg/dash-is-last-branch-in-worktree-add:
  worktree: allow "-" short-hand for @{-1} in add command

10 years agoMerge branch 'et/pretty-format-c-auto'
Junio C Hamano [Mon, 20 Jun 2016 18:01:01 +0000 (11:01 -0700)]
Merge branch 'et/pretty-format-c-auto'

The commands in `git log` family take %C(auto) in a custom format
string.  This unconditionally turned the color on, ignoring
--no-color or with --color=auto when the output is not connected to
a tty; this was corrected to make the format truly behave as
"auto".

* et/pretty-format-c-auto:
  format_commit_message: honor `color=auto` for `%C(auto)`

10 years agoMerge branch 'sb/submodule-recommend-shallowness'
Junio C Hamano [Mon, 20 Jun 2016 18:01:01 +0000 (11:01 -0700)]
Merge branch 'sb/submodule-recommend-shallowness'

An upstream project can make a recommendation to shallowly clone
some submodules in the .gitmodules file it ships.

* sb/submodule-recommend-shallowness:
  submodule update: learn `--[no-]recommend-shallow` option
  submodule-config: keep shallow recommendation around

10 years agoMerge branch 'sb/submodule-misc-cleanups'
Junio C Hamano [Mon, 20 Jun 2016 18:01:01 +0000 (11:01 -0700)]
Merge branch 'sb/submodule-misc-cleanups'

Minor simplification.

* sb/submodule-misc-cleanups:
  submodule update: make use of the existing fetch_in_submodule function

10 years agoMerge branch 'ew/daemon-socket-keepalive'
Junio C Hamano [Mon, 20 Jun 2016 18:01:00 +0000 (11:01 -0700)]
Merge branch 'ew/daemon-socket-keepalive'

When "git daemon" is run without --[init-]timeout specified, a
connection from a client that silently goes offline can hang around
for a long time, wasting resources.  The socket-level KEEPALIVE has
been enabled to allow the OS to notice such failed connections.

* ew/daemon-socket-keepalive:
  daemon: enable SO_KEEPALIVE for all sockets

10 years agoMerge branch 'ah/no-verify-signature-with-pull-rebase'
Junio C Hamano [Mon, 20 Jun 2016 18:01:00 +0000 (11:01 -0700)]
Merge branch 'ah/no-verify-signature-with-pull-rebase'

"git pull --rebase --verify-signature" learned to warn the user
that "--verify-signature" is a no-op when rebasing.

* ah/no-verify-signature-with-pull-rebase:
  pull: warn on --verify-signatures with --rebase