Commit Graph

88770 Commits

Author SHA1 Message Date
Johannes Schindelin
ddb6e5ca19 fixup! rebase -i: implement the main part of interactive rebase as a builtin
The `--gpg-sign` option takes an *optional* argument, not a mandatory
one.

This fixes https://github.com/git-for-windows/git/issues/1836.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-09-27 15:01:47 +02:00
Johannes Schindelin
2af24038a9 fixup! stash: convert apply to builtin
When converting the `stash apply` command, we were missing at least two
error messages: when the diff could not be applied with `--index`, we
want to suggest to re-run the command without `--index`.

While at it, and because we now can, let's also add an error message in
the case that the diff could not be generated in the first place (the
shell script could not do that, as it piped the output of `git diff` to
`git apply`, and there is no portable way to handle errors in the
command whose output is redirected).

Noticed by Matthew Cheetham.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-09-27 14:14:58 +02:00
Johannes Schindelin
d6a9496dda Merge pull request #1850 from dscho/fix-badge
fixup! Merge remote-tracking branch 'origin/master' into azure-pipelines
2018-09-26 22:10:36 +02:00
Johannes Schindelin
e615d6d988 fixup! Merge remote-tracking branch 'origin/master' into azure-pipelines
D'oh. There really need to be two slashes, not one, after the protocol.
Copy/edit fail.

Now, where do I have my brown paper bag. Ah. There it is.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-09-26 21:49:59 +02:00
Jameson Miller
fae60552db Merge pull request #1837 from git-for-windows/azure-pipelines
Set up CI with Azure Pipelines
2018-09-24 16:57:30 -04:00
Johannes Schindelin
dbd1489657 Merge remote-tracking branch 'origin/master' into azure-pipelines
This merges Git for Windows' `master` branch into the branch, resolving
the conflicts in README.md by replacing the Azure Pipelines links with
Git for Windows' own ones.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-09-20 05:21:27 +02:00
Johannes Schindelin
3d83d68965 travis: fix skipping tagged releases
When building a PR, TRAVIS_BRANCH refers to the *target branch*.
Therefore, if a PR targets `master`, and `master` happened to be tagged,
we skipped the build by mistake.

Fix this by using TRAVIS_PULL_REQUEST_BRANCH (i.e. the *source branch*)
when available, falling back to TRAVIS_BRANCH (i.e. for CI builds, also
known as "push builds").

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-09-20 05:21:20 +02:00
Johannes Schindelin
2631b4a641 README: add a build badge (status of the Azure Pipelines build)
Just like so many other OSS projects, we now also have a build badge.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-09-20 05:21:20 +02:00
Johannes Schindelin
bb8decfff7 tests: record more stderr with --write-junit-xml in case of failure
Sometimes, failures in a test case are actually caused by issues in
earlier test cases.

To make it easier to see those issues, let's attach the output from
before the failing test case (i.e. stdout/stderr since the previous
failing test case, or the start of the test script). This will be
visible in the "Attachments" of the details of the failed test.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-09-20 05:21:20 +02:00
Johannes Schindelin
7bc1e3b480 tests: include detailed trace logs with --write-junit-xml upon failure
The JUnit XML format lends itself to be presented in a powerful UI,
where you can drill down to the information you are interested in very
quickly.

For test failures, this usually means that you want to see the detailed
trace of the failing tests.

With Travis CI, we passed the `--verbose-log` option to get those
traces. However, that seems excessive, as we do not need/use the logs in
almost all of those cases: only when a test fails do we have a way to
include the trace.

So let's do something different when using Azure DevOps: let's run all
the tests with `--quiet` first, and only if a failure is encountered,
try to trace the commands as they are executed.

Of course, we cannot turn on `--verbose-log` after the fact. So let's
just re-run the test with all the same options, adding `--verbose-log`.
And then munging the output file into the JUnit XML on the fly.

Note: there is an off chance that re-running the test in verbose mode
"fixes" the failures (and this does happen from time to time!). That is
a possibility we should be able to live with. Ideally, we would label
this as "Passed upon rerun", and Azure Pipelines even know about that
outcome, but it is not available when using the JUnit XML format for
now:
https://github.com/Microsoft/azure-pipelines-agent/blob/master/src/Agent.Worker/TestResults/JunitResultReader.cs

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-09-20 05:21:20 +02:00
Johannes Schindelin
baf81a7f84 git-p4: use test_atexit to kill the daemon
This should be more reliable than the current method, and prepares the
test suite for a consistent way to clean up before re-running the tests
with different options.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-09-20 05:21:20 +02:00
Johannes Schindelin
b461868985 git-daemon: use test_atexit in the tests
This makes use of the just-introduced consistent way to specify that a
long-running process needs to be terminated at the end of a test script
run.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-09-20 05:21:20 +02:00
Johannes Schindelin
4b81cb1e59 tests: introduce test_atexit
When running the p4 daemon or `git daemon`, we want to kill it at the
end of the test script.

So far, we do this "manually".

However, in the next few commits we want to teach the test suite to
optionally re-run scripts with different options, therefore we will have
to have a consistent way to stop daemons.

Let's introduce `test_atexit`, which is loosely modeled after
`test_when_finished` (but has a broader scope: rather than running the
commands after the current test case, run them when the test script
finishes, and also run them when the `--immediate` option is in effect).

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-09-20 05:21:20 +02:00
Johannes Schindelin
7f446cc241 Add a build definition for Azure DevOps
This commit adds an azure-pipelines.yml file which is Azure DevOps'
equivalent to Travis CI's .travis.yml.

To make things a bit easier to understand, we refrain from using the
`matrix` feature here because (while it is powerful) it can be a bit
confusing to users who are not familiar with CI setups. Therefore, we
use a separate phase even for similar configurations (such as GCC vs
Clang on Linux, GCC vs Clang on macOS).

Also, we make use of the shiny new feature we just introduced where the
test suite can output JUnit-style .xml files. This information is made
available in a nice UI that allows the viewer to filter by phase and/or
test number, and to see trends such as: number of (failing) tests, time
spent running the test suite, etc.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-09-20 05:21:20 +02:00
Jameson Miller
42a3604fdc Merge pull request #1840 from jamill/fixup_test
fixup! mingw: respect core.hidedotfiles = false in git-init again
2018-09-18 13:35:29 -04:00
Jameson Miller
faec6efd90 fixup! mingw: respect core.hidedotfiles = false in git-init again
Fix broken command chain in t0001-init.sh.

Signed-off-by: Jameson Miller <jamill@microsoft.com>
2018-09-17 17:39:55 -04:00
Johannes Schindelin
9cdd47e45f ci/lib.sh: add support for Azure Pipelines
This patch introduces a conditional arm that defines some environment
variables and a function that displays the URL given the job id (to
identify previous runs for known-good trees).

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-09-14 22:44:37 +02:00
Johannes Schindelin
5f5efa3ab8 tests: optionally write results as JUnit-style .xml
This will come in handy when publishing the results of Git's test suite
during an automated Azure DevOps run.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-09-14 22:22:31 +02:00
Johannes Schindelin
aaf3f1921c test-date: add a subcommand to measure times in shell scripts
In the next commit, we want to teach Git's test suite to optionally
output test results in JUnit-style .xml files. These files contain
information about the time spent. So we need a way to measure time.

While we could use `date +%s` for that, this will give us only seconds,
i.e. very coarse-grained timings.

GNU `date` supports `date +%s.%N` (i.e. nanosecond-precision output),
but there is no equivalent in BSD `date` (read: on macOS, we would not
be able to obtain precise timings).

So let's introduce `test-tool date getnanos`, with an optional start
time, that outputs preciser values.

Granted, it is a bit pointless to try measuring times accurately in
shell scripts, certainly to nanosecond precision. But it is better than
second-granularity.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-09-14 22:22:17 +02:00
Johannes Schindelin
9d9da4b790 ci/lib.sh: encapsulate Travis-specific things
The upcoming patches will allow building git.git via Azure Pipelines
(i.e. Azure DevOps' Continuous Integration), where variable names and
URLs look a bit different than in Travis CI.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-09-14 22:21:48 +02:00
Johannes Schindelin
03f5050bb3 ci: rename the library of common functions
The name is hard-coded to reflect that we use Travis CI for continuous
testing.

In the next commits, we will extend this to be able use Azure DevOps,
too.

So let's adjust the name to make it more generic.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-09-14 22:21:32 +02:00
Jameson Miller
d96bb8bc6c Merge builtin-stash-rebase-v2
This trick was performed by rebasing the builtin-stash-rebase branch
thicket via `git rebase -kir v2.19.0-rc2`, replacing all branches that
made it into `pu` by their current versions (and also the builtin-stash
by the newest iteration as of ungps/git), and then calling these
commands:

	# save current tip
	tip=$(git rev-parse HEAD)

	# revert previous merge
	git reset --hard git-for-windows/master^0
	git revert -n -m 1 HEAD
	git commit --squash HEAD -s -m "Let's drop this"

	# now perform the 3-way merge with v2.19.0-rc2 as base
	git merge-recursive v2.19.0-rc2 -- HEAD $tip
	git merge --ff-only \
		$(git commit-tree -p HEAD -p $tip -m "Merge" \
			$(git write-tree))
	git commit -c HEAD^^ --amend -s

The merge-recursive dance is necessary because of the merging-rebases:
the fake merges with which these start are mistaken by `git merge` to
mean that the branches were already merged, when the fake merges undid
the corresponding changes.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
v2.19.0.windows.1
2018-09-11 09:45:57 -04:00
Johannes Schindelin
cec98c61dd 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-09-10 16:48:23 -04:00
Johannes Schindelin
0bccc7f63c 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-09-10 16:48:22 -04:00
Johannes Schindelin
50b06c8822 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-09-10 16:48:22 -04:00
Johannes Schindelin
f237751535 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-09-10 16:48:22 -04:00
Johannes Schindelin
4f49e25717 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-09-10 16:48:22 -04:00
Johannes Schindelin
dc25b6cff0 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-09-10 16:48:22 -04:00
Johannes Schindelin
5aea1f37b4 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-09-10 16:48:21 -04:00
Johannes Schindelin
774a0ca0ee "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-09-10 16:48:21 -04:00
Johannes Schindelin
6a9d54d671 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-09-10 16:48:21 -04:00
Johannes Schindelin
fdef4d0ae8 Merge 'pk/rebase-in-c-6-final'
This final patch flips the switch and makes the builtin rebase the
default. The old, Unix shell scripted version can still be called via

	git -c rebase.useBuiltin=false rebase [...]

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-09-10 16:48:21 -04:00
Johannes Schindelin
45a18e6618 Merge 'js/rebase-in-c-5.5-work-with-rebase-i-in-c'
This branch first merges the builtin interactive rebase, and then
teaches the builtin rebase to hand off interactive rebases to the
builtin backend correctly.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-09-10 16:48:21 -04:00
Johannes Schindelin
225f77f111 Merge 'pk/rebase-in-c-5-test'
This fifth batch of builtin rebase patches concludes the conversion: the
builtin rebase is now feature-complete.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-09-10 16:48:20 -04:00
Johannes Schindelin
cbd06cc22e Merge 'pk/rebase-in-c-4-opts'
This wave of built rebase patches implements the remaining rebase
options in the builtin rebase.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-09-10 16:48:20 -04:00
Johannes Schindelin
899871992d Merge 'pk/rebase-in-c-3-acts'
This set of patches implements the actions (such as --continue, --skip,
etc) in the builtin rebase.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-09-10 16:48:20 -04:00
Johannes Schindelin
a0e07fd412 Merge 'pk/rebase-in-c-2-basic'
This is the second wave of patches to bring us closer to a builtin `git
rebase`.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-09-10 16:48:20 -04:00
Johannes Schindelin
4f2c642409 Merge 'pk/rebase-in-c'
This is the first batch of the patches that turn `git rebase` into
a builtin.

This not only helps performance on Windows, but *especially* makes
things more robust, as no MSYS2 Bash will be required to run this
command any longer.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-09-10 16:48:19 -04:00
Johannes Schindelin
ea1e07297a Merge 'ps/stash-in-c'
This merges the builtin stash.

Upstream Git did not integrate it into any stable integration branch
yet, but the performance improvements are substantial enough,
especially on Windows, that we really, really, really want to have it
early.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-09-10 16:48:19 -04:00
Jeff Hostetler
fde33e23a8 Merge pull request #1766 from jeffhostetler/gfw-msvc-bin-dir
find_vs_env.bat: Fix bin dir path used by msys
2018-09-10 16:42:52 -04:00
Pratik Karki
4b672355e2 CONTRIBUTING.md: add an extra example
This commit adds an extra example to submit an incrementing version
patch series to the mailing list which should be the continuation to
previous patch series.

This closes https://github.com/git-for-windows/git/pull/1745

Signed-off-by: Pratik Karki <predatoramigo@gmail.com>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-09-10 16:42:51 -04:00
Jeff Hostetler
2e41db1933 find_vs_env.bat: Fix bin dir path used by msys
Completely convert the pathname expoted in the %msvc_bin_dir_msys%
variable to MSYS format with forward slashes rather than a mixture
of forward and back slashes.

This solves an obscure problem observed by some developers:

    [...]
    http-push.c
        CC remote-curl.o
    remote-curl.c
        * new script parameters
        GEN git-instaweb
    sed: -e expression #7, char 155: invalid reference \2 on `s' command's RHS
    make: *** [Makefile:2023: git-instaweb] Error 1

Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
2018-09-10 16:42:47 -04:00
Johannes Schindelin
cf78a9e037 Merge pull request #1679 from telezhnaya/win
vcxproj: change build logic
2018-09-10 16:42:47 -04:00
Johannes Schindelin
b67f7d0bb3 Merge pull request #1645 from ZCube/master
Support windows container.
2018-09-10 16:42:47 -04:00
Olga Telezhnaia
7fbeb52340 vcxproj: change build logic
Add new condition to invoke vcpkg_install.bat: it's not enough to check
the presence of folder vcpkg. We need to check the presence of some
header files because this is one of the main goals of this script.
Previous build attempt could be aborted, so the folder will exist but
the project will not be built properly.

Signed-off-by: Olga Telezhnaia <olyatelezhnaya@gmail.com>
2018-09-10 16:42:47 -04:00
Johannes Schindelin
55394bae89 Merge branch 'ctrl-c'
This is part two of the Ctrl+C story, where part one is
https://github.com/git-for-windows/MSYS2-packages/commit/f4fda0f30aa.

Part one took care of extending the signal handling in the MSYS2 runtime
such that non-MSYS2 processes "receive" a SIGINT by injecting a remote
thread that runs kernel32!CtrlRoutine as if GenerateConsoleCtrlHandler()
had been called (but in contrast to the latter, only one process is
targeted at a time, not every process attached to the same Console) into
the process that needs to be interrupted as well as into all of the
spawned child processes.

Part two now takes care of removing the misguided "kill all spawned
children" atexit() handler, and it also installs a ConsoleCtrl handler
to run Git's SIGINT handlers, such as the one waiting for the pager to
exit.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-09-10 16:42:46 -04:00
Johannes Schindelin
51628784a8 mingw: Windows Docker volumes are *not* symbolic links
... even if they may look like them.

As looking up the target of the "symbolic link" (just to see whether it
starts with `/ContainerMappedDirectories/`) is pretty expensive, we
do it when we can be *really* sure that there is a possibility that this
might be the case.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: JiSeop Moon <zcube@zcube.kr>
2018-09-10 16:42:46 -04:00
Johannes Schindelin
d3be32f586 mingw: really handle SIGINT
Previously, we did not install any handler for Ctrl+C, but now we really
want to because the MSYS2 runtime learned the trick to call the
ConsoleCtrlHandler when Ctrl+C was pressed.

With this, hitting Ctrl+C while `git log` is running will only terminate
the Git process, but not the pager. This finally matches the behavior on
Linux and on macOS.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-09-10 16:42:46 -04:00
JiSeop Moon
341f0d62c6 mingw: move the file_attr_to_st_mode() function definition
In preparation for making this function a bit more complicated (to allow
for special-casing the `ContainerMappedDirectories` in Windows
containers, which look like a symbolic link, but are not), let's move it
out of the header.

Signed-off-by: JiSeop Moon <zcube@zcube.kr>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-09-10 16:42:46 -04:00
JiSeop Moon
b1bced2c76 mingw: when running in a Windows container, try to rename() harder
It is a known issue that a rename() can fail with an "Access denied"
error at times, when copying followed by deleting the original file
works. Let's just fall back to that behavior.

Signed-off-by: JiSeop Moon <zcube@zcube.kr>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2018-09-10 16:42:46 -04:00