Commit Graph

90043 Commits

Author SHA1 Message Date
Alban Gruin
33ae4e062b rebase -i: rewrite write_basic_state() in C
This rewrites write_basic_state() from git-rebase.sh in C.  This is the
first step in the conversion of init_basic_state(), hence the mode in
rebase--helper.c is called INIT_BASIC_STATE.  init_basic_state() will be
converted in the next commit.

The part of read_strategy_opts() that parses the stategy options is
moved to a new function to allow its use in rebase--helper.c.

Finally, the call to write_basic_state() is removed from
git-rebase--interactive.sh, replaced by a call to `--init-basic-state`.

Signed-off-by: Alban Gruin <alban.gruin@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2018-11-19 14:38:20 +01:00
Alban Gruin
9b0bee567b rebase -i: rewrite the rest of init_revisions_and_shortrevisions() in C
This rewrites the part of init_revisions_and_shortrevisions() needed by
`--complete-action` (which initialize $shortrevisions) from shell to C.

When `upstream` is empty, it means that the user launched a `rebase
--root`, and `onto` contains the ID of an empty commit.  As a range
between an empty commit and `head` is not really meaningful, `onto` is
not used to initialize `shortrevisions` in this case.

The corresponding arguments passed to `--complete-action` are then
dropped, and init_revisions_and_shortrevisions() is stripped from
git-rebase--interactive.sh

Signed-off-by: Alban Gruin <alban.gruin@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2018-11-19 14:38:19 +01:00
Alban Gruin
146448db38 rebase -i: implement the logic to initialize $revisions in C
This rewrites the part of init_revisions_and_shortrevisions() needed by
`--make-script` from shell to C.  The new version is called
get_revision_ranges(), and is a static function inside of
rebase--helper.c.  As this does not initialize $shortrevision, the
original shell version is not yet stripped.

Unlike init_revisions_and_shortrevisions(), get_revision_ranges()
doesn’t write $squash_onto to the state directory, it’s done by the
handler of `--make-script` instead.

Finally, this drops the $revision argument passed to `--make-script` in
git-rebase--interactive.sh, and rebase--helper is changed accordingly.

Signed-off-by: Alban Gruin <alban.gruin@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2018-11-19 14:38:19 +01:00
Alban Gruin
ab0d865f93 rebase -i: remove unused modes and functions
This removes the modes `--skip-unnecessary-picks`, `--append-todo-help`,
and `--checkout-onto` from rebase--helper.c, the functions of
git-rebase--interactive.sh that were rendered useless by the rewrite of
complete_action(), and append_todo_help_to_file() from
rebase-interactive.c.

skip_unnecessary_picks() and checkout_onto() becomes static, as they are
only used inside of the sequencer.

Signed-off-by: Alban Gruin <alban.gruin@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2018-11-19 14:38:19 +01:00
Alban Gruin
555d0b3be9 rebase -i: rewrite complete_action() in C
This rewrites complete_action() from shell to C.

A new mode is added to rebase--helper (`--complete-action`), as well as
a new flag (`--autosquash`).

Finally, complete_action() is stripped from git-rebase--interactive.sh.

The original complete_action() would return the code 2 when the todo
list contained no actions.  This was a special case for rebase -i and
-p; git-rebase.sh would then apply the autostash, delete the state
directory, and die with the message "Nothing to do".  This cleanup is
rewritten in C instead of returning 2.  As rebase -i no longer returns
2, the comment describing this behaviour in git-rebase.sh is updated to
reflect this change.

The message "Nothing to do" is now printed with error(), and so becomes
"error: nothing to do".  Some tests in t3404 check this value, so they
are updated to fit this change.

The first check might seem useless as we write "noop" to the todo list
if it is empty.  Actually, the todo list might contain commented
commands (ie. empty commits).  In this case, complete_action() won’t
write "noop", and will abort without starting the editor.

Signed-off-by: Alban Gruin <alban.gruin@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2018-11-19 14:38:19 +01:00
Alban Gruin
37b2af4d02 t3404: todo list with commented-out commands only aborts
If the todo list generated by `--make-script` is empty,
complete_action() writes a noop, but if it has only commented-out
commands, it will abort with the message "Nothing to do", and does not
launch the editor.  This adds a new test to ensure that
complete_action() behaves this way.

Signed-off-by: Alban Gruin <alban.gruin@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2018-11-19 14:38:19 +01:00
Alban Gruin
a5e1c9261b sequencer: change the way skip_unnecessary_picks() returns its result
Instead of skip_unnecessary_picks() printing its result to stdout, it
returns it into a struct object_id, as the rewrite of complete_action()
(to come in the next commit) will need it.

rebase--helper then is modified to fit this change.

Signed-off-by: Alban Gruin <alban.gruin@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2018-11-19 14:38:19 +01:00
Alban Gruin
5adbf6be68 sequencer: refactor append_todo_help() to write its message to a buffer
This refactors append_todo_help() to write its message to a buffer
instead of the todo-list.  This is needed for the rewrite of
complete_action(), which will come after the next commit.

As rebase--helper still needs the file manipulation part of
append_todo_help(), it is extracted to a temporary function,
append_todo_help_to_file().  This function will go away after the
rewrite of complete_action().

Signed-off-by: Alban Gruin <alban.gruin@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2018-11-19 14:38:19 +01:00
Alban Gruin
60c397cbd8 rebase -i: rewrite checkout_onto() in C
This rewrites checkout_onto() from shell to C.

A new command (“checkout-onto”) is added to rebase--helper.c. The shell
version is then stripped.

Signed-off-by: Alban Gruin <alban.gruin@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2018-11-19 14:38:19 +01:00
Alban Gruin
f1b659653c rebase -i: rewrite setup_reflog_action() in C
This rewrites (the misnamed) setup_reflog_action() from shell to C. The
new version is called prepare_branch_to_be_rebased().

A new command is added to rebase--helper.c, “checkout-base”, as well as
a new flag, “verbose”, to avoid silencing the output of the checkout
operation called by checkout_base_commit().

The function `run_git_checkout()` will also be used in the next commit,
therefore its code is not part of `checkout_base_commit()`.

The shell version is then stripped in favour of a call to the helper.

As $GIT_REFLOG_ACTION is no longer set at the first call of
checkout_onto(), a call to comment_for_reflog() is added at the
beginning of this function.

Signed-off-by: Alban Gruin <alban.gruin@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2018-11-19 14:38:19 +01:00
Alban Gruin
ec75152a3c sequencer: add a new function to silence a command, except if it fails
This adds a new function, run_command_silent_on_success(), to
redirect the stdout and stderr of a command to a strbuf, and then to run
that command. This strbuf is printed only if the command fails. It is
functionnaly similar to output() from git-rebase.sh.

run_git_commit() is then refactored to use of
run_command_silent_on_success().

Signed-off-by: Alban Gruin <alban.gruin@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2018-11-19 14:38:19 +01:00
Alban Gruin
4167334c78 rebase -i: rewrite the edit-todo functionality in C
This rewrites the edit-todo functionality from shell to C.

To achieve that, a new command mode, `edit-todo`, is added, and the
`write-edit-todo` flag is removed, as the shell script does not need to
write the edit todo help message to the todo list anymore.

The shell version is then stripped in favour of a call to the helper.

Signed-off-by: Alban Gruin <alban.gruin@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2018-11-19 14:38:18 +01:00
Alban Gruin
645abc2fe2 editor: add a function to launch the sequence editor
As part of the rewrite of interactive rebase, the sequencer will need to
open the sequence editor to allow the user to edit the todo list.
Instead of duplicating the existing launch_editor() function, this
refactors it to a new function, launch_specified_editor(), which takes
the editor as a parameter, in addition to the path, the buffer and the
environment variables.  launch_sequence_editor() is then added to launch
the sequence editor.

Signed-off-by: Alban Gruin <alban.gruin@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2018-11-19 14:38:18 +01:00
Alban Gruin
a91ad9fbf5 rebase -i: rewrite append_todo_help() in C
This rewrites append_todo_help() from shell to C. It also incorporates
some parts of initiate_action() and complete_action() that also write
help texts to the todo file.

This also introduces the source file rebase-interactive.c. This file
will contain functions necessary for interactive rebase that are too
specific for the sequencer, and is part of libgit.a.

Two flags are added to rebase--helper.c: one to call
append_todo_help() (`--append-todo-help`), and another one to tell
append_todo_help() to write the help text suited for the edit-todo
mode (`--write-edit-todo`).

Finally, append_todo_help() is removed from git-rebase--interactive.sh
to use `rebase--helper --append-todo-help` instead.

Signed-off-by: Alban Gruin <alban.gruin@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2018-11-19 14:38:18 +01:00
Alban Gruin
1703262e41 sequencer: make three functions and an enum from sequencer.c public
This makes rebase_path_todo(), get_missing_commit_check_level(),
write_message() and the enum check_level accessible outside sequencer.c,
renames check_level to missing_commit_check_level, and prefixes its
value names by MISSING_COMMIT_ to avoid namespace pollution.

This function and this enum will eventually be moved to
rebase-interactive.c and become static again, so no special attention
was given to the naming.

This will be needed for the rewrite of append_todo_help() from shell to
C, as it will be in a new library source file, rebase-interactive.c.

Signed-off-by: Alban Gruin <alban.gruin@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2018-11-19 14:38:18 +01:00
Johannes Schindelin
1085d510a6 Start the merging-rebase to 0d438c7f4e
This commit starts the rebase of 0d438c7f4e to 0d438c7f4e

The idea is that this is the last merging-rebase before rebasing onto
v2.20.0-rc0. Read: no code changes, just rearranging the commits into
a nice, logical commit topology.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-11-19 14:31:08 +01:00
Johannes Schindelin
26d0946668 Merge branch 'update-ready-for-upstream'
This closes https://github.com/git-for-windows/git/pull/1936

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-11-19 11:46:06 +01:00
Johannes Schindelin
cb5118b5e6 Merge 'test-git-installed-v2'
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-11-19 11:41:01 +01:00
Johannes Schindelin
88837b692b Merge 'mingw-modernize-pthread_cond_t-v1'
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-11-19 11:40:36 +01:00
Johannes Schindelin
dade23fdbd Merge 'http-ssl-backend-v2'
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-11-19 11:40:29 +01:00
Johannes Schindelin
5113fc3927 Merge 'bw/config-h-v2'
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-11-19 11:40:22 +01:00
Johannes Schindelin
b094daa875 squash! tests: explicitly use git.exe on Windows
tests: explicitly use `git.exe` on Windows

On Windows, when we refer to `/an/absolute/path/to/git`, it magically
resolves `git.exe` at that location. Except if something of the name
`git` exists next to that `git.exe`. So if we call `$BUILD_DIR/git`, it
will find `$BUILD_DIR/git.exe` *only* if there is not, say, a directory
called `$BUILD_DIR/git`.

Such a directory, however, exists in Git for Windows when building with
Visual Studio (our Visual Studio project generator defaults to putting
the build files into a directory whose name is the base name of the
corresponding `.exe`).

In the bin-wrappers/* scripts, we already take pains to use `git.exe`
rather than `git`, as this could pick up the wrong thing on Windows
(i.e. if there exists a `git` file or directory in the build directory).

Now we do the same in the tests' start-up code.

This also helps when testing an installed Git, as there might be even
more likely some stray file or directory in the way.

Note: the only way we can record whether the `.exe` suffix is by writing
it to the `GIT-BUILD-OPTIONS` file and sourcing it at the beginning of
`t/test-lib.sh`. This is not a requirement introduced by this patch, but
we move the call to be able to use the `$X` variable that holds the file
extension, if any.

Note also: the many, many calls to `git this` and `git that` are
unaffected, as the regular PATH search will find the `.exe` files on
Windows (and not be confused by a directory of the name `git` that is
in one of the directories listed in the `PATH` variable), while
`/path/to/git` would not, per se, know that it is looking for an
executable and happily prefer such a directory.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-11-19 11:38:18 +01:00
Johannes Schindelin
ce7b0f2e14 squash! tests: do not require Git to be built when testing an installed Git
tests: do not require Git to be built when testing an installed Git

We really only need the test helpers to be built in the worktree in that
case, but that is not what we test for.

On the other hand it is a perfect opportunity to verify that
`GIT_TEST_INSTALLED` points to a working Git.

So let's test the appropriate Git executable. While at it, also adjust
the error message in the `GIT_TEST_INSTALLED` case.

This patch is best viewed with `-w --patience`.

Helped-by: Jeff King <peff@peff.net>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-11-19 11:38:15 +01:00
Johannes Schindelin
fe37aea812 squash! t/lib-gettext: test installed git-sh-i18n if GIT_TEST_INSTALLED is set
t/lib-gettext: test installed git-sh-i18n if GIT_TEST_INSTALLED is set

It makes very, very little sense to test the built git-sh-i18n when the
user asked specifically to test another one.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-11-19 11:38:12 +01:00
Johannes Schindelin
faa7cccbc9 squash! tests: respect GIT_TEST_INSTALLED when initializing repositories
tests: respect GIT_TEST_INSTALLED when initializing repositories

It really makes very, very little sense to use a different git
executable than the one the caller indicated via setting the environment
variable GIT_TEST_INSTALLED.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-11-19 11:38:09 +01:00
Johannes Schindelin
7801f037af squash! tests: fix GIT_TEST_INSTALLED's PATH to include t/helper/
tests: fix GIT_TEST_INSTALLED's PATH to include t/helper/

We really need to be able to find the test helpers... Really. This
change was forgotten when we moved the test helpers into t/helper/

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-11-19 11:38:05 +01:00
Johannes Schindelin
d64d6debd2 fixup! tests: fix GIT_TEST_INSTALLED's PATH to include t/helper/
In preparation for applying the latest iteration that was submitted to
the Git mailing list, let's revert this here patch.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-11-19 11:35:45 +01:00
Johannes Schindelin
69d262d0ec fixup! tests: respect GIT_TEST_INSTALLED when initializing repositories
In preparation for applying the latest iteration that was submitted to
the Git mailing list, let's revert this here patch.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-11-19 11:35:42 +01:00
Johannes Schindelin
c1f55c4fcd fixup! t/lib-gettext: test installed git-sh-i18n if GIT_TEST_INSTALLED is set
In preparation for applying the latest iteration that was submitted to
the Git mailing list, let's revert this here patch.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-11-19 11:35:39 +01:00
Johannes Schindelin
1f438ff32f fixup! tests: do not require Git to be built when testing an installed Git
In preparation for applying the latest iteration that was submitted to
the Git mailing list, let's revert this here patch.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-11-19 11:35:33 +01:00
Johannes Schindelin
2fb1d8b7cd fixup! tests: explicitly use git.exe on Windows
In preparation for applying the latest iteration that was submitted to
the Git mailing list, let's revert this here patch.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-11-19 11:35:05 +01:00
Loo Rong Jie
a0505d0a89 squash! Implement pthread_cond_t with Win32 CONDITION_VARIABLE
win32: replace pthread_cond_*() with much simpler code

The Win32 CONDITION_VARIABLE has better performance and is easier to
maintain, as the code is a lot shorter now (the semantics of the
CONDITION_VARIABLE matches the pthread_cond_t very well).

Note: CONDITION_VARIABLE is not available in Windows XP and below,
but the declared minimal Windows version required to build and run
Git for Windows is Windows Vista (which is also beyond its
end-of-life, but for less long than Windows XP), so that's okay.

Signed-off-by: Loo Rong Jie <loorongjie@gmail.com>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-11-19 11:31:31 +01:00
Johannes Schindelin
f7ca946ce4 fixup! Implement pthread_cond_t with Win32 CONDITION_VARIABLE
In preparation for applying the patch that actually made it to the Git
mailing list, let's revert this.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-11-19 11:28:49 +01:00
Johannes Schindelin
dba23ff759 fixup! Format to 80 cols
In preparation for applying the patch that actually made it to the Git
mailing list, let's revert this.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-11-19 11:28:32 +01:00
Johannes Schindelin
07100ba0e0 fixup! Remove old code and macro-ize implementation
In preparation for applying the patch that actually made it to the Git
mailing list, let's revert this.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-11-19 11:26:31 +01:00
Johannes Schindelin
850406a924 squash! http: when using Secure Channel, ignore sslCAInfo by default
http: when using Secure Channel, ignore sslCAInfo by default

As of cURL v7.60.0, the Secure Channel backend can use the certificate
bundle provided via `http.sslCAInfo`, but that would override the
Windows Certificate Store. Since this is not desirable by default, let's
tell Git to not ask cURL to use that bundle by default when the `schannel`
backend was configured via `http.sslBackend`, unless
`http.schannelUseSSLCAInfo` overrides this behavior.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-11-19 11:18:49 +01:00
Brendan Forster
a67fd95daf squash! http: add support for disabling SSL revocation checks in cURL
http: add support for disabling SSL revocation checks in cURL

This adds support for a new http.schannelCheckRevoke config value.

This config value is only used if http.sslBackend is set to "schannel",
which forces cURL to use the Windows Certificate Store when validating
server certificates associated with a remote server.

This config value should only be set to "false" if you are in an
environment where revocation checks are blocked by the network, with
no alternative options.

This is only supported in cURL 7.44 or later.

Note: originally, we wanted to call the config setting
`http.schannel.checkRevoke`. This, however, does not work: the `http.*`
config settings can be limited to specific URLs via `http.<url>.*`
(and this feature would mistake `schannel` for a URL).

Helped by Agustín Martín Barbero.

Signed-off-by: Brendan Forster <github@brendanforster.com>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-11-19 11:18:40 +01:00
Johannes Schindelin
18dab43c05 squash! http: add support for selecting SSL backends at runtime
http: add support for selecting SSL backends at runtime

As of version 7.56.0, curl supports being compiled with multiple SSL
backends.

This patch adds the Git side of that feature: by setting http.sslBackend
to "openssl" or "schannel", Git for Windows can now choose the SSL
backend at runtime.

This comes in handy on Windows because Secure Channel ("schannel") is
the native solution, accessing the Windows Credential Store, thereby
allowing for enterprise-wide management of certificates. For historical
reasons, Git for Windows needs to support OpenSSL still, as it has
previously been the only supported SSL backend in Git for Windows for
almost a decade.

The patch has been carried in Git for Windows for over a year, and is
considered mature.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-11-19 11:18:28 +01:00
Johannes Schindelin
69eadfb835 fixup! http: add support for selecting SSL backends at runtime
Revert this in preparation for applying the latest iteration of the
patch.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-11-19 11:15:51 +01:00
Johannes Schindelin
a36e5dca52 fixup! http: add support for disabling SSL revocation checks in cURL
Revert this in preparation for applying the latest iteration of the
patch.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-11-19 11:15:41 +01:00
Johannes Schindelin
17719e683f fixup! http: when using Secure Channel, ignore sslCAInfo by default
Revert this in preparation for applying the latest iteration of the
patch.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-11-19 11:15:14 +01:00
Johannes Schindelin
0154b9c065 squash! do_git_config_sequence(): fall back to git_dir if commondir is NULL
config: report a bug if git_dir exists without commondir

This did happen at some stage, and was fixed relatively quickly. Make
sure that we detect very quickly, too, should that happen again.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-11-19 11:13:19 +01:00
Johannes Schindelin
b8591e07fd fixup! do_git_config_sequence(): fall back to git_dir if commondir is NULL
In preparation for applying the latest iteration of bw/config-h that was
submitted to the Git mailing list, let's revert the original iteration.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-11-19 11:09:08 +01:00
Johannes Schindelin
82dacae3c2 Merge pull request #1933 from dscho/update-create-empty-bundle
Update `create-empty-bundle`
2018-11-16 16:52:09 +01:00
Johannes Schindelin
8d08b44ff9 Merge pull request #1932 from dscho/prepare-for-2.20.0-rc0
Prepare for v2.20.0-rc0
2018-11-16 16:48:55 +01:00
Jeff King
3f0700f40b squash! bundle: refuse to create empty bundle
TODO: change authorship to Peff!

bundle: dup() output descriptor closer to point-of-use

When writing a bundle to a file, the bundle code actually creates
"your.bundle.lock" using our lockfile interface. We feed that output
descriptor to a child git-pack-objects via run-command, which has the
quirk that it closes the output descriptor in the parent.

To avoid confusing the lockfile code (which still thinks the descriptor
is valid), we dup() it, and operate on the duplicate.

However, this has a confusing side effect: after the dup() but before we
call pack-objects, we have _two_ descriptors open to the lockfile. If we
call die() during that time, the lockfile code will try to clean up the
partially-written file. It knows to close() the file before unlinking,
since on some platforms (i.e., Windows) the open file would block the
deletion. But it doesn't know about the duplicate descriptor. On
Windows, triggering an error at the right part of the code will result
in the cleanup failing and the lockfile being left in the filesystem.

We can solve this by moving the dup() much closer to start_command(),
shrinking the window in which we have the second descriptor open. It's
easy to place this in such a way that no die() is possible. We could
still die due to a signal in the exact wrong moment, but we already
tolerate races there (e.g., a signal could come before we manage to put
the file on the cleanup list in the first place).

As a bonus, this shields create_bundle() itself from the duplicate-fd
trick, and we can simplify its error handling (note that the lock
rollback now happens unconditionally, but that's OK; it's a noop if we
didn't open the lock in the first place).

The included test uses an empty bundle to cause a failure at the right
spot in the code, because that's easy to trigger (the other likely
errors are write() problems like ENOSPC).  Note that it would already
pass on non-Windows systems (because they are happy to unlink an
already-open file).

Based-on-a-patch-by: Gaël Lhez <gael.lhez@gmail.com>
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-11-16 16:43:09 +01:00
Johannes Schindelin
a057a1a63f fixup! bundle: refuse to create empty bundle
This reverts the patch we carried for a long time, as it did not survive
contact with the Git mailing list. In preparation for applying Jeff
King's better version, let's revert our version.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-11-16 16:41:57 +01:00
Johannes Schindelin
2d3b4935cc Merge remote-tracking branch 'benpeart/fscache-per-thread-gfw'
This brings substantial wins in performance because the FSCache is now
per-thread, being merged to the primary thread only at the end, so we do
not have to lock (except while merging).

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-11-16 15:42:47 +01:00
Ben Peart
52fc4db0f5 fscache: teach fscache to use mempool
Now that the fscache is single threaded, take advantage of the mem_pool as
the allocator to significantly reduce the cost of allocations and frees.

With the reduced cost of free, in future patches, we can start freeing the
fscache at the end of commands instead of just leaking it.

Signed-off-by: Ben Peart <benpeart@microsoft.com>
2018-11-16 08:06:14 -05:00
Ben Peart
f3ea036ad3 fscache: update fscache to be thread specific instead of global
The threading model for fscache has been to have a single, global cache.
This puts requirements on it to be thread safe so that callers like
preload-index can call it from multiple threads.  This was implemented
with a single mutex and completion events which introduces contention
between the calling threads.

Simplify the threading model by making fscache thread specific.  This allows
us to remove the global mutex and synchronization events entirely and instead
associate a fscache with every thread that requests one. This works well with
the current multi-threading which divides the cache entries into blocks with
a separate thread processing each block.

At the end of each worker thread, if there is a fscache on the primary
thread, merge the cached results from the worker into the primary thread
cache. This enables us to reuse the cache later especially when scanning for
untracked files.

In testing, this reduced the time spent in preload_index() by about 25% and
also reduced the CPU utilization significantly.  On a repo with ~200K files,
it reduced overall status times by ~12%.

Signed-off-by: Ben Peart <benpeart@microsoft.com>
2018-11-16 08:06:14 -05:00