gitweb.git
completion: recognize more long-optionsCornelius Weig Fri, 3 Feb 2017 11:01:59 +0000 (12:01 +0100)

completion: recognize more long-options

Command completion only recognizes a subset of the available options for
the various git commands. The set of recognized options needs to balance
between having all useful options and to not clutter the terminal.

This commit adds all long-options that are mentioned in the man-page
synopsis of the respective git command. Possibly dangerous options are
not included in this set, to avoid accidental data loss. The added
options are:

- apply: --recount --directory=
- archive: --output
- branch: --column --no-column --sort= --points-at
- clone: --no-single-branch --shallow-submodules
- commit: --patch --short --date --allow-empty
- describe: --first-parent
- fetch, pull: --unshallow --update-shallow
- fsck: --name-objects
- grep: --break --heading --show-function --function-context
--untracked --no-index
- mergetool: --prompt --no-prompt
- reset: --keep
- revert: --strategy= --strategy-option=
- shortlog: --email
- tag: --merged --no-merged --create-reflog

Signed-off-by: Cornelius Weig <cornelius.weig@tngtech.com>
Helped-by: Johannes Sixt <j6t@kdbg.org>
Reviewed-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

completion: teach remote subcommands to complete optionsCornelius Weig Fri, 3 Feb 2017 11:01:58 +0000 (12:01 +0100)

completion: teach remote subcommands to complete options

Git-remote needs to complete remote names, its subcommands, and options
thereof. In addition to the existing subcommand and remote name
completion, do also complete the options

- add: --track --master --fetch --tags --no-tags --mirror=
- set-url: --push --add --delete
- get-url: --push --all
- prune: --dry-run

Signed-off-by: Cornelius Weig <cornelius.weig@tngtech.com>
Reviewed-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

completion: teach replace to complete optionsCornelius Weig Fri, 3 Feb 2017 11:01:57 +0000 (12:01 +0100)

completion: teach replace to complete options

Git-replace needs to complete references and its own options. In
addition to the existing references completions, do also complete the
options --edit --graft --format= --list --delete.

Signed-off-by: Cornelius Weig <cornelius.weig@tngtech.com>
Reviewed-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

completion: teach ls-remote to complete optionsCornelius Weig Fri, 3 Feb 2017 11:01:56 +0000 (12:01 +0100)

completion: teach ls-remote to complete options

ls-remote needs to complete remote names and its own options. In
addition to the existing remote name completions, do also complete
the options --heads, --tags, --refs, --get-url, and --symref.

Signed-off-by: Cornelius Weig <cornelius.weig@tngtech.com>
Reviewed-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

completion: improve bash completion for git-addCornelius Weig Fri, 3 Feb 2017 11:01:55 +0000 (12:01 +0100)

completion: improve bash completion for git-add

Command completion for git-add did not recognize some long-options.
This commits adds completion for all long-options that are mentioned in
the man-page synopsis. In addition, if the user specified `--update` or
`-u`, path completion will only suggest modified tracked files.

Signed-off-by: Cornelius Weig <cornelius.weig@tngtech.com>
Reviewed-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

completion: add subcommand completion for rerereCornelius Weig Fri, 3 Feb 2017 11:01:54 +0000 (12:01 +0100)

completion: add subcommand completion for rerere

Managing recorded resolutions requires command-line usage of git-rerere.
Added subcommand completion for rerere and path completion for its
subcommand forget.

Signed-off-by: Cornelius Weig <cornelius.weig@tngtech.com>
Reviewed-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

completion: teach submodule subcommands to complete... Cornelius Weig Fri, 3 Feb 2017 11:01:53 +0000 (12:01 +0100)

completion: teach submodule subcommands to complete options

Each submodule subcommand has specific long-options. Therefore, teach
bash completion to support option completion based on the current
subcommand. All long-options that are mentioned in the man-page synopsis
are added.

Signed-off-by: Cornelius Weig <cornelius.weig@tngtech.com>
Reviewed-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

completion: cache the path to the repositorySZEDER Gábor Fri, 3 Feb 2017 02:48:29 +0000 (03:48 +0100)

completion: cache the path to the repository

After the previous changes in this series there are only a handful of
$(__gitdir) command substitutions left in the completion script, but
there is still a bit of room for improvements:

1. The command substitution involves the forking of a subshell,
which has considerable overhead on some platforms.

2. There are a few cases, where this command substitution is
executed more than once during a single completion, which means
multiple subshells and possibly multiple 'git rev-parse'
executions. __gitdir() is invoked twice while completing refs
for e.g. 'git log', 'git rebase', 'gitk', or while completing
remote refs for 'git fetch' or 'git push'.

Both of these points can be addressed by using the
__git_find_repo_path() helper function introduced in the previous
commit:

1. __git_find_repo_path() stores the path to the repository in a
variable instead of printing it, so the command substitution
around the function can be avoided. Or rather: the command
substitution should be avoided to make the new value of the
variable set inside the function visible to the callers.
(Yes, there is now a command substitution inside
__git_find_repo_path() around each 'git rev-parse', but that's
executed only if necessary, and only once per completion, see
point 2. below.)

2. $__git_repo_path, the variable holding the path to the
repository, is declared local in the toplevel completion
functions __git_main() and __gitk_main(). Thus, once set, the
path is visible in all completion functions, including all
subsequent calls to __git_find_repo_path(), meaning that they
wouldn't have to re-discover the path to the repository.

So call __git_find_repo_path() and use $__git_repo_path instead of the
$(__gitdir) command substitution to access paths in the .git
directory. Turn tests checking __gitdir()'s repository discovery into
tests of __git_find_repo_path() such that only the tested function
changes but the expected results don't, ensuring that repo discovery
keeps working as it did before.

As __gitdir() is not used anymore in the completion script, mark it as
deprecated and direct users' attention to __git_find_repo_path() and
$__git_repo_path. Yet keep four __gitdir() tests to ensure that it
handles success and failure of __git_find_repo_path() and that it
still handles its optional remote argument, because users' custom
completion scriptlets might depend on it.

Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

completion: extract repository discovery from __gitdir()SZEDER Gábor Fri, 3 Feb 2017 02:48:28 +0000 (03:48 +0100)

completion: extract repository discovery from __gitdir()

To prepare for caching the path to the repository in the following
commit, extract the repository discovering part of __gitdir() into the
__git_find_repo_path() helper function, which stores the found path in
the $__git_repo_path variable instead of printing it. Make __gitdir()
a wrapper around this new function. Declare $__git_repo_path local in
the toplevel completion functions __git_main() and __gitk_main() to
ensure that it never leaks into the environment and influences
subsequent completions (though this isn't necessary right now, as
__gitdir() is still only executed in subshells, but will matter for
the following commit).

Adjust tests checking __gitdir() or any other completion function
calling __gitdir() to perform those checks in a subshell to prevent
$__git_repo_path from leaking into the test environment. Otherwise
leave the tests unchanged to demonstrate that this change doesn't
alter __gitdir()'s behavior.

Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

completion: don't guard git executions with __gitdir()SZEDER Gábor Fri, 3 Feb 2017 02:48:27 +0000 (03:48 +0100)

completion: don't guard git executions with __gitdir()

Three completion functions, namely __git_index_files(), __git_heads()
and __git_tags(), first run __gitdir() and check that the path it
outputs exists, i.e. that there is a git repository, and run a git
command only if there is one.

After the previous changes in this series there are no further uses of
__gitdir()'s output in these functions besides those checks. And
those checks are unnecessary, because we can just execute those git
commands outside of a repository and let them error out. We don't
perform such a check in other places either.

Remove this check and the __gitdir() call from these functions,
sparing the fork()+exec() overhead of the command substitution and the
potential 'git rev-parse' execution.

Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

completion: consolidate silencing errors from git commandsSZEDER Gábor Fri, 3 Feb 2017 02:48:26 +0000 (03:48 +0100)

completion: consolidate silencing errors from git commands

Outputting error messages during completion is bad: they disrupt the
command line, can't be deleted, and the user is forced to Ctrl-C and
start over most of the time. We already silence stderr of many git
commands in our Bash completion script, but there are still some in
there that can spew error messages when something goes wrong.

We could add the missing stderr redirections to all the remaining
places, but instead let's leverage that git commands are now executed
through the previously introduced __git() wrapper function, and
redirect standard error to /dev/null only in that function. This way
we need only one redirection to take care of errors from almost all
git commands. Redirecting standard error of the __git() wrapper
function thus became redundant, remove them.

The exceptions, i.e. the repo-independent git executions and those in
the __gitdir() function that don't go through __git() already have
their standard error silenced.

Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

completion: don't use __gitdir() for git commandsSZEDER Gábor Fri, 3 Feb 2017 02:48:25 +0000 (03:48 +0100)

completion: don't use __gitdir() for git commands

Several completion functions contain the following pattern to run git
commands respecting the path to the repository specified on the
command line:

git --git-dir="$(__gitdir)" <cmd> <options>

This imposes the overhead of fork()ing a subshell for the command
substitution and potentially fork()+exec()ing 'git rev-parse' inside
__gitdir().

Now, if neither '--gitdir=<path>' nor '-C <path>' options are
specified on the command line, then those git commands are perfectly
capable to discover the repository on their own. If either one or
both of those options are specified on the command line, then, again,
the git commands could discover the repository, if we pass them all of
those options from the command line.

This means we don't have to run __gitdir() at all for git commands and
can spare its fork()+exec() overhead.

Use Bash parameter expansions to check the $__git_dir variable and
$__git_C_args array and to assemble the appropriate '--git-dir=<path>'
and '-C <path>' options if either one or both are present on the
command line. These parameter expansions are, however, rather long,
so instead of changing all git executions and make already long lines
even longer, encapsulate running git with '--git-dir=<path> -C <path>'
options into the new __git() wrapper function. Furthermore, this
wrapper function will also enable us to silence error messages from
git commands uniformly in one place in a later commit.

There's one tricky case, though: in __git_refs() local refs are listed
with 'git for-each-ref', where "local" is not necessarily the
repository we are currently in, but it might mean a remote repository
in the filesystem (e.g. listing refs for 'git fetch /some/other/repo
<TAB>'). Use one-shot variable assignment to override $__git_dir with
the path of the repository where the refs should come from. Although
one-shot variable assignments in front of shell functions are to be
avoided in our scripts in general, in the Bash completion script we
can do that safely.

Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

completion: respect 'git -C <path>'SZEDER Gábor Fri, 3 Feb 2017 02:48:24 +0000 (03:48 +0100)

completion: respect 'git -C <path>'

'git -C <path>' option(s) on the command line should be taken into
account during completion, because

- like '--git-dir=<path>', it can lead us to a different repository,

- a few git commands executed in the completion script do care about
in which directory they are executed, and

- the command for which we are providing completion might care about
in which directory it will be executed.

However, unlike '--git-dir=<path>', the '-C <path>' option can be
specified multiple times and their effect is cumulative, so we can't
just store a single '<path>' in a variable. Nor can we simply
concatenate a path from '-C <path1> -C <path2> ...', because e.g. (in
an arguably pathological corner case) a relative path might be
followed by an absolute path.

Instead, store all '-C <path>' options word by word in the
$__git_C_args array in the main git completion function, and pass this
array, if present, to 'git rev-parse --absolute-git-dir' when
discovering the repository in __gitdir(), and let it take care of
multiple options, relative paths, absolute paths and everything.

Also pass all '-C <path> options via the $__git_C_args array to those
git executions which require a worktree and for which it matters from
which directory they are executed from. There are only three such
cases:

- 'git diff-index' and 'git ls-files' in __git_ls_files_helper()
used for git-aware filename completion, and

- the 'git ls-tree' used for completing the 'ref:path' notation.

The other git commands executed in the completion script don't need
these '-C <path>' options, because __gitdir() already took those
options into account. It would not hurt them, either, but let's not
induce unnecessary code churn.

Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

rev-parse: add '--absolute-git-dir' optionSZEDER Gábor Fri, 3 Feb 2017 02:48:23 +0000 (03:48 +0100)

rev-parse: add '--absolute-git-dir' option

The output of 'git rev-parse --git-dir' can be either a relative or an
absolute path, depending on whether the current working directory is
at the top of the worktree or the .git directory or not, or how the
path to the repository is specified via the '--git-dir=<path>' option
or the $GIT_DIR environment variable. And if that output is a
relative path, then it is relative to the directory where any 'git
-C <path>' options might have led us.

This doesn't matter at all for regular scripts, because the git
wrapper automatically takes care of changing directories according to
the '-C <path>' options, and the scripts can then simply follow any
path returned by 'git rev-parse --git-dir', even if it's a relative
path.

Our Bash completion script, however, is unique in that it must run
directly in the user's interactive shell environment. This means that
it's not executed through the git wrapper and would have to take care
of any '-C <path> options on its own, and it can't just change
directories as it pleases. Consequently, adding support for taking
any '-C <path>' options on the command line into account during
completion turned out to be considerably more difficult, error prone
and required more subshells and git processes when it had to cope with
a relative path to the .git directory.

Help this rather special use case and teach 'git rev-parse' a new
'--absolute-git-dir' option which always outputs a canonicalized
absolute path to the .git directory, regardless of whether the path is
discovered automatically or is specified via $GIT_DIR or 'git
--git-dir=<path>'.

Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

completion: fix completion after 'git -C <path>'SZEDER Gábor Fri, 3 Feb 2017 02:48:22 +0000 (03:48 +0100)

completion: fix completion after 'git -C <path>'

The main completion function finds the name of the git command by
iterating through all the words on the command line in search for the
first non-option-looking word. As it is not aware of 'git -C's
mandatory path argument, if the '-C <path>' option is present, 'path'
will be the first such word and it will be mistaken for a git command.
This breaks completion in various ways:

- If 'path' happens to match one of the commands supported by the
completion script, then options of that command will be offered.

- If 'path' doesn't match a supported command and doesn't contain any
characters not allowed in Bash identifier names, then the
completion script does basically nothing and Bash in turn falls
back to filename completion for all subsequent words.

- Otherwise, if 'path' does contain such an unallowed character, then
it leads to a more or less ugly error message in the middle of the
command line. The standard '/' directory separator is such a
character, and it happens to trigger one of the uglier errors:

$ git -C some/path <TAB>sh.exe": declare: `_git_some/path': not a valid identifier
error: invalid key: alias.some/path

Fix this by skipping 'git -C's mandatory path argument while iterating
over the words on the command line. Extend the relevant test with
this case and, while at it, with cases that needed similar treatment
in the past ('--git-dir', '-c', '--work-tree' and '--namespace').

Additionally, silence the standard error of the 'declare' builtins
looking for the completion function associated with the git command
and of the 'git config' query for the aliased command. So if git ever
learns a new option with a mandatory argument in the future, then,
though the completion script will again misbehave, at least the
command line will not be utterly disrupted by those error messages.

Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

completion: don't offer commands when 'git --opt' needs... SZEDER Gábor Fri, 3 Feb 2017 02:48:21 +0000 (03:48 +0100)

completion: don't offer commands when 'git --opt' needs an argument

The main git options '--git-dir', '-c', '-C', '--worktree' and
'--namespace' require an argument, but attempting completion right
after them lists git commands.

Don't offer anything right after these options, thus let Bash fall
back to filename completion, because

- the three options '--git-dir', '-C' and '--worktree' do actually
require a path argument, and

- we don't complete the required argument of '-c' and '--namespace',
and in that case the "standard" behavior of our completion script
is to not offer anything, but fall back to filename completion.

Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

completion: list short refs from a remote given as... SZEDER Gábor Fri, 3 Feb 2017 02:48:20 +0000 (03:48 +0100)

completion: list short refs from a remote given as a URL

e832f5c09680 (completion: avoid ls-remote in certain scenarios,
2013-05-28) turned a 'git ls-remote <remote>' query into a 'git
for-each-ref refs/remotes/<remote>/' to improve responsiveness of
remote refs completion by avoiding potential network communication.
However, it inadvertently made impossible to complete short refs from
a remote given as a URL, e.g. 'git fetch git://server.com/repo.git
<TAB>', because there is, of course, no such thing as
'refs/remotes/git://server.com/repo.git'.

Since the previous commit we tell apart configured remotes, i.e. those
that can have a hierarchy under 'refs/remotes/', from others that
don't, including remotes given as URL, so we know when we can't use
the faster 'git for-each-ref'-based approach.

Resurrect the old, pre-e832f5c09680 'git ls-remote'-based code for the
latter case to support listing short refs from remotes given as a URL.
The code is slightly updated from the original to

- take into account the path to the repository given on the command
line (if any), and
- omit 'ORIG_HEAD' from the query, as 'git ls-remote' will never
list it anyway.

When the remote given to __git_refs() doesn't exist, then it will be
handled by this resurrected 'git ls-remote' query. This code path
doesn't list 'HEAD' unconditionally, which has the nice side effect of
fixing two more expected test failures.

Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

completion: don't list 'HEAD' when trying refs completi... SZEDER Gábor Fri, 3 Feb 2017 02:48:19 +0000 (03:48 +0100)

completion: don't list 'HEAD' when trying refs completion outside of a repo

When refs completion is attempted while not in a git repository, the
completion script offers 'HEAD' erroneously.

Check early in __git_refs() that there is either a repository or a
remote to work on, and return early if neither is given.

Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

completion: list refs from remote when remote's name... SZEDER Gábor Fri, 3 Feb 2017 02:48:18 +0000 (03:48 +0100)

completion: list refs from remote when remote's name matches a directory

If the remote given to __git_refs() happens to match both the name of
a configured remote and the name of a directory in the current working
directory, then that directory is assumed to be a git repository, and
listing refs from that directory will be attempted. This is wrong,
because in such a situation git commands (e.g. 'git fetch|pull|push
<remote>' whom these refs will eventually be passed to) give
precedence to the configured remote. Therefore, __git_refs() should
list refs from the configured remote as well.

Add the helper function __git_is_configured_remote() that checks
whether its argument matches the name of a configured remote. Use
this helper to decide how to handle the remote passed to __git_refs().

Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

completion: respect 'git --git-dir=<path>' when listing... SZEDER Gábor Fri, 3 Feb 2017 02:48:17 +0000 (03:48 +0100)

completion: respect 'git --git-dir=<path>' when listing remote refs

In __git_refs() the git commands listing refs, both short and full,
from a given remote repository are run without giving them the path to
the git repository which might have been specified on the command line
via 'git --git-dir=<path>'. This is bad, those git commands should
access the 'refs/remotes/<remote>/' hierarchy or the remote and
credentials configuration in that specified repository.

Use the __gitdir() helper only to find the path to the .git directory
and pass the resulting path to the 'git ls-remote' and 'for-each-ref'
executions that list remote refs. While modifying that 'for-each-ref'
line, remove the superfluous disambiguating doubledash.

Don't use __gitdir() to check that the given remote is on the file
system: basically it performs only a single if statement for us at the
considerable cost of fork()ing a subshell for a command substitution.
We are better off to perform all the necessary checks of the remote in
__git_refs().

Though __git_refs() was the last remaining callsite that passed a
remote to __gitdir(), don't delete __gitdir()'s remote-handling part
yet, just in case some users' custom completion scriptlets depend on
it.

Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

completion: fix most spots not respecting 'git --git... SZEDER Gábor Fri, 3 Feb 2017 02:48:16 +0000 (03:48 +0100)

completion: fix most spots not respecting 'git --git-dir=<path>'

The completion script already respects the path to the repository
specified on the command line most of the time, here we add the
necessary '--git-dir=$(__gitdir)' options to most of the places where
git was executed without it. The exceptions where said option is not
added are the git invocations:

- in __git_refs() which are non-trivial and will be the subject of
the following patch,

- getting the list of git commands, merge strategies and archive
formats, because these are independent from the repository and
thus don't need it, and

- the 'git rev-parse --git-dir' in __gitdir() itself.

Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

completion: ensure that the repository path given on... SZEDER Gábor Fri, 3 Feb 2017 02:48:15 +0000 (03:48 +0100)

completion: ensure that the repository path given on the command line exists

The __gitdir() helper function prints the path to the git repository
to its stdout or stays silent and returns with error when it can't
find a repository or when the repository given via $GIT_DIR doesn't
exist.

This is not the case, however, when the path in $__git_dir, i.e. the
path to the repository specified on the command line via 'git
--git-dir=<path>', doesn't exist: __gitdir() still outputs it as if it
were a real existing repository, making some completion functions
believe that they operate on an existing repository.

Check that the path in $__git_dir exists and return with error without
printing anything to stdout if it doesn't.

Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

completion tests: add tests for the __git_refs() helper... SZEDER Gábor Fri, 3 Feb 2017 02:48:14 +0000 (03:48 +0100)

completion tests: add tests for the __git_refs() helper function

Check how __git_refs() lists refs in different scenarios, i.e.

- short and full refs,
- from a local or from a remote repository,
- remote specified via path, name or URL,
- with or without a repository specified on the command line,
- non-existing remote,
- unique remote branches for 'git checkout's tracking DWIMery,
- not in a git repository, and
- interesting combinations of the above.

Seven of these tests expect failure, mostly demonstrating bugs related
to listing refs from a remote repository:

- ignoring the repository specified on the command line (2 tests),
- listing refs from the wrong place when the name of a configured
remote happens to match a directory,
- listing only 'HEAD' but no short refs from a remote given as URL,
- listing 'HEAD' even from non-existing remotes (2 tests), and
- listing 'HEAD' when not in a repository.

Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

completion tests: check __gitdir()'s output in the... SZEDER Gábor Fri, 3 Feb 2017 02:48:13 +0000 (03:48 +0100)

completion tests: check __gitdir()'s output in the error cases

The __gitdir() helper function shouldn't output anything if not in a
git repository. The relevant tests only checked its error code, so
extend them to ensure that there's no output.

Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

completion tests: consolidate getting path of current... SZEDER Gábor Fri, 3 Feb 2017 02:48:12 +0000 (03:48 +0100)

completion tests: consolidate getting path of current working directory

Some tests of the __gitdir() helper function use the $TRASH_DIRECTORY
variable in direct path comparisons. In general this should be
avoided, because it might contain symbolic links. There happens to be
no issues with this here, however, because those tests use
$TRASH_DIRECTORY both for specifying the expected result and for
specifying input which in turn is just 'echo'ed verbatim.

Other __gitdir() tests ask for the path of the trash directory by
running $(pwd -P) in each test, sometimes even twice in a single test.

Run $(pwd) only once at the beginning of the test script to store the
path of the trash directory in a variable, and use that variable in
all __gitdir() tests.

Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

completion tests: make the $cur variable local to the... SZEDER Gábor Fri, 3 Feb 2017 02:48:11 +0000 (03:48 +0100)

completion tests: make the $cur variable local to the test helper functions

The test helper functions test_gitcomp() and test_gitcomp_nl() leak
the $cur variable into the test environment. Since this variable has
a special role in the Bash completion script (it holds the word
currently being completed) it influences the behavior of most
completion functions and thus this leakage could interfere with
subsequent tests. Although there are no such issues in the current
tests, early versions of the new tests that will be added later in
this series suffered because of this.

It's better to play safe and declare $cur local in those test helper
functions. 'local' is bashism, of course, but the tests of the Bash
completion script are run under Bash anyway, and there are already
other variables declared local in this test script.

Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

completion tests: don't add test cruft to the test... SZEDER Gábor Fri, 3 Feb 2017 02:48:10 +0000 (03:48 +0100)

completion tests: don't add test cruft to the test repository

While preparing commits, three tests added newly created files to the
index using 'git add .', which added not only the files in question
but leftover test cruft from previous tests like the files 'expected'
and 'actual' as well. Luckily, this had no effect on the tests'
correctness.

Add only the files we are actually interested in.

Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

completion: improve __git_refs()'s in-code documentationSZEDER Gábor Fri, 3 Feb 2017 02:48:09 +0000 (03:48 +0100)

completion: improve __git_refs()'s in-code documentation

That "first argument is passed to __gitdir()" statement in particular
is not really helpful, and after this series it won't be the case
anyway.

Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

l10n: git.pot: v2.12.0 round 1 (239 new, 15 removed)Jiang Xin Sat, 4 Feb 2017 05:02:24 +0000 (13:02 +0800)

l10n: git.pot: v2.12.0 round 1 (239 new, 15 removed)

Generate po/git.pot from v2.12.0-rc0 for git v2.12.0 l10n round 1.

Signed-off-by: Jiang Xin <worldhello.net@gmail.com>

Merge branch 'master' of git://github.com/git-l10n... Jiang Xin Sat, 4 Feb 2017 04:57:15 +0000 (12:57 +0800)

Merge branch 'master' of git://github.com/git-l10n/git-po

* 'master' of git://github.com/git-l10n/git-po:
l10n: bg: Updated Bulgarian translation (2913t+0f+0u)
l10n: fixes to Catalan translation
l10n: zh_CN: review for git v2.11.0 l10n
l10n: New Catalan translation maintainer

Git 2.12-rc0 v2.12.0-rc0Junio C Hamano Fri, 3 Feb 2017 19:29:52 +0000 (11:29 -0800)

Git 2.12-rc0

Signed-off-by: Junio C Hamano <gitster@pobox.com>

Merge branch 'cw/log-updates-for-all-refs-really'Junio C Hamano Fri, 3 Feb 2017 19:25:19 +0000 (11:25 -0800)

Merge branch 'cw/log-updates-for-all-refs-really'

The "core.logAllRefUpdates" that used to be boolean has been
enhanced to take 'always' as well, to record ref updates to refs
other than the ones that are expected to be updated (i.e. branches,
remote-tracking branches and notes).

* cw/log-updates-for-all-refs-really:
doc: add note about ignoring '--no-create-reflog'
update-ref: add test cases for bare repository
refs: add option core.logAllRefUpdates = always
config: add markup to core.logAllRefUpdates doc

Merge branch 'pl/complete-diff-submodule-diff'Junio C Hamano Fri, 3 Feb 2017 19:25:19 +0000 (11:25 -0800)

Merge branch 'pl/complete-diff-submodule-diff'

The command line completion (in contrib/) learned that
"git diff --submodule=" can take "diff" as a recently added option.

* pl/complete-diff-submodule-diff:
Completion: Add support for --submodule=diff

Merge branch 'rs/object-id'Junio C Hamano Fri, 3 Feb 2017 19:25:19 +0000 (11:25 -0800)

Merge branch 'rs/object-id'

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

* rs/object-id:
checkout: convert post_checkout_hook() to struct object_id
use oidcpy() for copying hashes between instances of struct object_id
use oid_to_hex_r() for converting struct object_id hashes to hex strings

Merge branch 'js/re-running-failed-tests'Junio C Hamano Fri, 3 Feb 2017 19:25:19 +0000 (11:25 -0800)

Merge branch 'js/re-running-failed-tests'

"make -C t failed" will now run only the tests that failed in the
previous run. This is usable only when prove is not use, and gives
a useless error message when run after "make clean", but otherwise
is serviceable.

* js/re-running-failed-tests:
t/Makefile: add a rule to re-run previously-failed tests

Merge branch 'sb/submodule-update-initial-runs-custom... Junio C Hamano Fri, 3 Feb 2017 19:25:19 +0000 (11:25 -0800)

Merge branch 'sb/submodule-update-initial-runs-custom-script'

The user can specify a custom update method that is run when
"submodule update" updates an already checked out submodule. This
was ignored when checking the submodule out for the first time and
we instead always just checked out the commit that is bound to the
path in the superproject's index.

* sb/submodule-update-initial-runs-custom-script:
submodule update: run custom update script for initial populating as well

Merge branch 'sb/submodule-recursive-absorb'Junio C Hamano Fri, 3 Feb 2017 19:25:18 +0000 (11:25 -0800)

Merge branch 'sb/submodule-recursive-absorb'

When a submodule "A", which has another submodule "B" nested within
it, is "absorbed" into the top-level superproject, the inner
submodule "B" used to be left in a strange state. The logic to
adjust the .git pointers in these submodules has been corrected.

* sb/submodule-recursive-absorb:
submodule absorbing: fix worktree/gitdir pointers recursively for non-moves
cache.h: expose the dying procedure for reading gitlinks
setup: add gentle version of resolve_git_dir

Merge branch 'sb/unpack-trees-super-prefix'Junio C Hamano Fri, 3 Feb 2017 19:25:18 +0000 (11:25 -0800)

Merge branch 'sb/unpack-trees-super-prefix'

"git read-tree" and its underlying unpack_trees() machinery learned
to report problematic paths prefixed with the --super-prefix option.

* sb/unpack-trees-super-prefix:
unpack-trees: support super-prefix option
t1001: modernize style
t1000: modernize style
read-tree: use OPT_BOOL instead of OPT_SET_INT

Sync with v2.11.1Junio C Hamano Thu, 2 Feb 2017 21:43:19 +0000 (13:43 -0800)

Sync with v2.11.1

* maint:
Git 2.11.1

Ninth batch for 2.12; almost ready for -rc0Junio C Hamano Thu, 2 Feb 2017 21:43:10 +0000 (13:43 -0800)

Ninth batch for 2.12; almost ready for -rc0

Signed-off-by: Junio C Hamano <gitster@pobox.com>

Merge branch 'nd/log-graph-configurable-colors'Junio C Hamano Thu, 2 Feb 2017 21:36:58 +0000 (13:36 -0800)

Merge branch 'nd/log-graph-configurable-colors'

Some people feel the default set of colors used by "git log --graph"
rather limiting. A mechanism to customize the set of colors has
been introduced.

* nd/log-graph-configurable-colors:
document behavior of empty color name
color_parse_mem: allow empty color spec
log --graph: customize the graph lines with config log.graphColors
color.c: trim leading spaces in color_parse_mem()
color.c: fix color_parse_mem() with value_len == 0

Merge branch 'ep/commit-static-buf-cleanup'Junio C Hamano Thu, 2 Feb 2017 21:36:57 +0000 (13:36 -0800)

Merge branch 'ep/commit-static-buf-cleanup'

Code clean-up.

* ep/commit-static-buf-cleanup:
builtin/commit.c: switch to strbuf, instead of snprintf()
builtin/commit.c: remove the PATH_MAX limitation via dynamic allocation

Merge branch 'bc/use-asciidoctor-opt'Junio C Hamano Thu, 2 Feb 2017 21:36:57 +0000 (13:36 -0800)

Merge branch 'bc/use-asciidoctor-opt'

Asciidoctor, an alternative reimplementation of AsciiDoc, still
needs some changes to work with documents meant to be formatted
with AsciiDoc. "make USE_ASCIIDOCTOR=YesPlease" to use it out of
the box to document our pages is getting closer to reality.

* bc/use-asciidoctor-opt:
Documentation: implement linkgit macro for Asciidoctor
Makefile: add a knob to enable the use of Asciidoctor
Documentation: move dblatex arguments into variable
Documentation: add XSLT to fix DocBook for Texinfo
Documentation: sort sources for gitman.texi
Documentation: remove unneeded argument in cat-texi.perl
Documentation: modernize cat-texi.perl
Documentation: fix warning in cat-texi.perl

Merge branch 'sg/mailmap-self'Junio C Hamano Thu, 2 Feb 2017 21:36:57 +0000 (13:36 -0800)

Merge branch 'sg/mailmap-self'

* sg/mailmap-self:
.mailmap: update Gábor Szeder's email address

Merge branch 'js/mingw-hooks-with-exe-suffix'Junio C Hamano Thu, 2 Feb 2017 21:36:57 +0000 (13:36 -0800)

Merge branch 'js/mingw-hooks-with-exe-suffix'

Names of the various hook scripts must be spelled exactly, but on
Windows, an .exe binary must be named with .exe suffix; notice
$GIT_DIR/hooks/<hookname>.exe as a valid <hookname> hook.

* js/mingw-hooks-with-exe-suffix:
mingw: allow hooks to be .exe files

Merge branch 'rs/receive-pack-cleanup'Junio C Hamano Thu, 2 Feb 2017 21:36:56 +0000 (13:36 -0800)

Merge branch 'rs/receive-pack-cleanup'

Code clean-up.

* rs/receive-pack-cleanup:
receive-pack: call string_list_clear() unconditionally

Merge branch 'mm/reset-facl-before-umask-test'Junio C Hamano Thu, 2 Feb 2017 21:36:56 +0000 (13:36 -0800)

Merge branch 'mm/reset-facl-before-umask-test'

Test tweaks for those who have default ACL in their git source tree
that interfere with the umask test.

* mm/reset-facl-before-umask-test:
t0001: don't let a default ACL interfere with the umask test

Merge branch 'hv/mingw-help-is-executable'Junio C Hamano Thu, 2 Feb 2017 21:36:55 +0000 (13:36 -0800)

Merge branch 'hv/mingw-help-is-executable'

"git help" enumerates executable files in $PATH; the implementation
of "is this file executable?" on Windows has been optimized.

* hv/mingw-help-is-executable:
help: improve is_executable() on Windows

Merge branch 'gv/mingw-p4-mapuser'Junio C Hamano Thu, 2 Feb 2017 21:36:55 +0000 (13:36 -0800)

Merge branch 'gv/mingw-p4-mapuser'

"git p4" did not work well with multiple git-p4.mapUser entries on
Windows.

* gv/mingw-p4-mapuser:
git-p4: fix git-p4.mapUser on Windows

Merge branch 'rs/absolute-pathdup'Junio C Hamano Thu, 2 Feb 2017 21:36:55 +0000 (13:36 -0800)

Merge branch 'rs/absolute-pathdup'

Code cleanup.

* rs/absolute-pathdup:
use absolute_pathdup()
abspath: add absolute_pathdup()

Merge branch 'js/unzip-in-usr-bin-workaround'Junio C Hamano Thu, 2 Feb 2017 21:36:55 +0000 (13:36 -0800)

Merge branch 'js/unzip-in-usr-bin-workaround'

Test tweak for FreeBSD where /usr/bin/unzip is unsuitable to run
our tests but /usr/local/bin/unzip is usable.

* js/unzip-in-usr-bin-workaround:
test-lib: on FreeBSD, look for unzip(1) in /usr/local/bin/

Merge branch 'cw/doc-sign-off'Junio C Hamano Thu, 2 Feb 2017 21:36:54 +0000 (13:36 -0800)

Merge branch 'cw/doc-sign-off'

Doc update.

* cw/doc-sign-off:
doc: clarify distinction between sign-off and pgp-signing

Merge branch 'js/status-pre-rebase-i'Junio C Hamano Thu, 2 Feb 2017 21:36:54 +0000 (13:36 -0800)

Merge branch 'js/status-pre-rebase-i'

After starting "git rebase -i", which first opens the user's editor
to edit the series of patches to apply, but before saving the
contents of that file, "git status" failed to show the current
state (i.e. you are in an interactive rebase session, but you have
applied no steps yet) correctly.

* js/status-pre-rebase-i:
status: be prepared for not-yet-started interactive rebase

Merge branch 'js/retire-relink'Junio C Hamano Thu, 2 Feb 2017 21:36:54 +0000 (13:36 -0800)

Merge branch 'js/retire-relink'

Cruft removal.

* js/retire-relink:
relink: really remove the command
relink: retire the command

Merge branch 'sb/submodule-add-force'Junio C Hamano Thu, 2 Feb 2017 21:36:54 +0000 (13:36 -0800)

Merge branch 'sb/submodule-add-force'

"git submodule add" used to be confused and refused to add a
locally created repository; users can now use "--force" option
to add them.

* sb/submodule-add-force:
submodule add: extend force flag to add existing repos

Git 2.11.1 v2.11.1Junio C Hamano Thu, 2 Feb 2017 21:21:27 +0000 (13:21 -0800)

Git 2.11.1

Signed-off-by: Junio C Hamano <gitster@pobox.com>

Merge branch 'ws/request-pull-code-cleanup' into maintJunio C Hamano Thu, 2 Feb 2017 21:20:30 +0000 (13:20 -0800)

Merge branch 'ws/request-pull-code-cleanup' into maint

Code clean-up.

* ws/request-pull-code-cleanup:
request-pull: drop old USAGE stuff

Merge branch 'jk/execv-dashed-external' into maintJunio C Hamano Thu, 2 Feb 2017 21:20:29 +0000 (13:20 -0800)

Merge branch 'jk/execv-dashed-external' into maint

Typing ^C to pager, which usually does not kill it, killed Git and
took the pager down as a collateral damage in certain process-tree
structure. This has been fixed.

* jk/execv-dashed-external:
execv_dashed_external: wait for child on signal death
execv_dashed_external: stop exiting with negative code
execv_dashed_external: use child_process struct

document behavior of empty color nameJeff King Thu, 2 Feb 2017 12:42:44 +0000 (13:42 +0100)

document behavior of empty color name

Commit 55cccf4bb (color_parse_mem: allow empty color spec,
2017-02-01) clearly defined the behavior of an empty color
config variable. Let's document that, and give a hint about
why it might be useful.

It's important not to say that it makes the item uncolored,
because it doesn't. It just sets no attributes, which means
that any previous attributes continue to take effect.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

doc: add note about ignoring '--no-create-reflog'Cornelius Weig Wed, 1 Feb 2017 22:07:27 +0000 (23:07 +0100)

doc: add note about ignoring '--no-create-reflog'

The commands git-branch and git-tag accept the '--create-reflog'
option, and create reflog even when core.logallrefupdates
configuration is explicitly set not to.

On the other hand, the negated form '--no-create-reflog' is accepted
as a valid option but has no effect (other than overriding an
earlier '--create-reflog' on the command line). This silent noop may
puzzle users. To communicate that this is a known limitation, add a
short note in the manuals for git-branch and git-tag.

Signed-off-by: Cornelius Weig <cornelius.weig@tngtech.com>
Helped-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

completion: add completion for --recurse-submodules... Cornelius Weig Wed, 1 Feb 2017 23:07:53 +0000 (00:07 +0100)

completion: add completion for --recurse-submodules=only

Command completion for 'git-push --recurse-submodules' already knows to
complete some modes. However, the recently added mode 'only' is missing.

Adding 'only' to the recognized modes completes the list of non-trivial
modes.

Signed-off-by: Cornelius Weig <cornelius.weig@tngtech.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

doc: add doc for git-push --recurse-submodules=onlyCornelius Weig Wed, 1 Feb 2017 23:07:52 +0000 (00:07 +0100)

doc: add doc for git-push --recurse-submodules=only

Add documentation for the `--recurse-submodules=only` option of
git-push. The feature was added in commit 225e8bf (add option to
push only submodules).

Signed-off-by: Cornelius Weig <cornelius.weig@tngtech.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

attr: reformat git_attr_set_direction() functionBrandon Williams Sat, 28 Jan 2017 02:02:07 +0000 (18:02 -0800)

attr: reformat git_attr_set_direction() function

Move the 'git_attr_set_direction()' up to be closer to the variables
that it modifies as well as a small formatting by renaming the variable
'new' to 'new_direction' so that it is more descriptive.

Update the comment about how 'direction' is used to read the state of
the world. It should be noted that callers of
'git_attr_set_direction()' should ensure that other threads are not
making calls into the attribute system until after the call to
'git_attr_set_direction()' completes. This function essentially acts as
reset button for the attribute system and should be handled with care.

Signed-off-by: Brandon Williams <bmwill@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

attr: push the bare repo check into read_attr()Brandon Williams Sat, 28 Jan 2017 02:02:06 +0000 (18:02 -0800)

attr: push the bare repo check into read_attr()

Push the bare repository check into the 'read_attr()' function. This
avoids needing to have extra logic which creates an empty stack frame
when inside a bare repo as a similar bit of logic already exists in the
'read_attr()' function.

Signed-off-by: Brandon Williams <bmwill@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

attr: store attribute stack in attr_check structureBrandon Williams Sat, 28 Jan 2017 02:02:05 +0000 (18:02 -0800)

attr: store attribute stack in attr_check structure

The last big hurdle towards a thread-safe API for the attribute system
is the reliance on a global attribute stack that is modified during each
call into the attribute system.

This patch removes this global stack and instead a stack is stored
locally in each attr_check instance. This opens up the opportunity for
future optimizations to customize the attribute stack for the attributes
that a particular attr_check struct is interested in.

One caveat with pushing the attribute stack into the attr_check
structure is that the attribute system now needs to keep track of all
active attr_check instances. Due to the direction mechanism the stack
needs to be dropped when the direction is switched. In order to ensure
correctness when the direction is changed the attribute system needs to
iterate through all active attr_check instances and drop each of their
stacks.

Signed-off-by: Brandon Williams <bmwill@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

attr: tighten const correctness with git_attr and match... Brandon Williams Sat, 28 Jan 2017 02:02:04 +0000 (18:02 -0800)

attr: tighten const correctness with git_attr and match_attr

Signed-off-by: Brandon Williams <bmwill@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

attr: remove maybe-real, maybe-macro from git_attrBrandon Williams Sat, 28 Jan 2017 02:02:03 +0000 (18:02 -0800)

attr: remove maybe-real, maybe-macro from git_attr

Whether or not a git attribute is real or a macro isn't a property of
the attribute but rather it depends on the attribute stack (which
.gitattribute files were read).

This patch removes the 'maybe_real' and 'maybe_macro' fields in a
git_attr and instead adds the 'macro' field to a attr_check_item. The
'macro' indicates (if non-NULL) that a particular attribute is a macro
for the given attribute stack. It's populated, through a quick scan of
the attribute stack, with the match_attr that corresponds to the macro's
definition. This way the attribute stack only needs to be scanned a
single time prior to attribute collection instead of each time a macro
needs to be expanded.

Signed-off-by: Brandon Williams <bmwill@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

attr: eliminate global check_all_attr arrayBrandon Williams Sat, 28 Jan 2017 02:02:02 +0000 (18:02 -0800)

attr: eliminate global check_all_attr array

Currently there is a reliance on 'check_all_attr' which is a global
array of 'attr_check_item' items which is used to store the value of
each attribute during the collection process.

This patch eliminates this global and instead creates an array per
'attr_check' instance which is then used in the attribute collection
process. This brings the attribute system one step closer to being
thread-safe.

Signed-off-by: Brandon Williams <bmwill@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

attr: use hashmap for attribute dictionaryBrandon Williams Sat, 28 Jan 2017 02:02:01 +0000 (18:02 -0800)

attr: use hashmap for attribute dictionary

The current implementation of the attribute dictionary uses a custom
hashtable. This modernizes the dictionary by converting it to the builtin
'hashmap' structure.

Also, in order to enable a threaded API in the future add an
accompanying mutex which must be acquired prior to accessing the
dictionary of interned attributes.

Signed-off-by: Brandon Williams <bmwill@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

attr: change validity check for attribute names to... Junio C Hamano Sat, 28 Jan 2017 02:02:00 +0000 (18:02 -0800)

attr: change validity check for attribute names to use positive logic

Convert 'invalid_attr_name()' to 'attr_name_valid()' and use positive
logic for the return value. In addition create a helper function that
prints out an error message when an invalid attribute name is used.

We could later update the message to exactly spell out what the
rules for a good attribute name are, etc.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Stefan Beller <sbeller@google.com>
Signed-off-by: Brandon Williams <bmwill@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

attr: pass struct attr_check to collect_some_attrsBrandon Williams Sat, 28 Jan 2017 02:01:59 +0000 (18:01 -0800)

attr: pass struct attr_check to collect_some_attrs

The old callchain used to take an array of attr_check_item items.
Instead pass the 'attr_check' container object to 'collect_some_attrs()'
and access the fields in the data structure directly.

Signed-off-by: Brandon Williams <bmwill@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

attr: retire git_check_attrs() APIJunio C Hamano Sat, 28 Jan 2017 02:01:58 +0000 (18:01 -0800)

attr: retire git_check_attrs() API

Since nobody uses the old API, make it file-scope static, and update
the documentation to describe the new API.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Stefan Beller <sbeller@google.com>
Signed-off-by: Brandon Williams <bmwill@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

attr: convert git_check_attrs() callers to use the... Junio C Hamano Sat, 28 Jan 2017 02:01:57 +0000 (18:01 -0800)

attr: convert git_check_attrs() callers to use the new API

The remaining callers are all simple "I have N attributes I am
interested in. I'll ask about them with various paths one by one".

After this step, no caller to git_check_attrs() remains. After
removing it, we can extend "struct attr_check" struct with data
that can be used in optimizing the query for the specific N
attributes it contains.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Stefan Beller <sbeller@google.com>
Signed-off-by: Brandon Williams <bmwill@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

attr: convert git_all_attrs() to use "struct attr_check"Junio C Hamano Mon, 30 Jan 2017 18:06:08 +0000 (10:06 -0800)

attr: convert git_all_attrs() to use "struct attr_check"

This updates the other two ways the attribute check is done via an
array of "struct attr_check_item" elements. These two niches
appear only in "git check-attr".

* The caller does not know offhand what attributes it wants to ask
about and cannot use attr_check_initl() to prepare the
attr_check structure.

* The caller may not know what attributes it wants to ask at all,
and instead wants to learn everything that the given path has.

Such a caller can call attr_check_alloc() to allocate an empty
attr_check, and then call attr_check_append() to add attribute names
one by one.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Stefan Beller <sbeller@google.com>
Signed-off-by: Brandon Williams <bmwill@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

attr: (re)introduce git_check_attr() and struct attr_checkJunio C Hamano Mon, 30 Jan 2017 18:05:20 +0000 (10:05 -0800)

attr: (re)introduce git_check_attr() and struct attr_check

A common pattern to check N attributes for many paths is to

(1) prepare an array A of N attr_check_item items;
(2) call git_attr() to intern the N attribute names and fill A;
(3) repeatedly call git_check_attrs() for path with N and A;

A look-up for these N attributes for a single path P scans the
entire attr_stack, starting from the .git/info/attributes file and
then .gitattributes file in the directory the path P is in, going
upwards to find .gitattributes file found in parent directories.

An earlier commit 06a604e6 (attr: avoid heavy work when we know the
specified attr is not defined, 2014-12-28) tried to optimize out
this scanning for one trivial special case: when the attribute being
sought is known not to exist, we do not have to scan for it. While
this may be a cheap and effective heuristic, it would not work well
when N is (much) more than 1.

What we would want is a more customized way to skip irrelevant
entries in the attribute stack, and the definition of irrelevance
is tied to the set of attributes passed to git_check_attrs() call,
i.e. the set of attributes being sought. The data necessary for
this optimization needs to live alongside the set of attributes, but
a simple array of git_attr_check_elem simply does not have any place
for that.

Introduce "struct attr_check" that contains N, the number of
attributes being sought, and A, the array that holds N
attr_check_item items, and a function git_check_attr() that
takes a path P and this structure as its parameters. This structure
can later be extended to hold extra data necessary for optimization.

Also, to make it easier to write the first two steps in common
cases, introduce git_attr_check_initl() helper function, which takes
a NULL-terminated list of attribute names and initialize this
structure.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Stefan Beller <sbeller@google.com>
Signed-off-by: Brandon Williams <bmwill@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

attr: rename function and struct related to checking... Junio C Hamano Sat, 28 Jan 2017 02:01:54 +0000 (18:01 -0800)

attr: rename function and struct related to checking attributes

The traditional API to check attributes is to prepare an N-element
array of "struct git_attr_check" and pass N and the array to the
function "git_check_attr()" as arguments.

In preparation to revamp the API to pass a single structure, in
which these N elements are held, rename the type used for these
individual array elements to "struct attr_check_item" and rename
the function to "git_check_attrs()".

Signed-off-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Stefan Beller <sbeller@google.com>
Signed-off-by: Brandon Williams <bmwill@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

attr.c: outline the future plans by heavily commentingJunio C Hamano Sat, 28 Jan 2017 02:01:53 +0000 (18:01 -0800)

attr.c: outline the future plans by heavily commenting

Signed-off-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Stefan Beller <sbeller@google.com>
Signed-off-by: Brandon Williams <bmwill@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

Documentation: fix a typoStefan Beller Sat, 28 Jan 2017 02:01:52 +0000 (18:01 -0800)

Documentation: fix a typo

Signed-off-by: Stefan Beller <sbeller@google.com>
Signed-off-by: Brandon Williams <bmwill@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

attr.c: add push_stack() helperJunio C Hamano Sat, 28 Jan 2017 02:01:51 +0000 (18:01 -0800)

attr.c: add push_stack() helper

There are too many repetitious "I have this new attr_stack element;
push it at the top of the stack" sequence. The new helper function
push_stack() gives us a way to express what is going on at these
places, and as a side effect, halves the number of times we mention
the attr_stack global variable.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Stefan Beller <sbeller@google.com>
Signed-off-by: Brandon Williams <bmwill@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

attr: support quoting pathname patterns in C styleNguyễn Thái Ngọc Duy Sat, 28 Jan 2017 02:01:50 +0000 (18:01 -0800)

attr: support quoting pathname patterns in C style

Full pattern must be quoted. So 'pat"t"ern attr' will give exactly
'pat"t"ern', not 'pattern'. Also clarify that leading whitespaces are
not part of the pattern and document comment syntax.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Stefan Beller <sbeller@google.com>
Signed-off-by: Brandon Williams <bmwill@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

attr.c: plug small leak in parse_attr_line()Junio C Hamano Sat, 28 Jan 2017 02:01:49 +0000 (18:01 -0800)

attr.c: plug small leak in parse_attr_line()

If any error is noticed after the match_attr structure is allocated,
we shouldn't just return NULL from this function.

Add a fail_return label that frees the allocated structure and
returns NULL, and consistently jump there when we want to return
NULL after cleaning up.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Stefan Beller <sbeller@google.com>
Signed-off-by: Brandon Williams <bmwill@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

attr.c: tighten constness around "git_attr" structureJunio C Hamano Sat, 28 Jan 2017 02:01:48 +0000 (18:01 -0800)

attr.c: tighten constness around "git_attr" structure

It holds an interned string, and git_attr_name() is a way to peek
into it. Make sure the involved pointer types are pointer-to-const.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Stefan Beller <sbeller@google.com>
Signed-off-by: Brandon Williams <bmwill@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

attr.c: simplify macroexpand_one()Junio C Hamano Sat, 28 Jan 2017 02:01:47 +0000 (18:01 -0800)

attr.c: simplify macroexpand_one()

The double-loop wants to do an early return immediately when one
matching macro is found. Eliminate the extra variable 'a' used for
that purpose and rewrite the "assign the found item to 'a' to make
it non-NULL and force the loop(s) to terminate" with a direct return
from there.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Stefan Beller <sbeller@google.com>
Signed-off-by: Brandon Williams <bmwill@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

attr.c: mark where #if DEBUG ends more clearlyJunio C Hamano Sat, 28 Jan 2017 02:01:46 +0000 (18:01 -0800)

attr.c: mark where #if DEBUG ends more clearly

Signed-off-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Stefan Beller <sbeller@google.com>
Signed-off-by: Brandon Williams <bmwill@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

attr.c: complete a sentence in a commentJunio C Hamano Sat, 28 Jan 2017 02:01:45 +0000 (18:01 -0800)

attr.c: complete a sentence in a comment

Signed-off-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Stefan Beller <sbeller@google.com>
Signed-off-by: Brandon Williams <bmwill@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

attr.c: explain the lack of attr-name syntax check... Junio C Hamano Sat, 28 Jan 2017 02:01:44 +0000 (18:01 -0800)

attr.c: explain the lack of attr-name syntax check in parse_attr()

Signed-off-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Stefan Beller <sbeller@google.com>
Signed-off-by: Brandon Williams <bmwill@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

attr.c: update a stale comment on "struct match_attr"Junio C Hamano Sat, 28 Jan 2017 02:01:43 +0000 (18:01 -0800)

attr.c: update a stale comment on "struct match_attr"

When 82dce998 (attr: more matching optimizations from .gitignore,
2012-10-15) changed a pointer to a string "*pattern" into an
embedded "struct pattern" in struct match_attr, it forgot to update
the comment that describes the structure.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Stefan Beller <sbeller@google.com>
Signed-off-by: Brandon Williams <bmwill@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

attr.c: use strchrnul() to scan for one lineJunio C Hamano Sat, 28 Jan 2017 02:01:42 +0000 (18:01 -0800)

attr.c: use strchrnul() to scan for one line

Signed-off-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Stefan Beller <sbeller@google.com>
Signed-off-by: Brandon Williams <bmwill@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

commit.c: use strchrnul() to scan for one lineJunio C Hamano Sat, 28 Jan 2017 02:01:41 +0000 (18:01 -0800)

commit.c: use strchrnul() to scan for one line

Signed-off-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Stefan Beller <sbeller@google.com>
Signed-off-by: Brandon Williams <bmwill@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

urlmatch: allow globbing for the URL host partPatrick Steinhardt Tue, 31 Jan 2017 09:01:47 +0000 (10:01 +0100)

urlmatch: allow globbing for the URL host part

The URL matching function computes for two URLs whether they match not.
The match is performed by splitting up the URL into different parts and
then doing an exact comparison with the to-be-matched URL.

The main user of `urlmatch` is the configuration subsystem. It allows to
set certain configurations based on the URL which is being connected to
via keys like `http.<url>.*`. A common use case for this is to set
proxies for only some remotes which match the given URL. Unfortunately,
having exact matches for all parts of the URL can become quite tedious
in some setups. Imagine for example a corporate network where there are
dozens or even hundreds of subdomains, which would have to be configured
individually.

Allow users to write an asterisk '*' in place of any 'host' or
'subdomain' label as part of the host name. For example,
"http.https://*.example.com.proxy" sets "http.proxy" for all direct
subdomains of "https://example.com", e.g. "https://foo.example.com", but
not "https://foo.bar.example.com".

Signed-off-by: Patrick Steinhardt <patrick.steinhardt@elego.de>
Helped-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

urlmatch: include host in urlmatch rankingPatrick Steinhardt Tue, 31 Jan 2017 09:01:46 +0000 (10:01 +0100)

urlmatch: include host in urlmatch ranking

In order to be able to rank positive matches by `urlmatch`, we inspect
the path length and user part to decide whether a match is better than
another match. As all other parts are matched exactly between both URLs,
this is the correct thing to do right now.

In the future, though, we want to introduce wild cards for the domain
part. When doing this, it does not make sense anymore to only compare
the path lengths. Instead, we also want to compare the domain lengths to
determine which of both URLs matches the host part more closely.

Signed-off-by: Patrick Steinhardt <patrick.steinhardt@elego.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

connect: Add the envvar GIT_SSH_VARIANT and ssh.variant... Segev Finer Wed, 1 Feb 2017 12:01:16 +0000 (13:01 +0100)

connect: Add the envvar GIT_SSH_VARIANT and ssh.variant config

This environment variable and configuration value allow to
override the autodetection of plink/tortoiseplink in case that
Git gets it wrong.

[jes: wrapped overly-long lines, factored out and changed
get_ssh_variant() to handle_ssh_variant() to accomodate the
change from the putty/tortoiseplink variables to
port_option/needs_batch, adjusted the documentation, free()d
value obtained from the config.]

Signed-off-by: Segev Finer <segev208@gmail.com>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

git_connect(): factor out SSH variant handlingJohannes Schindelin Wed, 1 Feb 2017 12:01:10 +0000 (13:01 +0100)

git_connect(): factor out SSH variant handling

We handle plink and tortoiseplink as OpenSSH replacements, by passing
the correct command-line options when detecting that they are used.

To let users override that auto-detection (in case Git gets it wrong),
we need to introduce new code to that end.

In preparation for this code, let's factor out the SSH variant handling
into its own function, handle_ssh_variant().

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

color_parse_mem: allow empty color specJeff King Wed, 1 Feb 2017 00:21:29 +0000 (01:21 +0100)

color_parse_mem: allow empty color spec

Prior to c2f41bf52 (color.c: fix color_parse_mem() with
value_len == 0, 2017-01-19), the empty string was
interpreted as a color "reset". This was an accidental
outcome, and that commit turned it into an error.

However, scripts may pass the empty string as a default
value to "git config --get-color" to disable color when the
value is not defined. The git-add--interactive script does
this. As a result, the script is unusable since c2f41bf52
unless you have color.diff.plain defined (if it is defined,
then we don't parse the empty default at all).

Our test scripts didn't notice the recent breakage because
they run without a terminal, and thus without color. They
never hit this code path at all. And nobody noticed the
original buggy "reset" behavior, because it was effectively
a noop.

Let's fix the code to have an empty color name produce an
empty sequence of color codes. The tests need a few fixups:

- we'll add a new test in t4026 to cover this case. But
note that we need to tweak the color() helper. While
we're there, let's factor out the literal ANSI ESC
character. Otherwise it makes the diff quite hard to
read.

- we'll add a basic sanity-check in t4026 that "git add
-p" works at all when color is enabled. That would have
caught this bug, as well as any others that are specific
to the color code paths.

- 73c727d69 (log --graph: customize the graph lines with
config log.graphColors, 2017-01-19) added a test to
t4202 that checks some "invalid" graph color config.
Since ",, blue" before yielded only "blue" as valid, and
now yields "empty, empty, blue", we don't match the
expected output.

One way to fix this would be to change the expectation
to the empty color strings. But that makes the test much
less interesting, since we show only two graph lines,
both of which would be colorless.

Since the empty-string case is now covered by t4026,
let's remove them entirely here. They're just in the way
of the primary thing the test is supposed to be
checking.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

.mailmap: update Gábor Szeder's email addressSZEDER Gábor Tue, 31 Jan 2017 18:42:12 +0000 (19:42 +0100)

.mailmap: update Gábor Szeder's email address

Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

Sync with maintJunio C Hamano Tue, 31 Jan 2017 21:34:59 +0000 (13:34 -0800)

Sync with maint

* maint:
Ready for 2.11.1

Ready for 2.11.1Junio C Hamano Tue, 31 Jan 2017 21:34:48 +0000 (13:34 -0800)

Ready for 2.11.1

Signed-off-by: Junio C Hamano <gitster@pobox.com>

Merge branch 'sb/in-core-index-doc' into maintJunio C Hamano Tue, 31 Jan 2017 21:32:11 +0000 (13:32 -0800)

Merge branch 'sb/in-core-index-doc' into maint

Documentation and in-code comments updates.

* sb/in-core-index-doc:
documentation: retire unfinished documentation
cache.h: document add_[file_]to_index
cache.h: document remove_index_entry_at
cache.h: document index_name_pos

Merge branch 'js/mingw-isatty' into maintJunio C Hamano Tue, 31 Jan 2017 21:32:11 +0000 (13:32 -0800)

Merge branch 'js/mingw-isatty' into maint

An update to a topic that is already in 'master'.

* js/mingw-isatty:
mingw: follow-up to "replace isatty() hack"

Merge branch 'jk/coding-guidelines-update' into maintJunio C Hamano Tue, 31 Jan 2017 21:32:11 +0000 (13:32 -0800)

Merge branch 'jk/coding-guidelines-update' into maint

Developer doc update.

* jk/coding-guidelines-update:
CodingGuidelines: clarify multi-line brace style