Skip to content

Rebase to v2.49.0 #729

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

Merged
merged 246 commits into from
Mar 17, 2025
Merged

Rebase to v2.49.0 #729

merged 246 commits into from
Mar 17, 2025

Conversation

dscho
Copy link
Member

@dscho dscho commented Feb 27, 2025

Range-diff relative to vfs-2.48.1
  • 2: 132ad6a = 1: 9d523d0 sparse-index.c: fix use of index hashes in expand_index

  • 5: 2c03380 = 2: f5655d0 t: remove advice from some tests

  • 1: 84ba3bb = 3: 9b5a803 survey: calculate more stats on refs

  • 4: 3bd3d96 = 4: c65a454 survey: show some commits/trees/blobs histograms

  • 9: a6bdfa4 ! 5: dc23c7b survey: add vector of largest objects for various scaling dimensions

    @@ Commit message
     
         Signed-off-by: Jeff Hostetler <jeffhostetler@github.com>
     
    - ## Documentation/config/survey.txt ##
    -@@ Documentation/config/survey.txt: survey.*::
    + ## Documentation/config/survey.adoc ##
    +@@ Documentation/config/survey.adoc: survey.*::
      	top::
      		This integer value implies `--top=<N>`, specifying the
      		number of entries in the detail tables.
    @@ Documentation/config/survey.txt: survey.*::
     +		linkgit:git-survey[1].
      --
     
    - ## Documentation/git-survey.txt ##
    -@@ Documentation/git-survey.txt: only refs for the given options are added.
    + ## Documentation/git-survey.adoc ##
    +@@ Documentation/git-survey.adoc: only refs for the given options are added.
      --other::
      	Add notes (`refs/notes/`) and stashes (`refs/stash/`) to the set.
      
    @@ Documentation/git-survey.txt: only refs for the given options are added.
      OUTPUT
      ------
      
    -@@ Documentation/git-survey.txt: Reachable Object Summary
    +@@ Documentation/git-survey.adoc: Reachable Object Summary
      The reachable object summary shows the total number of each kind of Git
      object, including tags, commits, trees, and blobs.
      
  • 3: 6309b70 = 6: f976222 t5300: confirm failure of git index-pack when non-idx suffix requested

  • 10: 32189b9 = 7: 9895728 survey: add pathname of blob or tree to large_item_vec

  • 6: 6a53749 = 8: 034fdfc t1092: add test for untracked files and directories

  • 7: 2a08f0a = 9: d60b546 index-pack: disable rev-index if index file has non .idx suffix

  • 8: be2f825 = 10: 50a6aa7 trace2: prefetch value of GIT_TRACE2_DST_DEBUG at startup

  • 11: 9399a12 = 11: fd05a52 survey: add commit-oid to large_item detail

  • 12: c8be55d ! 12: 82fc24d survey: add commit name-rev lookup to each large_item

    @@ builtin/survey.c: static void do_load_refs(struct survey_context *ctx,
     +{
     +	if (ctx->opts.show_progress) {
     +		ctx->progress_total = 0;
    -+		ctx->progress = start_progress(_("Resolving name-revs..."), 0);
    ++		ctx->progress = start_progress(ctx->repo, _("Resolving name-revs..."), 0);
     +	}
     +
     +	large_item_vec_lookup_name_rev(ctx, ctx->report.reachable_objects.commits.vec_largest_by_nr_parents);
  • 13: f36fb84 ! 13: b531833 survey: add --no-name-rev option

    @@ Commit message
     
         Signed-off-by: Jeff Hostetler <jeffhostetler@github.com>
     
    - ## Documentation/config/survey.txt ##
    -@@ Documentation/config/survey.txt: survey.*::
    + ## Documentation/config/survey.adoc ##
    +@@ Documentation/config/survey.adoc: survey.*::
      	background with these options.
      +
      --
    @@ Documentation/config/survey.txt: survey.*::
      		This boolean value implies the `--[no-]verbose` option.
      	progress::
     
    - ## Documentation/git-survey.txt ##
    -@@ Documentation/git-survey.txt: OPTIONS
    + ## Documentation/git-survey.adoc ##
    +@@ Documentation/git-survey.adoc: OPTIONS
      --progress::
      	Show progress.  This is automatically enabled when interactive.
      
    @@ builtin/survey.c: static void large_item_vec_lookup_name_rev(struct survey_conte
     +
      	if (ctx->opts.show_progress) {
      		ctx->progress_total = 0;
    - 		ctx->progress = start_progress(_("Resolving name-revs..."), 0);
    + 		ctx->progress = start_progress(ctx->repo, _("Resolving name-revs..."), 0);
     @@ builtin/survey.c: static void survey_phase_objects(struct survey_context *ctx)
      	release_revisions(&revs);
      	trace2_region_leave("survey", "phase/objects", ctx->repo);
  • 14: 5d11a62 = 14: 10ee868 survey: started TODO list at bottom of source file

  • 15: 0c02488 = 15: f77f27c survey: expanded TODO list at the bottom of the source file

  • 16: 7758c74 = 16: 30fa141 survey: expanded TODO with more notes

  • 17: 2785521 = 17: 6f0b2ff reset --stdin: trim carriage return from the paths

  • 18: 82a9afa ! 18: 8c8f12e Identify microsoft/git via a distinct version suffix

    @@ Commit message
      ## GIT-VERSION-GEN ##
     @@
      
    - DEF_VER=v2.48.1
    + DEF_VER=v2.49.0-rc0
      
     +# Identify microsoft/git via a distinct version suffix
     +DEF_VER=$DEF_VER.vfs.0.0
  • 19: 9d182fd < -: ------------ gvfs: ensure that the version is based on a GVFS tag

  • -: ------------ > 19: b8a595f gvfs: ensure that the version is based on a GVFS tag

  • 20: 33a8988 = 20: bfd4c30 gvfs: add a GVFS-specific header file

  • 21: e781a50 ! 21: 33ef9e7 gvfs: add the core.gvfs config setting

    @@ Commit message
     
         Signed-off-by: Kevin Willford <kewillf@microsoft.com>
     
    - ## Documentation/config/core.txt ##
    -@@ Documentation/config/core.txt: core.multiPackIndex::
    + ## Documentation/config/core.adoc ##
    +@@ Documentation/config/core.adoc: core.multiPackIndex::
      	single index. See linkgit:git-multi-pack-index[1] for more
      	information. Defaults to true.
      
  • 22: 22583f7 ! 22: 1d55ba9 gvfs: add the feature to skip writing the index' SHA-1

    @@ Commit message
         Signed-off-by: Derrick Stolee <derrickstolee@github.com>
         Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
     
    - ## Documentation/config/core.txt ##
    -@@ Documentation/config/core.txt: core.multiPackIndex::
    + ## Documentation/config/core.adoc ##
    +@@ Documentation/config/core.adoc: core.multiPackIndex::
      	information. Defaults to true.
      
      core.gvfs::
  • 23: eca6d35 ! 23: 3ef7191 gvfs: add the feature that blobs may be missing

    @@ Commit message
     
         Signed-off-by: Kevin Willford <kewillf@microsoft.com>
     
    - ## Documentation/config/core.txt ##
    -@@ Documentation/config/core.txt: core.gvfs::
    + ## Documentation/config/core.adoc ##
    +@@ Documentation/config/core.adoc: core.gvfs::
      	GVFS_SKIP_SHA_ON_INDEX::
      		Bit value 1
      		Disables the calculation of the sha when writing the index
  • 24: ad33b6a ! 24: 07ebfc1 gvfs: prevent files to be deleted outside the sparse checkout

    @@ Commit message
     
         Signed-off-by: Kevin Willford <kewillf@microsoft.com>
     
    - ## Documentation/config/core.txt ##
    -@@ Documentation/config/core.txt: core.gvfs::
    + ## Documentation/config/core.adoc ##
    +@@ Documentation/config/core.adoc: core.gvfs::
      		Bit value 4
      		Normally git write-tree ensures that the objects referenced by the
      		directory exist in the object database. This option disables this check.
  • 25: dc7f44e ! 25: 786d556 gvfs: optionally skip reachability checks/upload pack during fetch

    @@ Commit message
     
         Signed-off-by: Kevin Willford <kewillf@microsoft.com>
     
    - ## Documentation/config/core.txt ##
    -@@ Documentation/config/core.txt: core.gvfs::
    + ## Documentation/config/core.adoc ##
    +@@ Documentation/config/core.adoc: core.gvfs::
      		directory.  This will allow virtualized working directories to
      		detect the change to HEAD and use the new commit tree to show
      		the files that are in the working directory.
  • 26: d13ff90 ! 26: 9044574 gvfs: ensure all filters and EOL conversions are blocked

    @@ Commit message
     
         Signed-off-by: Ben Peart <Ben.Peart@microsoft.com>
     
    - ## Documentation/config/core.txt ##
    -@@ Documentation/config/core.txt: core.gvfs::
    + ## Documentation/config/core.adoc ##
    +@@ Documentation/config/core.adoc: core.gvfs::
      		since these will be downloaded on demand.  This flag will skip the
      		checks on the reachability of objects during a fetch as well as
      		the upload pack so that extraneous objects don't get downloaded.
  • 27: 767a6ba = 27: 3cf5d75 gvfs: allow "virtualizing" objects

  • 28: d0f04ac = 28: 11e6e50 Hydrate missing loose objects in check_and_freshen()

  • 29: d5b9f91 = 29: 85b7cc6 sha1_file: when writing objects, skip the read_object_hook

  • 30: bf15ebc = 30: 8649964 gvfs: add global command pre and post hook procs

  • 31: f3b6bd1 = 31: e1fb608 t0400: verify that the hook is called correctly from a subdirectory

  • 32: 506300a = 32: 25f7cf5 Pass PID of git process to hooks.

  • 33: b5e57ab = 33: b1d4ea7 pre-command: always respect core.hooksPath

  • 34: aacfa5b = 34: 735b36e sparse-checkout: update files with a modify/delete conflict

  • 35: 51da332 = 35: e8f10fc sparse-checkout: avoid writing entries with the skip-worktree bit

  • 36: 5357567 = 36: d88679e Do not remove files outside the sparse-checkout

  • 37: 60e7946 ! 37: 144d10d send-pack: do not check for sha1 file when GVFS_MISSING_OK set

    @@ send-pack.c
      #include "pkt-line.h"
      #include "sideband.h"
     @@ send-pack.c: int option_parse_push_signed(const struct option *opt,
    - 
    - static void feed_object(const struct object_id *oid, FILE *fh, int negative)
    + static void feed_object(struct repository *r,
    + 			const struct object_id *oid, FILE *fh, int negative)
      {
     -	if (negative &&
     +	if (negative && !gvfs_config_is_set(GVFS_MISSING_OK) &&
    - 	    !repo_has_object_file_with_flags(the_repository, oid,
    + 	    !repo_has_object_file_with_flags(r, oid,
      					     OBJECT_INFO_SKIP_FETCH_OBJECT |
      					     OBJECT_INFO_QUICK))
  • 38: bf32c09 = 38: 0f29f7c cache-tree: remove use of strbuf_addf in update_one

  • 39: d66a1dc = 39: dd3c97d gvfs: block unsupported commands when running in a GVFS repo

  • 40: c918116 = 40: 2a24741 worktree: allow in Scalar repositories

  • 41: b62a93d = 41: de7459b gvfs: allow overriding core.gvfs

  • 42: 4bde6ad = 42: 9da480c BRANCHES.md: Add explanation of branches and using forks

  • 43: 225a9aa ! 43: 651739e Add virtual file system settings and hook proc

    @@ Commit message
     
         Signed-off-by: Ben Peart <benpeart@microsoft.com>
     
    - ## Documentation/config/core.txt ##
    -@@ Documentation/config/core.txt: Version 2 uses an opaque string so that the monitor can return
    + ## Documentation/config/core.adoc ##
    +@@ Documentation/config/core.adoc: Version 2 uses an opaque string so that the monitor can return
      something that can be used to determine what files have changed
      without race conditions.
      
    @@ Documentation/config/core.txt: Version 2 uses an opaque string so that the monit
      	If false, the ctime differences between the index and the
      	working tree are ignored; useful when the inode change time
     
    - ## Documentation/githooks.txt ##
    -@@ Documentation/githooks.txt: and "0" meaning they were not.
    + ## Documentation/githooks.adoc ##
    +@@ Documentation/githooks.adoc: and "0" meaning they were not.
      Only one parameter should be set to "1" when the hook runs.  The hook
      running passing "1", "1" should not be possible.
      
  • 44: dafd0c9 = 44: 76162a4 virtualfilesystem: don't run the virtual file system hook if the index has been redirected

  • 45: c127664 = 45: eb3bc52 virtualfilesystem: check if directory is included

  • 46: caddbc7 = 46: 86decdf backwards-compatibility: support the post-indexchanged hook

  • 47: bd95866 = 47: db2f4f9 gvfs: verify that the built-in FSMonitor is disabled

  • 48: e47db22 = 48: 8ed0a4d wt-status: add trace2 data for sparse-checkout percentage

  • 49: 7ee6b9c = 49: a2a143c wt-status: add VFS hydration percentage to normal git status output

  • 50: 6d18e4d ! 50: ae0e051 status: add status serialization mechanism

    @@ Commit message
         Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
         Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
     
    - ## Documentation/config/status.txt ##
    -@@ Documentation/config/status.txt: status.submoduleSummary::
    + ## Documentation/config/status.adoc ##
    +@@ Documentation/config/status.adoc: status.submoduleSummary::
      	the --ignore-submodules=dirty command-line option or the 'git
      	submodule summary' command, which shows a similar output but does
      	not honor these settings.
    @@ Documentation/config/status.txt: status.submoduleSummary::
     +	`--deserialize=<path>` on the command line.  If the cache file is
     +	invalid or stale, git will fall-back and compute status normally.
     
    - ## Documentation/git-status.txt ##
    -@@ Documentation/git-status.txt: ignored, then the directory is not shown, but all contents are shown.
    + ## Documentation/git-status.adoc ##
    +@@ Documentation/git-status.adoc: ignored, then the directory is not shown, but all contents are shown.
      	threshold.
      	See also linkgit:git-diff[1] `--find-renames`.
      
    @@ Documentation/git-status.txt: ignored, then the directory is not shown, but all
      <pathspec>...::
      	See the 'pathspec' entry in linkgit:gitglossary[7].
      
    -@@ Documentation/git-status.txt: quoted as explained for the configuration variable `core.quotePath`
    +@@ Documentation/git-status.adoc: quoted as explained for the configuration variable `core.quotePath`
      (see linkgit:git-config[1]).
      
      
  • 51: 049317d = 51: dbe4ecb Teach ahead-behind and serialized status to play nicely together

  • 52: dce73bd ! 52: a8cbfc0 status: serialize to path

    @@ Commit message
     
         Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
     
    - ## Documentation/git-status.txt ##
    -@@ Documentation/git-status.txt: ignored, then the directory is not shown, but all contents are shown.
    + ## Documentation/git-status.adoc ##
    +@@ Documentation/git-status.adoc: ignored, then the directory is not shown, but all contents are shown.
      	threshold.
      	See also linkgit:git-diff[1] `--find-renames`.
      
  • 53: d621a28 = 53: 47650b4 status: reject deserialize in V2 and conflicts

  • 54: a55ed71 = 54: f99b6ba serialize-status: serialize global and repo-local exclude file metadata

  • 55: 602ba37 ! 55: 3976042 status: deserialization wait

    @@ Commit message
     
         Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
     
    - ## Documentation/config/status.txt ##
    -@@ Documentation/config/status.txt: status.deserializePath::
    + ## Documentation/config/status.adoc ##
    +@@ Documentation/config/status.adoc: status.deserializePath::
      	generated by `--serialize`.  This will be overridden by
      	`--deserialize=<path>` on the command line.  If the cache file is
      	invalid or stale, git will fall-back and compute status normally.
  • 56: 4d09641 = 56: 468ade8 merge-recursive: avoid confusing logic in was_dirty()

  • 57: d1af813 = 57: 545f3b7 merge-recursive: add some defensive coding to was_dirty()

  • 58: 6ca188e = 58: 371cca9 merge-recursive: teach was_dirty() about the virtualfilesystem

  • 59: e4da5b0 = 59: 2c4bf11 status: deserialize with -uno does not print correct hint

  • 60: 39943b3 = 60: 46faf82 fsmonitor: check CE_FSMONITOR_VALID in ce_uptodate

  • 61: 5398a74 = 61: 5f3048e fsmonitor: add script for debugging and update script for tests

  • 62: 3e1eb2b ! 62: 5e16288 status: disable deserialize when verbose output requested.

    @@ builtin/commit.c
     +#include "trace2.h"
      
      static const char * const builtin_commit_usage[] = {
    - 	N_("git commit [-a | --interactive | --patch] [-s] [-v] [-u<mode>] [--amend]\n"
    + 	N_("git commit [-a | --interactive | --patch] [-s] [-v] [-u[<mode>]] [--amend]\n"
     @@ builtin/commit.c: struct repository *repo UNUSED)
      	 */
      	try_deserialize = (!do_serialize &&
  • 63: 05b0721 = 63: 9fc6141 t7524: add test for verbose status deserialzation

  • 64: 665e1b4 = 64: a467a5c deserialize-status: silently fallback if we cannot read cache file

  • 65: 207b578 = 65: 60430a2 gvfs:trace2:data: add trace2 tracing around read_object_process

  • 66: 6ce1dc2 = 66: 4e5b659 gvfs:trace2:data: status deserialization information

  • 67: 875d110 = 67: 1337743 gvfs:trace2:data: status serialization

  • 68: 450ff3e = 68: 5968dbc gvfs:trace2:data: add vfs stats

  • 69: 2854a6d = 69: 7addf6d trace2: refactor setting process starting time

  • 70: 1736ae9 = 70: 8d68658 trace2:gvfs:experiment: clear_ce_flags_1

  • 71: e425e7b = 71: 9db7e71 trace2:gvfs:experiment: report_tracking

  • 72: 7e0b32f = 72: 52b9c2d trace2:gvfs:experiment: read_cache: annotate thread usage in read-cache

  • 73: c5285f0 ! 73: 43cfe2f trace2:gvfs:experiment: read-cache: time read/write of cache-tree extension

    @@ read-cache.c: static int read_index_extension(struct index_state *istate,
     +		trace2_region_leave("index", "read/extension/cache_tree", NULL);
      		break;
      	case CACHE_EXT_RESOLVE_UNDO:
    - 		istate->resolve_undo = resolve_undo_read(data, sz);
    + 		istate->resolve_undo = resolve_undo_read(data, sz, the_hash_algo);
     @@ read-cache.c: static int do_write_index(struct index_state *istate, struct tempfile *tempfile,
      	    !drop_cache_tree && istate->cache_tree) {
      		strbuf_reset(&sb);
  • 74: 0ed8665 = 74: 6b31f85 trace2:gvfs:experiment: add region to apply_virtualfilesystem()

  • 75: b8fef43 = 75: 7e46fbb trace2:gvfs:experiment: add region around unpack_trees()

  • 76: b31529b = 76: e43eef6 trace2:gvfs:experiment: add region to cache_tree_fully_valid()

  • 77: aff9def = 77: e8818ff trace2:gvfs:experiment: add unpack_entry() counter to unpack_trees() and report_tracking()

  • 78: a5e0b36 = 78: a6d8adf trace2:gvfs:experiment: increase default event depth for unpack-tree data

  • 79: 3ccceea = 79: ef54200 trace2:gvfs:experiment: add data for check_updates() in unpack_trees()

  • 80: 2be5e4d = 80: 7691c42 Trace2:gvfs:experiment: capture more 'tracking' details

  • 81: c50cb77 = 81: c817d5b credential: set trace2_child_class for credential manager children

  • 82: dcf71fa = 82: 4e874f6 sub-process: do not borrow cmd pointer from caller

  • 83: 166067a = 83: 1a2c45d sub-process: add subprocess_start_argv()

  • 84: 2f3b474 = 84: 9bc4c4b sha1-file: add function to update existing loose object cache

  • 85: 345431b = 85: 33ea560 packfile: add install_packed_git_and_mru()

  • 86: 0a0f5f0 = 86: 359b994 index-pack: avoid immediate object fetch while parsing packfile

  • 87: 317d0a7 ! 87: 43e771c gvfs-helper: create tool to fetch objects using the GVFS Protocol

    @@ .gitignore
      /git-help
      /git-hook
     
    - ## Documentation/config.txt ##
    -@@ Documentation/config.txt: include::config/gui.txt[]
    + ## Documentation/config.adoc ##
    +@@ Documentation/config.adoc: include::config/gui.adoc[]
      
    - include::config/guitool.txt[]
    + include::config/guitool.adoc[]
      
    -+include::config/gvfs.txt[]
    ++include::config/gvfs.adoc[]
     +
    - include::config/help.txt[]
    + include::config/help.adoc[]
      
    - include::config/http.txt[]
    + include::config/http.adoc[]
     
    - ## Documentation/config/core.txt ##
    -@@ Documentation/config/core.txt: core.gvfs::
    + ## Documentation/config/core.adoc ##
    +@@ Documentation/config/core.adoc: core.gvfs::
      		flag just blocks them from occurring at all.
      --
      
    @@ Documentation/config/core.txt: core.gvfs::
      	Enable "sparse checkout" feature. See linkgit:git-sparse-checkout[1]
      	for more information.
     
    - ## Documentation/config/gvfs.txt (new) ##
    + ## Documentation/config/gvfs.adoc (new) ##
     @@
     +gvfs.cache-server::
     +	TODO
    @@ gvfs-helper.c (new)
     +	if (params->progress_base_phase2_msg.len) {
     +		strbuf_addf(&params->progress_msg, "%s (bytes sent)",
     +			    params->progress_base_phase2_msg.buf);
    -+		params->progress = start_progress(params->progress_msg.buf, ultotal);
    ++		params->progress = start_progress(the_repository, params->progress_msg.buf, ultotal);
     +		display_progress(params->progress, ulnow);
     +	}
     +	params->progress_state = GH__PROGRESS_STATE__PHASE2;
    @@ gvfs-helper.c (new)
     +	if (params->progress_base_phase3_msg.len) {
     +		strbuf_addf(&params->progress_msg, "%s (bytes received)",
     +			    params->progress_base_phase3_msg.buf);
    -+		params->progress = start_progress(params->progress_msg.buf, dltotal);
    ++		params->progress = start_progress(the_repository, params->progress_msg.buf, dltotal);
     +		display_progress(params->progress, dlnow);
     +	}
     +	params->progress_state = GH__PROGRESS_STATE__PHASE3;
    @@ gvfs-helper.c (new)
     +		return;
     +
     +	credential_from_url(&gh__global.main_creds, gh__global.main_url);
    -+	credential_fill(&gh__global.main_creds, 0);
    ++	credential_fill(the_repository, &gh__global.main_creds, 0);
     +	gh__global.main_creds_need_approval = 1;
     +}
     +
    @@ gvfs-helper.c (new)
     +static void refresh_main_creds(void)
     +{
     +	if (gh__global.main_creds.username && *gh__global.main_creds.username)
    -+		credential_reject(&gh__global.main_creds);
    ++		credential_reject(the_repository, &gh__global.main_creds);
     +
     +	lookup_main_creds();
     +
    @@ gvfs-helper.c (new)
     +	if (!gh__global.main_creds_need_approval)
     +		return;
     +
    -+	credential_approve(&gh__global.main_creds);
    ++	credential_approve(the_repository, &gh__global.main_creds);
     +	gh__global.main_creds_need_approval = 0;
     +}
     +
  • 88: f046226 = 88: 7d3f1ac sha1-file: create shared-cache directory if it doesn't exist

  • 89: a90d8ca = 89: ef71673 gvfs-helper: better handling of network errors

  • 90: c3d896a = 90: b6aa270 gvfs-helper-client: properly update loose cache with fetched OID

  • 91: 55b1c71 ! 91: df92c79 gvfs-helper: V2 robust retry and throttling

    @@ gvfs-helper.c: static int gh__curl_progress_cb(void *clientp,
     +		else
     +			strbuf_addf(&params->progress_msg, "%s (bytes sent)",
     +				    params->progress_base_phase2_msg.buf);
    - 		params->progress = start_progress(params->progress_msg.buf, ultotal);
    + 		params->progress = start_progress(the_repository, params->progress_msg.buf, ultotal);
      		display_progress(params->progress, ulnow);
      	}
     @@ gvfs-helper.c: static int gh__curl_progress_cb(void *clientp,
    @@ gvfs-helper.c: static int gh__curl_progress_cb(void *clientp,
     +		else
     +			strbuf_addf(&params->progress_msg, "%s (bytes received)",
     +				    params->progress_base_phase3_msg.buf);
    - 		params->progress = start_progress(params->progress_msg.buf, dltotal);
    + 		params->progress = start_progress(the_repository, params->progress_msg.buf, dltotal);
      		display_progress(params->progress, dlnow);
      	}
     @@ gvfs-helper.c: static void gh__run_one_slot(struct active_request_slot *slot,
    @@ gvfs-helper.c: static void gh_http_cleanup(void)
     +	strbuf_addstr(&region, gh__server_type_label[params->server_type]);
     +	trace2_region_enter("gvfs-helper", region.buf, NULL);
     +
    -+	progress = start_progress(progress_msg, duration);
    ++	progress = start_progress(the_repository, progress_msg, duration);
     +	while (now < end) {
     +		display_progress(progress, (now - begin));
     +
  • 92: a22ab61 = 92: 36acf3d gvfs-helper: expose gvfs/objects GET and POST semantics

  • 93: 7a54bac = 93: 643db1f gvfs-helper: dramatically reduce progress noise

  • 94: 50ca17c = 94: c595614 gvfs-helper-client.h: define struct object_id

  • 95: f394fd7 = 95: 6adb693 gvfs-helper: handle pack-file after single POST request

  • 96: d3a0365 ! 96: 3ee3fc4 test-gvfs-prococol, t5799: tests for gvfs-helper

    @@ gvfs-helper.c: static void do_throttle_spin(struct gh__request_params *params,
      	strbuf_addstr(&region, gh__server_type_label[params->server_type]);
      	trace2_region_enter("gvfs-helper", region.buf, NULL);
      
    --	progress = start_progress(progress_msg, duration);
    +-	progress = start_progress(the_repository, progress_msg, duration);
     +	if (gh__cmd_opts.show_progress)
    -+		progress = start_progress(progress_msg, duration);
    ++		progress = start_progress(the_repository, progress_msg, duration);
     +
      	while (now < end) {
      		display_progress(progress, (now - begin));
    @@ t/helper/test-gvfs-protocol.c (new)
     +	unsigned char compressed[4096];
     +	git_zstream stream;
     +	struct object_id oid_check;
    -+	git_hash_ctx c;
    ++	struct git_hash_ctx c;
     +	int object_header_len;
     +	int ret;
     +
  • 97: 2f81d39 = 97: c672d48 gvfs-helper: move result-list construction into install functions

  • 98: 21e7f37 ! 98: af382c2 t5799: add support for POST to return either a loose object or packfile

    @@ t/helper/test-gvfs-protocol.c: static enum worker_result do__gvfs_config__get(st
      {
      #define MAX_HEADER_LEN 32
     @@ t/helper/test-gvfs-protocol.c: static enum worker_result send_loose_object(const struct object_info *oi,
    - 	git_hash_ctx c;
    + 	struct git_hash_ctx c;
      	int object_header_len;
      	int ret;
     +	unsigned flags = 0;
  • 99: d87f0c7 = 99: 4c04ad4 t5799: cleanup wc-l and grep-c lines

  • 100: 45e6315 = 100: 39f5436 gvfs-helper: verify loose objects after write

  • 101: 24a1c1d = 101: 017157a t7599: create corrupt blob test

  • 102: ecb818e ! 102: ecd2def gvfs-helper: add prefetch support

    @@ gvfs-helper.c: static void create_tempfile_for_loose(
     -		string_list_append(params->result_list, result_msg.buf);
     -		strbuf_release(&result_msg);
     +	if (gh__cmd_opts.show_progress)
    -+		params->progress = start_progress("Installing prefetch packfiles", np);
    ++		params->progress = start_progress(the_repository, "Installing prefetch packfiles", np);
     +
     +	for (k = 0; k < np; k++) {
     +		extract_packfile_from_multipack(params, status, fd, k);
    @@ gvfs-helper.c: static void do_throttle_spin(struct gh__request_params *params,
     +	trace2_region_enter(TR2_CAT, region.buf, NULL);
      
      	if (gh__cmd_opts.show_progress)
    - 		progress = start_progress(progress_msg, duration);
    + 		progress = start_progress(the_repository, progress_msg, duration);
     @@ gvfs-helper.c: static void do_throttle_spin(struct gh__request_params *params,
      	display_progress(progress, duration);
      	stop_progress(&progress);
  • 103: 1909ee1 = 103: 4cd1164 gvfs-helper: add prefetch .keep file for last packfile

  • 104: e92cd75 = 104: 85ee633 gvfs-helper: do one read in my_copy_fd_len_tail()

  • 105: afdd8ea = 105: 3bc5997 gvfs-helper: move content-type warning for prefetch packs

  • 106: 41e4d0c ! 106: dabc10d fetch: use gvfs-helper prefetch under config

    @@ Commit message
     
         Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
     
    - ## Documentation/config/core.txt ##
    -@@ Documentation/config/core.txt: core.gvfs::
    + ## Documentation/config/core.adoc ##
    +@@ Documentation/config/core.adoc: core.gvfs::
      		is first accessed and brought down to the client. Git.exe can't
      		currently tell the first access vs subsequent accesses so this
      		flag just blocks them from occurring at all.
  • 107: 9bb58b4 = 107: cd741af gvfs-helper: better support for concurrent packfile fetches

  • 108: c5a4a8f = 108: e418e1c remote-curl: do not call fetch-pack when using gvfs-helper

  • 109: 8d2fdbb = 109: d64ec45 fetch: reprepare packs before checking connectivity

  • 110: 7c8e98a = 110: 75dbc7a gvfs-helper: retry when creating temp files

  • 111: a0c0c62 = 111: 373c4da sparse: avoid warnings about known cURL issues in gvfs-helper.c

  • 112: d1efc18 = 112: cdb259c gvfs-helper: add --max-retries to prefetch verb

  • 113: 8aa590a = 113: a1fe2d7 t5799: add tests to detect corrupt pack/idx files in prefetch

  • 114: e64962e = 114: 4fb49fe gvfs-helper: ignore .idx files in prefetch multi-part responses

  • 115: 90b1c78 = 115: b5708a3 t5799: explicitly test gvfs-helper --fallback and --no-fallback

  • 116: c70e49f ! 116: fa58d65 gvfs-helper: don't fallback with new config

    @@ Commit message
     
         Signed-off-by: Derrick Stolee <stolee@gmail.com>
     
    - ## Documentation/config/gvfs.txt ##
    -@@ Documentation/config/gvfs.txt: gvfs.cache-server::
    + ## Documentation/config/gvfs.adoc ##
    +@@ Documentation/config/gvfs.adoc: gvfs.cache-server::
      
      gvfs.sharedcache::
      	TODO
  • 117: 07e0f90 = 117: 6b85031 test-gvfs-protocol: add cache_http_503 to mayhem

  • 119: 920d3f7 = 118: c1c6bd0 maintenance: care about gvfs.sharedCache config

  • 120: b6749e0 = 119: 3ab168b unpack-trees:virtualfilesystem: Improve efficiency of clear_ce_flags

  • 118: 0598e5f = 120: 8068ebb t5799: add unit tests for new gvfs.fallback config setting

  • 121: 7592c76 = 121: 9287163 homebrew: add GitHub workflow to release Cask

  • 122: 7e56c23 ! 122: 37ebca3 Adding winget workflows

    @@ .github/workflows/release-winget.yml (new)
     +
     +          # Submit manifests
     +          $manifestDirectory = Split-Path "$manifestPath"
    -+          .\wingetcreate.exe submit -t "(az keyvault secret show --name ${{ secrets.WINGET_TOKEN_SECRET_NAME }} --vault-name ${{ secrets.AZURE_VAULT }} --query "value")" $manifestDirectory
    ++          .\wingetcreate.exe submit -t "(az keyvault secret show --name ${{ secrets.WINGET_TOKEN_SECRET_NAME }} --vault-name ${{ secrets.AZURE_VAULT }} --query "value" --output tsv)" $manifestDirectory
     +        shell: powershell
  • 123: 34700f6 = 123: 5e8c67e Disable the monitor-components workflow in msft-git

  • 124: bc62204 = 124: 8688653 .github: enable windows builds on microsoft fork

  • 125: 716a315 ! 125: c75d92b release: create initial Windows installer build workflow

    @@ .github/workflows/build-git-installers.yml (new)
     +          # Verify tag follows rules in GIT-VERSION-GEN (i.e., matches the specified "DEF_VER" in
     +          # GIT-VERSION-FILE) and matches tag determined from trigger
     +          make GIT-VERSION-FILE
    -+          test "${{ steps.tag.outputs.version }}" == "$(sed -n 's/^GIT_VERSION = //p'< GIT-VERSION-FILE)" || die "GIT-VERSION-FILE tag does not match ${{ steps.tag.outputs.name }}"
    ++          test "${{ steps.tag.outputs.version }}" == "$(sed -n 's/^GIT_VERSION *= *//p'< GIT-VERSION-FILE)" || die "GIT-VERSION-FILE tag ($(cat GIT-VERSION-FILE)) does not match ${{ steps.tag.outputs.name }}"
     +  # End check prerequisites for the workflow
     +
     +  # Build Windows installers (x86_64 & aarch64; installer & portable)
  • 126: 43b4d91 = 126: 07b396e help: special-case HOST_CPU universal

  • 127: a9af4ad ! 127: f0dcb8f release: add Mac OSX installer build

    @@ .github/macos-installer/Makefile (new)
     +	touch $@
     +
     +$(BUILD_DIR)/git-$(VERSION)/osx-built-subtree:
    ++	$(SUBMAKE) -C $(BUILD_DIR)/git-$(VERSION)/Documentation asciidoc.conf
     +	cd $(BUILD_DIR)/git-$(VERSION)/contrib/subtree; $(SUBMAKE) XML_CATALOG_FILES="$(XML_CATALOG_FILES)" all git-subtree.1
     +	touch $@
     +
  • 128: f6400e6 ! 128: 465c1d1 release: build unsigned Ubuntu .deb package

    @@ .github/workflows/build-git-installers.yml: jobs:
     +  create-linux-unsigned-artifacts:
     +    runs-on: ubuntu-latest
     +    container:
    -+      image: ubuntu:16.04 # expanded security maintenance until 04/02/2026, according to https://endoflife.date/ubuntu
    ++      image: ubuntu:20.04 # security support until 04/02/2025, according to https://endoflife.date/ubuntu
     +      volumes:
     +        # override /__e/node20 because GitHub Actions uses a version that requires too-recent glibc, see "Install dependencies" below
     +        - /tmp:/__e/node20
    @@ .github/workflows/build-git-installers.yml: jobs:
     +      - name: Install dependencies
     +        run: |
     +          set -ex
    ++
    ++          # Prevent the dialog that asks interactively for the timezone
    ++          export DEBIAN_FRONTEND=noninteractive
    ++          export TZ=Etc/UTC
    ++
     +          apt-get update -q
     +          apt-get install -y -q --no-install-recommends \
     +            build-essential \
  • 129: 4ebc418 = 129: e77a36d release: add signing step for .deb package

  • 130: 1f99600 = 130: 33ebe9a release: create draft GitHub release with packages & installers

  • 131: 07f6052 ! 131: db67113 build-git-installers: publish gpg public key

    @@ .github/workflows/build-git-installers.yml: jobs:
     +      - name: Download GPG public key signature file
     +        run: |
     +          az keyvault secret show --name "$GPG_PUBLIC_KEY_SECRET_NAME" \
    -+            --vault-name "$AZURE_VAULT" --query "value" \
    -+            | sed -e 's/^"//' -e 's/"$//' | base64 -d >msft-git-public.asc
    ++            --vault-name "$AZURE_VAULT" --query "value" --output tsv |
    ++            base64 -d >msft-git-public.asc
     +          mv msft-git-public.asc deb-package
     +
            - uses: actions/github-script@v6
  • 132: 8c886c0 = 132: a619fd5 release: continue pestering until user upgrades

  • 133: 4e30bb0 = 133: b355c33 dist: archive HEAD instead of HEAD^{tree}

  • 134: 8a24a5f = 134: e0744c3 release: include GIT_BUILT_FROM_COMMIT in MacOS build

  • 135: 7363256 = 135: 7e6d8e2 release: add installer validation

  • 136: bea6180 ! 136: 9749a7a update-microsoft-git: create barebones builtin

    @@ .gitignore
      /git-update-server-info
      /git-upload-archive
     
    - ## Documentation/git-update-microsoft-git.txt (new) ##
    + ## Documentation/git-update-microsoft-git.adoc (new) ##
     @@
     +git-update-microsoft-git(1)
     +===========================
    @@ Documentation/lint-manpages.sh: check_missing_docs () (
      		git-?*--?* ) continue ;;
      		esac
     
    + ## Documentation/meson.build ##
    +@@ Documentation/meson.build: manpages = {
    +   'git-unpack-file.adoc' : 1,
    +   'git-unpack-objects.adoc' : 1,
    +   'git-update-index.adoc' : 1,
    ++  'git-update-microsoft-git.txt' : 1,
    +   'git-update-ref.adoc' : 1,
    +   'git-update-server-info.adoc' : 1,
    +   'git-upload-archive.adoc' : 1,
    +
      ## Makefile ##
     @@ Makefile: BUILTIN_OBJS += builtin/tag.o
      BUILTIN_OBJS += builtin/unpack-file.o
  • 137: c567faa = 137: cb73013 update-microsoft-git: Windows implementation

  • 138: 13f763c = 138: afe6032 update-microsoft-git: use brew on macOS

  • 139: 512dfbd = 139: 5e8b393 .github: update ISSUE_TEMPLATE.md for microsoft/git

  • 140: 6a8250f = 140: 24cdaf1 .github: update PULL_REQUEST_TEMPLATE.md

  • 141: 676c07e = 141: 6179b75 Adjust README.md for microsoft/git

  • 142: 1526f65 ! 142: e64212e git_config_set_multivar_in_file_gently(): add a lock timeout

    @@ Commit message
     
         Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
     
    - ## Documentation/config/core.txt ##
    -@@ Documentation/config/core.txt: core.WSLCompat::
    + ## Documentation/config/core.adoc ##
    +@@ Documentation/config/core.adoc: core.WSLCompat::
      	The default value is false. When set to true, Git will set the mode
      	bits of the file in the way of wsl, so that the executable flag of
      	files can be set or read correctly.
  • 143: 469b549 = 143: f2d3394 scalar: set the config write-lock timeout to 150ms

  • 144: 4a81210 = 144: b117668 scalar: add docs from microsoft/scalar

  • 145: 298b29b = 145: 8ad629c scalar (Windows): use forward slashes as directory separators

  • 146: 9ad768c = 146: 0a8c7b0 scalar: add retry logic to run_git()

  • 147: 4a09510 = 147: 4a64d97 scalar: support the config command for backwards compatibility

  • 148: 5a5e189 = 148: 1c19253 scalar: implement a minimal JSON parser

  • 149: 2e80737 ! 149: 0388217 scalar clone: support GVFS-enabled remote repositories

    @@ Commit message
     
      ## diagnose.c ##
     @@
    - #include "packfile.h"
      #include "parse-options.h"
    + #include "repository.h"
      #include "write-or-die.h"
     +#include "config.h"
      
      struct archive_dir {
      	const char *path;
    -@@ diagnose.c: int create_diagnostics_archive(struct strbuf *zip_path, enum diagnose_mode mode)
    +@@ diagnose.c: int create_diagnostics_archive(struct repository *r,
      	struct strvec archiver_args = STRVEC_INIT;
      	char **argv_copy = NULL;
      	int stdout_fd = -1, archiver_fd = -1;
    @@ diagnose.c: int create_diagnostics_archive(struct strbuf *zip_path, enum diagnos
      	struct strbuf buf = STRBUF_INIT;
      	int res;
      	struct archive_dir archive_dirs[] = {
    -@@ diagnose.c: int create_diagnostics_archive(struct strbuf *zip_path, enum diagnose_mode mode)
    +@@ diagnose.c: int create_diagnostics_archive(struct repository *r,
      	get_version_info(&buf, 1);
      
    - 	strbuf_addf(&buf, "Repository root: %s\n", the_repository->worktree);
    + 	strbuf_addf(&buf, "Repository root: %s\n", r->worktree);
     +
    -+	git_config_get_string("gvfs.cache-server", &cache_server_url);
    ++	repo_config_get_string(r, "gvfs.cache-server", &cache_server_url);
     +	strbuf_addf(&buf, "Cache Server: %s\n\n",
     +		    cache_server_url ? cache_server_url : "None");
     +
      	get_disk_info(&buf);
      	write_or_die(stdout_fd, buf.buf, buf.len);
      	strvec_pushf(&archiver_args,
    -@@ diagnose.c: int create_diagnostics_archive(struct strbuf *zip_path, enum diagnose_mode mode)
    +@@ diagnose.c: int create_diagnostics_archive(struct repository *r,
      	free(argv_copy);
      	strvec_clear(&archiver_args);
      	strbuf_release(&buf);
    @@ scalar.c: static int set_config(const char *fmt, ...)
      {
      	struct child_process cp = CHILD_PROCESS_INIT;
     @@ scalar.c: static int cmd_clone(int argc, const char **argv)
    - 	const char *branch = NULL;
    + 	char *branch_to_free = NULL;
      	int full_clone = 0, single_branch = 0, show_progress = isatty(2);
      	int src = 1, tags = 1;
     +	const char *cache_server_url = NULL;
  • 150: 49102f6 = 150: 1f20613 test-gvfs-protocol: also serve smart protocol

  • 151: 1fa4f46 = 151: 7110c95 gvfs-helper: add the endpoint command

  • 152: a8a4485 = 152: 8b9b557 dir_inside_of(): handle directory separators correctly

  • 153: 0f4bc44 = 153: ddc0f56 scalar: disable authentication in unattended mode

  • 154: c270115 ! 154: 686f7b0 scalar: do initialize gvfs.sharedCache

    @@ Commit message
     
         Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
     
    - ## Documentation/scalar.txt ##
    -@@ Documentation/scalar.txt: SYNOPSIS
    + ## Documentation/scalar.adoc ##
    +@@ Documentation/scalar.adoc: SYNOPSIS
      --------
      [verse]
      scalar clone [--single-branch] [--branch <main-branch>] [--full-clone]
    @@ Documentation/scalar.txt: SYNOPSIS
      scalar list
      scalar register [<enlistment>]
      scalar unregister [<enlistment>]
    -@@ Documentation/scalar.txt: cloning. If the HEAD at the remote did not point at any branch when
    +@@ Documentation/scalar.adoc: cloning. If the HEAD at the remote did not point at any branch when
      	A sparse-checkout is initialized by default. This behavior can be
      	turned off via `--full-clone`.
      
    @@ Documentation/scalar.txt: cloning. If the HEAD at the remote did not point at an
      
     
      ## diagnose.c ##
    -@@ diagnose.c: int create_diagnostics_archive(struct strbuf *zip_path, enum diagnose_mode mode)
    +@@ diagnose.c: int create_diagnostics_archive(struct repository *r,
      	struct strvec archiver_args = STRVEC_INIT;
      	char **argv_copy = NULL;
      	int stdout_fd = -1, archiver_fd = -1;
    @@ diagnose.c: int create_diagnostics_archive(struct strbuf *zip_path, enum diagnos
      	struct strbuf buf = STRBUF_INIT;
      	int res;
      	struct archive_dir archive_dirs[] = {
    -@@ diagnose.c: int create_diagnostics_archive(struct strbuf *zip_path, enum diagnose_mode mode)
    - 	strbuf_addf(&buf, "Repository root: %s\n", the_repository->worktree);
    +@@ diagnose.c: int create_diagnostics_archive(struct repository *r,
    + 	strbuf_addf(&buf, "Repository root: %s\n", r->worktree);
      
    - 	git_config_get_string("gvfs.cache-server", &cache_server_url);
    + 	repo_config_get_string(r, "gvfs.cache-server", &cache_server_url);
     -	strbuf_addf(&buf, "Cache Server: %s\n\n",
     -		    cache_server_url ? cache_server_url : "None");
    -+	git_config_get_string("gvfs.sharedCache", &shared_cache);
    ++	repo_config_get_string(r, "gvfs.sharedCache", &shared_cache);
     +	strbuf_addf(&buf, "Cache Server: %s\nLocal Cache: %s\n\n",
     +		    cache_server_url ? cache_server_url : "None",
     +		    shared_cache ? shared_cache : "None");
      
      	get_disk_info(&buf);
      	write_or_die(stdout_fd, buf.buf, buf.len);
    -@@ diagnose.c: int create_diagnostics_archive(struct strbuf *zip_path, enum diagnose_mode mode)
    +@@ diagnose.c: int create_diagnostics_archive(struct repository *r,
      	strvec_clear(&archiver_args);
      	strbuf_release(&buf);
      	free(cache_server_url);
    @@ scalar.c: static int supports_gvfs_protocol(const char *url, char **cache_server
     +		int hash_algo_index = hash_algo_by_name("sha1");
     +		const struct git_hash_algo *hash_algo = hash_algo_index < 0 ?
     +			the_hash_algo : &hash_algos[hash_algo_index];
    -+		git_hash_ctx ctx;
    ++		struct git_hash_ctx ctx;
     +		unsigned char hash[GIT_MAX_RAWSZ];
     +
     +		strbuf_addstr(&downcased, url);
    @@ scalar.c: void load_builtin_commands(const char *prefix UNUSED,
      static int cmd_clone(int argc, const char **argv)
      {
      	const char *branch = NULL;
    + 	char *branch_to_free = NULL;
      	int full_clone = 0, single_branch = 0, show_progress = isatty(2);
      	int src = 1, tags = 1;
     -	const char *cache_server_url = NULL;
    @@ scalar.c: static int cmd_clone(int argc, const char **argv)
     +	trace2_data_intmax("scalar", the_repository, "unattended",
     +			   is_unattended());
      
    - 	if (!branch && !(branch = remote_default_branch(url))) {
    + 	if (!branch && !(branch = branch_to_free = remote_default_branch(url))) {
      		res = error(_("failed to get default branch for '%s'"), url);
     @@ scalar.c: static int cmd_clone(int argc, const char **argv)
      			supports_gvfs_protocol(url, &default_cache_server_url);
  • 155: b636dc0 ! 155: 8e41d86 scalar diagnose: include shared cache info

    @@ diagnose.c: static int dir_file_stats(struct object_directory *object_dir, void
      static int count_files(struct strbuf *path)
      {
      	DIR *dir = opendir(path->buf);
    -@@ diagnose.c: int create_diagnostics_archive(struct strbuf *zip_path, enum diagnose_mode mode)
    +@@ diagnose.c: int create_diagnostics_archive(struct repository *r,
      	char **argv_copy = NULL;
      	int stdout_fd = -1, archiver_fd = -1;
      	char *cache_server_url = NULL, *shared_cache = NULL;
    @@ diagnose.c: int create_diagnostics_archive(struct strbuf *zip_path, enum diagnos
      	int res;
      	struct archive_dir archive_dirs[] = {
      		{ ".git", 0 },
    -@@ diagnose.c: int create_diagnostics_archive(struct strbuf *zip_path, enum diagnose_mode mode)
    +@@ diagnose.c: int create_diagnostics_archive(struct repository *r,
      		}
      	}
      
    @@ diagnose.c: int create_diagnostics_archive(struct strbuf *zip_path, enum diagnos
     +	}
     +
      	strvec_pushl(&archiver_args, "--prefix=",
    - 		     oid_to_hex(the_hash_algo->empty_tree), "--", NULL);
    + 		     oid_to_hex(r->hash_algo->empty_tree), "--", NULL);
      
  • 156: 91ffe1a = 156: 1917e70 scalar: only try GVFS protocol on https:// URLs

  • 157: df4f0a6 = 157: 0e76a11 scalar: verify that we can use a GVFS-enabled repository

  • 158: 1db87ec ! 158: f7b2abb scalar: add the cache-server command

    @@ Commit message
     
         Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
     
    - ## Documentation/scalar.txt ##
    -@@ Documentation/scalar.txt: scalar run ( all | config | commit-graph | fetch | loose-objects | pack-files )
    + ## Documentation/scalar.adoc ##
    +@@ Documentation/scalar.adoc: scalar run ( all | config | commit-graph | fetch | loose-objects | pack-files )
      scalar reconfigure [ --all | <enlistment> ]
      scalar diagnose [<enlistment>]
      scalar delete <enlistment>
    @@ Documentation/scalar.txt: scalar run ( all | config | commit-graph | fetch | loo
      
      DESCRIPTION
      -----------
    -@@ Documentation/scalar.txt: delete <enlistment>::
    +@@ Documentation/scalar.adoc: delete <enlistment>::
      	This subcommand lets you delete an existing Scalar enlistment from your
      	local file system, unregistering the repository.
      
  • 159: 380bb89 = 159: d84ca9b scalar: add a test toggle to skip accessing the vsts/info endpoint

  • 160: 54783df = 160: 58f9f2e scalar: adjust documentation to the microsoft/git fork

  • 161: 22e1322 = 161: 5224e24 scalar: enable untracked cache unconditionally

  • 162: 8116d20 ! 162: 04a0bfa scalar: parse clone --no-fetch-commits-and-trees for backwards compatibility

    @@ scalar.c: static int init_shared_object_cache(const char *url,
      {
     +	int dummy = 0;
      	const char *branch = NULL;
    + 	char *branch_to_free = NULL;
      	int full_clone = 0, single_branch = 0, show_progress = isatty(2);
    - 	int src = 1, tags = 1;
     @@ scalar.c: static int cmd_clone(int argc, const char **argv)
      		OPT_STRING(0, "local-cache-path", &local_cache_root,
      			   N_("<path>"),
  • 163: 21fa0fd ! 163: 914f1f9 scalar: make GVFS Protocol a forced choice

    @@ Commit message
     
         Signed-off-by: Derrick Stolee <stolee@gmail.com>
     
    - ## Documentation/scalar.txt ##
    -@@ Documentation/scalar.txt: clone), and `~/.scalarCache` on macOS.
    + ## Documentation/scalar.adoc ##
    +@@ Documentation/scalar.adoc: clone), and `~/.scalarCache` on macOS.
          Retrieve missing objects from the specified remote, which is expected to
          understand the GVFS protocol.
      
  • 164: becf22c ! 164: 4cbdb67 scalar diagnose: accommodate Scalar's Functional Tests

    @@ Commit message
         Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
     
      ## diagnose.c ##
    -@@ diagnose.c: int create_diagnostics_archive(struct strbuf *zip_path, enum diagnose_mode mode)
    +@@ diagnose.c: int create_diagnostics_archive(struct repository *r,
      		goto diagnose_cleanup;
      	}
      
  • 165: efd5b8f = 165: 7ab5902 ci: run Scalar's Functional Tests

  • 166: aae1e8f = 166: 3c48ffb scalar: upgrade to newest FSMonitor config setting

  • 167: aa3fed6 = 167: 11bd941 abspath: make strip_last_path_component() global

  • 168: 19134cb = 168: 0ed3dcc scalar: configure maintenance during 'reconfigure'

  • 169: b47a29c = 169: d3ed86f scalar: .scalarCache should live above enlistment

  • 170: 4250d6d = 170: 4e1b1f6 add/rm: allow adding sparse entries when virtual

  • 171: a133894 ! 171: 2da0919 sparse-checkout: add config to disable deleting dirs

    @@ Commit message
     
         Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
     
    - ## Documentation/config/index.txt ##
    + ## Documentation/config/index.adoc ##
     @@
     +index.deleteSparseDirectories::
     +	When enabled, the cone mode sparse-checkout feature will delete
  • 172: f053ba3 = 172: ea7cae2 diff: ignore sparse paths in diffstat

  • 173: 6e6b8fc = 173: 0a22b84 repo-settings: enable sparse index by default

  • 174: 8fff938 = 174: 214578f diff(sparse-index): verify with partially-sparse

  • 175: d6f8f4c = 175: e8c0e72 stash: expand testing for git stash -u

  • 176: 1df7b6f = 176: b49b34d sequencer: avoid progress when stderr is redirected

  • 177: 528521c = 177: c64b811 sparse: add vfs-specific precautions

  • 178: 8b4a143 = 178: 4f89d60 reset: fix mixed reset when using virtual filesystem

  • 179: 1991d52 = 179: 324ad83 sparse-index: add ensure_full_index_with_reason()

  • 180: 7a919dc = 180: a8449e1 treewide: add reasons for expanding index

  • 181: 74f0e1c = 181: 04ea9d0 treewide: custom reasons for expanding index

  • 182: d89823c ! 182: 021e269 sparse-index: add macro for unaudited expansions

    @@ builtin/commit.c: static int prepare_to_commit(const char *index_file, const cha
      					ita_nr++;
     
      ## builtin/difftool.c ##
    -@@ builtin/difftool.c: static int run_dir_diff(const char *extcmd, int symlinks, const char *prefix,
    +@@ builtin/difftool.c: static int run_dir_diff(struct repository *repo,
      	ret = run_command(&cmd);
      
      	/* TODO: audit for interaction with sparse-index. */
  • 183: 82f663a ! 183: 220f41f Docs: update sparse index plan with logging

    @@ Commit message
         Signed-off-by: Derrick Stolee <stolee@gmail.com>
         Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
     
    - ## Documentation/technical/sparse-index.txt ##
    -@@ Documentation/technical/sparse-index.txt: Here are some commands that might be useful to update:
    + ## Documentation/technical/sparse-index.adoc ##
    +@@ Documentation/technical/sparse-index.adoc: Here are some commands that might be useful to update:
      * `git am`
      * `git clean`
      * `git stash`
  • 184: d86e967 = 184: c87d5c0 sparse-index: log failure to clear skip-worktree

  • 185: d4f8e8c = 185: 1255e3f stash: use -f in checkout-index child process

  • 186: 05dca1b = 186: c8fadbc sparse-index: do not copy hashtables during expansion

  • 187: 501634b < -: ------------ t5616: mark tests as bogus with --path-walk

  • 188: 2e31da5 < -: ------------ path-walk: add new 'edge_aggressive' option

  • -: ------------ > 187: ff6c4d7 path-walk: add new 'edge_aggressive' option

  • 189: 4a7f1dd = 188: b18d1a0 pack-objects: allow --shallow and --path-walk

  • 190: 19094f4 = 189: 7d95375 t5538: add test to confirm deltas in shallow pushes

  • 191: 71e11fb = 190: 8dddd73 sub-process: avoid leaking cmd

  • 192: 78daa0b = 191: 927c26c remote-curl: release filter options before re-setting them

  • 193: 4d43345 = 192: 394a129 transport: release object filter options

  • 194: 9551455 = 193: b7f2e33 mingw: special-case administrators even more

  • 195: be80005 = 194: 3fc340b test-tool path-utils: support debugging "dubious ownership" issues

  • 196: c775ce5 ! 195: 65ba23c push: don't reuse deltas with path walk

    @@ builtin/push.c: int cmd_push(int argc,
      
     
      ## send-pack.c ##
    -@@ send-pack.c: static int pack_objects(int fd, struct ref *refs, struct oid_array *advertised,
    +@@ send-pack.c: static int pack_objects(struct repository *r,
      		strvec_push(&po.args, "--shallow");
      	if (args->disable_bitmaps)
      		strvec_push(&po.args, "--no-use-bitmap-index");
  • 197: 134fb83 = 196: 04efb4a release-winget.yml: update command to include ARM installers

  • 198: 63d80ba = 197: a8f8c2d t7900-maintenance.sh: reset config between tests

  • 199: 7c53544 ! 198: df89b84 maintenance: add cache-local-objects maintenance task

    @@ Commit message
     
         Signed-off-by: Matthew John Cheetham <mjcheetham@outlook.com>
     
    - ## Documentation/git-maintenance.txt ##
    -@@ Documentation/git-maintenance.txt: task:
    + ## Documentation/git-maintenance.adoc ##
    +@@ Documentation/git-maintenance.adoc: task:
      * `prefetch`: hourly.
      * `loose-objects`: daily.
      * `incremental-repack`: daily.
    @@ Documentation/git-maintenance.txt: task:
      --
      +
      `git maintenance register` will also disable foreground maintenance by
    -@@ Documentation/git-maintenance.txt: pack-refs::
    +@@ Documentation/git-maintenance.adoc: pack-refs::
      	need to iterate across many references. See linkgit:git-pack-refs[1]
      	for more information.
      
  • 200: d0967a3 = 199: bbbe8fa scalar.c: add cache-local-objects task

  • 201: bda3f91 < -: ------------ fixup! update-microsoft-git: create barebones builtin

  • 202: 627a6bf < -: ------------ fixup! release: create initial Windows installer build workflow

  • 203: 842cfa4 < -: ------------ fixup! release: build unsigned Ubuntu .deb package

  • 204: dc81d69 < -: ------------ fixup! release: add Mac OSX installer build

  • 205: a053985 < -: ------------ fixup! Adding winget workflows

  • 206: fec16ed < -: ------------ fixup! build-git-installers: publish gpg public key

@dscho dscho marked this pull request as draft February 27, 2025 00:08
@dscho
Copy link
Member Author

dscho commented Feb 27, 2025

  • 187: 501634b < -: ------------ t5616: mark tests as bogus with --path-walk

@derrickstolee when I reverted this, the test still passed. Since the patch caused merge conflicts anyway because there was no longer any special handling needed to force off the --full-hash-name option, was the underlying problem maybe solved also for --path-walk?

  • 188: 2e31da5 < -: ------------ path-walk: add new 'edge_aggressive' option

  • -: ------------ > 187: ff6c4d7 path-walk: add new 'edge_aggressive' option

This now looks a lot simpler, so much so that I have my doubts, even if t5538 still succeeds. @derrickstolee does this look correct?

@dscho dscho force-pushed the tentative/vfs-2.49.0 branch from 21085be to fd415b2 Compare March 5, 2025 13:34
@derrickstolee
Copy link

  • 187: 501634b < -: ------------ t5616: mark tests as bogus with --path-walk

@derrickstolee when I reverted this, the test still passed. Since the patch caused merge conflicts anyway because there was no longer any special handling needed to force off the --full-hash-name option, was the underlying problem maybe solved also for --path-walk?

It's entirely possible. I'll double check later when working on this with upstream.

  • 188: 2e31da5 < -: ------------ path-walk: add new 'edge_aggressive' option
  • -: ------------ > 187: ff6c4d7 path-walk: add new 'edge_aggressive' option

This now looks a lot simpler, so much so that I have my doubts, even if t5538 still succeeds. @derrickstolee does this look correct?

This is likely due to some simplification that happened during my upstreaming of the path-walk API. I was about to work these patches into my upstream submission of the git pack-objects --path-walk feature, but haven't had time to carve it out yet. The new tests in t5558 show the behavior that we expect for shallow clones.

@derrickstolee
Copy link

I think the behavior in t5616-partial-clone.sh was fixed upstream in November in c08589e or a similar commit. Those changes were in response to me claiming these tests were broken, so they must not be anymore.

@derrickstolee
Copy link

This is likely due to some simplification that happened during my upstreaming of the path-walk API. I was about to work these patches into my upstream submission of the git pack-objects --path-walk feature, but haven't had time to carve it out yet. The new tests in t5558 show the behavior that we expect for shallow clones.

I've confirmed that the way I was handling uninteresting objects in the path-walk API changed when it went upstream so we didn't need to delete the old uninteresting things or fix the tests. I will want to update t6601 with this change, but that doesn't block this PR.

@dscho dscho force-pushed the tentative/vfs-2.49.0 branch from 120e31d to 26900ec Compare March 5, 2025 17:03
@dscho
Copy link
Member Author

dscho commented Mar 5, 2025

Range-diff relative to v2.49.0-rc0
  • 3: 9b5a803 = 1: 36edacf survey: calculate more stats on refs

  • 1: 9d523d0 = 2: daa51d3 sparse-index.c: fix use of index hashes in expand_index

  • 6: f976222 = 3: 786873b t5300: confirm failure of git index-pack when non-idx suffix requested

  • 4: c65a454 = 4: 5b86471 survey: show some commits/trees/blobs histograms

  • 2: f5655d0 = 5: d965162 t: remove advice from some tests

  • 8: 034fdfc = 6: 0cc2714 t1092: add test for untracked files and directories

  • 9: d60b546 = 7: 3aed9f9 index-pack: disable rev-index if index file has non .idx suffix

  • 10: 50a6aa7 = 8: ceecd79 trace2: prefetch value of GIT_TRACE2_DST_DEBUG at startup

  • 5: dc23c7b ! 9: 0e3f13e survey: add vector of largest objects for various scaling dimensions

    @@ Documentation/git-survey.adoc: Reachable Object Summary
     +CONFIGURATION
     +-------------
     +
    -+include::config/survey.txt[]
    ++include::config/survey.adoc[]
     +
      GIT
      ---
  • 7: 9895728 = 10: 034d566 survey: add pathname of blob or tree to large_item_vec

  • 11: fd05a52 = 11: 1d3a7d8 survey: add commit-oid to large_item detail

  • 12: 82fc24d = 12: d4b7e3c survey: add commit name-rev lookup to each large_item

  • 13: b531833 = 13: 3a219f1 survey: add --no-name-rev option

  • 14: 10ee868 = 14: 45d6f7d survey: started TODO list at bottom of source file

  • 15: f77f27c = 15: 01df184 survey: expanded TODO list at the bottom of the source file

  • 16: 30fa141 = 16: 67cb265 survey: expanded TODO with more notes

  • 17: 6f0b2ff = 17: 465ced5 reset --stdin: trim carriage return from the paths

  • 18: 8c8f12e ! 18: 49f7a9f Identify microsoft/git via a distinct version suffix

    @@ Commit message
      ## GIT-VERSION-GEN ##
     @@
      
    - DEF_VER=v2.49.0-rc0
    + DEF_VER=v2.49.0-rc1
      
     +# Identify microsoft/git via a distinct version suffix
     +DEF_VER=$DEF_VER.vfs.0.0
  • 19: b8a595f ! 19: ac159e4 gvfs: ensure that the version is based on a GVFS tag

    @@ GIT-VERSION-GEN: then
     +		VN=$(git -C "$SOURCE_DIR" describe --dirty --match="v[0-9]*vfs*" 2>/dev/null) &&
      		case "$VN" in
      		*$LF*) (exit 1) ;;
    ++		v[0-9]*)
    ++			if test "${VN%%.vfs.*}" != "${DEF_VER%%.vfs.*}"
    ++			then
    ++				echo "Found version $VN, which is not based on $DEF_VER" >&2
    ++				exit 1
    ++			fi ;;
      		esac
    -+		if test "${VN%%.vfs.*}" != "${DEF_VER%%.vfs.*}"
    -+		then
    -+			echo "Found version $VN, which is not based on $DEF_VER" >&2
    -+			exit 1
    -+		fi
      	then
      		VN=$(echo "$VN" | sed -e 's/-/./g');
    - 	else
  • 20: bfd4c30 = 20: 2040bcc gvfs: add a GVFS-specific header file

  • 21: 33ef9e7 = 21: dfbee55 gvfs: add the core.gvfs config setting

  • 22: 1d55ba9 = 22: 5adb66f gvfs: add the feature to skip writing the index' SHA-1

  • 23: 3ef7191 = 23: e18b0d3 gvfs: add the feature that blobs may be missing

  • 24: 07ebfc1 = 24: d519ed6 gvfs: prevent files to be deleted outside the sparse checkout

  • 25: 786d556 = 25: 2a74272 gvfs: optionally skip reachability checks/upload pack during fetch

  • 26: 9044574 = 26: f03be15 gvfs: ensure all filters and EOL conversions are blocked

  • 27: 3cf5d75 = 27: 738d95c gvfs: allow "virtualizing" objects

  • 28: 11e6e50 = 28: 7f10123 Hydrate missing loose objects in check_and_freshen()

  • 29: 85b7cc6 = 29: 4382045 sha1_file: when writing objects, skip the read_object_hook

  • 30: 8649964 = 30: 50dba28 gvfs: add global command pre and post hook procs

  • 31: e1fb608 = 31: f9f18e9 t0400: verify that the hook is called correctly from a subdirectory

  • 32: 25f7cf5 = 32: 9e442e8 Pass PID of git process to hooks.

  • 33: b1d4ea7 = 33: 51be5d3 pre-command: always respect core.hooksPath

  • 34: 735b36e = 34: 1d889b5 sparse-checkout: update files with a modify/delete conflict

  • 35: e8f10fc = 35: 979fb6d sparse-checkout: avoid writing entries with the skip-worktree bit

  • 36: d88679e = 36: e6e5164 Do not remove files outside the sparse-checkout

  • 37: 144d10d = 37: 28bfd9a send-pack: do not check for sha1 file when GVFS_MISSING_OK set

  • 38: 0f29f7c = 38: 09aae94 cache-tree: remove use of strbuf_addf in update_one

  • 39: dd3c97d = 39: a0e50be gvfs: block unsupported commands when running in a GVFS repo

  • 40: 2a24741 = 40: 0c04a3c worktree: allow in Scalar repositories

  • 41: de7459b = 41: b9b284c gvfs: allow overriding core.gvfs

  • 42: 9da480c = 42: a185e9c BRANCHES.md: Add explanation of branches and using forks

  • 43: 651739e ! 43: 608621c Add virtual file system settings and hook proc

    @@ environment.h: extern unsigned long pack_size_limit_cfg;
     
      ## meson.build ##
     @@ meson.build: libgit_sources = [
    -   'utf8.c',
        'varint.c',
    +   'version.c',
        'versioncmp.c',
     +  'virtualfilesystem.c',
        'walker.c',
  • 44: 76162a4 = 44: 1dd663a virtualfilesystem: don't run the virtual file system hook if the index has been redirected

  • 45: eb3bc52 = 45: 1494276 virtualfilesystem: check if directory is included

  • 46: 86decdf = 46: 4ee6587 backwards-compatibility: support the post-indexchanged hook

  • 47: db2f4f9 = 47: 0b63dc2 gvfs: verify that the built-in FSMonitor is disabled

  • 48: 8ed0a4d = 48: e230807 wt-status: add trace2 data for sparse-checkout percentage

  • 49: a2a143c = 49: 8d705dd wt-status: add VFS hydration percentage to normal git status output

  • 50: ae0e051 = 50: 6512ca2 status: add status serialization mechanism

  • 51: dbe4ecb = 51: b36caa8 Teach ahead-behind and serialized status to play nicely together

  • 52: a8cbfc0 = 52: f864181 status: serialize to path

  • 53: 47650b4 = 53: c92a1c5 status: reject deserialize in V2 and conflicts

  • 54: f99b6ba = 54: 8e5f17a serialize-status: serialize global and repo-local exclude file metadata

  • 55: 3976042 = 55: 0f02fda status: deserialization wait

  • 56: 468ade8 = 56: 5551104 merge-recursive: avoid confusing logic in was_dirty()

  • 57: 545f3b7 = 57: 8c48f10 merge-recursive: add some defensive coding to was_dirty()

  • 58: 371cca9 = 58: a8f7461 merge-recursive: teach was_dirty() about the virtualfilesystem

  • 59: 2c4bf11 = 59: d3736ff status: deserialize with -uno does not print correct hint

  • 60: 46faf82 = 60: 48a35ad fsmonitor: check CE_FSMONITOR_VALID in ce_uptodate

  • 61: 5f3048e = 61: 554b165 fsmonitor: add script for debugging and update script for tests

  • 62: 5e16288 = 62: 01066a3 status: disable deserialize when verbose output requested.

  • 63: 9fc6141 = 63: cbbef83 t7524: add test for verbose status deserialzation

  • 64: a467a5c = 64: 5558e05 deserialize-status: silently fallback if we cannot read cache file

  • 65: 60430a2 = 65: 0145ffa gvfs:trace2:data: add trace2 tracing around read_object_process

  • 66: 4e5b659 = 66: 884f391 gvfs:trace2:data: status deserialization information

  • 67: 1337743 = 67: 207c0fb gvfs:trace2:data: status serialization

  • 68: 5968dbc = 68: 01eb74b gvfs:trace2:data: add vfs stats

  • 69: 7addf6d = 69: 7eee8bb trace2: refactor setting process starting time

  • 70: 8d68658 = 70: dac2322 trace2:gvfs:experiment: clear_ce_flags_1

  • 71: 9db7e71 = 71: ca3a608 trace2:gvfs:experiment: report_tracking

  • 72: 52b9c2d = 72: 98ca2eb trace2:gvfs:experiment: read_cache: annotate thread usage in read-cache

  • 73: 43cfe2f = 73: a924674 trace2:gvfs:experiment: read-cache: time read/write of cache-tree extension

  • 74: 6b31f85 = 74: 2a09ed7 trace2:gvfs:experiment: add region to apply_virtualfilesystem()

  • 75: 7e46fbb = 75: 9653893 trace2:gvfs:experiment: add region around unpack_trees()

  • 76: e43eef6 = 76: a0a516a trace2:gvfs:experiment: add region to cache_tree_fully_valid()

  • 77: e8818ff = 77: fc79509 trace2:gvfs:experiment: add unpack_entry() counter to unpack_trees() and report_tracking()

  • 78: a6d8adf = 78: 77eda4a trace2:gvfs:experiment: increase default event depth for unpack-tree data

  • 79: ef54200 = 79: 585e320 trace2:gvfs:experiment: add data for check_updates() in unpack_trees()

  • 80: 7691c42 = 80: fe2e344 Trace2:gvfs:experiment: capture more 'tracking' details

  • 81: c817d5b = 81: d3b8f10 credential: set trace2_child_class for credential manager children

  • 82: 4e874f6 = 82: d52bd90 sub-process: do not borrow cmd pointer from caller

  • 83: 1a2c45d = 83: ef6c5a2 sub-process: add subprocess_start_argv()

  • 84: 9bc4c4b = 84: ce330ed sha1-file: add function to update existing loose object cache

  • 85: 33ea560 = 85: f640f3e packfile: add install_packed_git_and_mru()

  • 86: 359b994 = 86: 1a384b3 index-pack: avoid immediate object fetch while parsing packfile

  • 142: e64212e = 87: b61202e git_config_set_multivar_in_file_gently(): add a lock timeout

  • 143: f2d3394 = 88: 5a78138 scalar: set the config write-lock timeout to 150ms

  • 144: b117668 = 89: 2a77bdc scalar: add docs from microsoft/scalar

  • 145: 8ad629c = 90: 563d53c scalar (Windows): use forward slashes as directory separators

  • 146: 0a8c7b0 = 91: 4868964 scalar: add retry logic to run_git()

  • 147: 4a64d97 = 92: ba3cf44 scalar: support the config command for backwards compatibility

  • 176: b49b34d = 93: 0dc0c57 sequencer: avoid progress when stderr is redirected

  • 87: 43e771c ! 94: 4a9b489 gvfs-helper: create tool to fetch objects using the GVFS Protocol

    @@ meson.build: if get_option('curl').enabled()
        endif
      
     +  test_dependencies += executable('git-gvfs-helper',
    -+    sources: curl_sources + 'gvfs-helper.c',
    -+    dependencies: [libgit, common_main],
    ++    sources: 'gvfs-helper.c',
    ++    dependencies: [libgit_curl],
     +    install: true,
     +    install_dir: get_option('libexecdir') / 'git-core',
     +  )
     +
        foreach alias : [ 'git-remote-https', 'git-remote-ftp', 'git-remote-ftps' ]
          test_dependencies += executable(alias,
    -       objects: git_remote_http.extract_all_objects(recursive: false),
    +       sources: 'remote-curl.c',
     @@ meson.build: endforeach
      
      foreach symlink : [
  • 88: 7d3f1ac = 95: e858a48 sha1-file: create shared-cache directory if it doesn't exist

  • 89: ef71673 = 96: 52ab584 gvfs-helper: better handling of network errors

  • 90: b6aa270 = 97: c5b3304 gvfs-helper-client: properly update loose cache with fetched OID

  • 91: df92c79 = 98: 5d46d4d gvfs-helper: V2 robust retry and throttling

  • 92: 36acf3d = 99: a0d6a46 gvfs-helper: expose gvfs/objects GET and POST semantics

  • 93: 643db1f = 100: 40f65a7 gvfs-helper: dramatically reduce progress noise

  • 94: c595614 = 101: 31005ef gvfs-helper-client.h: define struct object_id

  • 95: 6adb693 = 102: 5ca7b5a gvfs-helper: handle pack-file after single POST request

  • 96: 3ee3fc4 ! 103: d4b31fa test-gvfs-prococol, t5799: tests for gvfs-helper

    @@ t/helper/meson.build: test_tool = executable('test-tool',
      
     +test_gvfs_protocol = executable('test-gvfs-protocol',
     +  sources: 'test-gvfs-protocol.c',
    -+  dependencies: [libgit, common_main],
    ++  dependencies: [libgit_commonmain],
     +)
     +bin_wrappers += test_gvfs_protocol
     +test_dependencies += test_gvfs_protocol
     +
      test_fake_ssh = executable('test-fake-ssh',
        sources: 'test-fake-ssh.c',
    -   dependencies: [libgit, common_main],
    +   dependencies: [libgit_commonmain],
     
      ## t/helper/test-gvfs-protocol.c (new) ##
     @@
  • 97: c672d48 = 104: d3cf18c gvfs-helper: move result-list construction into install functions

  • 98: af382c2 = 105: 9545a5f t5799: add support for POST to return either a loose object or packfile

  • 99: 4c04ad4 = 106: c30c035 t5799: cleanup wc-l and grep-c lines

  • 100: 39f5436 = 107: 1fa1c03 gvfs-helper: verify loose objects after write

  • 101: 017157a = 108: 97a3c3d t7599: create corrupt blob test

  • 102: ecd2def = 109: 7b509e6 gvfs-helper: add prefetch support

  • 103: 4cd1164 = 110: 1afb32e gvfs-helper: add prefetch .keep file for last packfile

  • 104: 85ee633 = 111: be1f852 gvfs-helper: do one read in my_copy_fd_len_tail()

  • 105: 3bc5997 = 112: 249a2cf gvfs-helper: move content-type warning for prefetch packs

  • 106: dabc10d = 113: d160005 fetch: use gvfs-helper prefetch under config

  • 107: cd741af = 114: 1e8cc5d gvfs-helper: better support for concurrent packfile fetches

  • 108: e418e1c = 115: cd7f74b remote-curl: do not call fetch-pack when using gvfs-helper

  • 109: d64ec45 = 116: 5c37ac2 fetch: reprepare packs before checking connectivity

  • 110: 75dbc7a = 117: a1cda82 gvfs-helper: retry when creating temp files

  • 111: 373c4da = 118: 2cbf1fa sparse: avoid warnings about known cURL issues in gvfs-helper.c

  • 112: cdb259c = 119: 43e8c4e gvfs-helper: add --max-retries to prefetch verb

  • 113: a1fe2d7 = 120: 3a16f33 t5799: add tests to detect corrupt pack/idx files in prefetch

  • 114: 4fb49fe = 121: c8d0f61 gvfs-helper: ignore .idx files in prefetch multi-part responses

  • 118: c1c6bd0 = 122: 0b64e50 maintenance: care about gvfs.sharedCache config

  • 115: b5708a3 = 123: 9cbb65c t5799: explicitly test gvfs-helper --fallback and --no-fallback

  • 119: 3ab168b = 124: 7ed0f50 unpack-trees:virtualfilesystem: Improve efficiency of clear_ce_flags

  • 116: fa58d65 = 125: 6817403 gvfs-helper: don't fallback with new config

  • 121: 9287163 = 126: 8617dfd homebrew: add GitHub workflow to release Cask

  • 117: 6b85031 = 127: 3c35efb test-gvfs-protocol: add cache_http_503 to mayhem

  • 122: 37ebca3 ! 128: b55d4c7 Adding winget workflows

    @@ .github/workflows/release-winget.yml (new)
     +        run: |
     +          # Get correct release asset
     +          $github = Get-Content '${{ github.event_path }}' | ConvertFrom-Json
    -+          $asset = $github.release.assets | Where-Object -Property name -match '64-bit.exe$'
    ++          $asset_x64 = $github.release.assets | Where-Object -Property name -match '64-bit.exe$'
    ++          $asset_arm64 = $github.release.assets | Where-Object -Property name -match 'arm64.exe$'
     +
     +          # Remove 'v' and 'vfs' from the version
     +          $github.release.tag_name -match '\d.*'
    @@ .github/workflows/release-winget.yml (new)
     +
     +          # Download wingetcreate and create manifests
     +          Invoke-WebRequest https://aka.ms/wingetcreate/latest -OutFile wingetcreate.exe
    -+          .\wingetcreate.exe update Microsoft.Git -u $asset.browser_download_url -v $version -o manifests
    ++          .\wingetcreate.exe update Microsoft.Git `
    ++              -v $version `
    ++              -o manifests `
    ++              -u "$($asset_x64.browser_download_url)|x64|machine" `
    ++                 "$($asset_x64.browser_download_url)|x64|user" `
    ++                 "$($asset_arm64.browser_download_url)|arm64|machine" `
    ++                 "$($asset_arm64.browser_download_url)|arm64|user"
     +
     +          # Manually substitute the name of the default branch in the License
     +          # and Copyright URLs since the tooling cannot do that for us.
  • 120: 8068ebb = 129: dc18956 t5799: add unit tests for new gvfs.fallback config setting

  • 123: 5e8c67e = 130: 9a40188 Disable the monitor-components workflow in msft-git

  • 124: 8688653 = 131: 73624c7 .github: enable windows builds on microsoft fork

  • 125: c75d92b = 132: a43e149 release: create initial Windows installer build workflow

  • 126: 07b396e = 133: ab4c1b3 help: special-case HOST_CPU universal

  • 127: f0dcb8f = 134: a8abc08 release: add Mac OSX installer build

  • 128: 465c1d1 = 135: 39f091c release: build unsigned Ubuntu .deb package

  • 129: e77a36d = 136: af7a43e release: add signing step for .deb package

  • 130: 33ebe9a = 137: 77af582 release: create draft GitHub release with packages & installers

  • 136: 9749a7a ! 138: af2ad79 update-microsoft-git: create barebones builtin

    @@ Documentation/meson.build: manpages = {
        'git-unpack-file.adoc' : 1,
        'git-unpack-objects.adoc' : 1,
        'git-update-index.adoc' : 1,
    -+  'git-update-microsoft-git.txt' : 1,
    ++  'git-update-microsoft-git.adoc' : 1,
        'git-update-ref.adoc' : 1,
        'git-update-server-info.adoc' : 1,
        'git-upload-archive.adoc' : 1,
    @@ builtin/update-microsoft-git.c (new)
     +	return 1;
     +}
     +
    -+static const char builtin_update_microsoft_git_usage[] =
    -+	N_("git update-microsoft-git");
    ++static const char * const update_microsoft_git_usage[] = {
    ++	N_("git update-microsoft-git"),
    ++	NULL,
    ++};
    ++
     +
     +int cmd_update_microsoft_git(int argc, const char **argv, const char *prefix UNUSED, struct repository *repo UNUSED)
     +{
    -+	if (argc == 2 && !strcmp(argv[1], "-h"))
    -+		usage(builtin_update_microsoft_git_usage);
    ++	static struct option microsoft_git_options[] = {
    ++		OPT_END(),
    ++	};
    ++	show_usage_with_options_if_asked(argc, argv,
    ++					 update_microsoft_git_usage,
    ++					 microsoft_git_options);
     +
     +	return platform_specific_upgrade();
     +}
  • 137: cb73013 ! 139: 8f83f23 update-microsoft-git: Windows implementation

    @@ builtin/update-microsoft-git.c
      }
     +#endif
      
    - static const char builtin_update_microsoft_git_usage[] =
    - 	N_("git update-microsoft-git");
    + static const char * const update_microsoft_git_usage[] = {
    + 	N_("git update-microsoft-git"),
  • 131: db67113 = 140: efb4be0 build-git-installers: publish gpg public key

  • 138: afe6032 = 141: bed78f9 update-microsoft-git: use brew on macOS

  • 132: a619fd5 = 142: a4ca7ec release: continue pestering until user upgrades

  • 139: 5e8b393 = 143: 6a8dbe1 .github: update ISSUE_TEMPLATE.md for microsoft/git

  • 133: b355c33 = 144: fca8d68 dist: archive HEAD instead of HEAD^{tree}

  • 140: 24cdaf1 = 145: 6258ad5 .github: update PULL_REQUEST_TEMPLATE.md

  • 134: e0744c3 = 146: f0c77c7 release: include GIT_BUILT_FROM_COMMIT in MacOS build

  • 141: 6179b75 = 147: 08c3c26 Adjust README.md for microsoft/git

  • 135: 7e6d8e2 = 148: 6254004 release: add installer validation

  • 148: 1c19253 ! 149: 6bbaaee scalar: implement a minimal JSON parser

    @@ meson.build: test_dependencies += executable('git-http-backend',
      bin_wrappers += executable('scalar',
     -  sources: 'scalar.c',
     +  sources: ['scalar.c', 'json-parser.c'],
    -   dependencies: [libgit, common_main],
    +   dependencies: [libgit_commonmain],
        install: true,
        install_dir: get_option('libexecdir') / 'git-core',
  • 149: 0388217 = 150: 1061aba scalar clone: support GVFS-enabled remote repositories

  • 150: 1f20613 = 151: a4b84e2 test-gvfs-protocol: also serve smart protocol

  • 151: 7110c95 = 152: 67b0a58 gvfs-helper: add the endpoint command

  • 152: 8b9b557 = 153: 51e650f dir_inside_of(): handle directory separators correctly

  • 153: ddc0f56 = 154: 5b110ca scalar: disable authentication in unattended mode

  • 154: 686f7b0 = 155: 3f60493 scalar: do initialize gvfs.sharedCache

  • 155: 8e41d86 = 156: cf9c2da scalar diagnose: include shared cache info

  • 156: 1917e70 = 157: dcdc0d2 scalar: only try GVFS protocol on https:// URLs

  • 157: 0e76a11 = 158: 0ee7566 scalar: verify that we can use a GVFS-enabled repository

  • 158: f7b2abb = 159: 769ad21 scalar: add the cache-server command

  • 159: d84ca9b = 160: 9bb1160 scalar: add a test toggle to skip accessing the vsts/info endpoint

  • 160: 58f9f2e = 161: 11dfb02 scalar: adjust documentation to the microsoft/git fork

  • 161: 5224e24 = 162: d7e2c88 scalar: enable untracked cache unconditionally

  • 162: 04a0bfa = 163: 88c1ed9 scalar: parse clone --no-fetch-commits-and-trees for backwards compatibility

  • 163: 914f1f9 = 164: ba1e28e scalar: make GVFS Protocol a forced choice

  • 164: 4cbdb67 = 165: df42075 scalar diagnose: accommodate Scalar's Functional Tests

  • 165: 7ab5902 = 166: 8d6ebf5 ci: run Scalar's Functional Tests

  • 166: 3c48ffb = 167: e2ebd8e scalar: upgrade to newest FSMonitor config setting

  • 167: 11bd941 = 168: 00cd68e abspath: make strip_last_path_component() global

  • 168: 0ed3dcc = 169: aba5eaa scalar: configure maintenance during 'reconfigure'

  • 169: d3ed86f = 170: 9aaf4c7 scalar: .scalarCache should live above enlistment

  • 170: 4e1b1f6 = 171: c5d5788 add/rm: allow adding sparse entries when virtual

  • 171: 2da0919 = 172: 170002f sparse-checkout: add config to disable deleting dirs

  • 172: ea7cae2 = 173: 96dc1b3 diff: ignore sparse paths in diffstat

  • 173: 0a22b84 = 174: 4df7f3e repo-settings: enable sparse index by default

  • 174: 214578f = 175: dc88a8b diff(sparse-index): verify with partially-sparse

  • 175: e8c0e72 = 176: f73a39b stash: expand testing for git stash -u

  • 177: c64b811 = 177: e446622 sparse: add vfs-specific precautions

  • 178: 4f89d60 = 178: fce3a07 reset: fix mixed reset when using virtual filesystem

  • 179: 324ad83 = 179: 943d0f7 sparse-index: add ensure_full_index_with_reason()

  • 180: a8449e1 = 180: d0879f2 treewide: add reasons for expanding index

  • 181: 04ea9d0 = 181: 3c30a5b treewide: custom reasons for expanding index

  • 182: 021e269 = 182: 6316426 sparse-index: add macro for unaudited expansions

  • 183: 220f41f = 183: 200b5b5 Docs: update sparse index plan with logging

  • 184: c87d5c0 = 184: 0bc27e8 sparse-index: log failure to clear skip-worktree

  • 185: 1255e3f = 185: 5c9dcb5 stash: use -f in checkout-index child process

  • 186: c8fadbc = 186: f3cc270 sparse-index: do not copy hashtables during expansion

  • 187: ff6c4d7 = 187: 2e5727d path-walk: add new 'edge_aggressive' option

  • 188: b18d1a0 = 188: 9f1d039 pack-objects: allow --shallow and --path-walk

  • 189: 7d95375 = 189: f744968 t5538: add test to confirm deltas in shallow pushes

  • 190: 8dddd73 = 190: f4a6002 sub-process: avoid leaking cmd

  • 191: 927c26c = 191: 1cae9ff remote-curl: release filter options before re-setting them

  • 192: 394a129 = 192: c29d14e transport: release object filter options

  • 193: b7f2e33 = 193: 45dcbfb mingw: special-case administrators even more

  • 194: 3fc340b = 194: 83a6044 test-tool path-utils: support debugging "dubious ownership" issues

  • 195: 65ba23c = 195: 643bfe6 push: don't reuse deltas with path walk

  • 196: 04efb4a < -: ------------ release-winget.yml: update command to include ARM installers

  • 197: a8f8c2d = 196: 18f141e t7900-maintenance.sh: reset config between tests

  • 198: df89b84 = 197: 3875352 maintenance: add cache-local-objects maintenance task

  • 199: bbbe8fa = 198: 992fe95 scalar.c: add cache-local-objects task

  • 200: e15a6c6 < -: ------------ fixup! gvfs: ensure that the version is based on a GVFS tag

  • 201: 37c2569 < -: ------------ fixup! update-microsoft-git: create barebones builtin

  • 202: 1a5f5ea < -: ------------ fixup! survey: add vector of largest objects for various scaling dimensions

  • 203: 21085be < -: ------------ fixup! update-microsoft-git: create barebones builtin

@mjcheetham mjcheetham force-pushed the tentative/vfs-2.49.0 branch from 26900ec to 21b8aa6 Compare March 12, 2025 13:04
@mjcheetham
Copy link
Member

mjcheetham commented Mar 12, 2025

Range-diff relative to v2.49.0-rc1
  • 5: d965162 = 1: ae88cab t: remove advice from some tests

  • 2: daa51d3 = 2: 029406a sparse-index.c: fix use of index hashes in expand_index

  • 6: 0cc2714 = 3: 6ac339b t1092: add test for untracked files and directories

  • 3: 786873b = 4: 55c5e2c t5300: confirm failure of git index-pack when non-idx suffix requested

  • 7: 3aed9f9 = 5: 89d4b16 index-pack: disable rev-index if index file has non .idx suffix

  • 8: ceecd79 = 6: d11b231 trace2: prefetch value of GIT_TRACE2_DST_DEBUG at startup

  • 1: 36edacf = 7: 251405d survey: calculate more stats on refs

  • 4: 5b86471 = 8: a506ee6 survey: show some commits/trees/blobs histograms

  • 9: 0e3f13e = 9: 58a8bcc survey: add vector of largest objects for various scaling dimensions

  • 10: 034d566 = 10: fe8c993 survey: add pathname of blob or tree to large_item_vec

  • 11: 1d3a7d8 = 11: d421cca survey: add commit-oid to large_item detail

  • 12: d4b7e3c = 12: 989b551 survey: add commit name-rev lookup to each large_item

  • 13: 3a219f1 = 13: 62b4b11 survey: add --no-name-rev option

  • 14: 45d6f7d = 14: c4bb47e survey: started TODO list at bottom of source file

  • 15: 01df184 = 15: 41d9a96 survey: expanded TODO list at the bottom of the source file

  • 16: 67cb265 = 16: d679c30 survey: expanded TODO with more notes

  • 17: 465ced5 = 17: 480e80f reset --stdin: trim carriage return from the paths

  • 18: 49f7a9f ! 18: 6275e08 Identify microsoft/git via a distinct version suffix

    @@ Commit message
      ## GIT-VERSION-GEN ##
     @@
      
    - DEF_VER=v2.49.0-rc1
    + DEF_VER=v2.49.0-rc2
      
     +# Identify microsoft/git via a distinct version suffix
     +DEF_VER=$DEF_VER.vfs.0.0
  • 19: ac159e4 = 19: 8b1bbe2 gvfs: ensure that the version is based on a GVFS tag

  • 20: 2040bcc = 20: 765cba8 gvfs: add a GVFS-specific header file

  • 21: dfbee55 = 21: 26f9d64 gvfs: add the core.gvfs config setting

  • 22: 5adb66f ! 22: b24bea2 gvfs: add the feature to skip writing the index' SHA-1

    @@ gvfs.h
     
      ## repo-settings.c ##
     @@
    - #include "repository.h"
      #include "midx.h"
      #include "pack-objects.h"
    + #include "setup.h"
     +#include "gvfs.h"
      
      static void repo_cfg_bool(struct repository *r, const char *key, int *dest,
  • 23: e18b0d3 = 23: 7e30568 gvfs: add the feature that blobs may be missing

  • 24: d519ed6 = 24: 6434171 gvfs: prevent files to be deleted outside the sparse checkout

  • 25: 2a74272 = 25: 8d0ab18 gvfs: optionally skip reachability checks/upload pack during fetch

  • 26: f03be15 = 26: 72e3df8 gvfs: ensure all filters and EOL conversions are blocked

  • 27: 738d95c ! 27: 03cb349 gvfs: allow "virtualizing" objects

    @@ config.c: int git_default_core_config(const char *var, const char *value,
     +		return 0;
     +	}
     +
    - 	/* Add other config variables here and to Documentation/config.txt. */
    + 	/* Add other config variables here and to Documentation/config.adoc. */
      	return platform_core_config(var, value, ctx, cb);
      }
     
  • 28: 7f10123 = 28: 9d6b5f5 Hydrate missing loose objects in check_and_freshen()

  • 29: 4382045 = 29: 10bd18f sha1_file: when writing objects, skip the read_object_hook

  • 30: 50dba28 ! 30: 57624d9 gvfs: add global command pre and post hook procs

    @@ hook.c
      const char *find_hook(struct repository *r, const char *name)
      {
      	static struct strbuf path = STRBUF_INIT;
    -@@ hook.c: const char *find_hook(struct repository *r, const char *name)
    + 
      	int found_hook;
      
    - 	strbuf_reset(&path);
    --	strbuf_repo_git_path(&path, r, "hooks/%s", name);
    +-	repo_git_path_replace(r, &path, "hooks/%s", name);
    ++	strbuf_reset(&path);
     +	if (have_git_dir())
    -+		strbuf_repo_git_path(&path, r, "hooks/%s", name);
    ++		repo_git_path_replace(r, &path, "hooks/%s", name);
     +	else if (!hook_path_early(name, &path))
     +		return NULL;
     +
  • 31: f9f18e9 = 31: f98cadd t0400: verify that the hook is called correctly from a subdirectory

  • 87: b61202e = 32: ce1e307 git_config_set_multivar_in_file_gently(): add a lock timeout

  • 88: 5a78138 = 33: 0b3413c scalar: set the config write-lock timeout to 150ms

  • 89: 2a77bdc = 34: 5211698 scalar: add docs from microsoft/scalar

  • 90: 563d53c = 35: b66dca2 scalar (Windows): use forward slashes as directory separators

  • 91: 4868964 = 36: 75b421a scalar: add retry logic to run_git()

  • 92: ba3cf44 = 37: d5be57d scalar: support the config command for backwards compatibility

  • 93: 0dc0c57 = 38: 36b5c88 sequencer: avoid progress when stderr is redirected

  • 33: 51be5d3 ! 39: 210ebd8 pre-command: always respect core.hooksPath

    @@
      ## Metadata ##
    -Author: Johannes Schindelin <johasc@microsoft.com>
    +Author: Matthew John Cheetham <mjcheetham@outlook.com>
     
      ## Commit message ##
    -    pre-command: always respect core.hooksPath
    +    t0400: verify core.hooksPath is respected by pre-command
     
    -    We need to respect that config setting even if we already know that we
    -    have a repository, but have not yet read the config.
    +    Verify that the core.hooksPath configuration is repsected by the
    +    pre-command hook. Original regression test was written by
    +    Alejandro Pauly.
     
    -    The regression test was written by Alejandro Pauly.
    -
    -    2021-10-30: Recent movement of find_hook() into hook.c required moving this
    -    change from run-command.c.
    -
    -    Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
    -
    - ## hook.c ##
    -@@ hook.c: const char *find_hook(struct repository *r, const char *name)
    - 	int found_hook;
    - 
    - 	strbuf_reset(&path);
    --	if (have_git_dir())
    -+	if (have_git_dir()) {
    -+		static int forced_config;
    -+
    -+		if (!forced_config) {
    -+			if (!git_hooks_path)
    -+				git_config_get_pathname("core.hookspath",
    -+							&git_hooks_path);
    -+			forced_config = 1;
    -+		}
    -+
    - 		strbuf_repo_git_path(&path, r, "hooks/%s", name);
    --	else if (!hook_path_early(name, &path))
    -+	} else if (!hook_path_early(name, &path))
    - 		return NULL;
    - 
    - 	found_hook = access(path.buf, X_OK) >= 0;
    +    Signed-off-by: Matthew John Cheetham <mjcheetham@outlook.com>
     
      ## t/t0400-pre-command-hook.sh ##
     @@ t/t0400-pre-command-hook.sh: test_expect_success 'in a subdirectory, using an alias' '
    @@ t/t0400-pre-command-hook.sh: test_expect_success 'in a subdirectory, using an al
     +	echo "alternate" >\$(git rev-parse --git-dir)/pre-command.out
     +	EOF
     +	write_script .git/hooks/pre-command <<-EOF &&
    -+	echo "original"	>\$(git rev-parse --git-dir)/pre-command.out
    ++	echo "original" >\$(git rev-parse --git-dir)/pre-command.out
     +	EOF
     +	git -c core.hooksPath=.git/alternateHooks status &&
     +	test "alternate" = "$(cat .git/pre-command.out)"
  • 32: 9e442e8 = 40: a97af02 Pass PID of git process to hooks.

  • 34: 1d889b5 = 41: 500bf26 sparse-checkout: update files with a modify/delete conflict

  • 35: 979fb6d = 42: 283f56a sparse-checkout: avoid writing entries with the skip-worktree bit

  • 36: e6e5164 = 43: f645ffd Do not remove files outside the sparse-checkout

  • 37: 28bfd9a = 44: 48bbe41 send-pack: do not check for sha1 file when GVFS_MISSING_OK set

  • 38: 09aae94 = 45: 5db220e cache-tree: remove use of strbuf_addf in update_one

  • 39: a0e50be = 46: b2b66bb gvfs: block unsupported commands when running in a GVFS repo

  • 40: 0c04a3c = 47: 1da56a6 worktree: allow in Scalar repositories

  • 41: b9b284c = 48: b3b60e5 gvfs: allow overriding core.gvfs

  • 42: a185e9c = 49: eb6bdc1 BRANCHES.md: Add explanation of branches and using forks

  • 43: 608621c = 50: 73028bf Add virtual file system settings and hook proc

  • 44: 1dd663a = 51: 0d89e3f virtualfilesystem: don't run the virtual file system hook if the index has been redirected

  • 45: 1494276 = 52: 39fed32 virtualfilesystem: check if directory is included

  • 46: 4ee6587 = 53: b8d6d1c backwards-compatibility: support the post-indexchanged hook

  • 47: 0b63dc2 = 54: bf14926 gvfs: verify that the built-in FSMonitor is disabled

  • 48: e230807 = 55: 5069c60 wt-status: add trace2 data for sparse-checkout percentage

  • 49: 8d705dd = 56: dae5437 wt-status: add VFS hydration percentage to normal git status output

  • 50: 6512ca2 = 57: fc68696 status: add status serialization mechanism

  • 51: b36caa8 = 58: e7f136c Teach ahead-behind and serialized status to play nicely together

  • 52: f864181 = 59: cdafde5 status: serialize to path

  • 53: c92a1c5 = 60: a276650 status: reject deserialize in V2 and conflicts

  • 54: 8e5f17a ! 61: f25844e serialize-status: serialize global and repo-local exclude file metadata

    @@ wt-status-deserialize.c: static int my_validate_index(const char *path, const st
     +
     +static int my_parse_repo_excludes(const char *line)
     +{
    -+	char *path = git_pathdup("info/exclude");
    ++	char *path = repo_git_path(the_repository, "info/exclude");
     +	int r = my_validate_excludes(path, "repo_excludes", line);
     +	free(path);
     +
    @@ wt-status-serialize.c
     +	 * We replicate the pathname construction here because of the static
     +	 * variables/functions used in dir.c.
     +	 */
    -+	char *path = git_pathdup("info/exclude");
    ++	char *path = repo_git_path(the_repository, "info/exclude");
     +
     +	append_exclude_info(fd, path, "repo_excludes");
     +
  • 55: 0f02fda = 62: b1d61f8 status: deserialization wait

  • 56: 5551104 = 63: 0d0f164 merge-recursive: avoid confusing logic in was_dirty()

  • 57: 8c48f10 = 64: 60f2d11 merge-recursive: add some defensive coding to was_dirty()

  • 58: a8f7461 = 65: b4d8582 merge-recursive: teach was_dirty() about the virtualfilesystem

  • 59: d3736ff = 66: e885ad2 status: deserialize with -uno does not print correct hint

  • 60: 48a35ad = 67: f412b78 fsmonitor: check CE_FSMONITOR_VALID in ce_uptodate

  • 61: 554b165 = 68: 27b2b09 fsmonitor: add script for debugging and update script for tests

  • 62: 01066a3 = 69: 4abd3e9 status: disable deserialize when verbose output requested.

  • 63: cbbef83 = 70: 866050e t7524: add test for verbose status deserialzation

  • 64: 5558e05 = 71: 956db0e deserialize-status: silently fallback if we cannot read cache file

  • 65: 0145ffa = 72: 4f851f8 gvfs:trace2:data: add trace2 tracing around read_object_process

  • 66: 884f391 = 73: e0a0397 gvfs:trace2:data: status deserialization information

  • 67: 207c0fb = 74: 94e768f gvfs:trace2:data: status serialization

  • 68: 01eb74b = 75: bb76620 gvfs:trace2:data: add vfs stats

  • 69: 7eee8bb = 76: 45fb166 trace2: refactor setting process starting time

  • 70: dac2322 = 77: 86ee7ba trace2:gvfs:experiment: clear_ce_flags_1

  • 71: ca3a608 = 78: 5ddc8b2 trace2:gvfs:experiment: report_tracking

  • 72: 98ca2eb = 79: 7d5e2f8 trace2:gvfs:experiment: read_cache: annotate thread usage in read-cache

  • 73: a924674 = 80: cca3ebe trace2:gvfs:experiment: read-cache: time read/write of cache-tree extension

  • 74: 2a09ed7 = 81: 55c7e16 trace2:gvfs:experiment: add region to apply_virtualfilesystem()

  • 75: 9653893 = 82: c2cc3a4 trace2:gvfs:experiment: add region around unpack_trees()

  • 76: a0a516a = 83: a6a1d6f trace2:gvfs:experiment: add region to cache_tree_fully_valid()

  • 77: fc79509 = 84: 60d0cc8 trace2:gvfs:experiment: add unpack_entry() counter to unpack_trees() and report_tracking()

  • 78: 77eda4a = 85: 644f335 trace2:gvfs:experiment: increase default event depth for unpack-tree data

  • 79: 585e320 = 86: bacf0b9 trace2:gvfs:experiment: add data for check_updates() in unpack_trees()

  • 80: fe2e344 = 87: fa3ef00 Trace2:gvfs:experiment: capture more 'tracking' details

  • 81: d3b8f10 = 88: 91badf4 credential: set trace2_child_class for credential manager children

  • 82: d52bd90 = 89: 7a324a9 sub-process: do not borrow cmd pointer from caller

  • 83: ef6c5a2 = 90: d3fefdc sub-process: add subprocess_start_argv()

  • 84: ce330ed = 91: 3a0a1c8 sha1-file: add function to update existing loose object cache

  • 85: f640f3e = 92: 72a3b76 packfile: add install_packed_git_and_mru()

  • 86: 1a384b3 = 93: 191a11a index-pack: avoid immediate object fetch while parsing packfile

  • 94: 4a9b489 ! 94: e44a16d gvfs-helper: create tool to fetch objects using the GVFS Protocol

    @@ config.c: int git_default_config(const char *var, const char *value,
     +	if (starts_with(var, "gvfs."))
     +		return git_default_gvfs_config(var, value);
     +
    - 	/* Add other config variables here and to Documentation/config.txt. */
    + 	/* Add other config variables here and to Documentation/config.adoc. */
      	return 0;
      }
     
    @@ promisor-remote.c: struct promisor_remote *repo_promisor_remote_find(struct repo
     +	return core_use_gvfs_helper || !!repo_promisor_remote_find(r, NULL);
      }
      
    - static int remove_fetched_oids(struct repository *repo,
    + int repo_has_accepted_promisor_remote(struct repository *r)
     @@ promisor-remote.c: void promisor_remote_get_direct(struct repository *repo,
      
      	if (oid_nr == 0)
  • 95: e858a48 = 95: e2d6b8e sha1-file: create shared-cache directory if it doesn't exist

  • 96: 52ab584 = 96: da61050 gvfs-helper: better handling of network errors

  • 97: c5b3304 = 97: 4287bf3 gvfs-helper-client: properly update loose cache with fetched OID

  • 98: 5d46d4d = 98: f46f751 gvfs-helper: V2 robust retry and throttling

  • 99: a0d6a46 = 99: e5d9ff7 gvfs-helper: expose gvfs/objects GET and POST semantics

  • 100: 40f65a7 = 100: 5967669 gvfs-helper: dramatically reduce progress noise

  • 101: 31005ef = 101: 8b5f34c gvfs-helper-client.h: define struct object_id

  • 102: 5ca7b5a = 102: 273d578 gvfs-helper: handle pack-file after single POST request

  • 103: d4b31fa = 103: f055647 test-gvfs-prococol, t5799: tests for gvfs-helper

  • 104: d3cf18c = 104: a457d94 gvfs-helper: move result-list construction into install functions

  • 105: 9545a5f = 105: 5b21946 t5799: add support for POST to return either a loose object or packfile

  • 106: c30c035 = 106: 5caa794 t5799: cleanup wc-l and grep-c lines

  • 107: 1fa1c03 = 107: 5d4a532 gvfs-helper: verify loose objects after write

  • 108: 97a3c3d = 108: 0c52f94 t7599: create corrupt blob test

  • 109: 7b509e6 = 109: c9d61e7 gvfs-helper: add prefetch support

  • 110: 1afb32e = 110: e0ac1b6 gvfs-helper: add prefetch .keep file for last packfile

  • 111: be1f852 = 111: 22e39ba gvfs-helper: do one read in my_copy_fd_len_tail()

  • 112: 249a2cf = 112: 1c2e94c gvfs-helper: move content-type warning for prefetch packs

  • 113: d160005 = 113: f049b00 fetch: use gvfs-helper prefetch under config

  • 114: 1e8cc5d = 114: 4fe8a97 gvfs-helper: better support for concurrent packfile fetches

  • 115: cd7f74b = 115: e3a5a01 remote-curl: do not call fetch-pack when using gvfs-helper

  • 116: 5c37ac2 = 116: c1ba600 fetch: reprepare packs before checking connectivity

  • 117: a1cda82 = 117: e3f1e01 gvfs-helper: retry when creating temp files

  • 118: 2cbf1fa = 118: b356d50 sparse: avoid warnings about known cURL issues in gvfs-helper.c

  • 119: 43e8c4e = 119: 494e252 gvfs-helper: add --max-retries to prefetch verb

  • 120: 3a16f33 = 120: 4455900 t5799: add tests to detect corrupt pack/idx files in prefetch

  • 121: c8d0f61 = 121: cb20094 gvfs-helper: ignore .idx files in prefetch multi-part responses

  • 123: 9cbb65c = 122: cdad4c6 t5799: explicitly test gvfs-helper --fallback and --no-fallback

  • 125: 6817403 = 123: be1ce0a gvfs-helper: don't fallback with new config

  • 122: 0b64e50 = 124: 5b25536 maintenance: care about gvfs.sharedCache config

  • 124: 7ed0f50 = 125: 350a426 unpack-trees:virtualfilesystem: Improve efficiency of clear_ce_flags

  • 127: 3c35efb = 126: 99a4369 test-gvfs-protocol: add cache_http_503 to mayhem

  • 126: 8617dfd = 127: c4889c2 homebrew: add GitHub workflow to release Cask

  • 129: dc18956 = 128: 029ac9a t5799: add unit tests for new gvfs.fallback config setting

  • 128: b55d4c7 = 129: 8f2285f Adding winget workflows

  • 130: 9a40188 = 130: 1f800dd Disable the monitor-components workflow in msft-git

  • 131: 73624c7 = 131: ed43286 .github: enable windows builds on microsoft fork

  • 132: a43e149 = 132: 6c8f9b7 release: create initial Windows installer build workflow

  • 133: ab4c1b3 = 133: 47b5b0c help: special-case HOST_CPU universal

  • 134: a8abc08 = 134: a6c1fae release: add Mac OSX installer build

  • 135: 39f091c = 135: 7b80cc8 release: build unsigned Ubuntu .deb package

  • 136: af7a43e = 136: 1920139 release: add signing step for .deb package

  • 137: 77af582 = 137: 41003d0 release: create draft GitHub release with packages & installers

  • 140: efb4be0 = 138: ad0915a build-git-installers: publish gpg public key

  • 142: a4ca7ec = 139: c959ed5 release: continue pestering until user upgrades

  • 144: fca8d68 = 140: 6245115 dist: archive HEAD instead of HEAD^{tree}

  • 146: f0c77c7 = 141: c850106 release: include GIT_BUILT_FROM_COMMIT in MacOS build

  • 138: af2ad79 = 142: 839a6c9 update-microsoft-git: create barebones builtin

  • 139: 8f83f23 = 143: 553c0e4 update-microsoft-git: Windows implementation

  • 141: bed78f9 = 144: 70cc4ce update-microsoft-git: use brew on macOS

  • 143: 6a8dbe1 = 145: 8a8e378 .github: update ISSUE_TEMPLATE.md for microsoft/git

  • 148: 6254004 = 146: 04d6e84 release: add installer validation

  • 145: 6258ad5 = 147: 210d66f .github: update PULL_REQUEST_TEMPLATE.md

  • 147: 08c3c26 ! 148: ba44f01 Adjust README.md for microsoft/git

    @@ README.md
     -The Git for Windows project is run using a [governance
     -model](http://git-for-windows.github.io/governance-model.html). If you
     -encounter problems, you can report them as [GitHub
    --issues](https://github.com/git-for-windows/git/issues), discuss them on Git
    --for Windows' [Google Group](http://groups.google.com/group/git-for-windows),
    --and [contribute bug
    +-issues](https://github.com/git-for-windows/git/issues), discuss them in Git
    +-for Windows' [Discussions](https://github.com/git-for-windows/git/discussions)
    +-or on the [Git mailing list](mailto:git@vger.kernel.org), and [contribute bug
     -fixes](https://github.com/git-for-windows/git/wiki/How-to-participate).
     -
     -To build Git for Windows, please either install [Git for Windows'
    @@ README.md
     +In addition to the Git command-line interface (CLI), `microsoft/git` includes the Scalar CLI to
     +further enable working with extremely large repositories. Scalar is a tool to apply the latest
     +recommendations and use the most advanced Git features. You can read
    -+[the Scalar CLI documentation](Documentation/scalar.txt) or read our
    ++[the Scalar CLI documentation](Documentation/scalar.adoc) or read our
     +[Scalar user guide](contrib/scalar/docs/index.md) including
     +[the philosophy of Scalar](contrib/scalar/docs/philosophy.md).
     +
    @@ README.md
     -Many Git online resources are accessible from <https://git-scm.com/>
     -including full documentation and Git related tools.
     -
    --See [Documentation/gittutorial.txt][] to get started, then see
    --[Documentation/giteveryday.txt][] for a useful minimum set of commands, and
    --`Documentation/git-<commandname>.txt` for documentation of each command.
    +-See [Documentation/gittutorial.adoc][] to get started, then see
    +-[Documentation/giteveryday.adoc][] for a useful minimum set of commands, and
    +-`Documentation/git-<commandname>.adoc` for documentation of each command.
     -If git has been correctly installed, then the tutorial can also be
     -read with `man gittutorial` or `git help tutorial`, and the
     -documentation of each command with `man git-<commandname>` or `git help
     -<commandname>`.
     -
    --CVS users may also want to read [Documentation/gitcvs-migration.txt][]
    +-CVS users may also want to read [Documentation/gitcvs-migration.adoc][]
     -(`man gitcvs-migration` or `git help cvs-migration` if git is
     -installed).
     -
    @@ README.md
     - - "goddamn idiotic truckload of sh*t": when it breaks
     -
     -[INSTALL]: INSTALL
    --[Documentation/gittutorial.txt]: Documentation/gittutorial.txt
    --[Documentation/giteveryday.txt]: Documentation/giteveryday.txt
    --[Documentation/gitcvs-migration.txt]: Documentation/gitcvs-migration.txt
    +-[Documentation/gittutorial.adoc]: Documentation/gittutorial.adoc
    +-[Documentation/giteveryday.adoc]: Documentation/giteveryday.adoc
    +-[Documentation/gitcvs-migration.adoc]: Documentation/gitcvs-migration.adoc
     -[Documentation/SubmittingPatches]: Documentation/SubmittingPatches
     -[Documentation/CodingGuidelines]: Documentation/CodingGuidelines
     -[po/README.md]: po/README.md
  • 149: 6bbaaee = 149: 79fc4b6 scalar: implement a minimal JSON parser

  • 150: 1061aba = 150: 2ae7adf scalar clone: support GVFS-enabled remote repositories

  • 151: a4b84e2 = 151: ff74173 test-gvfs-protocol: also serve smart protocol

  • 152: 67b0a58 = 152: 758413c gvfs-helper: add the endpoint command

  • 153: 51e650f = 153: 5d3ad94 dir_inside_of(): handle directory separators correctly

  • 154: 5b110ca = 154: 317407d scalar: disable authentication in unattended mode

  • 155: 3f60493 ! 155: e590557 scalar: do initialize gvfs.sharedCache

    @@ scalar.c: void load_builtin_commands(const char *prefix UNUSED,
     +		goto cleanup;
     +	}
     +
    -+	write_file(git_path("objects/info/alternates"),"%s\n", shared_cache_path);
    ++	write_file(repo_git_path(the_repository, "objects/info/alternates"),
    ++		   "%s\n", shared_cache_path);
     +
     +	cleanup:
     +	strbuf_release(&buf);
  • 156: cf9c2da = 156: 7133a22 scalar diagnose: include shared cache info

  • 157: dcdc0d2 = 157: 9b90f1b scalar: only try GVFS protocol on https:// URLs

  • 158: 0ee7566 = 158: f1b7234 scalar: verify that we can use a GVFS-enabled repository

  • 159: 769ad21 = 159: c10bd8e scalar: add the cache-server command

  • 160: 9bb1160 = 160: 7303c71 scalar: add a test toggle to skip accessing the vsts/info endpoint

  • 161: 11dfb02 = 161: 4fdedbc scalar: adjust documentation to the microsoft/git fork

  • 162: d7e2c88 = 162: 990b0d6 scalar: enable untracked cache unconditionally

  • 163: 88c1ed9 = 163: 5804077 scalar: parse clone --no-fetch-commits-and-trees for backwards compatibility

  • 164: ba1e28e = 164: bbbfe01 scalar: make GVFS Protocol a forced choice

  • 165: df42075 = 165: 3186ebb scalar diagnose: accommodate Scalar's Functional Tests

  • 166: 8d6ebf5 = 166: f12d53b ci: run Scalar's Functional Tests

  • 167: e2ebd8e = 167: d5aee79 scalar: upgrade to newest FSMonitor config setting

  • 168: 00cd68e = 168: 6ded7aa abspath: make strip_last_path_component() global

  • 169: aba5eaa = 169: df11c72 scalar: configure maintenance during 'reconfigure'

  • 170: 9aaf4c7 = 170: c697e61 scalar: .scalarCache should live above enlistment

  • 171: c5d5788 = 171: ac6644e add/rm: allow adding sparse entries when virtual

  • 172: 170002f = 172: 1009152 sparse-checkout: add config to disable deleting dirs

  • 173: 96dc1b3 = 173: a2cec64 diff: ignore sparse paths in diffstat

  • 174: 4df7f3e = 174: 290df32 repo-settings: enable sparse index by default

  • 175: dc88a8b = 175: 34e5153 diff(sparse-index): verify with partially-sparse

  • 176: f73a39b = 176: 4db583e stash: expand testing for git stash -u

  • 177: e446622 = 177: aae1df5 sparse: add vfs-specific precautions

  • 178: fce3a07 = 178: 2ea3542 reset: fix mixed reset when using virtual filesystem

  • 179: 943d0f7 = 179: a61fea6 sparse-index: add ensure_full_index_with_reason()

  • 180: d0879f2 = 180: 21e693d treewide: add reasons for expanding index

  • 181: 3c30a5b = 181: 206c1f2 treewide: custom reasons for expanding index

  • 182: 6316426 = 182: acebdc8 sparse-index: add macro for unaudited expansions

  • 183: 200b5b5 = 183: 1d7f316 Docs: update sparse index plan with logging

  • 184: 0bc27e8 = 184: 36a2298 sparse-index: log failure to clear skip-worktree

  • 185: 5c9dcb5 = 185: 8b5f098 stash: use -f in checkout-index child process

  • 186: f3cc270 = 186: 3002e36 sparse-index: do not copy hashtables during expansion

  • 187: 2e5727d = 187: a150f4e path-walk: add new 'edge_aggressive' option

  • 188: 9f1d039 = 188: 03c78b8 pack-objects: allow --shallow and --path-walk

  • 189: f744968 = 189: 5a56826 t5538: add test to confirm deltas in shallow pushes

  • 190: f4a6002 = 190: c75d9be sub-process: avoid leaking cmd

  • 191: 1cae9ff = 191: c47c7f4 remote-curl: release filter options before re-setting them

  • 192: c29d14e = 192: a76cc89 transport: release object filter options

  • 193: 45dcbfb = 193: fdc61fa mingw: special-case administrators even more

  • 194: 83a6044 = 194: 330f1ad test-tool path-utils: support debugging "dubious ownership" issues

  • 195: 643bfe6 = 195: b3395cd push: don't reuse deltas with path walk

  • 196: 18f141e = 196: 3ebdad8 t7900-maintenance.sh: reset config between tests

  • 197: 3875352 = 197: d6e9bb8 maintenance: add cache-local-objects maintenance task

  • 198: 992fe95 = 198: e568e06 scalar.c: add cache-local-objects task

@mjcheetham
Copy link
Member

mjcheetham commented Mar 12, 2025

  • 30: 50dba28 ! 30: 57624d9 gvfs: add global command pre and post hook procs

    @@ hook.c
      const char *find_hook(struct repository *r, const char *name)
      {
      	static struct strbuf path = STRBUF_INIT;
    -@@ hook.c: const char *find_hook(struct repository *r, const char *name)
    + 
      	int found_hook;
      
    - 	strbuf_reset(&path);
    --	strbuf_repo_git_path(&path, r, "hooks/%s", name);
    +-	repo_git_path_replace(r, &path, "hooks/%s", name);
    ++	strbuf_reset(&path);
     +	if (have_git_dir())
    -+		strbuf_repo_git_path(&path, r, "hooks/%s", name);
    ++		repo_git_path_replace(r, &path, "hooks/%s", name);
     +	else if (!hook_path_early(name, &path))
     +		return NULL;
     +

strbuf_repo_git_path is now repo_git_path_replace.


  • 33: 51be5d3 ! 39: 210ebd8 pre-command: always respect core.hooksPath

    @@
      ## Metadata ##
    -Author: Johannes Schindelin <johasc@microsoft.com>
    +Author: Matthew John Cheetham <mjcheetham@outlook.com>
     
      ## Commit message ##
    -    pre-command: always respect core.hooksPath
    +    t0400: verify core.hooksPath is respected by pre-command
     
    -    We need to respect that config setting even if we already know that we
    -    have a repository, but have not yet read the config.
    +    Verify that the core.hooksPath configuration is repsected by the
    +    pre-command hook. Original regression test was written by
    +    Alejandro Pauly.
     
    -    The regression test was written by Alejandro Pauly.
    -
    -    2021-10-30: Recent movement of find_hook() into hook.c required moving this
    -    change from run-command.c.
    -
    -    Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
    -
    - ## hook.c ##
    -@@ hook.c: const char *find_hook(struct repository *r, const char *name)
    - 	int found_hook;
    - 
    - 	strbuf_reset(&path);
    --	if (have_git_dir())
    -+	if (have_git_dir()) {
    -+		static int forced_config;
    -+
    -+		if (!forced_config) {
    -+			if (!git_hooks_path)
    -+				git_config_get_pathname("core.hookspath",
    -+							&git_hooks_path);
    -+			forced_config = 1;
    -+		}
    -+
    - 		strbuf_repo_git_path(&path, r, "hooks/%s", name);
    --	else if (!hook_path_early(name, &path))
    -+	} else if (!hook_path_early(name, &path))
    - 		return NULL;
    - 
    - 	found_hook = access(path.buf, X_OK) >= 0;
    +    Signed-off-by: Matthew John Cheetham <mjcheetham@outlook.com>
     
      ## t/t0400-pre-command-hook.sh ##
     @@ t/t0400-pre-command-hook.sh: test_expect_success 'in a subdirectory, using an alias' '
    @@ t/t0400-pre-command-hook.sh: test_expect_success 'in a subdirectory, using an al
     +	echo "alternate" >\$(git rev-parse --git-dir)/pre-command.out
     +	EOF
     +	write_script .git/hooks/pre-command <<-EOF &&
    -+	echo "original"	>\$(git rev-parse --git-dir)/pre-command.out
    ++	echo "original" >\$(git rev-parse --git-dir)/pre-command.out
     +	EOF
     +	git -c core.hooksPath=.git/alternateHooks status &&
     +	test "alternate" = "$(cat .git/pre-command.out)"

The git_hooks_path global variable has been replaced with a repository setting which is populated just-in-time when repo_settings_get_hooks_path is called; there's no longer a need to explicitly populate it in find_hook() anymore.

Oh, and a \t was replaced with a space for the echo "original" line.. not sure why it was a \t in the first place!


  • 27: 738d95c ! 27: 03cb349 gvfs: allow "virtualizing" objects

    @@ config.c: int git_default_core_config(const char *var, const char *value,
     +		return 0;
     +	}
     +
    - 	/* Add other config variables here and to Documentation/config.txt. */
    + 	/* Add other config variables here and to Documentation/config.adoc. */
      	return platform_core_config(var, value, ctx, cb);
      }
     
  • 94: 4a9b489 ! 94: e44a16d gvfs-helper: create tool to fetch objects using the GVFS Protocol

    @@ config.c: int git_default_config(const char *var, const char *value,
     +	if (starts_with(var, "gvfs."))
     +		return git_default_gvfs_config(var, value);
     +
    - 	/* Add other config variables here and to Documentation/config.txt. */
    + 	/* Add other config variables here and to Documentation/config.adoc. */
      	return 0;
      }
     
    @@ promisor-remote.c: struct promisor_remote *repo_promisor_remote_find(struct repo
     +	return core_use_gvfs_helper || !!repo_promisor_remote_find(r, NULL);
      }
      
    - static int remove_fetched_oids(struct repository *repo,
    + int repo_has_accepted_promisor_remote(struct repository *r)
     @@ promisor-remote.c: void promisor_remote_get_direct(struct repository *repo,
      
      	if (oid_nr == 0)

.txt files are now .adoc files.


  • 147: 08c3c26 ! 148: ba44f01 Adjust README.md for microsoft/git

    @@ README.md
     -The Git for Windows project is run using a [governance
     -model](http://git-for-windows.github.io/governance-model.html). If you
     -encounter problems, you can report them as [GitHub
    --issues](https://github.com/git-for-windows/git/issues), discuss them on Git
    --for Windows' [Google Group](http://groups.google.com/group/git-for-windows),
    --and [contribute bug
    +-issues](https://github.com/git-for-windows/git/issues), discuss them in Git
    +-for Windows' [Discussions](https://github.com/git-for-windows/git/discussions)
    +-or on the [Git mailing list](mailto:git@vger.kernel.org), and [contribute bug
     -fixes](https://github.com/git-for-windows/git/wiki/How-to-participate).
     -
     -To build Git for Windows, please either install [Git for Windows'
    @@ README.md
     +In addition to the Git command-line interface (CLI), `microsoft/git` includes the Scalar CLI to
     +further enable working with extremely large repositories. Scalar is a tool to apply the latest
     +recommendations and use the most advanced Git features. You can read
    -+[the Scalar CLI documentation](Documentation/scalar.txt) or read our
    ++[the Scalar CLI documentation](Documentation/scalar.adoc) or read our
     +[Scalar user guide](contrib/scalar/docs/index.md) including
     +[the philosophy of Scalar](contrib/scalar/docs/philosophy.md).
     +
    @@ README.md
     -Many Git online resources are accessible from <https://git-scm.com/>
     -including full documentation and Git related tools.
     -
    --See [Documentation/gittutorial.txt][] to get started, then see
    --[Documentation/giteveryday.txt][] for a useful minimum set of commands, and
    --`Documentation/git-<commandname>.txt` for documentation of each command.
    +-See [Documentation/gittutorial.adoc][] to get started, then see
    +-[Documentation/giteveryday.adoc][] for a useful minimum set of commands, and
    +-`Documentation/git-<commandname>.adoc` for documentation of each command.
     -If git has been correctly installed, then the tutorial can also be
     -read with `man gittutorial` or `git help tutorial`, and the
     -documentation of each command with `man git-<commandname>` or `git help
     -<commandname>`.
     -
    --CVS users may also want to read [Documentation/gitcvs-migration.txt][]
    +-CVS users may also want to read [Documentation/gitcvs-migration.adoc][]
     -(`man gitcvs-migration` or `git help cvs-migration` if git is
     -installed).
     -
    @@ README.md
     - - "goddamn idiotic truckload of sh*t": when it breaks
     -
     -[INSTALL]: INSTALL
    --[Documentation/gittutorial.txt]: Documentation/gittutorial.txt
    --[Documentation/giteveryday.txt]: Documentation/giteveryday.txt
    --[Documentation/gitcvs-migration.txt]: Documentation/gitcvs-migration.txt
    +-[Documentation/gittutorial.adoc]: Documentation/gittutorial.adoc
    +-[Documentation/giteveryday.adoc]: Documentation/giteveryday.adoc
    +-[Documentation/gitcvs-migration.adoc]: Documentation/gitcvs-migration.adoc
     -[Documentation/SubmittingPatches]: Documentation/SubmittingPatches
     -[Documentation/CodingGuidelines]: Documentation/CodingGuidelines
     -[po/README.md]: po/README.md

Git for Windows dropped the Google Group, and more of the .txt to .adoc rename.


  • 155: 3f60493 ! 155: e590557 scalar: do initialize gvfs.sharedCache

    @@ scalar.c: void load_builtin_commands(const char *prefix UNUSED,
     +		goto cleanup;
     +	}
     +
    -+	write_file(git_path("objects/info/alternates"),"%s\n", shared_cache_path);
    ++	write_file(repo_git_path(the_repository, "objects/info/alternates"),
    ++		   "%s\n", shared_cache_path);
     +
     +	cleanup:
     +	strbuf_release(&buf);
  • 54: 8e5f17a ! 61: f25844e serialize-status: serialize global and repo-local exclude file metadata

    @@ wt-status-deserialize.c: static int my_validate_index(const char *path, const st
     +
     +static int my_parse_repo_excludes(const char *line)
     +{
    -+	char *path = git_pathdup("info/exclude");
    ++	char *path = repo_git_path(the_repository, "info/exclude");
     +	int r = my_validate_excludes(path, "repo_excludes", line);
     +	free(path);
     +
    @@ wt-status-serialize.c
     +	 * We replicate the pathname construction here because of the static
     +	 * variables/functions used in dir.c.
     +	 */
    -+	char *path = git_pathdup("info/exclude");
    ++	char *path = repo_git_path(the_repository, "info/exclude");
     +
     +	append_exclude_info(fd, path, "repo_excludes");
     +

git_path has been replaced with repo_git_path that takes in a struct repository.

@dscho
Copy link
Member Author

dscho commented Mar 12, 2025

  • 155: 3f60493 ! 155: e590557 scalar: do initialize gvfs.sharedCache
    @@ scalar.c: void load_builtin_commands(const char *prefix UNUSED,
     +		goto cleanup;
     +	}
     +
    -+	write_file(git_path("objects/info/alternates"),"%s\n", shared_cache_path);
    ++	write_file(repo_git_path(the_repository, "objects/info/alternates"),
    ++		   "%s\n", shared_cache_path);
     +
     +	cleanup:
     +	strbuf_release(&buf);

I guess that repo_git_path() allocates the returned value, seeing as there is a new -leaks failure:

Direct leak of 60 byte(s) in 1 object(s) allocated from:
    #0 0x7f46bf378713 in realloc ../../../../src/libsanitizer/lsan/lsan_interceptors.cpp:98
    #1 0x55d9b946ac5e in xrealloc wrapper.c:140
    #2 0x55d9b942fce8 in strbuf_grow strbuf.c:114
    #3 0x55d9b9430fe6 in strbuf_vaddf strbuf.c:420
    #4 0x55d9b93c58df in repo_git_pathv path.c:428
    #5 0x55d9b93c59f4 in repo_git_path path.c:440
    #6 0x55d9b937a2f4 in init_shared_object_cache scalar.c:702
    #7 0x55d9b937aeb5 in cmd_clone scalar.c:882
    #8 0x55d9b937ce86 in cmd_main scalar.c:1472
    #9 0x55d9b937cf82 in main common-main.c:9
    #10 0x7f46bf14f3b7  (/lib/x86_64-linux-gnu/libc.so.6+0x2a3b7) (BuildId: 91f01b4ad171c80b6303d08d1f08cba8b990413d)
    #11 0x7f46bf14f47a in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2a47a) (BuildId: 91f01b4ad171c80b6303d08d1f08cba8b990413d)
    #12 0x55d9b9376a84 in _start (scalar+0xfa84) (BuildId: 30065bcb1c4e50a8365480e72570919212abc886)

And init_shared_object_cache scalar.c:702 corresponds to this line:

git/scalar.c

Line 702 in 21b8aa6

write_file(repo_git_path(the_repository, "objects/info/alternates"),

I fear we now have to store that value in a local variable and release it after use. (Yes, I am wishing more and more for Rust...)

@dscho
Copy link
Member Author

dscho commented Mar 12, 2025

I guess that repo_git_path() allocates the returned value

It sure does:

git/path.c

Lines 435 to 444 in 5ad6dd6

char *repo_git_path(const struct repository *repo,
const char *fmt, ...)
{
struct strbuf path = STRBUF_INIT;
va_list args;
va_start(args, fmt);
repo_git_pathv(repo, NULL, &path, fmt, args);
va_end(args);
return strbuf_detach(&path, NULL);
}

@dscho
Copy link
Member Author

dscho commented Mar 12, 2025

I fear we now have to store that value in a local variable and release it after use.

So done: 25ca8ce

@mjcheetham
Copy link
Member

So done: 25ca8ce

Thank you!

derrickstolee and others added 15 commits March 17, 2025 10:20
These seem to be custom tests to microsoft/git as they break without
these changes, but these changes are not needed upstream.

Signed-off-by: Derrick Stolee <stolee@gmail.com>
In ac8acb4 (sparse-index: complete partial expansion, 2022-05-23),
'expand_index()' was updated to expand the index to a given pathspec.
However, the 'path_matches_pattern_list()' method used to facilitate this
has the side effect of initializing or updating the index hash variables
('name_hash', 'dir_hash', and 'name_hash_initialized'). This operation is
performed on 'istate', though, not 'full'; as a result, the initialized
hashes are later overwritten when copied from 'full'. To ensure the correct
hashes are in 'istate' after the index expansion, change the arg used in
'path_matches_pattern_list()' from 'istate' to 'full'.

Note that this does not fully solve the problem. If 'istate' does not have
an initialized 'name_hash' when its contents are copied to 'full',
initialized hashes will be copied back into 'istate' but
'name_hash_initialized' will be 0. Therefore, we also need to copy
'full->name_hash_initialized' back to 'istate' after the index expansion is
complete.

Signed-off-by: Victoria Dye <vdye@github.com>
Add a test verifying that sparse-checkout (with and without sparse index
enabled) treat untracked files & directories correctly when changing sparse
patterns. Specifically, it ensures that 'git sparse-checkout set'

* deletes empty directories outside the sparse cone
* does _not_ delete untracked files outside the sparse cone

Signed-off-by: Victoria Dye <vdye@github.com>
Add test case to demonstrate that `git index-pack -o <idx-path> pack-path`
fails if <idx-path> does not end in ".idx" when `--rev-index` is
enabled.

In e37d0b8 (builtin/index-pack.c: write reverse indexes, 2021-01-25)
we learned to create `.rev` reverse indexes in addition to `.idx` index
files.  The `.rev` file pathname is constructed by replacing the suffix
on the `.idx` file.  The code assumes a hard-coded "idx" suffix.

In a8dd7e0 (config: enable `pack.writeReverseIndex` by default, 2023-04-12)
reverse indexes were enabled by default.

If the `-o <idx-path>` argument is used, the index file may have a
different suffix.  This causes an error when it tries to create the
reverse index pathname.

The test here demonstrates the failure.  (The test forces `--rev-index`
to avoid interaction with `GIT_TEST_NO_WRITE_REV_INDEX` during CI runs.)

Signed-off-by: Jeff Hostetler <jeffhostetler@github.com>
Teach index-pack to silently omit the reverse index if the
index file does not have the standard ".idx" suffix.

In e37d0b8 (builtin/index-pack.c: write reverse indexes, 2021-01-25)
we learned to create `.rev` reverse indexes in addition to `.idx` index
files.  The `.rev` file pathname is constructed by replacing the suffix
on the `.idx` file.  The code assumes a hard-coded "idx" suffix.

In a8dd7e0 (config: enable `pack.writeReverseIndex` by default, 2023-04-12)
reverse indexes were enabled by default.

If the `-o <idx-path>` argument is used, the index file may have a
different suffix.  This causes an error when it tries to create the
reverse index pathname.

Since we do not know why the user requested a non-standard suffix for
the index, we cannot guess what the proper corresponding suffix should
be for the reverse index.  So we disable it.

The t5300 test has been updated to verify that we no longer error
out and that the .rev file is not created.

TODO We could warn the user that we skipped it (perhaps only if they
TODO explicitly requested `--rev-index` on the command line).
TODO
TODO Ideally, we should add an `--rev-index-path=<path>` argument
TODO or change `--rev-index` to take a pathname.
TODO
TODO I'll leave these questions for a future series.

Signed-off-by: Jeff Hostetler <jeffhostetler@github.com>
Prefetch the value of GIT_TRACE2_DST_DEBUG during startup and before
we try to open any Trace2 destination pathnames.

Normally, Trace2 always silently fails if a destination target
cannot be opened so that it doesn't affect the execution of a
Git command.  The command should run normally, but just not
generate any trace data.  This can make it difficult to debug
a telemetry setup, since the user doesn't know why telemetry
isn't being generated.  If the environment variable
GIT_TRACE2_DST_DEBUG is true, the Trace2 startup will print
a warning message with the `errno` to make debugging easier.

However, on Windows, looking up the env variable resets `errno`
so the warning message always ends with `...tracing: No error`
which is not very helpful.

Prefetch the env variable at startup.  This avoids the need
to update each call-site to capture `errno` in the usual
`saved-errno` variable.

Signed-off-by: Jeff Hostetler <jeffhostetler@github.com>
Calculate the number of symrefs, loose vs packed, and the
maximal/accumulated length of local vs remote branches.

Signed-off-by: Jeff Hostetler <jeffhostetler@github.com>
Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
With this commit, we gather statistics about the sizes of commits,
trees, and blobs in the repository, and then present them in the form
of "hexbins", i.e. log(16) histograms that show how many objects fall
into the 0..15 bytes range, the 16..255 range, the 256..4095 range, etc.

For commits, we also show the total count grouped by the number of
parents, and for trees we additionally show the total count grouped by
number of entries in the form of "qbins", i.e. log(4) histograms.

Signed-off-by: Jeff Hostetler <jeffhostetler@github.com>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Create `struct large_item` and `struct large_item_vec` to capture the
n largest commits, trees, and blobs under various scaling dimensions,
such as size in bytes, number of commit parents, or number of entries
in a tree.

Each of these have a command line option to set them independently.

Signed-off-by: Jeff Hostetler <jeffhostetler@github.com>
Include the pathname of each blob or tree in the large_item_vec
to help identify the file or directory associated with the OID
and size information.

This pathname is computed during the path walk, so it reflects the
first observed pathname seen for that OID during the traversal over
all of the refs.  Since the file or directory could have moved
(without being modified), there may be multiple "correct" pathnames
for a particular OID.  Since we do not control the ref traversal
order, we should consider it to be a "suggested pathname" for the OID.

Signed-off-by: Jeff Hostetler <jeffhostetler@github.com>
Signed-off-by: Jeff Hostetler <jeffhostetler@github.com>
Signed-off-by: Jeff Hostetler <jeffhostetler@github.com>
Computing `git name-rev` on each commit, tree, and blob in each
of the various large_item_vec can be very expensive if there are
too many refs, especially if the user doesn't need the result.
Lets make it optional.

The `--no-name-rev` option can save 50 calls to `git name-rev`
since we have 5 large_item_vec's and each defaults to 10 items.

Signed-off-by: Jeff Hostetler <jeffhostetler@github.com>
Signed-off-by: Jeff Hostetler <jeffhostetler@github.com>
dscho and others added 8 commits March 17, 2025 12:16
This adds a new sub-sub-command for `test-tool`, simply passing through
the command-line arguments to the `is_path_owned_by_current_user()`
function.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
The check for dubious ownership has one particular quirk on Windows: if
running as an administrator, files owned by the Administrators _group_
are considered owned by the user.

The rationale for that is: When running in elevated mode, Git creates
files that aren't owned by the individual user but by the Administrators
group.

There is yet another quirk, though: The check I introduced to determine
whether the current user is an administrator uses the
`CheckTokenMembership()` function with the current process token. And
that check only succeeds when running in elevated mode!

Let's be a bit more lenient here and look harder whether the current
user is an administrator. We do this by looking for a so-called "linked
token". That token exists when administrators run in non-elevated mode,
and can be used to create a new process in elevated mode. And feeding
_that_ token to the `CheckTokenMembership()` function succeeds!
The --path-walk option in `git pack-objects` is implied by the
pack.usePathWalk=true config value. This is intended to help the
packfile generation within `git push` specifically.

While this config does enable the path-walk feature, it does not lead to
the expected levels of compression in the cases it was designed to
handle. This is due to the default implication of the --reuse-delta
option as well as auto-GC.

In the performance tests used to evaluate the --path-walk option, such
as those in p5313, the --no-reuse-delta option is used to ensure that
deltas are recomputed according to the new object walk. However, it was
assumed (I assumed this) that when the objects were loose from
client-side operations that better deltas would be computed during this
operation. This wasn't confirmed because the test process used data that
was fetched from real repositories and thus existed in packed form only.

I was able to confirm that this does not reproduce when the objects to
push are loose. Careful use of making the pushed commit unreachable and
loosening the objects via `git repack -Ad` helps to confirm my
suspicions here. Independent of this change, I'm pushing for these
pipeline agents to set `gc.auto=0` before creating their Git objects. In
the current setup, the repo is adding objects and then incrementally
repacking them and ending up with bad cross-path deltas. This approach
can help scenarios where that makes sense, but will not cover all of our
users without them choosing to opt-in to background maintenance (and
even then, an incremental repack could cost them efficiency).

In order to make sure we are getting the intended compression in `git
push`, this change enforces the spawned `git pack-objects` process to
use `--no-reuse-delta`.

As far as I can tell, the main motivation for implying the --reuse-delta
option by default is two-fold:

 1. The code in send-pack.c that executes 'git pack-objects' is ignorant
    of whether the current process is a client pushing to a remote or a
    remote sending a fetch or clone to a client.

 2. For servers, it is critical that they trust the previously computed
    deltas whenever possible, or they could overload their CPU
    resources.

There's also the side that most servers use repacking logic that will
replace any bad deltas that are sent by clients (or at least, that's the
hope; we've seen that repacks can also pick bad deltas).

This commit also adds a test case that demonstrates that `git -c
pack.usePathWalk=true push` now avoids reusing deltas.

To do this, the test case constructs a pack with a horrendously
inefficient delta object, then verifies that the pack on the receiving
side of the `push` fails to have such an inefficient delta.

The test case would probably be a lot more readable if hex numbers were
used instead of octal numbers, but alas, `printf "\x<hex>"` is not
portable, only `printf "\<octal>"` is. For example, dash's built-in
`printf` function simply prints `\x` verbatim while bash's built-in
happily converts this construct to the corresponding byte.

Signed-off-by: Derrick Stolee <stolee@gmail.com>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
The --path-walk option in 'git pack-objects' is implied by the
pack.usePathWalk=true config value. This is intended to help the
packfile generation within 'git push' specifically.

While this config does enable the path-walk feature, it does not lead
the expected levels of compression in the cases it was designed to
handle. This is due to the default implication of the --reuse-delta
option as well as auto-GC.

In the performance tests used to evaluate the --path-walk option, such
as those in p5313, the --no-reuse-delta option is used to ensure that
deltas are recomputed according to the new object walk. However, it was
assumed (I assumed this) that when the objects were loose from
client-side operations that better deltas would be computed during this
operation. This wasn't confirmed because the test process used data that
was fetched from real repositories and thus existed in packed form only.

I was able to confirm that this does not reproduce when the objects to
push are loose. Careful use of making the pushed commit unreachable and
loosening the objects via 'git repack -Ad' helps to confirm my
suspicions here. Independent of this change, I'm pushing for these
pipeline agents to set 'gc.auto=0' before creating their Git objects. In
the current setup, the repo is adding objects and then incrementally
repacking them and ending up with bad cross-path deltas. This approach
can help scenarios where that makes sense, but will not cover all of our
users without them choosing to opt-in to background maintenance (and
even then, an incremental repack could cost them efficiency).

In order to make sure we are getting the intended compression in 'git
push', this change makes the --path-walk option imply --no-reuse-delta
when the --reuse-delta option is not provided.

As far as I can tell, the main motivation for implying the --reuse-delta
option by default is two-fold:

1. The code in send-pack.c that executes 'git pack-objects' is ignorant
of whether the current process is a client pushing to a remote or a
remote sending a fetch or clone to a client.

2. For servers, it is critical that they trust the previously computed
deltas whenever possible, or they could overload their CPU resources.

There's also the side that most servers use repacking logic that will
replace any bad deltas that are sent by clients (or at least, that's the
hope; we've seen that repacks can also pick bad deltas).

The --path-walk option at the moment is not compatible with reachability
bitmaps, so is not planned to be used by Git servers. Thus, we can
reasonably assume (for now) that the --path-walk option is assuming a
client-side scenario, either a push or a repack. The repack option will
be explicit about the --reuse-delta option or not.

One thing to be careful about is background maintenance, which uses a
list of objects instead of refs, so we condition this on the case where
the --path-walk option will be effective by checking that the --revs
option was provided.

Alternative options considered included:

* Adding _another_ config ('pack.reuseDelta=false') to opt-in to this
choice. However, we already have pack.usePathWalk=true as an opt-in to
"do the right thing to make my data small" as far as our internal users
are concerned.

* Modify the chain between builtin/push.c, transport.c, and
builtin/send-pack.c to communicate that we are in "push" mode, not
within a fetch or clone. However, this seemed like overkill. It may be
beneficial in the future to pass through a mode like this, but it does
not meet the bar for the immediate need.

Reviewers, please see git-for-windows#5171 for the baseline
implementation of this feature within Git for Windows and thus
microsoft/git. This feature is still under review upstream.
Tests in t7900 assume the state of the `maintenance.strategy`
config setting; set/unset by previous tests. Correct this by
explictly unsetting and re-setting the config at the start of the
tests.

Signed-off-by: Matthew John Cheetham <mjcheetham@outlook.com>
Introduce a new maintenance task, `cache-local-objects`, that operates
on Scalar or VFS for Git repositories with a per-volume, shared object
cache (specified by `gvfs.sharedCache`) to migrate packfiles and loose
objects from the repository object directory to the shared cache.

Older versions of `microsoft/git` incorrectly placed packfiles in the
repository object directory instead of the shared cache; this task will
help clean up existing clones impacted by that issue.

Migration of packfiles involves the following steps for each pack:

1. Hardlink (or copy):
   a. the .pack file
   b. the .keep file
   c. the .rev file
2. Move (or copy + delete) the .idx file
3. Delete/unlink:
   a. the .pack file
   b. the .keep file
   c. the .rev file

Moving the index file after the others ensures the pack is not read
from the new cache directory until all associated files (rev, keep)
exist in the cache directory also.

Moving loose objects operates as a move, or copy + delete.

Signed-off-by: Matthew John Cheetham <mjcheetham@outlook.com>
Add the `cache-local-objects` maintenance task to the list of tasks run
by the `scalar run` command. It's often easier for users to run the
shorter `scalar run` command than the equivalent `git maintenance`
command.

Signed-off-by: Matthew John Cheetham <mjcheetham@outlook.com>
Introduce a new maintenance task, `cache-local-objects`, that operates
on Scalar or VFS for Git repositories with a per-volume, shared object
cache (specified by `gvfs.sharedCache`) to migrate packfiles and loose
objects from the repository object directory to the shared cache.

Older versions of `microsoft/git` incorrectly placed packfiles in the
repository object directory instead of the shared cache; this task will
help clean up existing clones impacted by that issue.

Fixes #716
@mjcheetham mjcheetham force-pushed the tentative/vfs-2.49.0 branch from 94dcabb to 4829785 Compare March 17, 2025 12:41
@mjcheetham
Copy link
Member

mjcheetham commented Mar 17, 2025

Range-diff relative to v2.49.0-rc2 (with creation-factor of 999 otherwise the "Add winget workflows" and corresponding "fixup!" patches get swapped)
  • 1: ae88cab = 1: 75a06eb t: remove advice from some tests

  • 2: 029406a = 2: 5818e92 sparse-index.c: fix use of index hashes in expand_index

  • 3: 6ac339b = 3: 6960bb4 t1092: add test for untracked files and directories

  • 4: 55c5e2c = 4: d563c8e t5300: confirm failure of git index-pack when non-idx suffix requested

  • 5: 89d4b16 = 5: a08fc1b index-pack: disable rev-index if index file has non .idx suffix

  • 6: d11b231 = 6: bb0ef4f trace2: prefetch value of GIT_TRACE2_DST_DEBUG at startup

  • 7: 251405d = 7: b1ec25c survey: calculate more stats on refs

  • 8: a506ee6 ! 8: 8993408 survey: show some commits/trees/blobs histograms

    @@ builtin/survey.c: static void increment_totals(struct survey_context *ctx,
     +				struct survey_stats_trees *pst = &ctx->report.reachable_objects.trees;
     +				struct tree_desc desc;
     +				struct name_entry entry;
    -+				int nr_entries;
    ++				uint64_t nr_entries;
     +				int qb;
     +
     +				parse_tree(tree);
  • 9: 58a8bcc = 9: 83af602 survey: add vector of largest objects for various scaling dimensions

  • 10: fe8c993 = 10: 70075b5 survey: add pathname of blob or tree to large_item_vec

  • 11: d421cca = 11: c3e2a5b survey: add commit-oid to large_item detail

  • 12: 989b551 = 12: 692393b survey: add commit name-rev lookup to each large_item

  • 13: 62b4b11 = 13: 8248df7 survey: add --no-name-rev option

  • 14: c4bb47e = 14: dfd7966 survey: started TODO list at bottom of source file

  • 15: 41d9a96 = 15: 63c1e62 survey: expanded TODO list at the bottom of the source file

  • 16: d679c30 = 16: e376b14 survey: expanded TODO with more notes

  • 17: 480e80f = 17: 5886eee reset --stdin: trim carriage return from the paths

  • 18: 6275e08 < -: ----------- Identify microsoft/git via a distinct version suffix

  • 129: 8f2285f ! 18: cb44006 Adding winget workflows

    @@
      ## Metadata ##
    -Author: Lessley Dennington <ledennin@microsoft.com>
    +Author: Johannes Schindelin <Johannes.Schindelin@gmx.de>
     
      ## Commit message ##
    -    Adding winget workflows
    +    Identify microsoft/git via a distinct version suffix
     
    - ## .github/workflows/release-winget.yml (new) ##
    +    It has been a long-standing practice in Git for Windows to append
    +    `.windows.<n>`, and in microsoft/git to append `.vfs.0.0`. Let's keep
    +    doing that.
    +
    +    Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
    +
    + ## GIT-VERSION-GEN ##
     @@
    -+name: "release-winget"
    -+on:
    -+  release:
    -+    types: [released]
    -+
    -+  workflow_dispatch:
    -+    inputs:
    -+      release:
    -+        description: 'Release Id'
    -+        required: true
    -+        default: 'latest'
    -+
    -+permissions:
    -+  id-token: write # required for Azure login via OIDC
    -+
    -+jobs:
    -+  release:
    -+    runs-on: windows-latest
    -+    environment: release
    -+    steps:
    -+      - name: Log into Azure
    -+        uses: azure/login@v2
    -+        with:
    -+          client-id: ${{ secrets.AZURE_CLIENT_ID }}
    -+          tenant-id: ${{ secrets.AZURE_TENANT_ID }}
    -+          subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
    -+
    -+      - name: Publish manifest with winget-create
    -+        run: |
    -+          # Get correct release asset
    -+          $github = Get-Content '${{ github.event_path }}' | ConvertFrom-Json
    -+          $asset_x64 = $github.release.assets | Where-Object -Property name -match '64-bit.exe$'
    -+          $asset_arm64 = $github.release.assets | Where-Object -Property name -match 'arm64.exe$'
    -+
    -+          # Remove 'v' and 'vfs' from the version
    -+          $github.release.tag_name -match '\d.*'
    -+          $version = $Matches[0] -replace ".vfs",""
    -+
    -+          # Download wingetcreate and create manifests
    -+          Invoke-WebRequest https://aka.ms/wingetcreate/latest -OutFile wingetcreate.exe
    -+          .\wingetcreate.exe update Microsoft.Git `
    -+              -v $version `
    -+              -o manifests `
    -+              -u "$($asset_x64.browser_download_url)|x64|machine" `
    -+                 "$($asset_x64.browser_download_url)|x64|user" `
    -+                 "$($asset_arm64.browser_download_url)|arm64|machine" `
    -+                 "$($asset_arm64.browser_download_url)|arm64|user"
    -+
    -+          # Manually substitute the name of the default branch in the License
    -+          # and Copyright URLs since the tooling cannot do that for us.
    -+          $shortenedVersion = $version -replace ".{4}$"
    -+          $manifestPath = dir -Path ./manifests -Filter Microsoft.Git.locale.en-US.yaml -Recurse | %{$_.FullName}
    -+          sed -i "s/vfs-[.0-9]*/vfs-$shortenedVersion/g" "$manifestPath"
    -+
    -+          # Submit manifests
    -+          $manifestDirectory = Split-Path "$manifestPath"
    -+          .\wingetcreate.exe submit -t "(az keyvault secret show --name ${{ secrets.WINGET_TOKEN_SECRET_NAME }} --vault-name ${{ secrets.AZURE_VAULT }} --query "value" --output tsv)" $manifestDirectory
    -+        shell: powershell
    + 
    + DEF_VER=v2.49.0
    + 
    ++# Identify microsoft/git via a distinct version suffix
    ++DEF_VER=$DEF_VER.vfs.0.0
    ++
    + LF='
    + '
    + 
  • 19: 8b1bbe2 = 19: f66336e gvfs: ensure that the version is based on a GVFS tag

  • 20: 765cba8 = 20: 36c287d gvfs: add a GVFS-specific header file

  • 21: 26f9d64 = 21: 3081376 gvfs: add the core.gvfs config setting

  • 22: b24bea2 = 22: 8e016a5 gvfs: add the feature to skip writing the index' SHA-1

  • 23: 7e30568 = 23: b00139b gvfs: add the feature that blobs may be missing

  • 24: 6434171 = 24: 2298a2b gvfs: prevent files to be deleted outside the sparse checkout

  • 25: 8d0ab18 = 25: 53bb1c4 gvfs: optionally skip reachability checks/upload pack during fetch

  • 26: 72e3df8 = 26: 7d7f7f7 gvfs: ensure all filters and EOL conversions are blocked

  • 27: 03cb349 = 27: d481378 gvfs: allow "virtualizing" objects

  • 28: 9d6b5f5 = 28: c6137ba Hydrate missing loose objects in check_and_freshen()

  • 29: 10bd18f = 29: 9090263 sha1_file: when writing objects, skip the read_object_hook

  • 30: 57624d9 = 30: a4b3a90 gvfs: add global command pre and post hook procs

  • 31: f98cadd = 31: da5bd05 t0400: verify that the hook is called correctly from a subdirectory

  • 39: 210ebd8 = 32: fd95c5c t0400: verify core.hooksPath is respected by pre-command

  • 40: a97af02 = 33: ce58c90 Pass PID of git process to hooks.

  • 41: 500bf26 = 34: 26c0838 sparse-checkout: update files with a modify/delete conflict

  • 42: 283f56a = 35: 5b3d2d8 sparse-checkout: avoid writing entries with the skip-worktree bit

  • 43: f645ffd = 36: 0e66d50 Do not remove files outside the sparse-checkout

  • 44: 48bbe41 = 37: 625e606 send-pack: do not check for sha1 file when GVFS_MISSING_OK set

  • 45: 5db220e = 38: c8697f1 cache-tree: remove use of strbuf_addf in update_one

  • 46: b2b66bb = 39: b1f8410 gvfs: block unsupported commands when running in a GVFS repo

  • 47: 1da56a6 = 40: 891cef3 worktree: allow in Scalar repositories

  • 48: b3b60e5 = 41: 589c2f5 gvfs: allow overriding core.gvfs

  • 49: eb6bdc1 = 42: 193d112 BRANCHES.md: Add explanation of branches and using forks

  • 50: 73028bf = 43: 8d90680 Add virtual file system settings and hook proc

  • 51: 0d89e3f = 44: ea134ec virtualfilesystem: don't run the virtual file system hook if the index has been redirected

  • 52: 39fed32 = 45: efd39ab virtualfilesystem: check if directory is included

  • 53: b8d6d1c = 46: 19f7756 backwards-compatibility: support the post-indexchanged hook

  • 54: bf14926 = 47: b4010fd gvfs: verify that the built-in FSMonitor is disabled

  • 55: 5069c60 = 48: e76967d wt-status: add trace2 data for sparse-checkout percentage

  • 56: dae5437 = 49: 4783edb wt-status: add VFS hydration percentage to normal git status output

  • 57: fc68696 = 50: 24c297d status: add status serialization mechanism

  • 58: e7f136c = 51: 489e791 Teach ahead-behind and serialized status to play nicely together

  • 59: cdafde5 = 52: be1a3ef status: serialize to path

  • 60: a276650 = 53: 956982d status: reject deserialize in V2 and conflicts

  • 61: f25844e = 54: 9218600 serialize-status: serialize global and repo-local exclude file metadata

  • 62: b1d61f8 = 55: 41cac10 status: deserialization wait

  • 63: 0d0f164 = 56: 3218b44 merge-recursive: avoid confusing logic in was_dirty()

  • 64: 60f2d11 = 57: d33b888 merge-recursive: add some defensive coding to was_dirty()

  • 65: b4d8582 = 58: 1756f59 merge-recursive: teach was_dirty() about the virtualfilesystem

  • 66: e885ad2 = 59: e1d8c75 status: deserialize with -uno does not print correct hint

  • 67: f412b78 = 60: 4ed13dd fsmonitor: check CE_FSMONITOR_VALID in ce_uptodate

  • 68: 27b2b09 = 61: 89680d2 fsmonitor: add script for debugging and update script for tests

  • 69: 4abd3e9 = 62: ae21aba status: disable deserialize when verbose output requested.

  • 70: 866050e = 63: 823a8b6 t7524: add test for verbose status deserialzation

  • 71: 956db0e = 64: 51e4b61 deserialize-status: silently fallback if we cannot read cache file

  • 72: 4f851f8 = 65: d3bd23f gvfs:trace2:data: add trace2 tracing around read_object_process

  • 73: e0a0397 = 66: 2077fff gvfs:trace2:data: status deserialization information

  • 74: 94e768f = 67: 5a522b5 gvfs:trace2:data: status serialization

  • 75: bb76620 = 68: 8315cfe gvfs:trace2:data: add vfs stats

  • 76: 45fb166 = 69: 08edf4a trace2: refactor setting process starting time

  • 77: 86ee7ba = 70: cd233f1 trace2:gvfs:experiment: clear_ce_flags_1

  • 78: 5ddc8b2 = 71: 27c3221 trace2:gvfs:experiment: report_tracking

  • 79: 7d5e2f8 = 72: 6d0ca07 trace2:gvfs:experiment: read_cache: annotate thread usage in read-cache

  • 80: cca3ebe = 73: 473b639 trace2:gvfs:experiment: read-cache: time read/write of cache-tree extension

  • 81: 55c7e16 = 74: 5421a8c trace2:gvfs:experiment: add region to apply_virtualfilesystem()

  • 82: c2cc3a4 = 75: faaf7a9 trace2:gvfs:experiment: add region around unpack_trees()

  • 83: a6a1d6f = 76: cde8c54 trace2:gvfs:experiment: add region to cache_tree_fully_valid()

  • 84: 60d0cc8 = 77: 45e8f91 trace2:gvfs:experiment: add unpack_entry() counter to unpack_trees() and report_tracking()

  • 85: 644f335 = 78: 9a56222 trace2:gvfs:experiment: increase default event depth for unpack-tree data

  • 86: bacf0b9 = 79: bf30c8e trace2:gvfs:experiment: add data for check_updates() in unpack_trees()

  • 87: fa3ef00 = 80: 4468fcd Trace2:gvfs:experiment: capture more 'tracking' details

  • 88: 91badf4 = 81: b01b2a1 credential: set trace2_child_class for credential manager children

  • 89: 7a324a9 = 82: 4a9589d sub-process: do not borrow cmd pointer from caller

  • 90: d3fefdc = 83: 926e6cf sub-process: add subprocess_start_argv()

  • 91: 3a0a1c8 = 84: 4826944 sha1-file: add function to update existing loose object cache

  • 92: 72a3b76 = 85: 13afa3c packfile: add install_packed_git_and_mru()

  • 93: 191a11a = 86: bdd8bcb index-pack: avoid immediate object fetch while parsing packfile

  • 94: e44a16d = 87: 463a2be gvfs-helper: create tool to fetch objects using the GVFS Protocol

  • 95: e2d6b8e = 88: ed44745 sha1-file: create shared-cache directory if it doesn't exist

  • 96: da61050 = 89: 1096bda gvfs-helper: better handling of network errors

  • 97: 4287bf3 = 90: 3cf451a gvfs-helper-client: properly update loose cache with fetched OID

  • 98: f46f751 = 91: e216cfc gvfs-helper: V2 robust retry and throttling

  • 99: e5d9ff7 = 92: 8310807 gvfs-helper: expose gvfs/objects GET and POST semantics

  • 100: 5967669 = 93: e90568d gvfs-helper: dramatically reduce progress noise

  • 101: 8b5f34c = 94: 603acac gvfs-helper-client.h: define struct object_id

  • 102: 273d578 = 95: cb66984 gvfs-helper: handle pack-file after single POST request

  • 103: f055647 = 96: f830908 test-gvfs-prococol, t5799: tests for gvfs-helper

  • 104: a457d94 = 97: 81e1de7 gvfs-helper: move result-list construction into install functions

  • 105: 5b21946 = 98: 1d00c49 t5799: add support for POST to return either a loose object or packfile

  • 106: 5caa794 = 99: 5dc1fae t5799: cleanup wc-l and grep-c lines

  • 107: 5d4a532 = 100: ea95811 gvfs-helper: verify loose objects after write

  • 108: 0c52f94 = 101: 90128f3 t7599: create corrupt blob test

  • 109: c9d61e7 = 102: 8f3aa4f gvfs-helper: add prefetch support

  • 110: e0ac1b6 = 103: 81f883d gvfs-helper: add prefetch .keep file for last packfile

  • 111: 22e39ba = 104: 7fc2ac8 gvfs-helper: do one read in my_copy_fd_len_tail()

  • 112: 1c2e94c = 105: 68e448e gvfs-helper: move content-type warning for prefetch packs

  • 113: f049b00 = 106: ce5d546 fetch: use gvfs-helper prefetch under config

  • 114: 4fe8a97 = 107: 3c70593 gvfs-helper: better support for concurrent packfile fetches

  • 115: e3a5a01 = 108: a05e8a0 remote-curl: do not call fetch-pack when using gvfs-helper

  • 116: c1ba600 = 109: 0d5e773 fetch: reprepare packs before checking connectivity

  • 117: e3f1e01 = 110: 9cc6b21 gvfs-helper: retry when creating temp files

  • 118: b356d50 = 111: f050263 sparse: avoid warnings about known cURL issues in gvfs-helper.c

  • 119: 494e252 = 112: d07ec77 gvfs-helper: add --max-retries to prefetch verb

  • 120: 4455900 = 113: 7a7ee90 t5799: add tests to detect corrupt pack/idx files in prefetch

  • 121: cb20094 = 114: 55657d3 gvfs-helper: ignore .idx files in prefetch multi-part responses

  • 122: cdad4c6 = 115: 617c504 t5799: explicitly test gvfs-helper --fallback and --no-fallback

  • 123: be1ce0a = 116: cb672d4 gvfs-helper: don't fallback with new config

  • 126: 99a4369 = 117: e88d0bc test-gvfs-protocol: add cache_http_503 to mayhem

  • 128: 029ac9a = 118: 91f65cf t5799: add unit tests for new gvfs.fallback config setting

  • 124: 5b25536 = 119: 3f500a9 maintenance: care about gvfs.sharedCache config

  • 125: 350a426 = 120: 96cdc0e unpack-trees:virtualfilesystem: Improve efficiency of clear_ce_flags

  • 127: c4889c2 = 121: d5f8c52 homebrew: add GitHub workflow to release Cask

  • 200: b7a1352 ! 122: 709204a fixup! Adding winget workflows

    @@
      ## Metadata ##
    -Author: Matthew John Cheetham <mjcheetham@outlook.com>
    +Author: Lessley Dennington <ledennin@microsoft.com>
     
      ## Commit message ##
    -    fixup! Adding winget workflows
    +    Adding winget workflows
     
    -    Fix the workflow_dispatch trigger code flow to correctly act on the
    -    specified tag name.
    -
    - ## .github/workflows/release-winget.yml ##
    -@@ .github/workflows/release-winget.yml: on:
    - 
    -   workflow_dispatch:
    -     inputs:
    --      release:
    --        description: 'Release Id'
    + ## .github/workflows/release-winget.yml (new) ##
    +@@
    ++name: "release-winget"
    ++on:
    ++  release:
    ++    types: [released]
    ++
    ++  workflow_dispatch:
    ++    inputs:
     +      tag:
     +        description: 'Tag name to release'
    -         required: true
    --        default: 'latest'
    - 
    - permissions:
    -   id-token: write # required for Azure login via OIDC
    - 
    ++        required: true
    ++
    ++permissions:
    ++  id-token: write # required for Azure login via OIDC
    ++
     +env:
     +  TAG_NAME: ${{ github.event.inputs.tag }}
     +
    - jobs:
    -   release:
    -     runs-on: windows-latest
    -@@ .github/workflows/release-winget.yml: jobs:
    - 
    -       - name: Publish manifest with winget-create
    -         run: |
    --          # Get correct release asset
    --          $github = Get-Content '${{ github.event_path }}' | ConvertFrom-Json
    --          $asset_x64 = $github.release.assets | Where-Object -Property name -match '64-bit.exe$'
    --          $asset_arm64 = $github.release.assets | Where-Object -Property name -match 'arm64.exe$'
    ++jobs:
    ++  release:
    ++    runs-on: windows-latest
    ++    environment: release
    ++    steps:
    ++      - name: Log into Azure
    ++        uses: azure/login@v2
    ++        with:
    ++          client-id: ${{ secrets.AZURE_CLIENT_ID }}
    ++          tenant-id: ${{ secrets.AZURE_TENANT_ID }}
    ++          subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
    ++
    ++      - name: Publish manifest with winget-create
    ++        run: |
     +          # Enabling stop on error and tracing
     +          Set-PSDebug -Trace 2
     +          $ErrorActionPreference = "Stop"
    @@ .github/workflows/release-winget.yml: jobs:
     +            $asset_x64_url = $asset_x64.url
     +            $asset_arm64_url = $asset_arm64.url
     +          }
    - 
    -           # Remove 'v' and 'vfs' from the version
    --          $github.release.tag_name -match '\d.*'
    --          $version = $Matches[0] -replace ".vfs",""
    ++
    ++          # Remove 'v' and 'vfs' from the version
     +          $env:TAG_NAME -match 'v(.*?)vfs\.(.*)'
     +          $version = $Matches[1] + $Matches[2]
    - 
    -           # Download wingetcreate and create manifests
    -           Invoke-WebRequest https://aka.ms/wingetcreate/latest -OutFile wingetcreate.exe
    -           .\wingetcreate.exe update Microsoft.Git `
    -               -v $version `
    -               -o manifests `
    --              -u "$($asset_x64.browser_download_url)|x64|machine" `
    --                 "$($asset_x64.browser_download_url)|x64|user" `
    --                 "$($asset_arm64.browser_download_url)|arm64|machine" `
    --                 "$($asset_arm64.browser_download_url)|arm64|user"
    ++
    ++          # Download wingetcreate and create manifests
    ++          Invoke-WebRequest https://aka.ms/wingetcreate/latest -OutFile wingetcreate.exe
    ++          .\wingetcreate.exe update Microsoft.Git `
    ++              -v $version `
    ++              -o manifests `
     +              -u "$($asset_x64_url)|x64|machine" `
     +                 "$($asset_x64_url)|x64|user" `
     +                 "$($asset_arm64_url)|arm64|machine" `
     +                 "$($asset_arm64_url)|arm64|user"
    - 
    -           # Manually substitute the name of the default branch in the License
    -           # and Copyright URLs since the tooling cannot do that for us.
    -@@ .github/workflows/release-winget.yml: jobs:
    -           $manifestPath = dir -Path ./manifests -Filter Microsoft.Git.locale.en-US.yaml -Recurse | %{$_.FullName}
    -           sed -i "s/vfs-[.0-9]*/vfs-$shortenedVersion/g" "$manifestPath"
    - 
    --          # Submit manifests
    ++
    ++          # Manually substitute the name of the default branch in the License
    ++          # and Copyright URLs since the tooling cannot do that for us.
    ++          $shortenedVersion = $version -replace ".{4}$"
    ++          $manifestPath = dir -Path ./manifests -Filter Microsoft.Git.locale.en-US.yaml -Recurse | %{$_.FullName}
    ++          sed -i "s/vfs-[.0-9]*/vfs-$shortenedVersion/g" "$manifestPath"
    ++
     +          # Download the token from Azure Key Vault and mask it in the logs
     +          az keyvault secret download --name ${{ secrets.WINGET_TOKEN_SECRET_NAME }} --vault-name ${{ secrets.AZURE_VAULT }} --file token.txt
     +          Write-Host -NoNewLine "::add-mask::$(Get-Content token.txt)"
     +
     +          # Submit the manifest to the winget-pkgs repository
    -           $manifestDirectory = Split-Path "$manifestPath"
    --          .\wingetcreate.exe submit -t "(az keyvault secret show --name ${{ secrets.WINGET_TOKEN_SECRET_NAME }} --vault-name ${{ secrets.AZURE_VAULT }} --query "value" --output tsv)" $manifestDirectory
    ++          $manifestDirectory = Split-Path "$manifestPath"
     +          .\wingetcreate.exe submit -t "$(Get-Content token.txt)" $manifestDirectory
    -         shell: powershell
    ++        shell: powershell
  • 130: 1f800dd = 123: bc82e26 Disable the monitor-components workflow in msft-git

  • 131: ed43286 = 124: f856059 .github: enable windows builds on microsoft fork

  • 132: 6c8f9b7 = 125: baa7016 release: create initial Windows installer build workflow

  • 133: 47b5b0c = 126: f6b5ab0 help: special-case HOST_CPU universal

  • 134: a6c1fae = 127: f56037b release: add Mac OSX installer build

  • 135: 7b80cc8 = 128: 0b15eed release: build unsigned Ubuntu .deb package

  • 136: 1920139 = 129: b09d662 release: add signing step for .deb package

  • 137: 41003d0 = 130: 9a2ab21 release: create draft GitHub release with packages & installers

  • 138: ad0915a = 131: cca0446 build-git-installers: publish gpg public key

  • 139: c959ed5 = 132: b3119d1 release: continue pestering until user upgrades

  • 140: 6245115 = 133: 041a60b dist: archive HEAD instead of HEAD^{tree}

  • 141: c850106 = 134: 51fe9b6 release: include GIT_BUILT_FROM_COMMIT in MacOS build

  • 146: 04d6e84 = 135: ab758a7 release: add installer validation

  • 142: 839a6c9 = 136: 84ba1f6 update-microsoft-git: create barebones builtin

  • 143: 553c0e4 = 137: 7b9c668 update-microsoft-git: Windows implementation

  • 144: 70cc4ce = 138: 65a98fa update-microsoft-git: use brew on macOS

  • 145: 8a8e378 = 139: 1d9f06f .github: update ISSUE_TEMPLATE.md for microsoft/git

  • 147: 210d66f = 140: 48557a0 .github: update PULL_REQUEST_TEMPLATE.md

  • 148: ba44f01 = 141: eaf2d2a Adjust README.md for microsoft/git

  • 32: ce1e307 = 142: 70cb6f7 git_config_set_multivar_in_file_gently(): add a lock timeout

  • 33: 0b3413c = 143: 4c721a0 scalar: set the config write-lock timeout to 150ms

  • 34: 5211698 = 144: 118caea scalar: add docs from microsoft/scalar

  • 35: b66dca2 = 145: e52657d scalar (Windows): use forward slashes as directory separators

  • 36: 75b421a = 146: 45ecc4a scalar: add retry logic to run_git()

  • 37: d5be57d = 147: c2ea7fb scalar: support the config command for backwards compatibility

  • 149: 79fc4b6 = 148: a3d686c scalar: implement a minimal JSON parser

  • 150: 2ae7adf = 149: 87381ec scalar clone: support GVFS-enabled remote repositories

  • 151: ff74173 = 150: b787bd2 test-gvfs-protocol: also serve smart protocol

  • 152: 758413c = 151: 08295f6 gvfs-helper: add the endpoint command

  • 153: 5d3ad94 = 152: c9be3d2 dir_inside_of(): handle directory separators correctly

  • 154: 317407d = 153: 9c0ef92 scalar: disable authentication in unattended mode

  • 155: e590557 ! 154: 78f7613 scalar: do initialize gvfs.sharedCache

    @@ scalar.c: void load_builtin_commands(const char *prefix UNUSED,
     +{
     +	struct strbuf buf = STRBUF_INIT;
     +	int res = 0;
    -+	char *cache_key = NULL, *shared_cache_path = NULL;
    ++	char *cache_key = NULL, *shared_cache_path = NULL, *alternates = NULL;
     +
     +	if (!(cache_key = get_cache_key(url))) {
     +		res = error(_("could not determine cache key for '%s'"), url);
    @@ scalar.c: void load_builtin_commands(const char *prefix UNUSED,
     +		goto cleanup;
     +	}
     +
    -+	write_file(repo_git_path(the_repository, "objects/info/alternates"),
    -+		   "%s\n", shared_cache_path);
    ++	alternates = repo_git_path(the_repository, "objects/info/alternates");
    ++	write_file(alternates, "%s\n", shared_cache_path);
     +
     +	cleanup:
     +	strbuf_release(&buf);
     +	free(shared_cache_path);
     +	free(cache_key);
    ++	free(alternates);
     +	return res;
     +}
     +
  • 156: 7133a22 = 155: 1af7580 scalar diagnose: include shared cache info

  • 157: 9b90f1b = 156: bc42629 scalar: only try GVFS protocol on https:// URLs

  • 158: f1b7234 = 157: 8662600 scalar: verify that we can use a GVFS-enabled repository

  • 159: c10bd8e = 158: 89a7b42 scalar: add the cache-server command

  • 160: 7303c71 = 159: ab25f81 scalar: add a test toggle to skip accessing the vsts/info endpoint

  • 161: 4fdedbc = 160: 3d0bd5a scalar: adjust documentation to the microsoft/git fork

  • 162: 990b0d6 = 161: a378400 scalar: enable untracked cache unconditionally

  • 163: 5804077 = 162: a99fddd scalar: parse clone --no-fetch-commits-and-trees for backwards compatibility

  • 164: bbbfe01 = 163: 74b5630 scalar: make GVFS Protocol a forced choice

  • 165: 3186ebb = 164: 00072ec scalar diagnose: accommodate Scalar's Functional Tests

  • 166: f12d53b = 165: 56ad49e ci: run Scalar's Functional Tests

  • 167: d5aee79 = 166: a434437 scalar: upgrade to newest FSMonitor config setting

  • 169: df11c72 = 167: 3ddcf2b scalar: configure maintenance during 'reconfigure'

  • 168: 6ded7aa = 168: 630a983 abspath: make strip_last_path_component() global

  • 170: c697e61 = 169: 26f0754 scalar: .scalarCache should live above enlistment

  • 171: ac6644e = 170: d4a97c4 add/rm: allow adding sparse entries when virtual

  • 172: 1009152 = 171: c29ccf2 sparse-checkout: add config to disable deleting dirs

  • 173: a2cec64 = 172: 474b5ac diff: ignore sparse paths in diffstat

  • 174: 290df32 = 173: f307a19 repo-settings: enable sparse index by default

  • 175: 34e5153 = 174: cebb354 diff(sparse-index): verify with partially-sparse

  • 176: 4db583e = 175: f02c1c4 stash: expand testing for git stash -u

  • 38: 36b5c88 = 176: cb1cc43 sequencer: avoid progress when stderr is redirected

  • 177: aae1df5 = 177: 93a99d9 sparse: add vfs-specific precautions

  • 178: 2ea3542 = 178: 374a819 reset: fix mixed reset when using virtual filesystem

  • 179: a61fea6 = 179: 70ad077 sparse-index: add ensure_full_index_with_reason()

  • 180: 21e693d = 180: 300a559 treewide: add reasons for expanding index

  • 181: 206c1f2 = 181: 02c2e60 treewide: custom reasons for expanding index

  • 182: acebdc8 = 182: c401da5 sparse-index: add macro for unaudited expansions

  • 183: 1d7f316 = 183: c6fca97 Docs: update sparse index plan with logging

  • 184: 36a2298 = 184: 290b6f9 sparse-index: log failure to clear skip-worktree

  • 185: 8b5f098 = 185: bc4ce68 stash: use -f in checkout-index child process

  • 186: 3002e36 = 186: 1840141 sparse-index: do not copy hashtables during expansion

  • 187: a150f4e = 187: f67226f path-walk: add new 'edge_aggressive' option

  • 188: 03c78b8 = 188: ab6be34 pack-objects: allow --shallow and --path-walk

  • 189: 5a56826 = 189: d38ae8e t5538: add test to confirm deltas in shallow pushes

  • 190: c75d9be = 190: 4af3081 sub-process: avoid leaking cmd

  • 191: c47c7f4 = 191: 39cb72a remote-curl: release filter options before re-setting them

  • 192: a76cc89 = 192: 4d937ce transport: release object filter options

  • 193: fdc61fa = 193: 6966dc4 mingw: special-case administrators even more

  • 194: 330f1ad = 194: f9b031f test-tool path-utils: support debugging "dubious ownership" issues

  • 195: b3395cd = 195: dd6e30c push: don't reuse deltas with path walk

  • 196: 3ebdad8 = 196: 98f5e54 t7900-maintenance.sh: reset config between tests

  • 197: d6e9bb8 = 197: 4a802e7 maintenance: add cache-local-objects maintenance task

  • 198: e568e06 = 198: 5a738b0 scalar.c: add cache-local-objects task

  • 199: 25ca8ce < -: ----------- fixup! scalar: do initialize gvfs.sharedCache

@mjcheetham
Copy link
Member

  • 8: a506ee6 ! 8: 8993408 survey: show some commits/trees/blobs histograms

    @@ builtin/survey.c: static void increment_totals(struct survey_context *ctx,
     +				struct survey_stats_trees *pst = &ctx->report.reachable_objects.trees;
     +				struct tree_desc desc;
     +				struct name_entry entry;
    -+				int nr_entries;
    ++				uint64_t nr_entries;
     +				int qb;
     +
     +				parse_tree(tree);

Noticed this commit didn't compile due to the incompatible types being compared in survey.c:

builtin/survey.c: In function 'increment_totals':
builtin/survey.c:1091:48: error: comparison of integer expressions of different signedness: 'int' and 'uint64_t' {aka 'long long unsigned int'} [-Werror=sign-compare]
1091 |                                 if (nr_entries > pst->max_entries)
     |                                                ^

Fixes to WinGet workflow


  • 155: e590557 ! 154: 78f7613 scalar: do initialize gvfs.sharedCache

    @@ scalar.c: void load_builtin_commands(const char *prefix UNUSED,
     +{
     +	struct strbuf buf = STRBUF_INIT;
     +	int res = 0;
    -+	char *cache_key = NULL, *shared_cache_path = NULL;
    ++	char *cache_key = NULL, *shared_cache_path = NULL, *alternates = NULL;
     +
     +	if (!(cache_key = get_cache_key(url))) {
     +		res = error(_("could not determine cache key for '%s'"), url);
    @@ scalar.c: void load_builtin_commands(const char *prefix UNUSED,
     +		goto cleanup;
     +	}
     +
    -+	write_file(repo_git_path(the_repository, "objects/info/alternates"),
    -+		   "%s\n", shared_cache_path);
    ++	alternates = repo_git_path(the_repository, "objects/info/alternates");
    ++	write_file(alternates, "%s\n", shared_cache_path);
     +
     +	cleanup:
     +	strbuf_release(&buf);
     +	free(shared_cache_path);
     +	free(cache_key);
    ++	free(alternates);
     +	return res;
     +}
     +

@dscho's fix from the last iteration.

Copy link
Member Author

@dscho dscho left a comment

Choose a reason for hiding this comment

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

Classic:

image

@dscho
Copy link
Member Author

dscho commented Mar 17, 2025

For the record: I approve!

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.

Approving the latest rebase to 2.49.0 final o.b.o. @dscho, who created this PR originally for the rc0 rebase.

@dscho dscho changed the title [DO NOT MERGE YET] Rebase to v2.49.0 Rebase to v2.49.0 Mar 17, 2025
@dscho dscho marked this pull request as ready for review March 17, 2025 14:18
@mjcheetham mjcheetham merged commit 4829785 into vfs-2.49.0 Mar 17, 2025
154 checks passed
@mjcheetham mjcheetham deleted the tentative/vfs-2.49.0 branch March 17, 2025 15:35
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.