Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rebase to v2.49.0-rc0 #5444

Merged
merged 731 commits into from
Feb 26, 2025

Conversation

dscho
Copy link
Member

@dscho dscho commented Feb 26, 2025

This is the usual rebase PR. I'll add the range-diff in a follow-up comment.

sceptical-coder and others added 30 commits February 26, 2025 20:30
In f9b7573 (repository: free fields before overwriting them,
2017-09-05), Git was taught to release memory before overwriting it, but
357a03e (repository.c: move env-related setup code back to
environment.c, 2018-03-03) changed the code so that it would not
_always_ be overwritten.

As a consequence, the `commondir` attribute would point to
already-free()d memory.

This seems not to cause problems in core Git, but there are add-on
patches in Git for Windows where the `commondir` attribute is
subsequently used and causing invalid memory accesses e.g. in setups
containing old-style submodules (i.e. the ones with a `.git` directory
within theirs worktrees) that have `commondir` configured.

This fixes git-for-windows#4083.

Signed-off-by: Andrey Zabavnikov <[email protected]>
Signed-off-by: Johannes Schindelin <[email protected]>
This compile-time option allows to ask Git to load libcurl dynamically
at runtime.

Together with a follow-up patch that optionally overrides the file name
depending on the `http.sslBackend` setting, this kicks open the door for
installing multiple libcurl flavors side by side, and load the one
corresponding to the (runtime-)configured SSL/TLS backend.

Signed-off-by: Johannes Schindelin <[email protected]>
This implements the Windows-specific support code, because everything is
slightly different on Windows, even loading shared libraries.

Note: I specifically do _not_ use the code from
`compat/win32/lazyload.h` here because that code is optimized for
loading individual functions from various system DLLs, while we
specifically want to load _many_ functions from _one_ DLL here, and
distinctly not a system DLL (we expect libcurl to be located outside
`C:\Windows\system32`, something `INIT_PROC_ADDR` refuses to work with).
Also, the `curl_easy_getinfo()`/`curl_easy_setopt()` functions are
declared as vararg functions, which `lazyload.h` cannot handle. Finally,
we are about to optionally override the exact file name that is to be
loaded, which is a goal contrary to `lazyload.h`'s design.

Signed-off-by: Johannes Schindelin <[email protected]>
The previous commits introduced a compile-time option to load libcurl
lazily, but it uses the hard-coded name "libcurl-4.dll" (or equivalent
on platforms other than Windows).

To allow for installing multiple libcurl flavors side by side, where
each supports one specific SSL/TLS backend, let's first look whether
`libcurl-<backend>-4.dll` exists, and only use `libcurl-4.dll` as a fall
back.

That will allow us to ship with a libcurl by default that only supports
the Secure Channel backend for the `https://` protocol. This libcurl
won't suffer from any dependency problem when upgrading OpenSSL to a new
major version (which will change the DLL name, and hence break every
program and library that depends on it).

This is crucial because Git for Windows relies on libcurl to keep
working when building and deploying a new OpenSSL package because that
library is used by `git fetch` and `git clone`.

Note that this feature is by no means specific to Windows. On Ubuntu,
for example, a `git` built using `LAZY_LOAD_LIBCURL` will use
`libcurl.so.4` for `http.sslbackend=openssl` and `libcurl-gnutls.so.4`
for `http.sslbackend=gnutls`.

Signed-off-by: Johannes Schindelin <[email protected]>
Since Git v2.39.1, we are a bit more stringent in searching the PATH. In
particular, we specifically require the `.exe` suffix.

However, the `Repository>Explore Working Copy` command asks for
`explorer.exe` to be found on the `PATH`, which _already_ has that
suffix.

Let's unstartle the PATH-finding logic about this scenario.

This fixes git-for-windows#4356

Signed-off-by: Johannes Schindelin <[email protected]>
This will help with Git for Windows' maintenance going forward: It
allows Git for Windows to switch its primary libcurl to a variant
without the OpenSSL backend, while still loading an alternate when
setting `http.sslBackend = openssl`.

This is necessary to avoid maintenance headaches with upgrading OpenSSL:
its major version name is encoded in the shared library's file name and
hence major version updates (temporarily) break libraries that are
linked against the OpenSSL library.

Signed-off-by: Johannes Schindelin <[email protected]>
In Git for Windows v2.39.0, we fixed a regression where `git.exe` would
no longer work in Windows Nano Server (frequently used in Docker
containers).

This GitHub workflow can be used to verify manually that the Git/Scalar
executables work in Nano Server.

Signed-off-by: Johannes Schindelin <[email protected]>
When running Git for Windows on a remote APFS filesystem, it would
appear that the `mingw_open_append()`/`write()` combination would fail
almost exactly like on some CIFS-mounted shares as had been reported in
git-for-windows#2753, albeit with a
different `errno` value.

Let's handle that `errno` value just the same, by suggesting to set
`windows.appendAtomically=false`.

Signed-off-by: David Lomas <[email protected]>
Signed-off-by: Johannes Schindelin <[email protected]>
Windows 10 version 1511 (also known as Anniversary Update), according to
https://learn.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences
introduced native support for ANSI sequence processing. This allows
using colors from the entire 24-bit color range.

All we need to do is test whether the console's "virtual processing
support" can be enabled. If it can, we do not even need to start the
`console_thread` to handle ANSI sequences.

Or, almost all we need to do: When `console_thread()` does its work, it
uses the Unicode-aware `write_console()` function to write to the Win32
Console, which supports Git for Windows' implicit convention that all
text that is written is encoded in UTF-8. The same is not necessarily
true if native ANSI sequence processing is used, as the output is then
subject to the current code page. Let's ensure that the code page is set
to `CP_UTF8` as long as Git writes to it.

Signed-off-by: Johannes Schindelin <[email protected]>
By default, the buffer type of Windows' `stdout` is unbuffered (_IONBF),
and there is no need to manually fflush `stdout`.

But some programs, such as the Windows Filtering Platform driver
provided by the security software, may change the buffer type of
`stdout` to full buffering. This nees `fflush(stdout)` to be called
manually, otherwise there will be no output to `stdout`.

Signed-off-by: MinarKotonoha <[email protected]>
Signed-off-by: Johannes Schindelin <[email protected]>
A long time ago, we decided to run tests in Git for Windows' SDK with
the default `winsymlinks` mode: copying instead of linking. This is
still the default mode of MSYS2 to this day.

However, this is not how most users run Git for Windows: As the majority
of Git for Windows' users seem to be on Windows 10 and newer, likely
having enabled Developer Mode (which allows creating symbolic links
without administrator privileges), they will run with symlink support
enabled.

This is the reason why it is crucial to get the fixes for CVE-2024-? to
the users, and also why it is crucial to ensure that the test suite
exercises the related test cases. This commit ensures the latter.

Signed-off-by: Johannes Schindelin <[email protected]>
The `__MINGW64__` constant is defined, surprise, surprise, only when
building for a 64-bit CPU architecture.

Therefore using it as a guard to define `_POSIX_C_SOURCE` (so that
`localtime_r()` is declared, among other functions) is not enough, we
also need to check `__MINGW32__`.

Technically, the latter constant is defined even for 64-bit builds. But
let's make things a bit easier to understand by testing for both
constants.

Making it so fixes this compile warning (turned error in GCC v14.1):

  archive-zip.c: In function 'dos_time':
  archive-zip.c:612:9: error: implicit declaration of function 'localtime_r';
  did you mean 'localtime_s'? [-Wimplicit-function-declaration]
    612 |         localtime_r(&time, &tm);
        |         ^~~~~~~~~~~
        |         localtime_s

Signed-off-by: Johannes Schindelin <[email protected]>
In order to be a better Windows citizenship, Git should
save its configuration files on AppData folder. This can
enables git configuration files be replicated between machines
using the same Microsoft account logon which would reduce the
friction of setting up Git on new systems. Therefore, if
%APPDATA%\Git\config exists, we use it; otherwise
$HOME/.config/git/config is used.

Signed-off-by: Ariel Lourenco <[email protected]>
Git LFS is now built with Go 1.21 which no longer supports Windows 7.
However, Git for Windows still wants to support Windows 7.

Ideally, Git LFS would re-introduce Windows 7 support until Git for
Windows drops support for Windows 7, but that's not going to happen:
git-for-windows#4996 (comment)

The next best thing we can do is to let the users know what is
happening, and how to get out of their fix, at least.

This is not quite as easy as it would first seem because programs
compiled with Go 1.21 or newer will simply throw an exception and fail
with an Access Violation on Windows 7.

The only way I found to address this is to replicate the logic from Go's
very own `version` command (which can determine the Go version with
which a given executable was built) to detect the situation, and in that
case offer a helpful error message.

This addresses git-for-windows#4996.

Signed-off-by: Johannes Schindelin <[email protected]>
As reported in https://lore.kernel.org/git/[email protected]/,
libcurl v8.10.0 had a regression that was picked up by Git's t5559.30
"large fetch-pack requests can be sent using chunked encoding".

This bug was fixed in libcurl v8.10.1.

Sadly, the macos-13 runner image was updated in the brief window between
these two libcurl versions, breaking each and every CI build, as
reported at git-for-windows#5159.

This would usually not matter, we would just ignore the failing CI
builds until the macos-13 runner image is rebuilt in a couple of days,
and then the CI builds would succeed again.

However.

As has become the custom, a surprise Git version was released, and now
that Git for Windows wants to follow suit, since Git for Windows has
this custom of trying to never release a version with a failing CI
build, we _must_ work around it.

This patch implements this work-around, basically for the sake of Git
for Windows v2.46.2's CI build.

Signed-off-by: Johannes Schindelin <[email protected]>
The sparse tree walk algorithm was created in d5d2e93 (revision:
implement sparse algorithm, 2019-01-16) and involves using the
mark_trees_uninteresting_sparse() method. This method takes a repository
and an oidset of tree IDs, some of which have the UNINTERESTING flag and
some of which do not.

Create a method that has an equivalent set of preconditions but uses a
"dense" walk (recursively visits all reachable trees, as long as they
have not previously been marked UNINTERESTING). This is an important
difference from mark_tree_uninteresting(), which short-circuits if the
given tree has the UNINTERESTING flag.

A use of this method will be added in a later change, with a condition
set whether the sparse or dense approach should be used.

Signed-off-by: Derrick Stolee <[email protected]>
This will be helpful in a future change.

Signed-off-by: Derrick Stolee <[email protected]>
In order to more easily compute delta bases among objects that appear at the
exact same path, add a --path-walk option to 'git pack-objects'.

This option will use the path-walk API instead of the object walk given by
the revision machinery. Since objects will be provided in batches
representing a common path, those objects can be tested for delta bases
immediately instead of waiting for a sort of the full object list by
name-hash. This has multiple benefits, including avoiding collisions by
name-hash.

The objects marked as UNINTERESTING are included in these batches, so we
are guaranteeing some locality to find good delta bases.

After the individual passes are done on a per-path basis, the default
name-hash is used to find other opportunistic delta bases that did not
match exactly by the full path name.

RFC TODO: It is important to note that this option is inherently
incompatible with using a bitmap index. This walk probably also does not
work with other advanced features, such as delta islands.

Getting ahead of myself, this option compares well with --full-name-hash
when the packfile is large enough, but also performs at least as well as
the default in all cases that I've seen.

RFC TODO: this should probably be recording the batch locations to another
list so they could be processed in a second phase using threads.

RFC TODO: list some examples of how this outperforms previous pack-objects
strategies. (This is coming in later commits that include performance
test changes.)

Signed-off-by: Derrick Stolee <[email protected]>
There are many tests that validate whether 'git pack-objects' works as
expected. Instead of duplicating these tests, add a new test environment
variable, GIT_TEST_PACK_PATH_WALK, that implies --path-walk by default
when specified.

This was useful in testing the implementation of the --path-walk
implementation, especially in conjunction with test such as:

 - t0411-clone-from-partial.sh : One test fetches from a repo that does
   not have the boundary objects. This causes the path-based walk to
   fail. Disable the variable for this test.

 - t5306-pack-nobase.sh : Similar to t0411, one test fetches from a repo
   without a boundary object.

 - t5310-pack-bitmaps.sh : One test compares the case when packing with
   bitmaps to the case when packing without them. Since we disable the
   test variable when writing bitmaps, this causes a difference in the
   object list (the --path-walk option adds an extra object). Specify
   --no-path-walk in both processes for the comparison. Another test
   checks for a specific delta base, but when computing dynamically
   without using bitmaps, the base object it too small to be considered
   in the delta calculations so no base is used.

 - t5316-pack-delta-depth.sh : This script cares about certain delta
   choices and their chain lengths. The --path-walk option changes how
   these chains are selected, and thus changes the results of this test.

 - t5322-pack-objects-sparse.sh : This demonstrates the effectiveness of
   the --sparse option and how it combines with --path-walk.

 - t5332-multi-pack-reuse.sh : This test verifies that the preferred
   pack is used for delta reuse when possible. The --path-walk option is
   not currently aware of the preferred pack at all, so finds a
   different delta base.

 - t7406-submodule-update.sh : When using the variable, the --depth
   option collides with the --path-walk feature, resulting in a warning
   message. Disable the variable so this warning does not appear.

I want to call out one specific test change that is only temporary:

 - t5530-upload-pack-error.sh : One test cares specifically about an
   "unable to read" error message. Since the current implementation
   performs delta calculations within the path-walk API callback, a
   different "unable to get size" error message appears. When this
   is changed in a future refactoring, this test change can be reverted.

Signed-off-by: Derrick Stolee <[email protected]>
Since 'git pack-objects' supports a --path-walk option, allow passing it
through in 'git repack'. This presents interesting testing opportunities for
comparing the different repacking strategies against each other.

Add the --path-walk option to the performance tests in p5313.

For the microsoft/fluentui repo [1] checked out at a specific commit [2],
the results are very interesting:

Test                                           this tree
------------------------------------------------------------------
5313.2: thin pack                              0.40(0.47+0.04)
5313.3: thin pack size                                    1.2M
5313.4: thin pack with --full-name-hash        0.09(0.10+0.04)
5313.5: thin pack size with --full-name-hash             22.8K
5313.6: thin pack with --path-walk             0.08(0.06+0.02)
5313.7: thin pack size with --path-walk                  20.8K
5313.8: big pack                               2.16(8.43+0.23)
5313.9: big pack size                                    17.7M
5313.10: big pack with --full-name-hash        1.42(3.06+0.21)
5313.11: big pack size with --full-name-hash             18.0M
5313.12: big pack with --path-walk             2.21(8.39+0.24)
5313.13: big pack size with --path-walk                  17.8M
5313.14: repack                                98.05(662.37+2.64)
5313.15: repack size                                    449.1K
5313.16: repack with --full-name-hash          33.95(129.44+2.63)
5313.17: repack size with --full-name-hash              182.9K
5313.18: repack with --path-walk               106.21(121.58+0.82)
5313.19: repack size with --path-walk                   159.6K

[1] https://github.com/microsoft/fluentui
[2] e70848ebac1cd720875bccaa3026f4a9ed700e08

This repo suffers from having a lot of paths that collide in the name
hash, so examining them in groups by path leads to better deltas. Also,
in this case, the single-threaded implementation is competitive with the
full repack. This is saving time diffing files that have significant
differences from each other.

A similar, but private, repo has even more extremes in the thin packs:

Test                                           this tree
--------------------------------------------------------------
5313.2: thin pack                              2.39(2.91+0.10)
5313.3: thin pack size                                    4.5M
5313.4: thin pack with --full-name-hash        0.29(0.47+0.12)
5313.5: thin pack size with --full-name-hash             15.5K
5313.6: thin pack with --path-walk             0.35(0.31+0.04)
5313.7: thin pack size with --path-walk                  14.2K

Notice, however, that while the --full-name-hash version is working
quite well in these cases for the thin pack, it does poorly for some
other standard cases, such as this test on the Linux kernel repository:

Test                                           this tree
--------------------------------------------------------------
5313.2: thin pack                              0.01(0.00+0.00)
5313.3: thin pack size                                     310
5313.4: thin pack with --full-name-hash        0.00(0.00+0.00)
5313.5: thin pack size with --full-name-hash              1.4K
5313.6: thin pack with --path-walk             0.00(0.00+0.00)
5313.7: thin pack size with --path-walk                    310

Here, the --full-name-hash option does much worse than the default name
hash, but the path-walk option does exactly as well.

Signed-off-by: Derrick Stolee <[email protected]>
Users may want to enable the --path-walk option for 'git pack-objects' by
default, especially underneath commands like 'git push' or 'git repack'.

This should be limited to client repositories, since the --path-walk option
disables bitmap walks, so would be bad to include in Git servers when
serving fetches and clones. There is potential that it may be helpful to
consider when repacking the repository, to take advantage of improved deltas
across historical versions of the same files.

Much like how "pack.useSparse" was introduced and included in
"feature.experimental" before being enabled by default, use the repository
settings infrastructure to make the new "pack.usePathWalk" config enabled by
"feature.experimental" and "feature.manyFiles".

Signed-off-by: Derrick Stolee <[email protected]>
Repositories registered with Scalar are expected to be client-only
repositories that are rather large. This means that they are more likely to
be good candidates for using the --path-walk option when running 'git
pack-objects', especially under the hood of 'git push'. Enable this config
in Scalar repositories.

Signed-off-by: Derrick Stolee <[email protected]>
Previously, the --path-walk option to 'git pack-objects' would compute
deltas inline with the path-walk logic. This would make the progress
indicator look like it is taking a long time to enumerate objects, and
then very quickly computed deltas.

Instead of computing deltas on each region of objects organized by tree,
store a list of regions corresponding to these groups. These can later
be pulled from the list for delta compression before doing the "global"
delta search.

This presents a new progress indicator that can be used in tests to
verify that this stage is happening.

The current implementation is not integrated with threads, but could be
done in a future update.

Since we do not attempt to sort objects by size until after exploring
all trees, we can remove the previous change to t5530 due to a different
error message appearing first.

Signed-off-by: Derrick Stolee <[email protected]>
The winsock2 library provides functions that work on different data
types than file descriptors, therefore we wrap them.

But that is not the only difference: they also do not set `errno` but
expect the callers to enquire about errors via `WSAGetLastError()`.

Let's translate that into appropriate `errno` values whenever the socket
operations fail so that Git's code base does not have to change its
expectations.

This closes git-for-windows#2404

Helped-by: Jeff Hostetler <[email protected]>
Signed-off-by: Johannes Schindelin <[email protected]>
We map WSAGetLastError() errors to errno errors in winsock_error_to_errno(),
but the MSVC strerror() implementation only produces "Unknown error" for
most of them. Produce some more meaningful error messages in these
cases.

Our builds for ARM64 link against the newer UCRT strerror() that does know
these errors, so we won't change the strerror() used there.

The wording of the messages is copied from glibc strerror() messages.

Reported-by: M Hickford <[email protected]>
Signed-off-by: Matthias Aßhauer <[email protected]>
Signed-off-by: Johannes Schindelin <[email protected]>
This comment has been true for the longest time; The combination of the
two preceding commits made it incorrect, so let's drop that comment.

Signed-off-by: Matthias Aßhauer <[email protected]>
Signed-off-by: Johannes Schindelin <[email protected]>
Commit 2406bf5 (Win32: detect unix socket support at runtime,
2024-04-03) introduced a runtime detection for whether the operating
system supports unix sockets for Windows, but a mistake snuck into the
tests. When building and testing Git without NO_UNIX_SOCKETS we
currently skip t0301-credential-cache on Windows if unix sockets are
supported and run the tests if they aren't.

Flip that logic to actually work the way it was intended.

Signed-off-by: Matthias Aßhauer <[email protected]>
Signed-off-by: Johannes Schindelin <[email protected]>
In 245670c (credential-cache: check for windows specific errors, 2021-09-14)
we concluded that on Windows we would always encounter ENETDOWN where we
would expect ECONNREFUSED on POSIX systems, when connecting to unix sockets.
As reported in [1], we do encounter ECONNREFUSED on Windows if the
socket file doesn't exist, but the containing directory does and ENETDOWN if
neither exists. We should handle this case like we do on non-windows systems.

[1] git-for-windows#4762 (comment)

This fixes git-for-windows#5314

Helped-by: M Hickford <[email protected]>
Signed-off-by: Matthias Aßhauer <[email protected]>
Signed-off-by: Johannes Schindelin <[email protected]>
CreateFileW() requires FILE_FLAG_BACKUP_SEMANTICS to create a directory
handle [1] and errors out with ERROR_ACCESS_DENIED without this flag.
Fall back to accessing Directory handles this way.

[1] https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfilew#directories

This fixes git-for-windows#5068

Signed-off-by: Matthias Aßhauer <[email protected]>
Git for Windows wants to add `git.exe` to the users' `PATH`, without
cluttering the latter with unnecessary executables such as `wish.exe`.
To that end, it invented the concept of its "Git wrapper", i.e. a tiny
executable located in `C:\Program Files\Git\cmd\git.exe` (originally a
CMD script) whose sole purpose is to set up a couple of environment
variables and then spawn the _actual_ `git.exe` (which nowadays lives in
`C:\Program Files\Git\mingw64\bin\git.exe` for 64-bit, and the obvious
equivalent for 32-bit installations).

Currently, the following environment variables are set unless already
initialized:

- `MSYSTEM`, to make sure that the MSYS2 Bash and the MSYS2 Perl
  interpreter behave as expected, and

- `PLINK_PROTOCOL`, to force PuTTY's `plink.exe` to use the SSH
  protocol instead of Telnet,

- `PATH`, to make sure that the `bin` folder in the user's home
  directory, as well as the `/mingw64/bin` and the `/usr/bin`
  directories are included. The trick here is that the `/mingw64/bin/`
  and `/usr/bin/` directories are relative to the top-level installation
  directory of Git for Windows (which the included Bash interprets as
  `/`, i.e. as the MSYS pseudo root directory).

Using the absence of `MSYSTEM` as a tell-tale, we can detect in
`git.exe` whether these environment variables have been initialized
properly. Therefore we can call `C:\Program Files\Git\mingw64\bin\git`
in-place after this change, without having to call Git through the Git
wrapper.

Obviously, above-mentioned directories must be _prepended_ to the `PATH`
variable, otherwise we risk picking up executables from unrelated Git
installations. We do that by constructing the new `PATH` value from
scratch, appending `$HOME/bin` (if `HOME` is set), then the MSYS2 system
directories, and then appending the original `PATH`.

Side note: this modification of the `PATH` variable is independent of
the modification necessary to reach the executables and scripts in
`/mingw64/libexec/git-core/`, i.e. the `GIT_EXEC_PATH`. That
modification is still performed by Git, elsewhere, long after making the
changes described above.

While we _still_ cannot simply hard-link `mingw64\bin\git.exe` to `cmd`
(because the former depends on a couple of `.dll` files that are only in
`mingw64\bin`, i.e. calling `...\cmd\git.exe` would fail to load due to
missing dependencies), at least we can now avoid that extra process of
running the Git wrapper (which then has to wait for the spawned
`git.exe` to finish) by calling `...\mingw64\bin\git.exe` directly, via
its absolute path.

Testing this is in Git's test suite tricky: we set up a "new" MSYS
pseudo-root and copy the `git.exe` file into the appropriate location,
then verify that `MSYSTEM` is set properly, and also that the `PATH` is
modified so that scripts can be found in `$HOME/bin`, `/mingw64/bin/`
and `/usr/bin/`.

This addresses git-for-windows#2283

Signed-off-by: Johannes Schindelin <[email protected]>
shiftkey and others added 18 commits February 26, 2025 21:19
With improvements by Clive Chan, Adric Norris, Ben Bodenmiller and
Philip Oakley.

Helped-by: Clive Chan <[email protected]>
Helped-by: Adric Norris <[email protected]>
Helped-by: Ben Bodenmiller <[email protected]>
Helped-by: Philip Oakley <[email protected]>
Signed-off-by: Brendan Forster <[email protected]>
Signed-off-by: Johannes Schindelin <[email protected]>
Git for Windows accepts pull requests; Core Git does not. Therefore we
need to adjust the template (because it only matches core Git's
project management style, not ours).

Also: direct Git for Windows enhancements to their contributions page,
space out the text for easy reading, and clarify that the mailing list
is plain text, not HTML.

Signed-off-by: Philip Oakley <[email protected]>
Signed-off-by: Johannes Schindelin <[email protected]>
This is the recommended way on GitHub to describe policies revolving around
security issues and about supported versions.

Helped-by: Sven Strickroth <[email protected]>
Signed-off-by: Johannes Schindelin <[email protected]>
Signed-off-by: Johannes Schindelin <[email protected]>
This was pull request git-for-windows#1645 from ZCube/master

Support windows container.

Signed-off-by: Johannes Schindelin <[email protected]>
…ws#4527)

With this patch, Git for Windows works as intended on mounted APFS
volumes (where renaming read-only files would fail).

Signed-off-by: Johannes Schindelin <[email protected]>
Signed-off-by: Johannes Schindelin <[email protected]>
This patch introduces support to set special NTFS attributes that are
interpreted by the Windows Subsystem for Linux as file mode bits, UID
and GID.

Signed-off-by: Johannes Schindelin <[email protected]>
Handle Ctrl+C in Git Bash nicely

Signed-off-by: Johannes Schindelin <[email protected]>
A fix for calling `vim` in Windows Terminal caused a regression and was
reverted. We partially un-revert this, to get the fix again.

Signed-off-by: Johannes Schindelin <[email protected]>
This topic branch re-adds the deprecated --stdin/-z options to `git
reset`. Those patches were overridden by a different set of options in
the upstream Git project before we could propose `--stdin`.

We offered this in MinGit to applications that wanted a safer way to
pass lots of pathspecs to Git, and these applications will need to be
adjusted.

Instead of `--stdin`, `--pathspec-from-file=-` should be used, and
instead of `-z`, `--pathspec-file-nul`.

Signed-off-by: Johannes Schindelin <[email protected]>
Originally introduced as `core.useBuiltinFSMonitor` in Git for Windows
and developed, improved and stabilized there, the built-in FSMonitor
only made it into upstream Git (after unnecessarily long hemming and
hawing and throwing overly perfectionist style review sticks into the
spokes) as `core.fsmonitor = true`.

In Git for Windows, with this topic branch, we re-introduce the
now-obsolete config setting, with warnings suggesting to existing users
how to switch to the new config setting, with the intention to
ultimately drop the patch at some stage.

Signed-off-by: Johannes Schindelin <[email protected]>
…updates

Start monitoring updates of Git for Windows' component in the open
Add a README.md for GitHub goodness.

Signed-off-by: Johannes Schindelin <[email protected]>
@dscho dscho added this to the Next release milestone Feb 26, 2025
@dscho dscho self-assigned this Feb 26, 2025
@dscho
Copy link
Member Author

dscho commented Feb 26, 2025

Range-diff relative to
  • 1: 17ae787 = 1: 0572f1b sideband: mask control characters

  • 2: 976299b ! 2: 3a4d9e2 sideband: introduce an "escape hatch" to allow control characters

    @@ Commit message
     
         Signed-off-by: Johannes Schindelin <[email protected]>
     
    - ## Documentation/config.txt ##
    -@@ Documentation/config.txt: include::config/sequencer.txt[]
    + ## Documentation/config.adoc ##
    +@@ Documentation/config.adoc: include::config/sequencer.adoc[]
      
    - include::config/showbranch.txt[]
    + include::config/showbranch.adoc[]
      
    -+include::config/sideband.txt[]
    ++include::config/sideband.adoc[]
     +
    - include::config/sparse.txt[]
    + include::config/sparse.adoc[]
      
    - include::config/splitindex.txt[]
    + include::config/splitindex.adoc[]
     
    - ## Documentation/config/sideband.txt (new) ##
    + ## Documentation/config/sideband.adoc (new) ##
     @@
     +sideband.allowControlCharacters::
     +	By default, control characters that are delivered via the sideband
  • 3: 65896a3 ! 3: a4312f2 sideband: do allow ANSI color sequences by default

    @@ Commit message
     
         Signed-off-by: Johannes Schindelin <[email protected]>
     
    - ## Documentation/config/sideband.txt ##
    + ## Documentation/config/sideband.adoc ##
     @@
      sideband.allowControlCharacters::
      	By default, control characters that are delivered via the sideband
  • 4: 63cab6a = 4: 536adb3 unix-socket: avoid leak when initialization fails

  • 5: 495ab70 (upstream: 8d24d56) < -: ------------ test-lib: invert return value of check_test_results_san_file_empty

  • 6: 75dde95 (upstream: b9a9df9) < -: ------------ test-lib: simplify lsan results check

  • 7: ec65acf (upstream: 164a251) < -: ------------ test-lib: add a few comments to LSan log checking

  • 8: ab2a205 (upstream: 2105064) < -: ------------ bswap.h: squelch potential sparse -Wcast-truncate warnings

  • 9: 6abb17c (upstream: 0ad3d65) < -: ------------ object-file: fix race in object collision check

  • 10: 2dbdf2c (upstream: 798e0f4) < -: ------------ packfile: factor out --pack_header argument parsing

  • 11: 5e1d9aa (upstream: c1acf1a) < -: ------------ object-file: rename variables in check_collision()

  • 12: 5285cdc (upstream: 4f02f4d) < -: ------------ parse_pack_header_option(): avoid unaligned memory writes

  • 13: cec3ebb (upstream: cfae50e) < -: ------------ object-file: don't special-case missing source file in collision check

  • 14: 16be54a (upstream: f1299bf) < -: ------------ index-pack, unpack-objects: use get_be32() for reading pack header

  • 15: a6aca32 (upstream: d7fcbe2) < -: ------------ object-file: retry linking file into place when occluding file vanishes

  • 16: dae2c5e (upstream: 9804659) < -: ------------ index-pack, unpack-objects: use skip_prefix to avoid magic number

  • 17: 8ba42f1 (upstream: bc67b4a) < -: ------------ reftable: write correct max_update_index to header

  • 18: 62a5707 (upstream: af47976) < -: ------------ refs: mark ref_transaction_update_reflog() as static

  • 19: 5a88867 (upstream: 71e19a0) < -: ------------ object-name: fix resolution of object names containing curly braces

  • 20: 80d74ed (upstream: e7c1b9f) < -: ------------ refs: use 'uint64_t' for 'ref_update.index'

  • 21: 5aeb1e4 (upstream: 191f0c8) < -: ------------ object-name: be more strict in parsing describe-like output

  • 22: 2b08618 (upstream: 017bd89) < -: ------------ reftable: prevent 'update_index' changes after adding records

  • 23: 8849ac4 (upstream: 5e58db6) < -: ------------ ref-filter: move ahead-behind bases into used_atom

  • 24: 2fbabb9 (upstream: 7ee4fd1) < -: ------------ ref-filter: move is-base tip to used_atom

  • 25: 135a432 (upstream: c5490ce) < -: ------------ ref-filter: remove ref_format_clear()

  • 26: c4c6f21 (upstream: 93dc164) < -: ------------ fetch set_head: fix non-mirror remotes in bare repositories

  • 27: 3e20693 (upstream: 49edce4) < -: ------------ show-index: the short help should say the command reads from its input

  • 28: f40199f (upstream: 0b43274) < -: ------------ credential-cache: respect authtype capability

  • 29: 299435c (upstream: 2fd367c) < -: ------------ trace2: prevent segfault on config collection where no value specified

  • 30: a2e7060 = 5: 76908af grep: prevent ^$ false match at end of file

  • 31: 51354d1 (upstream: 3519492) < -: ------------ update-ref: do set reflog's old_oid

  • 32: df6fb8e = 6: 3194bd8 ci: stop linking the prove cache

  • 33: a8339b0 = 7: 35785c5 contrib/buildsystems: drop support for building .vcproj/.vcxproj files

  • 34: e74c948 = 8: 76a9131 config.mak.uname: drop the vcxproj target

  • 35: f9b4cc2 < -: ------------ ci: adjust Azure Pipeline for runs_on_pool

  • 36: 5bedadd (upstream: 4cbe9e0) < -: ------------ gitk(Windows): avoid inadvertently calling executables in the worktree

  • 44: 8526281 = 9: f3ec8bf mingw: include the Python parts in the build

  • 37: aa7251e = 10: 0a4a134 t9350: point out that refs are not updated correctly

  • 45: df7888f = 11: 83f306a win32/pthread: avoid name clashes with winpthread

  • 38: 479f8b6 = 12: bc076a6 transport-helper: add trailing --

  • 46: eea7e46 = 13: e7561ff git-compat-util: avoid redeclaring _DEFAULT_SOURCE

  • 39: d0dea2b = 14: 5888ba2 remote-helper: check helper status after import/export

  • 40: 40d86da = 15: e9f5731 mingw: demonstrate a problem with certain absolute paths

  • 41: 63af78b = 16: 6f7c423 clean: do not traverse mount points

  • 47: eb1cd4d = 17: 97821a5 Import the source code of mimalloc v2.1.2

  • 42: e693db1 = 18: f6e97ea Always auto-gc after calling a fast-import transport

  • 43: b39b0a5 = 19: 1281c30 mingw: allow absolute paths without drive prefix

  • 48: 1b1d970 = 20: c58a75a clean: remove mount points when possible

  • 49: 3952c00 = 21: 03de59f mimalloc: adjust for building inside Git

  • 50: 27712a7 = 22: dec6a0f mimalloc: offer a build-time option to enable it

  • 51: 3bce96c = 23: 8732346 mimalloc: use "weak" random seed when statically linked

  • 52: fc7f8f8 = 24: 68de996 mingw: use mimalloc

  • 53: d59c78d ! 25: ce60124 transport: optionally disable side-band-64k

    @@ Commit message
         Signed-off-by: Oliver Schneider <[email protected]>
         Signed-off-by: Johannes Schindelin <[email protected]>
     
    - ## Documentation/config.txt ##
    -@@ Documentation/config.txt: include::config/safe.txt[]
    + ## Documentation/config.adoc ##
    +@@ Documentation/config.adoc: include::config/safe.adoc[]
      
    - include::config/sendemail.txt[]
    + include::config/sendemail.adoc[]
      
    -+include::config/sendpack.txt[]
    ++include::config/sendpack.adoc[]
     +
    - include::config/sequencer.txt[]
    + include::config/sequencer.adoc[]
      
    - include::config/showbranch.txt[]
    + include::config/showbranch.adoc[]
     
    - ## Documentation/config/sendpack.txt (new) ##
    + ## Documentation/config/sendpack.adoc (new) ##
     @@
     +sendpack.sideband::
     +	Allows to disable the side-band-64k capability for send-pack even
    @@ Documentation/config/sendpack.txt (new)
     +	with the dump git protocol. Defaults to true.
     
      ## send-pack.c ##
    -@@ send-pack.c: int send_pack(struct send_pack_args *args,
    +@@ send-pack.c: int send_pack(struct repository *r,
      	int need_pack_data = 0;
      	int allow_deleting_refs = 0;
      	int status_report = 0;
    @@ send-pack.c: int send_pack(struct send_pack_args *args,
      	int quiet_supported = 0;
      	int agent_supported = 0;
      	int advertise_sid = 0;
    -@@ send-pack.c: int send_pack(struct send_pack_args *args,
    +@@ send-pack.c: int send_pack(struct repository *r,
      		goto out;
      	}
      
    -+	git_config_get_bool("sendpack.sideband", &use_sideband);
    - 	git_config_get_bool("push.negotiate", &push_negotiate);
    ++	repo_config_get_bool(r, "sendpack.sideband", &use_sideband);
    + 	repo_config_get_bool(r, "push.negotiate", &push_negotiate);
      	if (push_negotiate) {
    - 		trace2_region_enter("send_pack", "push_negotiate", the_repository);
    -@@ send-pack.c: int send_pack(struct send_pack_args *args,
    + 		trace2_region_enter("send_pack", "push_negotiate", r);
    +@@ send-pack.c: int send_pack(struct repository *r,
      		allow_deleting_refs = 1;
      	if (server_supports("ofs-delta"))
      		args->use_ofs_delta = 1;
  • 54: 87aca61 = 26: 6cce503 mingw: do resolve symlinks in getcwd()

  • 60: ca6841c = 27: 5cb68b6 mingw: fix fatal error working on mapped network drives on Windows

  • 61: 2e17892 = 28: bbf8d2e clink.pl: fix MSVC compile script to handle libcurl-d.lib

  • 56: 78d0bec = 29: 135d45a mingw: demonstrate a git add issue with NTFS junctions

  • 63: 9d1485e ! 30: 359f777 t5505/t5516: allow running without .git/branches/ in the templates

    @@ Commit message
         Signed-off-by: Johannes Schindelin <[email protected]>
     
      ## t/t5505-remote.sh ##
    -@@ t/t5505-remote.sh: test_expect_success 'migrate a remote from named file in $GIT_DIR/branches' '
    +@@ t/t5505-remote.sh: test_expect_success WITHOUT_BREAKING_CHANGES 'migrate a remote from named file i
      	(
      		cd six &&
      		git remote rm origin &&
    @@ t/t5505-remote.sh: test_expect_success 'migrate a remote from named file in $GIT
      		echo "$origin_url#main" >.git/branches/origin &&
      		git remote rename origin origin &&
      		test_path_is_missing .git/branches/origin &&
    -@@ t/t5505-remote.sh: test_expect_success 'migrate a remote from named file in $GIT_DIR/branches (2)'
    +@@ t/t5505-remote.sh: test_expect_success WITHOUT_BREAKING_CHANGES 'migrate a remote from named file i
      	(
      		cd seven &&
      		git remote rm origin &&
    @@ t/t5505-remote.sh: test_expect_success 'migrate a remote from named file in $GIT
      		test_path_is_missing .git/branches/origin &&
     
      ## t/t5516-fetch-push.sh ##
    -@@ t/t5516-fetch-push.sh: test_expect_success 'fetch with branches' '
    +@@ t/t5516-fetch-push.sh: test_expect_success WITHOUT_BREAKING_CHANGES 'fetch with branches' '
      	mk_empty testrepo &&
      	git branch second $the_first_commit &&
      	git checkout second &&
    @@ t/t5516-fetch-push.sh: test_expect_success 'fetch with branches' '
      	echo ".." > testrepo/.git/branches/branch1 &&
      	(
      		cd testrepo &&
    -@@ t/t5516-fetch-push.sh: test_expect_success 'fetch with branches' '
    +@@ t/t5516-fetch-push.sh: test_expect_success WITHOUT_BREAKING_CHANGES 'fetch with branches' '
      
    - test_expect_success 'fetch with branches containing #' '
    + test_expect_success WITHOUT_BREAKING_CHANGES 'fetch with branches containing #' '
      	mk_empty testrepo &&
     -	mkdir testrepo/.git/branches &&
     +	mkdir -p testrepo/.git/branches &&
      	echo "..#second" > testrepo/.git/branches/branch2 &&
      	(
      		cd testrepo &&
    -@@ t/t5516-fetch-push.sh: test_expect_success 'push with branches' '
    +@@ t/t5516-fetch-push.sh: test_expect_success WITHOUT_BREAKING_CHANGES 'push with branches' '
      	git checkout second &&
      
      	test_when_finished "rm -rf .git/branches" &&
    @@ t/t5516-fetch-push.sh: test_expect_success 'push with branches' '
      	echo "testrepo" > .git/branches/branch1 &&
      
      	git push branch1 &&
    -@@ t/t5516-fetch-push.sh: test_expect_success 'push with branches containing #' '
    +@@ t/t5516-fetch-push.sh: test_expect_success WITHOUT_BREAKING_CHANGES 'push with branches containing #' '
      	mk_empty testrepo &&
      
      	test_when_finished "rm -rf .git/branches" &&
  • 58: 84c2c79 = 31: 0b962b1 strbuf_realpath(): use platform-dependent API if available

  • 65: 8cc8048 ! 32: 4891129 http: use new "best effort" strategy for Secure Channel revoke checking

    @@ Commit message
     
         Signed-off-by: Johannes Schindelin <[email protected]>
     
    - ## Documentation/config/http.txt ##
    -@@ Documentation/config/http.txt: http.sslBackend::
    + ## Documentation/config/http.adoc ##
    +@@ Documentation/config/http.adoc: http.sslKeyType::
      
      http.schannelCheckRevoke::
      	Used to enforce or disable certificate revocation checks in cURL
  • 55: 317e4b4 = 33: fc8858a mingw: ensure valid CTYPE

  • 64: 49b452c ! 34: 7e71c08 t5505/t5516: fix white-space around redirectors

    @@ t/t5505-remote.sh: test_expect_success '"remote show" does not show symbolic ref
      	)
      '
      
    -@@ t/t5505-remote.sh: test_expect_success 'migrate a remote from named file in $GIT_DIR/branches (2)'
    +@@ t/t5505-remote.sh: test_expect_success WITHOUT_BREAKING_CHANGES 'migrate a remote from named file i
      		cd seven &&
      		git remote rm origin &&
      		mkdir -p .git/branches &&
    @@ t/t5505-remote.sh: test_expect_success 'migrate a remote from named file in $GIT
      		test "$(git config remote.origin.url)" = "quux" &&
     
      ## t/t5516-fetch-push.sh ##
    -@@ t/t5516-fetch-push.sh: test_expect_success 'fetch with branches' '
    +@@ t/t5516-fetch-push.sh: test_expect_success WITHOUT_BREAKING_CHANGES 'fetch with branches' '
      	git branch second $the_first_commit &&
      	git checkout second &&
      	mkdir -p testrepo/.git/branches &&
    @@ t/t5516-fetch-push.sh: test_expect_success 'fetch with branches' '
      	(
      		cd testrepo &&
      		git fetch branch1 &&
    -@@ t/t5516-fetch-push.sh: test_expect_success 'fetch with branches' '
    - test_expect_success 'fetch with branches containing #' '
    +@@ t/t5516-fetch-push.sh: test_expect_success WITHOUT_BREAKING_CHANGES 'fetch with branches' '
    + test_expect_success WITHOUT_BREAKING_CHANGES 'fetch with branches containing #' '
      	mk_empty testrepo &&
      	mkdir -p testrepo/.git/branches &&
     -	echo "..#second" > testrepo/.git/branches/branch2 &&
    @@ t/t5516-fetch-push.sh: test_expect_success 'fetch with branches' '
      	(
      		cd testrepo &&
      		git fetch branch2 &&
    -@@ t/t5516-fetch-push.sh: test_expect_success 'push with branches' '
    +@@ t/t5516-fetch-push.sh: test_expect_success WITHOUT_BREAKING_CHANGES 'push with branches' '
      
      	test_when_finished "rm -rf .git/branches" &&
      	mkdir -p .git/branches &&
    @@ t/t5516-fetch-push.sh: test_expect_success 'push with branches' '
      
      	git push branch1 &&
      	(
    -@@ t/t5516-fetch-push.sh: test_expect_success 'push with branches containing #' '
    +@@ t/t5516-fetch-push.sh: test_expect_success WITHOUT_BREAKING_CHANGES 'push with branches containing #' '
      
      	test_when_finished "rm -rf .git/branches" &&
      	mkdir -p .git/branches &&
  • 62: da40ce6 = 35: 19205cd mingw: implement a platform-specific strbuf_realpath()

  • 66: fd3c3fa = 36: a298d78 t3701: verify that we can add lots of files interactively

  • 67: 28d17c2 = 37: 31345fa git add -i: handle CR/LF line endings in the interactive input

  • 68: 8c1e12c = 38: 097e956 commit: accept "scissors" with CR/LF line endings

  • 69: 222b837 = 39: 73380d6 t0014: fix indentation

  • 70: 95c5172 = 40: dfec563 git-gui: accommodate for intent-to-add files

  • 78: 6213778 = 41: 55bcb60 vcpkg_install: detect lack of Git

  • 79: 8809b24 = 42: 8f62f63 vcpkg_install: add comment regarding slow network connections

  • 80: 460c3f4 = 43: 86c0949 vcbuild: install ARM64 dependencies when building ARM64 binaries

  • 81: 3a442eb = 44: a53ed53 vcbuild: add an option to install individual 'features'

  • 82: 2dfcd30 ! 45: e567bc2 cmake: allow building for Windows/ARM64

    @@ contrib/buildsystems/CMakeLists.txt: if(USE_VCPKG)
      
      	# In the vcpkg edition, we need this to be able to link to libcurl
      	set(CURL_NO_CURL_CMAKE ON)
    -@@ contrib/buildsystems/CMakeLists.txt: string(REPLACE "@USE_GETTEXT_SCHEME@" "" git_build_options "${git_build_options}
    - string(REPLACE "@USE_LIBPCRE2@" "" git_build_options "${git_build_options}")
    +@@ contrib/buildsystems/CMakeLists.txt: string(REPLACE "@USE_LIBPCRE2@" "" git_build_options "${git_build_options}")
    + string(REPLACE "@WITH_BREAKING_CHANGES@" "" git_build_options "${git_build_options}")
      string(REPLACE "@X@" "${EXE_EXTENSION}" git_build_options "${git_build_options}")
      if(USE_VCPKG)
     -	string(APPEND git_build_options "PATH=\"$PATH:$TEST_DIRECTORY/../compat/vcbuild/vcpkg/installed/x64-windows/bin\"\n")
  • 83: 1f64d1f = 46: 358921e ci(vs-build) also build Windows/ARM64 artifacts

  • 84: d95a8ea = 47: fb40e04 Add schannel to curl installation

  • 85: ccaf175 = 48: 201a9cd cmake(): allow setting HOST_CPU for cross-compilation

  • 91: 627aa8a = 49: d0504d3 subtree: update contrib/subtree test target

  • 89: af3af55 = 50: 46eebbd CMake: default Visual Studio generator has changed

  • 86: 7358760 = 51: dd3d62d mingw: allow for longer paths in parse_interpreter()

  • 87: bdd45c4 = 52: 09ae98f compat/vcbuild: document preferred way to build in Visual Studio

  • 88: 3d2196d ! 53: 335921c http: optionally send SSL client certificate

    @@ Commit message
     
         Signed-off-by: Pascal Muller <[email protected]>
     
    - ## Documentation/config/http.txt ##
    -@@ Documentation/config/http.txt: http.schannelUseSSLCAInfo::
    + ## Documentation/config/http.adoc ##
    +@@ Documentation/config/http.adoc: http.schannelUseSSLCAInfo::
      	when the `schannel` backend was configured via `http.sslBackend`,
      	unless `http.schannelUseSSLCAInfo` overrides this behavior.
      
  • 93: acaa42e = 54: c223c71 ci: run contrib/subtree tests in CI builds

  • 90: ee51d5f ! 55: 79901bf .gitignore: add Visual Studio CMakeSetting.json file

    @@ .gitignore: Release/
      *.dSYM
      /contrib/buildsystems/out
     +CMakeSettings.json
    + /contrib/libgit-rs/target
    + /contrib/libgit-sys/target
  • 92: cded29a = 56: 38a02a1 CMakeLists: add default "x64-windows" arch for Visual Studio

  • 94: 75dc17d = 57: 68515b3 CMake: show Win32 and Generator_platform build-option values

  • 95: 93cb699 = 58: 5e4ba09 hash-object: demonstrate a >4GB/LLP64 problem

  • 96: 375bfa7 = 59: 7c22e20 write_object_file_literally(): use size_t

  • 97: afc175f ! 60: 800c9f6 object-file.c: use size_t for header lengths

    @@ Commit message
     
      ## object-file.c ##
     @@ object-file.c: void *read_object_with_reference(struct repository *r,
    - static void hash_object_body(const struct git_hash_algo *algo, git_hash_ctx *c,
    + static void hash_object_body(const struct git_hash_algo *algo, struct git_hash_ctx *c,
      			     const void *buf, unsigned long len,
      			     struct object_id *oid,
     -			     char *hdr, int *hdrlen)
     +			     char *hdr, size_t *hdrlen)
      {
      	algo->init_fn(c);
    - 	algo->update_fn(c, hdr, *hdrlen);
    -@@ object-file.c: static void hash_object_body(const struct git_hash_algo *algo, git_hash_ctx *c,
    + 	git_hash_update(c, hdr, *hdrlen);
    +@@ object-file.c: static void hash_object_body(const struct git_hash_algo *algo, struct git_hash_c
      }
      
      static void write_object_file_prepare(const struct git_hash_algo *algo,
    @@ object-file.c: static void hash_object_body(const struct git_hash_algo *algo, gi
     -				      char *hdr, int *hdrlen)
     +				      char *hdr, size_t *hdrlen)
      {
    - 	git_hash_ctx c;
    + 	struct git_hash_ctx c;
      
     @@ object-file.c: static void write_object_file_prepare(const struct git_hash_algo *algo,
      static void write_object_file_prepare_literally(const struct git_hash_algo *algo,
    @@ object-file.c: static void write_object_file_prepare(const struct git_hash_algo
     -				      char *hdr, int *hdrlen)
     +				      char *hdr, size_t *hdrlen)
      {
    - 	git_hash_ctx c;
    + 	struct git_hash_ctx c;
      
     @@ object-file.c: int finalize_object_file_flags(const char *tmpfile, const char *filename,
      }
  • 101: f036563 = 61: b528a39 init: do parse all core.* settings early

  • 98: 5ce17ed ! 62: dd2b8a2 hash algorithms: use size_t for section lengths

    @@ object-file.c
     @@ object-file.c: void *read_object_with_reference(struct repository *r,
      }
      
    - static void hash_object_body(const struct git_hash_algo *algo, git_hash_ctx *c,
    + static void hash_object_body(const struct git_hash_algo *algo, struct git_hash_ctx *c,
     -			     const void *buf, unsigned long len,
     +			     const void *buf, size_t len,
      			     struct object_id *oid,
  • 99: 347983c = 63: 1c8a74d hash-object --stdin: verify that it works with >4GB/LLP64

  • 100: 1c6a355 = 64: c6a57c8 hash-object: add another >4GB/LLP64 test case

  • 103: b1d2fea = 65: 04cf745 setup: properly use "%(prefix)/" when in WSL

  • 102: 72c5430 = 66: 66df4ae hash-object: add a >4GB/LLP64 test case using filtered input

  • 105: fa5ad7e = 67: 5a5041b compat/mingw.c: do not warn when failing to get owner

  • 106: 144cf12 = 68: b30ebe9 mingw: $env:TERM="xterm-256color" for newer OSes

  • 107: 6a242b2 = 69: 32dc745 winansi: check result and Buffer before using Name

  • 104: 1864fbc ! 70: 9a99146 Add config option windows.appendAtomically

    @@ Commit message
         Signed-off-by: 孙卓识 <[email protected]>
         Signed-off-by: Johannes Schindelin <[email protected]>
     
    - ## Documentation/config.txt ##
    -@@ Documentation/config.txt: include::config/versionsort.txt[]
    + ## Documentation/config.adoc ##
    +@@ Documentation/config.adoc: include::config/versionsort.adoc[]
      
    - include::config/web.txt[]
    + include::config/web.adoc[]
      
    -+include::config/windows.txt[]
    ++include::config/windows.adoc[]
     +
    - include::config/worktree.txt[]
    + include::config/worktree.adoc[]
     
    - ## Documentation/config/windows.txt (new) ##
    + ## Documentation/config/windows.adoc (new) ##
     @@
     +windows.appendAtomically::
     +	By default, append atomic API is used on windows. But it works only with
  • 110: 4e87e48 = 71: 41206aa MinGW: link as terminal server aware

  • 108: 671491d = 72: 9d1da75 mingw: change core.fsyncObjectFiles = 1 by default

  • 111: 01595ac = 73: 62ffc3c Fix Windows version resources

  • 109: 754b5f5 = 74: d3c2bcb bswap.h: add support for built-in bswap functions

  • 113: 02c73f4 = 75: d9ebd09 status: fix for old-style submodules with commondir

  • 115: 622a259 = 76: fc3c59d http: optionally load libcurl lazily

  • 116: 6ffa94a = 77: 3c5e58d http: support lazy-loading libcurl also on Windows

  • 117: 7047ac4 = 78: 16991b7 http: when loading libcurl lazily, allow for multiple SSL backends

  • 118: fd3a261 = 79: f9a02e6 windows: fix Repository>Explore Working Copy

  • 119: e40203b = 80: d334fb7 mingw: do load libcurl dynamically by default

  • 120: bcdcf4d = 81: d151148 Add a GitHub workflow to verify that Git/Scalar work in Nano Server

  • 121: 85f3301 = 82: 0f7d050 mingw: suggest windows.appendAtomically in more cases

  • 122: 22b0373 = 83: e581859 win32: use native ANSI sequence processing, if possible

  • 124: 12bc2c6 ! 84: fc9081b common-main.c: fflush stdout buffer upon exit

    @@ Commit message
         Signed-off-by: MinarKotonoha <[email protected]>
         Signed-off-by: Johannes Schindelin <[email protected]>
     
    - ## common-main.c ##
    -@@ common-main.c: static void check_bug_if_BUG(void)
    + ## common-exit.c ##
    +@@ common-exit.c: static void check_bug_if_BUG(void)
      /* We wrap exit() to call common_exit() in git-compat-util.h */
      int common_exit(const char *file, int line, int code)
      {
  • 126: f5776d0 = 85: ae91f94 ci: work around a problem with HTTP/2 vs libcurl v8.10.0

  • 125: 0829b69 = 86: 0b0bc82 t5601/t7406(mingw): do run tests with symlink support

  • 130: a87eeab = 87: 86050de win32: ensure that localtime_r() is declared even in i686 builds

  • 131: c9730ea = 88: bf0b47b Fallback to AppData if XDG_CONFIG_HOME is unset

  • 132: 251ca71 = 89: 973e4ae run-command: be helpful with Git LFS fails on Windows 7

  • 141: a3e36a1 = 90: a313305 revision: create mark_trees_uninteresting_dense()

  • 143: 812b057 = 91: 2ebf073 pack-objects: extract should_attempt_deltas()

  • 144: 6b5c2b8 ! 92: 7f4a2a2 pack-objects: add --path-walk option

    @@ Commit message
     
         Signed-off-by: Derrick Stolee <[email protected]>
     
    - ## Documentation/git-pack-objects.txt ##
    -@@ Documentation/git-pack-objects.txt: SYNOPSIS
    + ## Documentation/git-pack-objects.adoc ##
    +@@ Documentation/git-pack-objects.adoc: SYNOPSIS
      	[--cruft] [--cruft-expiration=<time>]
      	[--stdout [--filter=<filter-spec>] | <base-name>]
      	[--shallow] [--keep-true-parents] [--[no-]sparse]
    --	[--full-name-hash] < <object-list>
    -+	[--full-name-hash] [--path-walk] < <object-list>
    +-	[--name-hash-version=<n>] < <object-list>
    ++	[--name-hash-version=<n>] [--path-walk] < <object-list>
      
      
      DESCRIPTION
    -@@ Documentation/git-pack-objects.txt: raise an error.
    - 	Restrict delta matches based on "islands". See DELTA ISLANDS
    - 	below.
    +@@ Documentation/git-pack-objects.adoc: many different directories. At the moment, this version is not allowed
    + when writing reachability bitmap files with `--write-bitmap-index` and it
    + will be automatically changed to version `1`.
      
     +--path-walk::
     +	By default, `git pack-objects` walks objects in an order that
    @@ Documentation/git-pack-objects.txt: raise an error.
      DELTA ISLANDS
      -------------
     
    - ## Documentation/technical/api-path-walk.txt ##
    -@@ Documentation/technical/api-path-walk.txt: Examples
    - --------
    - 
    + ## Documentation/technical/api-path-walk.adoc ##
    +@@ Documentation/technical/api-path-walk.adoc: Examples
      See example usages in:
    --	`t/helper/test-path-walk.c`
    -+	`t/helper/test-path-walk.c`,
    + 	`t/helper/test-path-walk.c`,
    + 	`builtin/backfill.c`
     +	`builtin/pack-objects.c`
     
      ## builtin/pack-objects.c ##
    @@ builtin/pack-objects.c: int cmd_pack_objects(int argc,
      				? "--objects-edge-aggressive"
     
      ## t/t5300-pack-object.sh ##
    -@@ t/t5300-pack-object.sh: test_expect_success '--full-name-hash and --write-bitmap-index are incompatible'
    - 	git pack-objects --stdout --all --full-name-hash --write-bitmap-index >out
    +@@ t/t5300-pack-object.sh: test_expect_success '--name-hash-version=2 and --write-bitmap-index are incompat
    + 	! test_grep "currently, --write-bitmap-index requires --name-hash-version=1" err
      '
      
     +# Basic "repack everything" test
  • 145: 4a512b0 ! 93: 4f0c435 pack-objects: introduce GIT_TEST_PACK_PATH_WALK

    @@ builtin/pack-objects.c: int cmd_pack_objects(int argc,
     
      ## ci/run-build-and-tests.sh ##
     @@ ci/run-build-and-tests.sh: linux-TEST-vars)
    + 	export GIT_TEST_NO_WRITE_REV_INDEX=1
      	export GIT_TEST_CHECKOUT_WORKERS=2
      	export GIT_TEST_PACK_USE_BITMAP_BOUNDARY_TRAVERSAL=1
    - 	export GIT_TEST_FULL_NAME_HASH=1
     +	export GIT_TEST_PACK_PATH_WALK=1
      	;;
      linux-clang)
    @@ t/t5530-upload-pack-error.sh: test_expect_success 'upload-pack fails due to erro
     
      ## t/t7406-submodule-update.sh ##
     @@ t/t7406-submodule-update.sh: test_expect_success 'submodule update --quiet passes quietness to fetch with a s
    - 	) &&
      	git clone super4 super5 &&
      	(cd super5 &&
    -+	 # This test variable will create a "warning" message to stderr
    + 	 # This test var can mess with the stderr output checked in this test.
     +	 GIT_TEST_PACK_PATH_WALK=0 \
    - 	 git submodule update --quiet --init --depth=1 submodule3 >out 2>err &&
    + 	 GIT_TEST_NAME_HASH_VERSION=1 \
    + 		git submodule update --quiet --init --depth=1 submodule3 >out 2>err &&
      	 test_must_be_empty out &&
    - 	 test_must_be_empty err
    +@@ t/t7406-submodule-update.sh: test_expect_success 'submodule update --quiet passes quietness to fetch with a s
      	) &&
      	git clone super4 super6 &&
      	(cd super6 &&
  • 146: 4332687 ! 94: 95807d5 repack: add --path-walk option

    @@ Commit message
     
         Signed-off-by: Derrick Stolee <[email protected]>
     
    - ## Documentation/git-repack.txt ##
    -@@ Documentation/git-repack.txt: SYNOPSIS
    + ## Documentation/git-repack.adoc ##
    +@@ Documentation/git-repack.adoc: SYNOPSIS
      [verse]
      'git repack' [-a] [-A] [-d] [-f] [-F] [-l] [-n] [-q] [-b] [-m]
      	[--window=<n>] [--depth=<n>] [--threads=<n>] [--keep-pack=<pack-name>]
    --	[--write-midx] [--full-name-hash]
    -+	[--write-midx] [--full-name-hash] [--path-walk]
    +-	[--write-midx] [--name-hash-version=<n>]
    ++	[--write-midx] [--name-hash-version=<n>] [--path-walk]
      
      DESCRIPTION
      -----------
    -@@ Documentation/git-repack.txt: linkgit:git-multi-pack-index[1]).
    - 	Write a multi-pack index (see linkgit:git-multi-pack-index[1])
    - 	containing the non-redundant packs.
    +@@ Documentation/git-repack.adoc: linkgit:git-multi-pack-index[1]).
    + 	Provide this argument to the underlying `git pack-objects` process.
    + 	See linkgit:git-pack-objects[1] for full details.
      
     +--path-walk::
     +	This option passes the `--path-walk` option to the underlying
    @@ Documentation/git-repack.txt: linkgit:git-multi-pack-index[1]).
     +	Git's default name-hash algorithm. Due to changing how the objects
     +	are walked, this option is not compatible with `--delta-islands`
     +	or `--filter`.
    -+
    + 
      CONFIGURATION
      -------------
    - 
     
      ## builtin/repack.c ##
     @@ builtin/repack.c: static char *packdir, *packtmp_name, *packtmp;
      static const char *const git_repack_usage[] = {
      	N_("git repack [-a] [-A] [-d] [-f] [-F] [-l] [-n] [-q] [-b] [-m]\n"
      	   "[--window=<n>] [--depth=<n>] [--threads=<n>] [--keep-pack=<pack-name>]\n"
    --	   "[--write-midx] [--full-name-hash]"),
    -+	   "[--write-midx] [--full-name-hash] [--path-walk]"),
    +-	   "[--write-midx] [--name-hash-version=<n>]"),
    ++	   "[--write-midx] [--name-hash-version=<n>] [--path-walk]"),
      	NULL
      };
      
     @@ builtin/repack.c: struct pack_objects_args {
      	int quiet;
      	int local;
    - 	int full_name_hash;
    + 	int name_hash_version;
     +	int path_walk;
      	struct list_objects_filter_options filter_options;
      };
      
     @@ builtin/repack.c: static void prepare_pack_objects(struct child_process *cmd,
      		strvec_pushf(&cmd->args, "--no-reuse-object");
    - 	if (args->full_name_hash)
    - 		strvec_pushf(&cmd->args, "--full-name-hash");
    + 	if (args->name_hash_version)
    + 		strvec_pushf(&cmd->args, "--name-hash-version=%d", args->name_hash_version);
     +	if (args->path_walk)
     +		strvec_pushf(&cmd->args, "--path-walk");
      	if (args->local)
    @@ builtin/repack.c: static void prepare_pack_objects(struct child_process *cmd,
      	if (args->quiet)
     @@ builtin/repack.c: int cmd_repack(int argc,
      				N_("pass --no-reuse-object to git-pack-objects")),
    - 		OPT_BOOL(0, "full-name-hash", &po_args.full_name_hash,
    - 				N_("(EXPERIMENTAL!) pass --full-name-hash to git-pack-objects")),
    + 		OPT_INTEGER(0, "name-hash-version", &po_args.name_hash_version,
    + 				N_("specify the name hash version to use for grouping similar objects by path")),
     +		OPT_BOOL(0, "path-walk", &po_args.path_walk,
     +				N_("(EXPERIMENTAL!) pass --path-walk to git-pack-objects")),
      		OPT_NEGBIT('n', NULL, &run_update_server_info,
    @@ builtin/repack.c: int cmd_repack(int argc,
      		OPT__QUIET(&po_args.quiet, N_("be quiet")),
     
      ## t/perf/p5313-pack-objects.sh ##
    -@@ t/perf/p5313-pack-objects.sh: test_size 'thin pack size with --full-name-hash' '
    - 	test_file_size out
    - '
    +@@ t/perf/p5313-pack-objects.sh: do
    + 	'
    + done
      
     +test_perf 'thin pack with --path-walk' '
     +	git pack-objects --thin --stdout --revs --sparse --path-walk <in-thin >out
    @@ t/perf/p5313-pack-objects.sh: test_size 'thin pack size with --full-name-hash' '
     +	wc -c <out
     +'
     +
    - test_perf 'big pack' '
    - 	git pack-objects --stdout --revs --sparse  <in-big >out
    - '
    -@@ t/perf/p5313-pack-objects.sh: test_size 'big pack size with --full-name-hash' '
    - 	test_file_size out
    - '
    - 
     +test_perf 'big pack with --path-walk' '
     +	git pack-objects --stdout --revs --sparse --path-walk <in-big >out
     +'
    @@ t/perf/p5313-pack-objects.sh: test_size 'big pack size with --full-name-hash' '
     +	wc -c <out
     +'
     +
    - test_perf 'repack' '
    - 	git repack -adf
    - '
    -@@ t/perf/p5313-pack-objects.sh: test_size 'repack size with --full-name-hash' '
    - 	test_file_size "$pack"
    - '
    - 
     +test_perf 'repack with --path-walk' '
     +	git repack -adf --path-walk
     +'
  • 147: 9350e54 ! 95: e097df5 pack-objects: enable --path-walk via config

    @@ Commit message
     
         Signed-off-by: Derrick Stolee <[email protected]>
     
    - ## Documentation/config/feature.txt ##
    -@@ Documentation/config/feature.txt: walking fewer objects.
    + ## Documentation/config/feature.adoc ##
    +@@ Documentation/config/feature.adoc: walking fewer objects.
      +
      * `pack.allowPackReuse=multi` may improve the time it takes to create a pack by
      reusing objects from multiple packs instead of just one.
    @@ Documentation/config/feature.txt: walking fewer objects.
      feature.manyFiles::
      	Enable config options that optimize for repos with many files in the
     
    - ## Documentation/config/pack.txt ##
    -@@ Documentation/config/pack.txt: pack.useSparse::
    + ## Documentation/config/pack.adoc ##
    +@@ Documentation/config/pack.adoc: pack.useSparse::
      	commits contain certain types of direct renames. Default is
      	`true`.
      
  • 148: a96c73c = 96: bdb4556 scalar: enable path-walk during push via config

  • 149: 3626d3e ! 97: 98ea031 pack-objects: refactor path-walk delta phase

    @@ pack-objects.h: struct object_entry {
      
     
      ## t/t5300-pack-object.sh ##
    -@@ t/t5300-pack-object.sh: test_expect_success '--full-name-hash and --write-bitmap-index are incompatible'
    +@@ t/t5300-pack-object.sh: test_expect_success '--name-hash-version=2 and --write-bitmap-index are incompat
      # Basic "repack everything" test
      test_expect_success '--path-walk pack everything' '
      	git -C server rev-parse HEAD >in &&
  • 167: 7c054b0 = 98: 3707f40 mingw: make sure errno is set correctly when socket operations fail

  • 168: 52f76dc ! 99: 6ec8c02 compat/mingw: handle WSA errors in strerror

    @@ Commit message
         Signed-off-by: Johannes Schindelin <[email protected]>
     
      ## Makefile ##
    -@@ Makefile: THIRD_PARTY_SOURCES += $(UNIT_TEST_DIR)/clar/clar/%
    - 
    - CLAR_TEST_SUITES += u-ctype
    +@@ Makefile: CLAR_TEST_SUITES += u-reftable-tree
    + CLAR_TEST_SUITES += u-strbuf
    + CLAR_TEST_SUITES += u-strcmp-offset
      CLAR_TEST_SUITES += u-strvec
     +CLAR_TEST_SUITES += u-mingw
      CLAR_TEST_PROG = $(UNIT_TEST_BIN)/unit-tests$(X)
    @@ compat/mingw.h: int mingw_socket(int domain, int type, int protocol);
      
     
      ## t/meson.build ##
    -@@
    - clar_test_suites = [
    -   'unit-tests/u-ctype.c',
    +@@ t/meson.build: clar_test_suites = [
    +   'unit-tests/u-hash.c',
    +   'unit-tests/u-hashmap.c',
    +   'unit-tests/u-mem-pool.c',
     +  'unit-tests/u-mingw.c',
    -   'unit-tests/u-strvec.c',
    - ]
    - 
    +   'unit-tests/u-prio-queue.c',
    +   'unit-tests/u-reftable-tree.c',
    +   'unit-tests/u-strbuf.c',
     
      ## t/unit-tests/u-mingw.c (new) ##
     @@
  • 169: 0d035a7 = 100: 044465b compat/mingw: drop outdated comment

  • 171: eff2587 = 101: cd669aa t0301: actually test credential-cache on Windows

  • 173: 8ee08bf = 102: fb748ba credential-cache: handle ECONNREFUSED gracefully

  • 174: c4df497 = 103: 5433d11 mingw_open_existing: handle directories better

  • 57: 2b2dd03 ! 104: 1101553 mingw: allow git.exe to be used instead of the "Git wrapper"

    @@ compat/mingw.c: int xwcstoutf(char *utf, const wchar_t *wcs, size_t utflen)
      }
      
     +#ifdef ENSURE_MSYSTEM_IS_SET
    -+static size_t append_system_bin_dirs(char *path, size_t size)
    -+{
     +#if !defined(RUNTIME_PREFIX) || !defined(HAVE_WPGMPTR)
    ++static size_t append_system_bin_dirs(char *path UNUSED, size_t size UNUSED)
    ++{
     +	return 0;
    ++}
     +#else
    ++static size_t append_system_bin_dirs(char *path, size_t size)
    ++{
     +	char prefix[32768];
     +	const char *slash;
     +	size_t len = xwcstoutf(prefix, _wpgmptr, sizeof(prefix)), off = 0;
    @@ compat/mingw.c: int xwcstoutf(char *utf, const wchar_t *wcs, size_t utflen)
     +	off += xsnprintf(path + off, size - off,
     +			 "%.*s\\usr\\bin;", (int)len, prefix);
     +	return off;
    -+#endif
     +}
     +#endif
    ++#endif
     +
      static void setup_windows_environment(void)
      {
    @@ config.mak.uname: ifeq ($(uname_S),MINGW)
     
      ## t/t0060-path-utils.sh ##
     @@ t/t0060-path-utils.sh: test_expect_success !VALGRIND,RUNTIME_PREFIX,CAN_EXEC_IN_PWD 'RUNTIME_PREFIX wor
    - 	cp "$GIT_EXEC_PATH"/git$X pretend/bin/ &&
    + 	echo "echo HERE" | write_script pretend/libexec/git-core/git-here &&
      	GIT_EXEC_PATH= ./pretend/bin/git here >actual &&
      	echo HERE >expect &&
     -	test_cmp expect actual'
    @@ t/t0060-path-utils.sh: test_expect_success !VALGRIND,RUNTIME_PREFIX,CAN_EXEC_IN_
     +'
      
      test_expect_success !VALGRIND,RUNTIME_PREFIX,CAN_EXEC_IN_PWD '%(prefix)/ works' '
    - 	mkdir -p pretend/bin &&
    + 	git config yes.path "%(prefix)/yes" &&
     @@ t/t0060-path-utils.sh: test_expect_success !VALGRIND,RUNTIME_PREFIX,CAN_EXEC_IN_PWD '%(prefix)/ works'
      	test_cmp expect actual
      '
      
    -+test_expect_success MINGW 'MSYSTEM/PATH is adjusted if necessary' '
    ++test_expect_success MINGW,RUNTIME_PREFIX 'MSYSTEM/PATH is adjusted if necessary' '
     +	mkdir -p "$HOME"/bin pretend/mingw64/bin \
     +		pretend/mingw64/libexec/git-core pretend/usr/bin &&
     +	cp "$GIT_EXEC_PATH"/git.exe pretend/mingw64/bin/ &&
  • 59: d704de7 ! 105: cd216b9 mingw: ignore HOMEDRIVE/HOMEPATH if it points to Windows' system directory

    @@ Commit message
     
      ## compat/mingw.c ##
     @@ compat/mingw.c: static size_t append_system_bin_dirs(char *path, size_t size)
    - }
    + #endif
      #endif
      
     +static int is_system32_path(const char *path)
  • 71: 77f2c6b = 106: 1967b7d clink.pl: fix libexpatd.lib link error when using MSVC

  • 72: c1ef925 = 107: 03cc713 Makefile: clean up .ilk files when MSVC=1

  • 73: 4d15032 = 108: 5dd03a6 vcbuild: add support for compiling Windows resource files

  • 74: bbc45a0 = 109: 0afb8b2 config.mak.uname: add git.rc to MSVC builds

  • 75: f8e8a92 = 110: 59691af clink.pl: ignore no-stack-protector arg on MSVC=1 builds

  • 76: 0c71605 = 111: 75a50bc clink.pl: move default linker options for MSVC=1 builds

  • 77: efcac16 = 112: 964f71f cmake: install headless-git.

  • 112: c611af2 < -: ------------ config.mak.uname: add support for clangarm64

  • 294: e2874e2 ! 113: 6353210 fixup! config.mak.uname: add support for clangarm64

    @@
      ## Metadata ##
    -Author: Johannes Schindelin <[email protected]>
    +Author: Dennis Ameling <[email protected]>
     
      ## Commit message ##
    -    fixup! config.mak.uname: add support for clangarm64
    +    config.mak.uname: add support for clangarm64
     
    -    This commit introduced an `else ifeq` pattern that is arguably more
    -    elegant than the previous pattern, so let's adjust the existing
    -    conditional block, too.
    +    CLANGARM64 is a relatively new MSYSTEM added by the MSYS2 team. In order
    +    to have Git build correctly for this platform, let's add some
    +    configuration for it to config.mak.uname.
     
    -    Signed-off-by: Johannes Schindelin <[email protected]>
    +    Signed-off-by: Dennis Ameling <[email protected]>
     
      ## config.mak.uname ##
     @@ config.mak.uname: ifeq ($(uname_S),MINGW)
    @@ config.mak.uname: ifeq ($(uname_S),MINGW)
      		prefix = /mingw64
      		HOST_CPU = x86_64
      		BASIC_LDFLAGS += -Wl,--pic-executable,-e,mainCRTStartup
    ++        else ifeq (CLANGARM64,$(MSYSTEM))
    ++		prefix = /clangarm64
    ++		HOST_CPU = aarch64
    ++		BASIC_LDFLAGS += -Wl,--pic-executable,-e,mainCRTStartup
    +         else
    + 		COMPAT_CFLAGS += -D_USE_32BIT_TIME_T
    + 		BASIC_LDFLAGS += -Wl,--large-address-aware
  • 292: 0c5dcab = 114: 5cda90a msvc: do handle builds on Windows/ARM64

  • 293: 8c92887 ! 115: 2a46ce6 mingw(arm64): do move the /etc/git* location

    @@ Commit message
     
      ## config.mak.uname ##
     @@ config.mak.uname: ifeq ($(uname_S),Windows)
    + 	NO_POSIX_GOODIES = UnfortunatelyYes
      	NATIVE_CRLF = YesPlease
      	DEFAULT_HELP_FORMAT = html
    - 	SKIP_DASHED_BUILT_INS = YabbaDabbaDoo
     -ifeq (/mingw64,$(subst 32,64,$(prefix)))
     +ifeq (/mingw64,$(subst 32,64,$(subst clangarm,mingw,$(prefix))))
      	# Move system config into top-level /etc/
  • 114: 3c2cb2f ! 116: 6e4a508 windows: skip linking git-<command> for built-ins

    @@ config.mak.uname: ifeq ($(uname_S),Windows)
      	NATIVE_CRLF = YesPlease
      	DEFAULT_HELP_FORMAT = html
     +	SKIP_DASHED_BUILT_INS = YabbaDabbaDoo
    - ifeq (/mingw64,$(subst 32,64,$(prefix)))
    + ifeq (/mingw64,$(subst 32,64,$(subst clangarm,mingw,$(prefix))))
      	# Move system config into top-level /etc/
      	ETC_GITCONFIG = ../etc/gitconfig
     @@ config.mak.uname: ifeq ($(uname_S),MINGW)
  • 123: 39af65a = 117: 9aa6e46 git.rc: include winuser.h

  • 127: f2b2cf1 (upstream: fc62e03) < -: ------------ pack-objects: add --full-name-hash option

  • 128: 3c6b870 (upstream: 928ef41) < -: ------------ repack: test --full-name-hash option

  • 129: f2f2ce2 (upstream: ce96113) < -: ------------ pack-objects: add GIT_TEST_FULL_NAME_HASH

  • 133: 728cf13 (squashed into 928ef41) < -: ------------ git-repack: update usage to match docs

  • 134: 48557e9 (upstream: 30696be) < -: ------------ p5313: add size comparison test

  • 135: 6eff58d (upstream: 7f98707) < -: ------------ test-tool: add helper for name-hash values

  • 136: a7d1bbd < -: ------------ repack/pack-objects: mark --full-name-hash as experimental

  • 137: b8aac65 (upstream: 9d46bc7) < -: ------------ path-walk: introduce an object walk by path

  • 138: 2f90b90 (upstream: d190124) < -: ------------ t6601: add helper for testing path-walk API

  • 139: 4e3019e (upstream: c8dba31) < -: ------------ path-walk: allow consumer to specify object types

  • 140: 13d31b4 (upstream: 9145660) < -: ------------ path-walk: allow visiting tags

  • 142: 86dbff7 (upstream: 6333e7a) < -: ------------ path-walk: add prune_all_uninteresting option

  • 150: 41019de ! 118: ed9d28a pack-objects: thread the path-based compression

    @@ builtin/pack-objects.c: static void find_deltas(struct object_entry **list, unsi
      	unsigned list_size;
      	unsigned remaining;
      	int window;
    +@@ builtin/pack-objects.c: static void find_deltas_by_region(struct object_entry *list,
    + 	progress_nr = regions[nr - 1].start + regions[nr - 1].nr;
    + 
    + 	if (progress)
    +-		progress_state = start_progress(_("Compressing objects by path"),
    ++		progress_state = start_progress(the_repository,
    ++						_("Compressing objects by path"),
    + 						progress_nr);
    + 
    + 	while (nr--)
     @@ builtin/pack-objects.c: static void find_deltas_by_region(struct object_entry *list,
      	stop_progress(&progress_state);
      }
    @@ builtin/pack-objects.c: static void find_deltas_by_region(struct object_entry *l
     +	CALLOC_ARRAY(p, delta_search_threads);
     +
     +	if (progress)
    -+		progress_state = start_progress(_("Compressing objects by path"),
    ++		progress_state = start_progress(the_repository,
    ++						_("Compressing objects by path"),
     +						progress_nr);
     +	/* Partition the work amongst work threads. */
     +	for (i = 0; i < delta_search_threads; i++) {
    @@ t/perf/p5313-pack-objects.sh: test_perf 'thin pack with --path-walk' '
     +	test_file_size out
      '
      
    - test_perf 'big pack' '
    + test_perf 'big pack with --path-walk' '
     @@ t/perf/p5313-pack-objects.sh: test_perf 'big pack with --path-walk' '
      '
      
    @@ t/perf/p5313-pack-objects.sh: test_perf 'big pack with --path-walk' '
     +	test_file_size out
      '
      
    - test_perf 'repack' '
    + test_perf 'repack with --path-walk' '
     @@ t/perf/p5313-pack-objects.sh: test_perf 'repack with --path-walk' '
      '
      
  • 151: 250b5d4 (squashed into 9d46bc7) < -: ------------ path-walk API: avoid adding a root tree more than once

  • 152: 4497a07 (upstream: a3f79e9) < -: ------------ backfill: add builtin boilerplate

  • 153: 70d026e (upstream: 1e72e88) < -: ------------ backfill: basic functionality and tests

  • 154: cebd23f (upstream: 6840fe9) < -: ------------ backfill: add --batch-size= option

  • 155: 8a25c02 (upstream: bff4555) < -: ------------ backfill: add --sparse option

  • 156: d2e24b2 (upstream: 85127bc) < -: ------------ backfill: assume --sparse when sparse-checkout is enabled

  • 157: 2390b61 < -: ------------ backfill: mark it as experimental

  • 158: 9744533 ! 119: 22c39de survey: stub in new experimental 'git-survey' command

    @@ .gitignore
      /git-switch
      /git-symbolic-ref
     
    - ## Documentation/config.txt ##
    -@@ Documentation/config.txt: include::config/status.txt[]
    + ## Documentation/config.adoc ##
    +@@ Documentation/config.adoc: include::config/status.adoc[]
      
    - include::config/submodule.txt[]
    + include::config/submodule.adoc[]
      
    -+include::config/survey.txt[]
    ++include::config/survey.adoc[]
     +
    - include::config/tag.txt[]
    + include::config/tag.adoc[]
      
    - include::config/tar.txt[]
    + include::config/tar.adoc[]
     
    - ## Documentation/config/survey.txt (new) ##
    + ## Documentation/config/survey.adoc (new) ##
     @@
     +survey.*::
     +	These variables adjust the default behavior of the `git survey`
    @@ Documentation/config/survey.txt (new)
     +		This boolean value implies the `--[no-]progress` option.
     +--
     
    - ## Documentation/git-survey.txt (new) ##
    + ## Documentation/git-survey.adoc (new) ##
     @@
     +git-survey(1)
     +=============
    @@ Documentation/git-survey.txt (new)
     
      ## Documentation/meson.build ##
     @@ Documentation/meson.build: manpages = {
    -   'git-status.txt' : 1,
    -   'git-stripspace.txt' : 1,
    -   'git-submodule.txt' : 1,
    -+  'git-survey.txt' : 1,
    -   'git-svn.txt' : 1,
    -   'git-switch.txt' : 1,
    -   'git-symbolic-ref.txt' : 1,
    +   'git-status.adoc' : 1,
    +   'git-stripspace.adoc' : 1,
    +   'git-submodule.adoc' : 1,
    ++  'git-survey.adoc' : 1,
    +   'git-svn.adoc' : 1,
    +   'git-switch.adoc' : 1,
    +   'git-symbolic-ref.adoc' : 1,
     
      ## Makefile ##
     @@ Makefile: BUILTIN_OBJS += builtin/sparse-checkout.o
    @@ builtin/survey.c (new)
     +		OPT_END(),
     +	};
     +
    -+	if (argc == 2 && !strcmp(argv[1], "-h"))
    -+		usage_with_options(survey_usage, survey_options);
    ++	show_usage_with_options_if_asked(argc, argv,
    ++					 survey_usage, survey_options);
     +
     +	ctx.repo = repo;
     +
    @@ t/t8100-git-survey.sh (new)
     +. ./test-lib.sh
     +
     +test_expect_success 'git survey -h shows experimental warning' '
    -+	test_expect_code 129 git survey -h 2>usage &&
    ++	test_expect_code 129 git survey -h >usage &&
     +	grep "EXPERIMENTAL!" usage
     +'
     +
  • 159: bf2a46e ! 120: 4da0afd survey: add command line opts to select references

    @@ Commit message
         Signed-off-by: Jeff Hostetler <[email protected]>
         Signed-off-by: Derrick Stolee <[email protected]>
     
    - ## Documentation/git-survey.txt ##
    -@@ Documentation/git-survey.txt: As repositories grow to "monorepo" size, certain data shapes can cause
    + ## Documentation/git-survey.adoc ##
    +@@ Documentation/git-survey.adoc: As repositories grow to "monorepo" size, certain data shapes can cause
      performance problems.  `git-survey` attempts to measure and report on
      known problem areas.
      
    @@ builtin/survey.c: static void survey_load_config(struct survey_context *ctx)
     +
     +	if (ctx->opts.show_progress) {
     +		ctx->progress_total = 0;
    -+		ctx->progress = start_progress(_("Scanning refs..."), 0);
    ++		ctx->progress = start_progress(ctx->repo,
    ++					       _("Scanning refs..."), 0);
     +	}
     +
     +	filter_refs(ref_array, &filter, FILTER_REFS_KIND_MASK);
  • 160: e35bec6 ! 121: 20bd50b survey: start pretty printing data in table form

    @@ Commit message
     
         Signed-off-by: Derrick Stolee <[email protected]>
     
    - ## Documentation/git-survey.txt ##
    -@@ Documentation/git-survey.txt: OUTPUT
    + ## Documentation/git-survey.adoc ##
    +@@ Documentation/git-survey.adoc: OUTPUT
      By default, `git survey` will print information about the repository in a
      human-readable format that includes overviews and tables.
      
  • 161: 26894cb ! 122: f54e198 survey: add object count summary

    @@ Commit message
     
         Signed-off-by: Derrick Stolee <[email protected]>
     
    - ## Documentation/git-survey.txt ##
    -@@ Documentation/git-survey.txt: The references summary includes a count of each kind of reference,
    + ## Documentation/git-survey.adoc ##
    +@@ Documentation/git-survey.adoc: The references summary includes a count of each kind of reference,
      including branches, remote refs, and tags (split by "all" and
      "annotated").
      
  • 162: 8051e6d = 123: d39ecbd survey: summarize total sizes by object type

  • 163: c44834d ! 124: 1d398d2 survey: show progress during object walk

    @@ builtin/survey.c: static void survey_phase_objects(struct survey_context *ctx)
     +	ctx->progress_nr = 0;
     +	ctx->progress_total = ctx->ref_array.nr;
     +	if (ctx->opts.show_progress)
    -+		ctx->progress = start_progress(_("Preparing object walk"),
    ++		ctx->progress = start_progress(ctx->repo,
    ++					       _("Preparing object walk"),
     +					       ctx->progress_total);
      	for (int i = 0; i < ctx->ref_array.nr; i++) {
      		struct ref_array_item *item = ctx->ref_array.items[i];
    @@ builtin/survey.c: static void survey_phase_objects(struct survey_context *ctx)
     +	ctx->progress_nr = 0;
     +	ctx->progress_total = 0;
     +	if (ctx->opts.show_progress)
    -+		ctx->progress = start_progress(_("Walking objects"), 0);
    ++		ctx->progress = start_progress(ctx->repo,
    ++					       _("Walking objects"), 0);
      	walk_objects_by_path(&info);
     +	stop_progress(&ctx->progress);
      
  • 164: 6da4046 = 125: 7875abb survey: add ability to track prioritized lists

  • 165: db1579e ! 126: 5146cc9 survey: add report of "largest" paths

    @@ Commit message
         paths. Even when stored efficiently on disk, that size represents how much
         information must be processed to complete a command such as 'git blame'.
     
    -    Since the on-disk size is likely to be fragile, stop testing the exact
    -    output of 'git survey' and check that the correct set of headers is
    -    output.
    +    The exact disk size seems to be not quite robust enough for testing, as
    +    could be seen by the `linux-musl-meson` job consistently failing, possibly
    +    because of zlib-ng deflates differently: t8100.4(git survey
    +    (default)) was failing with a symptom like this:
    +
    +       TOTAL OBJECT SIZES BY TYPE
    +       ===============================================
    +       Object Type | Count | Disk Size | Inflated Size
    +       ------------+-------+-----------+--------------
    +      -    Commits |    10 |      1523 |          2153
    +      +    Commits |    10 |      1528 |          2153
    +             Trees |    10 |       495 |          1706
    +             Blobs |    10 |       191 |           101
    +      -       Tags |     4 |       510 |           528
    +      +       Tags |     4 |       547 |           528
    +
    +    This means: the disk size is unlikely something we can verify robustly.
    +    Since zlib-ng seems to increase the disk size of the tags from 528 to
    +    547, we cannot even assume that the disk size is always smaller than the
    +    inflated size. We will most likely want to either skip verifying the
    +    disk size altogether, or go for some kind of fuzzy matching, say, by
    +    replacing `s/ 1[45][0-9][0-9] / ~1.5k /` and `s/ [45][0-9][0-9] / ~½k /`
    +    or something like that.
     
         Signed-off-by: Derrick Stolee <[email protected]>
    +    Signed-off-by: Johannes Schindelin <[email protected]>
     
      ## builtin/survey.c ##
     @@ builtin/survey.c: struct survey_report_object_size_summary {
    @@ t/t8100-git-survey.sh: test_expect_success 'git survey (default)' '
     -	test_cmp expect out
     +	lines=$(wc -l <expect) &&
     +	head -n $lines out >out-trimmed &&
    -+	test_cmp expect out-trimmed &&
    ++	sed -e "s/ 1528 / 1523 /" -e "s/ 547 / 510 /" out-trimmed >out-edited &&
    ++	test_cmp expect out-edited &&
     +
     +	for type in "DIRECTORIES" "FILES"
     +	do
  • 166: aebcfa8 ! 127: 39aaa02 survey: add --top= option and config

    @@ Commit message
         Signed-off-by: Derrick Stolee <[email protected]>
         Signed-off-by: Johannes Schindelin <[email protected]>
     
    - ## Documentation/config/survey.txt ##
    -@@ Documentation/config/survey.txt: survey.*::
    + ## Documentation/config/survey.adoc ##
    +@@ Documentation/config/survey.adoc: survey.*::
      		This boolean value implies the `--[no-]verbose` option.
      	progress::
      		This boolean value implies the `--[no-]progress` option.
  • -: ------------ > 128: c54d66f ident: stop assuming that gw_gecos is writable

  • -: ------------ > 129: e8c4e0f meson: fix sorting

  • 170: 6717843 ! 130: d20ac25 survey: clearly note the experimental nature in the output

    @@ builtin/survey.c
      static const char * const survey_usage[] = {
      	N_("(EXPERIMENTAL!) git survey <options>"),
     @@ builtin/survey.c: int cmd_survey(int argc, const char **argv, const char *prefix, struct repositor
    - 	if (argc == 2 && !strcmp(argv[1], "-h"))
    - 		usage_with_options(survey_usage, survey_options);
    + 	show_usage_with_options_if_asked(argc, argv,
    + 					 survey_usage, survey_options);
      
     +	if (isatty(2))
     +		color_fprintf_ln(stderr,
  • 172: cd5965a (squashed into 9145660) < -: ------------ path-walk: improve path-walk speed with many tags

  • 175: 12580ca = 131: d4f694e git-gui: provide question helper for retry fallback on Windows

  • 176: 68306f7 = 132: 89bc64c git gui: set GIT_ASKPASS=git-gui--askpass if not set yet

  • 177: a4fadd2 (upstream: 5eb02dd) < -: ------------ gitk: Unicode file name support

  • 178: 0762dff = 133: 32e49e9 git-gui--askyesno: fix funny text wrapping

  • 179: 81d53b3 (upstream: baaa9d6) < -: ------------ gitk: Use an external icon file on Windows

  • 180: 950b7cf = 134: 519f93b git-gui--askyesno: allow overriding the window title

  • 181: f94f9c8 (upstream: ac75b4c) < -: ------------ gitk: fix arrow keys in input fields with Tcl/Tk >= 8.6

  • 182: 148264a = 135: cb8c1ba git-gui--askyesno (mingw): use Git for Windows' icon, if available

  • 183: d23b686 (upstream: 18a7e19) < -: ------------ gitk: make the "list references" default window width wider

  • 184: cc76fdd = 136: 862db5d Win32: make FILETIME conversion functions public

  • 185: 24c8f28 = 137: 73bf020 Win32: dirent.c: Move opendir down

  • 186: 4449938 ! 138: e97aa33 mingw: make the dirent implementation pluggable

    @@ compat/win32/dirent.h
     +/* default dirent implementation */
     +extern DIR *dirent_opendir(const char *dirname);
     +
    ++#define opendir git_opendir
    ++
     +/* current dirent implementation */
     +extern DIR *(*opendir)(const char *dirname);
     +
  • 187: 4f2ebf7 = 139: ecf6a02 Win32: make the lstat implementation pluggable

  • 188: 8c66243 ! 140: 8b8e7d3 mingw: add infrastructure for read-only file system level caches

    @@ Commit message
     
         Signed-off-by: Karsten Blees <[email protected]>
     
    - ## Documentation/config/core.txt ##
    -@@ Documentation/config/core.txt: relatively high IO latencies.  When enabled, Git will do the
    + ## Documentation/config/core.adoc ##
    +@@ Documentation/config/core.adoc: relatively high IO latencies.  When enabled, Git will do the
      index comparison to the filesystem data in parallel, allowing
      overlapping IO's.  Defaults to true.
      
  • 189: 30cac28 ! 141: 35dbffe mingw: add a cache below mingw's lstat and dirent implementations

    @@ compat/win32/fscache.c (new)
     +};
     +#pragma GCC diagnostic pop
     +
    ++#pragma GCC diagnostic push
    ++#ifdef __clang__
    ++#pragma GCC diagnostic ignored "-Wflexible-array-extensions"
    ++#endif
     +struct heap_fsentry {
     +	union {
     +		struct fsentry ent;
     +		char dummy[sizeof(struct fsentry) + MAX_PATH];
     +	} u;
     +};
    ++#pragma GCC diagnostic pop
     +
     +/*
     + * Compares the paths of two fsentry structures for equality.
    @@ compat/win32/fscache.c (new)
     +int fscache_lstat(const char *filename, struct stat *st)
     +{
     +	int dirlen, base, len;
    ++#pragma GCC diagnostic push
    ++#ifdef __clang__
    ++#pragma GCC diagnostic ignored "-Wflexible-array-extensions"
    ++#endif
     +	struct heap_fsentry key[2];
    ++#pragma GCC diagnostic pop
     +	struct fsentry *fse;
     +
     +	if (!fscache_enabled(filename))
    @@ git-compat-util.h: static inline int is_xplatform_dir_sep(int c)
      #else
      #include <sys/utsname.h>
      #include <sys/wait.h>
    +
    + ## meson.build ##
    +@@ meson.build: elif host_machine.system() == 'windows'
    +     'compat/winansi.c',
    +     'compat/win32/dirent.c',
    +     'compat/win32/flush.c',
    ++    'compat/win32/fscache.c',
    +     'compat/win32/path-utils.c',
    +     'compat/win32/pthread.c',
    +     'compat/win32/syslog.c',
  • 190: 3a776d0 = 142: 25d264c fscache: load directories only once

  • 191: d5161fe = 143: 9f73b86 fscache: add key for GIT_TRACE_FSCACHE

  • 192: 4260904 = 144: 48d8a11 fscache: remember not-found directories

  • 193: bea2594 = 145: fcf2313 fscache: add a test for the dir-not-found optimization

  • 194: 63d1d53 = 146: 737e787 add: use preload-index and fscache for performance

  • 195: aa0805a = 147: 9ce7a27 dir.c: make add_excludes aware of fscache during status

  • 196: 73cdb83 = 148: 76dc3e3 fscache: make fscache_enabled() public

  • 197: 625bdd5 = 149: e61753c dir.c: regression fix for add_excludes with fscache

  • 198: e19c972 = 150: 69115c7 fetch-pack.c: enable fscache for stats under .git/objects

  • 199: bdc5178 = 151: 5bf3379 checkout.c: enable fscache for checkout again

  • 200: bf647ba = 152: 3e8242d Enable the filesystem cache (fscache) in refresh_index().

  • 201: 0b2caca = 153: 4e178d7 fscache: use FindFirstFileExW to avoid retrieving the short name

  • 202: 6c48958 ! 154: 6e15a57 fscache: add GIT_TEST_FSCACHE support

    @@ compat/win32/fscache.c: int fscache_enable(int enable)
      
     
      ## t/README ##
    -@@ t/README: GIT_TEST_FULL_NAME_HASH=<boolean>, when true, sets the default name-hash
    - function in 'git pack-objects' to be the one used by the --full-name-hash
    - option.
    +@@ t/README: GIT_TEST_NAME_HASH_VERSION=<int>, when set, causes 'git pack-objects' to
    + assume '--name-hash-version=<n>'.
    + 
      
     +GIT_TEST_FSCACHE=<boolean> exercises the uncommon fscache code path
     +which adds a cache below mingw's lstat and dirent implementations.
  • 203: 3487aef = 155: da44095 fscache: add fscache hit statistics

  • 204: 03eb3a2 = 156: 1bc8d18 unpack-trees: enable fscache for sparse-checkout

  • 205: 4c2a010 = 157: 382787f status: disable and free fscache at the end of the status command

  • 206: 6f28abe = 158: 9973091 mem_pool: add GIT_TRACE_MEMPOOL support

  • 207: a755ea6 = 159: 11db1e9 fscache: fscache takes an initial size

  • 208: dba12a8 ! 160: 180b62f fscache: update fscache to be thread specific instead of global

    @@ compat/win32/fscache.c: int fscache_enable(int enable, size_t initial_size)
      }
      
     @@ compat/win32/fscache.c: int fscache_lstat(const char *filename, struct stat *st)
    - 	int dirlen, base, len;
      	struct heap_fsentry key[2];
    + #pragma GCC diagnostic pop
      	struct fsentry *fse;
     +	struct fscache *cache = fscache_getcache();
      
  • 209: f2863c0 = 161: a27f98e fscache: teach fscache to use mempool

  • 210: b67da53 = 162: b209e76 fscache: make fscache_enable() thread safe

  • 211: 5eb43ec = 163: b82ca24 fscache: teach fscache to use NtQueryDirectoryFile

  • 212: 62e0392 = 164: 395aafc fscache: remember the reparse tag for each entry

  • 213: 2fed2bd ! 165: 732794e fscache: implement an FSCache-aware is_mount_point()

    @@ compat/win32/fscache.c: int fscache_lstat(const char *filename, struct stat *st)
     +int fscache_is_mount_point(struct strbuf *path)
     +{
     +	int dirlen, base, len;
    ++#pragma GCC diagnostic push
    ++#ifdef __clang__
    ++#pragma GCC diagnostic ignored "-Wflexible-array-extensions"
    ++#endif
     +	struct heap_fsentry key[2];
    ++#pragma GCC diagnostic pop
     +	struct fsentry *fse;
     +	struct fscache *cache = fscache_getcache();
     +
  • 214: e94f1e0 = 166: 8e4cd5d clean: make use of FSCache

  • 215: f02bd51 = 167: fd0ff69 pack-objects (mingw): demonstrate a segmentation fault with large deltas

  • 216: 1bd9bd5 ! 168: af55668 mingw: support long paths

    @@ Commit message
         Signed-off-by: Stepan Kasal <[email protected]>
         Signed-off-by: Johannes Schindelin <[email protected]>
     
    - ## Documentation/config/core.txt ##
    -@@ Documentation/config/core.txt: core.fscache::
    + ## Documentation/config/core.adoc ##
    +@@ Documentation/config/core.adoc: core.fscache::
      Git for Windows uses this to bulk-read and cache lstat data of entire
      directories (instead of doing lstat file by file).
      
    @@ compat/win32/fscache.c: struct fsentry {
     +		char dummy[sizeof(struct fsentry) + MAX_LONG_PATH];
      	} u;
      };
    - 
    + #pragma GCC diagnostic pop
     @@ compat/win32/fscache.c: static void fsentry_init(struct fsentry *fse, struct fsentry *list,
      			 const char *name, size_t len)
      {
  • 217: 3b1a192 = 169: b80d792 Win32: fix 'lstat("dir/")' with long paths

  • 218: ef27b39 = 170: b1e531e win32(long path support): leave drive-less absolute paths intact

  • 219: ff2c288 = 171: 7ff209c compat/fsmonitor/fsm-*-win32: support long paths

  • 220: f5ddc17 ! 172: 806115e clean: suggest using core.longPaths if paths are too long to remove

    @@ Commit message
         Fixes: #2715
         Signed-off-by: Ben Boeckel <[email protected]>
     
    - ## Documentation/config/advice.txt ##
    -@@ Documentation/config/advice.txt: all advice messages.
    + ## Documentation/config/advice.adoc ##
    +@@ Documentation/config/advice.adoc: all advice messages.
      		set their identity configuration.
      	mergeConflict::
      		Shown when various commands stop because of conflicts.
  • 221: b57894a = 173: ec7636b mingw: Support git_terminal_prompt with more terminals

  • 222: 64f6c72 = 174: d0625de compat/terminal.c: only use the Windows console if bash 'read -r' fails

  • 223: 245d20a = 175: f579f11 mingw (git_terminal_prompt): do fall back to CONIN$/CONOUT$ method

  • 224: 4eff09c = 176: 7cb53dd strbuf_readlink: don't call readlink twice if hint is the exact link size

  • 225: 1e3c782 = 177: c22af68 strbuf_readlink: support link targets that exceed PATH_MAX

  • 226: 664cdf0 = 178: 6c6742f lockfile.c: use is_dir_sep() instead of hardcoded '/' checks

  • 227: c552ccd = 179: bf4a16f Win32: don't call GetFileAttributes twice in mingw_lstat()

  • 228: afe2828 = 180: ee7f546 Win32: implement stat() with symlink support

  • 229: 6129d20 = 181: 71553bc Win32: remove separate do_lstat() function

  • 230: ac4d9d0 = 182: bf0b513 Win32: let mingw_lstat() error early upon problems with reparse points

  • 231: fce9988 = 183: 4e98f90 mingw: teach fscache and dirent about symlinks

  • 232: f322681 = 184: 5b3bbbe Win32: lstat(): return adequate stat.st_size for symlinks

  • 233: 7af4c9f = 185: ec3485c Win32: factor out retry logic

  • 234: d1ff8c1 = 186: 6ba922e Win32: change default of 'core.symlinks' to false

  • 235: 8acb180 = 187: 1cf1ac5 Win32: add symlink-specific error codes

  • 236: e6cff8b = 188: 12e6144 Win32: mingw_unlink: support symlinks to directories

  • 237: ea84594 = 189: c2d4cbf Win32: mingw_rename: support renaming symlinks

  • 238: e23c903 = 190: a66dc57 Win32: mingw_chdir: change to symlink-resolved directory

  • 239: 9029be3 = 191: e568585 Win32: implement readlink()

  • 240: 3b2f9e7 = 192: e6b4d99 mingw: lstat: compute correct size for symlinks

  • 241: 5e8cc14 = 193: 3ab2cf5 Win32: implement basic symlink() functionality (file symlinks only)

  • 242: 514775f = 194: 698537c Win32: symlink: add support for symlinks to directories

  • 243: 6c085c3 = 195: bb87008 mingw: try to create symlinks without elevated permissions

  • 244: b40add0 = 196: b0777fb mingw: emulate stat() a little more faithfully

  • 245: 30bf673 = 197: ff0b5dd mingw: special-case index entries for symlinks with buggy size

  • 246: 179e314 = 198: 3641116 mingw: introduce code to detect whether we're inside a Windows container

  • 247: 72bc74a = 199: 2e08b9a mingw: when running in a Windows container, try to rename() harder

  • 248: b49ffe2 = 200: a35506b mingw: move the file_attr_to_st_mode() function definition

  • 250: 0e3fcf1 = 201: 2fe03b8 Win32: symlink: move phantom symlink creation to a separate function

  • 249: 569793d = 202: de17edc mingw: Windows Docker volumes are not symbolic links

  • 252: c5910b3 ! 203: 4fcf20f Introduce helper to create symlinks that knows about index_state

    @@ apply.c: static int try_create_file(struct apply_state *state, const char *path,
      	if (fd < 0)
     
      ## builtin/difftool.c ##
    -@@ builtin/difftool.c: static int run_dir_diff(const char *extcmd, int symlinks, const char *prefix,
    +@@ builtin/difftool.c: static int run_dir_diff(struct repository *repo,
      				}
      				add_path(&wtdir, wtdir_len, dst_path);
    - 				if (symlinks) {
    + 				if (dt_options->symlinks) {
     -					if (symlink(wtdir.buf, rdir.buf)) {
     +					if (create_symlink(lstate.istate, wtdir.buf, rdir.buf)) {
      						ret = error_errno("could not symlink '%s' to '%s'", wtdir.buf, rdir.buf);
  • 251: 252c80e = 204: eaf8a32 mingw: work around rename() failing on a read-only file

  • 253: 89091af ! 205: b71774f mingw: allow to specify the symlink type in .gitattributes

    @@ Commit message
         Signed-off-by: Bert Belder <[email protected]>
         Signed-off-by: Johannes Schindelin <[email protected]>
     
    - ## Documentation/gitattributes.txt ##
    -@@ Documentation/gitattributes.txt: sign `$` upon checkout.  Any byte sequence that begins with
    + ## Documentation/gitattributes.adoc ##
    +@@ Documentation/gitattributes.adoc: sign `$` upon checkout.  Any byte sequence that begins with
      with `$Id$` upon check-in.
      
      
  • 254: a4beccd = 206: 7d4a60b Win32: symlink: add test for symlink attribute

  • 255: 8d73280 = 207: 2d008d3 mingw: explicitly specify with which cmd to prefix the cmdline

  • 256: dcc37df = 208: 1afc365 mingw: when path_lookup() failed, try BusyBox

  • 257: 8ed82c2 = 209: 60bad2b test-lib: avoid unnecessary Perl invocation

  • 258: 6d0fcf9 = 210: 3999f8e test-tool: learn to act as a drop-in replacement for iconv

  • 259: 27a8014 = 211: c99ee77 tests(mingw): if iconv is unavailable, use test-helper --iconv

  • 260: e7ffe9d ! 212: de632bc gitattributes: mark .png files as binary

    @@ .gitattributes
      *.bat text eol=crlf
     +*.png binary
      CODE_OF_CONDUCT.md -whitespace
    - /Documentation/**/*.txt text eol=lf
    + /Documentation/**/*.adoc text eol=lf
      /command-list.txt text eol=lf
  • 261: e947f64 = 213: 96c8582 tests: move test PNGs into t/lib-diff/

  • 262: 8bf35a1 = 214: 8a0d2fb tests: only override sort & find if there are usable ones in /usr/bin/

  • 263: 854ecfa = 215: f91a003 tests: use the correct path separator with BusyBox

  • 264: e1c2b75 = 216: 804d7af mingw: only use Bash-ism builtin pwd -W when available

  • 265: fc344a5 = 217: fbc0d90 tests (mingw): remove Bash-specific pwd option

  • 266: 45b0a20 = 218: 950f9e0 test-lib: add BUSYBOX prerequisite

  • 267: 46632be = 219: 462b866 t5003: use binary file from t/lib-diff/

  • 268: 9916ddb = 220: 2463898 t5532: workaround for BusyBox on Windows

  • 269: 8572e61 = 221: 516dd6b t5605: special-case hardlink test for BusyBox-w32

  • 270: 6776e2b = 222: 139edcf t5813: allow for $PWD to be a Windows path

  • 271: 400718b = 223: f4d6cb8 t9200: skip tests when $PWD contains a colon

  • 272: 27a08a9 ! 224: 3382520 mingw: add a Makefile target to copy test artifacts

    @@ config.mak.uname: ifeq ($(uname_S),MINGW)
      		ETC_GITCONFIG = ../etc/gitconfig
      		ETC_GITATTRIBUTES = ../etc/gitattributes
              endif
    -+ifeq (i686,$(uname_M))
    -+	MINGW_PREFIX := mingw32
    -+endif
    -+ifeq (x86_64,$(uname_M))
    -+	MINGW_PREFIX := mingw64
    -+endif
    ++	MINGW_PREFIX := $(subst /,,$(prefix))
     +
     +	DESTDIR_WINDOWS = $(shell cygpath -aw '$(DESTDIR_SQ)')
     +	DESTDIR_MIXED = $(shell cygpath -am '$(DESTDIR_SQ)')
  • 274: 8a1c124 = 225: 82ca96f mingw: kill child processes in a gentler way

  • 275: 27e7db4 = 226: 5dc0ec2 mingw: do not call xutftowcs_path in mingw_mktemp

  • 273: 104929a ! 227: 31d24d9 mingw: optionally enable wsl compability file mode bits

    @@ Commit message
         Signed-off-by: xungeng li <[email protected]>
         Signed-off-by: Johannes Schindelin <[email protected]>
     
    - ## Documentation/config/core.txt ##
    -@@ Documentation/config/core.txt: core.maxTreeDepth::
    + ## Documentation/config/core.adoc ##
    +@@ Documentation/config/core.adoc: core.maxTreeDepth::
      	to allow Git to abort cleanly, and should not generally need to
      	be adjusted. When Git is compiled with MSVC, the default is 512.
      	Otherwise, the default is 2048.
    @@ contrib/buildsystems/CMakeLists.txt: if(CMAKE_SYSTEM_NAME STREQUAL "Windows")
      		compat/nedmalloc/nedmalloc.c
      		compat/strdup.c
      		compat/win32/fscache.c)
    +
    + ## meson.build ##
    +@@ meson.build: elif host_machine.system() == 'windows'
    +     'compat/win32/path-utils.c',
    +     'compat/win32/pthread.c',
    +     'compat/win32/syslog.c',
    ++    'compat/win32/wsl.c',
    +     'compat/win32mmap.c',
    +     'compat/nedmalloc/nedmalloc.c',
    +   ]
  • 276: 0a3b2f8 = 228: 1a2b289 mingw: really handle SIGINT

  • 277: dfea28f = 229: 8b86828 Partially un-revert "editor: save and reset terminal after calling EDITOR"

  • 279: eca0f8c = 230: ceaeb32 Describe Git for Windows' architecture [no ci]

  • 282: b7e1428 = 231: 64cf4ee Add a GitHub workflow to monitor component updates

  • 280: 1cf1df4 = 232: 2c73a57 Modify the Code of Conduct for Git for Windows

  • 278: b0303bc ! 233: bc143cb reset: reinstate support for the deprecated --stdin option

    @@ Commit message
         Helped-by: Matthew John Cheetham <[email protected]>
         Signed-off-by: Johannes Schindelin <[email protected]>
     
    - ## Documentation/git-reset.txt ##
    -@@ Documentation/git-reset.txt: SYNOPSIS
    + ## Documentation/git-reset.adoc ##
    +@@ Documentation/git-reset.adoc: SYNOPSIS
      'git reset' [-q] [--pathspec-from-file=<file> [--pathspec-file-nul]] [<tree-ish>]
      'git reset' (--patch | -p) [<tree-ish>] [--] [<pathspec>...]
      'git reset' [--soft | --mixed [-N] | --hard | --merge | --keep] [-q] [<commit>]
    @@ Documentation/git-reset.txt: SYNOPSIS
      
      DESCRIPTION
      -----------
    -@@ Documentation/git-reset.txt: OPTIONS
    +@@ Documentation/git-reset.adoc: OPTIONS
      +
      For more details, see the 'pathspec' entry in linkgit:gitglossary[7].
      
  • 284: 1e8d48d ! 234: 0df1f50 fsmonitor: reintroduce core.useBuiltinFSMonitor

    @@ Commit message
     
         Signed-off-by: Victoria Dye <[email protected]>
     
    - ## Documentation/config/advice.txt ##
    -@@ Documentation/config/advice.txt: all advice messages.
    + ## Documentation/config/advice.adoc ##
    +@@ Documentation/config/advice.adoc: all advice messages.
      		Shown when the user tries to create a worktree from an
      		invalid reference, to tell the user how to create a new unborn
      		branch instead.
  • 285: a556355 = 235: 32e431e dependabot: help keeping GitHub Actions versions up to date

  • 281: 0d30207 = 236: cee777f CONTRIBUTING.md: add guide for first-time contributors

  • 283: d8f3a6a = 237: cb5a3e7 README.md: Add a Windows-specific preamble

  • 286: 5f99cfa = 238: e42d2d7 Add an issue template

  • 287: 4b262bd = 239: 5688f5e Modify the GitHub Pull Request template (to reflect Git for Windows)

  • 288: 2363214 = 240: fdb4334 SECURITY.md: document Git for Windows' policies

  • 289: 6a994b2 (upstream: 975fc04) < -: ------------ compat/mingw: rename the symlink, not the target

  • 290: 87ce6a0 < -: ------------ fixup! mingw: add a cache below mingw's lstat and dirent implementations

  • 291: 46fe8c9 < -: ------------ fixup! fscache: implement an FSCache-aware is_mount_point()

  • 295: d5953d8 < -: ------------ fixup! mingw: add a Makefile target to copy test artifacts

  • 296: 56c4f54 < -: ------------ fixup! 87ce6a0

  • 297: d16eadf < -: ------------ fixup! 46fe8c9

As you can see, a megaton of changes. A lot of those were due to upstream's interesting decision to break anyone linking to the Documentation/*.txt files by renaming them to Documentation/*.adoc, and by the migration to Meson, and by the refactoring to add struct repository * parameters, and I probably forgot more refactorings that caused problems.

  • 35: f9b4cc2 < -: ------------ ci: adjust Azure Pipeline for runs_on_pool

This patch was dropped because I finally gave up fighting upstream on Azure Pipelines support: They really don't want it, and I'm done reinstating it.

  • -: ------------ > 128: c54d66f ident: stop assuming that gw_gecos is writable

  • -: ------------ > 129: e8c4e0f meson: fix sorting

These, as well as the ENSURE_MSYSTEM_IS_SET and the #pragma changes are needed to appease one or another compiler or compile flags combination.

@dscho
Copy link
Member Author

dscho commented Feb 26, 2025

I will just go ahead and ignore this check-whitespace failure:

--- 4b99546 t/unit-tests: convert strbuf test to use clar test framework
t/unit-tests/u-strbuf.c:37: indent with spaces.

+ * In case the buffer contains anything, `alloc` must alloc must
t/unit-tests/u-strbuf.c:38: indent with spaces.
+ * be at least one byte larger than `len`.
t/unit-tests/u-strbuf.c:39: indent with spaces.
+ */ 
t/unit-tests/u-strbuf.c:41: indent with spaces.
+ cl_assert(buf->len < buf->alloc);

This commit has been made upstream, and if they cannot follow their own white-space rules, who am I to judge them.

@dscho
Copy link
Member Author

dscho commented Feb 26, 2025

It's a bit ridiculous that the total CI build time is now expected to be at 9½ hours, but hey, at least it's better than ~15½h which we will soon be graced with.

@dscho
Copy link
Member Author

dscho commented Feb 26, 2025

/add relnote feature The previously-experimental --full-name-hash option has been accepted into upstream Git as --name-hash-version=2 and is no longer experimental.

The workflow run was started

@dscho
Copy link
Member Author

dscho commented Feb 26, 2025

/add relnote feature The git backfill command has been accepted into upstream Git; Its --batch-size=<n> option has been renamed to --min-batch-size=<n>, though.

The workflow run was started

@dscho
Copy link
Member Author

dscho commented Feb 26, 2025

/git-artifacts

The tag-git workflow run was started

The git-artifacts-x86_64 workflow run was started.
The git-artifacts-i686 workflow run was started.
The git-artifacts-aarch64 workflow run was started.

@dscho
Copy link
Member Author

dscho commented Feb 26, 2025

/release

The release-git workflow run was started

@gitforwindowshelper gitforwindowshelper bot merged commit d20d8cd into git-for-windows:main Feb 26, 2025
82 of 83 checks passed
@dscho dscho deleted the rebase-to-v2.49.0-rc0 branch February 26, 2025 23:44
@dscho dscho linked an issue Feb 27, 2025 that may be closed by this pull request
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[New git version] v2.49.0-rc0