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

Reorganize Git for Windows' patches and topic branches #5406

Merged
merged 394 commits into from
Feb 7, 2025

Conversation

dscho
Copy link
Member

@dscho dscho commented Feb 6, 2025

This PR introduces a merging-rebase purely to reorganize what is in this fork's default branch. The main clean-ups are:

  • The backports that were needed to apply the security fixes to upstream Git's maint-2.40 (which was not maintained very well, failing CI builds) were dropped; They are already part of v2.48.0 (they were backports, after all).
  • The fall-out of Drop support for CI builds using Azure Pipelines #5389 (I moved the patches that drop Azure Pipeline/vcxproj support to the beginning, and then dropped all of the patches that modified the now-no-longer-existing parts).
  • I also moved the security fixes to the beginning.
  • fixup!s were applied.
  • Combined many of the fscache topics into a single one. Who knows whether I will upstream this topic at all, it's somewhat incompatible with partial clones, and FSMonitor might turn out to be good enough on its own (FSCache would help the cold-cache scenario, though).

All in all, there are still a little under 300 patches (291, to be precise, down from 319) organized in a little over 100 topic branches (102, to be precise, down from 121). I have to admit that I am a bit satisfied by the outcome.

Note that the outcome is strictly tree-same, i.e. this PR's combined diff is empty.

GitHub complained about a "too long PR body" so I'll post the range-diff as a follow-up comment.

dscho and others added 30 commits February 6, 2025 16:33
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]>
This option is still under discussion on the Git mailing list.

We still would like to have some real-world data, and the best way to
get it is to get a Git for Windows release into users' hands so that
they can test it.

Nevertheless, without the official blessing of the Git maintainer, this
optionis experimental, and we need to be clear about that.

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]>
We add the ability to filter the object types in the path-walk API so
the callback function is called fewer times.

This adds the ability to ask for the commits in a list, as well. Future
changes will add the ability to visit annotated tags.

Signed-off-by: Derrick Stolee <[email protected]>
In anticipation of using the path-walk API to analyze tags or include
them in a pack-file, add the ability to walk the tags that were included
in the revision walk.

Signed-off-by: Derrick Stolee <[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 option causes the path-walk API to act like the sparse tree-walk
algorithm implemented by mark_trees_uninteresting_sparse() in
list-objects.c.

Starting from the commits marked as UNINTERESTING, their root trees and
all objects reachable from those trees are UNINTERSTING, at least as we
walk path-by-path. When we reach a path where all objects associated
with that path are marked UNINTERESTING, then do no continue walking the
children of that path.

We need to be careful to pass the UNINTERESTING flag in a deep way on
the UNINTERESTING objects before we start the path-walk, or else the
depth-first search for the path-walk API may accidentally report some
objects as interesting.

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]>
In anticipation of implementing 'git backfill', populate the necessary files
with the boilerplate of a new builtin.

RFC TODO: When preparing this for a full implementation, make sure it is
based on the newest standards introduced by [1].

[1] https://lore.kernel.org/git/[email protected]/T/#m606036ea2e75a6d6819d6b5c90e729643b0ff7f7
    [PATCH 1/3] builtin: add a repository parameter for builtin functions

Signed-off-by: Derrick Stolee <[email protected]>
Adapting the implementation of ll_find_deltas(), create a threaded
version of the --path-walk compression step in 'git pack-objects'.

This involves adding a 'regions' member to the thread_params struct,
allowing each thread to own a section of paths. We can simplify the way
jobs are split because there is no value in extending the batch based on
name-hash the way sections of the object entry array are attempted to be
grouped. We re-use the 'list_size' and 'remaining' items for the purpose
of borrowing work in progress from other "victim" threads when a thread
has finished its batch of work more quickly.

Using the Git repository as a test repo, the p5313 performance test
shows that the resulting size of the repo is the same, but the threaded
implementation gives gains of varying degrees depending on the number of
objects being packed. (This was tested on a 16-core machine.)

Test                                    HEAD~1    HEAD
-------------------------------------------------------------
5313.6: thin pack with --path-walk        0.01    0.01  +0.0%
5313.7: thin pack size with --path-walk    475     475  +0.0%
5313.12: big pack with --path-walk        1.99    1.87  -6.0%
5313.13: big pack size with --path-walk  14.4M   14.3M  -0.4%
5313.18: repack with --path-walk         98.14   41.46 -57.8%
5313.19: repack size with --path-walk   197.2M  197.3M  +0.0%

Signed-off-by: Derrick Stolee <[email protected]>
When adding tree objects, we are very careful to avoid adding the same
tree object more than once. There was one small gap in that logic,
though: when adding a root tree object. Two refs can easily share the
same root tree object, and we should still not add it more than once.

Signed-off-by: Johannes Schindelin <[email protected]>
Start work on a new 'git survey' command to scan the repository
for monorepo performance and scaling problems.  The goal is to
measure the various known "dimensions of scale" and serve as a
foundation for adding additional measurements as we learn more
about Git monorepo scaling problems.

The initial goal is to complement the scanning and analysis performed
by the GO-based 'git-sizer' (https://github.com/github/git-sizer) tool.
It is hoped that by creating a builtin command, we may be able to take
advantage of internal Git data structures and code that is not
accessible from GO to gain further insight into potential scaling
problems.

Co-authored-by: Derrick Stolee <[email protected]>
Signed-off-by: Jeff Hostetler <[email protected]>
Signed-off-by: Derrick Stolee <[email protected]>
By default we will scan all references in "refs/heads/", "refs/tags/"
and "refs/remotes/".

Add command line opts let the use ask for all refs or a subset of them
and to include a detached HEAD.

Signed-off-by: Jeff Hostetler <[email protected]>
Signed-off-by: Derrick Stolee <[email protected]>
When 'git survey' provides information to the user, this will be presented
in one of two formats: plaintext and JSON. The JSON implementation will be
delayed until the functionality is complete for the plaintext format.

The most important parts of the plaintext format are headers specifying the
different sections of the report and tables providing concreted data.

Create a custom table data structure that allows specifying a list of
strings for the row values. When printing the table, check each column for
the maximum width so we can create a table of the correct size from the
start.

The table structure is designed to be flexible to the different kinds of
output that will be implemented in future changes.

Signed-off-by: Derrick Stolee <[email protected]>
At the moment, nothing is obvious about the reason for the use of the
path-walk API, but this will become more prevelant in future iterations. For
now, use the path-walk API to sum up the counts of each kind of object.

For example, this is the reachable object summary output for my local repo:

REACHABLE OBJECT SUMMARY
========================
Object Type |  Count
------------+-------
       Tags |   1343
    Commits | 179344
      Trees | 314350
      Blobs | 184030

Signed-off-by: Derrick Stolee <[email protected]>
Now that we have explored objects by count, we can expand that a bit more to
summarize the data for the on-disk and inflated size of those objects. This
information is helpful for diagnosing both why disk space (and perhaps
clone or fetch times) is growing but also why certain operations are slow
because the inflated size of the abstract objects that must be processed is
so large.

Signed-off-by: Derrick Stolee <[email protected]>
The default behavior of 'git backfill' is to fetch all missing blobs that
are reachable from HEAD. Document and test this behavior.

The implementation is a very simple use of the path-walk API, initializing
the revision walk at HEAD to start the path-walk from all commits reachable
from HEAD. Ignore the object arrays that correspond to tree entries,
assuming that they are all present already.

Signed-off-by: Derrick Stolee <[email protected]>
Users may want to specify a minimum batch size for their needs. This is only
a minimum: the path-walk API provides a list of OIDs that correspond to the
same path, and thus it is optimal to allow delta compression across those
objects in a single server request.

We could consider limiting the request to have a maximum batch size in the
future.

Signed-off-by: Derrick Stolee <[email protected]>
In future changes, we will make use of these methods. The intention is to
keep track of the top contributors according to some metric. We don't want
to store all of the entries and do a sort at the end, so track a
constant-size table and remove rows that get pushed out depending on the
chosen sorting algorithm.

Co-authored-by: Jeff Hostetler <[email protected]>
Signed-off-by; Jeff Hostetler <[email protected]>
Signed-off-by: Derrick Stolee <[email protected]>
One way to significantly reduce the cost of a Git clone and later fetches is
to use a blobless partial clone and combine that with a sparse-checkout that
reduces the paths that need to be populated in the working directory. Not
only does this reduce the cost of clones and fetches, the sparse-checkout
reduces the number of objects needed to download from a promisor remote.

However, history investigations can be expensie as computing blob diffs will
trigger promisor remote requests for one object at a time. This can be
avoided by downloading the blobs needed for the given sparse-checkout using
'git backfill' and its new '--sparse' mode, at a time that the user is
willing to pay that extra cost.

Note that this is distinctly different from the '--filter=sparse:<oid>'
option, as this assumes that the partial clone has all reachable trees and
we are using client-side logic to avoid downloading blobs outside of the
sparse-checkout cone. This avoids the server-side cost of walking trees
while also achieving a similar goal. It also downloads in batches based on
similar path names, presenting a resumable download if things are
interrupted.

This augments the path-walk API to have a possibly-NULL 'pl' member that may
point to a 'struct pattern_list'. This could be more general than the
sparse-checkout definition at HEAD, but 'git backfill --sparse' is currently
the only consumer.

Be sure to test this in both cone mode and not cone mode. Cone mode has the
benefit that the path-walk can skip certain paths once they would expand
beyond the sparse-checkout.

Signed-off-by: Derrick Stolee <[email protected]>
Since we are already walking our reachable objects using the path-walk API,
let's now collect lists of the paths that contribute most to different
metrics. Specifically, we care about

 * Number of versions.
 * Total size on disk.
 * Total inflated size (no delta or zlib compression).

This information can be critical to discovering which parts of the
repository are causing the most growth, especially on-disk size. Different
packing strategies might help compress data more efficiently, but the toal
inflated size is a representation of the raw size of all snapshots of those
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.

Signed-off-by: Derrick Stolee <[email protected]>
The previous change introduced the '--[no-]sparse' option for the 'git
backfill' command, but did not assume it as enabled by default. However,
this is likely the behavior that users will most often want to happen.
Without this default, users with a small sparse-checkout may be confused
when 'git backfill' downloads every version of every object in the full
history.

However, this is left as a separate change so this decision can be reviewed
independently of the value of the '--[no-]sparse' option.

Add a test of adding the '--sparse' option to a repo without sparse-checkout
to make it clear that supplying it without a sparse-checkout is an error.

Signed-off-by: Derrick Stolee <[email protected]>
The 'git survey' builtin provides several detail tables, such as "top
files by on-disk size". The size of these tables defaults to 10,
currently.

Allow the user to specify this number via a new --top=<N> option or the
new survey.top config key.

Signed-off-by: Derrick Stolee <[email protected]>
Signed-off-by: Johannes Schindelin <[email protected]>
shiftkey and others added 21 commits February 6, 2025 19:12
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]>
Rather than using private IFTTT Applets that send mails to this
maintainer whenever a new version of a Git for Windows component was
released, let's use the power of GitHub workflows to make this process
publicly visible.

This workflow monitors the Atom/RSS feeds, and opens a ticket whenever a
new version was released.

Note: Bash sometimes releases multiple patched versions within a few
minutes of each other (i.e. 5.1p1 through 5.1p4, 5.0p15 and 5.0p16). The
MSYS2 runtime also has a similar system. We can address those patches as
a group, so we shouldn't get multiple issues about them.

Note further: We're not acting on newlib releases, OpenSSL alphas, Perl
release candidates or non-stable Perl releases. There's no need to open
issues about them.

Co-authored-by: Matthias Aßhauer <[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]>
These are Git for Windows' Git GUI and gitk patches. We will have to
decide at some point what to do about them, but that's a little lower
priority (as Git GUI seems to be unmaintained for the time being, and
the gitk maintainer keeps a very low profile on the Git mailing list,
too).

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 requested review from mjcheetham and rimrul February 6, 2025 18:28
@dscho dscho self-assigned this Feb 6, 2025
@dscho
Copy link
Member Author

dscho commented Feb 6, 2025

Range-diff relative to main
  • 1: 0d606d8 < -: ------------ ci: remove 'Upload failed tests' directories' step from linux32 jobs

  • 2: 5d82887 < -: ------------ mingw: drop bogus (and unneeded) declaration of _pgmptr

  • 3: 7e6073d < -: ------------ compat/regex: fix argument order to calloc(3)

  • 4: 83b08eb < -: ------------ t7300: work around platform-specific behaviour with long paths on MinGW

  • 5: c903985 ! 1: 501d8da credential_format(): also encode [:]

    @@ strbuf.c: void strbuf_add_percentencode(struct strbuf *dst, const char *src, int
      			strbuf_addch(dst, ch);
     
      ## strbuf.h ##
    -@@ strbuf.h: size_t strbuf_expand_dict_cb(struct strbuf *sb,
    +@@ strbuf.h: void strbuf_expand_bad_format(const char *format, const char *command);
      void strbuf_addbuf_percentquote(struct strbuf *dst, const struct strbuf *src);
      
      #define STRBUF_ENCODE_SLASH 1
  • 6: 7725b81 ! 2: db58126 credential: sanitize the user prompt

    @@ credential.c: static char *credential_ask_one(const char *what, struct credentia
     
      ## credential.h ##
     @@ credential.h: struct credential {
    - 		 configured:1,
    + 		 multistage: 1,
      		 quit:1,
      		 use_http_path:1,
     -		 username_from_proto:1;
     +		 username_from_proto:1,
     +		 sanitize_prompt:1;
      
    - 	char *username;
    - 	char *password;
    + 	struct credential_capability capa_authtype;
    + 	struct credential_capability capa_state;
     @@ credential.h: struct credential {
    - #define CREDENTIAL_INIT { \
    - 	.helpers = STRING_LIST_INIT_DUP, \
    - 	.password_expiry_utc = TIME_MAX, \
    + 	.wwwauth_headers = STRVEC_INIT, \
    + 	.state_headers = STRVEC_INIT, \
    + 	.state_headers_to_send = STRVEC_INIT, \
     +	.sanitize_prompt = 1, \
      }
      
    @@ t/t0300-credentials.sh: test_expect_success 'setup helper scripts' '
      '
      
     @@ t/t0300-credentials.sh: test_expect_success 'credential config with partial URLs' '
    - 	test_i18ngrep "skipping credential lookup for key" stderr
    + 	test_grep "skipping credential lookup for key" stderr
      '
      
     +BEL="$(printf '\007')"
  • 7: b01b9b8 ! 3: 429023c credential: disallow Carriage Returns in the protocol by default

    @@ credential.c: static int credential_config_callback(const char *var, const char
      
      	return 0;
      }
    -@@ credential.c: int credential_read(struct credential *c, FILE *fp)
    +@@ credential.c: int credential_read(struct credential *c, FILE *fp,
      	return 0;
      }
      
    @@ credential.c: static void credential_write_item(FILE *fp, const char *key, const
      	fprintf(fp, "%s=%s\n", key, value);
      }
      
    - void credential_write(const struct credential *c, FILE *fp)
    +@@ credential.c: void credential_write(const struct credential *c, FILE *fp,
    + 		      enum credential_op_type op_type)
      {
    + 	if (credential_has_capability(&c->capa_authtype, op_type))
    +-		credential_write_item(fp, "capability[]", "authtype", 0);
    ++		credential_write_item(c, fp, "capability[]", "authtype", 0);
    + 	if (credential_has_capability(&c->capa_state, op_type))
    +-		credential_write_item(fp, "capability[]", "state", 0);
    ++		credential_write_item(c, fp, "capability[]", "state", 0);
    + 
    + 	if (credential_has_capability(&c->capa_authtype, op_type)) {
    +-		credential_write_item(fp, "authtype", c->authtype, 0);
    +-		credential_write_item(fp, "credential", c->credential, 0);
    ++		credential_write_item(c, fp, "authtype", c->authtype, 0);
    ++		credential_write_item(c, fp, "credential", c->credential, 0);
    + 		if (c->ephemeral)
    +-			credential_write_item(fp, "ephemeral", "1", 0);
    ++			credential_write_item(c, fp, "ephemeral", "1", 0);
    + 	}
     -	credential_write_item(fp, "protocol", c->protocol, 1);
     -	credential_write_item(fp, "host", c->host, 1);
     -	credential_write_item(fp, "path", c->path, 0);
     -	credential_write_item(fp, "username", c->username, 0);
     -	credential_write_item(fp, "password", c->password, 0);
    +-	credential_write_item(fp, "oauth_refresh_token", c->oauth_refresh_token, 0);
     +	credential_write_item(c, fp, "protocol", c->protocol, 1);
     +	credential_write_item(c, fp, "host", c->host, 1);
     +	credential_write_item(c, fp, "path", c->path, 0);
     +	credential_write_item(c, fp, "username", c->username, 0);
     +	credential_write_item(c, fp, "password", c->password, 0);
    ++	credential_write_item(c, fp, "oauth_refresh_token", c->oauth_refresh_token, 0);
      	if (c->password_expiry_utc != TIME_MAX) {
      		char *s = xstrfmt("%"PRItime, c->password_expiry_utc);
     -		credential_write_item(fp, "password_expiry_utc", s, 0);
     +		credential_write_item(c, fp, "password_expiry_utc", s, 0);
      		free(s);
      	}
    + 	for (size_t i = 0; i < c->wwwauth_headers.nr; i++)
    +-		credential_write_item(fp, "wwwauth[]", c->wwwauth_headers.v[i], 0);
    ++		credential_write_item(c, fp, "wwwauth[]", c->wwwauth_headers.v[i], 0);
    + 	if (credential_has_capability(&c->capa_state, op_type)) {
    + 		if (c->multistage)
    +-			credential_write_item(fp, "continue", "1", 0);
    ++			credential_write_item(c, fp, "continue", "1", 0);
    + 		for (size_t i = 0; i < c->state_headers_to_send.nr; i++)
    +-			credential_write_item(fp, "state[]", c->state_headers_to_send.v[i], 0);
    ++			credential_write_item(c, fp, "state[]", c->state_headers_to_send.v[i], 0);
    + 	}
      }
    + 
     
      ## credential.h ##
     @@ credential.h: struct credential {
    @@ credential.h: struct credential {
     +		 sanitize_prompt:1,
     +		 protect_protocol:1;
      
    - 	char *username;
    - 	char *password;
    + 	struct credential_capability capa_authtype;
    + 	struct credential_capability capa_state;
     @@ credential.h: struct credential {
    - 	.helpers = STRING_LIST_INIT_DUP, \
    - 	.password_expiry_utc = TIME_MAX, \
    + 	.state_headers = STRVEC_INIT, \
    + 	.state_headers_to_send = STRVEC_INIT, \
      	.sanitize_prompt = 1, \
     +	.protect_protocol = 1, \
      }
  • 12: ff40506 = 4: ee1479b unix-socket: avoid leak when initialization fails

  • 8: 5b25741 ! 5: 20dfd7e sideband: mask control characters

    @@ t/t5409-colorize-remote-messages.sh: test_expect_success 'fallback to color.ui'
     +	test_commit need-at-least-one-commit &&
     +	git clone --no-local . throw-away 2>stderr &&
     +	test_decode_color <stderr >decoded &&
    -+	test_i18ngrep ! RED decoded
    ++	test_grep ! RED decoded
     +'
     +
      test_done
  • 9: a8c289b ! 6: e6a6b9d sideband: introduce an "escape hatch" to allow control characters

    @@ sideband.c: static int use_sideband_colors(void)
     +	git_config_get_bool("sideband.allowcontrolcharacters",
     +			    &allow_control_characters);
     +
    - 	if (!git_config_get_string(key, &value)) {
    + 	if (!git_config_get_string_tmp(key, &value))
      		use_sideband_colors_cached = git_config_colorbool(key, value);
    - 	} else if (!git_config_get_string("color.ui", &value)) {
    + 	else if (!git_config_get_string_tmp("color.ui", &value))
     @@ sideband.c: void list_config_color_sideband_slots(struct string_list *list, const char *pref
      
      static void strbuf_add_sanitized(struct strbuf *dest, const char *src, int n)
    @@ t/t5409-colorize-remote-messages.sh: test_expect_success 'disallow (color) contr
     +
      	git clone --no-local . throw-away 2>stderr &&
      	test_decode_color <stderr >decoded &&
    --	test_i18ngrep ! RED decoded
    -+	test_i18ngrep ! RED decoded &&
    +-	test_grep ! RED decoded
    ++	test_grep ! RED decoded &&
     +
     +	rm -rf throw-away &&
     +	git -c sideband.allowControlCharacters clone --no-local . throw-away 2>stderr &&
     +	test_decode_color <stderr >decoded &&
    -+	test_i18ngrep RED decoded
    ++	test_grep RED decoded
      '
      
      test_done
  • 10: c7049c2 ! 7: 656fe4e sideband: do allow ANSI color sequences by default

    @@ sideband.c: static int use_sideband_colors(void)
     +			ALLOW_NO_CONTROL_CHARACTERS;
     +		break;
     +	case -1: /* non-Boolean value */
    -+		if (git_config_get_string("sideband.allowcontrolcharacters",
    -+					  &value))
    ++		if (git_config_get_string_tmp("sideband.allowcontrolcharacters",
    ++					      &value))
     +			; /* huh? `get_maybe_bool()` returned -1 */
     +		else if (!strcmp(value, "color"))
     +			allow_control_characters = ALLOW_ANSI_COLOR_SEQUENCES;
    @@ sideband.c: static int use_sideband_colors(void)
     +		break; /* not configured */
     +	}
      
    - 	if (!git_config_get_string(key, &value)) {
    + 	if (!git_config_get_string_tmp(key, &value))
      		use_sideband_colors_cached = git_config_colorbool(key, value);
     @@ sideband.c: void list_config_color_sideband_slots(struct string_list *list, const char *pref
      		list_config_item(list, prefix, keywords[i].keyword);
    @@ t/t5409-colorize-remote-messages.sh: test_expect_success 'disallow (color) contr
      
      	git clone --no-local . throw-away 2>stderr &&
      	test_decode_color <stderr >decoded &&
    -+	test_i18ngrep RED decoded &&
    -+	test_i18ngrep "\\^G" stderr &&
    ++	test_grep RED decoded &&
    ++	test_grep "\\^G" stderr &&
     +	tr -dc "\\007" <stderr >actual &&
     +	test_must_be_empty actual &&
     +
    @@ t/t5409-colorize-remote-messages.sh: test_expect_success 'disallow (color) contr
     +	git -c sideband.allowControlCharacters=false \
     +		clone --no-local . throw-away 2>stderr &&
     +	test_decode_color <stderr >decoded &&
    - 	test_i18ngrep ! RED decoded &&
    -+	test_i18ngrep "\\^G" stderr &&
    + 	test_grep ! RED decoded &&
    ++	test_grep "\\^G" stderr &&
      
      	rm -rf throw-away &&
      	git -c sideband.allowControlCharacters clone --no-local . throw-away 2>stderr &&
      	test_decode_color <stderr >decoded &&
    --	test_i18ngrep RED decoded
    -+	test_i18ngrep RED decoded &&
    +-	test_grep RED decoded
    ++	test_grep RED decoded &&
     +	tr -dc "\\007" <stderr >actual &&
     +	test_file_not_empty actual
      '
  • 11: 4099ea9 < -: ------------ fixup! mingw: optionally enable wsl compability file mode bits

  • 19: 8d24d56 = 8: acbcc27 test-lib: invert return value of check_test_results_san_file_empty

  • 20: b9a9df9 = 9: 5996c9f test-lib: simplify lsan results check

  • 304: 75bc40d = 10: 6b442e6 bswap.h: squelch potential sparse -Wcast-truncate warnings

  • 14: 0ad3d65 = 11: 77568b2 object-file: fix race in object collision check

  • 305: b3c9b61 ! 12: 0e3ae59 packfile: factor out --pack_header argument parsing

    @@ Commit message
         Signed-off-by: Johannes Schindelin <[email protected]>
     
      ## builtin/index-pack.c ##
    -@@ builtin/index-pack.c: int cmd_index_pack(int argc, const char **argv, const char *prefix)
    +@@ builtin/index-pack.c: int cmd_index_pack(int argc,
      					nr_threads = 1;
      				}
      			} else if (starts_with(arg, "--pack_header=")) {
    @@ builtin/unpack-objects.c
      
      static int dry_run, quiet, recover, has_errors, strict;
      static const char unpack_usage[] = "git unpack-objects [-n] [-q] [-r] [--strict]";
    -@@ builtin/unpack-objects.c: int cmd_unpack_objects(int argc, const char **argv, const char *prefix UNUSED)
    +@@ builtin/unpack-objects.c: int cmd_unpack_objects(int argc,
      				continue;
      			}
      			if (starts_with(arg, "--pack_header=")) {
    @@ builtin/unpack-objects.c: int cmd_unpack_objects(int argc, const char **argv, co
      			if (skip_prefix(arg, "--max-input-size=", &arg)) {
     
      ## packfile.c ##
    -@@ packfile.c: int is_promisor_object(const struct object_id *oid)
    +@@ packfile.c: int is_promisor_object(struct repository *r, const struct object_id *oid)
      	}
      	return oidset_contains(&promisor_objects, oid);
      }
    @@ packfile.c: int is_promisor_object(const struct object_id *oid)
     +}
     
      ## packfile.h ##
    -@@ packfile.h: int is_promisor_object(const struct object_id *oid);
    +@@ packfile.h: int is_promisor_object(struct repository *r, const struct object_id *oid);
      int load_idx(const char *path, const unsigned int hashsz, void *idx_map,
      	     size_t idx_size, struct packed_git *p);
      
  • 16: c1acf1a = 13: db47f3b object-file: rename variables in check_collision()

  • 306: 56c5e82 ! 14: 9992be6 parse_pack_header_option(): avoid unaligned memory writes

    @@ Commit message
         Signed-off-by: Johannes Schindelin <[email protected]>
     
      ## packfile.c ##
    -@@ packfile.c: int is_promisor_object(const struct object_id *oid)
    +@@ packfile.c: int is_promisor_object(struct repository *r, const struct object_id *oid)
      
      int parse_pack_header_option(const char *in, unsigned char *out, unsigned int *len)
      {
  • 17: cfae50e = 15: c712ec9 object-file: don't special-case missing source file in collision check

  • 307: 7215d58 = 16: 2fe489d index-pack, unpack-objects: use get_be32() for reading pack header

  • 297: 71e19a0 = 17: c9bd22e object-name: fix resolution of object names containing curly braces

  • 299: bc67b4a ! 18: 5e1c7b1 reftable: write correct max_update_index to header

    @@ refs/reftable-backend.c: struct write_transaction_table_arg {
      };
      
      struct reftable_transaction_data {
    +@@ refs/reftable-backend.c: static int prepare_transaction_update(struct write_transaction_table_arg **out,
    + 		arg->updates_nr = 0;
    + 		arg->updates_alloc = 0;
    + 		arg->updates_expected = 0;
    ++		arg->max_index = 0;
    + 	}
    + 
    + 	arg->updates_expected++;
     @@ refs/reftable-backend.c: static int write_transaction_table(struct reftable_writer *writer, void *cb_data
      	struct reftable_log_record *logs = NULL;
      	struct ident_split committer_ident = {0};
    @@ refs/reftable-backend.c: static int reftable_be_transaction_finish(struct ref_st
     +		tx_data->args->max_index = transaction->max_index;
     +
      	for (size_t i = 0; i < tx_data->args_nr; i++) {
    ++		tx_data->args[i].max_index = transaction->max_index;
    ++
      		ret = reftable_addition_add(tx_data->args[i].addition,
      					    write_transaction_table, &tx_data->args[i]);
    + 		if (ret < 0)
     
      ## t/t1460-refs-migrate.sh ##
     @@ t/t1460-refs-migrate.sh: do
  • 21: 164a251 = 19: 9804f3a test-lib: add a few comments to LSan log checking

  • 18: d7fcbe2 = 20: c7eb1e3 object-file: retry linking file into place when occluding file vanishes

  • 308: f2d9cf9 ! 21: 15af087 index-pack, unpack-objects: use skip_prefix to avoid magic number

    @@ Commit message
         Signed-off-by: Johannes Schindelin <[email protected]>
     
      ## builtin/index-pack.c ##
    -@@ builtin/index-pack.c: int cmd_index_pack(int argc, const char **argv, const char *prefix)
    +@@ builtin/index-pack.c: int cmd_index_pack(int argc,
      					warning(_("no threads support, ignoring %s"), arg);
      					nr_threads = 1;
      				}
    @@ builtin/index-pack.c: int cmd_index_pack(int argc, const char **argv, const char
      			} else if (!strcmp(arg, "--progress-title")) {
     
      ## builtin/unpack-objects.c ##
    -@@ builtin/unpack-objects.c: int cmd_unpack_objects(int argc, const char **argv, const char *prefix UNUSED)
    +@@ builtin/unpack-objects.c: int cmd_unpack_objects(int argc,
      				fsck_set_msg_types(&fsck_options, arg);
      				continue;
      			}
  • 298: 191f0c8 = 22: 1b7dea1 object-name: be more strict in parsing describe-like output

  • 309: 6638779 = 23: f8daf7c refs: mark ref_transaction_update_reflog() as static

  • 301: 5e58db6 = 24: ffcfbe7 ref-filter: move ahead-behind bases into used_atom

  • 310: a89e12d = 25: f1ae60f refs: use 'uint64_t' for 'ref_update.index'

  • 312: 1edca76 = 26: b710fe8 trace2: prevent segfault on config collection where no value specified

  • 302: 7ee4fd1 = 27: 64055b3 ref-filter: move is-base tip to used_atom

  • 311: 148560f ! 28: 8a95fbc reftable: prevent 'update_index' changes after adding records

    @@ refs/reftable-backend.c: static int write_transaction_table(struct reftable_writ
      	for (i = 0; i < arg->updates_nr; i++) {
      		struct reftable_transaction_update *tx_update = &arg->updates[i];
     @@ refs/reftable-backend.c: static int write_copy_table(struct reftable_writer *writer, void *cb_data)
    - 	deletion_ts = creation_ts = reftable_stack_next_update_index(arg->stack);
    + 	deletion_ts = creation_ts = reftable_stack_next_update_index(arg->be->stack);
      	if (arg->delete_old)
      		creation_ts++;
     -	reftable_writer_set_limits(writer, deletion_ts, creation_ts);
  • 313: b7a9905 = 29: 5b3ed30 grep: prevent ^$ false match at end of file

  • 303: c5490ce = 30: 3e1a53d ref-filter: remove ref_format_clear()

  • 296: 447cdec = 31: 355849e fetch set_head: fix non-mirror remotes in bare repositories

  • 13: 49edce4 = 32: 2bb96e4 show-index: the short help should say the command reads from its input

  • 22: 0b43274 = 33: 34a7cf4 credential-cache: respect authtype capability

  • 314: 86d0c30 = 34: 4573f9d update-ref: do set reflog's old_oid

  • 105: d4d7862 = 35: ca94787 ci: stop linking the prove cache

  • 317: e6e5b99 ! 36: 909223b amend! vcxproj: handle GUI programs, too

    @@ Metadata
     Author: Johannes Schindelin <[email protected]>
     
      ## Commit message ##
    -    amend! vcxproj: handle GUI programs, too
    -
         contrib/buildsystems: drop support for building .vcproj/.vcxproj files
     
         Before we had CMake support, the only way to build Git in Visual Studio
    @@ contrib/buildsystems/Generators/Vcxproj.pm (deleted)
     -    my $uuid = generate_guid($name);
     -    $$build_structure{"$prefix${target}_GUID"} = $uuid;
     -    my $vcxproj = $target;
    --    $vcxproj =~ s/(.*\/)?(.*)/$&.proj\/$2.vcxproj/;
    --    $vcxproj =~ s/([^\/]*)(\/lib\.proj)\/(lib.vcxproj)/$1$2\/$1_$3/;
    +-    $vcxproj =~ s/(.*\/)?(.*)/$&\/$2.vcxproj/;
    +-    $vcxproj =~ s/([^\/]*)(\/lib)\/(lib.vcxproj)/$1$2\/$1_$3/;
     -    $$build_structure{"$prefix${target}_VCXPROJ"} = $vcxproj;
     -
     -    my @srcs = sort(map("$rel_dir\\$_", @{$$build_structure{"$prefix${name}_SOURCES"}}));
    @@ contrib/buildsystems/Generators/Vcxproj.pm (deleted)
     -    my $libs_release = "\n    ";
     -    my $libs_debug = "\n    ";
     -    if (!$static_library && $name ne 'headless-git') {
    --      $libs_release = join(";", sort(grep /^(?!libgit\.lib|xdiff\/lib\.lib|vcs-svn\/lib\.lib|reftable\/libreftable(_test)?\.lib)/, @{$$build_structure{"$prefix${name}_LIBS"}}));
    +-      $libs_release = join(";", sort(grep /^(?!libgit\.lib|xdiff\/lib\.lib|vcs-svn\/lib\.lib|reftable\/libreftable\.lib)/, @{$$build_structure{"$prefix${name}_LIBS"}}));
     -      $libs_debug = $libs_release;
     -      $libs_debug =~ s/zlib\.lib/zlibd\.lib/g;
     -      $libs_debug =~ s/libexpat\.lib/libexpatd\.lib/g;
    @@ contrib/buildsystems/Generators/Vcxproj.pm (deleted)
     -    $defines =~ s/</&lt;/g;
     -    $defines =~ s/>/&gt;/g;
     -    $defines =~ s/\'//g;
    --    $defines =~ s/\\"/"/g;
    --
    --    my $rcdefines = $defines;
    --    $rcdefines =~ s/(?<!\\)"/\\$&/g;
     -
    --    my $entrypoint = 'wmainCRTStartup';
    --    my $subsystem = 'Console';
    --    if (grep /^-mwindows$/, @{$$build_structure{"$prefix${name}_LFLAGS"}}) {
    --        $entrypoint = 'wWinMainCRTStartup';
    --        $subsystem = 'Windows';
    --    }
    --
    --    my $dir = $vcxproj;
    --    $dir =~ s/\/[^\/]*$//;
    --    die "Could not create the directory $dir for $label project!\n" unless (-d "$dir" || mkdir "$dir");
    +-    die "Could not create the directory $target for $label project!\n" unless (-d "$target" || mkdir "$target");
     -
     -    open F, ">$vcxproj" or die "Could not open $vcxproj for writing!\n";
     -    binmode F, ":crlf :utf8";
    @@ contrib/buildsystems/Generators/Vcxproj.pm (deleted)
     -      <Configuration>Release</Configuration>
     -      <Platform>x64</Platform>
     -    </ProjectConfiguration>
    --    <ProjectConfiguration Include="Debug|ARM64">
    --      <Configuration>Debug</Configuration>
    --      <Platform>ARM64</Platform>
    --    </ProjectConfiguration>
    --    <ProjectConfiguration Include="Release|ARM64">
    --      <Configuration>Release</Configuration>
    --      <Platform>ARM64</Platform>
    --    </ProjectConfiguration>
     -  </ItemGroup>
     -  <PropertyGroup Label="Globals">
     -    <ProjectGuid>$uuid</ProjectGuid>
     -    <Keyword>Win32Proj</Keyword>
     -    <VCPKGArch Condition="'\$(Platform)'=='Win32'">x86-windows</VCPKGArch>
    --    <VCPKGArch Condition="'\$(Platform)'=='x64'">x64-windows</VCPKGArch>
    --    <VCPKGArch Condition="'\$(Platform)'=='ARM64'">arm64-windows</VCPKGArch>
    +-    <VCPKGArch Condition="'\$(Platform)'!='Win32'">x64-windows</VCPKGArch>
     -    <VCPKGArchDirectory>$cdup\\compat\\vcbuild\\vcpkg\\installed\\\$(VCPKGArch)</VCPKGArchDirectory>
     -    <VCPKGBinDirectory Condition="'\$(Configuration)'=='Debug'">\$(VCPKGArchDirectory)\\debug\\bin</VCPKGBinDirectory>
     -    <VCPKGLibDirectory Condition="'\$(Configuration)'=='Debug'">\$(VCPKGArchDirectory)\\debug\\lib</VCPKGLibDirectory>
    @@ contrib/buildsystems/Generators/Vcxproj.pm (deleted)
     -  </PropertyGroup>
     -  <PropertyGroup>
     -    <ConfigurationType>$config_type</ConfigurationType>
    --    <PlatformToolset>v142</PlatformToolset>
    +-    <PlatformToolset>v140</PlatformToolset>
     -    <!-- <CharacterSet>UTF-8</CharacterSet> -->
     -    <OutDir>..\\</OutDir>
     -    <!-- <IntDir>\$(ProjectDir)\$(Configuration)\\</IntDir> -->
    @@ contrib/buildsystems/Generators/Vcxproj.pm (deleted)
     -      <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
     -      <PrecompiledHeader />
     -      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
    --      <LanguageStandard_C>stdc11</LanguageStandard_C>
     -    </ClCompile>
     -    <Lib>
     -      <SuppressStartupBanner>true</SuppressStartupBanner>
    @@ contrib/buildsystems/Generators/Vcxproj.pm (deleted)
     -      <AdditionalLibraryDirectories>\$(VCPKGLibDirectory);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
     -      <AdditionalDependencies>\$(VCPKGLibs);\$(AdditionalDependencies)</AdditionalDependencies>
     -      <AdditionalOptions>invalidcontinue.obj %(AdditionalOptions)</AdditionalOptions>
    --      <EntryPointSymbol>$entrypoint</EntryPointSymbol>
    --      <SubSystem>$subsystem</SubSystem>
    +-      <EntryPointSymbol>wmainCRTStartup</EntryPointSymbol>
    +-      <ManifestFile>$cdup\\compat\\win32\\git.manifest</ManifestFile>
    +-      <SubSystem>Console</SubSystem>
     -    </Link>
     -EOM
     -    if ($target eq 'libgit') {
    @@ contrib/buildsystems/Generators/Vcxproj.pm (deleted)
     -    <PreBuildEvent Condition="!Exists('$cdup\\compat\\vcbuild\\vcpkg\\installed\\\$(VCPKGArch)\\include\\openssl\\ssl.h')">
     -      <Message>Initialize VCPKG</Message>
     -      <Command>del "$cdup\\compat\\vcbuild\\vcpkg"</Command>
    --      <Command>call "$cdup\\compat\\vcbuild\\vcpkg_install.bat" \$(VCPKGArch)</Command>
    +-      <Command>call "$cdup\\compat\\vcbuild\\vcpkg_install.bat"</Command>
     -    </PreBuildEvent>
     -EOM
     -    }
    @@ contrib/buildsystems/Generators/Vcxproj.pm (deleted)
     -      <PreprocessorDefinitions>WIN32;_DEBUG;$defines;%(PreprocessorDefinitions)</PreprocessorDefinitions>
     -      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
     -    </ClCompile>
    --    <ResourceCompile>
    --      <PreprocessorDefinitions>WIN32;_DEBUG;$rcdefines;%(PreprocessorDefinitions)</PreprocessorDefinitions>
    --    </ResourceCompile>
     -    <Link>
     -      <GenerateDebugInformation>true</GenerateDebugInformation>
     -    </Link>
    @@ contrib/buildsystems/Generators/Vcxproj.pm (deleted)
     -      <FunctionLevelLinking>true</FunctionLevelLinking>
     -      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
     -    </ClCompile>
    --    <ResourceCompile>
    --      <PreprocessorDefinitions>WIN32;NDEBUG;$rcdefines;%(PreprocessorDefinitions)</PreprocessorDefinitions>
    --    </ResourceCompile>
     -    <Link>
     -      <GenerateDebugInformation>true</GenerateDebugInformation>
     -      <EnableCOMDATFolding>true</EnableCOMDATFolding>
    @@ contrib/buildsystems/Generators/Vcxproj.pm (deleted)
     -  <ItemGroup>
     -EOM
     -    foreach(@sources) {
    --        if (/\.rc$/) {
    --            print F << "EOM";
    --    <ResourceCompile Include="$_" />
    --EOM
    --        } else {
    --            print F << "EOM";
    +-        print F << "EOM";
     -    <ClCompile Include="$_" />
     -EOM
    --        }
     -    }
     -    print F << "EOM";
     -  </ItemGroup>
    @@ contrib/buildsystems/Generators/Vcxproj.pm (deleted)
     -    if ((!$static_library || $target =~ 'vcs-svn' || $target =~ 'xdiff') && !($name =~ /headless-git/)) {
     -      my $uuid_libgit = $$build_structure{"LIBS_libgit_GUID"};
     -      my $uuid_libreftable = $$build_structure{"LIBS_reftable/libreftable_GUID"};
    --      my $uuid_libreftable_test = $$build_structure{"LIBS_reftable/libreftable_test_GUID"};
     -      my $uuid_xdiff_lib = $$build_structure{"LIBS_xdiff/lib_GUID"};
     -
     -      print F << "EOM";
     -  <ItemGroup>
    --    <ProjectReference Include="$cdup\\libgit.proj\\libgit.vcxproj">
    +-    <ProjectReference Include="$cdup\\libgit\\libgit.vcxproj">
     -      <Project>$uuid_libgit</Project>
     -      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
     -    </ProjectReference>
     -EOM
     -      if (!($name =~ /xdiff|libreftable/)) {
     -        print F << "EOM";
    --    <ProjectReference Include="$cdup\\reftable\\libreftable.proj\\libreftable.vcxproj">
    +-    <ProjectReference Include="$cdup\\reftable\\libreftable\\libreftable.vcxproj">
     -      <Project>$uuid_libreftable</Project>
     -      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
     -    </ProjectReference>
    --    <ProjectReference Include="$cdup\\reftable\\libreftable_test.proj\\libreftable_test.vcxproj">
    --      <Project>$uuid_libreftable_test</Project>
    --      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
    --    </ProjectReference>
     -EOM
     -      }
     -      if (!($name =~ 'xdiff')) {
     -        print F << "EOM";
    --    <ProjectReference Include="$cdup\\xdiff\\lib.proj\\xdiff_lib.vcxproj">
    +-    <ProjectReference Include="$cdup\\xdiff\\lib\\xdiff_lib.vcxproj">
     -      <Project>$uuid_xdiff_lib</Project>
     -      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
     -    </ProjectReference>
    @@ contrib/buildsystems/Generators/Vcxproj.pm (deleted)
     -      if ($name =~ /(test-(line-buffer|svn-fe)|^git-remote-testsvn)\.exe$/) {
     -        my $uuid_vcs_svn_lib = $$build_structure{"LIBS_vcs-svn/lib_GUID"};
     -        print F << "EOM";
    --    <ProjectReference Include="$cdup\\vcs-svn\\lib.proj\\vcs-svn_lib.vcxproj">
    +-    <ProjectReference Include="$cdup\\vcs-svn\\lib\\vcs-svn_lib.vcxproj">
     -      <Project>$uuid_vcs_svn_lib</Project>
     -      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
     -    </ProjectReference>
    @@ contrib/buildsystems/Generators/Vcxproj.pm (deleted)
     -	my $vcxproj = $build_structure{"APPS_${appname}_VCXPROJ"};
     -	$vcxproj =~ s/\//\\/g;
     -        $appname =~ s/.*\///;
    --        print F "\"${appname}.proj\", \"${vcxproj}\", \"${uuid}\"";
    +-        print F "\"${appname}\", \"${vcxproj}\", \"${uuid}\"";
     -        print F "$SLN_POST";
     -    }
     -    foreach (@libs) {
    @@ contrib/buildsystems/Generators/Vcxproj.pm (deleted)
     -        my $vcxproj = $build_structure{"LIBS_${libname}_VCXPROJ"};
     -	$vcxproj =~ s/\//\\/g;
     -        $libname =~ s/\//_/g;
    --        print F "\"${libname}.proj\", \"${vcxproj}\", \"${uuid}\"";
    +-        print F "\"${libname}\", \"${vcxproj}\", \"${uuid}\"";
     -        print F "$SLN_POST";
     -    }
     -
     -    print F << "EOM";
     -Global
     -	GlobalSection(SolutionConfigurationPlatforms) = preSolution
    --		Debug|ARM64 = Debug|ARM64
     -		Debug|x64 = Debug|x64
     -		Debug|x86 = Debug|x86
    --		Release|ARM64 = Release|ARM64
     -		Release|x64 = Release|x64
     -		Release|x86 = Release|x86
     -	EndGlobalSection
    @@ contrib/buildsystems/Generators/Vcxproj.pm (deleted)
     -    foreach (@apps) {
     -        my $appname = $_;
     -        my $uuid = $build_structure{"APPS_${appname}_GUID"};
    --        print F "\t\t${uuid}.Debug|ARM64.ActiveCfg = Debug|ARM64\n";
    --        print F "\t\t${uuid}.Debug|ARM64.Build.0 = Debug|ARM64\n";
     -        print F "\t\t${uuid}.Debug|x64.ActiveCfg = Debug|x64\n";
     -        print F "\t\t${uuid}.Debug|x64.Build.0 = Debug|x64\n";
     -        print F "\t\t${uuid}.Debug|x86.ActiveCfg = Debug|Win32\n";
     -        print F "\t\t${uuid}.Debug|x86.Build.0 = Debug|Win32\n";
    --        print F "\t\t${uuid}.Release|ARM64.ActiveCfg = Release|ARM64\n";
    --        print F "\t\t${uuid}.Release|ARM64.Build.0 = Release|ARM64\n";
     -        print F "\t\t${uuid}.Release|x64.ActiveCfg = Release|x64\n";
     -        print F "\t\t${uuid}.Release|x64.Build.0 = Release|x64\n";
     -        print F "\t\t${uuid}.Release|x86.ActiveCfg = Release|Win32\n";
    @@ contrib/buildsystems/Generators/Vcxproj.pm (deleted)
     -    foreach (@libs) {
     -        my $libname = $_;
     -        my $uuid = $build_structure{"LIBS_${libname}_GUID"};
    --        print F "\t\t${uuid}.Debug|ARM64.ActiveCfg = Debug|ARM64\n";
    --        print F "\t\t${uuid}.Debug|ARM64.Build.0 = Debug|ARM64\n";
     -        print F "\t\t${uuid}.Debug|x64.ActiveCfg = Debug|x64\n";
     -        print F "\t\t${uuid}.Debug|x64.Build.0 = Debug|x64\n";
     -        print F "\t\t${uuid}.Debug|x86.ActiveCfg = Debug|Win32\n";
     -        print F "\t\t${uuid}.Debug|x86.Build.0 = Debug|Win32\n";
    --        print F "\t\t${uuid}.Release|ARM64.ActiveCfg = Release|ARM64\n";
    --        print F "\t\t${uuid}.Release|ARM64.Build.0 = Release|ARM64\n";
     -        print F "\t\t${uuid}.Release|x64.ActiveCfg = Release|x64\n";
     -        print F "\t\t${uuid}.Release|x64.Build.0 = Release|x64\n";
     -        print F "\t\t${uuid}.Release|x86.ActiveCfg = Release|Win32\n";
    @@ contrib/buildsystems/engine.pl (deleted)
     -            next;
     -        }
     -
    --        if($text =~ / -c / || $text =~ / -i \S+\.rc /) {
    +-        if($text =~ / -c /) {
     -            # compilation
     -            handleCompileLine($text, $line);
     -
    @@ contrib/buildsystems/engine.pl (deleted)
     -        if ("$part" eq "-o") {
     -            # ignore object file
     -            shift @parts;
    --        } elsif ("$part" eq "-c" || "$part" eq "-i" || "$part" =~ /^-fno-/ || "$part" eq '-pedantic') {
    +-        } elsif ("$part" eq "-c") {
     -            # ignore compile flag
    +-        } elsif ("$part" eq "-c") {
     -        } elsif ($part =~ /^.?-I/) {
     -            push(@incpaths, $part);
     -        } elsif ($part =~ /^.?-D/) {
     -            push(@defines, $part);
     -        } elsif ($part =~ /^-/) {
     -            push(@cflags, $part);
    --        } elsif ($part =~ /\.(c|cc|cpp|rc)$/) {
    +-        } elsif ($part =~ /\.(c|cc|cpp)$/) {
     -            $sourcefile = $part;
     -        } else {
     -            die "Unhandled compiler option @ line $lineno: $part";
    @@ contrib/buildsystems/engine.pl (deleted)
     -            push(@libs, $part);
     -        } elsif ($part eq 'invalidcontinue.obj') {
     -            # ignore - known to MSVC
    --        } elsif ($part =~ /\.(o|res)$/) {
    +-        } elsif ($part =~ /\.o$/) {
     -            push(@objfiles, $part);
     -        } elsif ($part =~ /\.obj$/) {
     -            # do nothing, 'make' should not be producing .obj, only .o files
    @@ contrib/buildsystems/engine.pl (deleted)
     -        my $sourcefile = $_;
     -        $sourcefile =~ s/^headless-git\.o$/compat\/win32\/headless.c/;
     -        $sourcefile =~ s/\.o$/.c/;
    --        $sourcefile =~ s/\.res$/.rc/;
     -        push(@sources, $sourcefile);
     -        push(@cflags, @{$compile_options{"${sourcefile}_CFLAGS"}});
     -        push(@defines, @{$compile_options{"${sourcefile}_DEFINES"}});
  • 318: 5732514 ! 37: caad529 fixup! vcxproj: unclash project directories with build outputs

    @@ Metadata
     Author: Johannes Schindelin <[email protected]>
     
      ## Commit message ##
    -    fixup! vcxproj: unclash project directories with build outputs
    +    config.mak.uname: drop the `vcxproj` target
     
         Now that we dropped `contrib/buildsystems/generate` to generate Visual
         Studio Solution files, it is time to also drop the `vcxproj` Makefile
    @@ config.mak.uname: ifeq ($(uname_S),QNX)
     -
     -	# Make .vcxproj files and add them
     -	perl contrib/buildsystems/generate -g Vcxproj
    --	git add -f git.sln {*,*/lib.proj,t/helper/*,reftable/libreftable{,_test}.proj}/*.vcxproj
    +-	git add -f git.sln {*,*/lib,t/helper/*}/*.vcxproj
     -
     -	# Generate the LinkOrCopyBuiltins.targets and LinkOrCopyRemoteHttp.targets file
     -	(echo '<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">' && \
    @@ config.mak.uname: ifeq ($(uname_S),QNX)
     -	   echo '    <Copy SourceFiles="$$(OutDir)\git.exe" DestinationFiles="$$(OutDir)\'"$$name"'" SkipUnchangedFiles="true" UseHardlinksIfPossible="true" />'; \
     -	 done && \
     -	 echo '  </Target>' && \
    --	 echo '</Project>') >git.proj/LinkOrCopyBuiltins.targets
    +-	 echo '</Project>') >git/LinkOrCopyBuiltins.targets
     -	(echo '<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">' && \
     -	 echo '  <Target Name="CopyBuiltins_AfterBuild" AfterTargets="AfterBuild">' && \
     -	 for name in $(REMOTE_CURL_ALIASES); \
    @@ config.mak.uname: ifeq ($(uname_S),QNX)
     -	   echo '    <Copy SourceFiles="$$(OutDir)\'"$(REMOTE_CURL_PRIMARY)"'" DestinationFiles="$$(OutDir)\'"$$name"'" SkipUnchangedFiles="true" UseHardlinksIfPossible="true" />'; \
     -	 done && \
     -	 echo '  </Target>' && \
    --	 echo '</Project>') >git-remote-http.proj/LinkOrCopyRemoteHttp.targets
    --	git add -f git.proj/LinkOrCopyBuiltins.targets git-remote-http.proj/LinkOrCopyRemoteHttp.targets
    +-	 echo '</Project>') >git-remote-http/LinkOrCopyRemoteHttp.targets
    +-	git add -f git/LinkOrCopyBuiltins.targets git-remote-http/LinkOrCopyRemoteHttp.targets
     -
     -	# Add generated headers
     -	$(MAKE) MSVC=1 SKIP_VCPKG=1 prefix=/mingw64 $(GENERATED_H)
    @@ config.mak.uname: ifeq ($(uname_S),QNX)
     -	sed -i '/^git_broken_path_fix ".*/d' git-sh-setup
     -	git add -f $(SCRIPT_LIB) $(SCRIPTS)
     -
    --ifndef NO_PERL
     -	# Add Perl module
     -	$(MAKE) $(LIB_PERL_GEN)
     -	git add -f perl/build
    --endif
     -
     -	# Add bin-wrappers, for testing
     -	rm -rf bin-wrappers/
  • 104: 331afd2 = 38: d4b07ef ci: adjust Azure Pipeline for runs_on_pool

  • 23: bbc14d7 = 39: 591376e t9350: point out that refs are not updated correctly

  • 24: b5fe0f6 = 40: 90e30d0 transport-helper: add trailing --

  • 25: c74f47b = 41: a338859 remote-helper: check helper status after import/export

  • 34: ec0016c = 42: 9cbc716 mingw: demonstrate a problem with certain absolute paths

  • 26: 6166ef7 = 43: ae895f5 gitk(Windows): avoid inadvertently calling executables in the worktree

  • 27: dd17fae = 44: 81406ce Always auto-gc after calling a fast-import transport

  • 37: e75cb3b = 45: 5e12a91 mingw: allow absolute paths without drive prefix

  • 28: a1108cf = 46: 5f71962 mingw: include the Python parts in the build

  • 29: a60cef9 = 47: 5c6c3a3 win32/pthread: avoid name clashes with winpthread

  • 30: 3eaa1ce = 48: 928fa43 git-compat-util: avoid redeclaring _DEFAULT_SOURCE

  • 31: 461207c = 49: bf284f1 Import the source code of mimalloc v2.1.2

  • 32: dfda515 = 50: 3d296b0 mimalloc: adjust for building inside Git

  • 33: 1499dbd = 51: b5335a0 mimalloc: offer a build-time option to enable it

  • 35: c2b8b3d = 52: 99ffa42 clean: do not traverse mount points

  • 36: 080c851 = 53: 7402d65 mimalloc: use "weak" random seed when statically linked

  • 38: 64e8496 = 54: b86e095 clean: remove mount points when possible

  • 39: 11ebfb3 = 55: 1245671 mingw: use mimalloc

  • 40: 6b608e8 = 56: 4007ccb transport: optionally disable side-band-64k

  • 41: 0cb219f = 57: dd5817d mingw: ensure valid CTYPE

  • 42: 0bc4c90 = 58: 3111521 mingw: demonstrate a git add issue with NTFS junctions

  • 43: 345d8dd = 59: 59dbe7e mingw: allow git.exe to be used instead of the "Git wrapper"

  • 44: 13709f0 = 60: 318939f strbuf_realpath(): use platform-dependent API if available

  • 45: 3db90c3 = 61: da2a9df mingw: ignore HOMEDRIVE/HOMEPATH if it points to Windows' system directory

  • 46: acc5a14 = 62: 60064d9 http: use new "best effort" strategy for Secure Channel revoke checking

  • 47: d7476fc = 63: 02e80d9 mingw: do resolve symlinks in getcwd()

  • 48: 2b6f291 = 64: 5b56c83 mingw: fix fatal error working on mapped network drives on Windows

  • 49: d919252 = 65: 54449ed clink.pl: fix MSVC compile script to handle libcurl-d.lib

  • 50: 132f431 = 66: d1e51aa mingw: implement a platform-specific strbuf_realpath()

  • 54: ca53503 = 67: 7abe8d8 t3701: verify that we can add lots of files interactively

  • 55: c3d5ebc = 68: 024f162 git add -i: handle CR/LF line endings in the interactive input

  • 56: 201c0e8 = 69: 28cc597 commit: accept "scissors" with CR/LF line endings

  • 57: ae133a0 = 70: 73bab9f t0014: fix indentation

  • 58: ac73ea4 = 71: b96f8cb git-gui: accommodate for intent-to-add files

  • 66: 81ee80b = 72: 07946b3 vcpkg_install: detect lack of Git

  • 68: e3729ad = 73: 08ba0df vcpkg_install: add comment regarding slow network connections

  • 72: ff822c6 ! 74: f17f4ef vcbuild: install ARM64 dependencies when building ARM64 binaries

    @@ compat/vcbuild/vcpkg_install.bat: REM ==========================================
      	FOR %%i IN (zlib expat libiconv openssl libssh2 curl) DO (
      	    cd %cwd%vcpkg
      	    IF NOT EXIST "packages\%%i_%arch%" CALL :sub__install_one %%i
    -
    - ## contrib/buildsystems/Generators/Vcxproj.pm ##
    -@@ contrib/buildsystems/Generators/Vcxproj.pm: sub createProject {
    -     <PreBuildEvent Condition="!Exists('$cdup\\compat\\vcbuild\\vcpkg\\installed\\\$(VCPKGArch)\\include\\openssl\\ssl.h')">
    -       <Message>Initialize VCPKG</Message>
    -       <Command>del "$cdup\\compat\\vcbuild\\vcpkg"</Command>
    --      <Command>call "$cdup\\compat\\vcbuild\\vcpkg_install.bat"</Command>
    -+      <Command>call "$cdup\\compat\\vcbuild\\vcpkg_install.bat" \$(VCPKGArch)</Command>
    -     </PreBuildEvent>
    - EOM
    -     }
  • 74: 6e69568 = 75: 691f907 vcbuild: add an option to install individual 'features'

  • 75: b3ab8b7 = 76: e93200a cmake: allow building for Windows/ARM64

  • 76: d765597 = 77: 08e1c07 ci(vs-build) also build Windows/ARM64 artifacts

  • 77: f8c6875 = 78: 8aa481c Add schannel to curl installation

  • 78: c80d4f9 = 79: 9e21199 cmake(): allow setting HOST_CPU for cross-compilation

  • 79: 3aeb23b = 80: a8d96a3 CMake: default Visual Studio generator has changed

  • 81: 1033d6f = 81: a472e30 .gitignore: add Visual Studio CMakeSetting.json file

  • 80: c20c6ee = 82: d5ffb93 subtree: update contrib/subtree test target

  • 91: 40431da = 83: d24fdbf CMakeLists: add default "x64-windows" arch for Visual Studio

  • 82: 1e95a2f = 84: e5f9ad2 mingw: allow for longer paths in parse_interpreter()

  • 83: 48c6336 = 85: b4189eb compat/vcbuild: document preferred way to build in Visual Studio

  • 84: 921f35c = 86: 7c5bb0f http: optionally send SSL client certificate

  • 85: 1fcbe5c = 87: 3feff71 ci: run contrib/subtree tests in CI builds

  • 94: 86670c8 = 88: 00932cf CMake: show Win32 and Generator_platform build-option values

  • 95: d13b2b6 = 89: 17c4a8b init: do parse all core.* settings early

  • 86: 6183d2d = 90: 6a91eff hash-object: demonstrate a >4GB/LLP64 problem

  • 87: 23fe600 = 91: 5bcb106 write_object_file_literally(): use size_t

  • 88: c22d98b = 92: c060c2d object-file.c: use size_t for header lengths

  • 89: 4f197bd = 93: a8879af hash algorithms: use size_t for section lengths

  • 90: c4551e7 = 94: ccdf745 hash-object --stdin: verify that it works with >4GB/LLP64

  • 92: ce0d0a9 = 95: 6707108 hash-object: add another >4GB/LLP64 test case

  • 93: b045dfa = 96: 1377a2c setup: properly use "%(prefix)/" when in WSL

  • 106: cadcb6d = 97: d62d906 Add config option windows.appendAtomically

  • 96: 1961e70 = 98: 4425c87 hash-object: add a >4GB/LLP64 test case using filtered input

  • 97: 307bb05 = 99: 2e1d946 compat/mingw.c: do not warn when failing to get owner

  • 108: c71eeba = 100: 70c3929 mingw: $env:TERM="xterm-256color" for newer OSes

  • 109: 404e0aa = 101: 6f4bfa5 winansi: check result and Buffer before using Name

  • 117: a4cc607 = 102: 528f46c MinGW: link as terminal server aware

  • 123: 58f6351 = 103: 08bd02f http: optionally load libcurl lazily

  • 124: 6f3580c = 104: 3336704 http: support lazy-loading libcurl also on Windows

  • 116: 231a570 = 105: b1777bc bswap.h: add support for built-in bswap functions

  • 125: 5c064c2 = 106: 0a6fa31 http: when loading libcurl lazily, allow for multiple SSL backends

  • 110: 3f98d13 = 107: 5a1c50c mingw: change core.fsyncObjectFiles = 1 by default

  • 119: 4c4a0d5 = 108: b5e754e Fix Windows version resources

  • 120: e80721d = 109: f7887d0 config.mak.uname: add support for clangarm64

  • 121: 12dfa68 = 110: 002d5a3 status: fix for old-style submodules with commondir

  • 122: d9aa4c7 = 111: 8f8f5fd windows: skip linking git-<command> for built-ins

  • 126: f3cd3ed = 112: 86e62a2 windows: fix Repository>Explore Working Copy

  • 127: a8bd077 = 113: 62ca977 mingw: do load libcurl dynamically by default

  • 128: 0959164 = 114: 6792709 Add a GitHub workflow to verify that Git/Scalar work in Nano Server

  • 129: 171878e = 115: e21e749 mingw: suggest windows.appendAtomically in more cases

  • 130: a3742f4 = 116: c2f3767 win32: use native ANSI sequence processing, if possible

  • 137: dbd4e4a = 117: f929b83 common-main.c: fflush stdout buffer upon exit

  • 138: 7b12c55 = 118: 63f9ec0 t5601/t7406(mingw): do run tests with symlink support

  • 132: 4d9ebe3 = 119: 0a0e906 ci: work around a problem with HTTP/2 vs libcurl v8.10.0

  • 133: ef1206c = 120: 791493f pack-objects: add --full-name-hash option

  • 134: a79d35a = 121: c07ed6f repack: test --full-name-hash option

  • 135: 8da7363 = 122: ce4b382 pack-objects: add GIT_TEST_FULL_NAME_HASH

  • 136: 9b1f343 = 123: c15ff02 git-repack: update usage to match docs

  • 142: fe91a8a = 124: 1b2b309 p5313: add size comparison test

  • 143: 9e9b294 = 125: da926aa test-tool: add helper for name-hash values

  • 144: 36064b6 = 126: 1e525a9 repack/pack-objects: mark --full-name-hash as experimental

  • 145: 98030c3 = 127: a7818ea path-walk: introduce an object walk by path

  • 146: 4534fc6 = 128: 8bbf649 t6601: add helper for testing path-walk API

  • 139: 43ad970 = 129: 246d787 win32: ensure that localtime_r() is declared even in i686 builds

  • 140: fd55ede = 130: 5f3f500 Fallback to AppData if XDG_CONFIG_HOME is unset

  • 141: f08d175 = 131: 6a83fdb run-command: be helpful with Git LFS fails on Windows 7

  • 147: 048428a = 132: 54f5c77 path-walk: allow consumer to specify object types

  • 148: a3d393b = 133: fe02e1c path-walk: allow visiting tags

  • 149: e35f96d = 134: a472302 revision: create mark_trees_uninteresting_dense()

  • 150: ee8deef = 135: 230f831 path-walk: add prune_all_uninteresting option

  • 151: f997fc8 = 136: af14811 pack-objects: extract should_attempt_deltas()

  • 152: 7075c09 = 137: c896542 pack-objects: add --path-walk option

  • 153: 2d88d3f = 138: 090ce15 pack-objects: introduce GIT_TEST_PACK_PATH_WALK

  • 154: 1d621e1 = 139: f9db153 repack: add --path-walk option

  • 155: 91c1e93 = 140: 40d30d4 pack-objects: enable --path-walk via config

  • 156: 14f998c = 141: 872da37 scalar: enable path-walk during push via config

  • 157: 4bad79d = 142: d61dc09 pack-objects: refactor path-walk delta phase

  • 158: 0603e43 = 143: dfe1c28 pack-objects: thread the path-based compression

  • 159: 23ae924 = 144: f2c9df5 path-walk API: avoid adding a root tree more than once

  • 160: 58eb7f1 = 145: a20f34f backfill: add builtin boilerplate

  • 161: ebd1692 = 146: fd8c081 backfill: basic functionality and tests

  • 162: 6bbc831 = 147: ff48017 backfill: add --batch-size= option

  • 163: 4f329aa = 148: 043bddc backfill: add --sparse option

  • 164: 5126f20 = 149: f03bb33 backfill: assume --sparse when sparse-checkout is enabled

  • 165: d0bd4c0 = 150: fcf53bc backfill: mark it as experimental

  • 166: 2787935 = 151: e6469c2 survey: stub in new experimental 'git-survey' command

  • 167: 81a04f4 = 152: 51e1146 survey: add command line opts to select references

  • 168: 3ee79f0 = 153: 2385069 survey: start pretty printing data in table form

  • 169: 2f3acdf = 154: f4f9119 survey: add object count summary

  • 170: ea53fbb = 155: 55889b1 survey: summarize total sizes by object type

  • 171: e073a42 = 156: 0e29509 survey: show progress during object walk

  • 172: 2c1b163 = 157: d4521ef survey: add ability to track prioritized lists

  • 173: 64b2ec2 = 158: c37830b survey: add report of "largest" paths

  • 174: 59481d1 = 159: 315d7eb survey: add --top= option and config

  • 177: 5c96513 = 160: 2a8b254 mingw: make sure errno is set correctly when socket operations fail

  • 178: 78e72dc = 161: f64b9ec compat/mingw: handle WSA errors in strerror

  • 179: fd6b18f = 162: c41c120 compat/mingw: drop outdated comment

  • 175: 31789fd = 163: 010312b survey: clearly note the experimental nature in the output

  • 180: 5ae96a2 = 164: ba08b68 t0301: actually test credential-cache on Windows

  • 176: c847baa = 165: 4c0af9a path-walk: improve path-walk speed with many tags

  • 181: 09fe109 = 166: eced1ad credential-cache: handle ECONNREFUSED gracefully

  • 15: fae6b7a = 167: e35b86e mingw_open_existing: handle directories better

  • 51: ccdb636 < -: ------------ vcxproj: unclash project directories with build outputs

  • 52: c532ef3 = 168: 6d862c5 t5505/t5516: allow running without .git/branches/ in the templates

  • 53: adfc048 = 169: 56b43f0 t5505/t5516: fix white-space around redirectors

  • 59: 77283d0 = 170: bab125e clink.pl: fix libexpatd.lib link error when using MSVC

  • 60: 4bff95d = 171: e4f2a37 Makefile: clean up .ilk files when MSVC=1

  • 61: db01c40 = 172: 369ff79 vcbuild: add support for compiling Windows resource files

  • 62: 8f5ad65 = 173: a7d9802 config.mak.uname: add git.rc to MSVC builds

  • 63: 3e47c79 = 174: a2e5383 clink.pl: ignore no-stack-protector arg on MSVC=1 builds

  • 64: b59e4b9 = 175: 4f8ede9 clink.pl: move default linker options for MSVC=1 builds

  • 65: 49cf4b6 < -: ------------ buildsystems: remove duplicate clause

  • 67: adb7867 < -: ------------ vcxproj: handle resource files, too

  • 69: 69d15a3 < -: ------------ vcxproj: ignore -fno-stack-protector and -fno-common

  • 70: 79bb88c < -: ------------ vcxproj: support building Windows/ARM64 binaries

  • 71: f1b2fd6 < -: ------------ vcxproj: handle GUI programs, too

  • 73: f45352c = 176: f750c94 cmake: install headless-git.

  • 98: 7324a35 < -: ------------ vcxproj: allow building with NO_PERL again

  • 99: 348fae0 < -: ------------ vcxproj: require C11

  • 100: 102e426 < -: ------------ vcxproj: ignore the -pedantic option

  • 101: 32973aa < -: ------------ vcxproj: include reftable when committing .vcxproj files

  • 102: 60299ef < -: ------------ vcxproj: handle libreftable_test, too

  • 103: a69adf6 < -: ------------ vcxproj: avoid escaping double quotes in the defines

  • 107: b4b814e < -: ------------ ci: reinstate Azure Pipelines support

  • 111: ebc3f7b < -: ------------ azure-pipeline: drop the GETTEXT_POISON job

  • 112: 3ec9280 < -: ------------ azure-pipeline: stop hard-coding apt-get calls

  • 113: 209f633 < -: ------------ azure-pipeline: drop the code to write to/read from a file share

  • 114: ac9ce7c < -: ------------ azure-pipeline: use partial clone/parallel checkout to initialize minimal-sdk

  • 115: a671d41 < -: ------------ azure-pipeline: downcase the job name of the Linux32 job

  • 118: 7e22815 < -: ------------ azure-pipeline: run static-analysis on jammy

  • 131: 5264077 ! 177: 151973c git.rc: include winuser.h

    @@ contrib/buildsystems/CMakeLists.txt: if(CMAKE_C_COMPILER_ID STREQUAL "MSVC")
      
      #default behaviour
     
    - ## contrib/buildsystems/Generators/Vcxproj.pm ##
    -@@ contrib/buildsystems/Generators/Vcxproj.pm: sub createProject {
    -       <AdditionalDependencies>\$(VCPKGLibs);\$(AdditionalDependencies)</AdditionalDependencies>
    -       <AdditionalOptions>invalidcontinue.obj %(AdditionalOptions)</AdditionalOptions>
    -       <EntryPointSymbol>$entrypoint</EntryPointSymbol>
    --      <ManifestFile>$cdup\\compat\\win32\\git.manifest</ManifestFile>
    -       <SubSystem>$subsystem</SubSystem>
    -     </Link>
    - EOM
    -
      ## git.rc.in ##
     @@
     +#include<winuser.h>
  • 212: 7182f92 = 178: fb8be89 git-gui: provide question helper for retry fallback on Windows

  • 214: 25f46e3 = 179: ba06011 git gui: set GIT_ASKPASS=git-gui--askpass if not set yet

  • 216: e1f73ec = 180: edea57c git-gui--askyesno: fix funny text wrapping

  • 218: b532ee6 = 181: 81b289c git-gui--askyesno: allow overriding the window title

  • 215: 138f2a2 = 182: 64c9ec5 gitk: Unicode file name support

  • 217: 5c6b2a6 = 183: c56c670 gitk: Use an external icon file on Windows

  • 219: 4a5f1dc = 184: cf75911 gitk: fix arrow keys in input fields with Tcl/Tk >= 8.6

  • 220: d033151 = 185: 2dbda5e git-gui--askyesno (mingw): use Git for Windows' icon, if available

  • 221: 17d1088 = 186: 25691cf gitk: make the "list references" default window width wider

  • 182: 8765262 = 187: 1af9931 Win32: make FILETIME conversion functions public

  • 183: afb6c97 = 188: 05a1e42 Win32: dirent.c: Move opendir down

  • 184: 5394912 = 189: c3fb594 mingw: make the dirent implementation pluggable

  • 185: 4d6c9ae = 190: 5228a5a Win32: make the lstat implementation pluggable

  • 186: 6d933f6 = 191: 2d40e26 mingw: add infrastructure for read-only file system level caches

  • 187: 4bd5d05 = 192: f5bdcd6 mingw: add a cache below mingw's lstat and dirent implementations

  • 188: ac62ab4 = 193: 896234e fscache: load directories only once

  • 189: 0b4d50d = 194: fb6acb5 fscache: add key for GIT_TRACE_FSCACHE

  • 190: 22e59f4 = 195: cead8ed fscache: remember not-found directories

  • 191: 6f5197b = 196: 82d49ea fscache: add a test for the dir-not-found optimization

  • 192: 6b3627f = 197: d1e5640 add: use preload-index and fscache for performance

  • 193: bd69cf7 = 198: 6ff1f4a dir.c: make add_excludes aware of fscache during status

  • 194: 3de1d72 = 199: ea168fa fscache: make fscache_enabled() public

  • 195: b8686d7 = 200: 40a2c9c dir.c: regression fix for add_excludes with fscache

  • 196: b2c8d16 = 201: 8cb06a0 fetch-pack.c: enable fscache for stats under .git/objects

  • 197: 2bdea05 = 202: a3e60fc checkout.c: enable fscache for checkout again

  • 198: ade2577 = 203: 7fec933 Enable the filesystem cache (fscache) in refresh_index().

  • 199: 72e7282 = 204: 7e2ba4c fscache: use FindFirstFileExW to avoid retrieving the short name

  • 201: 17b2ca1 = 205: e25cb52 fscache: add GIT_TEST_FSCACHE support

  • 202: 71c001b = 206: 2d5e882 fscache: add fscache hit statistics

  • 209: e47cadc = 207: 407ff9c unpack-trees: enable fscache for sparse-checkout

  • 200: 24990f9 = 208: 69869e4 status: disable and free fscache at the end of the status command

  • 203: 3d55d81 = 209: 72e48c0 mem_pool: add GIT_TRACE_MEMPOOL support

  • 204: b0d0b14 = 210: 4b0d5ac fscache: fscache takes an initial size

  • 205: d042571 = 211: 5dd9d75 fscache: update fscache to be thread specific instead of global

  • 206: f5368b6 = 212: 1796c56 fscache: teach fscache to use mempool

  • 207: 31d4005 = 213: f6c33bb fscache: make fscache_enable() thread safe

  • 208: cf693a8 = 214: e7c4a5e fscache: teach fscache to use NtQueryDirectoryFile

  • 210: 5fc6a7c = 215: eaf317c fscache: remember the reparse tag for each entry

  • 211: 014d3fe = 216: 835c030 fscache: implement an FSCache-aware is_mount_point()

  • 213: bc90e75 = 217: 8549752 clean: make use of FSCache

  • 222: 6adb8e4 = 218: 75370fe pack-objects (mingw): demonstrate a segmentation fault with large deltas

  • 223: 94378c1 = 219: abeb314 mingw: support long paths

  • 224: a5d11ab = 220: c630875 Win32: fix 'lstat("dir/")' with long paths

  • 225: 3c4cd62 = 221: a77aff7 win32(long path support): leave drive-less absolute paths intact

  • 230: 314d9aa = 222: 9662251 compat/fsmonitor/fsm-*-win32: support long paths

  • 231: 2286800 = 223: 5f4ad29 clean: suggest using core.longPaths if paths are too long to remove

  • 226: 072902e = 224: f10eef6 mingw: Support git_terminal_prompt with more terminals

  • 227: e79bbe4 = 225: dd24530 compat/terminal.c: only use the Windows console if bash 'read -r' fails

  • 228: 0449fa6 = 226: 3d70745 mingw (git_terminal_prompt): do fall back to CONIN$/CONOUT$ method

  • 229: 37575e0 = 227: 2f57147 strbuf_readlink: don't call readlink twice if hint is the exact link size

  • 232: 16ba97e = 228: e7dc2a9 strbuf_readlink: support link targets that exceed PATH_MAX

  • 233: 3bbb298 = 229: 12f5b49 lockfile.c: use is_dir_sep() instead of hardcoded '/' checks

  • 234: 014c9ba = 230: 6a58f12 Win32: don't call GetFileAttributes twice in mingw_lstat()

  • 235: a5e362e = 231: 14010b3 Win32: implement stat() with symlink support

  • 236: 70e161c = 232: 9c44fef Win32: remove separate do_lstat() function

  • 237: 6a57f09 = 233: 20280fc Win32: let mingw_lstat() error early upon problems with reparse points

  • 238: d1a637d = 234: 6c68e87 mingw: teach fscache and dirent about symlinks

  • 239: b160896 = 235: 451ce8b Win32: lstat(): return adequate stat.st_size for symlinks

  • 240: 3b126ac = 236: a0fc905 Win32: factor out retry logic

  • 241: 60b07ae = 237: 7425615 Win32: change default of 'core.symlinks' to false

  • 242: eddaa17 = 238: aa45a28 Win32: add symlink-specific error codes

  • 243: db44028 = 239: 261adda Win32: mingw_unlink: support symlinks to directories

  • 244: 9be895c = 240: 9271297 Win32: mingw_rename: support renaming symlinks

  • 245: 0ee6c2c = 241: b6ed5ef Win32: mingw_chdir: change to symlink-resolved directory

  • 246: 6fa7f53 = 242: 4c62c07 Win32: implement readlink()

  • 247: 16c8396 = 243: ed85d85 mingw: lstat: compute correct size for symlinks

  • 248: 4bcc8a5 = 244: d08749f Win32: implement basic symlink() functionality (file symlinks only)

  • 249: 0a04e07 = 245: 105c8bd Win32: symlink: add support for symlinks to directories

  • 250: e4a2ade = 246: 8178825 mingw: try to create symlinks without elevated permissions

  • 251: cffe5af = 247: ba8af20 mingw: emulate stat() a little more faithfully

  • 252: 71f5ae4 = 248: 3a956d4 mingw: special-case index entries for symlinks with buggy size

  • 253: 3b7f7fa = 249: 5cc5918 mingw: introduce code to detect whether we're inside a Windows container

  • 254: 7cd902e = 250: 38a0688 mingw: when running in a Windows container, try to rename() harder

  • 255: 11f08d4 = 251: d365524 mingw: move the file_attr_to_st_mode() function definition

  • 256: f558a61 = 252: 7108f3d mingw: Windows Docker volumes are not symbolic links

  • 257: 249fd8a = 253: dacdc89 Win32: symlink: move phantom symlink creation to a separate function

  • 267: e333dec = 254: d54a5e5 mingw: work around rename() failing on a read-only file

  • 258: 4d5a59a = 255: ce11b80 Introduce helper to create symlinks that knows about index_state

  • 259: 61e072f = 256: 51df38b mingw: allow to specify the symlink type in .gitattributes

  • 260: b093fc0 = 257: 3bc5590 Win32: symlink: add test for symlink attribute

  • 261: 07d0a7a = 258: 72be863 mingw: explicitly specify with which cmd to prefix the cmdline

  • 262: 132edae = 259: ea5db30 mingw: when path_lookup() failed, try BusyBox

  • 263: 95e3587 = 260: 85f59a8 test-lib: avoid unnecessary Perl invocation

  • 264: bcec4b7 = 261: b4de07f test-tool: learn to act as a drop-in replacement for iconv

  • 265: cf2505f = 262: 8dc54c4 tests(mingw): if iconv is unavailable, use test-helper --iconv

  • 266: 6c4d258 = 263: 3bc06dd gitattributes: mark .png files as binary

  • 268: 7a8d524 = 264: 90a1d88 tests: move test PNGs into t/lib-diff/

  • 269: dbd5f28 = 265: 0f23a77 tests: only override sort & find if there are usable ones in /usr/bin/

  • 270: 1064509 ! 266: e05a988 tests: use the correct path separator with BusyBox

    @@ t/t0061-run-command.sh: test_expect_success POSIXPERM,SANITY 'unreadable directo
     
      ## t/t0300-credentials.sh ##
     @@ t/t0300-credentials.sh: test_expect_success 'setup helper scripts' '
    - 	test -z "$pexpiry" || echo password_expiry_utc=$pexpiry
    + 	printf "username=\\007latrix Lestrange\\n"
      	EOF
      
     -	PATH="$PWD:$PATH"
  • 271: d442413 = 267: e692539 mingw: only use Bash-ism builtin pwd -W when available

  • 272: 14549d6 = 268: 8cced00 tests (mingw): remove Bash-specific pwd option

  • 273: ace3077 = 269: 3f278c9 test-lib: add BUSYBOX prerequisite

  • 274: 332f414 = 270: f215ec6 t5003: use binary file from t/lib-diff/

  • 275: 5099904 = 271: 4dcd754 t5532: workaround for BusyBox on Windows

  • 276: 680c136 = 272: bb9fed5 t5605: special-case hardlink test for BusyBox-w32

  • 277: bb27736 = 273: 8373342 t5813: allow for $PWD to be a Windows path

  • 278: ac2fe47 = 274: 170bd46 t9200: skip tests when $PWD contains a colon

  • 279: 9db019a = 275: 446eaca mingw: add a Makefile target to copy test artifacts

  • 280: 1ecb133 = 276: f135bb7 mingw: kill child processes in a gentler way

  • 282: c4cee35 = 277: 05a213a mingw: optionally enable wsl compability file mode bits

  • 283: 0eaad07 = 278: 61710c8 mingw: really handle SIGINT

  • 281: 4238ff7 = 279: 316d0e3 mingw: do not call xutftowcs_path in mingw_mktemp

  • 284: e1a61a8 = 280: 6b42f97 Partially un-revert "editor: save and reset terminal after calling EDITOR"

  • 292: e4fe80e = 281: f9ed972 reset: reinstate support for the deprecated --stdin option

  • 293: c3c769b = 282: 68a7fda fsmonitor: reintroduce core.useBuiltinFSMonitor

  • 285: 6071d7a = 283: a8f263c Describe Git for Windows' architecture [no ci]

  • 286: d94525a = 284: 28bc9ec Modify the Code of Conduct for Git for Windows

  • 287: 6e5660d = 285: 6da2bef CONTRIBUTING.md: add guide for first-time contributors

  • 288: 07c3ffc = 286: c716e76 README.md: Add a Windows-specific preamble

  • 289: 126f900 = 287: 7ee0b52 Add an issue template

  • 290: fc4f4cd = 288: c78bc7d Add a GitHub workflow to monitor component updates

  • 291: a1fc7cd = 289: cdeff1c Modify the GitHub Pull Request template (to reflect Git for Windows)

  • 294: b18e4dc = 290: ff3e380 dependabot: help keeping GitHub Actions versions up to date

  • 295: ed5a452 ! 291: f9e4f82 SECURITY.md: document Git for Windows' policies

    @@ SECURITY.md: Examples for details to include:
     +
     +## Snapshot versions ('nightly builds')
     +
    -+Git for Windows also provides snapshots (these are not releases) of the current development as per git-for-Windows/git's `master` branch at the [Snapshots](https://wingit.blob.core.windows.net/files/index.html) page. This link is also listed in the footer of the [Git for Windows](https://gitforwindows.org/) home page.
    ++Git for Windows also provides snapshots (these are not releases) of the current development as per git-for-Windows/git's `master` branch at the [Snapshots](https://gitforwindows.org/git-snapshots/) page. This link is also listed in the footer of the [Git for Windows](https://gitforwindows.org/) home page.
     +
     +Note: even if those builds are not exactly "nightly", they are sometimes referred to as "nightly builds" to keep with other projects' nomenclature.
     +
  • 300: f48c92b < -: ------------ Rebase to v2.48.0 (Rebase to v2.48.0 #5361)

  • 315: 290ad15 < -: ------------ fixup! reftable: write correct max_update_index to header

  • 316: ae7f51e < -: ------------ fixup! ci: reinstate Azure Pipelines support

  • 319: ae03331 < -: ------------ fixup! SECURITY.md: document Git for Windows' policies

@dscho dscho mentioned this pull request Feb 6, 2025
@dscho
Copy link
Member Author

dscho commented Feb 7, 2025

/sync

The 'sync' run for aarch64 was started.

The 'sync' run for x86_64 was started.

The 'sync' run for i686 was started.

Copy link
Member

@mjcheetham mjcheetham left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Range diff looks good to me!

@dscho dscho merged commit 50a3079 into git-for-windows:main Feb 7, 2025
14 checks passed
@dscho dscho deleted the merging-rebase-to-clean-up branch February 7, 2025 16:10
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.