Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

[DO-NOT-MERGE-YET] Rebase to v2.48.0 #714

Open
wants to merge 243 commits into
base: vfs-2.48.0
Choose a base branch
from
Open

Conversation

dscho
Copy link
Member

@dscho dscho commented Dec 17, 2024

Range-diff relative to vfs-2.47.1
  • 1: f8a9b7d = 1: e1ee1fb sparse-index.c: fix use of index hashes in expand_index

  • 2: 3f29558 = 2: e4bf5ba t5300: confirm failure of git index-pack when non-idx suffix requested

  • 3: 39c301e = 3: a487ef4 t: remove advice from some tests

  • 4: c764d29 = 4: 2273c73 t1092: add test for untracked files and directories

  • 7: 880848c = 5: 610b51f index-pack: disable rev-index if index file has non .idx suffix

  • 5: 45fa069 = 6: 41e508a survey: calculate more stats on refs

  • 6: caecb6c = 7: 7c49aec survey: show some commits/trees/blobs histograms

  • 9: afe1b3d = 8: de05533 survey: add vector of largest objects for various scaling dimensions

  • 10: 6024611 = 9: b6e0cb9 survey: add pathname of blob or tree to large_item_vec

  • 11: e0f3278 = 10: 097dfe9 survey: add commit-oid to large_item detail

  • 12: 92dc76f = 11: 4c0c25f survey: add commit name-rev lookup to each large_item

  • 13: b4ef786 = 12: aba19af survey: add --no-name-rev option

  • 14: ff5800d = 13: 09a23bd survey: started TODO list at bottom of source file

  • 15: 53525fc = 14: 0f15b3f survey: expanded TODO list at the bottom of the source file

  • 16: 3c34aa0 = 15: d0b2832 survey: expanded TODO with more notes

  • 8: 26be27d = 16: e9faa7c trace2: prefetch value of GIT_TRACE2_DST_DEBUG at startup

  • 17: c146336 = 17: 2415423 reset --stdin: trim carriage return from the paths

  • 18: c9463b5 ! 18: af78073 Identify microsoft/git via a distinct version suffix

    @@ Commit message
     
      ## GIT-VERSION-GEN ##
     @@
    - GVF=GIT-VERSION-FILE
    - DEF_VER=v2.47.1
    + 
    + DEF_VER=v2.48.0-rc0
      
     +# Identify microsoft/git via a distinct version suffix
     +DEF_VER=$DEF_VER.vfs.0.0
  • 19: 759993f < -: ----------- gvfs: ensure that the version is based on a GVFS tag

  • 143: 8d3fe0f = 19: d576c33 git_config_set_multivar_in_file_gently(): add a lock timeout

  • 177: 27c9054 = 20: e4e5842 sequencer: avoid progress when stderr is redirected

  • -: ----------- > 21: d2f16f8 gvfs: ensure that the version is based on a GVFS tag

  • 20: c9fee9a = 22: 3d9017d gvfs: add a GVFS-specific header file

  • 21: f026a10 = 23: 9cf2623 gvfs: add the core.gvfs config setting

  • 22: 5363b06 ! 24: 63e7518 gvfs: add the feature to skip writing the index' SHA-1

    @@ Commit message
         prepare_repo_settings(), so the core.gvfs bit check was moved there,
         too.
     
    +    Signed-off-by: Kevin Willford <[email protected]>
         Signed-off-by: Derrick Stolee <[email protected]>
    +    Signed-off-by: Johannes Schindelin <[email protected]>
     
      ## Documentation/config/core.txt ##
     @@ Documentation/config/core.txt: core.multiPackIndex::
    @@ gvfs.h
     
      ## repo-settings.c ##
     @@
    - #include "repo-settings.h"
      #include "repository.h"
      #include "midx.h"
    + #include "pack-objects.h"
     +#include "gvfs.h"
      
      static void repo_cfg_bool(struct repository *r, const char *key, int *dest,
  • 23: 0c59b7c = 25: bfa97bc gvfs: add the feature that blobs may be missing

  • 24: f9c6eae = 26: 01bf3ce gvfs: prevent files to be deleted outside the sparse checkout

  • 25: 43507e2 = 27: 944465b gvfs: optionally skip reachability checks/upload pack during fetch

  • 26: 04e60c0 = 28: bc6ac08 gvfs: ensure all filters and EOL conversions are blocked

  • 27: 69a4394 ! 29: 0295330 gvfs: allow "virtualizing" objects

    @@ Commit message
         to "lazy clone" and work more on this.
     
         Signed-off-by: Ben Peart <[email protected]>
    -    Signed-off-by: Johannes Schindelin <[email protected]>
    +    Signed-off-by: Johannes Schindelin <[email protected]>
     
      ## config.c ##
     @@ config.c: int git_default_core_config(const char *var, const char *value,
  • 28: 4e30600 = 30: 68b2b00 Hydrate missing loose objects in check_and_freshen()

  • 29: 28d0788 ! 31: 5d5d088 sha1_file: when writing objects, skip the read_object_hook

    @@ Commit message
     
         Based on a patch by Kevin Willford.
     
    -    Signed-off-by: Johannes Schindelin <[email protected]>
    +    Signed-off-by: Johannes Schindelin <[email protected]>
     
      ## object-file.c ##
     @@ object-file.c: static int check_and_freshen_nonlocal(const struct object_id *oid, int freshen)
  • 30: 027100e ! 32: 71abd25 gvfs: add global command pre and post hook procs

    @@ Commit message
         changes out of run-command.c to hook.c.
     
         Signed-off-by: Ben Peart <[email protected]>
    +    Signed-off-by: Johannes Schindelin <[email protected]>
     
      ## git.c ##
     @@
    @@ git.c
      
      #define RUN_SETUP		(1<<0)
      #define RUN_SETUP_GENTLY	(1<<1)
    -@@ git.c: static int handle_alias(int *argcp, const char ***argv)
    +@@ git.c: static int handle_alias(struct strvec *args)
      	return ret;
      }
      
    @@ git.c: static int run_builtin(struct cmd_struct *p, int argc, const char **argv,
      	trace2_cmd_name(p->cmd);
      
      	validate_cache_entries(repo->index);
    --	status = p->fn(argc, argv, prefix, (p->option & RUN_SETUP)? repo : NULL);
    -+	exit_code = status = p->fn(argc, argv, prefix, (p->option & RUN_SETUP)? repo : NULL);
    +-	status = p->fn(argc, argv, prefix, no_repo ? NULL : repo);
    ++	exit_code = status = p->fn(argc, argv, prefix, no_repo ? NULL : repo);
      	validate_cache_entries(repo->index);
      
      	if (status)
    @@ git.c: static void execv_dashed_external(const char **argv)
     +	run_post_command_hook(the_repository);
      }
      
    - static int run_argv(int *argcp, const char ***argv)
    + static int run_argv(struct strvec *args)
     @@ git.c: int cmd_main(int argc, const char **argv)
      	}
      
  • 31: 8ebfcd2 ! 33: a573289 t0400: verify that the hook is called correctly from a subdirectory

    @@ Commit message
     
         Suggested by Ben Peart.
     
    -    Signed-off-by: Johannes Schindelin <[email protected]>
    +    Signed-off-by: Johannes Schindelin <[email protected]>
     
      ## t/t0400-pre-command-hook.sh ##
     @@ t/t0400-pre-command-hook.sh: test_expect_success 'with failing hook' '
  • 32: 7f3c491 = 34: 5cffe06 Pass PID of git process to hooks.

  • 33: f108451 ! 35: 85ac67e pre-command: always respect core.hooksPath

    @@ Commit message
         2021-10-30: Recent movement of find_hook() into hook.c required moving this
         change from run-command.c.
     
    -    Signed-off-by: Johannes Schindelin <[email protected]>
    +    Signed-off-by: Johannes Schindelin <[email protected]>
     
      ## hook.c ##
     @@ hook.c: const char *find_hook(struct repository *r, const char *name)
  • 34: d5c0cbd = 36: 3459b28 sparse-checkout: update files with a modify/delete conflict

  • 35: d3afb07 = 37: 5f47501 sparse-checkout: avoid writing entries with the skip-worktree bit

  • 36: 9440e53 = 38: f38593a Do not remove files outside the sparse-checkout

  • 37: bcc1fea = 39: 9c4224b send-pack: do not check for sha1 file when GVFS_MISSING_OK set

  • 38: 21e7ac3 = 40: 8a8b58e cache-tree: remove use of strbuf_addf in update_one

  • 39: 0956fc2 ! 41: cb94c4f gvfs: block unsupported commands when running in a GVFS repo

    @@ Commit message
         11) worktree
     
         Signed-off-by: Ben Peart <[email protected]>
    -    Signed-off-by: Johannes Schindelin <[email protected]>
    +    Signed-off-by: Johannes Schindelin <[email protected]>
     
      ## builtin/gc.c ##
     @@
  • 40: c49f24c = 42: 819b108 worktree: allow in Scalar repositories

  • 41: efc8460 = 43: 803d138 gvfs: allow overriding core.gvfs

  • 42: 4d87f3a = 44: 2406a1f BRANCHES.md: Add explanation of branches and using forks

  • 43: 0c2b427 = 45: dd7bbd6 Add virtual file system settings and hook proc

  • 44: 91c84ab = 46: 9e67545 virtualfilesystem: don't run the virtual file system hook if the index has been redirected

  • 45: b2690cc = 47: 68080d1 virtualfilesystem: check if directory is included

  • 46: eed726a = 48: bd4306e backwards-compatibility: support the post-indexchanged hook

  • 47: bf25c76 = 49: b13dd3d gvfs: verify that the built-in FSMonitor is disabled

  • 48: 295c0df = 50: 00a4dfe wt-status: add trace2 data for sparse-checkout percentage

  • 49: 7dd7cca = 51: becdc5d wt-status: add VFS hydration percentage to normal git status output

  • 50: 15e33c8 = 52: 525ceb8 status: add status serialization mechanism

  • 51: 32985bc = 53: 9aecd4b Teach ahead-behind and serialized status to play nicely together

  • 52: 69a2625 = 54: 7138d62 status: serialize to path

  • 53: 7dc9425 = 55: 85f7657 status: reject deserialize in V2 and conflicts

  • 54: e74c4fa = 56: 90fc66a serialize-status: serialize global and repo-local exclude file metadata

  • 55: cb0713f = 57: 2236e3b status: deserialization wait

  • 56: 7b525d9 = 58: 212a2a6 merge-recursive: avoid confusing logic in was_dirty()

  • 57: 02f7059 = 59: 92b76fd merge-recursive: add some defensive coding to was_dirty()

  • 58: 12aa32d = 60: 450a24d merge-recursive: teach was_dirty() about the virtualfilesystem

  • 59: eb337ae = 61: 5b057fa status: deserialize with -uno does not print correct hint

  • 60: ce7c4ba = 62: c8ef54c fsmonitor: check CE_FSMONITOR_VALID in ce_uptodate

  • 61: ef2b8be = 63: 2d48746 fsmonitor: add script for debugging and update script for tests

  • 62: a9107c8 = 64: 40a3e9e status: disable deserialize when verbose output requested.

  • 63: 8f1a58d = 65: 483d67f t7524: add test for verbose status deserialzation

  • 64: e509c50 = 66: 6c6482f deserialize-status: silently fallback if we cannot read cache file

  • 65: ebe6f19 = 67: fc78e39 gvfs:trace2:data: add trace2 tracing around read_object_process

  • 66: 701b87c = 68: 04cdde9 gvfs:trace2:data: status deserialization information

  • 67: c773538 = 69: 1ff8cb4 gvfs:trace2:data: status serialization

  • 68: ce0dd9a = 70: ee783ff gvfs:trace2:data: add vfs stats

  • 69: 2df249a = 71: 8ef2956 trace2: refactor setting process starting time

  • 70: 3c09592 = 72: b0bb34f trace2:gvfs:experiment: clear_ce_flags_1

  • 71: 3b76c51 = 73: 7c9dd22 trace2:gvfs:experiment: report_tracking

  • 72: cdfaedd = 74: 889b62c trace2:gvfs:experiment: read_cache: annotate thread usage in read-cache

  • 73: 55e10e0 = 75: 91e5b40 trace2:gvfs:experiment: read-cache: time read/write of cache-tree extension

  • 74: 4c4bae9 = 76: 452d900 trace2:gvfs:experiment: add region to apply_virtualfilesystem()

  • 75: a1f3296 = 77: 66b16b3 trace2:gvfs:experiment: add region around unpack_trees()

  • 76: edf9d8a = 78: edd5e72 trace2:gvfs:experiment: add region to cache_tree_fully_valid()

  • 77: fc35180 ! 79: 419f494 trace2:gvfs:experiment: add unpack_entry() counter to unpack_trees() and report_tracking()

    @@ Commit message
         trace2:gvfs:experiment: add unpack_entry() counter to unpack_trees() and report_tracking()
     
         Signed-off-by: Jeff Hostetler <[email protected]>
    +    Signed-off-by: Johannes Schindelin <[email protected]>
     
      ## builtin/checkout.c ##
     @@
    @@ packfile.c: void *unpack_entry(struct repository *r, struct packed_git *p, off_t
      
     +	g_nr_unpack_entry++;
     +
    - 	write_pack_access_log(p, obj_offset);
    + 	prepare_repo_settings(p->repo);
      
    - 	/* PHASE 1: drill down to the innermost base object */
    + 	write_pack_access_log(p, obj_offset);
     
      ## packfile.h ##
    -@@ packfile.h: int is_promisor_object(const struct object_id *oid);
    +@@ packfile.h: int is_promisor_object(struct repository *r, const struct object_id *oid);
      int load_idx(const char *path, const unsigned int hashsz, void *idx_map,
      	     size_t idx_size, struct packed_git *p);
      
  • 78: 5b43294 = 80: 1f0c954 trace2:gvfs:experiment: increase default event depth for unpack-tree data

  • 79: 550270b = 81: 1b3c2fa trace2:gvfs:experiment: add data for check_updates() in unpack_trees()

  • 80: 5f2cad3 = 82: 1376bae Trace2:gvfs:experiment: capture more 'tracking' details

  • 81: 045abab = 83: 9385e90 credential: set trace2_child_class for credential manager children

  • 82: 6b0b19e = 84: 93d47e9 sub-process: do not borrow cmd pointer from caller

  • 83: afba63d = 85: d0cb2df sub-process: add subprocess_start_argv()

  • 84: b43ee7e = 86: 698c329 sha1-file: add function to update existing loose object cache

  • 85: fd35572 = 87: 4d8ca07 packfile: add install_packed_git_and_mru()

  • 86: d6eed3f = 88: 148e1be index-pack: avoid immediate object fetch while parsing packfile

  • 87: b591116 = 89: 6794fcd gvfs-helper: create tool to fetch objects using the GVFS Protocol

  • 88: 9e35331 = 90: e63abee sha1-file: create shared-cache directory if it doesn't exist

  • 89: 5c03db5 = 91: 8bf10d0 gvfs-helper: better handling of network errors

  • 90: 1a87dad = 92: 2b65125 gvfs-helper-client: properly update loose cache with fetched OID

  • 91: 6a6ac0a = 93: e50c25a gvfs-helper: V2 robust retry and throttling

  • 92: 27bb4f3 = 94: 400df45 gvfs-helper: expose gvfs/objects GET and POST semantics

  • 93: 820a44f = 95: fa4f2fa gvfs-helper: dramatically reduce progress noise

  • 94: 48b3f90 = 96: e3e0fe5 gvfs-helper-client.h: define struct object_id

  • 95: 26027b9 = 97: 8c40f07 gvfs-helper: handle pack-file after single POST request

  • 96: 7bd258b ! 98: 02f963d test-gvfs-prococol, t5799: tests for gvfs-helper

    @@ Commit message
         [1] https://github.com/microsoft/VFSForGit/blob/master/Protocol.md
     
         Signed-off-by: Jeff Hostetler <[email protected]>
    -    Signed-off-by: Johannes Schindelin <[email protected]>
    +    Signed-off-by: Johannes Schindelin <[email protected]>
     
      ## Makefile ##
     @@ Makefile: endif
    @@ contrib/buildsystems/CMakeLists.txt: set(wrapper_scripts
     +
      
      foreach(script ${wrapper_scripts})
    - 	file(STRINGS ${CMAKE_SOURCE_DIR}/wrap-for-bin.sh content NEWLINE_CONSUME)
    + 	file(STRINGS ${CMAKE_SOURCE_DIR}/bin-wrappers/wrap-for-bin.sh content NEWLINE_CONSUME)
     
      ## gvfs-helper.c ##
     @@ gvfs-helper.c: static void install_loose(struct gh__request_params *params,
  • 97: f142997 = 99: 0abb84b gvfs-helper: move result-list construction into install functions

  • 98: 6ec53d2 = 100: 46a4267 t5799: add support for POST to return either a loose object or packfile

  • 99: 89cd885 = 101: 2995649 t5799: cleanup wc-l and grep-c lines

  • 100: 9033775 = 102: eab8fe9 gvfs-helper: verify loose objects after write

  • 101: f67891f = 103: 8f772ef t7599: create corrupt blob test

  • 102: 066b25f = 104: bf736ee gvfs-helper: add prefetch support

  • 103: 4aee040 = 105: 26429b4 gvfs-helper: add prefetch .keep file for last packfile

  • 104: be6e216 = 106: c76a40a gvfs-helper: do one read in my_copy_fd_len_tail()

  • 105: 58576a0 = 107: 2719528 gvfs-helper: move content-type warning for prefetch packs

  • 106: 9c79566 = 108: 5203695 fetch: use gvfs-helper prefetch under config

  • 107: 3ad5ca2 = 109: c20bcae gvfs-helper: better support for concurrent packfile fetches

  • 108: db1f44a = 110: aefd3fc remote-curl: do not call fetch-pack when using gvfs-helper

  • 109: f0e01d8 = 111: 514990f fetch: reprepare packs before checking connectivity

  • 110: e1797f8 = 112: 0e15de4 gvfs-helper: retry when creating temp files

  • 111: 47ae2c0 = 113: 2102162 sparse: avoid warnings about known cURL issues in gvfs-helper.c

  • 112: b7d9e59 = 114: b9aa44a gvfs-helper: add --max-retries to prefetch verb

  • 113: cd615fc = 115: bc8ba2e t5799: add tests to detect corrupt pack/idx files in prefetch

  • 114: eae3e03 = 116: 4d8e447 gvfs-helper: ignore .idx files in prefetch multi-part responses

  • 115: d1d2404 = 117: 60ad684 t5799: explicitly test gvfs-helper --fallback and --no-fallback

  • 116: 560038e = 118: d8d9dd5 gvfs-helper: don't fallback with new config

  • 117: 48e648e = 119: 2c299fb test-gvfs-protocol: add cache_http_503 to mayhem

  • 118: aed4b59 ! 120: d59167b maintenance: care about gvfs.sharedCache config

    @@ builtin/gc.c: static int pack_loose(struct maintenance_run_opts *opts)
      				      write_loose_object_to_stdin,
      				      NULL,
      				      NULL,
    -@@ builtin/gc.c: static int maintenance_run(int argc, const char **argv, const char *prefix)
    +@@ builtin/gc.c: static int maintenance_run(int argc, const char **argv, const char *prefix,
      	int i;
      	struct maintenance_run_opts opts = MAINTENANCE_RUN_OPTS_INIT;
      	struct gc_config cfg = GC_CONFIG_INIT;
    @@ builtin/gc.c: static int maintenance_run(int argc, const char **argv, const char
      	struct option builtin_maintenance_run_options[] = {
      		OPT_BOOL(0, "auto", &opts.auto_flag,
      			 N_("run tasks based on the state of the repository")),
    -@@ builtin/gc.c: static int maintenance_run(int argc, const char **argv, const char *prefix)
    +@@ builtin/gc.c: static int maintenance_run(int argc, const char **argv, const char *prefix,
      		usage_with_options(builtin_maintenance_run_usage,
      				   builtin_maintenance_run_options);
      
  • 120: dce178a = 121: c8627b3 unpack-trees:virtualfilesystem: Improve efficiency of clear_ce_flags

  • 121: 6df4ecf = 122: f498aa4 homebrew: add GitHub workflow to release Cask

  • 122: fa41711 ! 123: cdd4365 Adding winget workflows

    @@ .github/workflows/release-winget.yml (new)
     +        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/workflows/release-winget.yml (new)
     +
     +          # Submit manifests
     +          $manifestDirectory = Split-Path "$manifestPath"
    -+          .\wingetcreate.exe submit -t "${{ secrets.WINGET_TOKEN }}" $manifestDirectory
    ++          .\wingetcreate.exe submit -t "(az keyvault secret show --name ${{ secrets.WINGET_TOKEN_SECRET_NAME }} --vault-name ${{ secrets.AZURE_VAULT }} --query "value")" $manifestDirectory
     +        shell: powershell
  • 123: 471073e = 124: 402335f Disable the monitor-components workflow in msft-git

  • 124: b78d7f5 = 125: dfb2c86 .github: enable windows builds on microsoft fork

  • 125: afd8701 ! 126: dfdb911 release: create initial Windows installer build workflow

    @@ Commit message
         'git-for-windows/setup-git-for-windows-sdk' Action, the SDK used is the
         'full' flavor.
     
    +    Signed-off-by: Victoria Dye <[email protected]>
    +    Signed-off-by: Johannes Schindelin <[email protected]>
    +
      ## .github/workflows/build-git-installers.yml (new) ##
     @@
     +name: build-git-installers
    @@ .github/workflows/build-git-installers.yml (new)
     +          Type: files; Name: {app}\\{#MINGW_BITNESS}\\bin\\git-update-git-for-windows.config\
     +          Type: dirifempty; Name: {app}\\{#MINGW_BITNESS}\\bin' \
     +            $b/installer/install.iss
    -+      - name: Set the installer Publisher to the Git Fundamentals team
    ++      - name: Set the installer Publisher to the GitClient team
     +        shell: bash
     +        run: |
     +          b=/usr/src/build-extra &&
    -+          sed -i -e 's/^\(AppPublisher=\).*/\1The Git Fundamentals Team at GitHub/' $b/installer/install.iss
    ++          sed -i -e 's/^\(AppPublisher=\).*/\1The GitClient Team at Microsoft/' $b/installer/install.iss
     +      - name: Let the installer configure Visual Studio to use the installed Git
     +        shell: bash
     +        run: |
  • 119: 08a2ba3 = 127: 9e40834 t5799: add unit tests for new gvfs.fallback config setting

  • 126: f7c6f59 ! 128: 575be06 help: special-case HOST_CPU universal

    @@ Commit message
         Signed-off-by: Johannes Schindelin <[email protected]>
     
      ## help.c ##
    -@@ help.c: const char *help_unknown_cmd(const char *cmd)
    +@@ help.c: char *help_unknown_cmd(const char *cmd)
      	exit(1);
      }
      
  • 127: 3b744e9 = 129: d920e0f release: add Mac OSX installer build

  • 128: e5d09aa ! 130: 76b340d release: build unsigned Ubuntu .deb package

    @@ .github/workflows/build-git-installers.yml: jobs:
     +          Priority: optional
     +          Architecture: $ARCH
     +          Depends: libcurl3-gnutls, liberror-perl, libexpat1, libpcre2-8-0, perl, perl-modules, zlib1g
    -+          Maintainer: Git Fundamentals <[email protected]>
    ++          Maintainer: GitClient <[email protected]>
     +          Description: Git client built from the https://github.com/microsoft/git repository,
     +            specialized in supporting monorepo scenarios. Includes the Scalar CLI.
     +          EOF
  • 129: 59e8eaf = 131: b041e49 release: add signing step for .deb package

  • 130: 799f8c1 = 132: a21d2b3 release: create draft GitHub release with packages & installers

  • 131: 7a8a309 = 133: 554506e build-git-installers: publish gpg public key

  • 132: ca60df2 ! 134: 62038e9 release: continue pestering until user upgrades

    @@ Commit message
         reminders and upgrade in a timely fashion.
     
         Signed-off-by: Derrick Stolee <[email protected]>
    +    Signed-off-by: Johannes Schindelin <[email protected]>
     
      ## .github/workflows/build-git-installers.yml ##
     @@ .github/workflows/build-git-installers.yml: jobs:
    @@ .github/workflows/build-git-installers.yml: jobs:
     +
     +          sed -i -e '6 a use_recently_seen=no' \
     +            $b/git-update-git-for-windows
    -       - name: Set the installer Publisher to the Git Fundamentals team
    +       - name: Set the installer Publisher to the GitClient team
              shell: bash
              run: |
  • 133: af7f735 ! 135: 1a2f6dd Makefile: allow specifying GIT_BUILT_FROM_COMMIT

    @@ Commit message
         `git version --build-options`.
     
         Signed-off-by: Victoria Dye <[email protected]>
    +    Signed-off-by: Johannes Schindelin <[email protected]>
     
      ## .gitignore ##
     @@
    @@ .gitignore
      /GIT-LDFLAGS
      /GIT-PREFIX
     
    + ## GIT-VERSION-GEN ##
    +@@ GIT-VERSION-GEN: else
    + fi
    + 
    + GIT_VERSION=$(expr "$VN" : v*'\(.*\)')
    +-GIT_BUILT_FROM_COMMIT=$(git -C "$SOURCE_DIR" rev-parse -q --verify HEAD 2>/dev/null)
    ++if test -z "$GIT_BUILT_FROM_COMMIT"
    ++then
    ++	GIT_BUILT_FROM_COMMIT=$(git -C "$SOURCE_DIR" rev-parse -q --verify HEAD 2>/dev/null)
    ++fi
    + GIT_DATE=$(git -C "$SOURCE_DIR" show --quiet --format='%as' 2>/dev/null)
    + if test -z "$GIT_USER_AGENT"
    + then
    +
      ## Makefile ##
     @@ Makefile: include shared.mak
      # Define GIT_USER_AGENT if you want to change how git identifies itself during
    @@ Makefile: PAGER_ENV_CQ_SQ = $(subst ','\'',$(PAGER_ENV_CQ))
      pager.sp pager.s pager.o: EXTRA_CPPFLAGS = \
      	-DPAGER_ENV='$(PAGER_ENV_CQ_SQ)'
      
    --version.sp version.s version.o: GIT-VERSION-FILE GIT-USER-AGENT
    -+version.sp version.s version.o: GIT-VERSION-FILE GIT-USER-AGENT GIT-BUILT-FROM-COMMIT
    - version.sp version.s version.o: EXTRA_CPPFLAGS = \
    - 	'-DGIT_VERSION="$(GIT_VERSION)"' \
    - 	'-DGIT_USER_AGENT=$(GIT_USER_AGENT_CQ_SQ)' \
    --	'-DGIT_BUILT_FROM_COMMIT="$(shell \
    --		GIT_CEILING_DIRECTORIES="$(CURDIR)/.." \
    --		git rev-parse -q --verify HEAD 2>/dev/null)"'
    -+	'-DGIT_BUILT_FROM_COMMIT="$(GIT_BUILT_FROM_COMMIT)"'
    +-version-def.h: version-def.h.in GIT-VERSION-GEN GIT-VERSION-FILE GIT-USER-AGENT
    +-	$(QUIET_GEN)GIT_USER_AGENT="$(GIT_USER_AGENT)" $(SHELL_PATH) ./GIT-VERSION-GEN "$(shell pwd)" $< $@+
    ++version-def.h: version-def.h.in GIT-VERSION-GEN GIT-VERSION-FILE GIT-USER-AGENT GIT-BUILT-FROM-COMMIT
    ++	$(QUIET_GEN)GIT_USER_AGENT="$(GIT_USER_AGENT)" \
    ++		GIT_BUILT_FROM_COMMIT="$(GIT_BUILT_FROM_COMMIT)" \
    ++		$(SHELL_PATH) ./GIT-VERSION-GEN "$(shell pwd)" $< $@+
    + 	@if cmp $@+ $@ >/dev/null 2>&1; then $(RM) $@+; else mv $@+ $@; fi
      
    - $(BUILT_INS): git$X
    - 	$(QUIET_BUILT_IN)$(RM) $@ && \
    + version.sp version.s version.o: version-def.h
  • 134: 7bb260f = 136: 376d7a5 dist: archive HEAD instead of HEAD^{tree}

  • 135: b514a26 = 137: 421d974 release: include GIT_BUILT_FROM_COMMIT in MacOS build

  • 136: 521148d = 138: 4bd7c00 release: add installer validation

  • 137: 3f13abc = 139: cc84fe4 update-microsoft-git: create barebones builtin

  • 138: 3f702db = 140: 227c405 update-microsoft-git: Windows implementation

  • 139: 03dd074 = 141: 6b7077c update-microsoft-git: use brew on macOS

  • 140: 1b5f1e0 = 142: cc60983 .github: update ISSUE_TEMPLATE.md for microsoft/git

  • 141: 7f5f680 = 143: 8094a1c .github: update PULL_REQUEST_TEMPLATE.md

  • 144: aaea46f ! 144: 184da00 scalar: set the config write-lock timeout to 150ms

    @@ Commit message
         repositories will fall back to trying a couple times within a 150ms
         timeout.
     
    -    Signed-off-by: Johannes Schindelin <[email protected]>
    +    Signed-off-by: Johannes Schindelin <[email protected]>
     
      ## scalar.c ##
     @@ scalar.c: static int set_recommended_config(int reconfigure)
  • 145: 02b908b = 145: 3b8d6f7 scalar: add docs from microsoft/scalar

  • 142: 970419c = 146: 97c8df8 Adjust README.md for microsoft/git

  • 146: 5c9aac4 = 147: 3505038 scalar (Windows): use forward slashes as directory separators

  • 147: 41359e0 = 148: 7cd0f55 scalar: add retry logic to run_git()

  • 148: 17d44fa = 149: 70d000c scalar: support the config command for backwards compatibility

  • 149: 51463f1 = 150: 462d0ca scalar: implement a minimal JSON parser

  • 150: e7d5631 = 151: e632525 scalar clone: support GVFS-enabled remote repositories

  • 151: 879d88c = 152: 2a054c4 test-gvfs-protocol: also serve smart protocol

  • 152: c3c75c6 = 153: d6058cb gvfs-helper: add the endpoint command

  • 153: 4b57081 = 154: f69ef17 dir_inside_of(): handle directory separators correctly

  • 154: ff012a6 = 155: c8e72b9 scalar: disable authentication in unattended mode

  • 155: d6ef324 = 156: 9e1206a scalar: do initialize gvfs.sharedCache

  • 156: 4df3f9a = 157: e522659 scalar diagnose: include shared cache info

  • 157: 9729c3b = 158: d8c36e2 scalar: only try GVFS protocol on https:// URLs

  • 158: 7158e01 = 159: 95300a1 scalar: verify that we can use a GVFS-enabled repository

  • 159: 2000e58 = 160: 0a1bf8b scalar: add the cache-server command

  • 160: 28e175f = 161: b74b4ad scalar: add a test toggle to skip accessing the vsts/info endpoint

  • 161: 8458698 = 162: 1be68af scalar: adjust documentation to the microsoft/git fork

  • 162: 519e4f1 = 163: 59890cd scalar: enable untracked cache unconditionally

  • 163: bbfb4ca = 164: 7774873 scalar: parse clone --no-fetch-commits-and-trees for backwards compatibility

  • 164: 12a32cd = 165: f2e828b scalar: make GVFS Protocol a forced choice

  • 165: 7f41222 = 166: 03536af scalar diagnose: accommodate Scalar's Functional Tests

  • 166: 81ca098 = 167: f749718 ci: run Scalar's Functional Tests

  • 167: ee37a11 = 168: bf1fb74 scalar: upgrade to newest FSMonitor config setting

  • 168: 2228c5d = 169: 1fa6f31 abspath: make strip_last_path_component() global

  • 169: 9137831 = 170: bbbf936 scalar: configure maintenance during 'reconfigure'

  • 170: 00db4c4 = 171: 98f245d scalar: .scalarCache should live above enlistment

  • 171: 173e358 = 172: 55376f6 add/rm: allow adding sparse entries when virtual

  • 172: aa48677 ! 173: a858ee7 sparse-checkout: add config to disable deleting dirs

    @@ Documentation/config/index.txt
      	Entry" section. This reduces index load time on multiprocessor
     
      ## builtin/sparse-checkout.c ##
    -@@ builtin/sparse-checkout.c: static int sparse_checkout_list(int argc, const char **argv, const char *prefix)
    +@@ builtin/sparse-checkout.c: static int sparse_checkout_list(int argc, const char **argv, const char *prefix,
      
      static void clean_tracked_sparse_directories(struct repository *r)
      {
  • 173: a579f1e ! 174: 578f0f3 diff: ignore sparse paths in diffstat

    @@ Commit message
     
      ## diff.c ##
     @@ diff.c: static int reuse_worktree_file(struct index_state *istate,
    - 	if (!FAST_WORKING_DIRECTORY && !want_file && has_object_pack(oid))
    + 	    has_object_pack(istate->repo, oid))
      		return 0;
      
     +	/*
  • 174: 8e80d9a = 175: 7637da5 repo-settings: enable sparse index by default

  • 175: 874de28 = 176: 85faeff diff(sparse-index): verify with partially-sparse

  • 176: e85d52d = 177: 8bd1fdd stash: expand testing for git stash -u

  • 178: 20df0a9 = 178: 5277a88 sparse: add vfs-specific precautions

  • 179: 834dec7 = 179: 0f1dbda reset: fix mixed reset when using virtual filesystem

  • 180: d856bd5 = 180: 73a82df sparse-index: add ensure_full_index_with_reason()

  • 181: 6be537d = 181: f82a5bd treewide: add reasons for expanding index

  • 182: 5872e4d = 182: 246c5bd treewide: custom reasons for expanding index

  • 183: fd4b610 = 183: 1eef26d sparse-index: add macro for unaudited expansions

  • 184: 46e051c = 184: cfb455b Docs: update sparse index plan with logging

  • 185: 4736f84 = 185: 515ec6c sparse-index: log failure to clear skip-worktree

  • 186: b4b7779 = 186: 5186d9a stash: use -f in checkout-index child process

  • 187: dcd9c62 = 187: 42479d4 sparse-index: do not copy hashtables during expansion

  • 188: 1c3598c = 188: c8e900b t5616: mark tests as bogus with --path-walk

  • 189: fa969ca = 189: 3e4a57c path-walk: add new 'edge_aggressive' option

  • 190: 7012687 = 190: be555f9 pack-objects: allow --shallow and --path-walk

  • 191: 46bb3c9 = 191: 971b882 t5538: add test to confirm deltas in shallow pushes

  • 192: a98c3d7 < -: ----------- fixup! Adding winget workflows

  • 193: 4760f28 = 192: 39fdcb0 gitk: check main window visibility before waiting for it to show

  • 194: b66d8e9 < -: ----------- fixup! release: create initial Windows installer build workflow

  • 195: a68ad02 < -: ----------- fixup! release: build unsigned Ubuntu .deb package

@dscho dscho requested a review from mjcheetham December 17, 2024 21:17
@dscho dscho self-assigned this Dec 17, 2024
@dscho
Copy link
Member Author

dscho commented Dec 17, 2024

We will need to ensure that git version --build-options shows the correct commit OID on all platforms; That commit had the most tricky merge conflicts to resolve of the entire rebase.

@dscho dscho force-pushed the tentative/vfs-2.48.0 branch from 83d38ac to a38426e Compare December 18, 2024 16:12
@dscho
Copy link
Member Author

dscho commented Dec 18, 2024

Range-diff relative to initially-pushed branch
  • 1: 68b2b00 ! 1: 327195f Hydrate missing loose objects in check_and_freshen()

    @@ object-file.c: int has_alt_odb(struct repository *r)
     +
     +	trace_performance_since(start, "read_object_process");
     +
    ++	strbuf_release(&status);
     +	return err;
     +}
     +
  • 2: 5d5d088 = 2: 9f9cad7 sha1_file: when writing objects, skip the read_object_hook

  • 3: 71abd25 = 3: f54f15c gvfs: add global command pre and post hook procs

  • 4: a573289 = 4: 2401147 t0400: verify that the hook is called correctly from a subdirectory

  • 5: 5cffe06 = 5: 0e4c923 Pass PID of git process to hooks.

  • 6: 85ac67e ! 6: e00d10d pre-command: always respect core.hooksPath

    @@ hook.c: const char *find_hook(struct repository *r, const char *name)
     +		static int forced_config;
     +
     +		if (!forced_config) {
    -+			if (!git_hooks_path) {
    ++			if (!git_hooks_path)
     +				git_config_get_pathname("core.hookspath",
     +							&git_hooks_path);
    -+				UNLEAK(git_hooks_path);
    -+			}
     +			forced_config = 1;
     +		}
     +
  • 7: 3459b28 = 7: 064ca47 sparse-checkout: update files with a modify/delete conflict

  • 8: 5f47501 = 8: 8836cf9 sparse-checkout: avoid writing entries with the skip-worktree bit

  • 9: f38593a = 9: f5836f8 Do not remove files outside the sparse-checkout

  • 10: 9c4224b = 10: 08ea63b send-pack: do not check for sha1 file when GVFS_MISSING_OK set

  • 11: 8a8b58e = 11: eb0028b cache-tree: remove use of strbuf_addf in update_one

  • 12: cb94c4f = 12: ad057e4 gvfs: block unsupported commands when running in a GVFS repo

  • 13: 819b108 = 13: a36136d worktree: allow in Scalar repositories

  • 14: 803d138 = 14: af1f9f8 gvfs: allow overriding core.gvfs

  • 15: 2406a1f = 15: 9699174 BRANCHES.md: Add explanation of branches and using forks

  • 16: dd7bbd6 ! 16: e9d00a6 Add virtual file system settings and hook proc

    @@ config.c: int repo_config_get_max_percent_split_change(struct repository *r)
     +		return virtual_filesystem_result;
     +
     +	if (repo_config_get_pathname(r, "core.virtualfilesystem", &core_virtualfilesystem))
    -+		core_virtualfilesystem = getenv("GIT_VIRTUALFILESYSTEM_TEST");
    ++		core_virtualfilesystem = xstrdup_or_null(getenv("GIT_VIRTUALFILESYSTEM_TEST"));
     +
     +	if (core_virtualfilesystem && !*core_virtualfilesystem)
    -+		core_virtualfilesystem = NULL;
    ++		FREE_AND_NULL(core_virtualfilesystem);
     +
     +	/* virtual file system relies on the sparse checkout logic so force it on */
     +	if (core_virtualfilesystem) {
  • 17: 9e67545 ! 17: f31ce1f virtualfilesystem: don't run the virtual file system hook if the index has been redirected

    @@ Commit message
      ## config.c ##
     @@ config.c: int repo_config_get_virtualfilesystem(struct repository *r)
      	if (core_virtualfilesystem && !*core_virtualfilesystem)
    - 		core_virtualfilesystem = NULL;
    + 		FREE_AND_NULL(core_virtualfilesystem);
      
     -	/* virtual file system relies on the sparse checkout logic so force it on */
      	if (core_virtualfilesystem) {
    @@ config.c: int repo_config_get_virtualfilesystem(struct repository *r)
     +			virtual_filesystem_result = 1;
     +			return 1;
     +		}
    -+		core_virtualfilesystem = NULL;
    ++		FREE_AND_NULL(core_virtualfilesystem);
      	}
      
      	virtual_filesystem_result = 0;
  • 18: 68080d1 = 18: 253f4da virtualfilesystem: check if directory is included

  • 19: bd4306e = 19: 2abbb82 backwards-compatibility: support the post-indexchanged hook

  • 20: b13dd3d = 20: d024afe gvfs: verify that the built-in FSMonitor is disabled

  • 21: 00a4dfe = 21: f16eba8 wt-status: add trace2 data for sparse-checkout percentage

  • 22: becdc5d = 22: 372187f wt-status: add VFS hydration percentage to normal git status output

  • 23: 525ceb8 ! 23: bb2a391 status: add status serialization mechanism

    @@ wt-status-deserialize.c (new)
     +{
     +	struct wt_status des_s;
     +	int result;
    ++	struct string_list_item *change;
     +
     +	if (path && *path && strcmp(path, "0")) {
     +		int fd = xopen(path, O_RDONLY);
    @@ wt-status-deserialize.c (new)
     +		wt_status_print(&des_s);
     +	}
     +
    ++	free(des_s.branch);
    ++	free((char *)des_s.reference);
    ++	for_each_string_list_item(change, &des_s.change) {
    ++		struct wt_status_change_data *d = change->util;
    ++		if (d)
    ++			free(d->rename_source);
    ++	}
    ++	string_list_clear(&des_s.change, 1);
    ++	string_list_clear(&des_s.ignored, 1);
    ++	string_list_clear(&des_s.untracked, 1);
     +	return result;
     +}
     
  • 24: 9aecd4b = 24: 8e6aa73 Teach ahead-behind and serialized status to play nicely together

  • 25: 7138d62 = 25: 9679ec3 status: serialize to path

  • 26: 85f7657 = 26: 6f609a4 status: reject deserialize in V2 and conflicts

  • 27: 90fc66a = 27: b4effb2 serialize-status: serialize global and repo-local exclude file metadata

  • 28: 2236e3b ! 28: f77764c status: deserialization wait

    @@ wt-status-deserialize.c: static int wt_deserialize_fd(const struct wt_status *cm
      {
      	struct wt_status des_s;
      	int result;
    + 	struct string_list_item *change;
      
      	if (path && *path && strcmp(path, "0")) {
     -		int fd = xopen(path, O_RDONLY);
  • 29: 212a2a6 = 29: a1b7853 merge-recursive: avoid confusing logic in was_dirty()

  • 30: 92b76fd = 30: b66bbb7 merge-recursive: add some defensive coding to was_dirty()

  • 31: 450a24d = 31: d26d83e merge-recursive: teach was_dirty() about the virtualfilesystem

  • 32: 5b057fa = 32: 8b9bb94 status: deserialize with -uno does not print correct hint

  • 33: c8ef54c = 33: f00ac05 fsmonitor: check CE_FSMONITOR_VALID in ce_uptodate

  • 34: 2d48746 = 34: f73a03c fsmonitor: add script for debugging and update script for tests

  • 35: 40a3e9e = 35: 646053f status: disable deserialize when verbose output requested.

  • 36: 483d67f = 36: c34b9fc t7524: add test for verbose status deserialzation

  • 37: 6c6482f = 37: 6d630b5 deserialize-status: silently fallback if we cannot read cache file

  • 38: fc78e39 ! 38: 96ff347 gvfs:trace2:data: add trace2 tracing around read_object_process

    @@ object-file.c: static int read_object_process(const struct object_id *oid)
     +	trace2_region_leave_printf("subprocess", "read_object", the_repository,
     +				   "result %d", err);
     +
    + 	strbuf_release(&status);
      	return err;
      }
    - 
  • 39: 04cdde9 ! 39: 28a5b95 gvfs:trace2:data: status deserialization information

    @@ wt-status-deserialize.c: static int try_deserialize_read_from_file(const struct
      			 "wait polled=%d result=%d '%s'",
      			 k, result, path);
     @@ wt-status-deserialize.c: int wt_status_deserialize(const struct wt_status *cmd_s,
    - 	struct wt_status des_s;
      	int result;
    + 	struct string_list_item *change;
      
     +	trace2_region_enter("status", "deserialize", the_repository);
     +
  • 40: 1ff8cb4 = 40: ebb9ad0 gvfs:trace2:data: status serialization

  • 41: ee783ff = 41: b710440 gvfs:trace2:data: add vfs stats

  • 42: 8ef2956 = 42: 663998b trace2: refactor setting process starting time

  • 43: b0bb34f = 43: f8ff65a trace2:gvfs:experiment: clear_ce_flags_1

  • 44: 7c9dd22 = 44: 0ddff0b trace2:gvfs:experiment: report_tracking

  • 45: 889b62c = 45: aab55ff trace2:gvfs:experiment: read_cache: annotate thread usage in read-cache

  • 46: 91e5b40 = 46: b0c9038 trace2:gvfs:experiment: read-cache: time read/write of cache-tree extension

  • 47: 452d900 = 47: 92fd571 trace2:gvfs:experiment: add region to apply_virtualfilesystem()

  • 48: 66b16b3 = 48: b0a26ea trace2:gvfs:experiment: add region around unpack_trees()

  • 49: edd5e72 = 49: 208ee1c trace2:gvfs:experiment: add region to cache_tree_fully_valid()

  • 50: 419f494 = 50: 533ef44 trace2:gvfs:experiment: add unpack_entry() counter to unpack_trees() and report_tracking()

  • 51: 1f0c954 = 51: af02b44 trace2:gvfs:experiment: increase default event depth for unpack-tree data

  • 52: 1b3c2fa = 52: 6043909 trace2:gvfs:experiment: add data for check_updates() in unpack_trees()

  • 53: 1376bae = 53: 6333d2d Trace2:gvfs:experiment: capture more 'tracking' details

  • 54: 9385e90 = 54: b95f1cf credential: set trace2_child_class for credential manager children

  • 55: 93d47e9 = 55: 68d4fa5 sub-process: do not borrow cmd pointer from caller

  • 56: d0cb2df = 56: 34cf03d sub-process: add subprocess_start_argv()

  • 57: 698c329 = 57: cf7f985 sha1-file: add function to update existing loose object cache

  • 58: 4d8ca07 = 58: 8f49f9e packfile: add install_packed_git_and_mru()

  • 59: 148e1be = 59: 19b2ac8 index-pack: avoid immediate object fetch while parsing packfile

  • 60: 6794fcd ! 60: 60da059 gvfs-helper: create tool to fetch objects using the GVFS Protocol

    @@ gvfs-helper-client.c (new)
     +	strbuf_strip_suffix(&path, ".pack");
     +	strbuf_addstr(&path, ".idx");
     +
    -+	p = add_packed_git(path.buf, path.len, is_local);
    ++	p = add_packed_git(the_repository, path.buf, path.len, is_local);
     +	if (p)
     +		install_packed_git_and_mru(the_repository, p);
    ++	strbuf_release(&path);
     +}
     +
     +/*
    @@ gvfs-helper.c (new)
     +cleanup:
     +	oidset_clear(&oids);
     +	string_list_clear(&result_list, 0);
    ++	gh__response_status__release(&status);
     +
     +	return ec;
     +}
  • 61: e63abee = 61: 19d0a07 sha1-file: create shared-cache directory if it doesn't exist

  • 62: 8bf10d0 = 62: 1febfa2 gvfs-helper: better handling of network errors

  • 63: 2b65125 = 63: 90b2c1f gvfs-helper-client: properly update loose cache with fetched OID

  • 64: e50c25a = 64: 81a4c84 gvfs-helper: V2 robust retry and throttling

  • 65: 400df45 = 65: a1d451a gvfs-helper: expose gvfs/objects GET and POST semantics

  • 66: fa4f2fa = 66: 35fd5f6 gvfs-helper: dramatically reduce progress noise

  • 67: e3e0fe5 = 67: 9661fd2 gvfs-helper-client.h: define struct object_id

  • 68: 8c40f07 = 68: 338ce6d gvfs-helper: handle pack-file after single POST request

  • 69: 02f963d ! 69: 46c8849 test-gvfs-prococol, t5799: tests for gvfs-helper

    @@ Makefile: endif
      	REMOTE_CURL_PRIMARY = git-remote-http$X
      	REMOTE_CURL_ALIASES = git-remote-https$X git-remote-ftp$X git-remote-ftps$X
     
    + ## bin-wrappers/.gitignore ##
    +@@
    + /git-upload-pack
    + /scalar
    + /test-fake-ssh
    ++/test-gvfs-protocol
    + /test-tool
    +
      ## contrib/buildsystems/CMakeLists.txt ##
     @@ contrib/buildsystems/CMakeLists.txt: set(wrapper_scripts
      set(wrapper_test_scripts
    @@ t/helper/test-gvfs-protocol.c (new)
     +	close(0);
     +	close(1);
     +
    ++	req__release(&req);
     +	return !!(wr & WR_IO_ERROR);
     +}
     +
    @@ t/helper/test-gvfs-protocol.c (new)
     +	loginfo("Starting graceful shutdown (pid-file gone)");
     +	for (i = 0; i < socklist->nr; i++)
     +		close(socklist->list[i]);
    ++	free(socklist->list);
    ++	free(pfd);
     +
     +	return 0;
     +}
  • 70: 0abb84b = 70: 25c4099 gvfs-helper: move result-list construction into install functions

  • 71: 46a4267 = 71: c513ef6 t5799: add support for POST to return either a loose object or packfile

  • 72: 2995649 = 72: 1dc1bfd t5799: cleanup wc-l and grep-c lines

  • 73: eab8fe9 ! 73: 9b50699 gvfs-helper: verify loose objects after write

    @@ gvfs-helper.c: static void install_packfile(struct gh__request_params *params,
     +	oi.type_name = &type_name;
     +
     +	ret = read_loose_object(path, expected_oid, &real_oid, &contents, &oi);
    -+	if (!ret)
    -+		free(contents);
    ++	free(contents);
     +	strbuf_release(&type_name);
     +
     +	return ret;
  • 74: 8f772ef = 74: 032bb40 t7599: create corrupt blob test

  • 75: bf736ee ! 75: 493255b gvfs-helper: add prefetch support

    @@ gvfs-helper.c: static int create_loose_pathname_in_odb(struct strbuf *buf_path,
     +
     +	/* Skip generating the rev index, we don't need it. */
     +	strvec_push(&ip.args, "--no-rev-index");
    - 
    --	if (create_loose_pathname_in_odb(&buf_path, &params->loose_oid)) {
    ++
     +	strvec_pushl(&ip.args, "-o", temp_path_idx->buf, NULL);
     +	strvec_push(&ip.args, temp_path_pack->buf);
     +	ip.no_stdin = 1;
     +	ip.out = -1;
    -+
    + 
    +-	if (create_loose_pathname_in_odb(&buf_path, &params->loose_oid)) {
     +	if (pipe_command(&ip, NULL, 0, &ip_stdout, 0, NULL, 0)) {
     +		unlink(temp_path_pack->buf);
     +		unlink(temp_path_idx->buf);
    @@ gvfs-helper.c: static void create_tempfile_for_loose(
     +	create_final_packfile_pathnames("prefetch", buf_timestamp.buf, hex_checksum,
     +					&final_path_pack, &final_path_idx,
     +					&final_filename);
    ++	strbuf_release(&buf_timestamp);
     +
     +	my_finalize_packfile(params, status,
     +			     &temp_path_pack, &temp_path_idx,
  • 76: 26429b4 ! 76: a885f07 gvfs-helper: add prefetch .keep file for last packfile

    @@ gvfs-helper.c: static void extract_packfile_from_multipack(
      		 * the purpose of having it cached...
      		 */
     @@ gvfs-helper.c: static void extract_packfile_from_multipack(
    - 					&final_path_pack, &final_path_idx,
      					&final_filename);
    + 	strbuf_release(&buf_timestamp);
      
     -	my_finalize_packfile(params, status,
     +	my_finalize_packfile(params, status, 1,
  • 77: c76a40a = 77: 07427d7 gvfs-helper: do one read in my_copy_fd_len_tail()

  • 78: 2719528 = 78: f985a38 gvfs-helper: move content-type warning for prefetch packs

  • 79: 5203695 = 79: 1859ddf fetch: use gvfs-helper prefetch under config

  • 80: c20bcae = 80: 492eae7 gvfs-helper: better support for concurrent packfile fetches

  • 81: aefd3fc = 81: dd6b4d8 remote-curl: do not call fetch-pack when using gvfs-helper

  • 82: 514990f = 82: dd65cbd fetch: reprepare packs before checking connectivity

  • 83: 0e15de4 = 83: 230ce00 gvfs-helper: retry when creating temp files

  • 84: 2102162 = 84: dd52498 sparse: avoid warnings about known cURL issues in gvfs-helper.c

  • 91: d59167b = 85: 7012ab0 maintenance: care about gvfs.sharedCache config

  • 92: c8627b3 = 86: 59476ce unpack-trees:virtualfilesystem: Improve efficiency of clear_ce_flags

  • 93: f498aa4 = 87: f6811a4 homebrew: add GitHub workflow to release Cask

  • 94: cdd4365 = 88: 8b6d6a0 Adding winget workflows

  • 95: 402335f = 89: 23b85ef Disable the monitor-components workflow in msft-git

  • 96: dfb2c86 = 90: 8277d9f .github: enable windows builds on microsoft fork

  • 97: dfdb911 = 91: 4cee739 release: create initial Windows installer build workflow

  • 99: 575be06 = 92: 96ed6a6 help: special-case HOST_CPU universal

  • 100: d920e0f = 93: 2001a21 release: add Mac OSX installer build

  • 101: 76b340d = 94: 326da65 release: build unsigned Ubuntu .deb package

  • 102: b041e49 = 95: 05bf35b release: add signing step for .deb package

  • 85: b9aa44a = 96: fe3a99b gvfs-helper: add --max-retries to prefetch verb

  • 103: a21d2b3 = 97: 7f6578e release: create draft GitHub release with packages & installers

  • 86: bc8ba2e = 98: fd17026 t5799: add tests to detect corrupt pack/idx files in prefetch

  • 104: 554506e = 99: 86d60ad build-git-installers: publish gpg public key

  • 87: 4d8e447 = 100: 3f9614f gvfs-helper: ignore .idx files in prefetch multi-part responses

  • 105: 62038e9 = 101: 14c381e release: continue pestering until user upgrades

  • 88: 60ad684 = 102: 495c541 t5799: explicitly test gvfs-helper --fallback and --no-fallback

  • 106: 1a2f6dd = 103: 9ebe655 Makefile: allow specifying GIT_BUILT_FROM_COMMIT

  • 89: d8d9dd5 = 104: f52a197 gvfs-helper: don't fallback with new config

  • 107: 376d7a5 = 105: b82cb38 dist: archive HEAD instead of HEAD^{tree}

  • 90: 2c299fb = 106: 5985486 test-gvfs-protocol: add cache_http_503 to mayhem

  • 108: 421d974 = 107: 76fbdf5 release: include GIT_BUILT_FROM_COMMIT in MacOS build

  • 98: 9e40834 = 108: e10c615 t5799: add unit tests for new gvfs.fallback config setting

  • 109: 4bd7c00 = 109: ae60edc release: add installer validation

  • 110: cc84fe4 = 110: 60ff902 update-microsoft-git: create barebones builtin

  • 111: 227c405 = 111: 66f5a58 update-microsoft-git: Windows implementation

  • 112: 6b7077c = 112: 3140d78 update-microsoft-git: use brew on macOS

  • 113: cc60983 = 113: 283df2c .github: update ISSUE_TEMPLATE.md for microsoft/git

  • 114: 8094a1c = 114: b9b6ff0 .github: update PULL_REQUEST_TEMPLATE.md

  • 115: 97c8df8 = 115: 21cf902 Adjust README.md for microsoft/git

  • 116: 462d0ca = 116: c0b909c scalar: implement a minimal JSON parser

  • 117: e632525 = 117: 83e0c43 scalar clone: support GVFS-enabled remote repositories

  • 118: 2a054c4 = 118: e43d8e3 test-gvfs-protocol: also serve smart protocol

  • 119: d6058cb = 119: 9f77436 gvfs-helper: add the endpoint command

  • 120: f69ef17 = 120: 9fdfd49 dir_inside_of(): handle directory separators correctly

  • 121: c8e72b9 = 121: cedefc5 scalar: disable authentication in unattended mode

  • 122: 9e1206a = 122: 4eb15e1 scalar: do initialize gvfs.sharedCache

  • 123: e522659 = 123: 885dc55 scalar diagnose: include shared cache info

  • 124: d8c36e2 = 124: e29b381 scalar: only try GVFS protocol on https:// URLs

  • 125: 95300a1 = 125: bab0aa5 scalar: verify that we can use a GVFS-enabled repository

  • 126: 0a1bf8b = 126: e9ee3ed scalar: add the cache-server command

  • 127: b74b4ad = 127: 662745c scalar: add a test toggle to skip accessing the vsts/info endpoint

  • 128: 1be68af = 128: 251ed5e scalar: adjust documentation to the microsoft/git fork

  • 129: 59890cd = 129: 0332292 scalar: enable untracked cache unconditionally

  • 130: 7774873 = 130: 23f7b5a scalar: parse clone --no-fetch-commits-and-trees for backwards compatibility

  • 131: f2e828b = 131: 3e45ffb scalar: make GVFS Protocol a forced choice

  • 132: 03536af = 132: f3ec7ab scalar diagnose: accommodate Scalar's Functional Tests

  • 133: f749718 = 133: 4143dd3 ci: run Scalar's Functional Tests

  • 134: bf1fb74 = 134: 1769380 scalar: upgrade to newest FSMonitor config setting

  • 135: 1fa6f31 = 135: 4b01312 abspath: make strip_last_path_component() global

  • 136: bbbf936 = 136: 4abe9c6 scalar: configure maintenance during 'reconfigure'

  • 137: 98f245d = 137: dfa161d scalar: .scalarCache should live above enlistment

  • 138: 55376f6 = 138: 3fe320b add/rm: allow adding sparse entries when virtual

  • 139: a858ee7 = 139: 31b8047 sparse-checkout: add config to disable deleting dirs

  • 140: 578f0f3 = 140: 28f373b diff: ignore sparse paths in diffstat

  • 141: 7637da5 = 141: 61af8d0 repo-settings: enable sparse index by default

  • 142: 85faeff = 142: 2a7bd47 diff(sparse-index): verify with partially-sparse

  • 143: 8bd1fdd = 143: 0bda1b3 stash: expand testing for git stash -u

  • 144: 5277a88 = 144: cd3f9cc sparse: add vfs-specific precautions

  • 145: 0f1dbda = 145: b8fcec9 reset: fix mixed reset when using virtual filesystem

  • 146: 73a82df = 146: 9a9edb8 sparse-index: add ensure_full_index_with_reason()

  • 147: f82a5bd = 147: 5ad7234 treewide: add reasons for expanding index

  • 148: 246c5bd = 148: 36e13c9 treewide: custom reasons for expanding index

  • 149: 1eef26d = 149: 1002935 sparse-index: add macro for unaudited expansions

  • 150: cfb455b = 150: 2207d4b Docs: update sparse index plan with logging

  • 151: 515ec6c = 151: 0e4f64a sparse-index: log failure to clear skip-worktree

  • 152: 5186d9a = 152: a0eb045 stash: use -f in checkout-index child process

  • 153: 42479d4 = 153: 2749f0d sparse-index: do not copy hashtables during expansion

  • 154: c8e900b = 154: 489d4fa t5616: mark tests as bogus with --path-walk

  • 155: 3e4a57c = 155: a14fb11 path-walk: add new 'edge_aggressive' option

  • 156: be555f9 = 156: 36b1bfe pack-objects: allow --shallow and --path-walk

  • 157: 971b882 = 157: 4c58c01 t5538: add test to confirm deltas in shallow pushes

  • 158: 39fdcb0 = 158: 3c1be7c gitk: check main window visibility before waiting for it to show

  • -: ----------- > 159: a38426e sub-process: avoid leaking cmd

@dscho dscho force-pushed the tentative/vfs-2.48.0 branch 3 times, most recently from 6ac52d2 to 8ad18d5 Compare December 18, 2024 22:25
@dscho
Copy link
Member Author

dscho commented Dec 18, 2024

Finally all the test failures are fixed.

Range-diff relative the previous range-diff'ed revision
  • 1: 60da059 ! 1: 0ea4c6b gvfs-helper: create tool to fetch objects using the GVFS Protocol

    @@ gvfs-helper.c (new)
     +	 * and password when we talk to the cache-server.
     +	 */
     +	lookup_main_creds();
    ++	free(gh__global.cache_creds.username);
     +	gh__global.cache_creds.username = xstrdup(gh__global.main_creds.username);
    ++	free(gh__global.cache_creds.password);
     +	gh__global.cache_creds.password = xstrdup(gh__global.main_creds.password);
     +}
     +
  • 2: 19d0a07 = 2: a67d6fa sha1-file: create shared-cache directory if it doesn't exist

  • 3: 1febfa2 = 3: fbca03c gvfs-helper: better handling of network errors

  • 4: 90b2c1f = 4: f649855 gvfs-helper-client: properly update loose cache with fetched OID

  • 5: 81a4c84 = 5: 2025694 gvfs-helper: V2 robust retry and throttling

  • 6: a1d451a = 6: 2354e5e gvfs-helper: expose gvfs/objects GET and POST semantics

  • 7: 35fd5f6 = 7: 0a383ae gvfs-helper: dramatically reduce progress noise

  • 8: 9661fd2 = 8: 223e8d1 gvfs-helper-client.h: define struct object_id

  • 9: 338ce6d = 9: 9a231be gvfs-helper: handle pack-file after single POST request

  • 10: 46c8849 = 10: 096808a test-gvfs-prococol, t5799: tests for gvfs-helper

  • 11: 25c4099 = 11: 83a75ea gvfs-helper: move result-list construction into install functions

  • 12: c513ef6 = 12: 6a88c8d t5799: add support for POST to return either a loose object or packfile

  • 13: 1dc1bfd = 13: 6b8a426 t5799: cleanup wc-l and grep-c lines

  • 14: 9b50699 = 14: 0bddaad gvfs-helper: verify loose objects after write

  • 15: 032bb40 = 15: e6e3baf t7599: create corrupt blob test

  • 16: 493255b = 16: b966881 gvfs-helper: add prefetch support

  • 17: a885f07 = 17: 03074d8 gvfs-helper: add prefetch .keep file for last packfile

  • 18: 07427d7 = 18: 49dd792 gvfs-helper: do one read in my_copy_fd_len_tail()

  • 19: f985a38 = 19: 9ace465 gvfs-helper: move content-type warning for prefetch packs

  • 20: 1859ddf = 20: a48f6db fetch: use gvfs-helper prefetch under config

  • 21: 492eae7 = 21: ed3b074 gvfs-helper: better support for concurrent packfile fetches

  • 22: dd6b4d8 = 22: 0d273a9 remote-curl: do not call fetch-pack when using gvfs-helper

  • 23: dd65cbd = 23: ddc04e9 fetch: reprepare packs before checking connectivity

  • 24: 230ce00 = 24: 884e8df gvfs-helper: retry when creating temp files

  • 25: dd52498 = 25: e726173 sparse: avoid warnings about known cURL issues in gvfs-helper.c

  • 37: fe3a99b = 26: 81f012e gvfs-helper: add --max-retries to prefetch verb

  • 39: fd17026 = 27: 4b63604 t5799: add tests to detect corrupt pack/idx files in prefetch

  • 41: 3f9614f = 28: 8b1da54 gvfs-helper: ignore .idx files in prefetch multi-part responses

  • 43: 495c541 = 29: 4f2a700 t5799: explicitly test gvfs-helper --fallback and --no-fallback

  • 45: f52a197 = 30: 20fad5c gvfs-helper: don't fallback with new config

  • 47: 5985486 = 31: d17fd04 test-gvfs-protocol: add cache_http_503 to mayhem

  • 26: 7012ab0 = 32: d85432a maintenance: care about gvfs.sharedCache config

  • 49: e10c615 = 33: 4c1fb17 t5799: add unit tests for new gvfs.fallback config setting

  • 27: 59476ce = 34: fa0eeee unpack-trees:virtualfilesystem: Improve efficiency of clear_ce_flags

  • 28: f6811a4 = 35: f9d3e64 homebrew: add GitHub workflow to release Cask

  • 29: 8b6d6a0 = 36: 311ff70 Adding winget workflows

  • 30: 23b85ef = 37: 7b64a8d Disable the monitor-components workflow in msft-git

  • 31: 8277d9f = 38: 16297e0 .github: enable windows builds on microsoft fork

  • 32: 4cee739 = 39: b5d633d release: create initial Windows installer build workflow

  • 33: 96ed6a6 = 40: 3568fe4 help: special-case HOST_CPU universal

  • 34: 2001a21 = 41: 189e479 release: add Mac OSX installer build

  • 35: 326da65 = 42: 7c256d9 release: build unsigned Ubuntu .deb package

  • 36: 05bf35b = 43: eac99dd release: add signing step for .deb package

  • 38: 7f6578e = 44: 4fed599 release: create draft GitHub release with packages & installers

  • 40: 86d60ad = 45: 4d1dd95 build-git-installers: publish gpg public key

  • 42: 14c381e = 46: dee8513 release: continue pestering until user upgrades

  • 44: 9ebe655 = 47: fc05295 Makefile: allow specifying GIT_BUILT_FROM_COMMIT

  • 51: 60ff902 = 48: 7cf211e update-microsoft-git: create barebones builtin

  • 52: 66f5a58 = 49: 2edf846 update-microsoft-git: Windows implementation

  • 53: 3140d78 = 50: 1d9421c update-microsoft-git: use brew on macOS

  • 54: 283df2c = 51: 1e2e27b .github: update ISSUE_TEMPLATE.md for microsoft/git

  • 46: b82cb38 = 52: e3348f3 dist: archive HEAD instead of HEAD^{tree}

  • 55: b9b6ff0 = 53: 821239c .github: update PULL_REQUEST_TEMPLATE.md

  • 48: 76fbdf5 = 54: 42d58c9 release: include GIT_BUILT_FROM_COMMIT in MacOS build

  • 56: 21cf902 = 55: 3bb231d Adjust README.md for microsoft/git

  • 50: ae60edc = 56: 1005e7f release: add installer validation

  • 57: c0b909c ! 57: cc4f834 scalar: implement a minimal JSON parser

    @@ json-parser.c (new)
     +#include "hex.h"
     +#include "json-parser.h"
     +
    -+static int reset_iterator(struct json_iterator *it)
    ++int reset_iterator(struct json_iterator *it)
     +{
     +	it->p = it->begin = it->json;
     +	strbuf_release(&it->key);
    @@ json-parser.h (new)
     +}
     +
     +int iterate_json(struct json_iterator *it);
    ++/* Releases the iterator, always returns -1 */
    ++int reset_iterator(struct json_iterator *it);
     +
     +#endif
  • 58: 83e0c43 ! 58: 53dd1e3 scalar clone: support GVFS-enabled remote repositories

    @@ scalar.c: static int set_config(const char *fmt, ...)
     +		struct cache_server_url_data data = { .url = NULL };
     +
     +		if (iterate_json(&it) < 0) {
    ++			reset_iterator(&it);
     +			strbuf_release(&out);
     +			return error("JSON parse error");
     +		}
    @@ scalar.c: static int set_config(const char *fmt, ...)
     +		it.fn = get_cache_server_url;
     +		it.fn_data = &data;
     +		if (iterate_json(&it) < 0) {
    ++			reset_iterator(&it);
     +			strbuf_release(&out);
     +			return error("JSON parse error");
     +		}
     +		*cache_server_url = data.url;
     +		free(data.key);
    ++		reset_iterator(&it);
    ++		strbuf_release(&out);
     +		return 1;
     +	}
     +	strbuf_release(&out);
  • 59: e43d8e3 = 59: 0795258 test-gvfs-protocol: also serve smart protocol

  • 60: 9f77436 = 60: 43115b7 gvfs-helper: add the endpoint command

  • 61: 9fdfd49 = 61: c5cf389 dir_inside_of(): handle directory separators correctly

  • 62: cedefc5 = 62: 060af40 scalar: disable authentication in unattended mode

  • 63: 4eb15e1 = 63: 6c037be scalar: do initialize gvfs.sharedCache

  • 64: 885dc55 = 64: 6fd5e16 scalar diagnose: include shared cache info

  • 65: e29b381 = 65: 2422653 scalar: only try GVFS protocol on https:// URLs

  • 66: bab0aa5 = 66: bf66fa7 scalar: verify that we can use a GVFS-enabled repository

  • 67: e9ee3ed ! 67: fee0278 scalar: add the cache-server command

    @@ scalar.c: static int supports_gvfs_protocol(const char *url, char **cache_server
     +		if (!cache_server_url) {
     +			it.fn = list_cache_server_urls;
     +			if (iterate_json(&it) < 0) {
    ++				reset_iterator(&it);
     +				strbuf_release(&out);
     +				return error("JSON parse error");
     +			}
    ++			reset_iterator(&it);
     +			strbuf_release(&out);
     +			return 0;
     +		}
     +
      		if (iterate_json(&it) < 0) {
    + 			reset_iterator(&it);
      			strbuf_release(&out);
    - 			return error("JSON parse error");
     @@ scalar.c: static int supports_gvfs_protocol(const char *url, char **cache_server_url)
      		return 1;
      	}
  • 68: 662745c = 68: eb1222c scalar: add a test toggle to skip accessing the vsts/info endpoint

  • 69: 251ed5e = 69: 4946c70 scalar: adjust documentation to the microsoft/git fork

  • 70: 0332292 = 70: 0b78b8b scalar: enable untracked cache unconditionally

  • 71: 23f7b5a = 71: 9866106 scalar: parse clone --no-fetch-commits-and-trees for backwards compatibility

  • 72: 3e45ffb ! 72: 8400f72 scalar: make GVFS Protocol a forced choice

    @@ t/t9210-scalar.sh: test_expect_success '`scalar clone` with GVFS-enabled server'
     +		--single-branch -- http://$HOST_PORT/ skipping-gvfs &&
     +
     +	! grep "GET/config(main)" <clone-trace-no-gvfs &&
    -+	! git config -C skipping-gvfs/src core.gvfs &&
    ++	! git -C skipping-gvfs/src config core.gvfs &&
     +
     +	test_config -C skipping-gvfs/src remote.origin.partialclonefilter blob:none
     +'
  • 73: f3ec7ab = 73: 7c3f9df scalar diagnose: accommodate Scalar's Functional Tests

  • 74: 4143dd3 = 74: c69b0e4 ci: run Scalar's Functional Tests

  • 75: 1769380 = 75: cb23072 scalar: upgrade to newest FSMonitor config setting

  • 76: 4b01312 = 76: d4c0332 abspath: make strip_last_path_component() global

  • 77: 4abe9c6 = 77: 8d49599 scalar: configure maintenance during 'reconfigure'

  • 78: dfa161d = 78: 667afc6 scalar: .scalarCache should live above enlistment

  • 79: 3fe320b = 79: 580ac2c add/rm: allow adding sparse entries when virtual

  • 80: 31b8047 = 80: 9491ca6 sparse-checkout: add config to disable deleting dirs

  • 81: 28f373b = 81: e05407d diff: ignore sparse paths in diffstat

  • 82: 61af8d0 = 82: 6483606 repo-settings: enable sparse index by default

  • 83: 2a7bd47 = 83: 4e354d7 diff(sparse-index): verify with partially-sparse

  • 84: 0bda1b3 = 84: 5e9103c stash: expand testing for git stash -u

  • 85: cd3f9cc = 85: fe5c6a7 sparse: add vfs-specific precautions

  • 86: b8fcec9 = 86: 0822957 reset: fix mixed reset when using virtual filesystem

  • 87: 9a9edb8 = 87: 0c19f8e sparse-index: add ensure_full_index_with_reason()

  • 88: 5ad7234 = 88: cfaf999 treewide: add reasons for expanding index

  • 89: 36e13c9 = 89: 3df0b6b treewide: custom reasons for expanding index

  • 90: 1002935 = 90: 8e62f70 sparse-index: add macro for unaudited expansions

  • 91: 2207d4b = 91: 836ca96 Docs: update sparse index plan with logging

  • 92: 0e4f64a = 92: 1c573de sparse-index: log failure to clear skip-worktree

  • 93: a0eb045 = 93: cd253da stash: use -f in checkout-index child process

  • 94: 2749f0d = 94: bb19962 sparse-index: do not copy hashtables during expansion

  • 95: 489d4fa = 95: 540b71d t5616: mark tests as bogus with --path-walk

  • 96: a14fb11 = 96: cdd0b4a path-walk: add new 'edge_aggressive' option

  • 97: 36b1bfe = 97: cf7f9da pack-objects: allow --shallow and --path-walk

  • 98: 4c58c01 = 98: 1b5040f t5538: add test to confirm deltas in shallow pushes

  • 99: 3c1be7c = 99: c2d4396 gitk: check main window visibility before waiting for it to show

  • 100: a38426e ! 100: 88d7049 sub-process: avoid leaking cmd

    @@ Metadata
      ## Commit message ##
         sub-process: avoid leaking `cmd`
     
    +    In some instances (particularly the `read_object` hook), the `cmd`
    +    attribute is set to an `strdup()`ed value. This value needs to be
    +    released in the end!
    +
    +    Since other users assign a non-`strdup()`ed value, be careful to add
    +    _another_ attribute (called `to_free`) that can hold a reference to such
    +    a string that needs to be released once the sub process is done.
    +
         Signed-off-by: Johannes Schindelin <[email protected]>
     
      ## sub-process.c ##
    @@ sub-process.c: void subprocess_stop(struct hashmap *hashmap, struct subprocess_e
      	finish_command(&entry->process);
      
      	hashmap_remove(hashmap, &entry->ent, NULL);
    -+	FREE_AND_NULL(entry->cmd);
    ++	FREE_AND_NULL(entry->to_free);
    ++	entry->cmd = NULL;
      }
      
      static void subprocess_exit_handler(struct child_process *process)
    +@@ sub-process.c: int subprocess_start(struct hashmap *hashmap, struct subprocess_entry *entry, co
    + 	process->trace2_child_class = "subprocess";
    + 
    + 	entry->cmd = process->args.v[0];
    ++	entry->to_free = NULL;
    + 
    + 	err = start_command(process);
    + 	if (err) {
     @@ sub-process.c: int subprocess_start_strvec(struct hashmap *hashmap,
    + 	process->trace2_child_class = "subprocess";
    + 
    + 	sq_quote_argv_pretty(&quoted, argv->v);
    +-	entry->cmd = strbuf_detach(&quoted, NULL);
    ++	entry->cmd = entry->to_free = strbuf_detach(&quoted, NULL);
    + 
      	err = start_command(process);
      	if (err) {
      		error("cannot fork to run subprocess '%s'", entry->cmd);
    -+		FREE_AND_NULL(entry->cmd);
    ++		FREE_AND_NULL(entry->to_free);
    ++		entry->cmd = NULL;
      		return err;
      	}
      
    @@ sub-process.c: int subprocess_start_strvec(struct hashmap *hashmap,
      	err = startfn(entry);
      	if (err) {
      		error("initialization for subprocess '%s' failed", entry->cmd);
    -+		FREE_AND_NULL(entry->cmd);
    ++		FREE_AND_NULL(entry->to_free);
    ++		entry->cmd = NULL;
      		subprocess_stop(hashmap, entry);
      		return err;
      	}
    +
    + ## sub-process.h ##
    +@@
    + struct subprocess_entry {
    + 	struct hashmap_entry ent;
    + 	const char *cmd;
    ++	/**
    ++	 * In case `cmd` is a `strdup()`ed value that needs to be released,
    ++	 * you can assign the pointer to `to_free` so that `subprocess_stop()`
    ++	 * will release it.
    ++	 */
    ++	char *to_free;
    + 	struct child_process process;
    + };
    + 
  • -: ----------- > 101: 0282afe remote-curl: release filter options before re-setting them

  • -: ----------- > 102: 16f8fbc transport: release object filter options

@dscho
Copy link
Member Author

dscho commented Dec 19, 2024

Backported #707, #712 and #713.

git range-diff --remerge-diff 2dc56ed..1d7817c 8ad18d5..df8e7d8

(The --remerge-diff option requires gitgitgadget#1734 to work.)

@dscho dscho force-pushed the tentative/vfs-2.48.0 branch from df8e7d8 to 136e98a Compare December 19, 2024 15:17
@dscho
Copy link
Member Author

dscho commented Dec 19, 2024

Just to clean up a little, I squashed a few patches (the force-push is tree-same):

Range-diff since previous force-push
  • 1: b5d633d ! 1: 507098b release: create initial Windows installer build workflow

    @@ .github/workflows/build-git-installers.yml (new)
     +          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 }}"
     +  # End check prerequisites for the workflow
     +
    -+  # Build Windows installers (x86_64 installer & portable)
    ++  # Build Windows installers (x86_64 & aarch64; installer & portable)
     +  windows_pkg:
    -+    runs-on: windows-2019
     +    environment: release
     +    needs: prereqs
    ++    strategy:
    ++      fail-fast: false
    ++      matrix:
    ++        arch:
    ++          - name: x86_64
    ++            artifact: pkg-x86_64
    ++            toolchain: x86_64
    ++            mingwprefix: mingw64
    ++            runner: windows-2019
    ++          - name: aarch64
    ++            artifact: pkg-aarch64
    ++            toolchain: clang-aarch64
    ++            mingwprefix: clangarm64
    ++            runner: ['self-hosted', '1ES.Pool=github-arm64-pool']
    ++    runs-on: ${{ matrix.arch.runner }}
     +    env:
     +      GPG_OPTIONS: "--batch --yes --no-tty --list-options no-show-photos --verify-options no-show-photos --pinentry-mode loopback"
     +      HOME: "${{github.workspace}}\\home"
    @@ .github/workflows/build-git-installers.yml (new)
     +      - uses: git-for-windows/setup-git-for-windows-sdk@v1
     +        with:
     +          flavor: build-installers
    ++          architecture: ${{ matrix.arch.name }}
     +      - name: Clone build-extra
     +        shell: bash
     +        run: |
    @@ .github/workflows/build-git-installers.yml (new)
     +          git config --global user.email "<${info#*<}"
     +        env:
     +          GPGKEY: ${{secrets.GPGKEY}}
    -+      - name: Build mingw-w64-x86_64-git
    ++      - name: Build mingw-w64-${{matrix.arch.toolchain}}-git
     +        env:
     +          GPGKEY: "${{secrets.GPGKEY}}"
     +        shell: bash
    @@ .github/workflows/build-git-installers.yml (new)
     +          set -x
     +
     +          # Make sure that there is a `/usr/bin/git` that can be used by `makepkg-mingw`
    -+          printf '#!/bin/sh\n\nexec /mingw64/bin/git.exe "$@"\n' >/usr/bin/git &&
    -+
    -+          # Restrict `PATH` to MSYS2 and to Visual Studio (to let `cv2pdb` find the relevant DLLs)
    -+          PATH="/mingw64/bin:/usr/bin:/C/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/amd64:/C/Windows/system32"
    ++          printf '#!/bin/sh\n\nexec /${{matrix.arch.mingwprefix}}/bin/git.exe "$@"\n' >/usr/bin/git &&
     +
    -+          type -p mspdb140.dll || exit 1
    -+
    -+          sh -x /usr/src/build-extra/please.sh build-mingw-w64-git --only-64-bit --build-src-pkg -o artifacts HEAD &&
    ++          sh -x /usr/src/build-extra/please.sh build-mingw-w64-git --only-${{matrix.arch.name}} --build-src-pkg -o artifacts HEAD &&
     +          if test -n "$GPGKEY"
     +          then
     +            for tar in artifacts/*.tar*
    @@ .github/workflows/build-git-installers.yml (new)
     +          cp PKGBUILD.$version PKGBUILD &&
     +          git commit -s -m "mingw-w64-git: new version ($version)" PKGBUILD &&
     +          git bundle create "$b"/MINGW-packages.bundle origin/main..main)
    -+      - name: Publish mingw-w64-x86_64-git
    ++      - name: Publish mingw-w64-${{matrix.arch.toolchain}}-git
     +        uses: actions/upload-artifact@v4
     +        with:
    -+          name: pkg-x86_64
    ++          name: "${{ matrix.arch.artifact }}"
     +          path: artifacts
     +  windows_artifacts:
    -+    runs-on: windows-2019
     +    environment: release
     +    needs: [prereqs, windows_pkg]
     +    env:
     +      HOME: "${{github.workspace}}\\home"
     +    strategy:
    ++      fail-fast: false
     +      matrix:
    -+        artifact:
    ++        arch:
    ++          - name: x86_64
    ++            artifact: pkg-x86_64
    ++            toolchain: x86_64
    ++            mingwprefix: mingw64
    ++            runner: windows-2019
    ++          - name: aarch64
    ++            artifact: pkg-aarch64
    ++            toolchain: clang-aarch64
    ++            mingwprefix: clangarm64
    ++            runner: ['self-hosted', '1ES.Pool=github-arm64-pool']
    ++        type:
     +          - name: installer
     +            fileprefix: Git
     +          - name: portable
     +            fileprefix: PortableGit
    -+      fail-fast: false
    ++    runs-on: ${{ matrix.arch.runner }}
     +    steps:
    -+      - name: Download pkg-x86_64
    ++      - name: Download ${{ matrix.arch.artifact }}
     +        uses: actions/download-artifact@v4
     +        with:
    -+          name: pkg-x86_64
    -+          path: pkg-x86_64
    ++          name: ${{ matrix.arch.artifact }}
    ++          path: ${{ matrix.arch.artifact }}
     +      - uses: git-for-windows/setup-git-for-windows-sdk@v1
     +        with:
     +          flavor: build-installers
    ++          architecture: ${{ matrix.arch.name }}
     +      - name: Clone build-extra
     +        shell: bash
     +        run: |
    @@ .github/workflows/build-git-installers.yml (new)
     +          EOF
     +
     +          sed -i -e '/^#include "file-list.iss"/a\
    -+          Source: {#SourcePath}\\..\\git-update-git-for-windows.config; DestDir: {app}\\mingw64\\bin; Flags: replacesameversion; AfterInstall: DeleteFromVirtualStore' \
    ++          Source: {#SourcePath}\\..\\git-update-git-for-windows.config; DestDir: {app}\\${{matrix.arch.mingwprefix}}\\bin; Flags: replacesameversion; AfterInstall: DeleteFromVirtualStore' \
     +            -e '/^Type: dirifempty; Name: {app}\\{#MINGW_BITNESS}$/i\
     +          Type: files; Name: {app}\\{#MINGW_BITNESS}\\bin\\git-update-git-for-windows.config\
     +          Type: dirifempty; Name: {app}\\{#MINGW_BITNESS}\\bin' \
     +            $b/installer/install.iss
    -+      - name: Set the installer Publisher to the GitClient team
    ++      - name: Set the installer Publisher to the Git Client team
     +        shell: bash
     +        run: |
     +          b=/usr/src/build-extra &&
    -+          sed -i -e 's/^\(AppPublisher=\).*/\1The GitClient Team at Microsoft/' $b/installer/install.iss
    ++          sed -i -e 's/^\(AppPublisher=\).*/\1The Git Client Team at Microsoft/' $b/installer/install.iss
     +      - name: Let the installer configure Visual Studio to use the installed Git
     +        shell: bash
     +        run: |
    @@ .github/workflows/build-git-installers.yml (new)
     +                  WizardSelectComponents('scalar');\n\
     +          #endif\n\
     +              end;" $b/installer/install.iss
    -+      - name: Build 64-bit ${{matrix.artifact.name}}
    ++      - name: Build ${{matrix.type.name}} (${{matrix.arch.name}})
     +        shell: bash
     +        run: |
     +          set -x
    @@ .github/workflows/build-git-installers.yml (new)
     +          # Copy the PDB archive to the directory where `--include-pdbs` expects it
     +          b=/usr/src/build-extra &&
     +          mkdir -p $b/cached-source-packages &&
    -+          cp pkg-x86_64/*-pdb* $b/cached-source-packages/ &&
    ++          cp ${{matrix.arch.artifact}}/*-pdb* $b/cached-source-packages/ &&
     +
     +          # Build the installer, embedding PDBs
     +          eval $b/please.sh make_installers_from_mingw_w64_git --include-pdbs \
     +              --version=${{ needs.prereqs.outputs.tag_version }} \
    -+              -o artifacts --${{matrix.artifact.name}} \
    -+              --pkg=pkg-x86_64/mingw-w64-x86_64-git-[0-9]*.tar.xz \
    -+              --pkg=pkg-x86_64/mingw-w64-x86_64-git-doc-html-[0-9]*.tar.xz &&
    ++              -o artifacts --${{matrix.type.name}} \
    ++              --pkg=${{matrix.arch.artifact}}/mingw-w64-${{matrix.arch.toolchain}}-git-[0-9]*.tar.xz \
    ++              --pkg=${{matrix.arch.artifact}}/mingw-w64-${{matrix.arch.toolchain}}-git-doc-html-[0-9]*.tar.xz &&
     +
    -+          if test portable = '${{matrix.artifact.name}}' && test -n "$(git config alias.signtool)"
    ++          if test portable = '${{matrix.type.name}}' && test -n "$(git config alias.signtool)"
     +          then
     +            git signtool artifacts/PortableGit-*.exe
     +          fi &&
    -+          openssl dgst -sha256 artifacts/${{matrix.artifact.fileprefix}}-*.exe | sed "s/.* //" >artifacts/sha-256.txt
    ++          openssl dgst -sha256 artifacts/${{matrix.type.fileprefix}}-*.exe | sed "s/.* //" >artifacts/sha-256.txt
     +      - name: Verify that .exe files are code-signed
     +        if: env.CODESIGN_P12 != '' && env.CODESIGN_PASS != ''
     +        shell: bash
     +        run: |
     +          PATH=$PATH:"/c/Program Files (x86)/Windows Kits/10/App Certification Kit/" \
    -+          signtool verify //pa artifacts/${{matrix.artifact.fileprefix}}-*.exe
    -+      - name: Publish ${{matrix.artifact.name}}-x86_64
    ++          signtool verify //pa artifacts/${{matrix.type.fileprefix}}-*.exe
    ++      - name: Publish ${{matrix.type.name}}-${{matrix.arch.name}}
     +        uses: actions/upload-artifact@v4
     +        with:
    -+          name: win-${{matrix.artifact.name}}-x86_64
    ++          name: win-${{matrix.type.name}}-${{matrix.arch.name}}
     +          path: artifacts
     +  # End build Windows installers
  • 2: 3568fe4 = 2: ca61dab help: special-case HOST_CPU universal

  • 3: 189e479 ! 3: c8443b9 release: add Mac OSX installer build

    @@ .github/scripts/symlink-git-hardlinks.rb (new)
     
      ## .github/workflows/build-git-installers.yml ##
     @@ .github/workflows/build-git-installers.yml: jobs:
    -           name: win-${{matrix.artifact.name}}-x86_64
    +           name: win-${{matrix.type.name}}-${{matrix.arch.name}}
                path: artifacts
        # End build Windows installers
     +
     +  # Build and sign Mac OSX installers & upload artifacts
     +  create-macos-artifacts:
    -+    strategy:
    -+      matrix:
    -+        arch:
    -+          - name: arm64
    -+            runner: macos-latest-xl-arm64
    -+    runs-on: ${{ matrix.arch.runner }}
    ++    runs-on: macos-latest-xl-arm64
     +    needs: prereqs
     +    env:
     +      VERSION: "${{ needs.prereqs.outputs.tag_version }}"
  • 4: 7c256d9 = 4: 9640d0e release: build unsigned Ubuntu .deb package

  • 5: eac99dd = 5: b08e1f7 release: add signing step for .deb package

  • 6: 4fed599 ! 6: cb1d168 release: create draft GitHub release with packages & installers

    @@ .github/workflows/build-git-installers.yml: jobs:
     +        needs.create-macos-artifacts.result == 'success' &&
     +        needs.windows_artifacts.result == 'success')
     +    steps:
    -+      - name: Download Windows portable installer
    ++      - name: Download Windows portable (x86_64)
     +        uses: actions/download-artifact@v4
     +        with:
     +          name: win-portable-x86_64
     +          path: win-portable-x86_64
     +
    -+      - name: Download Windows x86_64 installer
    ++      - name: Download Windows portable (aarch64)
    ++        uses: actions/download-artifact@v4
    ++        with:
    ++          name: win-portable-aarch64
    ++          path: win-portable-aarch64
    ++
    ++      - name: Download Windows installer (x86_64)
     +        uses: actions/download-artifact@v4
     +        with:
     +          name: win-installer-x86_64
     +          path: win-installer-x86_64
     +
    ++      - name: Download Windows installer (aarch64)
    ++        uses: actions/download-artifact@v4
    ++        with:
    ++          name: win-installer-aarch64
    ++          path: win-installer-aarch64
    ++
     +      - name: Download macOS artifacts
     +        uses: actions/download-artifact@v4
     +        with:
    @@ .github/workflows/build-git-installers.yml: jobs:
     +            }
     +
     +            await Promise.all([
    -+              // Upload Windows artifacts
    ++              // Upload Windows x86_64 artifacts
     +              uploadDirectoryToRelease('win-installer-x86_64', ['.exe']),
     +              uploadDirectoryToRelease('win-portable-x86_64', ['.exe']),
     +
    ++              // Upload Windows aarch64 artifacts
    ++              uploadDirectoryToRelease('win-installer-aarch64', ['.exe']),
    ++              uploadDirectoryToRelease('win-portable-aarch64', ['.exe']),
    ++
     +              // Upload Mac artifacts
     +              uploadDirectoryToRelease('macos-artifacts'),
     +
  • 7: 4d1dd95 = 7: a02a960 build-git-installers: publish gpg public key

  • 8: dee8513 ! 8: 203a2b7 release: continue pestering until user upgrades

    @@ .github/workflows/build-git-installers.yml: jobs:
     +        run: |
     +          set -x
     +
    -+          b=/mingw64/bin &&
    ++          b=/${{matrix.arch.mingwprefix}}/bin &&
     +
     +          sed -i -e '6 a use_recently_seen=no' \
     +            $b/git-update-git-for-windows
    -       - name: Set the installer Publisher to the GitClient team
    +       - name: Set the installer Publisher to the Git Client team
              shell: bash
              run: |
  • 9: fc05295 = 9: 952308c Makefile: allow specifying GIT_BUILT_FROM_COMMIT

  • 10: e3348f3 = 10: 1243dab dist: archive HEAD instead of HEAD^{tree}

  • 11: 42d58c9 = 11: 335d528 release: include GIT_BUILT_FROM_COMMIT in MacOS build

  • 12: 1005e7f ! 12: 81380bc release: add installer validation

    @@ .github/workflows/build-git-installers.yml: jobs:
     +          - os: windows-latest
     +            artifact: win-installer-x86_64
     +            command: $PROGRAMFILES\Git\cmd\git.exe
    ++          - os: ['self-hosted', '1ES.Pool=github-arm64-pool']
    ++            artifact: win-installer-aarch64
    ++            command: $PROGRAMFILES\Git\cmd\git.exe
     +    runs-on: ${{ matrix.component.os }}
     +    needs: [prereqs, windows_artifacts, create-macos-artifacts, create-linux-artifacts]
     +    steps:
    @@ .github/workflows/build-git-installers.yml: jobs:
     +          name: ${{ matrix.component.artifact }}
     +
     +      - name: Install Windows
    -+        if: contains(matrix.component.os, 'windows')
    ++        if: contains(matrix.component.artifact, 'win-installer')
     +        shell: pwsh
     +        run: |
     +          $exePath = Get-ChildItem -Path ./*.exe | %{$_.FullName}
     +          Start-Process -Wait -FilePath "$exePath" -ArgumentList "/SILENT /VERYSILENT /NORESTART /SUPPRESSMSGBOXES /ALLOWDOWNGRADE=1"
     +
     +      - name: Install Linux
    -+        if: contains(matrix.component.os, 'ubuntu')
    ++        if: contains(matrix.component.artifact, 'linux')
     +        run: |
     +          debpath=$(find ./*.deb)
     +          sudo apt install $debpath
     +
     +      - name: Install macOS
    -+        if: contains(matrix.component.os, 'macos')
    ++        if: contains(matrix.component.artifact, 'macos')
     +        run: |
     +          # avoid letting Homebrew's `git` in `/opt/homebrew/bin` override `/usr/local/bin/git`
     +          arch="$(uname -m)"
  • 13: 0c19f8e = 13: ed50aee sparse-index: add ensure_full_index_with_reason()

  • 14: cfaf999 = 14: 4a3716e treewide: add reasons for expanding index

  • 15: 3df0b6b = 15: 67f9786 treewide: custom reasons for expanding index

  • 16: 8e62f70 = 16: 0acb887 sparse-index: add macro for unaudited expansions

  • 17: 836ca96 = 17: e320cf4 Docs: update sparse index plan with logging

  • 18: 1c573de = 18: 1da9e19 sparse-index: log failure to clear skip-worktree

  • 19: cd253da = 19: eaf5ec4 stash: use -f in checkout-index child process

  • 20: bb19962 = 20: ae4c7b7 sparse-index: do not copy hashtables during expansion

  • 21: 540b71d = 21: 65271cc t5616: mark tests as bogus with --path-walk

  • 22: cdd0b4a = 22: 72e1f88 path-walk: add new 'edge_aggressive' option

  • 23: cf7f9da = 23: d06dcfb pack-objects: allow --shallow and --path-walk

  • 24: 1b5040f = 24: add1a6c t5538: add test to confirm deltas in shallow pushes

  • 25: c2d4396 = 25: f11aacf gitk: check main window visibility before waiting for it to show

  • 26: 88d7049 = 26: 7416538 sub-process: avoid leaking cmd

  • 27: 0282afe = 27: f7ec704 remote-curl: release filter options before re-setting them

  • 28: 16f8fbc = 28: 35eabbe transport: release object filter options

  • 29: 5eeafc3 < -: ----------- build-git-installers.yml: drop cv2pdb exist test

  • 30: dfe5511 < -: ----------- build-git-installers.yml: remove matrix strategy for Mac

  • 31: 4a56c17 < -: ----------- aarch64: add support for Windows on ARM

  • -: ----------- > 29: a98e1c2 aarch64: add support for Windows on ARM

  • 32: 51a8889 = 30: e9b77ee mingw: special-case administrators even more

  • 33: 21149dc = 31: f98b958 test-tool path-utils: support debugging "dubious ownership" issues

  • 34: 31e3659 = 32: bed0943 push: don't reuse deltas with path walk

Quick call-out:

What remains of this patch will be superseded by git-for-windows#5322 once I rebase onto -rc1.

vdye and others added 17 commits December 31, 2024 11:49
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 <[email protected]>
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 <[email protected]>
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 <[email protected]>
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 <[email protected]>
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 <[email protected]>
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 <[email protected]>
Calculate the number of symrefs, loose vs packed, and the
maximal/accumulated length of local vs remote branches.

Signed-off-by: Jeff Hostetler <[email protected]>
Signed-off-by: Johannes Schindelin <[email protected]>
This backports the `ds/advice-sparse-index-expansion` patches into
`microsoft/git` which _just_ missed the v2.46.0 window.

Signed-off-by: Johannes Schindelin <[email protected]>
Cherry-pick rev-index fixes from v2.41.0.vfs.0.5 into v2.42.0.*
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.
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 <[email protected]>
Signed-off-by: Johannes Schindelin <[email protected]>
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 <[email protected]>
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 <[email protected]>
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 <[email protected]>
derrickstolee and others added 28 commits January 1, 2025 17:12
This adds a new builtin, `git update-microsoft-git`, that executes the platform-specific upgrade steps to get the latest version of `microsoft-git`.

On Windows, this means running `git update-git-for-windows` which was updated to use the `microsoft/git` releases page, when appropriate. See #321 for details.

On macOS, this means running a sequence of `brew` commands. These are adapted from the `UpgradeVerb` in `microsoft/scalar`, with an important simplification: we don't need to differentiate between the `scalar` and `scalar-azrepos` cask.
…x-built-in-fsmonitor

Fix the built-in FSMonitor, and run Scalar's Functional Tests as part of the automated builds
It is sometimes difficult to support users who are hitting issues with
sparse index expansion because it is unclear why the index needs to expand
from logs alone. It is too invasive to set up a debugging scenario on the
user's machine, so let's improve the logging.

Create a new ensure_full_index_with_reason() method that takes a formatting
string and parameters. If the index is not fully expanded, then apply the
formatting logic to create the logged string and log it before calling
ensure_full_index(). This should assist with discovering why an index is
expanded from trace2 logs alone.

Signed-off-by: Derrick Stolee <[email protected]>
Signed-off-by: Johannes Schindelin <[email protected]>
This is random stuff that probably all got upstream in the meantime.
These locations that previously called ensure_full_index() are now
updated to call the ..._with_reason() varation using fixed strings that
should be enough to identify the reason for the expansion.

This will help users use tracing to determine why the index is expanding
in their scenarios.

Signed-off-by: Derrick Stolee <[email protected]>
Signed-off-by: Johannes Schindelin <[email protected]>
These cases that call ensure_full_index() are likely to be due to a data
shape issue on a user's machine, so take the extra time to format a
message that can be placed in their trace2 output and hopefully identify
the problem that is leading to this slow behavior.

Signed-off-by: Derrick Stolee <[email protected]>
Signed-off-by: Johannes Schindelin <[email protected]>
For safety, areas of code that iterate over the cache entries in the
index were guarded with ensure_full_index() and labeled with a comment.
Replace these with a macro that calls ensure_full_index_with_reason()
using the line number of the caller to help identify the situation that
is causing the index expansion.

Signed-off-by: Derrick Stolee <[email protected]>
The recent changes update the callers of ensure_full_index() to call
variants that will log extra information. This should assist developers
assisting users who are hitting the sparse index expansion message.

Signed-off-by: Derrick Stolee <[email protected]>
Signed-off-by: Johannes Schindelin <[email protected]>
The clear_skip_worktree_from_present_files_sparse() method attempts to
clear the skip worktree bit from cache entries in the index depending on
when they exist in the workdir. When this comes across a sparse
directory that actually exists in the workdir, then this method fails
and signals that the index needs expansion.

The index expansion already logs a reason, but this reason is separate
from the path that caused this failure.

Add logging to demonstrate this situation for full clarity.

Signed-off-by: Derrick Stolee <[email protected]>
Signed-off-by: Johannes Schindelin <[email protected]>
I will intend to send this upstream after the 2.47.0 release cycle, but
this should get to our microsoft/git users for maximum impact.

Customers have been struggling with explaining why the sparse index
expansion advice message is showing up. The advice to run 'git clean'
has not always helped folks, and sometimes it is very unclear why we are
running into trouble.

These changes introduce a way to log a reason for the expansion into the
trace2 logs so it can be found by requesting that a user enable tracing.

While testing this, I created the most standard case that happens, which
is to have an existing directory match a sparse directory in the index.
In this case, it showed that two log messages were required. See the
last commit for this new log message. Together, these two places show
this kind of message in the `GIT_TRACE2_PERF` output (trimmed for
clarity):

```
region_enter | index        | label:clear_skip_worktree_from_present_files_sparse
data         | sparse-index | ..skip-worktree sparsedir:<my-sparse-path>/
data         | index        | ..sparse_path_count:362
data         | index        | ..sparse_lstat_count:732
region_leave | index        | label:clear_skip_worktree_from_present_files_sparse
data         | sparse-index | expansion-reason:failed to clear skip-worktree while sparse
```

I added some tests to demonstrate that these logs are recorded, but it
also seems difficult to hit some of these cases.
These two tests in t5616-partial-clone.sh are actually already broken
and there are comments supporting that. Those comments were focused on
the GIT_TEST_FULL_NAME_HASH variable, but they also apply to this one.
We will want to avoid issues here.

Signed-off-by: Derrick Stolee <[email protected]>
In preparation for allowing both the --shallow and --path-walk options
in the 'git pack-objects' builtin, create a new 'edge_aggressive' option
in the path-walk API. This option will help walk the boundary more
thoroughly and help avoid sending extra objects during fetches and
pushes.

The only use of the 'edge_hint_aggressive' option in the revision API is
within mark_edges_uninteresting(), which is usually called before
between prepare_revision_walk() and before visiting commits with
get_revision(). In prepare_revision_walk(), the UNINTERESTING commits
are walked until a boundary is found.

We didn't use this in the past because we would mark objects
UNINTERESTING after doing the initial commit walk to the boundary. While
we should be marking these objects as UNINTERESTING, we shouldn't _emit_
them all via the path-walk algorithm or else our delta calculations will
get really slow.

Based on these observations, the way we were handling the UNINTERESTING
flag in walk_objects_by_path() was overly complicated and buggy. A lot
of it can be removed and simplified to work with this new approach.

It also means that we will see the UNINTERESTING boundaries of paths
when doing a default path-walk call, changing some existing test cases.

Signed-off-by: Derrick Stolee <[email protected]>
In some instances (particularly the `read_object` hook), the `cmd`
attribute is set to an `strdup()`ed value. This value needs to be
released in the end!

Since other users assign a non-`strdup()`ed value, be careful to add
_another_ attribute (called `to_free`) that can hold a reference to such
a string that needs to be released once the sub process is done.

Signed-off-by: Johannes Schindelin <[email protected]>
There does not appear to be anything particularly incompatible about the
--shallow and --path-walk options of 'git pack-objects'. If shallow
commits are to be handled differently, then it is by the revision walk
that defines the commit set and which are interesting or uninteresting.

However, before the previous change, a trivial removal of the warning
would cause a failure in t5500-fetch-pack.sh when
GIT_TEST_PACK_PATH_WALK is enabled. The shallow fetch would provide more
objects than we desired, due to some incorrect behavior of the path-walk
API, especially around walking uninteresting objects.

To also cover the symmetrical case of pushing from a shallow clone, add
a new test to t5538-push-shallow.sh that confirms the correct behavior
of pushing only the new object. This works to validate both the
--path-walk and --no-path-walk case when toggling the
GIT_TEST_PACK_PATH_WALK environment variable. This test would have
failed in the --path-walk case if we created it before the previous
change.

Signed-off-by: Derrick Stolee <[email protected]>
This fixes a leak that is not detected by Git's test suite (but by
microsoft/git's).

Signed-off-by: Johannes Schindelin <[email protected]>
It can be notoriously difficult to detect if delta bases are being
computed properly during 'git push'. Construct an example where it will
make a kilobyte worth of difference when a delta base is not found. We
can then use the progress indicators to distinguish between bytes and
KiB depending on whether the delta base is found and used.

Signed-off-by: Derrick Stolee <[email protected]>
An internal customer reported a segfault when running `git
sparse-checkout set` with the `index.sparse` config enabled. I was
unable to reproduce it locally, but with their help we debugged into the
failing process and discovered the following stacktrace:

```
#0  0x00007ff6318fb7b0 in rehash (map=0x3dfb00d0440, newsize=1048576) at hashmap.c:125
#1  0x00007ff6318fbc66 in hashmap_add (map=0x3dfb00d0440, entry=0x3dfb5c58bc8) at hashmap.c:247
#2  0x00007ff631937a70 in hash_index_entry (istate=0x3dfb00d0400, ce=0x3dfb5c58bc8) at name-hash.c:122
#3  0x00007ff631938a2f in add_name_hash (istate=0x3dfb00d0400, ce=0x3dfb5c58bc8) at name-hash.c:638
#4  0x00007ff631a064de in set_index_entry (istate=0x3dfb00d0400, nr=8291, ce=0x3dfb5c58bc8) at sparse-index.c:255
#5  0x00007ff631a06692 in add_path_to_index (oid=0x5ff130, base=0x5ff580, path=0x3dfb4b725da "<redacted>", mode=33188, context=0x5ff570)    at sparse-index.c:307
#6  0x00007ff631a3b48c in read_tree_at (r=0x7ff631c026a0 <the_repo>, tree=0x3dfb5b41f60, base=0x5ff580, depth=2, pathspec=0x5ff5a0,    fn=0x7ff631a064e5 <add_path_to_index>, context=0x5ff570) at tree.c:46
#7  0x00007ff631a3b60b in read_tree_at (r=0x7ff631c026a0 <the_repo>, tree=0x3dfb5b41e80, base=0x5ff580, depth=1, pathspec=0x5ff5a0,    fn=0x7ff631a064e5 <add_path_to_index>, context=0x5ff570) at tree.c:80
#8  0x00007ff631a3b60b in read_tree_at (r=0x7ff631c026a0 <the_repo>, tree=0x3dfb5b41ac8, base=0x5ff580, depth=0, pathspec=0x5ff5a0,    fn=0x7ff631a064e5 <add_path_to_index>, context=0x5ff570) at tree.c:80
#9  0x00007ff631a06a95 in expand_index (istate=0x3dfb00d0100, pl=0x0) at sparse-index.c:422
#10 0x00007ff631a06cbd in ensure_full_index (istate=0x3dfb00d0100) at sparse-index.c:456
#11 0x00007ff631990d08 in index_name_stage_pos (istate=0x3dfb00d0100, name=0x3dfb0020080 "algorithm/levenshtein", namelen=21, stage=0,    search_mode=EXPAND_SPARSE) at read-cache.c:556
#12 0x00007ff631990d6c in index_name_pos (istate=0x3dfb00d0100, name=0x3dfb0020080 "algorithm/levenshtein", namelen=21) at read-cache.c:566
#13 0x00007ff63180dbb5 in sanitize_paths (argc=185, argv=0x3dfb0030018, prefix=0x0, skip_checks=0) at builtin/sparse-checkout.c:756
#14 0x00007ff63180de50 in sparse_checkout_set (argc=185, argv=0x3dfb0030018, prefix=0x0) at builtin/sparse-checkout.c:860
#15 0x00007ff63180e6c5 in cmd_sparse_checkout (argc=186, argv=0x3dfb0030018, prefix=0x0) at builtin/sparse-checkout.c:1063
#16 0x00007ff6317234cb in run_builtin (p=0x7ff631ad9b38 <commands+2808>, argc=187, argv=0x3dfb0030018) at git.c:548
#17 0x00007ff6317239c0 in handle_builtin (argc=187, argv=0x3dfb0030018) at git.c:808
#18 0x00007ff631723c7d in run_argv (argcp=0x5ffdd0, argv=0x5ffd78) at git.c:877
#19 0x00007ff6317241d1 in cmd_main (argc=187, argv=0x3dfb0030018) at git.c:1017
#20 0x00007ff631838b60 in main (argc=190, argv=0x3dfb0030000) at common-main.c:64 
```

The very bottom of the stack being the `rehash()` method from
`hashmap.c` as called within the `name-hash` API made me look at where
these hashmaps were being used in the sparse index logic. These were
being copied across indexes, which seems dangerous. Indeed, clearing
these hashmaps and setting them as not initialized fixes the segfault.

The second commit is a response to a test failure that happens in
`t1092-sparse-checkout-compatibility.sh` where `git stash pop` starts to
fail because the underlying `git checkout-index` process fails due to
colliding files. Passing the `-f` flag appears to work, but it's unclear
why this name-hash change causes that change in behavior.
This fixes a leak that is not detected by Git's own test suite (but by
microsoft/git's, in the t9210-scalar.sh test).

Signed-off-by: Johannes Schindelin <[email protected]>
This pull request aims to correct a pretty big issue when dealing with
UNINTERESTING objects in the path-walk API. They somehow were only
exposed when trying to perform a push from a shallow clone.

This will require rewriting the upstream version so this is avoided from
the start, but we can do a forward fix for now.

The key issue is that the path-walk API was not walking UNINTERESTING
trees at the right time, and the way it was being done was more
complicated than it needed to be. This changes some of the way the
path-walk API works in the presence of UNINTERSTING commits, but these
are good changes to make.

I had briefly attempted to remove the use of the `edge_aggressive`
option in `struct path_walk_info` in favor of using the
`--objects-edge-aggressive` option in the revision struct. When I
started down that road, though, I somehow got myself into a bind of
things not working correctly. I backed out to this version that is
working with our test cases.

I tested this using the thin and big pack tests in `p5313` which had the
same performance as before this change.

The new change is that in a shallow clone we can get the same `git push`
improvements.

I was hung up on testing this for a long time as I wasn't getting the
same results in my shallow clone as in my regular clones. It turns out
that I had forgotten to use `--no-reuse-delta` in my test command, so it
was picking the deltas that were given by the initial clone instead of
picking new ones per the algorithm. 🤦🏻
Git v2.48.0 has become even more stringent about leaks.

Signed-off-by: Johannes Schindelin <[email protected]>
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!

Signed-off-by: Johannes Schindelin <[email protected]>
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 <[email protected]>
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 <[email protected]>
Signed-off-by: Johannes Schindelin <[email protected]>
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
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.
@dscho dscho force-pushed the tentative/vfs-2.48.0 branch from 52b5991 to 27273ae Compare January 1, 2025 16:12
@dscho
Copy link
Member Author

dscho commented Jan 1, 2025

And just like was the case with Git for Windows, there's some fall-out fro ps/ci-meson.

Range-diff relative to previously-range-diff'ed PR branch
  • 1: 3e2e321 ! 1: be3b3ac gvfs: add the core.gvfs config setting

    @@ gvfs.h
     +int gvfs_config_is_set(int mask);
     +
      #endif /* GVFS_H */
    +
    + ## meson.build ##
    +@@ meson.build: libgit_sources = [
    +   'gpg-interface.c',
    +   'graph.c',
    +   'grep.c',
    ++  'gvfs.c',
    +   'hash-lookup.c',
    +   'hashmap.c',
    +   'help.c',
  • 2: 4cdf789 ! 2: 6f9fb79 gvfs: add the feature to skip writing the index' SHA-1

    @@ repo-settings.c: void prepare_repo_settings(struct repository *r)
      	 * The GIT_TEST_MULTI_PACK_INDEX variable is special in that
      	 * either it *or* the config sets
     
    + ## t/meson.build ##
    +@@ t/meson.build: integration_tests = [
    +   't1014-read-tree-confusing.sh',
    +   't1015-read-index-unmerged.sh',
    +   't1016-compatObjectFormat.sh',
    ++  't1017-read-tree-skip-sha-on-read.sh',
    +   't1020-subdirectory.sh',
    +   't1021-rerere-in-workdir.sh',
    +   't1022-read-tree-partial-clone.sh',
    +
      ## t/t1017-read-tree-skip-sha-on-read.sh (new) ##
     @@
     +#!/bin/sh
  • 3: 1f4a2c0 = 3: af0d380 gvfs: add the feature that blobs may be missing

  • 4: c001dde = 4: 8acc66f gvfs: prevent files to be deleted outside the sparse checkout

  • 5: ff09727 ! 5: 2a0ce9b gvfs: optionally skip reachability checks/upload pack during fetch

    @@ gvfs.h
      void gvfs_load_config_value(const char *value);
      int gvfs_config_is_set(int mask);
     
    + ## t/meson.build ##
    +@@ t/meson.build: integration_tests = [
    +   't5581-http-curl-verbose.sh',
    +   't5582-fetch-negative-refspec.sh',
    +   't5583-push-branches.sh',
    ++  't5584-vfs.sh',
    +   't5600-clone-fail-cleanup.sh',
    +   't5601-clone.sh',
    +   't5602-clone-remote-exec.sh',
    +
      ## t/t5584-vfs.sh (new) ##
     @@
     +#!/bin/sh
  • 6: 7331eea = 6: e44a53b gvfs: ensure all filters and EOL conversions are blocked

  • 7: 5b2a8ef = 7: 6e17496 gvfs: allow "virtualizing" objects

  • 8: 94fcd3a ! 8: 933af84 Hydrate missing loose objects in check_and_freshen()

    @@ object-file.c: static int do_oid_object_info_extended(struct repository *r,
      			}
      		}
     
    + ## t/meson.build ##
    +@@ t/meson.build: integration_tests = [
    +   't0410-partial-clone.sh',
    +   't0411-clone-from-partial.sh',
    +   't0450-txt-doc-vs-help.sh',
    ++  't0499-read-object.sh',
    +   't0500-progress-display.sh',
    +   't0600-reffiles-backend.sh',
    +   't0601-reffiles-pack-refs.sh',
    +
      ## t/t0410/read-object (new) ##
     @@
     +#!/usr/bin/perl
  • 9: 8658083 = 9: 00a11f2 sha1_file: when writing objects, skip the read_object_hook

  • 10: f8a807a ! 10: d16546c gvfs: add global command pre and post hook procs

    @@ hook.c: const char *find_hook(struct repository *r, const char *name)
      #ifdef STRIP_EXTENSION
      	if (!found_hook) {
     
    + ## t/meson.build ##
    +@@ t/meson.build: integration_tests = [
    +   't0301-credential-cache.sh',
    +   't0302-credential-store.sh',
    +   't0303-credential-external.sh',
    ++  't0400-pre-command-hook.sh',
    ++  't0401-post-command-hook.sh',
    +   't0410-partial-clone.sh',
    +   't0411-clone-from-partial.sh',
    +   't0450-txt-doc-vs-help.sh',
    +
      ## t/t0400-pre-command-hook.sh (new) ##
     @@
     +#!/bin/sh
  • 11: 63055a5 = 11: 89ea17f t0400: verify that the hook is called correctly from a subdirectory

  • 12: 9b58180 = 12: 9d4b2f7 Pass PID of git process to hooks.

  • 13: a51edf8 = 13: f3e6f6d pre-command: always respect core.hooksPath

  • 14: 441ab00 ! 14: ace01dd sparse-checkout: update files with a modify/delete conflict

    @@ merge-recursive.c: static int handle_change_delete(struct merge_options *opt,
      	}
      	free(alt_path);
     
    + ## t/meson.build ##
    +@@ t/meson.build: integration_tests = [
    +   't7612-merge-verify-signatures.sh',
    +   't7614-merge-signoff.sh',
    +   't7615-diff-algo-with-mergy-operations.sh',
    ++  't7616-merge-sparse-checkout.sh',
    +   't7700-repack.sh',
    +   't7701-repack-unpack-unreachable.sh',
    +   't7702-repack-cyclic-alternate.sh',
    +
      ## t/t7616-merge-sparse-checkout.sh (new) ##
     @@
     +#!/bin/sh
  • 15: 9960a4a = 15: 26ed740 sparse-checkout: avoid writing entries with the skip-worktree bit

  • 16: aee93c9 = 16: 7a6f583 Do not remove files outside the sparse-checkout

  • 17: 65031f7 = 17: f117f50 send-pack: do not check for sha1 file when GVFS_MISSING_OK set

  • 18: 7d7b67b = 18: 719b9ea cache-tree: remove use of strbuf_addf in update_one

  • 19: 8b35078 ! 19: ebba63f gvfs: block unsupported commands when running in a GVFS repo

    @@ gvfs.h
      #define GVFS_NO_DELETE_OUTSIDE_SPARSECHECKOUT       (1 << 3)
      #define GVFS_FETCH_SKIP_REACHABILITY_AND_UPLOADPACK (1 << 4)
     
    + ## t/meson.build ##
    +@@ t/meson.build: integration_tests = [
    +   't0303-credential-external.sh',
    +   't0400-pre-command-hook.sh',
    +   't0401-post-command-hook.sh',
    ++  't0402-block-command-on-gvfs.sh',
    +   't0410-partial-clone.sh',
    +   't0411-clone-from-partial.sh',
    +   't0450-txt-doc-vs-help.sh',
    +
      ## t/t0402-block-command-on-gvfs.sh (new) ##
     @@
     +#!/bin/sh
  • 20: cc96701 = 20: 50b45b6 worktree: allow in Scalar repositories

  • 21: 114a65c = 21: e4cd5d2 gvfs: allow overriding core.gvfs

  • 22: e133dc8 = 22: 0029f6e BRANCHES.md: Add explanation of branches and using forks

  • 23: ef8338f ! 23: 839a737 Add virtual file system settings and hook proc

    @@ environment.h: extern unsigned long pack_size_limit_cfg;
      extern int precomposed_unicode;
      extern int protect_hfs;
     
    + ## meson.build ##
    +@@ meson.build: libgit_sources = [
    +   'utf8.c',
    +   'varint.c',
    +   'versioncmp.c',
    ++  'virtualfilesystem.c',
    +   'walker.c',
    +   'wildmatch.c',
    +   'worktree.c',
    +
      ## read-cache.c ##
     @@
      
    @@ sparse-index.c: static void clear_skip_worktree_from_present_files_full(struct i
      		return;
      
     
    + ## t/meson.build ##
    +@@ t/meson.build: integration_tests = [
    +   't1090-sparse-checkout-scope.sh',
    +   't1091-sparse-checkout-builtin.sh',
    +   't1092-sparse-checkout-compatibility.sh',
    ++  't1093-virtualfilesystem.sh',
    +   't1100-commit-tree-options.sh',
    +   't1300-config.sh',
    +   't1301-shared-repo.sh',
    +
      ## t/t1090-sparse-checkout-scope.sh ##
     @@ t/t1090-sparse-checkout-scope.sh: test_expect_success 'in partial clone, sparse checkout only fetches needed blobs
      '
    @@ virtualfilesystem.c (new)
     +				pos = index_name_pos(istate, entry, len);
     +				if (pos < 0) {
     +					pos = -pos - 1;
    -+					while (pos < istate->cache_nr && !fspathncmp(istate->cache[pos]->name, entry, len)) {
    ++					while ((size_t)pos < istate->cache_nr && !fspathncmp(istate->cache[pos]->name, entry, len)) {
     +						istate->cache[pos]->ce_flags &= ~CE_SKIP_WORKTREE;
     +						pos++;
     +					}
  • 24: 9fb7459 = 24: 747db26 virtualfilesystem: don't run the virtual file system hook if the index has been redirected

  • 25: eec1887 = 25: 98fabc5 virtualfilesystem: check if directory is included

  • 26: 6c28b21 = 26: 31d0210 backwards-compatibility: support the post-indexchanged hook

  • 27: 7136a7f = 27: e326cdd gvfs: verify that the built-in FSMonitor is disabled

  • 28: 9b025dc = 28: ae8b8ed wt-status: add trace2 data for sparse-checkout percentage

  • 29: 867d02b = 29: 627045e wt-status: add VFS hydration percentage to normal git status output

  • 30: 9339a87 ! 30: 213f295 status: add status serialization mechanism

    @@ contrib/completion/git-completion.bash: _git_clone ()
      __git_trailer_tokens ()
      {
     
    + ## meson.build ##
    +@@ meson.build: libgit_sources = [
    +   'write-or-die.c',
    +   'ws.c',
    +   'wt-status.c',
    ++  'wt-status-deserialize.c',
    ++  'wt-status-serialize.c',
    +   'xdiff-interface.c',
    +   'xdiff/xdiffi.c',
    +   'xdiff/xemit.c',
    +
      ## pkt-line.c ##
     @@ pkt-line.c: static int do_packet_write(const int fd_out, const char *buf, size_t size,
      	return 0;
    @@ pkt-line.h: void packet_write(int fd_out, const char *buf, size_t size);
      int write_packetized_from_buf_no_flush_count(const char *src_in, size_t len,
      					     int fd_out, int *packet_counter);
     
    + ## t/meson.build ##
    +@@ t/meson.build: integration_tests = [
    +   't7519-status-fsmonitor.sh',
    +   't7520-ignored-hook-warning.sh',
    +   't7521-ignored-mode.sh',
    ++  't7522-serialized-status.sh',
    ++  't7523-status-complete-untracked.sh',
    +   't7524-commit-summary.sh',
    +   't7525-status-rename.sh',
    +   't7526-commit-pathspec-file.sh',
    +
      ## t/t7522-serialized-status.sh (new) ##
     @@
     +#!/bin/sh
  • 31: 1098ffc = 31: 0221115 Teach ahead-behind and serialized status to play nicely together

  • 32: f145ee7 = 32: 760d513 status: serialize to path

  • 33: 5e45d3f = 33: 2acf45f status: reject deserialize in V2 and conflicts

  • 34: 6d629f7 = 34: 42e8e53 serialize-status: serialize global and repo-local exclude file metadata

  • 35: 160103b ! 35: b2024bb status: deserialization wait

    @@ wt-status-deserialize.c: static int wt_deserialize_fd(const struct wt_status *cm
     +				 "could not lstat '%s'", path);
     +		return DESERIALIZE_ERR;
     +	}
    -+	if (st.st_mtime == deserialize_prev_mtime.sec &&
    ++	if ((uint32_t)st.st_mtime == deserialize_prev_mtime.sec &&
     +	    ST_MTIME_NSEC(st) == deserialize_prev_mtime.nsec) {
     +		trace_printf_key(&trace_deserialize,
     +				 "mtime has not changed '%s'", path);
  • 36: a0035f0 = 36: e9a6fe0 merge-recursive: avoid confusing logic in was_dirty()

  • 37: acc2371 = 37: cd46651 merge-recursive: add some defensive coding to was_dirty()

  • 38: 02f07b3 = 38: f326c70 merge-recursive: teach was_dirty() about the virtualfilesystem

  • 39: 4080842 = 39: 2d8e853 status: deserialize with -uno does not print correct hint

  • 40: 7b3a204 = 40: 19a8a31 fsmonitor: check CE_FSMONITOR_VALID in ce_uptodate

  • 41: 01f2d8f = 41: 4781219 fsmonitor: add script for debugging and update script for tests

  • 42: 55fbdfb = 42: 48a225f status: disable deserialize when verbose output requested.

  • 43: 33750be = 43: 4b0c554 t7524: add test for verbose status deserialzation

  • 44: 5e54147 = 44: 82cbf98 deserialize-status: silently fallback if we cannot read cache file

  • 45: 3070807 = 45: c9cee1c gvfs:trace2:data: add trace2 tracing around read_object_process

  • 46: fbf4fea = 46: 4b24b82 gvfs:trace2:data: status deserialization information

  • 47: cbc7b87 = 47: 05bee9e gvfs:trace2:data: status serialization

  • 48: 01f9464 ! 48: d03100d gvfs:trace2:data: add vfs stats

    @@ virtualfilesystem.c: void apply_virtualfilesystem(struct index_state *istate)
      				pos = index_name_pos(istate, entry, len);
      				if (pos < 0) {
      					pos = -pos - 1;
    - 					while (pos < istate->cache_nr && !fspathncmp(istate->cache[pos]->name, entry, len)) {
    + 					while ((size_t)pos < istate->cache_nr && !fspathncmp(istate->cache[pos]->name, entry, len)) {
     +						if (istate->cache[pos]->ce_flags & CE_SKIP_WORKTREE)
     +							nr_bulk_skip++;
      						istate->cache[pos]->ce_flags &= ~CE_SKIP_WORKTREE;
  • 49: b457b0e = 49: b311685 trace2: refactor setting process starting time

  • 50: 72b91f0 = 50: acc3200 trace2:gvfs:experiment: clear_ce_flags_1

  • 51: 915d8d0 = 51: a38eaec trace2:gvfs:experiment: report_tracking

  • 52: a64e66e = 52: 95e2952 trace2:gvfs:experiment: read_cache: annotate thread usage in read-cache

  • 53: a0b8089 = 53: 8c0fd3c trace2:gvfs:experiment: read-cache: time read/write of cache-tree extension

  • 54: 37ce74b = 54: 6eaefc6 trace2:gvfs:experiment: add region to apply_virtualfilesystem()

  • 55: 1c44f59 = 55: cd1ce85 trace2:gvfs:experiment: add region around unpack_trees()

  • 56: b813fc6 = 56: 3692982 trace2:gvfs:experiment: add region to cache_tree_fully_valid()

  • 57: dddc037 = 57: 4629b89 trace2:gvfs:experiment: add unpack_entry() counter to unpack_trees() and report_tracking()

  • 58: f511775 = 58: 384f7b4 trace2:gvfs:experiment: increase default event depth for unpack-tree data

  • 59: 1521443 = 59: 1489a11 trace2:gvfs:experiment: add data for check_updates() in unpack_trees()

  • 60: 4875fc9 = 60: ed48c16 Trace2:gvfs:experiment: capture more 'tracking' details

  • 61: 83e75f7 = 61: aefc9ae credential: set trace2_child_class for credential manager children

  • 62: fad731d = 62: 9a9734b sub-process: do not borrow cmd pointer from caller

  • 63: 84f80f2 = 63: 87d4eb2 sub-process: add subprocess_start_argv()

  • 64: 12e9de0 = 64: 0a0520d sha1-file: add function to update existing loose object cache

  • 65: 305d774 = 65: b7c6146 packfile: add install_packed_git_and_mru()

  • 66: a99263f = 66: 79bf2b6 index-pack: avoid immediate object fetch while parsing packfile

  • 67: 56f2ef5 ! 67: 0df6c63 gvfs-helper: create tool to fetch objects using the GVFS Protocol

    @@ gvfs-helper.c (new)
     +	return ec;
     +}
     
    + ## meson.build ##
    +@@ meson.build: libgit_sources = [
    +   'graph.c',
    +   'grep.c',
    +   'gvfs.c',
    ++  'gvfs-helper-client.c',
    +   'hash-lookup.c',
    +   'hashmap.c',
    +   'help.c',
    +@@ meson.build: if get_option('curl').enabled()
    +     )
    +   endif
    + 
    ++  test_dependencies += executable('git-gvfs-helper',
    ++    sources: curl_sources + 'gvfs-helper.c',
    ++    dependencies: [libgit, common_main],
    ++    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),
    +@@ meson.build: endforeach
    + 
    + foreach symlink : [
    +   'git',
    ++  'git-gvfs-helper',
    +   'git-receive-pack',
    +   'git-shell',
    +   'git-upload-archive',
    +
      ## object-file.c ##
     @@
      #include "sigchain.h"
  • 68: 525c45e = 68: d1c3e0a sha1-file: create shared-cache directory if it doesn't exist

  • 69: 7fd9def = 69: dcccb28 gvfs-helper: better handling of network errors

  • 70: ffadbe0 = 70: 947384c gvfs-helper-client: properly update loose cache with fetched OID

  • 71: 28007f4 = 71: 0b58c53 gvfs-helper: V2 robust retry and throttling

  • 72: 1f7e3eb = 72: 4817b74 gvfs-helper: expose gvfs/objects GET and POST semantics

  • 73: 017b01c = 73: 40ae3a9 gvfs-helper: dramatically reduce progress noise

  • 74: d01058a = 74: 78c7efc gvfs-helper-client.h: define struct object_id

  • 75: 09442e7 = 75: 3fcc433 gvfs-helper: handle pack-file after single POST request

  • 76: 4cfdf7b ! 76: eb9422f test-gvfs-prococol, t5799: tests for gvfs-helper

    @@ gvfs-helper.c: static void do__http_post__gvfs_objects(struct gh__response_statu
      	params.headers = curl_slist_append(params.headers,
      					   "Accept: application/x-git-packfile");
     
    + ## t/helper/meson.build ##
    +@@ t/helper/meson.build: test_tool = executable('test-tool',
    + bin_wrappers += test_tool
    + test_dependencies += test_tool
    + 
    ++test_gvfs_protocol = executable('test-gvfs-protocol',
    ++  sources: 'test-gvfs-protocol.c',
    ++  dependencies: [libgit, common_main],
    ++)
    ++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],
    +
      ## t/helper/test-gvfs-protocol.c (new) ##
     @@
     +#define USE_THE_REPOSITORY_VARIABLE
    @@ t/helper/test-gvfs-protocol.c (new)
     +	return serve(&listen_addr, listen_port);
     +}
     
    + ## t/meson.build ##
    +@@ t/meson.build: integration_tests = [
    +   't5731-protocol-v2-bundle-uri-git.sh',
    +   't5732-protocol-v2-bundle-uri-http.sh',
    +   't5750-bundle-uri-parse.sh',
    ++  't5799-gvfs-helper.sh',
    +   't5801-remote-helpers.sh',
    +   't5802-connect-helper.sh',
    +   't5810-proto-disable-local.sh',
    +
      ## t/t5799-gvfs-helper.sh (new) ##
     @@
     +#!/bin/sh
  • 77: 2458175 = 77: acdaf94 gvfs-helper: move result-list construction into install functions

  • 78: 9cdcfb5 = 78: cbb7d83 t5799: add support for POST to return either a loose object or packfile

  • 79: c64e962 = 79: 9cd5daa t5799: cleanup wc-l and grep-c lines

  • 80: d48100d = 80: e086b2a gvfs-helper: verify loose objects after write

  • 81: 714e20b = 81: 17cb428 t7599: create corrupt blob test

  • 82: c88a2ad = 82: b2626ef gvfs-helper: add prefetch support

  • 83: 5faa738 = 83: 0288b11 gvfs-helper: add prefetch .keep file for last packfile

  • 84: 799e4b0 = 84: d535853 gvfs-helper: do one read in my_copy_fd_len_tail()

  • 85: f1ec3ac = 85: 0733f30 gvfs-helper: move content-type warning for prefetch packs

  • 86: b1425af = 86: 809e8e3 fetch: use gvfs-helper prefetch under config

  • 87: 00d1f63 = 87: 37848f1 gvfs-helper: better support for concurrent packfile fetches

  • 88: 0412a5b = 88: 4aa479d remote-curl: do not call fetch-pack when using gvfs-helper

  • 89: a3e6c07 = 89: ef7be83 fetch: reprepare packs before checking connectivity

  • 90: 498f3bc = 90: 904aa60 gvfs-helper: retry when creating temp files

  • 91: 9044af6 = 91: 806116a sparse: avoid warnings about known cURL issues in gvfs-helper.c

  • 92: c76e858 = 92: 7f9bc3c gvfs-helper: add --max-retries to prefetch verb

  • 93: 4059526 = 93: b282ae7 t5799: add tests to detect corrupt pack/idx files in prefetch

  • 94: 81b63c0 = 94: aa86eeb gvfs-helper: ignore .idx files in prefetch multi-part responses

  • 95: 54d1da3 = 95: 53c764a t5799: explicitly test gvfs-helper --fallback and --no-fallback

  • 96: 41071f5 = 96: 76af555 gvfs-helper: don't fallback with new config

  • 98: 703b166 = 97: 9a6ebd7 maintenance: care about gvfs.sharedCache config

  • 97: 5978042 = 98: b668c69 test-gvfs-protocol: add cache_http_503 to mayhem

  • 99: c30d3a5 ! 99: 32ab787 unpack-trees:virtualfilesystem: Improve efficiency of clear_ce_flags

    @@ virtualfilesystem.c: int is_excluded_from_virtualfilesystem(const char *pathname
      				pos = index_name_pos(istate, entry, len);
      				if (pos < 0) {
     -					pos = -pos - 1;
    --					while (pos < istate->cache_nr && !fspathncmp(istate->cache[pos]->name, entry, len)) {
    +-					while ((size_t)pos < istate->cache_nr && !fspathncmp(istate->cache[pos]->name, entry, len)) {
     -						if (istate->cache[pos]->ce_flags & CE_SKIP_WORKTREE)
     -							nr_bulk_skip++;
     -						istate->cache[pos]->ce_flags &= ~CE_SKIP_WORKTREE;
     -						pos++;
    -+					for (pos = -pos - 1; pos < istate->cache_nr; pos++) {
    ++					for (pos = -pos - 1; (size_t)pos < istate->cache_nr; pos++) {
     +						ce = istate->cache[pos];
     +						if (fspathncmp(ce->name, entry, len))
     +							break;
  • 104: 3bd545f = 100: aba1c2f t5799: add unit tests for new gvfs.fallback config setting

  • 100: 6f84b0e = 101: 254cf44 homebrew: add GitHub workflow to release Cask

  • 101: bf591a6 = 102: 0d57536 Adding winget workflows

  • 102: 28ad15b = 103: a717435 Disable the monitor-components workflow in msft-git

  • 103: 2899f51 = 104: 02182c4 .github: enable windows builds on microsoft fork

  • 105: 9b7f0d3 = 105: 3a82d29 release: create initial Windows installer build workflow

  • 106: 3654ba6 = 106: 4758384 help: special-case HOST_CPU universal

  • 107: 5c5a513 = 107: 35f2aa5 release: add Mac OSX installer build

  • 108: 217a028 = 108: d682d30 release: build unsigned Ubuntu .deb package

  • 109: 5180fdc = 109: 93a5901 release: add signing step for .deb package

  • 110: c2233ce = 110: 69ebf5f release: create draft GitHub release with packages & installers

  • 111: d00f760 = 111: 191b4e2 build-git-installers: publish gpg public key

  • 112: 82959e8 = 112: 85c997a release: continue pestering until user upgrades

  • 113: a1be190 = 113: 6619583 dist: archive HEAD instead of HEAD^{tree}

  • 114: c41d1bd = 114: 075aaa8 release: include GIT_BUILT_FROM_COMMIT in MacOS build

  • 121: 0556c49 = 115: 131fbe8 release: add installer validation

  • 115: 9a53561 ! 116: 6e75105 update-microsoft-git: create barebones builtin

    @@ git.c: static struct cmd_struct commands[] = {
      	{ "update-ref", cmd_update_ref, RUN_SETUP },
      	{ "update-server-info", cmd_update_server_info, RUN_SETUP },
      	{ "upload-archive", cmd_upload_archive, NO_PARSEOPT },
    +
    + ## meson.build ##
    +@@ meson.build: builtin_sources = [
    +   'builtin/unpack-file.c',
    +   'builtin/unpack-objects.c',
    +   'builtin/update-index.c',
    ++  'builtin/update-microsoft-git.c',
    +   'builtin/update-ref.c',
    +   'builtin/update-server-info.c',
    +   'builtin/upload-archive.c',
  • 116: 76a52a6 = 117: 09c4420 update-microsoft-git: Windows implementation

  • 117: 99ab8cb = 118: 09d17b9 update-microsoft-git: use brew on macOS

  • 118: 463c175 = 119: bf7295e .github: update ISSUE_TEMPLATE.md for microsoft/git

  • 119: 1b84b75 = 120: 99cb2d1 .github: update PULL_REQUEST_TEMPLATE.md

  • 120: c522c1f = 121: a375236 Adjust README.md for microsoft/git

  • 122: 5540b32 ! 122: 7c04284 scalar: implement a minimal JSON parser

    @@ json-parser.h (new)
     +int reset_iterator(struct json_iterator *it);
     +
     +#endif
    +
    + ## meson.build ##
    +@@ 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],
    +   install: true,
    +   install_dir: get_option('libexecdir') / 'git-core',
  • 123: 690441e = 123: 864da76 scalar clone: support GVFS-enabled remote repositories

  • 124: 5f9e6bb = 124: fb522a1 test-gvfs-protocol: also serve smart protocol

  • 125: a922dcc = 125: 8668424 gvfs-helper: add the endpoint command

  • 126: 57e790a = 126: 3028c8c dir_inside_of(): handle directory separators correctly

  • 127: 6407f98 = 127: 500c10a scalar: disable authentication in unattended mode

  • 128: 7b1a6b1 = 128: 42d4138 scalar: do initialize gvfs.sharedCache

  • 129: 1071208 = 129: 9be5a2c scalar diagnose: include shared cache info

  • 130: fa59e2d = 130: 7b43037 scalar: only try GVFS protocol on https:// URLs

  • 131: 8b6ba58 = 131: a3d1380 scalar: verify that we can use a GVFS-enabled repository

  • 132: 8d123dc = 132: 5ab2cbf scalar: add the cache-server command

  • 133: 017b5c4 = 133: 0f6df8b scalar: add a test toggle to skip accessing the vsts/info endpoint

  • 134: 51350e2 = 134: 31d933b scalar: adjust documentation to the microsoft/git fork

  • 135: d7b066b = 135: 30c8cc6 scalar: enable untracked cache unconditionally

  • 136: 30c9f8b = 136: 9ae4ebe scalar: parse clone --no-fetch-commits-and-trees for backwards compatibility

  • 137: a326490 = 137: c7989a2 scalar: make GVFS Protocol a forced choice

  • 138: d4684fd = 138: 12d9968 scalar diagnose: accommodate Scalar's Functional Tests

  • 139: 2bcb989 = 139: 0ca5b50 ci: run Scalar's Functional Tests

  • 140: b682093 = 140: e74dc57 scalar: upgrade to newest FSMonitor config setting

  • 141: f29c3d6 = 141: d7579e0 abspath: make strip_last_path_component() global

  • 142: 0b39eb7 = 142: 1eb82d1 scalar: configure maintenance during 'reconfigure'

  • 143: 048c543 = 143: 5073191 scalar: .scalarCache should live above enlistment

  • 144: efc2c04 = 144: 47db922 add/rm: allow adding sparse entries when virtual

  • 145: aaa1064 = 145: 32ef1f4 sparse-checkout: add config to disable deleting dirs

  • 146: 98a32ad = 146: 6ea1db9 diff: ignore sparse paths in diffstat

  • 147: 02eef38 = 147: 5ac80b9 repo-settings: enable sparse index by default

  • 148: 670a770 = 148: 8df952e diff(sparse-index): verify with partially-sparse

  • 149: 68ea8bc = 149: c66ff5c stash: expand testing for git stash -u

  • 150: 535679e = 150: 52c6b5d sparse: add vfs-specific precautions

  • 151: 86fa9b8 = 151: 375acdd reset: fix mixed reset when using virtual filesystem

  • 152: 60f141d = 152: 19c0322 sparse-index: add ensure_full_index_with_reason()

  • 153: f572869 = 153: 9cb2790 treewide: add reasons for expanding index

  • 154: 016129f = 154: 2332092 treewide: custom reasons for expanding index

  • 155: 0464365 = 155: e6220cf sparse-index: add macro for unaudited expansions

  • 156: 35c9a21 = 156: 1c7e787 Docs: update sparse index plan with logging

  • 157: 30fec79 = 157: c69d14f sparse-index: log failure to clear skip-worktree

  • 158: 02f0d9e = 158: b210e77 stash: use -f in checkout-index child process

  • 159: 27913bb = 159: 9d5c423 sparse-index: do not copy hashtables during expansion

  • 160: c86e1fc = 160: 6548dbd t5616: mark tests as bogus with --path-walk

  • 161: b1fc387 = 161: 93178ea path-walk: add new 'edge_aggressive' option

  • 162: c4f6bf2 = 162: 9f0c7c7 pack-objects: allow --shallow and --path-walk

  • 163: 6a6cf3d = 163: 2cd3a3f t5538: add test to confirm deltas in shallow pushes

  • 164: 33a955d = 164: 05c4c1d sub-process: avoid leaking cmd

  • 165: 40e380d = 165: ce632e9 remote-curl: release filter options before re-setting them

  • 166: 899ef5d = 166: 2955dc8 transport: release object filter options

  • 167: 7af5f66 = 167: 7e6ed7f mingw: special-case administrators even more

  • 168: a508724 = 168: eb1cff5 test-tool path-utils: support debugging "dubious ownership" issues

  • 169: f99c947 ! 169: 87a4fa3 push: don't reuse deltas with path walk

    @@ send-pack.h: struct send_pack_args {
      		/* One of the SEND_PACK_PUSH_CERT_* constants. */
      		push_cert:2,
     
    + ## t/meson.build ##
    +@@ t/meson.build: integration_tests = [
    +   't5582-fetch-negative-refspec.sh',
    +   't5583-push-branches.sh',
    +   't5584-vfs.sh',
    ++  't5590-push-path-walk.sh',
    +   't5600-clone-fail-cleanup.sh',
    +   't5601-clone.sh',
    +   't5602-clone-remote-exec.sh',
    +
      ## t/t5590-push-path-walk.sh (new) ##
     @@
     +#!/bin/sh

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.