Skip to content

Rebase onto Git for Windows v2.53.0.windows.1#857

Merged
dscho merged 295 commits intovfs-2.53.0from
tentative/vfs-2.53.0
Feb 3, 2026
Merged

Rebase onto Git for Windows v2.53.0.windows.1#857
dscho merged 295 commits intovfs-2.53.0from
tentative/vfs-2.53.0

Conversation

@dscho
Copy link
Member

@dscho dscho commented Feb 3, 2026

This PR rebases Microsoft Git patches onto Git for Windows v2.53.0.windows.1.

Previous base: microsoft/vfs-2.53.0-rc2

Range-diff vs microsoft/vfs-2.53.0-rc2
  • 1: 287b140 = 1: 4f9ffee sparse-index.c: fix use of index hashes in expand_index
  • 2: f7bc717 = 2: c058963 t5300: confirm failure of git index-pack when non-idx suffix requested
  • 3: 10c4edd = 3: d3269ef t: remove advice from some tests
  • 4: b584c12 = 4: 44d08ad t1092: add test for untracked files and directories
  • 5: 2f7cc89 = 5: 7281f11 index-pack: disable rev-index if index file has non .idx suffix
  • 7: ab5e1ca = 6: 6a78411 survey: calculate more stats on refs
  • 8: 7478ed0 ! 7: e559784 survey: show some commits/trees/blobs histograms
    @@ builtin/survey.c: struct survey_report_ref_summary {
     +	uint32_t cnt_cached;   /* see oi.whence */
     +	uint32_t cnt_loose;    /* see oi.whence */
     +	uint32_t cnt_packed;   /* see oi.whence */
    -+	uint32_t cnt_dbcached; /* see oi.whence */
     +
     +	uint64_t sum_size; /* sum(object_size) */
     +	uint64_t sum_disk_size; /* sum(disk_size) */
    @@ builtin/survey.c: static void increment_totals(struct survey_context *ctx,
     +			ctx->report.reachable_objects.commits.parent_cnt_pbin[k]++;
     +			base = &ctx->report.reachable_objects.commits.base;
     +			break;
    - 		}
    ++		}
     +		case OBJ_TREE: {
     +			struct tree *tree = lookup_tree(ctx->repo, &oids->oid[i]);
     +			if (tree) {
    @@ builtin/survey.c: static void increment_totals(struct survey_context *ctx,
     +				uint64_t nr_entries;
     +				int qb;
     +
    -+				parse_tree(tree);
    ++				repo_parse_tree(the_repository, tree);
     +				init_tree_desc(&desc, &oids->oid[i], tree->buffer, tree->size);
     +				nr_entries = 0;
     +				while (tree_entry(&desc, &entry))
    @@ builtin/survey.c: static void increment_totals(struct survey_context *ctx,
     +		case OI_PACKED:
     +			base->cnt_packed++;
     +			break;
    -+		case OI_DBCACHED:
    -+			base->cnt_dbcached++;
    -+			break;
     +		default:
     +			break;
    -+		}
    + 		}
     +
     +		base->sum_size += object_length;
     +		base->sum_disk_size += disk_sizep;
  • 9: 7260196 = 8: c324b30 survey: add vector of largest objects for various scaling dimensions
  • 10: be8c29d = 9: 424138b survey: add pathname of blob or tree to large_item_vec
  • 11: 418905e = 10: 90b54b5 survey: add commit-oid to large_item detail
  • 6: f9930c2 = 11: f3a4f77 trace2: prefetch value of GIT_TRACE2_DST_DEBUG at startup
  • 12: d5bd1e3 = 12: 4c75e0b survey: add commit name-rev lookup to each large_item
  • 13: b588699 = 13: 93148be survey: add --no-name-rev option
  • 14: 20d39e0 = 14: 3e76b34 survey: started TODO list at bottom of source file
  • 15: f0e8e45 = 15: 9f706da survey: expanded TODO list at the bottom of the source file
  • 16: b945c00 = 16: 9446142 survey: expanded TODO with more notes
  • 17: 6d27cc6 = 17: e030c0e reset --stdin: trim carriage return from the paths
  • 18: 2f8a0a7 ! 18: 66e909e Identify microsoft/git via a distinct version suffix
    @@ Commit message
      ## GIT-VERSION-GEN ##
     @@
      
    - DEF_VER=v2.53.0-rc2
    + DEF_VER=v2.53.0
      
     +# Identify microsoft/git via a distinct version suffix
     +DEF_VER=$DEF_VER.vfs.0.0
  • 19: 93aa0a5 = 19: 96ee9e4 gvfs: ensure that the version is based on a GVFS tag
  • 20: cf0ffd0 = 20: c5d5b7e gvfs: add a GVFS-specific header file
  • 21: 55a5071 = 21: 54c3608 gvfs: add the core.gvfs config setting
  • 22: 957850b = 22: 5103fd4 gvfs: add the feature to skip writing the index' SHA-1
  • 23: d35f852 = 23: 26e5606 gvfs: add the feature that blobs may be missing
  • 24: 8825b93 = 24: 6ac9835 gvfs: prevent files to be deleted outside the sparse checkout
  • 25: 8c39e21 = 25: acaf7ff gvfs: optionally skip reachability checks/upload pack during fetch
  • 26: 55ebc44 = 26: 10b1501 gvfs: ensure all filters and EOL conversions are blocked
  • 27: 5a63e35 = 27: fc79044 gvfs: allow "virtualizing" objects
  • 28: 11e3dda = 28: 7edf0e8 Hydrate missing loose objects in check_and_freshen()
  • 29: fce7f0f = 29: 3743bcd sha1_file: when writing objects, skip the read_object_hook
  • 30: 869c011 = 30: 860f9bc gvfs: add global command pre and post hook procs
  • 31: 20c7ea2 = 31: 951d38a t0400: verify that the hook is called correctly from a subdirectory
  • 32: ac7fb9d = 32: 08520ae t0400: verify core.hooksPath is respected by pre-command
  • 33: 90230b8 = 33: a89247b Pass PID of git process to hooks.
  • 34: ba09f4a = 34: 61f990b sparse-checkout: make sure to update files with a modify/delete conflict
  • 35: d9307ff = 35: 7fcfdaa worktree: allow in Scalar repositories
  • 36: a60d031 = 36: b3a9cca sparse-checkout: avoid writing entries with the skip-worktree bit
  • 37: 312f99b = 37: d85d8f4 Do not remove files outside the sparse-checkout
  • 38: 4495061 = 38: ebaad6e send-pack: do not check for sha1 file when GVFS_MISSING_OK set
  • 39: 55879bc = 39: db181ef gvfs: allow corrupt objects to be re-downloaded
  • 40: d9ec870 = 40: bd61a92 cache-tree: remove use of strbuf_addf in update_one
  • 41: 46429bb = 41: 573b59d gvfs: block unsupported commands when running in a GVFS repo
  • 42: f8cdb0d = 42: 7badf14 gvfs: allow overriding core.gvfs
  • 43: 0777d10 = 43: 7572429 BRANCHES.md: Add explanation of branches and using forks
  • 44: c3cd018 = 44: d72a479 git.c: add VFS enabled cmd blocking
  • 45: b838900 = 45: 93e7dd8 git.c: permit repack cmd in Scalar repos
  • 47: 076bfb4 = 46: b41a99f git.c: permit fsck cmd in Scalar repos
  • 49: 539650e = 47: d81bbf5 git.c: permit prune cmd in Scalar repos
  • 51: aa42f6d = 48: a9061a8 worktree: remove special case GVFS cmd blocking
  • 53: 45aedb9 = 49: 92421c0 builtin/repack.c: emit warning when shared cache is present
  • 46: a1809c9 = 50: 4b9a737 Add virtual file system settings and hook proc
  • 48: 28e3963 = 51: 4c0a6f2 virtualfilesystem: don't run the virtual file system hook if the index has been redirected
  • 50: 06991f9 = 52: b65bd6c virtualfilesystem: check if directory is included
  • 52: d809a0e = 53: 8ab7bab backwards-compatibility: support the post-indexchanged hook
  • 54: f677f85 = 54: 0d9b9fd gvfs: verify that the built-in FSMonitor is disabled
  • 55: 102b290 = 55: 1978fb1 wt-status: add trace2 data for sparse-checkout percentage
  • 56: c404233 = 56: 8be878f status: add status serialization mechanism
  • 57: a88fb44 = 57: 8e8f2d9 Teach ahead-behind and serialized status to play nicely together
  • 58: ef4a47e = 58: 0bce4cb status: serialize to path
  • 59: 14d6835 = 59: 52111d2 status: reject deserialize in V2 and conflicts
  • 60: 3cf9f3a = 60: e1f48ab serialize-status: serialize global and repo-local exclude file metadata
  • 61: 51b0b3c = 61: 93bb8bf status: deserialization wait
  • 62: 8de3f09 = 62: afe608f status: deserialize with -uno does not print correct hint
  • 63: f64178d = 63: 3dd264a fsmonitor: check CE_FSMONITOR_VALID in ce_uptodate
  • 64: 3c9a9fe = 64: ec49af2 fsmonitor: add script for debugging and update script for tests
  • 65: b0393b5 = 65: a925cc4 status: disable deserialize when verbose output requested.
  • 66: 4d1fa93 = 66: 05c497d t7524: add test for verbose status deserialzation
  • 67: f07afe3 = 67: d58fea7 deserialize-status: silently fallback if we cannot read cache file
  • 68: 9c6145e = 68: 0bca058 gvfs:trace2:data: add trace2 tracing around read_object_process
  • 69: 18447c9 = 69: c4a94ff gvfs:trace2:data: status deserialization information
  • 70: 6c407c8 = 70: 06946b1 gvfs:trace2:data: status serialization
  • 71: 8a4bbe6 = 71: 7b39090 gvfs:trace2:data: add vfs stats
  • 72: 14ad3bb = 72: 1eeb414 trace2: refactor setting process starting time
  • 73: e39f660 = 73: de029a9 trace2:gvfs:experiment: clear_ce_flags_1
  • 74: af3915e = 74: e63f8b4 trace2:gvfs:experiment: report_tracking
  • 75: 28d4cb6 = 75: a2fb779 trace2:gvfs:experiment: read_cache: annotate thread usage in read-cache
  • 76: 78e47e4 = 76: 3f1b032 trace2:gvfs:experiment: read-cache: time read/write of cache-tree extension
  • 77: ecc29fd = 77: ce811d2 trace2:gvfs:experiment: add region to apply_virtualfilesystem()
  • 78: 13fe317 = 78: 0577e2d trace2:gvfs:experiment: add region around unpack_trees()
  • 79: 37cd5e3 = 79: 40fdd38 trace2:gvfs:experiment: add region to cache_tree_fully_valid()
  • 80: 58855f4 = 80: 4542ccb trace2:gvfs:experiment: add unpack_entry() counter to unpack_trees() and report_tracking()
  • 81: d2135ae = 81: f735787 trace2:gvfs:experiment: increase default event depth for unpack-tree data
  • 82: 3306ad6 = 82: 0883908 trace2:gvfs:experiment: add data for check_updates() in unpack_trees()
  • 83: c7963ca = 83: 9b04c50 Trace2:gvfs:experiment: capture more 'tracking' details
  • 84: f464c96 = 84: 583b60e credential: set trace2_child_class for credential manager children
  • 85: 747dbe7 = 85: ad8a88e sub-process: do not borrow cmd pointer from caller
  • 86: 202eb12 = 86: 969b74d sub-process: add subprocess_start_argv()
  • 87: 25a80f3 = 87: 27da8d7 sha1-file: add function to update existing loose object cache
  • 88: 84a1cf8 = 88: b28be78 index-pack: avoid immediate object fetch while parsing packfile
  • 89: f568365 ! 89: 900a62d gvfs-helper: create tool to fetch objects using the GVFS Protocol
    @@ gvfs-helper-client.c (new)
     +	}
     +
     +	if (ghc & GHC__CREATED__PACKFILE)
    -+		packfile_store_reprepare(the_repository->objects->packfiles);
    ++		packfile_store_reprepare(gh_client__chosen_odb->packfiles);
     +
     +	*p_ghc = ghc;
     +
  • 90: 2721f5d = 90: 686c143 sha1-file: create shared-cache directory if it doesn't exist
  • 91: 4c7dfe3 = 91: 0705607 gvfs-helper: better handling of network errors
  • 92: 02b8b7b = 92: 90b03f6 gvfs-helper-client: properly update loose cache with fetched OID
  • 93: 3f83022 = 93: 38eee73 gvfs-helper: V2 robust retry and throttling
  • 94: f48e37b = 94: 7d50682 gvfs-helper: expose gvfs/objects GET and POST semantics
  • 95: 8197c00 = 95: b800370 gvfs-helper: dramatically reduce progress noise
  • 96: d41f5b1 = 96: a6bb85e gvfs-helper: handle pack-file after single POST request
  • 97: 45b34e2 = 97: cd89ff3 test-gvfs-prococol, t5799: tests for gvfs-helper
  • 98: 3867abe = 98: a3ef679 gvfs-helper: move result-list construction into install functions
  • 99: e74c6fa = 99: ebd1cf3 t5799: add support for POST to return either a loose object or packfile
  • 100: d340c76 = 100: 9b77529 t5799: cleanup wc-l and grep-c lines
  • 101: 49d9dc2 = 101: ee96bd3 gvfs-helper: verify loose objects after write
  • 102: ddd89f1 = 102: f72fbdc t7599: create corrupt blob test
  • 103: a25a20f ! 103: 63b0411 gvfs-helper: add prefetch support
    @@ gvfs-helper-client.c: static int gh_client__objects__receive_response(
      
      		else if (starts_with(line, "ok"))
     @@ gvfs-helper-client.c: static int gh_client__objects__receive_response(
    - 		packfile_store_reprepare(the_repository->objects->packfiles);
    + 		packfile_store_reprepare(gh_client__chosen_odb->packfiles);
      
      	*p_ghc = ghc;
     +	*p_nr_loose = nr_loose;
  • 104: 8a0fc3a = 104: 58be5dc gvfs-helper: add prefetch .keep file for last packfile
  • 105: db5d5a6 = 105: bc74155 gvfs-helper: do one read in my_copy_fd_len_tail()
  • 106: 9bb476f = 106: 103c70e gvfs-helper: move content-type warning for prefetch packs
  • 107: 894c802 = 107: 7072a36 fetch: use gvfs-helper prefetch under config
  • 108: df05ece = 108: 9ef34ba gvfs-helper: better support for concurrent packfile fetches
  • 109: dd864af = 109: cf9f5c7 remote-curl: do not call fetch-pack when using gvfs-helper
  • 110: 041a862 = 110: e0d9e41 fetch: reprepare packs before checking connectivity
  • 111: a7a1f29 = 111: 9e0844f gvfs-helper: retry when creating temp files
  • 112: 3e4ec70 = 112: 0fe791e sparse: avoid warnings about known cURL issues in gvfs-helper.c
  • 113: f484e21 = 113: 4d514b4 gvfs-helper: add --max-retries to prefetch verb
  • 114: e8eced7 = 114: 6330851 t5799: add tests to detect corrupt pack/idx files in prefetch
  • 115: 1bf08c6 = 115: 0fa8b93 gvfs-helper: ignore .idx files in prefetch multi-part responses
  • 120: 34a9f60 = 116: 9bc205f t5799: explicitly test gvfs-helper --fallback and --no-fallback
  • 122: d9f2fe4 = 117: 913db62 gvfs-helper: don't fallback with new config
  • 116: f605b55 = 118: a61d31f maintenance: care about gvfs.sharedCache config
  • 124: 6965495 = 119: 648d749 test-gvfs-protocol: add cache_http_503 to mayhem
  • 117: 31f2fd3 = 120: 3ea9961 unpack-trees:virtualfilesystem: Improve efficiency of clear_ce_flags
  • 126: 3a3b909 = 121: 12a2346 t5799: add unit tests for new gvfs.fallback config setting
  • 118: 3c152c5 = 122: cb29337 homebrew: add GitHub workflow to release Cask
  • 119: 858f856 = 123: 714810b Adding winget workflows
  • 121: a8ca7bf = 124: 7ca62ec Disable the monitor-components workflow in msft-git
  • 123: 3f172a1 = 125: 23ec5ff .github: enable windows builds on microsoft fork
  • 125: a58dc4b = 126: 457ad6e .github/actions/akv-secret: add action to get secrets
  • 127: a44e908 = 127: 18be22b release: create initial Windows installer build workflow
  • 128: f8ecb62 = 128: 1f4b781 release: create initial Windows installer build workflow
  • 129: 9b28aa1 = 129: 4da14e0 help: special-case HOST_CPU universal
  • 130: 7aa42d6 ! 130: 1df2c14 release: add Mac OSX installer build
    @@ .github/workflows/build-git-installers.yml: jobs:
     +          brew link --force gettext
     +
     +          # Make universal gettext library
    ++          # Note: libintl depends on iconv, but we use the system's libiconv
    ++          # which is already universal, rather than Homebrew's libiconv which
    ++          # has different symbol names (_libiconv vs _iconv)
     +          lipo -create -output libintl.a /usr/local/opt/gettext/lib/libintl.a /opt/homebrew/opt/gettext/lib/libintl.a
     +
     +      - name: Log in to Azure
    @@ .github/workflows/build-git-installers.yml: jobs:
     +          # used in 'git version --build-options'.  We'll fix that in code.
     +          HOST_CPU = universal
     +          BASIC_CFLAGS += -arch arm64 -arch x86_64
    ++
    ++          # macOS uses Apple Common Crypto instead of OpenSSL. The main Makefile
    ++          # sets NO_OPENSSL and adds -DNO_OPENSSL to BASIC_CFLAGS, but contrib
    ++          # Makefiles that only include config.mak* don't get this logic.
    ++          BASIC_CFLAGS += -DNO_OPENSSL
    ++
    ++          # CRITICAL FIX: Disable USE_HOMEBREW_LIBICONV
    ++          # On Darwin 24+ (macOS 15), config.mak.uname sets USE_HOMEBREW_LIBICONV
    ++          # which causes ICONVDIR to point to Homebrew's libiconv. But Homebrew's
    ++          # libiconv exports _libiconv/_libiconv_open symbols (with prefix), while
    ++          # Homebrew's gettext/libintl was built against system iconv which uses
    ++          # _iconv/_iconv_open symbols (no prefix). We must use the system's
    ++          # /usr/lib/libiconv.dylib which is universal and has the correct symbols.
    ++          USE_HOMEBREW_LIBICONV =
    ++          ICONVDIR =
     +          EOF
     +
    -+          # Configure the Git build to pick up gettext
    ++          # Configure the Git build to find our universal libintl.a
     +          homebrew_prefix="$(brew --prefix)"
     +          cat >>git/config.mak <<EOF
     +          CFLAGS = -I$homebrew_prefix/include -I/usr/local/opt/gettext/include
  • 131: f49a8d2 = 131: 9ef091e release: build unsigned Ubuntu .deb package
  • 132: d4cb43c = 132: 131dd46 release: add signing step for .deb package
  • 133: f2bf6d0 = 133: 1c43f40 release: create draft GitHub release with packages & installers
  • 134: 392f5af = 134: 2cbf875 build-git-installers: publish gpg public key
  • 135: 432985a = 135: 35d8e8a release: continue pestering until user upgrades
  • 136: 6c5ade5 = 136: b5dae6f dist: archive HEAD instead of HEAD^{tree}
  • 138: 114d56b = 137: 66323f5 update-microsoft-git: create barebones builtin
  • 140: 2b52fbf = 138: 77952d0 update-microsoft-git: Windows implementation
  • 141: 8108b8f = 139: e6d7504 update-microsoft-git: use brew on macOS
  • 137: c663d2b = 140: 2c81ede release: include GIT_BUILT_FROM_COMMIT in MacOS build
  • 142: 630799e = 141: 0b5116c .github: reinstate ISSUE_TEMPLATE.md for microsoft/git
  • 139: cc450ba = 142: 44f941d release: add installer validation
  • 144: 36ea383 = 143: e6be121 .github: update PULL_REQUEST_TEMPLATE.md
  • 143: 76d846d = 144: a1c2d97 git_config_set_multivar_in_file_gently(): add a lock timeout
  • 146: 8475a1a = 145: af07101 Adjust README.md for microsoft/git
  • 145: 0b3e1dc = 146: 5d365c1 scalar: set the config write-lock timeout to 150ms
  • 147: b38dcaa = 147: c5f7c06 scalar: add docs from microsoft/scalar
  • 148: 2501a2f = 148: aac2f83 scalar (Windows): use forward slashes as directory separators
  • 149: 6aba9c6 = 149: 8e2be68 scalar: add retry logic to run_git()
  • 150: 506338d = 150: 9a7aad4 scalar: support the config command for backwards compatibility
  • 151: 4aaf2c8 = 151: 2769593 scalar: implement a minimal JSON parser
  • 152: a518291 = 152: fdf79eb scalar clone: support GVFS-enabled remote repositories
  • 153: dcfc26f = 153: 1627ebd test-gvfs-protocol: also serve smart protocol
  • 154: 1557a88 = 154: 261da1d gvfs-helper: add the endpoint command
  • 155: e9cf9fe = 155: 12cf4a8 dir_inside_of(): handle directory separators correctly
  • 156: 5bc9660 = 156: 0a3ef43 scalar: disable authentication in unattended mode
  • 157: 8fa5c4b = 157: 79eee6c abspath: make strip_last_path_component() global
  • 158: 58c18f0 = 158: 95f6307 scalar: do initialize gvfs.sharedCache
  • 159: 3594818 = 159: 764999d scalar diagnose: include shared cache info
  • 160: c7d2788 = 160: 781d294 scalar: only try GVFS protocol on https:// URLs
  • 161: da1c21e = 161: 51df85b scalar: verify that we can use a GVFS-enabled repository
  • 162: 33d848e = 162: 46228b9 scalar: add the cache-server command
  • 163: b59e6e4 = 163: e76c2d9 scalar: add a test toggle to skip accessing the vsts/info endpoint
  • 164: a364f97 = 164: 9c9f798 scalar: adjust documentation to the microsoft/git fork
  • 165: 654295f = 165: 0444d3b scalar: enable untracked cache unconditionally
  • 166: d1b851c = 166: f4641dd scalar: parse clone --no-fetch-commits-and-trees for backwards compatibility
  • 167: 85470de = 167: 4379e5e scalar: make GVFS Protocol a forced choice
  • 168: 35b500f = 168: fa45836 scalar: work around GVFS Protocol HTTP/2 failures
  • 169: 4efa8d3 = 169: 95c1d1b gvfs-helper-client: clean up server process(es)
  • 170: 79b5c9d = 170: 9d33577 scalar diagnose: accommodate Scalar's Functional Tests
  • 171: d28db13 = 171: 57e4a13 ci: run Scalar's Functional Tests
  • 172: fc66968 = 172: 0efd951 scalar: upgrade to newest FSMonitor config setting
  • 173: 38ad2ca = 173: a68c75e add/rm: allow adding sparse entries when virtual
  • 174: 2585d17 = 174: 86609c6 sparse-checkout: add config to disable deleting dirs
  • 175: 85a1e85 = 175: e698b79 diff: ignore sparse paths in diffstat
  • 176: a4f3726 = 176: f99893a repo-settings: enable sparse index by default
  • 177: b2d89d9 = 177: db4acb8 TO-UPSTREAM: sequencer: avoid progress when stderr is redirected
  • 178: 5f089a6 = 178: 02834b5 TO-CHECK: t1092: use quiet mode for rebase tests
  • 179: f187773 = 179: 8a3e7b4 reset: fix mixed reset when using virtual filesystem
  • 180: 2221835 = 180: 36d0aa5 diff(sparse-index): verify with partially-sparse
  • 181: f146197 = 181: 60bdf7d stash: expand testing for git stash -u
  • 182: f63ec09 = 182: f8b5487 sparse-index: add ensure_full_index_with_reason()
  • 183: f099f88 = 183: 369f7f5 treewide: add reasons for expanding index
  • 184: 3f3773d = 184: 2519de3 treewide: custom reasons for expanding index
  • 185: 7e36266 = 185: 0c25a6b sparse-index: add macro for unaudited expansions
  • 186: 6191124 = 186: cc8049f Docs: update sparse index plan with logging
  • 187: af75845 = 187: a2eda56 sparse-index: log failure to clear skip-worktree
  • 188: 3884e23 = 188: 316de89 stash: use -f in checkout-index child process
  • 189: 5e08810 = 189: 5c7a96f sparse-index: do not copy hashtables during expansion
  • 190: 3411953 = 190: a241515 TO-UPSTREAM: sub-process: avoid leaking cmd
  • 191: be27b55 = 191: 99f551a remote-curl: release filter options before re-setting them
  • 192: e3faca6 = 192: 4692c6d transport: release object filter options
  • 193: 669d7bb = 193: 96b2790 push: don't reuse deltas with path walk
  • 194: 95626c2 = 194: 28db31c t7900-maintenance.sh: reset config between tests
  • 195: 738235d = 195: 00de5cb maintenance: add cache-local-objects maintenance task
  • 196: 5de8f7c = 196: d0ac132 scalar.c: add cache-local-objects task
  • 197: cf85069 = 197: ebd3869 hooks: add custom post-command hook config
  • 198: 2e84a0d = 198: ffad07d TO-UPSTREAM: Docs: fix asciidoc failures from short delimiters
  • 199: 6d67873 = 199: 588c42e hooks: make hook logic memory-leak free
  • 200: 709140b = 200: e6b8abf t0401: test post-command for alias, version, typo
  • 201: 9e80003 = 201: ff6b592 hooks: better handle config without gitdir
  • 204: e912d6b = 202: dafc4cd cat_one_file(): make it easy to see that the size variable is initialized
  • 206: 09d3fc2 = 203: 1329aeb fsck: avoid using an uninitialized variable
  • 208: 3f37fcd = 204: 0dd3e02 load_revindex_from_disk(): avoid accessing uninitialized data
  • 210: 238a4e4 = 205: 68494b4 load_pack_mtimes_file(): avoid accessing uninitialized data
  • 202: 483b184 = 206: 6eadd6e revision: defensive programming
  • 203: a57d447 = 207: c82f4a3 get_parent(): defensive programming
  • 205: 5ccc3cf = 208: 2426e8b fetch-pack: defensive programming
  • 207: efec9ef = 209: ef84940 unparse_commit(): defensive programming
  • 209: 5f361b2 = 210: 550f9b3 verify_commit_graph(): defensive programming
  • 211: 8be04cc = 211: 718b8b9 stash: defensive programming
  • 212: b3505d2 = 212: 662fdec stash: defensive programming
  • 213: cb4acd4 = 213: ed47d80 fetch: silence a CodeQL alert about a local variable's address' use after release
  • 214: f3e3f90 = 214: 2ffee54 push: defensive programming
  • 215: 8e32166 = 215: d8809ba test-tool repository: check return value of lookup_commit()
  • 216: 0fe4bb0 = 216: 6dc2a93 fetch: defensive programming
  • 217: 07aecb8 = 217: 5a9d50d shallow: handle missing shallow commits gracefully
  • 220: 2cf4f63 = 218: cebcbfc codeql: run static analysis as part of CI builds
  • 218: bd178dd = 219: acde930 inherit_tracking(): defensive programming
  • 219: e372b99 = 220: 9c204b6 commit-graph: suppress warning about using a stale stack addresses
  • 221: 1331123 = 221: 11fd31a codeql: publish the sarif file as build artifact
  • 222: 9ebb7a9 = 222: 2ac46c5 codeql: disable a couple of non-critical queries for now
  • 223: 0ff3a58 = 223: e9aec80 date: help CodeQL understand that there are no leap-year issues here
  • 224: 4f89b2e = 224: ff0fd27 help: help CodeQL understand that consuming envvars is okay here
  • 225: d496770 = 225: 930579c ctype: help CodeQL understand that sane_istest() does not access array past end
  • 226: b29df46 = 226: e445330 ctype: accommodate for CodeQL misinterpreting the z in mallocz()
  • 227: c8d2435 = 227: 1170a79 strbuf_read: help with CodeQL misunderstanding that strbuf_read() does NUL-terminate correctly
  • 228: 5b8adbb = 228: aecb7c5 codeql: also check JavaScript code
  • 229: 8124d81 = 229: f9bf282 scalar: add run_git_argv
  • 230: efadafd = 230: 1fd99c3 scalar: add --ref-format option to scalar clone
  • 231: 55e099a = 231: 18e4fd8 gvfs-helper: skip collision check for loose objects
  • 232: 9cfde1b = 232: 58ebe08 gvfs-helper: emit advice on transient errors
  • 233: 7667f5b = 233: f179d71 gvfs-helper: avoid collision check for packfiles
  • 234: d283e10 = 234: 9b41a6e t5799: update cache-server methods for multiple instances
  • 235: ab32e6b = 235: 1116f7b gvfs-helper: override cache server for prefetch
  • 236: 63bcfa8 = 236: 155adac gvfs-helper: override cache server for get
  • 237: 5cef3e7 = 237: 57fe86e gvfs-helper: override cache server for post
  • 238: ea2de83 = 238: f04bd03 t5799: add test for all verb-specific cache-servers together
  • 239: 8587d22 = 239: c8ce832 lib-gvfs-helper: create helper script for protocol tests
  • 240: 26bae0e = 240: ba07d09 t579*: split t5799 into several parts
  • 241: e7d356e < -: ------------ fixup! survey: show some commits/trees/blobs histograms
  • 242: 0806908 < -: ------------ fixup! gvfs-helper: create tool to fetch objects using the GVFS Protocol
  • 243: aca4543 < -: ------------ fixup! gvfs-helper: create tool to fetch objects using the GVFS Protocol
  • 244: 1e62bbc < -: ------------ fixup! release: add Mac OSX installer build
  • 245: 8b6ecf8 = 241: 8e9ac3d osxkeychain: always apply required build flags
  • 246: 1443abd < -: ------------ fixup! release: add Mac OSX installer build
  • 247: 2cef3d6 < -: ------------ fixup! survey: show some commits/trees/blobs histograms

Kevin Willford and others added 30 commits February 2, 2026 21:49
String formatting can be a performance issue when there are
hundreds of thousands of trees.

Change to stop using the strbuf_addf and just add the strings
or characters individually.

There are a limited number of modes so added a switch for the
known ones and a default case if something comes through that
are not a known one for git.

In one scenario regarding a huge worktree, this reduces the
time required for a `git checkout <branch>` from 44 seconds
to 38 seconds, i.e. it is a non-negligible performance
improvement.

Signed-off-by: Kevin Willford <kewillf@microsoft.com>
The following commands and options are not currently supported when working
in a GVFS repo.  Add code to detect and block these commands from executing.

1) fsck
2) gc
4) prune
5) repack
6) submodule
8) update-index --split-index
9) update-index --index-version (other than 4)
10) update-index --[no-]skip-worktree
11) worktree

Signed-off-by: Ben Peart <benpeart@microsoft.com>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
In earlier versions of `microsoft/git`, we found a user who had set
`core.gvfs = false` in their global config. This should not have been
necessary, but it also should not have caused a problem. However, it
did.

The reason was that `gvfs_load_config_value()` was called from
`config.c` when reading config key/value pairs from all the config
files. The local config should override the global config, and this is
done by `config.c` reading the global config first then reading the
local config. However, our logic only allowed writing the `core_gvfs`
variable once.

In v2.51.0, we had to adapt to upstream changes that changed way the
`core.gvfs` config value is read, and the special handling is no longer
necessary, yet we still want the test case that ensures that this bug
does not experience a regression.

Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
Add the ability to block built-in commands based on if the `core.gvfs`
setting has the `GVFS_USE_VIRTUAL_FILESYSTEM` bit set. This allows us
to selectively block commands that use the GVFS protocol, but don't use
VFS for Git (for example repos cloned via `scalar clone` against Azure
DevOps).

Signed-off-by: Matthew John Cheetham <mjcheetham@outlook.com>
Loosen the blocking of the `repack` command from all "GVFS repos" (those
that have `core.gvfs` set) to only those that actually use the virtual
file system (VFS for Git only). This allows for `repack` to be used in
Scalar clones.

Signed-off-by: Matthew John Cheetham <mjcheetham@outlook.com>
Loosen the blocking of the `fsck` command from all "GVFS repos" (those
that have `core.gvfs` set) to only those that actually use the virtual
file system (VFS for Git only). This allows for `fsck` to be used in
Scalar clones.

Signed-off-by: Matthew John Cheetham <mjcheetham@outlook.com>
Loosen the blocking of the `prune` command from all "GVFS repos" (those
that have `core.gvfs` set) to only those that actually use the virtual
file system (VFS for Git only). This allows for `prune` to be used in
Scalar clones.

Signed-off-by: Matthew John Cheetham <mjcheetham@outlook.com>
Replace the special casing of the `worktree` command being blocked on
VFS-enabled repos with the new `BLOCK_ON_VFS_ENABLED` flag.

Signed-off-by: Matthew John Cheetham <mjcheetham@outlook.com>
Emit a warning message when the `gvfs.sharedCache` option is set that
the `repack` command will not perform repacking on the shared cache.

In the future we can teach `repack` to operate on the shared cache, at
which point we can drop this commit.

Signed-off-by: Matthew John Cheetham <mjcheetham@outlook.com>
On index load, clear/set the skip worktree bits based on the virtual
file system data. Use virtual file system data to update skip-worktree
bit in unpack-trees. Use virtual file system data to exclude files and
folders not explicitly requested.

Update 2022-04-05: disable the "present-despite-SKIP_WORKTREE" file removal
behavior when 'core.virtualfilesystem' is enabled.

Signed-off-by: Ben Peart <benpeart@microsoft.com>
…x has been redirected

Fixes #13

Some git commands spawn helpers and redirect the index to a different
location.  These include "difftool -d" and the sequencer
(i.e. `git rebase -i`, `git cherry-pick` and `git revert`) and others.
In those instances we don't want to update their temporary index with
our virtualization data.

Helped-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Ben Peart <Ben.Peart@microsoft.com>
Add check to see if a directory is included in the virtualfilesystem
before checking the directory hashmap.  This allows a directory entry
like foo/ to find all untracked files in subdirectories.
When our patches to support that hook were upstreamed, the hook's name
was eliciting some reviewer suggestions, and it was renamed to
`post-index-change`. These patches (with the new name) made it into
v2.22.0.

However, VFSforGit users may very well have checkouts with that hook
installed under the original name.

To support this, let's just introduce a hack where we look a bit more
closely when we just failed to find the `post-index-change` hook, and
allow any `post-indexchanged` hook to run instead (if it exists).
Teach STATUS to optionally serialize the results of a
status computation to a file.

Teach STATUS to optionally read an existing serialization
file and simply print the results, rather than actually
scanning.

This is intended for immediate status results on extremely
large repos and assumes the use of a service/daemon to
maintain a fresh current status snapshot.

2021-10-30: packet_read() changed its prototype in ec9a37d (pkt-line.[ch]:
remove unused packet_read_line_buf(), 2021-10-14).

2021-10-30: sscanf() now does an extra check that "%d" goes into an "int"
and complains about "uint32_t". Replacing with "%u" fixes the compile-time
error.

2021-10-30: string_list_init() was removed by abf897b (string-list.[ch]:
remove string_list_init() compatibility function, 2021-09-28), so we need to
initialize manually.

Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
Teach status serialization to take an optional pathname on
the command line to direct that cache data be written there
rather than to stdout.  When used this way, normal status
results will still be written to stdout.

When no path is given, only binary serialization data is
written to stdout.

Usage:
    git status --serialize[=<path>]

Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
When using a virtual file system layer, the FSMonitor does not make
sense.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Teach status deserialize code to reject status cache
when printing in porcelain V2 and there are unresolved
conflicts in the cache file.  A follow-on task might
extend the cache format to include this additiona data.

See code for longer explanation.

Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
When sparse-checkout is enabled, add the sparse-checkout percentage to
the Trace2 data stream.  This number was already computed and printed
on the console in the "You are in a sparse checkout..." message.  It
would be helpful to log it too for performance monitoring.

Signed-off-by: Jeff Hostetler <jeffhostetler@github.com>
Changes to the global or repo-local excludes files can change the
results returned by "git status" for untracked files.  Therefore,
it is important that the exclude-file values used during serialization
are still current at the time of deserialization.

Teach "git status --serialize" to report metadata on the user's global
exclude file (which defaults to "$XDG_HOME/git/ignore") and for the
repo-local excludes file (which is in ".git/info/excludes").  Serialize
will record the pathnames and mtimes for these files in the serialization
header (next to the mtime data for the .git/index file).

Teach "git status --deserialize" to validate this new metadata.  If either
exclude file has changed since the serialization-cache-file was written,
then deserialize will reject the cache file and force a full/normal status
run.

Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
Teach `git status --deserialize` to either wait indefintely
or immediately fail if the status serialization cache file
is stale.

Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
With the "--untracked-files=complete" option status computes a
superset of the untracked files.  We use this when writing the
status cache.  If subsequent deserialize commands ask for either
the complete set or one of the "no", "normal", or "all" subsets,
it can still use the cache file because of filtering in the
deserialize parser.

When running status with the "-uno" option, the long format
status would print a "(use -u to show untracked files)" hint.

When deserializing with the "-uno" option and using a cache computed
with "-ucomplete", the "nothing to commit, working tree clean" message
would be printed instead of the hint.

It was easy to miss because the correct hint message was printed
if the cache was rejected for any reason (and status did the full
fallback).

The "struct wt_status des" structure was initialized with the
content of the status cache (and thus defaulted to "complete").
This change sets "des.show_untracked_files" to the requested
subset from the command-line or config.  This allows the long
format to print the hint.

Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
When using fsmonitor the CE_FSMONITOR_VALID flag should be checked when
wanting to know if the entry has been updated. If the flag is set the
entry should be considered up to date and the same as if the CE_UPTODATE
is set.

In order to trust the CE_FSMONITOR_VALID flag, the fsmonitor data needs to
be refreshed when the fsmonitor bitmap is applied to the index in
tweak_fsmonitor. Since the fsmonitor data is kept up to date for every
command, some tests needed to be updated to take that into account.

istate->untracked->use_fsmonitor was set in tweak_fsmonitor when the
fsmonitor bitmap data was loaded and is now in refresh_fsmonitor since
that is being called in tweak_fsmonitor. refresh_fsmonitor will only be
called once and any other callers should be setting it when refreshing
the fsmonitor data so that code can use the fsmonitor data when checking
untracked files.

When writing the index, fsmonitor_last_update is used to determine if
the fsmonitor bitmap should be created and the extension data written to
the index. When running through unpack-trees this is not copied to the
result index. This makes the next time a git command is ran do all the
work of lstating all files to determine what is clean since all entries
in the index are marked as dirty since there wasn't any fsmonitor data
saved in the index extension.

Copying the fsmonitor_last_update to the result index will cause the
extension data for fsmonitor to be in the index for the next git command
to use.

Signed-off-by: Kevin Willford <Kevin.Willford@microsoft.com>
The fsmonitor script that can be used for running all the git tests
using watchman was causing some of the tests to fail because it wrote
to stderr and created some files for debugging purposes.

Add a new debug script to use with debugging and modify the other script
to remove the code that would cause tests to fail.

Signed-off-by: Kevin Willford <Kevin.Willford@microsoft.com>
Disable deserialization when verbose output requested.

Verbose mode causes Git to print diffs for modified files.
This requires the index to be loaded to have the currently
staged OID values.  Without loading the index, verbose output
make it look like everything was deleted.

Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
Verify that `git status --deserialize=x -v` does not crash and
generates the same output as a normal (scanning) status command.

These issues are described in the previous 2 commits.

Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
Add trace2 region around read_object_process to collect
time spent waiting for missing objects to be dynamically
fetched.

Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
Teach Git to not throw a fatal error when an explicitly-specified
status-cache file (`git status --deserialize=<foo>`) could not be
found or opened for reading and silently fallback to a traditional
scan.

This matches the behavior when the status-cache file is implicitly
given via a config setting.

Note: the current version causes a test to start failing. Mark this as
an expected result for now.

Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
Add trace2 region and data events describing attempts to deserialize
status data using a status cache.

A category:status, label:deserialize region is pushed around the
deserialize code.

Deserialization results when reading from a file are:
    category:status, path   = <path>
    category:status, polled = <number_of_attempts>
    category:status, result = "ok" | "reject"

When reading from STDIN are:
    category:status, path   = "STDIN"
    category:status, result = "ok" | "reject"

Status will fallback and run a normal status scan when a "reject"
is reported (unless "--deserialize-wait=fail").

If "ok" is reported, status was able to use the status cache and
avoid scanning the workdir.

Additionally, a cmd_mode is emitted for each step: collection,
deserialization, and serialization.  For example, if deserialization
is attempted and fails and status falls back to actually computing
the status, a cmd_mode message containing "deserialize" is issued
and then a cmd_mode for "collect" is issued.

Also, if deserialization fails, a data message containing the
rejection reason is emitted.

Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
mjcheetham and others added 16 commits February 2, 2026 21:50
Add the `--ref-format` option to the `scalar clone` command. This will
allow users to opt-in to creating a Scalar repository using alternative
ref storage backends, such as reftable. Example:

  scalar clone --ref-format reftable $URL

Signed-off-by: Matthew John Cheetham <mjcheetham@outlook.com>
Add the `--ref-format` option to the `scalar clone` command. This will allow users to opt-in to creating a Scalar repository using alternative ref storage backends, such as reftable. Example:

```shell
scalar clone --ref-format reftable $URL
```
When we are installing a loose object, finalize_object_file() first
checks to see if the contents match what already exists in a loose
object file of the target name. However, this doesn't check if the
target is valid, it assumes the target is valid.

However, in the case of a power outage or something like that, the file
may be corrupt (for example: all NUL bytes). That is a common occurrence
when we are needing to install a loose object _again_: we don't think we
have it already so any copy that exists is probably bogus.

Use the flagged version with FOF_SKIP_COLLISION_CHECK to avoid these
types of errors, as seen in GitHub issue
#837.

Signed-off-by: Derrick Stolee <stolee@gmail.com>
Users sometimes see transient network errors, but they are actually due
to some other problem within the installation of a packfile. Observed
resolutions include freeing up space on a full disk or deleting the
shared object cache because something was broken due to a file
corruption or power outage.

This change only provides the advice to suggest those workarounds to
help users help themselves.

This is our first advice custom to the microsoft/git fork, so I have
partitioned the key away from the others to avoid adjacent change
conflicts (at least until upstream adds a new change at the end of the
alphabetical list).

We could consider providing a tool that does a more robust check of the
shared object cache, but since 'git fsck' isn't safe to run as it may
download missing objects, we do not have that ability at the moment.

The good news is that it is safe to delete and rebuild the shared object
cache as long as all local branches are pushed. The branches must be
pushed because the local .git/objects/ directory is moved to the shared
object cache in the 'cache-local-objects' maintenance task.

Signed-off-by: Derrick Stolee <stolee@gmail.com>
Similar to a recent change to avoid the collision check for loose
objects, do the same for prefetch packfiles. This should be more rare,
but the same prefetch packfile could be downloaded from the same cache
server so this isn't out of the range of possibility.

Signed-off-by: Derrick Stolee <stolee@gmail.com>
…ed object cache (#840)

There have been a number of customer-reported problems with errors of
the form

```
error: inflate: data stream error (unknown compression method)
error: unable to unpack a163b1302d4729ebdb0a12d3876ca5bca4e1a8c3 header
error: files 'D:/.scalarCache/id_49b0c9f4-555f-4624-8157-a57e6df513b3/pack/tempPacks/t-20260106-014520-049919-0001.temp' and 'D:/.scalarCache/id_49b0c9f4-555f-4624-8157-a57e6df513b3/a1/63b1302d4729ebdb0a12d3876ca5bca4e1a8c3' differ in contents
error: gvfs-helper error: 'could not install loose object 'D:/.scalarCache/id_49b0c9f4-555f-4624-8157-a57e6df513b3/a1/63b1302d4729ebdb0a12d3876ca5bca4e1a8c3': from GET a163b1302d4729ebdb0a12d3876ca5bca4e1a8c3'
```

or 

```
Receiving packfile 1/1 with 1 objects (bytes received): 17367934, done.
Receiving packfile 1/1 with 1 objects [retry 1/6] (bytes received): 17367934, done.
Waiting to retry after network error (sec): 100% (8/8), done.
Receiving packfile 1/1 with 1 objects [retry 2/6] (bytes received): 17367934, done.
Waiting to retry after network error (sec): 100% (16/16), done.
Receiving packfile 1/1 with 1 objects [retry 3/6] (bytes received): 17367934, done.
```

These are not actually due to network issues, but they look like it
based on the stack that is doing retries. Instead, these actually have
problems when installing the loose object or packfile into the shared
object cache.

The loose objects are hitting issues when installing and the target
loose object is corrupt in some way, such as all NUL bytes because the
disk wasn't flushed when the machine shut down. The error results
because we are doing a collision check without confirming that the
existing contents are valid.

The packfiles may be hitting similar comparison cases, but it is less
likely. We update these packfile installations to also skip the
collision check.

In both cases, if we have a transient network error, we add a new advice
message that helps users with the two most common workarounds:

1. Your disk may be full. Make room.
2. Your shared object cache may be corrupt. Push all branches, delete
it, and fetch to refill it.

I make special note of when the shared object cache doesn't exist and
point that it probably should so the whole repo is suspect at that
point.

* [X] This change only applies to interactions with Azure DevOps and the
      GVFS Protocol.

Resolves #837.
In anticipation of tests for multiple cache-servers, update the existing
logic that sets up and tears down cache-servers to allow multiple instances
on different ports.

Signed-off-by: Derrick Stolee <stolee@gmail.com>
This extension of the gvfs.cache-server config now allows a new key,
gvfs.prefetch.cache-server, to override the cache-server URL for only
the prefetch endpoint.

The purpose of this config is to allow for incremental testing and
deployment of new cache-server infrastructure. Hypothetically, we could
have special-purpose cache-servers that are glorified bundle servers and
other servers that focus on the object and size endpoints.

More realistically, this will allow us to test cache servers that have
only the prefetch endpoint ready to go. This allows some incremental
rollout that is more controlled than a flag day replacing the entire
infrastructure.

Signed-off-by: Derrick Stolee <stolee@gmail.com>
This extension of the gvfs.cache-server config now allows a new key,
gvfs.get.cache-server, to override the cache-server URL for only the
prefetch endpoint.

The purpose of this config is to allow for incremental testing and
deployment of new cache-server infrastructure.

Signed-off-by: Derrick Stolee <stolee@gmail.com>
This extension of the gvfs.cache-server config now allows a new key,
gvfs.post.cache-server, to overrid the cache-server URL for only the
batched objects endpoint.

The purpose of this config is to allow for incremental testing and
deployment of new cache-server infrastructure.

Signed-off-by: Derrick Stolee <stolee@gmail.com>
Test that all three verb-specific cache-server configs can be used
simultaneously, each directing requests to a different server. This
verifies that prefetch, get, and post verbs each respect their own
override and don't interfere with each other.
The t5799-gvfs-helper.sh script is long and takes forever. This slows down
PR merges and the local development inner loop is a pain. Before
distributing the tests into a set of new test scripts by topic, extract
important helper methods that can be imported by the new scripts.

Signed-off-by: Derrick Stolee <stolee@gmail.com>
Move the tests from t5799-gvfs-helper.sh into multiple scripts that can run
in parallel. To ensure that the ports do not overlap, add a large multiplier
on the instance when needing multiple ports within the same test (currently
limited to the verb-specific cache servers).

Signed-off-by: Derrick Stolee <stolee@gmail.com>
Starting with upstream commit 4580bcd ("osxkeychain: avoid
incorrectly skipping store operation", 2025-11-14), the osxkeychain
credential helper includes git-compat-util.h and links against
libgit.a.

The osxkeychain Makefile has:

    CFLAGS ?= -g -O2 -Wall -I../../.. $(BASIC_CFLAGS)

The ?= operator means "set only if not already set". When building
via a parent Makefile that passes CFLAGS on the command line, this
entire assignment is ignored - including the -I../../.. needed to find
git-compat-util.h and the $(BASIC_CFLAGS) needed for -DNO_OPENSSL:

    git-credential-osxkeychain.c:5:10: fatal error:
        'git-compat-util.h' file not found

Using += instead of ?= is not sufficient either, because command-line
variables in Make override even += assignments. We need to use
"override CFLAGS +=" to force these flags to be appended regardless
of how CFLAGS was set.

Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
I'm exploring ideas around a new cache-server infrastructure. One of the
trickiest parts of deploying new infrastructure is the need to have all
endpoints ready to go at launch without incremental learning.

This change adds new `gvfs.<verb>.cache-server` config keys that allow
for verb-by-verb overrides of the typical `gvfs.cache-server` config
key. These are loaded on a per-verb basis and then reset after the
request. Further, if there is a failure then the request is retried with
the base cache-server URL.

This would allow us to, for example, deploy a service that serves only
the `gvfs/prefetch` endpoint and see if that is improving on latency and
throughput expectations before moving on to the GET and POST verbs for
single and batched object downloads.

As I was adding tests, I realized that we should split this test script
into distinct parts so we can have a faster inner loop when testing
specific areas. I know that this script is frequently the longest script
running in our PR and CI builds, so the parallel split should help
significantly.

Use commit-by-commit review. I tried to keep the last two commits as
obviously "copy-and-paste only" except for a small change to the port
calculation to avoid overlap when using multiple ports in parallel
tests.

* [X] This change only applies to interactions with Azure DevOps and the
      GVFS Protocol.
This includes the fixes I had to make to get
https://github.com/microsoft/git/releases/tag/v2.53.0-rc0.vfs.0.0 to
build, plus a fix for an overlooked stale `GIT-VERSION-GEN`,
@dscho dscho marked this pull request as ready for review February 3, 2026 08:18
@dscho dscho merged commit 82d60a0 into vfs-2.53.0 Feb 3, 2026
133 of 135 checks passed
@dscho dscho deleted the tentative/vfs-2.53.0 branch February 3, 2026 10:38
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.