Commit Graph

87501 Commits

Author SHA1 Message Date
Johannes Schindelin
2329bbffff Merge 'fscache' into HEAD 2018-08-28 16:13:26 -04:00
Johannes Schindelin
be3247579f Merge branch 'perl5lib'
With this topic branch, the PERL5LIB variable is unset to avoid external
settings from interfering with Git's own Perl interpreter.

This branch also cleans up some of our Windows-only config setting code
(and this will need to be rearranged in the next merging rebase so that
the cleanup comes first, and fscache and longPaths support build on
top).

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-08-28 16:13:25 -04:00
Karsten Blees
01c2eeb39f fscache: load directories only once
If multiple threads access a directory that is not yet in the cache, the
directory will be loaded by each thread. Only one of the results is added
to the cache, all others are leaked. This wastes performance and memory.

On cache miss, add a future object to the cache to indicate that the
directory is currently being loaded. Subsequent threads register themselves
with the future object and wait. When the first thread has loaded the
directory, it replaces the future object with the result and notifies
waiting threads.

Signed-off-by: Karsten Blees <blees@dcon.de>
2018-08-28 16:11:56 -04:00
Karsten Blees
560484ac8c Win32: add a cache below mingw's lstat and dirent implementations
Checking the work tree status is quite slow on Windows, due to slow lstat
emulation (git calls lstat once for each file in the index). Windows
operating system APIs seem to be much better at scanning the status
of entire directories than checking single files.

Add an lstat implementation that uses a cache for lstat data. Cache misses
read the entire parent directory and add it to the cache. Subsequent lstat
calls for the same directory are served directly from the cache.

Also implement opendir / readdir / closedir so that they create and use
directory listings in the cache.

The cache doesn't track file system changes and doesn't plug into any
modifying file APIs, so it has to be explicitly enabled for git functions
that don't modify the working copy.

Note: in an earlier version of this patch, the cache was always active and
tracked file system changes via ReadDirectoryChangesW. However, this was
much more complex and had negative impact on the performance of modifying
git commands such as 'git checkout'.

Signed-off-by: Karsten Blees <blees@dcon.de>
2018-08-28 16:11:56 -04:00
Karsten Blees
cb84cc4ff3 add infrastructure for read-only file system level caches
Add a macro to mark code sections that only read from the file system,
along with a config option and documentation.

This facilitates implementation of relatively simple file system level
caches without the need to synchronize with the file system.

Enable read-only sections for 'git status' and preload_index.

Signed-off-by: Karsten Blees <blees@dcon.de>
2018-08-28 16:11:56 -04:00
Karsten Blees
2210c1227b Win32: make the lstat implementation pluggable
Emulating the POSIX lstat API on Windows via GetFileAttributes[Ex] is quite
slow. Windows operating system APIs seem to be much better at scanning the
status of entire directories than checking single files. A caching
implementation may improve performance by bulk-reading entire directories
or reusing data obtained via opendir / readdir.

Make the lstat implementation pluggable so that it can be switched at
runtime, e.g. based on a config option.

Signed-off-by: Karsten Blees <blees@dcon.de>
2018-08-28 16:11:56 -04:00
Karsten Blees
66167b0956 Win32: Make the dirent implementation pluggable
Emulating the POSIX dirent API on Windows via FindFirstFile/FindNextFile is
pretty staightforward, however, most of the information provided in the
WIN32_FIND_DATA structure is thrown away in the process. A more
sophisticated implementation may cache this data, e.g. for later reuse in
calls to lstat.

Make the dirent implementation pluggable so that it can be switched at
runtime, e.g. based on a config option.

Define a base DIR structure with pointers to readdir/closedir that match
the opendir implementation (i.e. similar to vtable pointers in OOP).
Define readdir/closedir so that they call the function pointers in the DIR
structure. This allows to choose the opendir implementation on a
call-by-call basis.

Move the fixed sized dirent.d_name buffer to the dirent-specific DIR
structure, as d_name may be implementation specific (e.g. a caching
implementation may just set d_name to point into the cache instead of
copying the entire file name string).

Signed-off-by: Karsten Blees <blees@dcon.de>
2018-08-28 16:11:56 -04:00
Karsten Blees
08cbeacd24 Win32: dirent.c: Move opendir down
Move opendir down in preparation for the next patch.

Signed-off-by: Karsten Blees <blees@dcon.de>
2018-08-28 16:11:56 -04:00
Johannes Schindelin
48db023053 mingw: unset PERL5LIB by default
Git for Windows ships with its own Perl interpreter, and insists on
using it, so it will most likely wreak havoc if PERL5LIB is set before
launching Git.

Let's just unset that environment variables when spawning processes.

To make this feature extensible (and overrideable), there is a new
config setting `core.unsetenvvars` that allows specifying a
comma-separated list of names to unset before spawning processes.

Reported by Gabriel Fuhrmann.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-08-28 16:11:55 -04:00
Karsten Blees
d247d8bbde Win32: make FILETIME conversion functions public
Signed-off-by: Karsten Blees <blees@dcon.de>
2018-08-28 16:11:55 -04:00
Johannes Schindelin
deb7efbf60 Move Windows-specific config settings into compat/mingw.c
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-08-28 16:11:55 -04:00
Johannes Schindelin
4b61741114 Allow for platform-specific core.* config settings
In the Git for Windows project, we have ample precendent for config
settings that apply to Windows, and to Windows only.

Let's formalize this concept by introducing a platform_core_config()
function that can be #define'd in a platform-specific manner.

This will allow us to contain platform-specific code better, as the
corresponding variables no longer need to be exported so that they can
be defined in environment.c and be set in config.c

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-08-28 16:11:55 -04:00
Johannes Schindelin
876ac8df0f config: rename dummy parameter to cb in git_default_config()
This is the convention elsewhere (and prepares for the case where we may
need to pass callback data).

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-08-28 16:11:55 -04:00
Jameson Miller
aced5c7e91 Start the merging-rebase to v2.19.0-rc1
This commit starts the rebase of 6cd8528f14 to 8f717d7af4
2018-08-28 16:11:52 -04:00
Junio C Hamano
2f74393334 Git 2.19-rc1
Signed-off-by: Junio C Hamano <gitster@pobox.com>
v2.19.0-rc1
2018-08-28 12:01:01 -07:00
Junio C Hamano
b9dfa238d5 Getting ready for -rc1
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2018-08-27 14:34:54 -07:00
Junio C Hamano
8edb1b36b8 Merge branch 'ja/i18n-message-fixes'
Messages fix.

* ja/i18n-message-fixes:
  i18n: fix mistakes in translated strings
2018-08-27 14:33:52 -07:00
Junio C Hamano
aa5dc61161 Merge branch 'ds/commit-graph-fsck'
Finishing touches to doc.

* ds/commit-graph-fsck:
  config: fix commit-graph related config docs
2018-08-27 14:33:51 -07:00
Junio C Hamano
6201d755b9 Merge branch 'js/range-diff'
Finishing touched to help string.

* js/range-diff:
  range-diff: update stale summary of --no-dual-color
2018-08-27 14:33:51 -07:00
Junio C Hamano
926107db6d Merge branch 'sg/test-rebase-editor-fix'
Test fix.

* sg/test-rebase-editor-fix:
  t/lib-rebase.sh: support explicit 'pick' commands in 'fake_editor.sh'
2018-08-27 14:33:50 -07:00
Junio C Hamano
86ef236c98 Merge branch 'jk/hashcmp-optim-for-2.19'
Partially revert the support for multiple hash functions to regain
hash comparison performance; we'd think of a way to do this better
in the next cycle.

* jk/hashcmp-optim-for-2.19:
  hashcmp: assert constant hash size
2018-08-27 14:33:50 -07:00
Junio C Hamano
99fb11d15b Merge branch 'ab/test-must-be-empty-for-master'
Test fixes.

* ab/test-must-be-empty-for-master:
  t6018-rev-list-glob: fix 'empty stdin' test
2018-08-27 14:33:49 -07:00
Junio C Hamano
56ce87daff Merge branch 'sg/t3420-autostash-fix'
Test fixes.

* sg/t3420-autostash-fix:
  t3420-rebase-autostash: don't try to grep non-existing files
2018-08-27 14:33:49 -07:00
Junio C Hamano
5f0ed3e204 Merge branch 'sg/t3903-missing-fix'
Test fixes.

* sg/t3903-missing-fix:
  t3903-stash: don't try to grep non-existing file
2018-08-27 14:33:48 -07:00
Junio C Hamano
1d27164f1a Merge branch 'sg/t7501-thinkofix'
Test fixes.

* sg/t7501-thinkofix:
  t7501-commit: drop silly command substitution
2018-08-27 14:33:48 -07:00
Junio C Hamano
df19317f4f Merge branch 'sg/t0020-conversion-fix'
Test fixes.

* sg/t0020-conversion-fix:
  t0020-crlf: check the right file
2018-08-27 14:33:47 -07:00
Junio C Hamano
603160b17e Merge branch 'sg/t4051-fix'
Test fixes.

* sg/t4051-fix:
  t4051-diff-function-context: read the right file
2018-08-27 14:33:45 -07:00
Junio C Hamano
1392c5d289 Merge branch 'js/larger-timestamps'
Portability fix.

* js/larger-timestamps:
  commit: use timestamp_t for author_date_slab
2018-08-27 14:33:44 -07:00
Junio C Hamano
6d9276ea13 Merge branch 'jk/use-compat-util-in-test-tool'
Dev tool update.

* jk/use-compat-util-in-test-tool:
  test-tool.h: include git-compat-util.h
2018-08-27 14:33:43 -07:00
Junio C Hamano
986c518107 Merge branch 'sg/test-must-be-empty'
Test fixes.

* sg/test-must-be-empty:
  tests: use 'test_must_be_empty' instead of 'test_cmp <empty> <out>'
  tests: use 'test_must_be_empty' instead of 'test_cmp /dev/null <out>'
  tests: use 'test_must_be_empty' instead of 'test ! -s'
  tests: use 'test_must_be_empty' instead of '! test -s'
2018-08-27 14:33:43 -07:00
Junio C Hamano
fc0df933c8 Merge branch 'rs/opt-updates'
"git cmd -h" updates.

* rs/opt-updates:
  parseopt: group literal string alternatives in argument help
  remote: improve argument help for add --mirror
  checkout-index: improve argument help for --stage
2018-08-27 14:33:43 -07:00
Junio C Hamano
6e96e88ae4 Merge branch 'nd/complete-config-vars'
"git help --config" (which is used in command line completion)
missed the configuration variables not described in the main
config.txt file but are described in another file that is included
by it, which has been corrected.

* nd/complete-config-vars:
  generate-cmdlist.sh: collect config from all config.txt files
2018-08-27 14:33:42 -07:00
Junio C Hamano
7ae96e3fcf Merge branch 'ab/unconditional-free-and-null'
Code clean-up.

* ab/unconditional-free-and-null:
  refactor various if (x) FREE_AND_NULL(x) to just FREE_AND_NULL(x)
2018-08-27 14:33:42 -07:00
Junio C Hamano
a988ce9a58 Merge branch 'ep/worktree-quiet-option'
"git worktree" command learned "--quiet" option to make it less
verbose.

* ep/worktree-quiet-option:
  worktree: add --quiet option
2018-08-27 14:33:42 -07:00
Junio C Hamano
d89db6f4c3 Merge branch 'sm/branch-sort-config'
"git branch --list" learned to take the default sort order from the
'branch.sort' configuration variable, just like "git tag --list"
pays attention to 'tag.sort'.

* sm/branch-sort-config:
  branch: support configuring --sort via .gitconfig
2018-08-27 14:33:42 -07:00
Junio C Hamano
9b73732577 Merge branch 'nd/config-core-checkstat-doc'
The meaning of the possible values the "core.checkStat"
configuration variable can take were not adequately documented,
which has been fixed.

* nd/config-core-checkstat-doc:
  config.txt: clarify core.checkStat
2018-08-27 14:33:42 -07:00
Kyle Meyer
72f47be2db range-diff: update stale summary of --no-dual-color
275267937b (range-diff: make dual-color the default mode, 2018-08-13)
replaced --dual-color with --no-dual-color but left the option's
summary untouched.  Rewrite the summary to describe --no-dual-color
rather than dual-color.

Helped-by: Jonathan Nieder <jrnieder@gmail.com>
Helped-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
Signed-off-by: Kyle Meyer <kyle@kyleam.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2018-08-27 13:13:59 -07:00
Johannes Schindelin
2296f76716 fixup! http: when using Secure Channel, ignore sslCAInfo by default 2018-08-27 16:48:01 +02:00
Johannes Schindelin
96973545d3 Merge branch 'make-builtin-stash-and-rebase-opt-ins'
This branch adds back the scripted versions, then adds the option to
use the builtin versions of `stash` and `rebase` by setting
`stash.useBuiltin=true` and `rebase.useBuiltin=true`, respectively,
(the latter already worked for the top-level `git rebase` command and
the `--am` backend, and now it also works for the interactive backend).

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-08-24 18:29:41 +02:00
Johannes Schindelin
39ad697980 Merge branch 'fixups'
A couple of fixes that should be squashed during the next merging
rebase of Git for Windows.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-08-24 18:29:41 +02:00
Johannes Schindelin
64731004fe fixup! Unbreak interactive GPG prompt upon signing 2018-08-24 18:29:40 +02:00
Johannes Schindelin
5a39315a80 "fixup! builtin rebase: support keep-empty option"
This *would* be a fixup commit, except that we want to avoid rewriting
commits that we merged from upstream's `pu` branch. Instead, we want to
send a new iteration, and then re-merge the new iteration once it made
it into the `pu` branch.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-08-24 18:28:16 +02:00
Johannes Schindelin
3ff59a431c stash/rebase: default to the non-builtin versions
The upcoming Git for Windows v2.19.0 wants to ship with the builtin
versions of stash, rebase and rebase -i. The reason: these are just *so
much faster*: t3400 and t3404 run about 60-70 percent faster, and t3903
even more than 80% faster.

However, these are still all pretty fresh, still being reviewed and
iterated on the Git mailing list.

So let's try to give users a way to test these (or to boldly use them
for their mission-critical tasks, as this here developer plans on
doing), but stay with the safe option by default: use the scripted
versions (which might be slow, but they are well tested).

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-08-24 17:56:38 +02:00
Johannes Schindelin
9df5cbfbf0 stash: optionally use the scripted version again
We recently converted the `git stash` command from Unix shell scripts
to builtins.

Just like we have `rebase.useBuiltin` to fall back to the scripted
rebase, to give end users a way out when they discover a bug in the
builtin command, this commit adds support for `stash.useBuiltin`.

This is necessary because Git for Windows wants to ship the builtin
stash earlier than core Git: Git for Windows v2.19.0 will come with
the option of a drastically faster (if a lot less battle-tested)
`git stash`.

As the file name `git-stash` is already in use, let's rename the
scripted backend to `git-legacy-stash`.

To make the test suite pass with `stash.useBuiltin=false`, this commit
also backports rudimentary support for `-q` (but only *just* enough
to appease the test suite), and adds a super-ugly hack to force exit
code 129 for `git stash -h`.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-08-24 17:56:38 +02:00
Johannes Schindelin
971100dbcb Add back the original, scripted git stash
This simply copies the version as of v2.19.0-rc0 verbatim. As of now,
it is not hooked up.

The next commit will change the builtin `stash` to hand off to the
scripted `git stash` when `stash.useBuiltin=false`.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-08-24 17:56:38 +02:00
Doug Kelly
cdb55fe660 squash! Add a test demonstrating a problem with long submodule paths
Add a test demonstrating a problem with long submodule paths

[jes: adusted test number to avoid conflicts, fixed non-portable use of
the 'export' statement, fixed broken && chain]

Signed-off-by: Doug Kelly <dougk.ff7@gmail.com>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-08-24 16:30:55 +02:00
Johannes Schindelin
cd8ca447b1 non-builtin rebase: use non-builtin interactive backend
We recently converted both the `git rebase` and the `git rebase -i`
command from Unix shell scripts to builtins.

The former has a safety valve allowing to fall back to the scripted
`rebase`, just in case that there is a bug in the builtin `rebase`:
setting the config variable `rebase.useBuiltin` to `false` will
fall back to using the scripted version.

The latter did not have such a safety hatch.

Let's reinstate the scripted interactive rebase backend so that `rebase.useBuiltin=false` will not use the builtin interactive rebase,
just in case that an end user runs into a bug with the builtin version
and needs to get out of the fix really quickly.

This is necessary because Git for Windows wants to ship the builtin
rebase/interactive rebase earlier than core Git: Git for Windows
v2.19.0 will come with the option of a drastically faster (if a lot
less battle-tested) `git rebase`/`git rebase -i`.

As the file name `git-rebase--interactive` is already in use, let's
rename the scripted backend to `git-legacy-rebase--interactive`.

A couple of additional touch-ups are needed (such as teaching the
builtin `rebase--interactive`, which assumed the role of the
`rebase--helper`, to perform the two tricks to skip the unnecessary
picks and to generate a new todo list) to make things work again.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-08-24 15:17:21 +02:00
Johannes Schindelin
916a7eb4ef Add back the original, scripted interactive rebase backend
This simply copies the version as of v2.19.0-rc0 verbatim. As of now,
it is not hooked up (because it needs a couple more changes to work);
The next commit will use the scripted interactive rebase backend from
`git rebase` again when `rebase.useBuiltin=false`.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-08-24 15:14:04 +02:00
Jean-Noël Avila
27c929edd6 i18n: fix mistakes in translated strings
Fix typos and convert a question which does not expect to be replied
to a simple advice.

Signed-off-by: Jean-Noël Avila <jn.avila@free.fr>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2018-08-23 14:29:12 -07:00
Johannes Schindelin
01a1db34ff Merge 'builtin-rebase--am'
This patch teaches the builtin rebase to avoid the scripted --am backend
and call `git format-patch` and `git am` directly.

Meaning: apart from the --merge and the --preserve-merges backends, `git
rebase` is now implemented in pure C, with no need to ask the Unix shell
interpreter for help.

This brings us really close to a fully builtin `git rebase`: the
--preserve-merges mode is about to be deprecated (as soon as the
--rebase-merges mode has proven stable and robust enough), and there are
plans to scrap the `git-rebase--merge` backend in favor of teaching the
interactive rebase enough tricks to run the --merge mode, too.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-08-23 22:24:55 +02:00