{"thread":{"id":"62477","subject":"[PATCH v2 01/27] builtin/blame: fix leaking blame entries with `--incremental`","startedAt":"2024-11-11T10:38:48Z","lastAt":"2024-11-21T10:32:24Z","messageCount":45,"participants":["Patrick Steinhardt","Rubén Justo","Jeff King","Toon Claes","Junio C Hamano"],"isPatch":true,"patchVersion":2,"patchTotal":27},"messages":[{"id":"506989","messageId":"20241111-b4-pks-leak-fixes-pt10-v2-0-6154bf91f0b0@pks.im","threadId":"62477","inReplyTo":"cover.1730901926.git.ps@pks.im","subject":"[PATCH v2 00/27] Memory leak fixes (pt.10, final)","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-11T10:38:29Z","receivedAt":"2024-11-11T10:38:48Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"Hi,\n\nthis is the last part of my series of memory leak fixes. This series\ngoes a bit further than past series:\n\n  - Patches 1 to 16 plug remaining memory leaks exposed by our test\n    suite.\n\n  - Patches 17 to 22 remove the last remaining `UNLEAK()` annotations\n    and ultimately remove the macro itself.\n\n  - Patch 23 works around a bug in the leak sanitizer itself.\n\n  - Patches 24 and 25 drop annotations where leak-free tests pass with\n    the leak sanitizer.\n\n  - Patches 26 and 27 unconditionally enable leak checking in all newly\n    added tests and then drop the `TEST_PASSES_SANITIZE_LEAK`\n    annotation.\n\nSo once this series lands, the expectation is that any newly added test\nneeds to be leak free by default. We still have an escape hatch in the\nform of the SANITIZE_LEAK prerequisite, but patch authors are expected\nto provide good arguments why their test cannot be made leak free.\n\nChanges in v2:\n\n  - Some fixes to code formatting.\n\n  - Simplify the memory leak fixes in \"help.c\".\n\n  - Split out the removal of `UNLEAK()` into its own commit.\n\nLink to v1: https://lore.kernel.org/r/cover.1730901926.git.ps@pks.im\n\nThanks!\n\nPatrick\n\nTo: git@vger.kernel.org\nCc: Rubén Justo <rjusto@gmail.com>\n\nPatrick Steinhardt (27):\n      builtin/blame: fix leaking blame entries with `--incremental`\n      bisect: fix leaking good/bad terms when reading multipe times\n      bisect: fix leaking string in `handle_bad_merge_base()`\n      bisect: fix leaking `current_bad_oid`\n      bisect: fix multiple leaks in `bisect_next_all()`\n      bisect: fix leaking commit list items in `check_merge_base()`\n      bisect: fix various cases where we leak commit list items\n      line-log: fix leak when rewriting commit parents\n      strvec: introduce new `strvec_splice()` function\n      git: refactor alias handling to use a `struct strvec`\n      git: refactor builtin handling to use a `struct strvec`\n      split-index: fix memory leak in `move_cache_to_base_index()`\n      builtin/sparse-checkout: fix leaking sanitized patterns\n      help: refactor to not use globals for reading config\n      help: fix leaking `struct cmdnames`\n      help: fix leaking return value from `help_unknown_cmd()`\n      builtin/help: fix leaks in `check_git_cmd()`\n      builtin/init-db: fix leaking directory paths\n      builtin/branch: fix leaking sorting options\n      t/helper: fix leaking commit graph in \"read-graph\" subcommand\n      global: drop `UNLEAK()` annotation\n      git-compat-util: drop now-unused `UNLEAK()` macro\n      t5601: work around leak sanitizer issue\n      t: mark some tests as leak free\n      t: remove unneeded !SANITIZE_LEAK prerequisites\n      test-lib: unconditionally enable leak checking\n      t: remove TEST_PASSES_SANITIZE_LEAK annotations\n\n bisect.c                                           |  61 +++++++---\n bisect.h                                           |   2 +-\n blame.c                                            |   1 +\n blame.h                                            |   2 +-\n builtin/blame.c                                    |  12 +-\n builtin/branch.c                                   |  33 ++++--\n builtin/clone.c                                    |   1 -\n builtin/diff.c                                     |   1 -\n builtin/help.c                                     |  13 ++-\n builtin/init-db.c                                  |  34 +++---\n builtin/sparse-checkout.c                          |  61 ++++++----\n ci/lib.sh                                          |   1 -\n git-compat-util.h                                  |  20 ----\n git.c                                              | 124 +++++++++++----------\n help.c                                             |  58 +++++-----\n help.h                                             |   2 +-\n line-log.c                                         |   1 +\n revision.c                                         |   4 +-\n split-index.c                                      |   6 +-\n strvec.c                                           |  19 ++++\n strvec.h                                           |   9 ++\n t/README                                           |  21 ----\n t/helper/test-read-graph.c                         |   3 +-\n t/lib-git-svn.sh                                   |   4 -\n t/t0001-init.sh                                    |   1 -\n t/t0002-gitfile.sh                                 |   1 -\n t/t0003-attributes.sh                              |   1 -\n t/t0004-unwritable.sh                              |   1 -\n t/t0005-signals.sh                                 |   1 -\n t/t0006-date.sh                                    |   1 -\n t/t0007-git-var.sh                                 |   1 -\n t/t0008-ignores.sh                                 |   1 -\n t/t0010-racy-git.sh                                |   1 -\n t/t0012-help.sh                                    |   1 -\n t/t0013-sha1dc.sh                                  |   1 -\n t/t0017-env-helper.sh                              |   1 -\n t/t0018-advice.sh                                  |   1 -\n t/t0019-json-writer.sh                             |   1 -\n t/t0020-crlf.sh                                    |   1 -\n t/t0021-conversion.sh                              |   1 -\n t/t0022-crlf-rename.sh                             |   1 -\n t/t0023-crlf-am.sh                                 |   1 -\n t/t0024-crlf-archive.sh                            |   1 -\n t/t0025-crlf-renormalize.sh                        |   1 -\n t/t0026-eol-config.sh                              |   1 -\n t/t0027-auto-crlf.sh                               |   1 -\n t/t0028-working-tree-encoding.sh                   |   1 -\n t/t0029-core-unsetenvvars.sh                       |   1 -\n t/t0030-stripspace.sh                              |   1 -\n t/t0033-safe-directory.sh                          |   1 -\n t/t0035-safe-bare-repository.sh                    |   1 -\n t/t0040-parse-options.sh                           |   1 -\n t/t0041-usage.sh                                   |   1 -\n t/t0050-filesystem.sh                              |   1 -\n t/t0052-simple-ipc.sh                              |   1 -\n t/t0055-beyond-symlinks.sh                         |   1 -\n t/t0056-git-C.sh                                   |   1 -\n t/t0060-path-utils.sh                              |   1 -\n t/t0061-run-command.sh                             |   1 -\n t/t0062-revision-walking.sh                        |   1 -\n t/t0063-string-list.sh                             |   1 -\n t/t0066-dir-iterator.sh                            |   1 -\n t/t0067-parse_pathspec_file.sh                     |   1 -\n t/t0068-for-each-repo.sh                           |   1 -\n t/t0070-fundamental.sh                             |   1 -\n t/t0071-sort.sh                                    |   1 -\n t/t0080-unit-test-output.sh                        |   1 -\n t/t0081-find-pack.sh                               |   1 -\n t/t0090-cache-tree.sh                              |   1 -\n t/t0091-bugreport.sh                               |   1 -\n t/t0092-diagnose.sh                                |   1 -\n t/t0095-bloom.sh                                   |   3 +-\n t/t0100-previous.sh                                |   1 -\n t/t0101-at-syntax.sh                               |   1 -\n t/t0200-gettext-basic.sh                           |   1 -\n t/t0201-gettext-fallbacks.sh                       |   1 -\n t/t0202-gettext-perl.sh                            |   1 -\n t/t0203-gettext-setlocale-sanity.sh                |   1 -\n t/t0204-gettext-reencode-sanity.sh                 |   1 -\n t/t0210-trace2-normal.sh                           |   1 -\n t/t0211-trace2-perf.sh                             |   1 -\n t/t0212-trace2-event.sh                            |   1 -\n t/t0300-credentials.sh                             |   1 -\n t/t0301-credential-cache.sh                        |   1 -\n t/t0302-credential-store.sh                        |   1 -\n t/t0303-credential-external.sh                     |   1 -\n t/t0410-partial-clone.sh                           |   1 -\n t/t0411-clone-from-partial.sh                      |   1 -\n t/t0450-txt-doc-vs-help.sh                         |   1 -\n t/t0500-progress-display.sh                        |   1 -\n t/t0600-reffiles-backend.sh                        |   1 -\n t/t0601-reffiles-pack-refs.sh                      |   1 -\n t/t0602-reffiles-fsck.sh                           |   1 -\n t/t0610-reftable-basics.sh                         |   1 -\n t/t0611-reftable-httpd.sh                          |   1 -\n t/t0612-reftable-jgit-compatibility.sh             |   1 -\n t/t0613-reftable-write-options.sh                  |   1 -\n t/t1000-read-tree-m-3way.sh                        |   1 -\n t/t1001-read-tree-m-2way.sh                        |   1 -\n t/t1002-read-tree-m-u-2way.sh                      |   1 -\n t/t1003-read-tree-prefix.sh                        |   1 -\n t/t1004-read-tree-m-u-wf.sh                        |   1 -\n t/t1005-read-tree-reset.sh                         |   1 -\n t/t1006-cat-file.sh                                |   1 -\n t/t1007-hash-object.sh                             |   1 -\n t/t1008-read-tree-overlay.sh                       |   1 -\n t/t1009-read-tree-new-index.sh                     |   1 -\n t/t1010-mktree.sh                                  |   1 -\n t/t1011-read-tree-sparse-checkout.sh               |   1 -\n t/t1012-read-tree-df.sh                            |   1 -\n t/t1013-read-tree-submodule.sh                     |   1 -\n t/t1014-read-tree-confusing.sh                     |   1 -\n t/t1015-read-index-unmerged.sh                     |   1 -\n t/t1016-compatObjectFormat.sh                      |   1 -\n t/t1020-subdirectory.sh                            |   1 -\n t/t1021-rerere-in-workdir.sh                       |   1 -\n t/t1022-read-tree-partial-clone.sh                 |   1 -\n t/t1050-large.sh                                   |   1 -\n t/t1051-large-conversion.sh                        |   1 -\n t/t1060-object-corruption.sh                       |   1 -\n t/t1090-sparse-checkout-scope.sh                   |   1 -\n t/t1091-sparse-checkout-builtin.sh                 |   1 -\n t/t1092-sparse-checkout-compatibility.sh           |   1 -\n t/t1100-commit-tree-options.sh                     |   1 -\n t/t1300-config.sh                                  |   1 -\n t/t1301-shared-repo.sh                             |   1 -\n t/t1302-repo-version.sh                            |   1 -\n t/t1303-wacky-config.sh                            |   1 -\n t/t1304-default-acl.sh                             |   1 -\n t/t1305-config-include.sh                          |   1 -\n t/t1306-xdg-files.sh                               |   1 -\n t/t1307-config-blob.sh                             |   1 -\n t/t1308-config-set.sh                              |   1 -\n t/t1309-early-config.sh                            |   1 -\n t/t1310-config-default.sh                          |   1 -\n t/t1350-config-hooks-path.sh                       |   1 -\n t/t1400-update-ref.sh                              |   1 -\n t/t1401-symbolic-ref.sh                            |   1 -\n t/t1402-check-ref-format.sh                        |   1 -\n t/t1403-show-ref.sh                                |   1 -\n t/t1404-update-ref-errors.sh                       |   1 -\n t/t1405-main-ref-store.sh                          |   1 -\n t/t1406-submodule-ref-store.sh                     |   1 -\n t/t1407-worktree-ref-store.sh                      |   1 -\n t/t1408-packed-refs.sh                             |   1 -\n t/t1409-avoid-packing-refs.sh                      |   1 -\n t/t1410-reflog.sh                                  |   1 -\n t/t1411-reflog-show.sh                             |   1 -\n t/t1412-reflog-loop.sh                             |   1 -\n t/t1413-reflog-detach.sh                           |   1 -\n t/t1414-reflog-walk.sh                             |   1 -\n t/t1415-worktree-refs.sh                           |   1 -\n t/t1416-ref-transaction-hooks.sh                   |   1 -\n t/t1417-reflog-updateref.sh                        |   1 -\n t/t1418-reflog-exists.sh                           |   1 -\n t/t1419-exclude-refs.sh                            |   1 -\n t/t1420-lost-found.sh                              |   1 -\n t/t1430-bad-ref-name.sh                            |   1 -\n t/t1450-fsck.sh                                    |   1 -\n t/t1451-fsck-buffer.sh                             |   1 -\n t/t1460-refs-migrate.sh                            |   1 -\n t/t1500-rev-parse.sh                               |   1 -\n t/t1501-work-tree.sh                               |   1 -\n t/t1502-rev-parse-parseopt.sh                      |   1 -\n t/t1503-rev-parse-verify.sh                        |   1 -\n t/t1504-ceiling-dirs.sh                            |   1 -\n t/t1505-rev-parse-last.sh                          |   1 -\n t/t1506-rev-parse-diagnosis.sh                     |   1 -\n t/t1507-rev-parse-upstream.sh                      |   1 -\n t/t1508-at-combinations.sh                         |   1 -\n t/t1510-repo-setup.sh                              |   1 -\n t/t1511-rev-parse-caret.sh                         |   1 -\n t/t1512-rev-parse-disambiguation.sh                |   1 -\n t/t1513-rev-parse-prefix.sh                        |   1 -\n t/t1514-rev-parse-push.sh                          |   1 -\n t/t1515-rev-parse-outside-repo.sh                  |   1 -\n t/t1517-outside-repo.sh                            |   1 -\n t/t1600-index.sh                                   |   1 -\n t/t1601-index-bogus.sh                             |   1 -\n t/t1701-racy-split-index.sh                        |   1 -\n t/t1800-hook.sh                                    |   1 -\n t/t2000-conflict-when-checking-files-out.sh        |   1 -\n t/t2002-checkout-cache-u.sh                        |   1 -\n t/t2003-checkout-cache-mkdir.sh                    |   1 -\n t/t2004-checkout-cache-temp.sh                     |   1 -\n t/t2005-checkout-index-symlinks.sh                 |   1 -\n t/t2006-checkout-index-basic.sh                    |   1 -\n t/t2007-checkout-symlink.sh                        |   1 -\n t/t2008-checkout-subdir.sh                         |   1 -\n t/t2009-checkout-statinfo.sh                       |   1 -\n t/t2010-checkout-ambiguous.sh                      |   1 -\n t/t2011-checkout-invalid-head.sh                   |   1 -\n t/t2012-checkout-last.sh                           |   1 -\n t/t2013-checkout-submodule.sh                      |   1 -\n t/t2014-checkout-switch.sh                         |   1 -\n t/t2015-checkout-unborn.sh                         |   1 -\n t/t2016-checkout-patch.sh                          |   1 -\n t/t2017-checkout-orphan.sh                         |   1 -\n t/t2018-checkout-branch.sh                         |   1 -\n t/t2019-checkout-ambiguous-ref.sh                  |   1 -\n t/t2020-checkout-detach.sh                         |   1 -\n t/t2021-checkout-overwrite.sh                      |   1 -\n t/t2022-checkout-paths.sh                          |   1 -\n t/t2023-checkout-m.sh                              |   1 -\n t/t2024-checkout-dwim.sh                           |   1 -\n t/t2025-checkout-no-overlay.sh                     |   1 -\n t/t2026-checkout-pathspec-file.sh                  |   1 -\n t/t2027-checkout-track.sh                          |   1 -\n t/t2030-unresolve-info.sh                          |   1 -\n t/t2050-git-dir-relative.sh                        |   1 -\n t/t2060-switch.sh                                  |   1 -\n t/t2070-restore.sh                                 |   1 -\n t/t2071-restore-patch.sh                           |   1 -\n t/t2072-restore-pathspec-file.sh                   |   1 -\n t/t2080-parallel-checkout-basics.sh                |   1 -\n t/t2081-parallel-checkout-collisions.sh            |   1 -\n t/t2082-parallel-checkout-attributes.sh            |   1 -\n t/t2100-update-cache-badpath.sh                    |   1 -\n t/t2101-update-index-reupdate.sh                   |   1 -\n t/t2102-update-index-symlinks.sh                   |   1 -\n t/t2103-update-index-ignore-missing.sh             |   1 -\n t/t2104-update-index-skip-worktree.sh              |   1 -\n t/t2105-update-index-gitfile.sh                    |   1 -\n t/t2106-update-index-assume-unchanged.sh           |   1 -\n t/t2107-update-index-basic.sh                      |   1 -\n t/t2108-update-index-refresh-racy.sh               |   1 -\n t/t2200-add-update.sh                              |   1 -\n t/t2201-add-update-typechange.sh                   |   1 -\n t/t2202-add-addremove.sh                           |   1 -\n t/t2203-add-intent.sh                              |   1 -\n t/t2204-add-ignored.sh                             |   1 -\n t/t2205-add-worktree-config.sh                     |   1 -\n t/t2300-cd-to-toplevel.sh                          |   1 -\n t/t2400-worktree-add.sh                            |   1 -\n t/t2401-worktree-prune.sh                          |   1 -\n t/t2402-worktree-list.sh                           |   1 -\n t/t2403-worktree-move.sh                           |   1 -\n t/t2404-worktree-config.sh                         |   1 -\n t/t2405-worktree-submodule.sh                      |   1 -\n t/t2406-worktree-repair.sh                         |   1 -\n t/t2407-worktree-heads.sh                          |  17 ++-\n t/t2408-worktree-relative.sh                       |   1 -\n t/t2500-untracked-overwriting.sh                   |   1 -\n t/t2501-cwd-empty.sh                               |   1 -\n t/t3000-ls-files-others.sh                         |   1 -\n t/t3001-ls-files-others-exclude.sh                 |   1 -\n t/t3002-ls-files-dashpath.sh                       |   1 -\n t/t3003-ls-files-exclude.sh                        |   1 -\n t/t3004-ls-files-basic.sh                          |   1 -\n t/t3005-ls-files-relative.sh                       |   1 -\n t/t3006-ls-files-long.sh                           |   1 -\n t/t3007-ls-files-recurse-submodules.sh             |   1 -\n t/t3008-ls-files-lazy-init-name-hash.sh            |   1 -\n t/t3009-ls-files-others-nonsubmodule.sh            |   1 -\n t/t3010-ls-files-killed-modified.sh                |   1 -\n t/t3011-common-prefixes-and-directory-traversal.sh |   1 -\n t/t3012-ls-files-dedup.sh                          |   1 -\n t/t3013-ls-files-format.sh                         |   1 -\n t/t3020-ls-files-error-unmatch.sh                  |   1 -\n t/t3040-subprojects-basic.sh                       |   1 -\n t/t3050-subprojects-fetch.sh                       |   1 -\n t/t3060-ls-files-with-tree.sh                      |   1 -\n t/t3070-wildmatch.sh                               |   1 -\n t/t3100-ls-tree-restrict.sh                        |   1 -\n t/t3101-ls-tree-dirname.sh                         |   1 -\n t/t3102-ls-tree-wildcards.sh                       |   1 -\n t/t3103-ls-tree-misc.sh                            |   1 -\n t/t3104-ls-tree-format.sh                          |   1 -\n t/t3105-ls-tree-output.sh                          |   1 -\n t/t3200-branch.sh                                  |   1 -\n t/t3201-branch-contains.sh                         |   1 -\n t/t3202-show-branch.sh                             |   1 -\n t/t3203-branch-output.sh                           |   1 -\n t/t3204-branch-name-interpretation.sh              |   1 -\n t/t3205-branch-color.sh                            |   1 -\n t/t3206-range-diff.sh                              |   1 -\n t/t3207-branch-submodule.sh                        |   1 -\n t/t3211-peel-ref.sh                                |   1 -\n t/t3300-funny-names.sh                             |   1 -\n t/t3301-notes.sh                                   |   1 -\n t/t3302-notes-index-expensive.sh                   |   1 -\n t/t3303-notes-subtrees.sh                          |   1 -\n t/t3304-notes-mixed.sh                             |   1 -\n t/t3305-notes-fanout.sh                            |   1 -\n t/t3306-notes-prune.sh                             |   1 -\n t/t3307-notes-man.sh                               |   1 -\n t/t3308-notes-merge.sh                             |   1 -\n t/t3309-notes-merge-auto-resolve.sh                |   1 -\n t/t3310-notes-merge-manual-resolve.sh              |   1 -\n t/t3311-notes-merge-fanout.sh                      |   1 -\n t/t3320-notes-merge-worktrees.sh                   |   1 -\n t/t3321-notes-stripspace.sh                        |   1 -\n t/t3400-rebase.sh                                  |   1 -\n t/t3401-rebase-and-am-rename.sh                    |   1 -\n t/t3402-rebase-merge.sh                            |   1 -\n t/t3403-rebase-skip.sh                             |   1 -\n t/t3404-rebase-interactive.sh                      |   1 -\n t/t3405-rebase-malformed.sh                        |   1 -\n t/t3406-rebase-message.sh                          |   1 -\n t/t3407-rebase-abort.sh                            |   1 -\n t/t3408-rebase-multi-line.sh                       |   1 -\n t/t3409-rebase-environ.sh                          |   1 -\n t/t3412-rebase-root.sh                             |   1 -\n t/t3413-rebase-hook.sh                             |   1 -\n t/t3415-rebase-autosquash.sh                       |   1 -\n t/t3416-rebase-onto-threedots.sh                   |   1 -\n t/t3417-rebase-whitespace-fix.sh                   |   1 -\n t/t3418-rebase-continue.sh                         |   1 -\n t/t3419-rebase-patch-id.sh                         |   1 -\n t/t3420-rebase-autostash.sh                        |   1 -\n t/t3421-rebase-topology-linear.sh                  |   1 -\n t/t3422-rebase-incompatible-options.sh             |   1 -\n t/t3423-rebase-reword.sh                           |   1 -\n t/t3424-rebase-empty.sh                            |   1 -\n t/t3425-rebase-topology-merges.sh                  |   1 -\n t/t3426-rebase-submodule.sh                        |   1 -\n t/t3427-rebase-subtree.sh                          |   1 -\n t/t3428-rebase-signoff.sh                          |   1 -\n t/t3429-rebase-edit-todo.sh                        |   1 -\n t/t3430-rebase-merges.sh                           |   1 -\n t/t3431-rebase-fork-point.sh                       |   1 -\n t/t3432-rebase-fast-forward.sh                     |   1 -\n t/t3433-rebase-across-mode-change.sh               |   1 -\n t/t3434-rebase-i18n.sh                             |   1 -\n t/t3435-rebase-gpg-sign.sh                         |   1 -\n t/t3436-rebase-more-options.sh                     |   1 -\n t/t3437-rebase-fixup-options.sh                    |   1 -\n t/t3438-rebase-broken-files.sh                     |   1 -\n t/t3500-cherry.sh                                  |   1 -\n t/t3501-revert-cherry-pick.sh                      |   1 -\n t/t3502-cherry-pick-merge.sh                       |   1 -\n t/t3503-cherry-pick-root.sh                        |   1 -\n t/t3504-cherry-pick-rerere.sh                      |   1 -\n t/t3505-cherry-pick-empty.sh                       |   1 -\n t/t3506-cherry-pick-ff.sh                          |   1 -\n t/t3507-cherry-pick-conflict.sh                    |   1 -\n t/t3508-cherry-pick-many-commits.sh                |   1 -\n t/t3509-cherry-pick-merge-df.sh                    |   1 -\n t/t3510-cherry-pick-sequence.sh                    |   1 -\n t/t3511-cherry-pick-x.sh                           |   1 -\n t/t3512-cherry-pick-submodule.sh                   |   1 -\n t/t3513-revert-submodule.sh                        |   1 -\n t/t3514-cherry-pick-revert-gpg.sh                  |   1 -\n t/t3600-rm.sh                                      |   1 -\n t/t3601-rm-pathspec-file.sh                        |   1 -\n t/t3602-rm-sparse-checkout.sh                      |   1 -\n t/t3650-replay-basics.sh                           |   1 -\n t/t3700-add.sh                                     |   1 -\n t/t3701-add-interactive.sh                         |   1 -\n t/t3702-add-edit.sh                                |   1 -\n t/t3703-add-magic-pathspec.sh                      |   1 -\n t/t3704-add-pathspec-file.sh                       |   1 -\n t/t3705-add-sparse-checkout.sh                     |   1 -\n t/t3800-mktag.sh                                   |   1 -\n t/t3900-i18n-commit.sh                             |   1 -\n t/t3901-i18n-patch.sh                              |   1 -\n t/t3902-quoted.sh                                  |   1 -\n t/t3903-stash.sh                                   |   1 -\n t/t3904-stash-patch.sh                             |   1 -\n t/t3905-stash-include-untracked.sh                 |   1 -\n t/t3906-stash-submodule.sh                         |   1 -\n t/t3907-stash-show-config.sh                       |   1 -\n t/t3908-stash-in-worktree.sh                       |   1 -\n t/t3909-stash-pathspec-file.sh                     |   1 -\n t/t3920-crlf-messages.sh                           |   1 -\n t/t4000-diff-format.sh                             |   1 -\n t/t4001-diff-rename.sh                             |   1 -\n t/t4002-diff-basic.sh                              |   1 -\n t/t4003-diff-rename-1.sh                           |   1 -\n t/t4004-diff-rename-symlink.sh                     |   1 -\n t/t4005-diff-rename-2.sh                           |   1 -\n t/t4006-diff-mode.sh                               |   1 -\n t/t4007-rename-3.sh                                |   1 -\n t/t4008-diff-break-rewrite.sh                      |   1 -\n t/t4009-diff-rename-4.sh                           |   1 -\n t/t4010-diff-pathspec.sh                           |   1 -\n t/t4011-diff-symlink.sh                            |   1 -\n t/t4012-diff-binary.sh                             |   1 -\n t/t4013-diff-various.sh                            |   1 -\n t/t4014-format-patch.sh                            |   1 -\n t/t4015-diff-whitespace.sh                         |   1 -\n t/t4016-diff-quote.sh                              |   1 -\n t/t4017-diff-retval.sh                             |   1 -\n t/t4018-diff-funcname.sh                           |   1 -\n t/t4019-diff-wserror.sh                            |   1 -\n t/t4020-diff-external.sh                           |   5 +-\n t/t4021-format-patch-numbered.sh                   |   1 -\n t/t4022-diff-rewrite.sh                            |   1 -\n t/t4023-diff-rename-typechange.sh                  |   1 -\n t/t4024-diff-optimize-common.sh                    |   1 -\n t/t4025-hunk-header.sh                             |   1 -\n t/t4026-color.sh                                   |   1 -\n t/t4027-diff-submodule.sh                          |   1 -\n t/t4028-format-patch-mime-headers.sh               |   1 -\n t/t4029-diff-trailing-space.sh                     |   1 -\n t/t4030-diff-textconv.sh                           |   1 -\n t/t4031-diff-rewrite-binary.sh                     |   1 -\n t/t4032-diff-inter-hunk-context.sh                 |   1 -\n t/t4033-diff-patience.sh                           |   1 -\n t/t4034-diff-words.sh                              |   1 -\n t/t4035-diff-quiet.sh                              |   1 -\n t/t4036-format-patch-signer-mime.sh                |   1 -\n t/t4037-diff-r-t-dirs.sh                           |   1 -\n t/t4038-diff-combined.sh                           |   1 -\n t/t4039-diff-assume-unchanged.sh                   |   1 -\n t/t4040-whitespace-status.sh                       |   1 -\n t/t4041-diff-submodule-option.sh                   |   1 -\n t/t4042-diff-textconv-caching.sh                   |   1 -\n t/t4043-diff-rename-binary.sh                      |   1 -\n t/t4044-diff-index-unique-abbrev.sh                |   1 -\n t/t4045-diff-relative.sh                           |   1 -\n t/t4046-diff-unmerged.sh                           |   1 -\n t/t4047-diff-dirstat.sh                            |   1 -\n t/t4048-diff-combined-binary.sh                    |   1 -\n t/t4049-diff-stat-count.sh                         |   1 -\n t/t4050-diff-histogram.sh                          |   1 -\n t/t4051-diff-function-context.sh                   |   1 -\n t/t4052-stat-output.sh                             |   1 -\n t/t4053-diff-no-index.sh                           |   1 -\n t/t4054-diff-bogus-tree.sh                         |   1 -\n t/t4055-diff-context.sh                            |   1 -\n t/t4056-diff-order.sh                              |   1 -\n t/t4057-diff-combined-paths.sh                     |   1 -\n t/t4058-diff-duplicates.sh                         |   1 -\n t/t4059-diff-submodule-not-initialized.sh          |   1 -\n t/t4060-diff-submodule-option-diff-format.sh       |   1 -\n t/t4061-diff-indent.sh                             |   1 -\n t/t4062-diff-pickaxe.sh                            |   1 -\n t/t4063-diff-blobs.sh                              |   1 -\n t/t4064-diff-oidfind.sh                            |   1 -\n t/t4065-diff-anchored.sh                           |   1 -\n t/t4066-diff-emit-delay.sh                         |   1 -\n t/t4067-diff-partial-clone.sh                      |   1 -\n t/t4068-diff-symmetric-merge-base.sh               |   1 -\n t/t4069-remerge-diff.sh                            |   1 -\n t/t4100-apply-stat.sh                              |   1 -\n t/t4101-apply-nonl.sh                              |   1 -\n t/t4102-apply-rename.sh                            |   1 -\n t/t4103-apply-binary.sh                            |   1 -\n t/t4104-apply-boundary.sh                          |   1 -\n t/t4105-apply-fuzz.sh                              |   1 -\n t/t4106-apply-stdin.sh                             |   1 -\n t/t4107-apply-ignore-whitespace.sh                 |   1 -\n t/t4108-apply-threeway.sh                          |   1 -\n t/t4109-apply-multifrag.sh                         |   1 -\n t/t4110-apply-scan.sh                              |   1 -\n t/t4111-apply-subdir.sh                            |   1 -\n t/t4112-apply-renames.sh                           |   1 -\n t/t4113-apply-ending.sh                            |   1 -\n t/t4114-apply-typechange.sh                        |   1 -\n t/t4115-apply-symlink.sh                           |   1 -\n t/t4116-apply-reverse.sh                           |   1 -\n t/t4117-apply-reject.sh                            |   1 -\n t/t4118-apply-empty-context.sh                     |   1 -\n t/t4119-apply-config.sh                            |   1 -\n t/t4120-apply-popt.sh                              |   1 -\n t/t4121-apply-diffs.sh                             |   1 -\n t/t4122-apply-symlink-inside.sh                    |   1 -\n t/t4123-apply-shrink.sh                            |   1 -\n t/t4124-apply-ws-rule.sh                           |   1 -\n t/t4125-apply-ws-fuzz.sh                           |   1 -\n t/t4126-apply-empty.sh                             |   1 -\n t/t4127-apply-same-fn.sh                           |   1 -\n t/t4128-apply-root.sh                              |   1 -\n t/t4129-apply-samemode.sh                          |   1 -\n t/t4130-apply-criss-cross-rename.sh                |   1 -\n t/t4131-apply-fake-ancestor.sh                     |   1 -\n t/t4132-apply-removal.sh                           |   1 -\n t/t4133-apply-filenames.sh                         |   1 -\n t/t4134-apply-submodule.sh                         |   1 -\n t/t4135-apply-weird-filenames.sh                   |   1 -\n t/t4136-apply-check.sh                             |   1 -\n t/t4137-apply-submodule.sh                         |   1 -\n t/t4138-apply-ws-expansion.sh                      |   1 -\n t/t4139-apply-escape.sh                            |   1 -\n t/t4140-apply-ita.sh                               |   1 -\n t/t4141-apply-too-large.sh                         |   1 -\n t/t4150-am.sh                                      |   1 -\n t/t4151-am-abort.sh                                |   1 -\n t/t4152-am-subjects.sh                             |   1 -\n t/t4153-am-resume-override-opts.sh                 |   1 -\n t/t4200-rerere.sh                                  |   1 -\n t/t4201-shortlog.sh                                |   1 -\n t/t4202-log.sh                                     |   1 -\n t/t4203-mailmap.sh                                 |   1 -\n t/t4204-patch-id.sh                                |   1 -\n t/t4205-log-pretty-formats.sh                      |   1 -\n t/t4206-log-follow-harder-copies.sh                |   1 -\n t/t4207-log-decoration-colors.sh                   |   1 -\n t/t4208-log-magic-pathspec.sh                      |   1 -\n t/t4209-log-pickaxe.sh                             |   1 -\n t/t4210-log-i18n.sh                                |   1 -\n t/t4212-log-corrupt.sh                             |   1 -\n t/t4213-log-tabexpand.sh                           |   1 -\n t/t4214-log-graph-octopus.sh                       |   1 -\n t/t4215-log-skewed-merges.sh                       |   1 -\n t/t4216-log-bloom.sh                               |   1 -\n t/t4217-log-limit.sh                               |   1 -\n t/t4252-am-options.sh                              |   1 -\n t/t4253-am-keep-cr-dos.sh                          |   1 -\n t/t4254-am-corrupt.sh                              |   1 -\n t/t4255-am-submodule.sh                            |   1 -\n t/t4256-am-format-flowed.sh                        |   1 -\n t/t4257-am-interactive.sh                          |   1 -\n t/t4258-am-quoted-cr.sh                            |   1 -\n t/t4300-merge-tree.sh                              |   1 -\n t/t4301-merge-tree-write-tree.sh                   |   1 -\n t/t5000-tar-tree.sh                                |   1 -\n t/t5001-archive-attr.sh                            |   1 -\n t/t5002-archive-attr-pattern.sh                    |   1 -\n t/t5003-archive-zip.sh                             |   1 -\n t/t5004-archive-corner-cases.sh                    |   1 -\n t/t5100-mailinfo.sh                                |   1 -\n t/t5150-request-pull.sh                            |   1 -\n t/t5200-update-server-info.sh                      |   1 -\n t/t5300-pack-object.sh                             |   1 -\n t/t5301-sliding-window.sh                          |   1 -\n t/t5302-pack-index.sh                              |   1 -\n t/t5303-pack-corruption-resilience.sh              |   1 -\n t/t5304-prune.sh                                   |   1 -\n t/t5305-include-tag.sh                             |   1 -\n t/t5306-pack-nobase.sh                             |   1 -\n t/t5307-pack-missing-commit.sh                     |   1 -\n t/t5308-pack-detect-duplicates.sh                  |   1 -\n t/t5309-pack-delta-cycles.sh                       |   1 -\n t/t5310-pack-bitmaps.sh                            |   1 -\n t/t5311-pack-bitmaps-shallow.sh                    |   1 -\n t/t5312-prune-corruption.sh                        |   1 -\n t/t5313-pack-bounds-checks.sh                      |   1 -\n t/t5314-pack-cycle-detection.sh                    |   1 -\n t/t5315-pack-objects-compression.sh                |   1 -\n t/t5316-pack-delta-depth.sh                        |   1 -\n t/t5317-pack-objects-filter-objects.sh             |   1 -\n t/t5318-commit-graph.sh                            |   1 -\n t/t5319-multi-pack-index.sh                        |   1 -\n t/t5320-delta-islands.sh                           |   1 -\n t/t5321-pack-large-objects.sh                      |   1 -\n t/t5322-pack-objects-sparse.sh                     |   1 -\n t/t5323-pack-redundant.sh                          |   1 -\n t/t5324-split-commit-graph.sh                      |   1 -\n t/t5325-reverse-index.sh                           |   1 -\n t/t5326-multi-pack-bitmaps.sh                      |   1 -\n t/t5327-multi-pack-bitmaps-rev.sh                  |   1 -\n t/t5328-commit-graph-64bit-time.sh                 |   1 -\n t/t5329-pack-objects-cruft.sh                      |   1 -\n t/t5330-no-lazy-fetch-with-commit-graph.sh         |   1 -\n t/t5331-pack-objects-stdin.sh                      |   1 -\n t/t5332-multi-pack-reuse.sh                        |   1 -\n t/t5333-pseudo-merge-bitmaps.sh                    |   1 -\n t/t5334-incremental-multi-pack-index.sh            |   1 -\n t/t5351-unpack-large-objects.sh                    |   1 -\n t/t5400-send-pack.sh                               |   1 -\n t/t5401-update-hooks.sh                            |   1 -\n t/t5402-post-merge-hook.sh                         |   1 -\n t/t5403-post-checkout-hook.sh                      |   1 -\n t/t5404-tracking-branches.sh                       |   1 -\n t/t5405-send-pack-rewind.sh                        |   1 -\n t/t5406-remote-rejects.sh                          |   1 -\n t/t5407-post-rewrite-hook.sh                       |   1 -\n t/t5408-send-pack-stdin.sh                         |   1 -\n t/t5409-colorize-remote-messages.sh                |   1 -\n t/t5410-receive-pack-alternates.sh                 |   1 -\n t/t5411-proc-receive-hook.sh                       |   1 -\n t/t5500-fetch-pack.sh                              |   1 -\n t/t5501-fetch-push-alternates.sh                   |   1 -\n t/t5502-quickfetch.sh                              |   1 -\n t/t5503-tagfollow.sh                               |   1 -\n t/t5504-fetch-receive-strict.sh                    |   1 -\n t/t5505-remote.sh                                  |   1 -\n t/t5506-remote-groups.sh                           |   1 -\n t/t5507-remote-environment.sh                      |   1 -\n t/t5509-fetch-push-namespaces.sh                   |   1 -\n t/t5510-fetch.sh                                   |   1 -\n t/t5511-refspec.sh                                 |   1 -\n t/t5512-ls-remote.sh                               |   1 -\n t/t5513-fetch-track.sh                             |   1 -\n t/t5514-fetch-multiple.sh                          |   1 -\n t/t5515-fetch-merge-logic.sh                       |   1 -\n t/t5516-fetch-push.sh                              |   1 -\n t/t5517-push-mirror.sh                             |   1 -\n t/t5518-fetch-exit-status.sh                       |   1 -\n t/t5519-push-alternates.sh                         |   1 -\n t/t5520-pull.sh                                    |   1 -\n t/t5521-pull-options.sh                            |   1 -\n t/t5522-pull-symlink.sh                            |   1 -\n t/t5523-push-upstream.sh                           |   1 -\n t/t5524-pull-msg.sh                                |   1 -\n t/t5525-fetch-tagopt.sh                            |   1 -\n t/t5526-fetch-submodules.sh                        |   1 -\n t/t5527-fetch-odd-refs.sh                          |   1 -\n t/t5528-push-default.sh                            |   1 -\n t/t5529-push-errors.sh                             |   1 -\n t/t5530-upload-pack-error.sh                       |   1 -\n t/t5531-deep-submodule-push.sh                     |   1 -\n t/t5532-fetch-proxy.sh                             |   1 -\n t/t5533-push-cas.sh                                |   1 -\n t/t5534-push-signed.sh                             |   1 -\n t/t5535-fetch-push-symref.sh                       |   1 -\n t/t5536-fetch-conflicts.sh                         |   1 -\n t/t5537-fetch-shallow.sh                           |   1 -\n t/t5538-push-shallow.sh                            |   1 -\n t/t5539-fetch-http-shallow.sh                      |   1 -\n t/t5540-http-push-webdav.sh                        |   1 -\n t/t5541-http-push-smart.sh                         |   1 -\n t/t5542-push-http-shallow.sh                       |   1 -\n t/t5543-atomic-push.sh                             |   1 -\n t/t5544-pack-objects-hook.sh                       |   1 -\n t/t5545-push-options.sh                            |   1 -\n t/t5546-receive-limits.sh                          |   1 -\n t/t5547-push-quarantine.sh                         |   1 -\n t/t5548-push-porcelain.sh                          |   1 -\n t/t5549-fetch-push-http.sh                         |   1 -\n t/t5550-http-fetch-dumb.sh                         |   1 -\n t/t5551-http-fetch-smart.sh                        |   1 -\n t/t5552-skipping-fetch-negotiator.sh               |   1 -\n t/t5553-set-upstream.sh                            |   1 -\n t/t5554-noop-fetch-negotiator.sh                   |   1 -\n t/t5555-http-smart-common.sh                       |   1 -\n t/t5557-http-get.sh                                |   1 -\n t/t5560-http-backend-noserver.sh                   |   1 -\n t/t5561-http-backend.sh                            |   1 -\n t/t5562-http-backend-content-length.sh             |   1 -\n t/t5563-simple-http-auth.sh                        |   1 -\n t/t5564-http-proxy.sh                              |   1 -\n t/t5570-git-daemon.sh                              |   1 -\n t/t5571-pre-push-hook.sh                           |   1 -\n t/t5572-pull-submodule.sh                          |   1 -\n t/t5573-pull-verify-signatures.sh                  |   1 -\n t/t5574-fetch-output.sh                            |   1 -\n t/t5580-unc-paths.sh                               |   1 -\n t/t5581-http-curl-verbose.sh                       |   1 -\n t/t5582-fetch-negative-refspec.sh                  |   1 -\n t/t5583-push-branches.sh                           |   1 -\n t/t5600-clone-fail-cleanup.sh                      |   1 -\n t/t5601-clone.sh                                   |  26 +++--\n t/t5602-clone-remote-exec.sh                       |   1 -\n t/t5603-clone-dirname.sh                           |   1 -\n t/t5604-clone-reference.sh                         |   1 -\n t/t5605-clone-local.sh                             |   1 -\n t/t5606-clone-options.sh                           |   1 -\n t/t5607-clone-bundle.sh                            |   1 -\n t/t5609-clone-branch.sh                            |   1 -\n t/t5610-clone-detached.sh                          |   1 -\n t/t5611-clone-config.sh                            |   1 -\n t/t5612-clone-refspec.sh                           |   1 -\n t/t5613-info-alternate.sh                          |   1 -\n t/t5614-clone-submodules-shallow.sh                |   1 -\n t/t5615-alternate-env.sh                           |   1 -\n t/t5616-partial-clone.sh                           |   1 -\n t/t5617-clone-submodules-remote.sh                 |   1 -\n t/t5618-alternate-refs.sh                          |   1 -\n t/t5619-clone-local-ambiguous-transport.sh         |   1 -\n t/t5700-protocol-v1.sh                             |   1 -\n t/t5701-git-serve.sh                               |   1 -\n t/t5702-protocol-v2.sh                             |   1 -\n t/t5703-upload-pack-ref-in-want.sh                 |   1 -\n t/t5704-protocol-violations.sh                     |   1 -\n t/t5705-session-id-in-capabilities.sh              |   1 -\n t/t5730-protocol-v2-bundle-uri-file.sh             |   1 -\n t/t5731-protocol-v2-bundle-uri-git.sh              |   1 -\n t/t5732-protocol-v2-bundle-uri-http.sh             |   1 -\n t/t5750-bundle-uri-parse.sh                        |   1 -\n t/t5801-remote-helpers.sh                          |   1 -\n t/t5802-connect-helper.sh                          |   1 -\n t/t5810-proto-disable-local.sh                     |   1 -\n t/t5811-proto-disable-git.sh                       |   1 -\n t/t5812-proto-disable-http.sh                      |   1 -\n t/t5813-proto-disable-ssh.sh                       |   1 -\n t/t5814-proto-disable-ext.sh                       |   1 -\n t/t5815-submodule-protos.sh                        |   1 -\n t/t5900-repo-selection.sh                          |   1 -\n t/t6000-rev-list-misc.sh                           |   1 -\n t/t6001-rev-list-graft.sh                          |   1 -\n t/t6002-rev-list-bisect.sh                         |   1 -\n t/t6003-rev-list-topo-order.sh                     |   1 -\n t/t6004-rev-list-path-optim.sh                     |   1 -\n t/t6005-rev-list-count.sh                          |   1 -\n t/t6006-rev-list-format.sh                         |   1 -\n t/t6007-rev-list-cherry-pick-file.sh               |   1 -\n t/t6008-rev-list-submodule.sh                      |   1 -\n t/t6009-rev-list-parent.sh                         |   1 -\n t/t6010-merge-base.sh                              |   1 -\n t/t6011-rev-list-with-bad-commit.sh                |   1 -\n t/t6012-rev-list-simplify.sh                       |   1 -\n t/t6013-rev-list-reverse-parents.sh                |   1 -\n t/t6014-rev-list-all.sh                            |   1 -\n t/t6016-rev-list-graph-simplify-history.sh         |   1 -\n t/t6017-rev-list-stdin.sh                          |   1 -\n t/t6018-rev-list-glob.sh                           |   1 -\n t/t6019-rev-list-ancestry-path.sh                  |   1 -\n t/t6020-bundle-misc.sh                             |   1 -\n t/t6021-rev-list-exclude-hidden.sh                 |   1 -\n t/t6022-rev-list-missing.sh                        |   1 -\n t/t6040-tracking-info.sh                           |   1 -\n t/t6041-bisect-submodule.sh                        |   1 -\n t/t6050-replace.sh                                 |   1 -\n t/t6060-merge-index.sh                             |   1 -\n t/t6100-rev-list-in-order.sh                       |   1 -\n t/t6101-rev-parse-parents.sh                       |   1 -\n t/t6102-rev-list-unexpected-objects.sh             |   1 -\n t/t6110-rev-list-sparse.sh                         |   1 -\n t/t6111-rev-list-treesame.sh                       |   1 -\n t/t6112-rev-list-filters-objects.sh                |   1 -\n t/t6113-rev-list-bitmap-filters.sh                 |   1 -\n t/t6114-keep-packs.sh                              |   1 -\n t/t6115-rev-list-du.sh                             |   1 -\n t/t6120-describe.sh                                |   1 -\n t/t6130-pathspec-noglob.sh                         |   1 -\n t/t6131-pathspec-icase.sh                          |   1 -\n t/t6132-pathspec-exclude.sh                        |   1 -\n t/t6133-pathspec-rev-dwim.sh                       |   1 -\n t/t6134-pathspec-in-submodule.sh                   |   1 -\n t/t6135-pathspec-with-attrs.sh                     |   1 -\n t/t6136-pathspec-in-bare.sh                        |   1 -\n t/t6200-fmt-merge-msg.sh                           |   1 -\n t/t6300-for-each-ref.sh                            |   1 -\n t/t6301-for-each-ref-errors.sh                     |   1 -\n t/t6302-for-each-ref-filter.sh                     |   1 -\n t/t6400-merge-df.sh                                |   1 -\n t/t6401-merge-criss-cross.sh                       |   1 -\n t/t6402-merge-rename.sh                            |   1 -\n t/t6403-merge-file.sh                              |   1 -\n t/t6404-recursive-merge.sh                         |   1 -\n t/t6405-merge-symlinks.sh                          |   1 -\n t/t6406-merge-attr.sh                              |   1 -\n t/t6407-merge-binary.sh                            |   1 -\n t/t6408-merge-up-to-date.sh                        |   1 -\n t/t6409-merge-subtree.sh                           |   1 -\n t/t6411-merge-filemode.sh                          |   1 -\n t/t6412-merge-large-rename.sh                      |   1 -\n t/t6413-merge-crlf.sh                              |   1 -\n t/t6414-merge-rename-nocruft.sh                    |   1 -\n t/t6415-merge-dir-to-symlink.sh                    |   1 -\n t/t6416-recursive-corner-cases.sh                  |   1 -\n t/t6417-merge-ours-theirs.sh                       |   1 -\n t/t6418-merge-text-auto.sh                         |   1 -\n t/t6421-merge-partial-clone.sh                     |   1 -\n t/t6422-merge-rename-corner-cases.sh               |   1 -\n t/t6423-merge-rename-directories.sh                |   1 -\n t/t6424-merge-unrelated-index-changes.sh           |   1 -\n t/t6425-merge-rename-delete.sh                     |   1 -\n t/t6426-merge-skip-unneeded-updates.sh             |   1 -\n t/t6427-diff3-conflict-markers.sh                  |   1 -\n t/t6428-merge-conflicts-sparse.sh                  |   1 -\n t/t6429-merge-sequence-rename-caching.sh           |   1 -\n t/t6430-merge-recursive.sh                         |   1 -\n t/t6431-merge-criscross.sh                         |   1 -\n t/t6432-merge-recursive-space-options.sh           |   1 -\n t/t6433-merge-toplevel.sh                          |   1 -\n t/t6434-merge-recursive-rename-options.sh          |   1 -\n t/t6435-merge-sparse.sh                            |   1 -\n t/t6436-merge-overwrite.sh                         |   1 -\n t/t6437-submodule-merge.sh                         |   1 -\n t/t6438-submodule-directory-file-conflicts.sh      |   1 -\n t/t6439-merge-co-error-msgs.sh                     |   1 -\n t/t6500-gc.sh                                      |   1 -\n t/t6501-freshen-objects.sh                         |   1 -\n t/t6600-test-reach.sh                              |   1 -\n t/t6700-tree-depth.sh                              |   1 -\n t/t7001-mv.sh                                      |   1 -\n t/t7002-mv-sparse-checkout.sh                      |   1 -\n t/t7003-filter-branch.sh                           |   1 -\n t/t7004-tag.sh                                     |   1 -\n t/t7005-editor.sh                                  |   1 -\n t/t7006-pager.sh                                   |   1 -\n t/t7007-show.sh                                    |   1 -\n t/t7008-filter-branch-null-sha1.sh                 |   1 -\n t/t7010-setup.sh                                   |   1 -\n t/t7011-skip-worktree-reading.sh                   |   1 -\n t/t7012-skip-worktree-writing.sh                   |   1 -\n t/t7030-verify-tag.sh                              |   1 -\n t/t7031-verify-tag-signed-ssh.sh                   |   1 -\n t/t7060-wtstatus.sh                                |   1 -\n t/t7061-wtstatus-ignore.sh                         |   1 -\n t/t7062-wtstatus-ignorecase.sh                     |   1 -\n t/t7063-status-untracked-cache.sh                  |   1 -\n t/t7064-wtstatus-pv2.sh                            |   1 -\n t/t7101-reset-empty-subdirs.sh                     |   1 -\n t/t7102-reset.sh                                   |   1 -\n t/t7103-reset-bare.sh                              |   1 -\n t/t7104-reset-hard.sh                              |   1 -\n t/t7105-reset-patch.sh                             |   1 -\n t/t7106-reset-unborn-branch.sh                     |   1 -\n t/t7107-reset-pathspec-file.sh                     |   1 -\n t/t7110-reset-merge.sh                             |   1 -\n t/t7111-reset-table.sh                             |   1 -\n t/t7112-reset-submodule.sh                         |   1 -\n t/t7113-post-index-change-hook.sh                  |   1 -\n t/t7201-co.sh                                      |   1 -\n t/t7300-clean.sh                                   |   1 -\n t/t7301-clean-interactive.sh                       |   1 -\n t/t7400-submodule-basic.sh                         |   1 -\n t/t7401-submodule-summary.sh                       |   1 -\n t/t7402-submodule-rebase.sh                        |   1 -\n t/t7403-submodule-sync.sh                          |   1 -\n t/t7406-submodule-update.sh                        |   1 -\n t/t7407-submodule-foreach.sh                       |   1 -\n t/t7408-submodule-reference.sh                     |   1 -\n t/t7409-submodule-detached-work-tree.sh            |   1 -\n t/t7411-submodule-config.sh                        |   1 -\n t/t7412-submodule-absorbgitdirs.sh                 |   1 -\n t/t7413-submodule-is-active.sh                     |   1 -\n t/t7414-submodule-mistakes.sh                      |   1 -\n t/t7416-submodule-dash-url.sh                      |   1 -\n t/t7417-submodule-path-url.sh                      |   1 -\n t/t7418-submodule-sparse-gitmodules.sh             |   1 -\n t/t7419-submodule-set-branch.sh                    |   1 -\n t/t7420-submodule-set-url.sh                       |   1 -\n t/t7421-submodule-summary-add.sh                   |   1 -\n t/t7422-submodule-output.sh                        |   1 -\n t/t7423-submodule-symlinks.sh                      |   1 -\n t/t7424-submodule-mixed-ref-formats.sh             |   1 -\n t/t7450-bad-git-dotfiles.sh                        |   1 -\n t/t7500-commit-template-squash-signoff.sh          |   1 -\n t/t7501-commit-basic-functionality.sh              |   1 -\n t/t7502-commit-porcelain.sh                        |   1 -\n t/t7503-pre-commit-and-pre-merge-commit-hooks.sh   |   1 -\n t/t7504-commit-msg-hook.sh                         |   1 -\n t/t7505-prepare-commit-msg-hook.sh                 |   1 -\n t/t7506-status-submodule.sh                        |   1 -\n t/t7507-commit-verbose.sh                          |   1 -\n t/t7508-status.sh                                  |   1 -\n t/t7509-commit-authorship.sh                       |   1 -\n t/t7510-signed-commit.sh                           |   1 -\n t/t7511-status-index.sh                            |   1 -\n t/t7512-status-help.sh                             |   1 -\n t/t7513-interpret-trailers.sh                      |   1 -\n t/t7514-commit-patch.sh                            |   1 -\n t/t7515-status-symlinks.sh                         |   1 -\n t/t7516-commit-races.sh                            |   1 -\n t/t7517-per-repo-email.sh                          |   1 -\n t/t7518-ident-corner-cases.sh                      |   1 -\n t/t7519-status-fsmonitor.sh                        |   1 -\n t/t7520-ignored-hook-warning.sh                    |   1 -\n t/t7521-ignored-mode.sh                            |   1 -\n t/t7524-commit-summary.sh                          |   1 -\n t/t7525-status-rename.sh                           |   1 -\n t/t7526-commit-pathspec-file.sh                    |   1 -\n t/t7528-signed-commit-ssh.sh                       |   1 -\n t/t7600-merge.sh                                   |   1 -\n t/t7601-merge-pull-config.sh                       |   1 -\n t/t7602-merge-octopus-many.sh                      |   1 -\n t/t7603-merge-reduce-heads.sh                      |   1 -\n t/t7604-merge-custom-message.sh                    |   1 -\n t/t7605-merge-resolve.sh                           |   1 -\n t/t7606-merge-custom.sh                            |   1 -\n t/t7607-merge-state.sh                             |   1 -\n t/t7608-merge-messages.sh                          |   1 -\n t/t7609-mergetool--lib.sh                          |   1 -\n t/t7610-mergetool.sh                               |   1 -\n t/t7611-merge-abort.sh                             |   1 -\n t/t7612-merge-verify-signatures.sh                 |   1 -\n t/t7614-merge-signoff.sh                           |   1 -\n t/t7615-diff-algo-with-mergy-operations.sh         |   1 -\n t/t7700-repack.sh                                  |   1 -\n t/t7701-repack-unpack-unreachable.sh               |   1 -\n t/t7702-repack-cyclic-alternate.sh                 |   1 -\n t/t7703-repack-geometric.sh                        |   1 -\n t/t7704-repack-cruft.sh                            |   1 -\n t/t7800-difftool.sh                                |   1 -\n t/t7810-grep.sh                                    |   1 -\n t/t7811-grep-open.sh                               |   1 -\n t/t7812-grep-icase-non-ascii.sh                    |   1 -\n t/t7813-grep-icase-iso.sh                          |   1 -\n t/t7814-grep-recurse-submodules.sh                 |   1 -\n t/t7815-grep-binary.sh                             |   1 -\n t/t7816-grep-binary-pattern.sh                     |   1 -\n t/t7817-grep-sparse-checkout.sh                    |   1 -\n t/t7900-maintenance.sh                             |   1 -\n t/t8001-annotate.sh                                |   1 -\n t/t8002-blame.sh                                   |   1 -\n t/t8003-blame-corner-cases.sh                      |   1 -\n t/t8004-blame-with-conflicts.sh                    |   1 -\n t/t8005-blame-i18n.sh                              |   1 +\n t/t8006-blame-textconv.sh                          |   1 -\n t/t8007-cat-file-textconv.sh                       |   1 -\n t/t8008-blame-formats.sh                           |   1 -\n t/t8009-blame-vs-topicbranches.sh                  |   1 -\n t/t8010-cat-file-filters.sh                        |   1 -\n t/t8011-blame-split-file.sh                        |   1 -\n t/t8012-blame-colors.sh                            |   1 -\n t/t8013-blame-ignore-revs.sh                       |   1 -\n t/t8014-blame-ignore-fuzzy.sh                      |   1 -\n t/t9001-send-email.sh                              |   1 -\n t/t9002-column.sh                                  |   1 -\n t/t9003-help-autocorrect.sh                        |   1 -\n t/t9200-git-cvsexportcommit.sh                     |   1 -\n t/t9210-scalar.sh                                  |   1 -\n t/t9211-scalar-clone.sh                            |   1 -\n t/t9300-fast-import.sh                             |   1 -\n t/t9301-fast-import-notes.sh                       |   1 -\n t/t9302-fast-import-unpack-limit.sh                |   1 -\n t/t9303-fast-import-compression.sh                 |   1 -\n t/t9304-fast-import-marks.sh                       |   1 -\n t/t9350-fast-export.sh                             |   1 -\n t/t9351-fast-export-anonymize.sh                   |   1 -\n t/t9400-git-cvsserver-server.sh                    |   1 -\n t/t9401-git-cvsserver-crlf.sh                      |   1 -\n t/t9402-git-cvsserver-refs.sh                      |   1 -\n t/t9500-gitweb-standalone-no-errors.sh             |   1 -\n t/t9501-gitweb-standalone-http-status.sh           |   1 -\n t/t9502-gitweb-standalone-parse-output.sh          |   1 -\n t/t9600-cvsimport.sh                               |   1 -\n t/t9601-cvsimport-vendor-branch.sh                 |   1 -\n t/t9602-cvsimport-branches-tags.sh                 |   1 -\n t/t9603-cvsimport-patchsets.sh                     |   1 -\n t/t9604-cvsimport-timestamps.sh                    |   1 -\n t/t9700-perl-git.sh                                |   1 -\n t/t9800-git-p4-basic.sh                            |   1 -\n t/t9801-git-p4-branch.sh                           |   1 -\n t/t9802-git-p4-filetype.sh                         |   1 -\n t/t9803-git-p4-shell-metachars.sh                  |   1 -\n t/t9804-git-p4-label.sh                            |   1 -\n t/t9805-git-p4-skip-submit-edit.sh                 |   1 -\n t/t9806-git-p4-options.sh                          |   1 -\n t/t9808-git-p4-chdir.sh                            |   1 -\n t/t9809-git-p4-client-view.sh                      |   1 -\n t/t9810-git-p4-rcs.sh                              |   1 -\n t/t9811-git-p4-label-import.sh                     |   1 -\n t/t9812-git-p4-wildcards.sh                        |   1 -\n t/t9813-git-p4-preserve-users.sh                   |   1 -\n t/t9814-git-p4-rename.sh                           |   1 -\n t/t9815-git-p4-submit-fail.sh                      |   1 -\n t/t9816-git-p4-locked.sh                           |   1 -\n t/t9817-git-p4-exclude.sh                          |   1 -\n t/t9818-git-p4-block.sh                            |   1 -\n t/t9819-git-p4-case-folding.sh                     |   1 -\n t/t9820-git-p4-editor-handling.sh                  |   1 -\n t/t9821-git-p4-path-variations.sh                  |   1 -\n t/t9822-git-p4-path-encoding.sh                    |   1 -\n t/t9823-git-p4-mock-lfs.sh                         |   1 -\n t/t9825-git-p4-handle-utf16-without-bom.sh         |   1 -\n t/t9826-git-p4-keep-empty-commits.sh               |   1 -\n t/t9827-git-p4-change-filetype.sh                  |   1 -\n t/t9828-git-p4-map-user.sh                         |   1 -\n t/t9829-git-p4-jobs.sh                             |   1 -\n t/t9830-git-p4-symlink-dir.sh                      |   1 -\n t/t9831-git-p4-triggers.sh                         |   1 -\n t/t9832-unshelve.sh                                |   1 -\n t/t9833-errors.sh                                  |   1 -\n t/t9834-git-p4-file-dir-bug.sh                     |   1 -\n t/t9835-git-p4-metadata-encoding-python2.sh        |   1 -\n t/t9836-git-p4-metadata-encoding-python3.sh        |   1 -\n t/t9850-shell.sh                                   |   1 -\n t/t9901-git-web--browse.sh                         |   1 -\n t/t9902-completion.sh                              |   1 -\n t/t9903-bash-prompt.sh                             |   1 -\n t/test-lib.sh                                      |  72 +-----------\n t/unit-tests/strvec.c                              |  65 +++++++++++\n usage.c                                            |  15 ---\n 950 files changed, 366 insertions(+), 1249 deletions(-)\n\nRange-diff versus v1:\n\n 1:  09dbc39ffb =  1:  76daa9584b builtin/blame: fix leaking blame entries with `--incremental`\n 2:  15bbe539ea =  2:  6659f0d59b bisect: fix leaking good/bad terms when reading multipe times\n 3:  739e28c864 =  3:  5a9011e1ef bisect: fix leaking string in `handle_bad_merge_base()`\n 4:  fa91eb9dc6 =  4:  3afc0a7bfe bisect: fix leaking `current_bad_oid`\n 5:  4ca01afd9e =  5:  15577aaae6 bisect: fix multiple leaks in `bisect_next_all()`\n 6:  805b91ce20 =  6:  13ddfed4fc bisect: fix leaking commit list items in `check_merge_base()`\n 7:  0f183fb264 !  7:  0bc49ed3bb bisect: fix various cases where we leak commit list items\n    @@ bisect.c: static struct commit_list *skip_away(struct commit_list *list, int cou\n     +\t\t\telse if (previous)\n     +\t\t\t\tresult = previous;\n     +\t\t\telse\n    -+\t\t\t\tresult =  list;\n    ++\t\t\t\tresult = list;\n     +\t\t\tbreak;\n      \t\t}\n      \t\tprevious = cur;\n 8:  163c36c78e =  8:  addba1afce line-log: fix leak when rewriting commit parents\n 9:  c0bcfbd98b =  9:  6e501effad strvec: introduce new `strvec_splice()` function\n10:  cf0ac084c5 = 10:  2271761621 git: refactor alias handling to use a `struct strvec`\n11:  c4989aab86 = 11:  7bff5d167f git: refactor builtin handling to use a `struct strvec`\n12:  483d2951cc = 12:  e93d461504 split-index: fix memory leak in `move_cache_to_base_index()`\n13:  70b12d6347 = 13:  a0643da6f5 builtin/sparse-checkout: fix leaking sanitized patterns\n14:  f57d967cd5 = 14:  881feffeb1 help: refactor to not use globals for reading config\n15:  45aacddc8a <  -:  ---------- help: fix leaking `struct cmdnames`\n -:  ---------- > 15:  f1bbb676f2 help: fix leaking `struct cmdnames`\n16:  b61cc4da84 ! 16:  51c7ad993f help: fix leaking return value from `help_unknown_cmd()`\n    @@ help.c: static const char bad_interpreter_advice[] =\n      {\n      \tstruct help_unknown_cmd_config cfg = { 0 };\n      \tint i, n, best_similarity = 0;\n    - \tstruct cmdnames main_cmds = { 0 };\n    - \tstruct cmdnames other_cmds = { 0 };\n    - \tstruct cmdname_help *common_cmds;\n    --\tconst char *assumed = NULL;\n    -+\tchar *assumed = NULL;\n    - \n    - \tread_early_config(the_repository, git_unknown_cmd_config, &cfg);\n    - \n     @@ help.c: const char *help_unknown_cmd(const char *cmd)\n      \t\t\t; /* still counting */\n      \t}\n      \tif (cfg.autocorrect && n == 1 && SIMILAR_ENOUGH(best_similarity)) {\n    --\t\tassumed = main_cmds.names[0]->name;\n    +-\t\tconst char *assumed = main_cmds.names[0]->name;\n     -\t\tmain_cmds.names[0] = NULL;\n     -\t\tcmdnames_release(&main_cmds);\n    -+\t\tassumed = xstrdup(main_cmds.names[0]->name);\n    ++\t\tchar *assumed = xstrdup(main_cmds.names[0]->name);\n     +\n      \t\tfprintf_ln(stderr,\n      \t\t\t   _(\"WARNING: You called a Git command named '%s', \"\n      \t\t\t     \"which does not exist.\"),\n    -@@ help.c: const char *help_unknown_cmd(const char *cmd)\n    - \t\t\tstrbuf_release(&msg);\n    - \t\t\tif (!(starts_with(answer, \"y\") ||\n    - \t\t\t      starts_with(answer, \"Y\"))) {\n    --\t\t\t\tassumed = NULL;\n    -+\t\t\t\tFREE_AND_NULL(assumed);\n    - \t\t\t\tgoto out;\n    - \t\t\t}\n    - \t\t} else {\n     \n      ## help.h ##\n     @@ help.h: void list_all_other_cmds(struct string_list *list);\n17:  b38a39ef04 = 17:  38a25da315 builtin/help: fix leaks in `check_git_cmd()`\n18:  cd5cde9acb ! 18:  462c9fc110 builtin/init-db: fix leaking directory paths\n    @@ builtin/init-db.c: int cmd_init_db(int argc,\n     -\n      \tflags |= INIT_DB_EXIST_OK;\n     -\treturn init_db(git_dir, real_git_dir, template_dir, hash_algo,\n    -+\tret =  init_db(git_dir, real_git_dir, template_dir, hash_algo,\n    - \t\t       ref_storage_format, initial_branch,\n    - \t\t       init_shared_repository, flags);\n    +-\t\t       ref_storage_format, initial_branch,\n    +-\t\t       init_shared_repository, flags);\n    ++\tret = init_db(git_dir, real_git_dir, template_dir, hash_algo,\n    ++\t\t      ref_storage_format, initial_branch,\n    ++\t\t      init_shared_repository, flags);\n     +\n     +\tfree(template_dir_to_free);\n     +\tfree(real_git_dir_to_free);\n19:  2c7b50461b = 19:  6eabeed343 builtin/branch: fix leaking sorting options\n20:  6865dda344 = 20:  2a44bbfba3 t/helper: fix leaking commit graph in \"read-graph\" subcommand\n -:  ---------- > 21:  fc8a96bac3 global: drop `UNLEAK()` annotation\n21:  d7d8ece289 ! 22:  10e44976c2 git-compat-util: drop `UNLEAK()` annotation\n    @@ Metadata\n     Author: Patrick Steinhardt <ps@pks.im>\n     \n      ## Commit message ##\n    -    git-compat-util: drop `UNLEAK()` annotation\n    +    git-compat-util: drop now-unused `UNLEAK()` macro\n     \n    -    There are two users of `UNLEAK()` left in our codebase:\n    -\n    -      - In \"builtin/clone.c\", annotating the `repo` variable. That leak has\n    -        already been fixed though as you can see in the context, where we do\n    -        know to free `repo_to_free`.\n    -\n    -      - In \"builtin/diff.c\", to unleak entries of the `blob[]` array. That\n    -        leak has also been fixed, because the entries we assign to that\n    -        array come from `rev.pending.objects`, and we do eventually release\n    -        `rev`.\n    -\n    -    This neatly demonstrates one of the issues with `UNLEAK()`: it is quite\n    -    easy for the annotation to become stale. A second issue is that its\n    -    whole intent is to paper over leaks. And while that has been a necessary\n    -    evil in the past, because Git was leaking left and right, it isn't\n    -    really much of an issue nowadays where our test suite has no known leaks\n    +    The `UNLEAK()` macro has been introduced with 0e5bba53af (add UNLEAK\n    +    annotation for reducing leak false positives, 2017-09-08) to help us\n    +    reduce the amount of reported memory leaks in cases we don't care about,\n    +    e.g. when exiting immediately afterwards. We have since removed all of\n    +    its users in favor of freeing the memory and thus don't need the macro\n         anymore.\n     \n    -    Remove the last two users and drop the now-unused `UNLEAK()` annotation.\n    +    Remove it.\n     \n         Signed-off-by: Patrick Steinhardt <ps@pks.im>\n     \n    - ## builtin/clone.c ##\n    -@@ builtin/clone.c: int cmd_clone(int argc,\n    - \tfree(dir);\n    - \tfree(path);\n    - \tfree(repo_to_free);\n    --\tUNLEAK(repo);\n    - \tjunk_mode = JUNK_LEAVE_ALL;\n    - \n    - \ttransport_ls_refs_options_release(&transport_ls_refs_options);\n    -\n    - ## builtin/diff.c ##\n    -@@ builtin/diff.c: int cmd_diff(int argc,\n    - \trelease_revisions(&rev);\n    - \tobject_array_clear(&ent);\n    - \tsymdiff_release(&sdiff);\n    --\tUNLEAK(blob);\n    - \treturn result;\n    - }\n    -\n      ## git-compat-util.h ##\n     @@ git-compat-util.h: int cmd_main(int, const char **);\n      int common_exit(const char *file, int line, int code);\n22:  d52ca35b05 = 23:  218132b7d5 t5601: work around leak sanitizer issue\n23:  44b48929fb = 24:  832c87a045 t: mark some tests as leak free\n24:  b1fdbe04be = 25:  5fc1319241 t: remove unneeded !SANITIZE_LEAK prerequisites\n25:  2b752b71c6 = 26:  06a1e8b27c test-lib: unconditionally enable leak checking\n26:  53bc5f7d75 = 27:  19428158c8 t: remove TEST_PASSES_SANITIZE_LEAK annotations\n\n---\nbase-commit: b0c643d6a710e2b092902a3941655176b358bfd0\nchange-id: 20241111-b4-pks-leak-fixes-pt10-a6fa657f4fac\n\n"},{"id":"506986","messageId":"20241111-b4-pks-leak-fixes-pt10-v2-1-6154bf91f0b0@pks.im","threadId":"62477","inReplyTo":"20241111-b4-pks-leak-fixes-pt10-v2-0-6154bf91f0b0@pks.im","subject":"[PATCH v2 01/27] builtin/blame: fix leaking blame entries with `--incremental`","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-11T10:38:30Z","receivedAt":"2024-11-11T10:38:49Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"When passing `--incremental` to git-blame(1) we exit early by jumping to\nthe `cleanup` label. But some of the cleanups we perform are handled\nbetween the `goto` and its label, and thus we leak the data.\n\nMove the cleanups after the `cleanup` label. While at it, move the logic\nto free the scoreboard's `final_buf` into `cleanup_scoreboard()` and\ndrop its `const` declaration.\n\nSigned-off-by: Patrick Steinhardt <ps@pks.im>\n---\n blame.c               |  1 +\n blame.h               |  2 +-\n builtin/blame.c       | 12 ++++++------\n t/t8005-blame-i18n.sh |  2 ++\n 4 files changed, 10 insertions(+), 7 deletions(-)\n\ndiff --git a/blame.c b/blame.c\nindex 90633380cd583b689693e6cfe65c26a79448b00d..bf69768a7de6d2b989b85339a06af0a4763db4ad 100644\n--- a/blame.c\n+++ b/blame.c\n@@ -2931,6 +2931,7 @@ void setup_blame_bloom_data(struct blame_scoreboard *sb)\n void cleanup_scoreboard(struct blame_scoreboard *sb)\n {\n \tfree(sb->lineno);\n+\tfree(sb->final_buf);\n \tclear_prio_queue(&sb->commits);\n \toidset_clear(&sb->ignore_list);\n \ndiff --git a/blame.h b/blame.h\nindex 5b4e47d44c613e31fc4788c12ee9d8dc2a49d571..3b34be0e5c6932666bf5f738eb645da25adc0997 100644\n--- a/blame.h\n+++ b/blame.h\n@@ -116,7 +116,7 @@ struct blame_scoreboard {\n \t * Used by many functions to obtain contents of the nth line,\n \t * indexed with scoreboard.lineno[blame_entry.lno].\n \t */\n-\tconst char *final_buf;\n+\tchar *final_buf;\n \tunsigned long final_buf_size;\n \n \t/* linked list of blames */\ndiff --git a/builtin/blame.c b/builtin/blame.c\nindex e407a22da3bacf6bd26a6738e0ab0292ffadc216..6a7bb3b07248fbdfeb5ac3a05fed20fff4989a48 100644\n--- a/builtin/blame.c\n+++ b/builtin/blame.c\n@@ -1216,12 +1216,6 @@ int cmd_blame(int argc,\n \t\toutput_option &= ~(OUTPUT_COLOR_LINE | OUTPUT_SHOW_AGE_WITH_COLOR);\n \n \toutput(&sb, output_option);\n-\tfree((void *)sb.final_buf);\n-\tfor (ent = sb.ent; ent; ) {\n-\t\tstruct blame_entry *e = ent->next;\n-\t\tfree(ent);\n-\t\tent = e;\n-\t}\n \n \tif (show_stats) {\n \t\tprintf(\"num read blob: %d\\n\", sb.num_read_blob);\n@@ -1230,6 +1224,12 @@ int cmd_blame(int argc,\n \t}\n \n cleanup:\n+\tfor (ent = sb.ent; ent; ) {\n+\t\tstruct blame_entry *e = ent->next;\n+\t\tfree(ent);\n+\t\tent = e;\n+\t}\n+\n \tfree(path);\n \tcleanup_scoreboard(&sb);\n \trelease_revisions(&revs);\ndiff --git a/t/t8005-blame-i18n.sh b/t/t8005-blame-i18n.sh\nindex 7a1f581c240c71106c709a830d3897d84fd8b32d..fa765aff99aa7fbfc4737cc91aab2a6a1bce30bb 100755\n--- a/t/t8005-blame-i18n.sh\n+++ b/t/t8005-blame-i18n.sh\n@@ -1,6 +1,8 @@\n #!/bin/sh\n \n test_description='git blame encoding conversion'\n+\n+TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n if ! test_have_prereq ICONV\n\n-- \n2.47.0.229.g8f8d6eee53.dirty\n\n"},{"id":"506988","messageId":"20241111-b4-pks-leak-fixes-pt10-v2-2-6154bf91f0b0@pks.im","threadId":"62477","inReplyTo":"20241111-b4-pks-leak-fixes-pt10-v2-0-6154bf91f0b0@pks.im","subject":"[PATCH v2 02/27] bisect: fix leaking good/bad terms when reading multipe times","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-11T10:38:31Z","receivedAt":"2024-11-11T10:38:50Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"Even though `read_bisect_terms()` is declared as assigning string\nconstants, it in fact assigns allocated strings to the `read_bad` and\n`read_good` out parameters. The only callers of this function assign the\nresult to global variables and thus don't have to free them in order to\nbe leak-free. But that changes when executing the function multiple\ntimes because we'd then overwrite the previous value and thus make it\nunreachable.\n\nFix the function signature and free the previous values. This leak is\nexposed by t0630, but plugging it does not make the whole test suite\npass.\n\nSigned-off-by: Patrick Steinhardt <ps@pks.im>\n---\n bisect.c   | 14 +++++++++-----\n bisect.h   |  2 +-\n revision.c |  4 ++--\n 3 files changed, 12 insertions(+), 8 deletions(-)\n\ndiff --git a/bisect.c b/bisect.c\nindex 4713226fad4e16ebbda4ba2e8d13c6eaf7d4bfb2..9c52241050c14ecbf3f7950a0c5e7b962fcaa541 100644\n--- a/bisect.c\n+++ b/bisect.c\n@@ -28,8 +28,8 @@ static struct oid_array skipped_revs;\n \n static struct object_id *current_bad_oid;\n \n-static const char *term_bad;\n-static const char *term_good;\n+static char *term_bad;\n+static char *term_good;\n \n /* Remember to update object flag allocation in object.h */\n #define COUNTED\t\t(1u<<16)\n@@ -985,7 +985,7 @@ static void show_commit(struct commit *commit)\n  * We read them and store them to adapt the messages accordingly.\n  * Default is bad/good.\n  */\n-void read_bisect_terms(const char **read_bad, const char **read_good)\n+void read_bisect_terms(char **read_bad, char **read_good)\n {\n \tstruct strbuf str = STRBUF_INIT;\n \tconst char *filename = git_path_bisect_terms();\n@@ -993,16 +993,20 @@ void read_bisect_terms(const char **read_bad, const char **read_good)\n \n \tif (!fp) {\n \t\tif (errno == ENOENT) {\n-\t\t\t*read_bad = \"bad\";\n-\t\t\t*read_good = \"good\";\n+\t\t\tfree(*read_bad);\n+\t\t\t*read_bad = xstrdup(\"bad\");\n+\t\t\tfree(*read_good);\n+\t\t\t*read_good = xstrdup(\"good\");\n \t\t\treturn;\n \t\t} else {\n \t\t\tdie_errno(_(\"could not read file '%s'\"), filename);\n \t\t}\n \t} else {\n \t\tstrbuf_getline_lf(&str, fp);\n+\t\tfree(*read_bad);\n \t\t*read_bad = strbuf_detach(&str, NULL);\n \t\tstrbuf_getline_lf(&str, fp);\n+\t\tfree(*read_good);\n \t\t*read_good = strbuf_detach(&str, NULL);\n \t}\n \tstrbuf_release(&str);\ndiff --git a/bisect.h b/bisect.h\nindex ee3fd65f3bdb89611d7575239ee79e8c50bcd703..944439bfac729cf092d6c5962c9edff2321002e4 100644\n--- a/bisect.h\n+++ b/bisect.h\n@@ -75,7 +75,7 @@ enum bisect_error bisect_next_all(struct repository *r, const char *prefix);\n \n int estimate_bisect_steps(int all);\n \n-void read_bisect_terms(const char **bad, const char **good);\n+void read_bisect_terms(char **bad, char **good);\n \n int bisect_clean_state(void);\n \ndiff --git a/revision.c b/revision.c\nindex 8df75b82249b36e7e3ee9a4a151f085c189acc45..347dabf7f9a1a87765150ec998deae9b6709b5f6 100644\n--- a/revision.c\n+++ b/revision.c\n@@ -51,8 +51,8 @@\n \n volatile show_early_output_fn_t show_early_output;\n \n-static const char *term_bad;\n-static const char *term_good;\n+static char *term_bad;\n+static char *term_good;\n \n implement_shared_commit_slab(revision_sources, char *);\n \n\n-- \n2.47.0.229.g8f8d6eee53.dirty\n\n"},{"id":"506987","messageId":"20241111-b4-pks-leak-fixes-pt10-v2-3-6154bf91f0b0@pks.im","threadId":"62477","inReplyTo":"20241111-b4-pks-leak-fixes-pt10-v2-0-6154bf91f0b0@pks.im","subject":"[PATCH v2 03/27] bisect: fix leaking string in `handle_bad_merge_base()`","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-11T10:38:32Z","receivedAt":"2024-11-11T10:38:51Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"When handling a bad merge base we print an error, which includes the set\nof good revisions joined by spaces. This string is allocated, but never\nfreed.\n\nFix this memory leak. Note that the local `bad_hex` varible also looks\nlike a string that we should free. But in fact, `oid_to_hex()` returns\nan address to a static variable even though it is declared to return a\nnon-constant string. The function signature is thus quite misleading and\nreally should be fixed, but doing so is outside of the scope of this\npatch series.\n\nSigned-off-by: Patrick Steinhardt <ps@pks.im>\n---\n bisect.c | 2 ++\n 1 file changed, 2 insertions(+)\n\ndiff --git a/bisect.c b/bisect.c\nindex 9c52241050c14ecbf3f7950a0c5e7b962fcaa541..e9e603877eba059c878ff92bc11dd84553d0649e 100644\n--- a/bisect.c\n+++ b/bisect.c\n@@ -801,6 +801,8 @@ static enum bisect_error handle_bad_merge_base(void)\n \t\t\t\t\"between %s and [%s].\\n\"),\n \t\t\t\tbad_hex, term_bad, term_good, bad_hex, good_hex);\n \t\t}\n+\n+\t\tfree(good_hex);\n \t\treturn BISECT_MERGE_BASE_CHECK;\n \t}\n \n\n-- \n2.47.0.229.g8f8d6eee53.dirty\n\n"},{"id":"506990","messageId":"20241111-b4-pks-leak-fixes-pt10-v2-4-6154bf91f0b0@pks.im","threadId":"62477","inReplyTo":"20241111-b4-pks-leak-fixes-pt10-v2-0-6154bf91f0b0@pks.im","subject":"[PATCH v2 04/27] bisect: fix leaking `current_bad_oid`","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-11T10:38:33Z","receivedAt":"2024-11-11T10:38:51Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"When reading bisect refs we read the reference mapping to the \"bad\" term\ninto the global `current_bad_oid` variable. This is an allocated string,\nbut because it is global we never have to free it. This changes though\nwhen `register_ref()` is being called multiple times, at which point\nwe'll overwrite the previous pointer and thus make it unreachable.\n\nFix this issue by freeing the previous value. This leak is exposed by\nt6030, but plugging it does not make the whole test suite pass.\n\nSigned-off-by: Patrick Steinhardt <ps@pks.im>\n---\n bisect.c | 1 +\n 1 file changed, 1 insertion(+)\n\ndiff --git a/bisect.c b/bisect.c\nindex e9e603877eba059c878ff92bc11dd84553d0649e..6dbc22f84fce11743f0e79eb4f8100c7ec07238f 100644\n--- a/bisect.c\n+++ b/bisect.c\n@@ -456,6 +456,7 @@ static int register_ref(const char *refname, const char *referent UNUSED, const\n \tstrbuf_addstr(&good_prefix, \"-\");\n \n \tif (!strcmp(refname, term_bad)) {\n+\t\tfree(current_bad_oid);\n \t\tcurrent_bad_oid = xmalloc(sizeof(*current_bad_oid));\n \t\toidcpy(current_bad_oid, oid);\n \t} else if (starts_with(refname, good_prefix.buf)) {\n\n-- \n2.47.0.229.g8f8d6eee53.dirty\n\n"},{"id":"506991","messageId":"20241111-b4-pks-leak-fixes-pt10-v2-5-6154bf91f0b0@pks.im","threadId":"62477","inReplyTo":"20241111-b4-pks-leak-fixes-pt10-v2-0-6154bf91f0b0@pks.im","subject":"[PATCH v2 05/27] bisect: fix multiple leaks in `bisect_next_all()`","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-11T10:38:34Z","receivedAt":"2024-11-11T10:38:51Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"There are multiple leaks in `bisect_next_all()`. For one we don't free\nthe `tried` commit list. Second, one of the branches uses a direct\nreturn instead of jumping to the cleanup code.\n\nFix these by freeing the commit list and converting the return to a\ngoto.\n\nSigned-off-by: Patrick Steinhardt <ps@pks.im>\n---\n bisect.c | 5 +++--\n 1 file changed, 3 insertions(+), 2 deletions(-)\n\ndiff --git a/bisect.c b/bisect.c\nindex 6dbc22f84fce11743f0e79eb4f8100c7ec07238f..04e9a63f11c7fa1a9dd11d3f193c500a4cb937c6 100644\n--- a/bisect.c\n+++ b/bisect.c\n@@ -1031,7 +1031,7 @@ enum bisect_error bisect_next_all(struct repository *r, const char *prefix)\n {\n \tstruct strvec rev_argv = STRVEC_INIT;\n \tstruct rev_info revs = REV_INFO_INIT;\n-\tstruct commit_list *tried;\n+\tstruct commit_list *tried = NULL;\n \tint reaches = 0, all = 0, nr, steps;\n \tenum bisect_error res = BISECT_OK;\n \tstruct object_id *bisect_rev;\n@@ -1098,7 +1098,7 @@ enum bisect_error bisect_next_all(struct repository *r, const char *prefix)\n \tif (oideq(bisect_rev, current_bad_oid)) {\n \t\tres = error_if_skipped_commits(tried, current_bad_oid);\n \t\tif (res)\n-\t\t\treturn res;\n+\t\t\tgoto cleanup;\n \t\tprintf(\"%s is the first %s commit\\n\", oid_to_hex(bisect_rev),\n \t\t\tterm_bad);\n \n@@ -1132,6 +1132,7 @@ enum bisect_error bisect_next_all(struct repository *r, const char *prefix)\n \n \tres = bisect_checkout(bisect_rev, no_checkout);\n cleanup:\n+\tfree_commit_list(tried);\n \trelease_revisions(&revs);\n \tstrvec_clear(&rev_argv);\n \treturn res;\n\n-- \n2.47.0.229.g8f8d6eee53.dirty\n\n"},{"id":"506992","messageId":"20241111-b4-pks-leak-fixes-pt10-v2-6-6154bf91f0b0@pks.im","threadId":"62477","inReplyTo":"20241111-b4-pks-leak-fixes-pt10-v2-0-6154bf91f0b0@pks.im","subject":"[PATCH v2 06/27] bisect: fix leaking commit list items in `check_merge_base()`","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-11T10:38:35Z","receivedAt":"2024-11-11T10:38:52Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"While we free the result commit list at the end of `check_merge_base()`,\nwe forget to free any items that we have already iterated over. Fix this\nby using a separate variable to iterate through them.\n\nThis leak is exposed by t6030, but plugging it does not make the whole\ntest suite pass.\n\nSigned-off-by: Patrick Steinhardt <ps@pks.im>\n---\n bisect.c | 4 ++--\n 1 file changed, 2 insertions(+), 2 deletions(-)\n\ndiff --git a/bisect.c b/bisect.c\nindex 04e9a63f11c7fa1a9dd11d3f193c500a4cb937c6..12efcff2e3c1836ab6e63d36e4d42269fbcaeaab 100644\n--- a/bisect.c\n+++ b/bisect.c\n@@ -851,8 +851,8 @@ static enum bisect_error check_merge_bases(int rev_nr, struct commit **rev, int\n \t\t\t\t      rev + 1, &result) < 0)\n \t\texit(128);\n \n-\tfor (; result; result = result->next) {\n-\t\tconst struct object_id *mb = &result->item->object.oid;\n+\tfor (struct commit_list *l = result; l; l = l->next) {\n+\t\tconst struct object_id *mb = &l->item->object.oid;\n \t\tif (oideq(mb, current_bad_oid)) {\n \t\t\tres = handle_bad_merge_base();\n \t\t\tbreak;\n\n-- \n2.47.0.229.g8f8d6eee53.dirty\n\n"},{"id":"506993","messageId":"20241111-b4-pks-leak-fixes-pt10-v2-7-6154bf91f0b0@pks.im","threadId":"62477","inReplyTo":"20241111-b4-pks-leak-fixes-pt10-v2-0-6154bf91f0b0@pks.im","subject":"[PATCH v2 07/27] bisect: fix various cases where we leak commit list items","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-11T10:38:36Z","receivedAt":"2024-11-11T10:38:53Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"There are various cases where we leak commit list items because we\nevict items from the list, but don't free them. Plug those.\n\nSigned-off-by: Patrick Steinhardt <ps@pks.im>\n---\n bisect.c                    | 35 +++++++++++++++++++++++++++--------\n t/t6030-bisect-porcelain.sh |  1 +\n 2 files changed, 28 insertions(+), 8 deletions(-)\n\ndiff --git a/bisect.c b/bisect.c\nindex 12efcff2e3c1836ab6e63d36e4d42269fbcaeaab..0e804086cbf6a02d42bda98b62fb86daf099b82d 100644\n--- a/bisect.c\n+++ b/bisect.c\n@@ -440,11 +440,19 @@ void find_bisection(struct commit_list **commit_list, int *reaches,\n \t\t\tfree_commit_list(list->next);\n \t\t\tbest = list;\n \t\t\tbest->next = NULL;\n+\t\t} else {\n+\t\t\tfor (p = list; p != best; p = next) {\n+\t\t\t\tnext = p->next;\n+\t\t\t\tfree(p);\n+\t\t\t}\n \t\t}\n \t\t*reaches = weight(best);\n+\t} else {\n+\t\tfree_commit_list(*commit_list);\n \t}\n-\tfree(weights);\n \t*commit_list = best;\n+\n+\tfree(weights);\n \tclear_commit_weight(&commit_weight);\n }\n \n@@ -557,8 +565,11 @@ struct commit_list *filter_skipped(struct commit_list *list,\n \t\t\ttried = &list->next;\n \t\t} else {\n \t\t\tif (!show_all) {\n-\t\t\t\tif (!skipped_first || !*skipped_first)\n+\t\t\t\tif (!skipped_first || !*skipped_first) {\n+\t\t\t\t\tfree_commit_list(next);\n+\t\t\t\t\tfree_commit_list(filtered);\n \t\t\t\t\treturn list;\n+\t\t\t\t}\n \t\t\t} else if (skipped_first && !*skipped_first) {\n \t\t\t\t/* This means we know it's not skipped */\n \t\t\t\t*skipped_first = -1;\n@@ -614,7 +625,7 @@ static int sqrti(int val)\n \n static struct commit_list *skip_away(struct commit_list *list, int count)\n {\n-\tstruct commit_list *cur, *previous;\n+\tstruct commit_list *cur, *previous, *result = list;\n \tint prn, index, i;\n \n \tprn = get_prn(count);\n@@ -626,15 +637,23 @@ static struct commit_list *skip_away(struct commit_list *list, int count)\n \tfor (i = 0; cur; cur = cur->next, i++) {\n \t\tif (i == index) {\n \t\t\tif (!oideq(&cur->item->object.oid, current_bad_oid))\n-\t\t\t\treturn cur;\n-\t\t\tif (previous)\n-\t\t\t\treturn previous;\n-\t\t\treturn list;\n+\t\t\t\tresult = cur;\n+\t\t\telse if (previous)\n+\t\t\t\tresult = previous;\n+\t\t\telse\n+\t\t\t\tresult = list;\n+\t\t\tbreak;\n \t\t}\n \t\tprevious = cur;\n \t}\n \n-\treturn list;\n+\tfor (cur = list; cur != result; ) {\n+\t\tstruct commit_list *next = cur->next;\n+\t\tfree(cur);\n+\t\tcur = next;\n+\t}\n+\n+\treturn result;\n }\n \n static struct commit_list *managed_skipped(struct commit_list *list,\ndiff --git a/t/t6030-bisect-porcelain.sh b/t/t6030-bisect-porcelain.sh\nindex cdc02706404b34b17b29692d72d97fab7eba58b1..310affadebed321fcc93ee5bd785abf4ca013cc1 100755\n--- a/t/t6030-bisect-porcelain.sh\n+++ b/t/t6030-bisect-porcelain.sh\n@@ -9,6 +9,7 @@ exec </dev/null\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n+TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n add_line_into_file()\n\n-- \n2.47.0.229.g8f8d6eee53.dirty\n\n"},{"id":"506994","messageId":"20241111-b4-pks-leak-fixes-pt10-v2-8-6154bf91f0b0@pks.im","threadId":"62477","inReplyTo":"20241111-b4-pks-leak-fixes-pt10-v2-0-6154bf91f0b0@pks.im","subject":"[PATCH v2 08/27] line-log: fix leak when rewriting commit parents","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-11T10:38:37Z","receivedAt":"2024-11-11T10:38:54Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"In `process_ranges_merge_commit()` we try to figure out which of the\nparents can be blamed for the given line changes. When we figure out\nthat none of the files in the line-log have changed we assign the\ncomplete blame to that commit and rewrite the parents of the current\ncommit to only use that single parent.\n\nThis is done via `commit_list_append()`, which is misleadingly _not_\nappending to the list of parents. Instead, we overwrite the parents with\nthe blamed parent. This makes us lose track of the old pointers,\ncreating a memory leak.\n\nFix this issue by freeing the parents before we overwrite them.\n\nSigned-off-by: Patrick Steinhardt <ps@pks.im>\n---\n line-log.c          | 1 +\n t/t4211-line-log.sh | 1 +\n 2 files changed, 2 insertions(+)\n\ndiff --git a/line-log.c b/line-log.c\nindex bca9bd804073df9b77b2859063ac5ad4d3b24e0f..bc67b75d10d34edc726c00c887d57016e40f3a00 100644\n--- a/line-log.c\n+++ b/line-log.c\n@@ -1237,6 +1237,7 @@ static int process_ranges_merge_commit(struct rev_info *rev, struct commit *comm\n \t\t\t * don't follow any other path in history\n \t\t\t */\n \t\t\tadd_line_range(rev, parents[i], cand[i]);\n+\t\t\tfree_commit_list(commit->parents);\n \t\t\tcommit_list_append(parents[i], &commit->parents);\n \n \t\t\tret = 0;\ndiff --git a/t/t4211-line-log.sh b/t/t4211-line-log.sh\nindex 950451cf6a66e6c099aa5303ce19230c34cd1fc4..1d6dd982a2a858e9ca03635eb83b1463c9c9caed 100755\n--- a/t/t4211-line-log.sh\n+++ b/t/t4211-line-log.sh\n@@ -4,6 +4,7 @@ test_description='test log -L'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n+TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup (import history)' '\n\n-- \n2.47.0.229.g8f8d6eee53.dirty\n\n"},{"id":"506995","messageId":"20241111-b4-pks-leak-fixes-pt10-v2-9-6154bf91f0b0@pks.im","threadId":"62477","inReplyTo":"20241111-b4-pks-leak-fixes-pt10-v2-0-6154bf91f0b0@pks.im","subject":"[PATCH v2 09/27] strvec: introduce new `strvec_splice()` function","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-11T10:38:38Z","receivedAt":"2024-11-11T10:38:55Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"Introduce a new `strvec_splice()` function that can replace a range of\nstrings in the vector with another array of strings. This function will\nbe used in subsequent commits.\n\nSigned-off-by: Patrick Steinhardt <ps@pks.im>\n---\n strvec.c              | 19 +++++++++++++++\n strvec.h              |  9 +++++++\n t/unit-tests/strvec.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++\n 3 files changed, 93 insertions(+)\n\ndiff --git a/strvec.c b/strvec.c\nindex f712070f5745d5f998d0846ac4009441dddfa500..81075c50cca4fe44608775541d876294a79d9e4e 100644\n--- a/strvec.c\n+++ b/strvec.c\n@@ -56,6 +56,25 @@ void strvec_pushv(struct strvec *array, const char **items)\n \t\tstrvec_push(array, *items);\n }\n \n+void strvec_splice(struct strvec *array, size_t pos, size_t len,\n+\t\t   const char **replacement, size_t replacement_len)\n+{\n+\tif (pos + len > array->alloc)\n+\t\tBUG(\"range outside of array boundary\");\n+\tif (replacement_len > len)\n+\t\tALLOC_GROW(array->v, array->nr + (replacement_len - len) + 1,\n+\t\t\t   array->alloc);\n+\tfor (size_t i = 0; i < len; i++)\n+\t\tfree((char *)array->v[pos + i]);\n+\tif (replacement_len != len) {\n+\t\tmemmove(array->v + pos + replacement_len, array->v + pos + len,\n+\t\t\t(array->nr - pos - len + 1) * sizeof(char *));\n+\t\tarray->nr += (replacement_len - len);\n+\t}\n+\tfor (size_t i = 0; i < replacement_len; i++)\n+\t\tarray->v[pos + i] = xstrdup(replacement[i]);\n+}\n+\n const char *strvec_replace(struct strvec *array, size_t idx, const char *replacement)\n {\n \tchar *to_free;\ndiff --git a/strvec.h b/strvec.h\nindex 4b73c1f092e9b016ce3299035477713c6267cdae..4e61cc9336938a95318974903f9b35dcdc4da1cd 100644\n--- a/strvec.h\n+++ b/strvec.h\n@@ -67,6 +67,15 @@ void strvec_pushl(struct strvec *, ...);\n /* Push a null-terminated array of strings onto the end of the array. */\n void strvec_pushv(struct strvec *, const char **);\n \n+/*\n+ * Replace `len` values starting at `pos` with the provided replacement\n+ * strings. If `len` is zero this is effectively an insert at the given `pos`.\n+ * If `replacement_len` is zero this is effectively a delete of `len` items\n+ * starting at `pos`.\n+ */\n+void strvec_splice(struct strvec *array, size_t pos, size_t len,\n+\t\t   const char **replacement, size_t replacement_len);\n+\n /**\n  * Replace the value at the given index with a new value. The index must be\n  * valid. Returns a pointer to the inserted value.\ndiff --git a/t/unit-tests/strvec.c b/t/unit-tests/strvec.c\nindex bf4c0cb172e1f01c452b8744084cc45bf3aa86fa..855b602337169f6fffcadf91e0734db44ceccb16 100644\n--- a/t/unit-tests/strvec.c\n+++ b/t/unit-tests/strvec.c\n@@ -88,6 +88,71 @@ void test_strvec__pushv(void)\n \tstrvec_clear(&vec);\n }\n \n+void test_strvec__splice_with_same_size_replacement(void)\n+{\n+\tstruct strvec vec = STRVEC_INIT;\n+\tconst char *replacement[] = { \"1\" };\n+\n+\tstrvec_pushl(&vec, \"foo\", \"bar\", \"baz\", NULL);\n+\tstrvec_splice(&vec, 1, 1, replacement, ARRAY_SIZE(replacement));\n+\tcheck_strvec(&vec, \"foo\", \"1\", \"baz\", NULL);\n+\tstrvec_clear(&vec);\n+}\n+\n+void test_strvec__splice_with_smaller_replacement(void)\n+{\n+\tstruct strvec vec = STRVEC_INIT;\n+\tconst char *replacement[] = { \"1\" };\n+\n+\tstrvec_pushl(&vec, \"foo\", \"bar\", \"baz\", NULL);\n+\tstrvec_splice(&vec, 1, 2, replacement, ARRAY_SIZE(replacement));\n+\tcheck_strvec(&vec, \"foo\", \"1\", NULL);\n+\tstrvec_clear(&vec);\n+}\n+\n+void test_strvec__splice_with_bigger_replacement(void)\n+{\n+\tstruct strvec vec = STRVEC_INIT;\n+\tconst char *replacement[] = { \"1\", \"2\", \"3\" };\n+\n+\tstrvec_pushl(&vec, \"foo\", \"bar\", \"baz\", NULL);\n+\tstrvec_splice(&vec, 0, 2, replacement, ARRAY_SIZE(replacement));\n+\tcheck_strvec(&vec, \"1\", \"2\", \"3\", \"baz\", NULL);\n+\tstrvec_clear(&vec);\n+}\n+\n+void test_strvec__splice_with_empty_replacement(void)\n+{\n+\tstruct strvec vec = STRVEC_INIT;\n+\n+\tstrvec_pushl(&vec, \"foo\", \"bar\", \"baz\", NULL);\n+\tstrvec_splice(&vec, 0, 2, NULL, 0);\n+\tcheck_strvec(&vec, \"baz\", NULL);\n+\tstrvec_clear(&vec);\n+}\n+\n+void test_strvec__splice_with_empty_original(void)\n+{\n+\tstruct strvec vec = STRVEC_INIT;\n+\tconst char *replacement[] = { \"1\", \"2\" };\n+\n+\tstrvec_pushl(&vec, \"foo\", \"bar\", \"baz\", NULL);\n+\tstrvec_splice(&vec, 1, 0, replacement, ARRAY_SIZE(replacement));\n+\tcheck_strvec(&vec, \"foo\", \"1\", \"2\", \"bar\", \"baz\", NULL);\n+\tstrvec_clear(&vec);\n+}\n+\n+void test_strvec__splice_at_tail(void)\n+{\n+\tstruct strvec vec = STRVEC_INIT;\n+\tconst char *replacement[] = { \"1\", \"2\" };\n+\n+\tstrvec_pushl(&vec, \"foo\", \"bar\", NULL);\n+\tstrvec_splice(&vec, 2, 0, replacement, ARRAY_SIZE(replacement));\n+\tcheck_strvec(&vec, \"foo\", \"bar\", \"1\", \"2\", NULL);\n+\tstrvec_clear(&vec);\n+}\n+\n void test_strvec__replace_at_head(void)\n {\n \tstruct strvec vec = STRVEC_INIT;\n\n-- \n2.47.0.229.g8f8d6eee53.dirty\n\n"},{"id":"506996","messageId":"20241111-b4-pks-leak-fixes-pt10-v2-10-6154bf91f0b0@pks.im","threadId":"62477","inReplyTo":"20241111-b4-pks-leak-fixes-pt10-v2-0-6154bf91f0b0@pks.im","subject":"[PATCH v2 10/27] git: refactor alias handling to use a `struct strvec`","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-11T10:38:39Z","receivedAt":"2024-11-11T10:38:56Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"In `handle_alias()` we use both `argcp` and `argv` as in-out parameters.\nCallers mostly pass through the static array from `main()`, but once we\nhandle an alias we replace it with an allocated array that may contain\nsome allocated strings. Callers do not handle this scenario at all and\nthus leak memory.\n\nWe could in theory handle the lifetime of `argv` in a hacky fashion by\nletting callers free it in case they see that an alias was handled. But\nwhile that would likely work, we still wouldn't be able to easily handle\nthe lifetime of strings referenced by `argv`.\n\nRefactor the code to instead use a `struct strvec`, which effectively\nremoves the need for us to manually track lifetimes.\n\nSigned-off-by: Patrick Steinhardt <ps@pks.im>\n---\n git.c            | 58 +++++++++++++++++++++++++++++++-------------------------\n t/t0014-alias.sh |  1 +\n 2 files changed, 33 insertions(+), 26 deletions(-)\n\ndiff --git a/git.c b/git.c\nindex c2c1b8e22c2d91824ad6d631ea9374424ab53435..88356afe5fb568ccc147f055e3ab253c53a1befa 100644\n--- a/git.c\n+++ b/git.c\n@@ -362,7 +362,7 @@ static int handle_options(const char ***argv, int *argc, int *envchanged)\n \treturn (*argv) - orig_argv;\n }\n \n-static int handle_alias(int *argcp, const char ***argv)\n+static int handle_alias(struct strvec *args)\n {\n \tint envchanged = 0, ret = 0, saved_errno = errno;\n \tint count, option_count;\n@@ -370,10 +370,10 @@ static int handle_alias(int *argcp, const char ***argv)\n \tconst char *alias_command;\n \tchar *alias_string;\n \n-\talias_command = (*argv)[0];\n+\talias_command = args->v[0];\n \talias_string = alias_lookup(alias_command);\n \tif (alias_string) {\n-\t\tif (*argcp > 1 && !strcmp((*argv)[1], \"-h\"))\n+\t\tif (args->nr > 1 && !strcmp(args->v[1], \"-h\"))\n \t\t\tfprintf_ln(stderr, _(\"'%s' is aliased to '%s'\"),\n \t\t\t\t   alias_command, alias_string);\n \t\tif (alias_string[0] == '!') {\n@@ -390,7 +390,7 @@ static int handle_alias(int *argcp, const char ***argv)\n \t\t\tchild.wait_after_clean = 1;\n \t\t\tchild.trace2_child_class = \"shell_alias\";\n \t\t\tstrvec_push(&child.args, alias_string + 1);\n-\t\t\tstrvec_pushv(&child.args, (*argv) + 1);\n+\t\t\tstrvec_pushv(&child.args, args->v + 1);\n \n \t\t\ttrace2_cmd_alias(alias_command, child.args.v);\n \t\t\ttrace2_cmd_name(\"_run_shell_alias_\");\n@@ -423,15 +423,13 @@ static int handle_alias(int *argcp, const char ***argv)\n \t\ttrace_argv_printf(new_argv,\n \t\t\t\t  \"trace: alias expansion: %s =>\",\n \t\t\t\t  alias_command);\n-\n-\t\tREALLOC_ARRAY(new_argv, count + *argcp);\n-\t\t/* insert after command name */\n-\t\tCOPY_ARRAY(new_argv + count, *argv + 1, *argcp);\n-\n \t\ttrace2_cmd_alias(alias_command, new_argv);\n \n-\t\t*argv = new_argv;\n-\t\t*argcp += count - 1;\n+\t\t/* Replace the alias with the new arguments. */\n+\t\tstrvec_splice(args, 0, 1, new_argv, count);\n+\n+\t\tfree(alias_string);\n+\t\tfree(new_argv);\n \n \t\tret = 1;\n \t}\n@@ -800,10 +798,10 @@ static void execv_dashed_external(const char **argv)\n \t\texit(128);\n }\n \n-static int run_argv(int *argcp, const char ***argv)\n+static int run_argv(struct strvec *args)\n {\n \tint done_alias = 0;\n-\tstruct string_list cmd_list = STRING_LIST_INIT_NODUP;\n+\tstruct string_list cmd_list = STRING_LIST_INIT_DUP;\n \tstruct string_list_item *seen;\n \n \twhile (1) {\n@@ -817,8 +815,8 @@ static int run_argv(int *argcp, const char ***argv)\n \t\t * process.\n \t\t */\n \t\tif (!done_alias)\n-\t\t\thandle_builtin(*argcp, *argv);\n-\t\telse if (get_builtin(**argv)) {\n+\t\t\thandle_builtin(args->nr, args->v);\n+\t\telse if (get_builtin(args->v[0])) {\n \t\t\tstruct child_process cmd = CHILD_PROCESS_INIT;\n \t\t\tint i;\n \n@@ -834,8 +832,8 @@ static int run_argv(int *argcp, const char ***argv)\n \t\t\tcommit_pager_choice();\n \n \t\t\tstrvec_push(&cmd.args, \"git\");\n-\t\t\tfor (i = 0; i < *argcp; i++)\n-\t\t\t\tstrvec_push(&cmd.args, (*argv)[i]);\n+\t\t\tfor (i = 0; i < args->nr; i++)\n+\t\t\t\tstrvec_push(&cmd.args, args->v[i]);\n \n \t\t\ttrace_argv_printf(cmd.args.v, \"trace: exec:\");\n \n@@ -850,13 +848,13 @@ static int run_argv(int *argcp, const char ***argv)\n \t\t\ti = run_command(&cmd);\n \t\t\tif (i >= 0 || errno != ENOENT)\n \t\t\t\texit(i);\n-\t\t\tdie(\"could not execute builtin %s\", **argv);\n+\t\t\tdie(\"could not execute builtin %s\", args->v[0]);\n \t\t}\n \n \t\t/* .. then try the external ones */\n-\t\texecv_dashed_external(*argv);\n+\t\texecv_dashed_external(args->v);\n \n-\t\tseen = unsorted_string_list_lookup(&cmd_list, *argv[0]);\n+\t\tseen = unsorted_string_list_lookup(&cmd_list, args->v[0]);\n \t\tif (seen) {\n \t\t\tint i;\n \t\t\tstruct strbuf sb = STRBUF_INIT;\n@@ -873,14 +871,14 @@ static int run_argv(int *argcp, const char ***argv)\n \t\t\t      \" not terminate:%s\"), cmd_list.items[0].string, sb.buf);\n \t\t}\n \n-\t\tstring_list_append(&cmd_list, *argv[0]);\n+\t\tstring_list_append(&cmd_list, args->v[0]);\n \n \t\t/*\n \t\t * It could be an alias -- this works around the insanity\n \t\t * of overriding \"git log\" with \"git show\" by having\n \t\t * alias.log = show\n \t\t */\n-\t\tif (!handle_alias(argcp, argv))\n+\t\tif (!handle_alias(args))\n \t\t\tbreak;\n \t\tdone_alias = 1;\n \t}\n@@ -892,6 +890,7 @@ static int run_argv(int *argcp, const char ***argv)\n \n int cmd_main(int argc, const char **argv)\n {\n+\tstruct strvec args = STRVEC_INIT;\n \tconst char *cmd;\n \tint done_help = 0;\n \n@@ -951,25 +950,32 @@ int cmd_main(int argc, const char **argv)\n \t */\n \tsetup_path();\n \n+\tfor (size_t i = 0; i < argc; i++)\n+\t\tstrvec_push(&args, argv[i]);\n+\n \twhile (1) {\n-\t\tint was_alias = run_argv(&argc, &argv);\n+\t\tint was_alias = run_argv(&args);\n \t\tif (errno != ENOENT)\n \t\t\tbreak;\n \t\tif (was_alias) {\n \t\t\tfprintf(stderr, _(\"expansion of alias '%s' failed; \"\n \t\t\t\t\t  \"'%s' is not a git command\\n\"),\n-\t\t\t\tcmd, argv[0]);\n+\t\t\t\tcmd, args.v[0]);\n+\t\t\tstrvec_clear(&args);\n \t\t\texit(1);\n \t\t}\n \t\tif (!done_help) {\n-\t\t\tcmd = argv[0] = help_unknown_cmd(cmd);\n+\t\t\tstrvec_replace(&args, 0, help_unknown_cmd(cmd));\n+\t\t\tcmd = args.v[0];\n \t\t\tdone_help = 1;\n-\t\t} else\n+\t\t} else {\n \t\t\tbreak;\n+\t\t}\n \t}\n \n \tfprintf(stderr, _(\"failed to run command '%s': %s\\n\"),\n \t\tcmd, strerror(errno));\n+\tstrvec_clear(&args);\n \n \treturn 1;\n }\ndiff --git a/t/t0014-alias.sh b/t/t0014-alias.sh\nindex 854d59ec58c25ab2cfb58113bf5ea8d670829fe0..2a6f39ad9c81958d5152139995feab57c4371363 100755\n--- a/t/t0014-alias.sh\n+++ b/t/t0014-alias.sh\n@@ -2,6 +2,7 @@\n \n test_description='git command aliasing'\n \n+TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'nested aliases - internal execution' '\n\n-- \n2.47.0.229.g8f8d6eee53.dirty\n\n"},{"id":"506997","messageId":"20241111-b4-pks-leak-fixes-pt10-v2-11-6154bf91f0b0@pks.im","threadId":"62477","inReplyTo":"20241111-b4-pks-leak-fixes-pt10-v2-0-6154bf91f0b0@pks.im","subject":"[PATCH v2 11/27] git: refactor builtin handling to use a `struct strvec`","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-11T10:38:40Z","receivedAt":"2024-11-11T10:38:57Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"Similar as with the preceding commit, `handle_builtin()` does not\nproperly track lifetimes of the `argv` array and its strings. As it may\nend up modifying the array this can lead to memory leaks in case it\ncontains allocated strings.\n\nRefactor the function to use a `struct strvec` instead.\n\nSigned-off-by: Patrick Steinhardt <ps@pks.im>\n---\n git.c                  | 66 ++++++++++++++++++++++++--------------------------\n t/t0211-trace2-perf.sh |  2 +-\n 2 files changed, 32 insertions(+), 36 deletions(-)\n\ndiff --git a/git.c b/git.c\nindex 88356afe5fb568ccc147f055e3ab253c53a1befa..159dd45b08204c4a89d1dc4ab6990978e2454eb6 100644\n--- a/git.c\n+++ b/git.c\n@@ -696,63 +696,57 @@ void load_builtin_commands(const char *prefix, struct cmdnames *cmds)\n }\n \n #ifdef STRIP_EXTENSION\n-static void strip_extension(const char **argv)\n+static void strip_extension(struct strvec *args)\n {\n \tsize_t len;\n \n-\tif (strip_suffix(argv[0], STRIP_EXTENSION, &len))\n-\t\targv[0] = xmemdupz(argv[0], len);\n+\tif (strip_suffix(args->v[0], STRIP_EXTENSION, &len)) {\n+\t\tchar *stripped = xmemdupz(args->v[0], len);\n+\t\tstrvec_replace(args, 0, stripped);\n+\t\tfree(stripped);\n+\t}\n }\n #else\n #define strip_extension(cmd)\n #endif\n \n-static void handle_builtin(int argc, const char **argv)\n+static void handle_builtin(struct strvec *args)\n {\n-\tstruct strvec args = STRVEC_INIT;\n-\tconst char **argv_copy = NULL;\n \tconst char *cmd;\n \tstruct cmd_struct *builtin;\n \n-\tstrip_extension(argv);\n-\tcmd = argv[0];\n+\tstrip_extension(args);\n+\tcmd = args->v[0];\n \n \t/* Turn \"git cmd --help\" into \"git help --exclude-guides cmd\" */\n-\tif (argc > 1 && !strcmp(argv[1], \"--help\")) {\n-\t\tint i;\n-\n-\t\targv[1] = argv[0];\n-\t\targv[0] = cmd = \"help\";\n-\n-\t\tfor (i = 0; i < argc; i++) {\n-\t\t\tstrvec_push(&args, argv[i]);\n-\t\t\tif (!i)\n-\t\t\t\tstrvec_push(&args, \"--exclude-guides\");\n-\t\t}\n+\tif (args->nr > 1 && !strcmp(args->v[1], \"--help\")) {\n+\t\tconst char *exclude_guides_arg[] = { \"--exclude-guides\" };\n+\n+\t\tstrvec_replace(args, 1, args->v[0]);\n+\t\tstrvec_replace(args, 0, \"help\");\n+\t\tcmd = \"help\";\n+\t\tstrvec_splice(args, 2, 0, exclude_guides_arg,\n+\t\t\t      ARRAY_SIZE(exclude_guides_arg));\n+\t}\n \n-\t\targc++;\n+\tbuiltin = get_builtin(cmd);\n+\tif (builtin) {\n+\t\tconst char **argv_copy = NULL;\n+\t\tint ret;\n \n \t\t/*\n \t\t * `run_builtin()` will modify the argv array, so we need to\n \t\t * create a shallow copy such that we can free all of its\n \t\t * strings.\n \t\t */\n-\t\tCALLOC_ARRAY(argv_copy, argc + 1);\n-\t\tCOPY_ARRAY(argv_copy, args.v, argc);\n+\t\tif (args->nr)\n+\t\t\tDUP_ARRAY(argv_copy, args->v, args->nr + 1);\n \n-\t\targv = argv_copy;\n-\t}\n-\n-\tbuiltin = get_builtin(cmd);\n-\tif (builtin) {\n-\t\tint ret = run_builtin(builtin, argc, argv, the_repository);\n-\t\tstrvec_clear(&args);\n+\t\tret = run_builtin(builtin, args->nr, argv_copy, the_repository);\n+\t\tstrvec_clear(args);\n \t\tfree(argv_copy);\n \t\texit(ret);\n \t}\n-\n-\tstrvec_clear(&args);\n-\tfree(argv_copy);\n }\n \n static void execv_dashed_external(const char **argv)\n@@ -815,7 +809,7 @@ static int run_argv(struct strvec *args)\n \t\t * process.\n \t\t */\n \t\tif (!done_alias)\n-\t\t\thandle_builtin(args->nr, args->v);\n+\t\t\thandle_builtin(args);\n \t\telse if (get_builtin(args->v[0])) {\n \t\t\tstruct child_process cmd = CHILD_PROCESS_INIT;\n \t\t\tint i;\n@@ -916,8 +910,10 @@ int cmd_main(int argc, const char **argv)\n \t * that one cannot handle it.\n \t */\n \tif (skip_prefix(cmd, \"git-\", &cmd)) {\n-\t\targv[0] = cmd;\n-\t\thandle_builtin(argc, argv);\n+\t\tstrvec_push(&args, cmd);\n+\t\tstrvec_pushv(&args, argv + 1);\n+\t\thandle_builtin(&args);\n+\t\tstrvec_clear(&args);\n \t\tdie(_(\"cannot handle %s as a builtin\"), cmd);\n \t}\n \ndiff --git a/t/t0211-trace2-perf.sh b/t/t0211-trace2-perf.sh\nindex dddc130560ba6150fc5f5eac36c65ff76a2d31a1..91260ce97e5bdb39550a9e1e4abbc4d5fea48a21 100755\n--- a/t/t0211-trace2-perf.sh\n+++ b/t/t0211-trace2-perf.sh\n@@ -2,7 +2,7 @@\n \n test_description='test trace2 facility (perf target)'\n \n-TEST_PASSES_SANITIZE_LEAK=false\n+TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n # Turn off any inherited trace2 settings for this test.\n\n-- \n2.47.0.229.g8f8d6eee53.dirty\n\n"},{"id":"506998","messageId":"20241111-b4-pks-leak-fixes-pt10-v2-12-6154bf91f0b0@pks.im","threadId":"62477","inReplyTo":"20241111-b4-pks-leak-fixes-pt10-v2-0-6154bf91f0b0@pks.im","subject":"[PATCH v2 12/27] split-index: fix memory leak in `move_cache_to_base_index()`","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-11T10:38:41Z","receivedAt":"2024-11-11T10:38:58Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"In `move_cache_to_base_index()` we move the index cache of the main\nindex into the split index, which is used when writing a shared index.\nBut we don't release the old split index base in case we already had a\nsplit index before this operation, which can thus leak memory.\n\nPlug the leak by releasing the previous base.\n\nSigned-off-by: Patrick Steinhardt <ps@pks.im>\n---\n split-index.c          | 6 +++++-\n t/t1700-split-index.sh | 1 +\n 2 files changed, 6 insertions(+), 1 deletion(-)\n\ndiff --git a/split-index.c b/split-index.c\nindex 120c8190b187bc8c6c73630f06f5dd4dc994df30..cfbc773e6cd3b11ea5f47ab92310a56c30f6971c 100644\n--- a/split-index.c\n+++ b/split-index.c\n@@ -97,7 +97,11 @@ void move_cache_to_base_index(struct index_state *istate)\n \t\tmem_pool_combine(istate->ce_mem_pool, istate->split_index->base->ce_mem_pool);\n \t}\n \n-\tALLOC_ARRAY(si->base, 1);\n+\tif (si->base)\n+\t\trelease_index(si->base);\n+\telse\n+\t\tALLOC_ARRAY(si->base, 1);\n+\n \tindex_state_init(si->base, istate->repo);\n \tsi->base->version = istate->version;\n \t/* zero timestamp disables racy test in ce_write_index() */\ndiff --git a/t/t1700-split-index.sh b/t/t1700-split-index.sh\nindex ac4a5b2734c0784c2cb8878112a5ead9593860de..2625ac44889a5c9219e9575a9bbc5265d3c419d5 100755\n--- a/t/t1700-split-index.sh\n+++ b/t/t1700-split-index.sh\n@@ -5,6 +5,7 @@ test_description='split index mode tests'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n+TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n # We need total control of index splitting here\n\n-- \n2.47.0.229.g8f8d6eee53.dirty\n\n"},{"id":"506999","messageId":"20241111-b4-pks-leak-fixes-pt10-v2-13-6154bf91f0b0@pks.im","threadId":"62477","inReplyTo":"20241111-b4-pks-leak-fixes-pt10-v2-0-6154bf91f0b0@pks.im","subject":"[PATCH v2 13/27] builtin/sparse-checkout: fix leaking sanitized patterns","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-11T10:38:42Z","receivedAt":"2024-11-11T10:38:59Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"Both `git sparse-checkout add` and `git sparse-checkout set` accept a\nlist of additional directories or patterns. These get massaged via calls\nto `sanitize_paths()`, which may end up modifying the passed-in array by\nupdating its pointers to be prefixed paths. This allocates memory that\nwe never free.\n\nRefactor the code to instead use a `struct strvec`, which makes it way\neasier for us to track the lifetime correctly. The couple of extra\nmemory allocations likely do not matter as we only ever populate it with\ncommand line arguments.\n\nSigned-off-by: Patrick Steinhardt <ps@pks.im>\n---\n builtin/sparse-checkout.c | 61 ++++++++++++++++++++++++++++++-----------------\n 1 file changed, 39 insertions(+), 22 deletions(-)\n\ndiff --git a/builtin/sparse-checkout.c b/builtin/sparse-checkout.c\nindex 49aedc1de81a17b8b491cded7fa71b384e0e8be9..698d93a9ec5ed6d51d4a1db212f776b2db06cfc3 100644\n--- a/builtin/sparse-checkout.c\n+++ b/builtin/sparse-checkout.c\n@@ -669,7 +669,7 @@ static void add_patterns_literal(int argc, const char **argv,\n \tadd_patterns_from_input(pl, argc, argv, use_stdin ? stdin : NULL);\n }\n \n-static int modify_pattern_list(int argc, const char **argv, int use_stdin,\n+static int modify_pattern_list(struct strvec *args, int use_stdin,\n \t\t\t       enum modify_type m)\n {\n \tint result;\n@@ -679,13 +679,13 @@ static int modify_pattern_list(int argc, const char **argv, int use_stdin,\n \tswitch (m) {\n \tcase ADD:\n \t\tif (core_sparse_checkout_cone)\n-\t\t\tadd_patterns_cone_mode(argc, argv, pl, use_stdin);\n+\t\t\tadd_patterns_cone_mode(args->nr, args->v, pl, use_stdin);\n \t\telse\n-\t\t\tadd_patterns_literal(argc, argv, pl, use_stdin);\n+\t\t\tadd_patterns_literal(args->nr, args->v, pl, use_stdin);\n \t\tbreak;\n \n \tcase REPLACE:\n-\t\tadd_patterns_from_input(pl, argc, argv,\n+\t\tadd_patterns_from_input(pl, args->nr, args->v,\n \t\t\t\t\tuse_stdin ? stdin : NULL);\n \t\tbreak;\n \t}\n@@ -706,12 +706,12 @@ static int modify_pattern_list(int argc, const char **argv, int use_stdin,\n \treturn result;\n }\n \n-static void sanitize_paths(int argc, const char **argv,\n+static void sanitize_paths(struct strvec *args,\n \t\t\t   const char *prefix, int skip_checks)\n {\n \tint i;\n \n-\tif (!argc)\n+\tif (!args->nr)\n \t\treturn;\n \n \tif (prefix && *prefix && core_sparse_checkout_cone) {\n@@ -721,8 +721,11 @@ static void sanitize_paths(int argc, const char **argv,\n \t\t */\n \t\tint prefix_len = strlen(prefix);\n \n-\t\tfor (i = 0; i < argc; i++)\n-\t\t\targv[i] = prefix_path(prefix, prefix_len, argv[i]);\n+\t\tfor (i = 0; i < args->nr; i++) {\n+\t\t\tchar *prefixed_path = prefix_path(prefix, prefix_len, args->v[i]);\n+\t\t\tstrvec_replace(args, i, prefixed_path);\n+\t\t\tfree(prefixed_path);\n+\t\t}\n \t}\n \n \tif (skip_checks)\n@@ -732,20 +735,20 @@ static void sanitize_paths(int argc, const char **argv,\n \t\tdie(_(\"please run from the toplevel directory in non-cone mode\"));\n \n \tif (core_sparse_checkout_cone) {\n-\t\tfor (i = 0; i < argc; i++) {\n-\t\t\tif (argv[i][0] == '/')\n+\t\tfor (i = 0; i < args->nr; i++) {\n+\t\t\tif (args->v[i][0] == '/')\n \t\t\t\tdie(_(\"specify directories rather than patterns (no leading slash)\"));\n-\t\t\tif (argv[i][0] == '!')\n+\t\t\tif (args->v[i][0] == '!')\n \t\t\t\tdie(_(\"specify directories rather than patterns.  If your directory starts with a '!', pass --skip-checks\"));\n-\t\t\tif (strpbrk(argv[i], \"*?[]\"))\n+\t\t\tif (strpbrk(args->v[i], \"*?[]\"))\n \t\t\t\tdie(_(\"specify directories rather than patterns.  If your directory really has any of '*?[]\\\\' in it, pass --skip-checks\"));\n \t\t}\n \t}\n \n-\tfor (i = 0; i < argc; i++) {\n+\tfor (i = 0; i < args->nr; i++) {\n \t\tstruct cache_entry *ce;\n \t\tstruct index_state *index = the_repository->index;\n-\t\tint pos = index_name_pos(index, argv[i], strlen(argv[i]));\n+\t\tint pos = index_name_pos(index, args->v[i], strlen(args->v[i]));\n \n \t\tif (pos < 0)\n \t\t\tcontinue;\n@@ -754,9 +757,9 @@ static void sanitize_paths(int argc, const char **argv,\n \t\t\tcontinue;\n \n \t\tif (core_sparse_checkout_cone)\n-\t\t\tdie(_(\"'%s' is not a directory; to treat it as a directory anyway, rerun with --skip-checks\"), argv[i]);\n+\t\t\tdie(_(\"'%s' is not a directory; to treat it as a directory anyway, rerun with --skip-checks\"), args->v[i]);\n \t\telse\n-\t\t\twarning(_(\"pass a leading slash before paths such as '%s' if you want a single file (see NON-CONE PROBLEMS in the git-sparse-checkout manual).\"), argv[i]);\n+\t\t\twarning(_(\"pass a leading slash before paths such as '%s' if you want a single file (see NON-CONE PROBLEMS in the git-sparse-checkout manual).\"), args->v[i]);\n \t}\n }\n \n@@ -780,6 +783,8 @@ static int sparse_checkout_add(int argc, const char **argv, const char *prefix)\n \t\t\t N_(\"read patterns from standard in\")),\n \t\tOPT_END(),\n \t};\n+\tstruct strvec patterns = STRVEC_INIT;\n+\tint ret;\n \n \tsetup_work_tree();\n \tif (!core_apply_sparse_checkout)\n@@ -791,9 +796,14 @@ static int sparse_checkout_add(int argc, const char **argv, const char *prefix)\n \t\t\t     builtin_sparse_checkout_add_options,\n \t\t\t     builtin_sparse_checkout_add_usage, 0);\n \n-\tsanitize_paths(argc, argv, prefix, add_opts.skip_checks);\n+\tfor (int i = 0; i < argc; i++)\n+\t\tstrvec_push(&patterns, argv[i]);\n+\tsanitize_paths(&patterns, prefix, add_opts.skip_checks);\n \n-\treturn modify_pattern_list(argc, argv, add_opts.use_stdin, ADD);\n+\tret = modify_pattern_list(&patterns, add_opts.use_stdin, ADD);\n+\n+\tstrvec_clear(&patterns);\n+\treturn ret;\n }\n \n static char const * const builtin_sparse_checkout_set_usage[] = {\n@@ -826,6 +836,8 @@ static int sparse_checkout_set(int argc, const char **argv, const char *prefix)\n \t\t\t   PARSE_OPT_NONEG),\n \t\tOPT_END(),\n \t};\n+\tstruct strvec patterns = STRVEC_INIT;\n+\tint ret;\n \n \tsetup_work_tree();\n \trepo_read_index(the_repository);\n@@ -846,13 +858,18 @@ static int sparse_checkout_set(int argc, const char **argv, const char *prefix)\n \t * top-level directory (much as 'init' would do).\n \t */\n \tif (!core_sparse_checkout_cone && !set_opts.use_stdin && argc == 0) {\n-\t\targv = default_patterns;\n-\t\targc = default_patterns_nr;\n+\t\tfor (int i = 0; i < default_patterns_nr; i++)\n+\t\t\tstrvec_push(&patterns, default_patterns[i]);\n \t} else {\n-\t\tsanitize_paths(argc, argv, prefix, set_opts.skip_checks);\n+\t\tfor (int i = 0; i < argc; i++)\n+\t\t\tstrvec_push(&patterns, argv[i]);\n+\t\tsanitize_paths(&patterns, prefix, set_opts.skip_checks);\n \t}\n \n-\treturn modify_pattern_list(argc, argv, set_opts.use_stdin, REPLACE);\n+\tret = modify_pattern_list(&patterns, set_opts.use_stdin, REPLACE);\n+\n+\tstrvec_clear(&patterns);\n+\treturn ret;\n }\n \n static char const * const builtin_sparse_checkout_reapply_usage[] = {\n\n-- \n2.47.0.229.g8f8d6eee53.dirty\n\n"},{"id":"507000","messageId":"20241111-b4-pks-leak-fixes-pt10-v2-14-6154bf91f0b0@pks.im","threadId":"62477","inReplyTo":"20241111-b4-pks-leak-fixes-pt10-v2-0-6154bf91f0b0@pks.im","subject":"[PATCH v2 14/27] help: refactor to not use globals for reading config","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-11T10:38:43Z","receivedAt":"2024-11-11T10:38:59Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"We're reading the \"help.autocorrect\" and \"alias.*\" configuration into\nglobal variables, which makes it hard to manage their lifetime\ncorrectly. Refactor the code to use a struct instead.\n\nSigned-off-by: Patrick Steinhardt <ps@pks.im>\n---\n help.c | 47 ++++++++++++++++++++++++-----------------------\n 1 file changed, 24 insertions(+), 23 deletions(-)\n\ndiff --git a/help.c b/help.c\nindex 4ad4ebdd2cfddb3191bb4f6d593a55d3c5d3ed14..8794f81db9bbf457b7cabca59222299922f3cc7f 100644\n--- a/help.c\n+++ b/help.c\n@@ -546,8 +546,10 @@ int is_in_cmdlist(struct cmdnames *c, const char *s)\n \treturn 0;\n }\n \n-static int autocorrect;\n-static struct cmdnames aliases;\n+struct help_unknown_cmd_config {\n+\tint autocorrect;\n+\tstruct cmdnames aliases;\n+};\n \n #define AUTOCORRECT_PROMPT (-3)\n #define AUTOCORRECT_NEVER (-2)\n@@ -555,28 +557,29 @@ static struct cmdnames aliases;\n \n static int git_unknown_cmd_config(const char *var, const char *value,\n \t\t\t\t  const struct config_context *ctx,\n-\t\t\t\t  void *cb UNUSED)\n+\t\t\t\t  void *cb)\n {\n+\tstruct help_unknown_cmd_config *cfg = cb;\n \tconst char *p;\n \n \tif (!strcmp(var, \"help.autocorrect\")) {\n \t\tif (!value)\n \t\t\treturn config_error_nonbool(var);\n \t\tif (!strcmp(value, \"never\")) {\n-\t\t\tautocorrect = AUTOCORRECT_NEVER;\n+\t\t\tcfg->autocorrect = AUTOCORRECT_NEVER;\n \t\t} else if (!strcmp(value, \"immediate\")) {\n-\t\t\tautocorrect = AUTOCORRECT_IMMEDIATELY;\n+\t\t\tcfg->autocorrect = AUTOCORRECT_IMMEDIATELY;\n \t\t} else if (!strcmp(value, \"prompt\")) {\n-\t\t\tautocorrect = AUTOCORRECT_PROMPT;\n+\t\t\tcfg->autocorrect = AUTOCORRECT_PROMPT;\n \t\t} else {\n \t\t\tint v = git_config_int(var, value, ctx->kvi);\n-\t\t\tautocorrect = (v < 0)\n+\t\t\tcfg->autocorrect = (v < 0)\n \t\t\t\t? AUTOCORRECT_IMMEDIATELY : v;\n \t\t}\n \t}\n \t/* Also use aliases for command lookup */\n \tif (skip_prefix(var, \"alias.\", &p))\n-\t\tadd_cmdname(&aliases, p, strlen(p));\n+\t\tadd_cmdname(&cfg->aliases, p, strlen(p));\n \n \treturn 0;\n }\n@@ -611,30 +614,28 @@ static const char bad_interpreter_advice[] =\n \n const char *help_unknown_cmd(const char *cmd)\n {\n+\tstruct help_unknown_cmd_config cfg = { 0 };\n \tint i, n, best_similarity = 0;\n-\tstruct cmdnames main_cmds, other_cmds;\n+\tstruct cmdnames main_cmds = { 0 };\n+\tstruct cmdnames other_cmds = { 0 };\n \tstruct cmdname_help *common_cmds;\n \n-\tmemset(&main_cmds, 0, sizeof(main_cmds));\n-\tmemset(&other_cmds, 0, sizeof(other_cmds));\n-\tmemset(&aliases, 0, sizeof(aliases));\n-\n-\tread_early_config(the_repository, git_unknown_cmd_config, NULL);\n+\tread_early_config(the_repository, git_unknown_cmd_config, &cfg);\n \n \t/*\n \t * Disable autocorrection prompt in a non-interactive session\n \t */\n-\tif ((autocorrect == AUTOCORRECT_PROMPT) && (!isatty(0) || !isatty(2)))\n-\t\tautocorrect = AUTOCORRECT_NEVER;\n+\tif ((cfg.autocorrect == AUTOCORRECT_PROMPT) && (!isatty(0) || !isatty(2)))\n+\t\tcfg.autocorrect = AUTOCORRECT_NEVER;\n \n-\tif (autocorrect == AUTOCORRECT_NEVER) {\n+\tif (cfg.autocorrect == AUTOCORRECT_NEVER) {\n \t\tfprintf_ln(stderr, _(\"git: '%s' is not a git command. See 'git --help'.\"), cmd);\n \t\texit(1);\n \t}\n \n \tload_command_list(\"git-\", &main_cmds, &other_cmds);\n \n-\tadd_cmd_list(&main_cmds, &aliases);\n+\tadd_cmd_list(&main_cmds, &cfg.aliases);\n \tadd_cmd_list(&main_cmds, &other_cmds);\n \tQSORT(main_cmds.names, main_cmds.cnt, cmdname_compare);\n \tuniq(&main_cmds);\n@@ -693,7 +694,7 @@ const char *help_unknown_cmd(const char *cmd)\n \t\t     n++)\n \t\t\t; /* still counting */\n \t}\n-\tif (autocorrect && n == 1 && SIMILAR_ENOUGH(best_similarity)) {\n+\tif (cfg.autocorrect && n == 1 && SIMILAR_ENOUGH(best_similarity)) {\n \t\tconst char *assumed = main_cmds.names[0]->name;\n \t\tmain_cmds.names[0] = NULL;\n \t\tcmdnames_release(&main_cmds);\n@@ -701,12 +702,12 @@ const char *help_unknown_cmd(const char *cmd)\n \t\t\t   _(\"WARNING: You called a Git command named '%s', \"\n \t\t\t     \"which does not exist.\"),\n \t\t\t   cmd);\n-\t\tif (autocorrect == AUTOCORRECT_IMMEDIATELY)\n+\t\tif (cfg.autocorrect == AUTOCORRECT_IMMEDIATELY)\n \t\t\tfprintf_ln(stderr,\n \t\t\t\t   _(\"Continuing under the assumption that \"\n \t\t\t\t     \"you meant '%s'.\"),\n \t\t\t\t   assumed);\n-\t\telse if (autocorrect == AUTOCORRECT_PROMPT) {\n+\t\telse if (cfg.autocorrect == AUTOCORRECT_PROMPT) {\n \t\t\tchar *answer;\n \t\t\tstruct strbuf msg = STRBUF_INIT;\n \t\t\tstrbuf_addf(&msg, _(\"Run '%s' instead [y/N]? \"), assumed);\n@@ -719,8 +720,8 @@ const char *help_unknown_cmd(const char *cmd)\n \t\t\tfprintf_ln(stderr,\n \t\t\t\t   _(\"Continuing in %0.1f seconds, \"\n \t\t\t\t     \"assuming that you meant '%s'.\"),\n-\t\t\t\t   (float)autocorrect/10.0, assumed);\n-\t\t\tsleep_millisec(autocorrect * 100);\n+\t\t\t\t   (float)cfg.autocorrect/10.0, assumed);\n+\t\t\tsleep_millisec(cfg.autocorrect * 100);\n \t\t}\n \t\treturn assumed;\n \t}\n\n-- \n2.47.0.229.g8f8d6eee53.dirty\n\n"},{"id":"507001","messageId":"20241111-b4-pks-leak-fixes-pt10-v2-15-6154bf91f0b0@pks.im","threadId":"62477","inReplyTo":"20241111-b4-pks-leak-fixes-pt10-v2-0-6154bf91f0b0@pks.im","subject":"[PATCH v2 15/27] help: fix leaking `struct cmdnames`","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-11T10:38:44Z","receivedAt":"2024-11-11T10:39:00Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"We're populating multiple `struct cmdnames`, but don't ever free them.\nPlug this memory leak.\n\nSigned-off-by: Patrick Steinhardt <ps@pks.im>\n---\n help.c | 4 ++++\n 1 file changed, 4 insertions(+)\n\ndiff --git a/help.c b/help.c\nindex 8794f81db9bbf457b7cabca59222299922f3cc7f..8b56cd6e25ba5f2be2cbf2a7a9ed48136e12a0c7 100644\n--- a/help.c\n+++ b/help.c\n@@ -723,6 +723,10 @@ const char *help_unknown_cmd(const char *cmd)\n \t\t\t\t   (float)cfg.autocorrect/10.0, assumed);\n \t\t\tsleep_millisec(cfg.autocorrect * 100);\n \t\t}\n+\n+\t\tcmdnames_release(&cfg.aliases);\n+\t\tcmdnames_release(&main_cmds);\n+\t\tcmdnames_release(&other_cmds);\n \t\treturn assumed;\n \t}\n \n\n-- \n2.47.0.229.g8f8d6eee53.dirty\n\n"},{"id":"507002","messageId":"20241111-b4-pks-leak-fixes-pt10-v2-16-6154bf91f0b0@pks.im","threadId":"62477","inReplyTo":"20241111-b4-pks-leak-fixes-pt10-v2-0-6154bf91f0b0@pks.im","subject":"[PATCH v2 16/27] help: fix leaking return value from `help_unknown_cmd()`","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-11T10:38:45Z","receivedAt":"2024-11-11T10:39:01Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"While `help_unknown_cmd()` would usually die on an unknown command, it\ninstead returns an autocorrected command when \"help.autocorrect\" is set.\nBut while the function is declared to return a string constant, it\nactually returns an allocated string in that case. Callers thus aren't\naware that they have to free the string, leading to a memory leak.\n\nFix the function return type to be non-constant and free the returned\nvalue at its only callsite.\n\nNote that we cannot simply take ownership of `main_cmds.names[0]->name`\nand then eventually free it. This is because the `struct cmdname` is\nusing a flex array to allocate the name, so the name pointer points into\nthe middle of the structure and thus cannot be freed.\n\nSigned-off-by: Patrick Steinhardt <ps@pks.im>\n---\n git.c  | 4 +++-\n help.c | 7 +++----\n help.h | 2 +-\n 3 files changed, 7 insertions(+), 6 deletions(-)\n\ndiff --git a/git.c b/git.c\nindex 159dd45b08204c4a89d1dc4ab6990978e2454eb6..46b3c740c5d665388917c6eee3052cc3ef8368f2 100644\n--- a/git.c\n+++ b/git.c\n@@ -961,7 +961,9 @@ int cmd_main(int argc, const char **argv)\n \t\t\texit(1);\n \t\t}\n \t\tif (!done_help) {\n-\t\t\tstrvec_replace(&args, 0, help_unknown_cmd(cmd));\n+\t\t\tchar *assumed = help_unknown_cmd(cmd);\n+\t\t\tstrvec_replace(&args, 0, assumed);\n+\t\t\tfree(assumed);\n \t\t\tcmd = args.v[0];\n \t\t\tdone_help = 1;\n \t\t} else {\ndiff --git a/help.c b/help.c\nindex 8b56cd6e25ba5f2be2cbf2a7a9ed48136e12a0c7..8a830ba35c6fd1377213e2ed40846f3d46dba363 100644\n--- a/help.c\n+++ b/help.c\n@@ -612,7 +612,7 @@ static const char bad_interpreter_advice[] =\n \tN_(\"'%s' appears to be a git command, but we were not\\n\"\n \t\"able to execute it. Maybe git-%s is broken?\");\n \n-const char *help_unknown_cmd(const char *cmd)\n+char *help_unknown_cmd(const char *cmd)\n {\n \tstruct help_unknown_cmd_config cfg = { 0 };\n \tint i, n, best_similarity = 0;\n@@ -695,9 +695,8 @@ const char *help_unknown_cmd(const char *cmd)\n \t\t\t; /* still counting */\n \t}\n \tif (cfg.autocorrect && n == 1 && SIMILAR_ENOUGH(best_similarity)) {\n-\t\tconst char *assumed = main_cmds.names[0]->name;\n-\t\tmain_cmds.names[0] = NULL;\n-\t\tcmdnames_release(&main_cmds);\n+\t\tchar *assumed = xstrdup(main_cmds.names[0]->name);\n+\n \t\tfprintf_ln(stderr,\n \t\t\t   _(\"WARNING: You called a Git command named '%s', \"\n \t\t\t     \"which does not exist.\"),\ndiff --git a/help.h b/help.h\nindex e716ee27ea174c4dfc3b941619bf361972894212..67207b3073ce48fa25f67f9a4922abc4e2ce7926 100644\n--- a/help.h\n+++ b/help.h\n@@ -32,7 +32,7 @@ void list_all_other_cmds(struct string_list *list);\n void list_cmds_by_category(struct string_list *list,\n \t\t\t   const char *category);\n void list_cmds_by_config(struct string_list *list);\n-const char *help_unknown_cmd(const char *cmd);\n+char *help_unknown_cmd(const char *cmd);\n void load_command_list(const char *prefix,\n \t\t       struct cmdnames *main_cmds,\n \t\t       struct cmdnames *other_cmds);\n\n-- \n2.47.0.229.g8f8d6eee53.dirty\n\n"},{"id":"507003","messageId":"20241111-b4-pks-leak-fixes-pt10-v2-17-6154bf91f0b0@pks.im","threadId":"62477","inReplyTo":"20241111-b4-pks-leak-fixes-pt10-v2-0-6154bf91f0b0@pks.im","subject":"[PATCH v2 17/27] builtin/help: fix leaks in `check_git_cmd()`","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-11T10:38:46Z","receivedAt":"2024-11-11T10:39:02Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"The `check_git_cmd()` function is declared to return a string constant.\nAnd while it sometimes does return a constant, it may also return an\nallocated string in two cases:\n\n  - When handling aliases. This case is already marked with `UNLEAK()`\n    to work around the leak.\n\n  - When handling unknown commands in case \"help.autocorrect\" is\n    enabled. This one is not marked with `UNLEAK()`.\n\nThe function only has a single caller, so let's fix its return type to\nbe non-constant, consistently return an allocated string and free it at\nits callsite to plug the leak.\n\nSigned-off-by: Patrick Steinhardt <ps@pks.im>\n---\n builtin/help.c | 13 +++++++------\n 1 file changed, 7 insertions(+), 6 deletions(-)\n\ndiff --git a/builtin/help.c b/builtin/help.c\nindex 4a5a0790704b402e6f989118a0f90b52eb49dae1..6a72d991a84d9f14ecb8a711a012ed544450ca1c 100644\n--- a/builtin/help.c\n+++ b/builtin/help.c\n@@ -551,12 +551,12 @@ static void show_html_page(const char *page)\n \topen_html(page_path.buf);\n }\n \n-static const char *check_git_cmd(const char* cmd)\n+static char *check_git_cmd(const char *cmd)\n {\n \tchar *alias;\n \n \tif (is_git_command(cmd))\n-\t\treturn cmd;\n+\t\treturn xstrdup(cmd);\n \n \talias = alias_lookup(cmd);\n \tif (alias) {\n@@ -589,14 +589,13 @@ static const char *check_git_cmd(const char* cmd)\n \t\t\tdie(_(\"bad alias.%s string: %s\"), cmd,\n \t\t\t    split_cmdline_strerror(count));\n \t\tfree(argv);\n-\t\tUNLEAK(alias);\n \t\treturn alias;\n \t}\n \n \tif (exclude_guides)\n \t\treturn help_unknown_cmd(cmd);\n \n-\treturn cmd;\n+\treturn xstrdup(cmd);\n }\n \n static void no_help_format(const char *opt_mode, enum help_format fmt)\n@@ -642,6 +641,7 @@ int cmd_help(int argc,\n {\n \tint nongit;\n \tenum help_format parsed_help_format;\n+\tchar *command = NULL;\n \tconst char *page;\n \n \targc = parse_options(argc, argv, prefix, builtin_help_options,\n@@ -713,9 +713,9 @@ int cmd_help(int argc,\n \tif (help_format == HELP_FORMAT_NONE)\n \t\thelp_format = parse_help_format(DEFAULT_HELP_FORMAT);\n \n-\targv[0] = check_git_cmd(argv[0]);\n+\tcommand = check_git_cmd(argv[0]);\n \n-\tpage = cmd_to_page(argv[0]);\n+\tpage = cmd_to_page(command);\n \tswitch (help_format) {\n \tcase HELP_FORMAT_NONE:\n \tcase HELP_FORMAT_MAN:\n@@ -729,5 +729,6 @@ int cmd_help(int argc,\n \t\tbreak;\n \t}\n \n+\tfree(command);\n \treturn 0;\n }\n\n-- \n2.47.0.229.g8f8d6eee53.dirty\n\n"},{"id":"507004","messageId":"20241111-b4-pks-leak-fixes-pt10-v2-18-6154bf91f0b0@pks.im","threadId":"62477","inReplyTo":"20241111-b4-pks-leak-fixes-pt10-v2-0-6154bf91f0b0@pks.im","subject":"[PATCH v2 18/27] builtin/init-db: fix leaking directory paths","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-11T10:38:47Z","receivedAt":"2024-11-11T10:39:03Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"We've got a couple of leaking directory paths in git-init(1), all of\nwhich are marked with `UNLEAK()`. Fixing them is trivial, so let's do\nthat instead so that we can get rid of `UNLEAK()` entirely.\n\nSigned-off-by: Patrick Steinhardt <ps@pks.im>\n---\n builtin/init-db.c | 34 +++++++++++++++++++---------------\n 1 file changed, 19 insertions(+), 15 deletions(-)\n\ndiff --git a/builtin/init-db.c b/builtin/init-db.c\nindex 7e00d57d654e6820c7ad2418cafc3a9aca815816..096f96b9c4a2035b8d1edd0ac90de0dd73d7d508 100644\n--- a/builtin/init-db.c\n+++ b/builtin/init-db.c\n@@ -75,10 +75,12 @@ int cmd_init_db(int argc,\n \t\tconst char *prefix,\n \t\tstruct repository *repo UNUSED)\n {\n-\tconst char *git_dir;\n+\tchar *git_dir;\n \tconst char *real_git_dir = NULL;\n-\tconst char *work_tree;\n+\tchar *real_git_dir_to_free = NULL;\n+\tchar *work_tree = NULL;\n \tconst char *template_dir = NULL;\n+\tchar *template_dir_to_free = NULL;\n \tunsigned int flags = 0;\n \tconst char *object_format = NULL;\n \tconst char *ref_format = NULL;\n@@ -106,6 +108,7 @@ int cmd_init_db(int argc,\n \t\t\t   N_(\"specify the reference format to use\")),\n \t\tOPT_END()\n \t};\n+\tint ret;\n \n \targc = parse_options(argc, argv, prefix, init_db_options, init_db_usage, 0);\n \n@@ -113,12 +116,10 @@ int cmd_init_db(int argc,\n \t\tdie(_(\"options '%s' and '%s' cannot be used together\"), \"--separate-git-dir\", \"--bare\");\n \n \tif (real_git_dir && !is_absolute_path(real_git_dir))\n-\t\treal_git_dir = real_pathdup(real_git_dir, 1);\n+\t\treal_git_dir = real_git_dir_to_free = real_pathdup(real_git_dir, 1);\n \n-\tif (template_dir && *template_dir && !is_absolute_path(template_dir)) {\n-\t\ttemplate_dir = absolute_pathdup(template_dir);\n-\t\tUNLEAK(template_dir);\n-\t}\n+\tif (template_dir && *template_dir && !is_absolute_path(template_dir))\n+\t\ttemplate_dir = template_dir_to_free = absolute_pathdup(template_dir);\n \n \tif (argc == 1) {\n \t\tint mkdir_tried = 0;\n@@ -192,7 +193,7 @@ int cmd_init_db(int argc,\n \t * Set up the default .git directory contents\n \t */\n \tif (!git_dir)\n-\t\tgit_dir = DEFAULT_GIT_DIR_ENVIRONMENT;\n+\t\tgit_dir = xstrdup(DEFAULT_GIT_DIR_ENVIRONMENT);\n \n \t/*\n \t * When --separate-git-dir is used inside a linked worktree, take\n@@ -213,6 +214,7 @@ int cmd_init_db(int argc,\n \t\t\tif (chdir(mainwt.buf) < 0)\n \t\t\t\tdie_errno(_(\"cannot chdir to %s\"), mainwt.buf);\n \t\t\tstrbuf_release(&mainwt);\n+\t\t\tfree(git_dir);\n \t\t\tgit_dir = strbuf_detach(&sb, NULL);\n \t\t}\n \t\tstrbuf_release(&sb);\n@@ -245,12 +247,14 @@ int cmd_init_db(int argc,\n \t\t\tset_git_work_tree(work_tree);\n \t}\n \n-\tUNLEAK(real_git_dir);\n-\tUNLEAK(git_dir);\n-\tUNLEAK(work_tree);\n-\n \tflags |= INIT_DB_EXIST_OK;\n-\treturn init_db(git_dir, real_git_dir, template_dir, hash_algo,\n-\t\t       ref_storage_format, initial_branch,\n-\t\t       init_shared_repository, flags);\n+\tret = init_db(git_dir, real_git_dir, template_dir, hash_algo,\n+\t\t      ref_storage_format, initial_branch,\n+\t\t      init_shared_repository, flags);\n+\n+\tfree(template_dir_to_free);\n+\tfree(real_git_dir_to_free);\n+\tfree(work_tree);\n+\tfree(git_dir);\n+\treturn ret;\n }\n\n-- \n2.47.0.229.g8f8d6eee53.dirty\n\n"},{"id":"507005","messageId":"20241111-b4-pks-leak-fixes-pt10-v2-19-6154bf91f0b0@pks.im","threadId":"62477","inReplyTo":"20241111-b4-pks-leak-fixes-pt10-v2-0-6154bf91f0b0@pks.im","subject":"[PATCH v2 19/27] builtin/branch: fix leaking sorting options","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-11T10:38:48Z","receivedAt":"2024-11-11T10:39:04Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"The sorting options are leaking, but given that they are marked with\n`UNLEAK()` the leak sanitizer doesn't complain.\n\nFix the leak by creating a common exit path and clearing the vector such\nthat we can get rid of the `UNLEAK()` annotation entirely.\n\nSigned-off-by: Patrick Steinhardt <ps@pks.im>\n---\n builtin/branch.c | 33 ++++++++++++++++++++++-----------\n 1 file changed, 22 insertions(+), 11 deletions(-)\n\ndiff --git a/builtin/branch.c b/builtin/branch.c\nindex fd1611ebf559f7665114c41ee379db24fdb357fd..05ba4cd7a6454d8753d983082807a06dd989cb48 100644\n--- a/builtin/branch.c\n+++ b/builtin/branch.c\n@@ -722,6 +722,7 @@ int cmd_branch(int argc,\n \tstatic struct ref_sorting *sorting;\n \tstruct string_list sorting_options = STRING_LIST_INIT_DUP;\n \tstruct ref_format format = REF_FORMAT_INIT;\n+\tint ret;\n \n \tstruct option options[] = {\n \t\tOPT_GROUP(N_(\"Generic options\")),\n@@ -851,15 +852,15 @@ int cmd_branch(int argc,\n \tif (list)\n \t\tsetup_auto_pager(\"branch\", 1);\n \n-\tUNLEAK(sorting_options);\n-\n \tif (delete) {\n \t\tif (!argc)\n \t\t\tdie(_(\"branch name required\"));\n-\t\treturn delete_branches(argc, argv, delete > 1, filter.kind, quiet);\n+\t\tret = delete_branches(argc, argv, delete > 1, filter.kind, quiet);\n+\t\tgoto out;\n \t} else if (show_current) {\n \t\tprint_current_branch_name();\n-\t\treturn 0;\n+\t\tret = 0;\n+\t\tgoto out;\n \t} else if (list) {\n \t\t/*  git branch --list also shows HEAD when it is detached */\n \t\tif ((filter.kind & FILTER_REFS_BRANCHES) && filter.detached)\n@@ -882,12 +883,13 @@ int cmd_branch(int argc,\n \t\tref_sorting_release(sorting);\n \t\tref_filter_clear(&filter);\n \t\tref_format_clear(&format);\n-\t\treturn 0;\n+\n+\t\tret = 0;\n+\t\tgoto out;\n \t} else if (edit_description) {\n \t\tconst char *branch_name;\n \t\tstruct strbuf branch_ref = STRBUF_INIT;\n \t\tstruct strbuf buf = STRBUF_INIT;\n-\t\tint ret = 1; /* assume failure */\n \n \t\tif (!argc) {\n \t\t\tif (filter.detached)\n@@ -901,18 +903,22 @@ int cmd_branch(int argc,\n \t\t}\n \n \t\tstrbuf_addf(&branch_ref, \"refs/heads/%s\", branch_name);\n-\t\tif (!refs_ref_exists(get_main_ref_store(the_repository), branch_ref.buf))\n+\t\tif (!refs_ref_exists(get_main_ref_store(the_repository), branch_ref.buf)) {\n \t\t\terror((!argc || branch_checked_out(branch_ref.buf))\n \t\t\t      ? _(\"no commit on branch '%s' yet\")\n \t\t\t      : _(\"no branch named '%s'\"),\n \t\t\t      branch_name);\n-\t\telse if (!edit_branch_description(branch_name))\n+\t\t\tret = 1;\n+\t\t} else if (!edit_branch_description(branch_name)) {\n \t\t\tret = 0; /* happy */\n+\t\t} else {\n+\t\t\tret = 1;\n+\t\t}\n \n \t\tstrbuf_release(&branch_ref);\n \t\tstrbuf_release(&buf);\n \n-\t\treturn ret;\n+\t\tgoto out;\n \t} else if (copy || rename) {\n \t\tif (!argc)\n \t\t\tdie(_(\"branch name required\"));\n@@ -1000,12 +1006,17 @@ int cmd_branch(int argc,\n \t\t\tcreate_branches_recursively(the_repository, branch_name,\n \t\t\t\t\t\t    start_name, NULL, force,\n \t\t\t\t\t\t    reflog, quiet, track, 0);\n-\t\t\treturn 0;\n+\t\t\tret = 0;\n+\t\t\tgoto out;\n \t\t}\n \t\tcreate_branch(the_repository, branch_name, start_name, force, 0,\n \t\t\t      reflog, quiet, track, 0);\n \t} else\n \t\tusage_with_options(builtin_branch_usage, options);\n \n-\treturn 0;\n+\tret = 0;\n+\n+out:\n+\tstring_list_clear(&sorting_options, 0);\n+\treturn ret;\n }\n\n-- \n2.47.0.229.g8f8d6eee53.dirty\n\n"},{"id":"507006","messageId":"20241111-b4-pks-leak-fixes-pt10-v2-20-6154bf91f0b0@pks.im","threadId":"62477","inReplyTo":"20241111-b4-pks-leak-fixes-pt10-v2-0-6154bf91f0b0@pks.im","subject":"[PATCH v2 20/27] t/helper: fix leaking commit graph in \"read-graph\" subcommand","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-11T10:38:49Z","receivedAt":"2024-11-11T10:39:05Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"We're leaking the commit-graph in the \"test-helper read-graph\"\nsubcommand, but as the leak is annotated with `UNLEAK()` the leak\nsanitizer doesn't complain.\n\nFix the leak by calling `free_commit_graph()`. Besides getting rid of\nthe `UNLEAK()` annotation, it also increases code coverage because we\nproperly release resources as Git would do it, as well.\n\nSigned-off-by: Patrick Steinhardt <ps@pks.im>\n---\n t/helper/test-read-graph.c | 3 +--\n 1 file changed, 1 insertion(+), 2 deletions(-)\n\ndiff --git a/t/helper/test-read-graph.c b/t/helper/test-read-graph.c\nindex 9018c9f54122833eaf9dde52ced06e354e1919ef..811dde1cb3c8809352f79428a589c2158fc62545 100644\n--- a/t/helper/test-read-graph.c\n+++ b/t/helper/test-read-graph.c\n@@ -97,7 +97,6 @@ int cmd__read_graph(int argc, const char **argv)\n \t}\n \n done:\n-\tUNLEAK(graph);\n-\n+\tfree_commit_graph(graph);\n \treturn ret;\n }\n\n-- \n2.47.0.229.g8f8d6eee53.dirty\n\n"},{"id":"507007","messageId":"20241111-b4-pks-leak-fixes-pt10-v2-21-6154bf91f0b0@pks.im","threadId":"62477","inReplyTo":"20241111-b4-pks-leak-fixes-pt10-v2-0-6154bf91f0b0@pks.im","subject":"[PATCH v2 21/27] global: drop `UNLEAK()` annotation","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-11T10:38:50Z","receivedAt":"2024-11-11T10:39:06Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"There are two users of `UNLEAK()` left in our codebase:\n\n  - In \"builtin/clone.c\", annotating the `repo` variable. That leak has\n    already been fixed though as you can see in the context, where we do\n    know to free `repo_to_free`.\n\n  - In \"builtin/diff.c\", to unleak entries of the `blob[]` array. That\n    leak has also been fixed, because the entries we assign to that\n    array come from `rev.pending.objects`, and we do eventually release\n    `rev`.\n\nThis neatly demonstrates one of the issues with `UNLEAK()`: it is quite\neasy for the annotation to become stale. A second issue is that its\nwhole intent is to paper over leaks. And while that has been a necessary\nevil in the past, because Git was leaking left and right, it isn't\nreally much of an issue nowadays where our test suite has no known leaks\nanymore.\n\nRemove the last two users of this macro.\n\nSigned-off-by: Patrick Steinhardt <ps@pks.im>\n---\n builtin/clone.c | 1 -\n builtin/diff.c  | 1 -\n 2 files changed, 2 deletions(-)\n\ndiff --git a/builtin/clone.c b/builtin/clone.c\nindex 59fcb317a68a77eee3ca96a60720c556e044c369..e851b1475d7be8f0af78c27d4ef15467a2769a74 100644\n--- a/builtin/clone.c\n+++ b/builtin/clone.c\n@@ -1586,7 +1586,6 @@ int cmd_clone(int argc,\n \tfree(dir);\n \tfree(path);\n \tfree(repo_to_free);\n-\tUNLEAK(repo);\n \tjunk_mode = JUNK_LEAVE_ALL;\n \n \ttransport_ls_refs_options_release(&transport_ls_refs_options);\ndiff --git a/builtin/diff.c b/builtin/diff.c\nindex dca52d4221ed19d27950bee9022ae7efb1d2f17a..2fe92f373e9991489fcaeeba381bbfe017a5316a 100644\n--- a/builtin/diff.c\n+++ b/builtin/diff.c\n@@ -628,6 +628,5 @@ int cmd_diff(int argc,\n \trelease_revisions(&rev);\n \tobject_array_clear(&ent);\n \tsymdiff_release(&sdiff);\n-\tUNLEAK(blob);\n \treturn result;\n }\n\n-- \n2.47.0.229.g8f8d6eee53.dirty\n\n"},{"id":"507008","messageId":"20241111-b4-pks-leak-fixes-pt10-v2-22-6154bf91f0b0@pks.im","threadId":"62477","inReplyTo":"20241111-b4-pks-leak-fixes-pt10-v2-0-6154bf91f0b0@pks.im","subject":"[PATCH v2 22/27] git-compat-util: drop now-unused `UNLEAK()` macro","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-11T10:38:51Z","receivedAt":"2024-11-11T10:39:07Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"The `UNLEAK()` macro has been introduced with 0e5bba53af (add UNLEAK\nannotation for reducing leak false positives, 2017-09-08) to help us\nreduce the amount of reported memory leaks in cases we don't care about,\ne.g. when exiting immediately afterwards. We have since removed all of\nits users in favor of freeing the memory and thus don't need the macro\nanymore.\n\nRemove it.\n\nSigned-off-by: Patrick Steinhardt <ps@pks.im>\n---\n git-compat-util.h | 20 --------------------\n usage.c           | 15 ---------------\n 2 files changed, 35 deletions(-)\n\ndiff --git a/git-compat-util.h b/git-compat-util.h\nindex e4a306dd5639b58a4ec4d2a6269fb649348fb4e7..a06d4f3809e5664863d4d0f312c88b3e1364ee74 100644\n--- a/git-compat-util.h\n+++ b/git-compat-util.h\n@@ -1527,26 +1527,6 @@ int cmd_main(int, const char **);\n int common_exit(const char *file, int line, int code);\n #define exit(code) exit(common_exit(__FILE__, __LINE__, (code)))\n \n-/*\n- * You can mark a stack variable with UNLEAK(var) to avoid it being\n- * reported as a leak by tools like LSAN or valgrind. The argument\n- * should generally be the variable itself (not its address and not what\n- * it points to). It's safe to use this on pointers which may already\n- * have been freed, or on pointers which may still be in use.\n- *\n- * Use this _only_ for a variable that leaks by going out of scope at\n- * program exit (so only from cmd_* functions or their direct helpers).\n- * Normal functions, especially those which may be called multiple\n- * times, should actually free their memory. This is only meant as\n- * an annotation, and does nothing in non-leak-checking builds.\n- */\n-#ifdef SUPPRESS_ANNOTATED_LEAKS\n-void unleak_memory(const void *ptr, size_t len);\n-#define UNLEAK(var) unleak_memory(&(var), sizeof(var))\n-#else\n-#define UNLEAK(var) do {} while (0)\n-#endif\n-\n #define z_const\n #include <zlib.h>\n \ndiff --git a/usage.c b/usage.c\nindex 7a2f7805f57737fa3d9e653ff6c9345719dc79b8..29a9725784a42ed11363b4c41c7a105c0b13f64a 100644\n--- a/usage.c\n+++ b/usage.c\n@@ -350,18 +350,3 @@ void bug_fl(const char *file, int line, const char *fmt, ...)\n \ttrace2_cmd_error_va(fmt, ap);\n \tva_end(ap);\n }\n-\n-#ifdef SUPPRESS_ANNOTATED_LEAKS\n-void unleak_memory(const void *ptr, size_t len)\n-{\n-\tstatic struct suppressed_leak_root {\n-\t\tstruct suppressed_leak_root *next;\n-\t\tchar data[FLEX_ARRAY];\n-\t} *suppressed_leaks;\n-\tstruct suppressed_leak_root *root;\n-\n-\tFLEX_ALLOC_MEM(root, data, ptr, len);\n-\troot->next = suppressed_leaks;\n-\tsuppressed_leaks = root;\n-}\n-#endif\n\n-- \n2.47.0.229.g8f8d6eee53.dirty\n\n"},{"id":"507009","messageId":"20241111-b4-pks-leak-fixes-pt10-v2-23-6154bf91f0b0@pks.im","threadId":"62477","inReplyTo":"20241111-b4-pks-leak-fixes-pt10-v2-0-6154bf91f0b0@pks.im","subject":"[PATCH v2 23/27] t5601: work around leak sanitizer issue","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-11T10:38:52Z","receivedAt":"2024-11-11T10:39:08Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"When running t5601 with the leak checker enabled we can see a hang in\nour CI systems. This hang seems to be system-specific, as I cannot\nreproduce it on my own machine.\n\nAs it turns out, the issue is in those testcases that exercise cloning\nof `~repo`-style paths. All of the testcases that hang eventually end up\ninterpreting \"repo\" as the username and will call getpwnam(3p) with that\nusername. That should of course be fine, and getpwnam(3p) should just\nreturn an error. But instead, the leak sanitizer seems to be recursing\nwhile handling a call to `free()` in the NSS modules:\n\n    #0  0x00007ffff7fd98d5 in _dl_update_slotinfo (req_modid=1, new_gen=2) at ../elf/dl-tls.c:720\n    #1  0x00007ffff7fd9ac4 in update_get_addr (ti=0x7ffff7a91d80, gen=<optimized out>) at ../elf/dl-tls.c:916\n    #2  0x00007ffff7fdc85c in __tls_get_addr () at ../sysdeps/x86_64/tls_get_addr.S:55\n    #3  0x00007ffff7a27e04 in __lsan::GetAllocatorCache () at ../../../../src/libsanitizer/lsan/lsan_linux.cpp:27\n    #4  0x00007ffff7a2b33a in __lsan::Deallocate (p=0x0) at ../../../../src/libsanitizer/lsan/lsan_allocator.cpp:127\n    #5  __lsan::lsan_free (p=0x0) at ../../../../src/libsanitizer/lsan/lsan_allocator.cpp:220\n    ...\n    #261505 0x00007ffff7fd99f2 in free (ptr=<optimized out>) at ../include/rtld-malloc.h:50\n    #261506 _dl_update_slotinfo (req_modid=1, new_gen=2) at ../elf/dl-tls.c:822\n    #261507 0x00007ffff7fd9ac4 in update_get_addr (ti=0x7ffff7a91d80, gen=<optimized out>) at ../elf/dl-tls.c:916\n    #261508 0x00007ffff7fdc85c in __tls_get_addr () at ../sysdeps/x86_64/tls_get_addr.S:55\n    #261509 0x00007ffff7a27e04 in __lsan::GetAllocatorCache () at ../../../../src/libsanitizer/lsan/lsan_linux.cpp:27\n    #261510 0x00007ffff7a2b33a in __lsan::Deallocate (p=0x5020000001e0) at ../../../../src/libsanitizer/lsan/lsan_allocator.cpp:127\n    #261511 __lsan::lsan_free (p=0x5020000001e0) at ../../../../src/libsanitizer/lsan/lsan_allocator.cpp:220\n    #261512 0x00007ffff793da25 in module_load (module=0x515000000280) at ./nss/nss_module.c:188\n    #261513 0x00007ffff793dee5 in __nss_module_load (module=0x515000000280) at ./nss/nss_module.c:302\n    #261514 __nss_module_get_function (module=0x515000000280, name=name@entry=0x7ffff79b9128 \"getpwnam_r\") at ./nss/nss_module.c:328\n    #261515 0x00007ffff793e741 in __GI___nss_lookup_function (fct_name=<optimized out>, ni=<optimized out>) at ./nss/nsswitch.c:137\n    #261516 __GI___nss_next2 (ni=ni@entry=0x7fffffffa458, fct_name=fct_name@entry=0x7ffff79b9128 \"getpwnam_r\", fct2_name=fct2_name@entry=0x0, fctp=fctp@entry=0x7fffffffa460,\n        status=status@entry=0, all_values=all_values@entry=0) at ./nss/nsswitch.c:120\n    #261517 0x00007ffff794c6a7 in __getpwnam_r (name=name@entry=0x501000000060 \"repo\", resbuf=resbuf@entry=0x7ffff79fb320 <resbuf>, buffer=<optimized out>,\n        buflen=buflen@entry=1024, result=result@entry=0x7fffffffa4b0) at ../nss/getXXbyYY_r.c:343\n    #261518 0x00007ffff794c4d8 in getpwnam (name=0x501000000060 \"repo\") at ../nss/getXXbyYY.c:140\n    #261519 0x00005555557e37ff in getpw_str (username=0x5020000001a1 \"repo\", len=4) at path.c:613\n    #261520 0x00005555557e3937 in interpolate_path (path=0x5020000001a0 \"~repo\", real_home=0) at path.c:654\n    #261521 0x00005555557e3aea in enter_repo (path=0x501000000040 \"~repo\", strict=0) at path.c:718\n    #261522 0x000055555568f0ba in cmd_upload_pack (argc=1, argv=0x502000000100, prefix=0x0, repo=0x0) at builtin/upload-pack.c:57\n    #261523 0x0000555555575ba8 in run_builtin (p=0x555555a20c98 <commands+3192>, argc=2, argv=0x502000000100, repo=0x555555a53b20 <the_repo>) at git.c:481\n    #261524 0x0000555555576067 in handle_builtin (args=0x7fffffffaab0) at git.c:742\n    #261525 0x000055555557678d in cmd_main (argc=2, argv=0x7fffffffac58) at git.c:912\n    #261526 0x00005555556963cd in main (argc=2, argv=0x7fffffffac58) at common-main.c:64\n\nNote that this stack is more than 260000 function calls deep. Run under\nthe debugger this will eventually segfault, but in our CI systems it\nseems like this just hangs forever.\n\nI assume that this is a bug either in the leak sanitizer or in glibc, as\nI cannot reproduce it on my machine. In any case, let's work around the\nbug for now by marking those tests with the \"!SANITIZE_LEAK\" prereq.\n\nSigned-off-by: Patrick Steinhardt <ps@pks.im>\n---\n t/t5601-clone.sh | 26 +++++++++++++++-----------\n 1 file changed, 15 insertions(+), 11 deletions(-)\n\ndiff --git a/t/t5601-clone.sh b/t/t5601-clone.sh\nindex 9fe665eadfb685f2cc9937a1dd5ec005a0d50fb7..d0c18660e33113e64a293c695239a1c1a7975add 100755\n--- a/t/t5601-clone.sh\n+++ b/t/t5601-clone.sh\n@@ -544,12 +544,16 @@ do\n \t\ttest_clone_url [::1]:$repo ::1 \"$repo\"\n \t'\n done\n-#home directory\n-test_expect_success \"clone host:/~repo\" '\n+\n+# Home directory. All tests that use \"~repo\" are broken in our CI job when the\n+# leak sanitizer is enabled. It seems like either a bug in the sanitizer or in\n+# glibc, but when executing getpwnam(3p) with an invalid username we eventually\n+# start recursing in a call to free(3p), until bust the stack and segfault.\n+test_expect_success !SANITIZE_LEAK \"clone host:/~repo\" '\n \ttest_clone_url host:/~repo host \"~repo\"\n '\n \n-test_expect_$expectation_for_ipv6_tests \"clone [::1]:/~repo\" '\n+test_expect_$expectation_for_ipv6_tests !SANITIZE_LEAK \"clone [::1]:/~repo\" '\n \ttest_clone_url [::1]:/~repo ::1 \"~repo\"\n '\n \n@@ -569,9 +573,9 @@ do\n \t\ttest_clone_url \"ssh://host.xz$tcol/home/user/repo\" host.xz /home/user/repo\n \t'\n \t# from home directory\n-\ttest_expect_success \"clone ssh://host.xz$tcol/~repo\" '\n-\ttest_clone_url \"ssh://host.xz$tcol/~repo\" host.xz \"~repo\"\n-'\n+\ttest_expect_success !SANITIZE_LEAK \"clone ssh://host.xz$tcol/~repo\" '\n+\t\ttest_clone_url \"ssh://host.xz$tcol/~repo\" host.xz \"~repo\"\n+\t'\n done\n \n # with port number\n@@ -580,7 +584,7 @@ test_expect_success 'clone ssh://host.xz:22/home/user/repo' '\n '\n \n # from home directory with port number\n-test_expect_success 'clone ssh://host.xz:22/~repo' '\n+test_expect_success !SANITIZE_LEAK 'clone ssh://host.xz:22/~repo' '\n \ttest_clone_url \"ssh://host.xz:22/~repo\" \"-p 22 host.xz\" \"~repo\"\n '\n \n@@ -597,8 +601,8 @@ done\n for tuah in ::1 [::1] user@::1 user@[::1] [user@::1]\n do\n \teuah=$(echo $tuah | tr -d \"[]\")\n-\ttest_expect_success \"clone ssh://$tuah/~repo\" \"\n-\t  test_clone_url ssh://$tuah/~repo $euah '~repo'\n+\ttest_expect_success !SANITIZE_LEAK \"clone ssh://$tuah/~repo\" \"\n+\t\ttest_clone_url ssh://$tuah/~repo $euah '~repo'\n \t\"\n done\n \n@@ -615,8 +619,8 @@ done\n for tuah in [::1] user@[::1] [user@::1]\n do\n \teuah=$(echo $tuah | tr -d \"[]\")\n-\ttest_expect_success \"clone ssh://$tuah:22/~repo\" \"\n-\t  test_clone_url ssh://$tuah:22/~repo '-p 22' $euah '~repo'\n+\ttest_expect_success !SANITIZE_LEAK \"clone ssh://$tuah:22/~repo\" \"\n+\t\t  test_clone_url ssh://$tuah:22/~repo '-p 22' $euah '~repo'\n \t\"\n done\n \n\n-- \n2.47.0.229.g8f8d6eee53.dirty\n\n"},{"id":"507010","messageId":"20241111-b4-pks-leak-fixes-pt10-v2-24-6154bf91f0b0@pks.im","threadId":"62477","inReplyTo":"20241111-b4-pks-leak-fixes-pt10-v2-0-6154bf91f0b0@pks.im","subject":"[PATCH v2 24/27] t: mark some tests as leak free","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-11T10:38:53Z","receivedAt":"2024-11-11T10:39:09Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"Both t5558 and t5601 are leak-free starting with 6dab49b9fb (bundle-uri:\nplug leak in unbundle_from_file(), 2024-10-10). Mark them accordingly.\n\nSigned-off-by: Patrick Steinhardt <ps@pks.im>\n---\n t/t5558-clone-bundle-uri.sh | 1 +\n t/t5601-clone.sh            | 1 +\n 2 files changed, 2 insertions(+)\n\ndiff --git a/t/t5558-clone-bundle-uri.sh b/t/t5558-clone-bundle-uri.sh\nindex 3816ed5058d90118b4cbc700d65e97aa9c9987c0..b488b505b928ab6e58258360364ba53bec704eca 100755\n--- a/t/t5558-clone-bundle-uri.sh\n+++ b/t/t5558-clone-bundle-uri.sh\n@@ -2,6 +2,7 @@\n \n test_description='test fetching bundles with --bundle-uri'\n \n+TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-bundle.sh\n \ndiff --git a/t/t5601-clone.sh b/t/t5601-clone.sh\nindex d0c18660e33113e64a293c695239a1c1a7975add..3b5285cfcf326fa02015d7a808b4312c62283487 100755\n--- a/t/t5601-clone.sh\n+++ b/t/t5601-clone.sh\n@@ -5,6 +5,7 @@ test_description=clone\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n+TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n X=\n\n-- \n2.47.0.229.g8f8d6eee53.dirty\n\n"},{"id":"507011","messageId":"20241111-b4-pks-leak-fixes-pt10-v2-25-6154bf91f0b0@pks.im","threadId":"62477","inReplyTo":"20241111-b4-pks-leak-fixes-pt10-v2-0-6154bf91f0b0@pks.im","subject":"[PATCH v2 25/27] t: remove unneeded !SANITIZE_LEAK prerequisites","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-11T10:38:54Z","receivedAt":"2024-11-11T10:39:09Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"We have a couple of !SANITIZE_LEAK prerequisites for tests that used to\nfail due to memory leaks. These have all been fixed by now, so let's\ndrop the prerequisite.\n\nSigned-off-by: Patrick Steinhardt <ps@pks.im>\n---\n t/t0095-bloom.sh          |  2 +-\n t/t2407-worktree-heads.sh | 16 ++++++++--------\n t/t4020-diff-external.sh  |  4 ++--\n 3 files changed, 11 insertions(+), 11 deletions(-)\n\ndiff --git a/t/t0095-bloom.sh b/t/t0095-bloom.sh\nindex c8d84ab6061a9de5fe26cd333fe8a7e504a5f963..08df74cacfc6910c51568705855dffa90b79d5be 100755\n--- a/t/t0095-bloom.sh\n+++ b/t/t0095-bloom.sh\n@@ -77,7 +77,7 @@ test_expect_success 'compute bloom key for test string 2' '\n \ttest_cmp expect actual\n '\n \n-test_expect_success !SANITIZE_LEAK 'get bloom filters for commit with no changes' '\n+test_expect_success 'get bloom filters for commit with no changes' '\n \tgit init &&\n \tgit commit --allow-empty -m \"c0\" &&\n \tcat >expect <<-\\EOF &&\ndiff --git a/t/t2407-worktree-heads.sh b/t/t2407-worktree-heads.sh\nindex f6835c91dcc49cfeb23881fe0ef7a96629bfb2e6..7750dc9265a90bdd8b0e3781accb13f00a23bb09 100755\n--- a/t/t2407-worktree-heads.sh\n+++ b/t/t2407-worktree-heads.sh\n@@ -49,7 +49,7 @@ test_expect_success 'refuse to overwrite: checked out in worktree' '\n \tdone\n '\n \n-test_expect_success !SANITIZE_LEAK 'refuse to overwrite: worktree in bisect' '\n+test_expect_success 'refuse to overwrite: worktree in bisect' '\n \ttest_when_finished git -C wt-4 bisect reset &&\n \n \t# Set up a bisect so HEAD no longer points to wt-4.\n@@ -61,7 +61,7 @@ test_expect_success !SANITIZE_LEAK 'refuse to overwrite: worktree in bisect' '\n \tgrep \"cannot force update the branch '\\''wt-4'\\'' used by worktree at.*wt-4\" err\n '\n \n-test_expect_success !SANITIZE_LEAK 'refuse to overwrite: worktree in rebase (apply)' '\n+test_expect_success 'refuse to overwrite: worktree in rebase (apply)' '\n \ttest_when_finished git -C wt-2 rebase --abort &&\n \n \t# This will fail part-way through due to a conflict.\n@@ -71,7 +71,7 @@ test_expect_success !SANITIZE_LEAK 'refuse to overwrite: worktree in rebase (app\n \tgrep \"cannot force update the branch '\\''wt-2'\\'' used by worktree at.*wt-2\" err\n '\n \n-test_expect_success !SANITIZE_LEAK 'refuse to overwrite: worktree in rebase (merge)' '\n+test_expect_success 'refuse to overwrite: worktree in rebase (merge)' '\n \ttest_when_finished git -C wt-2 rebase --abort &&\n \n \t# This will fail part-way through due to a conflict.\n@@ -81,7 +81,7 @@ test_expect_success !SANITIZE_LEAK 'refuse to overwrite: worktree in rebase (mer\n \tgrep \"cannot force update the branch '\\''wt-2'\\'' used by worktree at.*wt-2\" err\n '\n \n-test_expect_success !SANITIZE_LEAK 'refuse to overwrite: worktree in rebase with --update-refs' '\n+test_expect_success 'refuse to overwrite: worktree in rebase with --update-refs' '\n \ttest_when_finished git -C wt-3 rebase --abort &&\n \n \tgit branch -f can-be-updated wt-3 &&\n@@ -95,7 +95,7 @@ test_expect_success !SANITIZE_LEAK 'refuse to overwrite: worktree in rebase with\n \tdone\n '\n \n-test_expect_success !SANITIZE_LEAK 'refuse to fetch over ref: checked out' '\n+test_expect_success 'refuse to fetch over ref: checked out' '\n \ttest_must_fail git fetch server +refs/heads/wt-3:refs/heads/wt-3 2>err &&\n \tgrep \"refusing to fetch into branch '\\''refs/heads/wt-3'\\''\" err &&\n \n@@ -105,7 +105,7 @@ test_expect_success !SANITIZE_LEAK 'refuse to fetch over ref: checked out' '\n \tgrep \"refusing to fetch into branch\" err\n '\n \n-test_expect_success !SANITIZE_LEAK 'refuse to fetch over ref: worktree in bisect' '\n+test_expect_success 'refuse to fetch over ref: worktree in bisect' '\n \ttest_when_finished git -C wt-4 bisect reset &&\n \n \t# Set up a bisect so HEAD no longer points to wt-4.\n@@ -117,7 +117,7 @@ test_expect_success !SANITIZE_LEAK 'refuse to fetch over ref: worktree in bisect\n \tgrep \"refusing to fetch into branch\" err\n '\n \n-test_expect_success !SANITIZE_LEAK 'refuse to fetch over ref: worktree in rebase' '\n+test_expect_success 'refuse to fetch over ref: worktree in rebase' '\n \ttest_when_finished git -C wt-3 rebase --abort &&\n \n \t# This will fail part-way through due to a conflict.\n@@ -157,7 +157,7 @@ test_expect_success 'refuse to overwrite when in error states' '\n \n . \"$TEST_DIRECTORY\"/lib-rebase.sh\n \n-test_expect_success !SANITIZE_LEAK 'refuse to overwrite during rebase with --update-refs' '\n+test_expect_success 'refuse to overwrite during rebase with --update-refs' '\n \tgit commit --fixup HEAD~2 --allow-empty &&\n \t(\n \t\tset_cat_todo_editor &&\ndiff --git a/t/t4020-diff-external.sh b/t/t4020-diff-external.sh\nindex 3baa52a9bf653da9e45df720435cb23d0713e1db..0e5a05894fd1a1be1098b6895283452ca877137c 100755\n--- a/t/t4020-diff-external.sh\n+++ b/t/t4020-diff-external.sh\n@@ -102,7 +102,7 @@ test_expect_success 'diff attribute' '\n \ttest_cmp expect actual\n '\n \n-test_expect_success !SANITIZE_LEAK 'diff attribute should apply only to diff' '\n+test_expect_success 'diff attribute should apply only to diff' '\n \tgit log -p -1 HEAD >out &&\n \tgrep \"^diff --git a/file b/file\" out\n \n@@ -129,7 +129,7 @@ test_expect_success 'diff attribute' '\n \ttest_cmp expect actual\n '\n \n-test_expect_success !SANITIZE_LEAK 'diff attribute should apply only to diff' '\n+test_expect_success 'diff attribute should apply only to diff' '\n \tgit log -p -1 HEAD >out &&\n \tgrep \"^diff --git a/file b/file\" out\n \n\n-- \n2.47.0.229.g8f8d6eee53.dirty\n\n"},{"id":"507012","messageId":"20241111-b4-pks-leak-fixes-pt10-v2-26-6154bf91f0b0@pks.im","threadId":"62477","inReplyTo":"20241111-b4-pks-leak-fixes-pt10-v2-0-6154bf91f0b0@pks.im","subject":"[PATCH v2 26/27] test-lib: unconditionally enable leak checking","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-11T10:38:55Z","receivedAt":"2024-11-11T10:39:10Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"Over the last two releases we have plugged a couple hundred of memory\nleaks exposed by the Git test suite. With the preceding commits we have\nfinally fixed the last leak exposed by our test suite, which means that\nwe are now basically leak free wherever we have branch coverage.\n\nFrom hereon, the Git test suite should ideally stay free of memory\nleaks. Most importantly, any test suite that is being added should\nautomatically be subject to the leak checker, and if that test does not\npass it is a strong signal that the added code introduced new memory\nleaks and should not be accepted without further changes.\n\nDrop the infrastructure around TEST_PASSES_SANITIZE_LEAK to reflect this\nnew requirement. Like this, all test suites will be subject to the leak\nchecker by default.\n\nThis is being intentionally strict, but we still have an escape hatch:\nthe SANITIZE_LEAK prerequisite. There is one known case in t5601 where\nthe leak sanitizer itself is buggy, so adding this prereq in such cases\nis acceptable. Another acceptable situation is when a newly added test\nuncovers preexisting memory leaks: when fixing that memory leak would be\nsufficiently complicated it is fine to annotate and document the leak\naccordingly. But in any case, the burden is now on the patch author to\nexplain why exactly they have to add the SANITIZE_LEAK prerequisite.\n\nThe TEST_PASSES_SANITIZE_LEAK annotations will be dropped in the next\npatch.\n\nSigned-off-by: Patrick Steinhardt <ps@pks.im>\n---\n ci/lib.sh        |  1 -\n t/README         | 21 -----------------\n t/lib-git-svn.sh |  4 ----\n t/test-lib.sh    | 72 +-------------------------------------------------------\n 4 files changed, 1 insertion(+), 97 deletions(-)\n\ndiff --git a/ci/lib.sh b/ci/lib.sh\nindex 246072a0932621a64562d94f5a50a1ba880bd48b..930f98d7228166c37c236beb062b14675fb68ef3 100755\n--- a/ci/lib.sh\n+++ b/ci/lib.sh\n@@ -384,7 +384,6 @@ linux-musl)\n \t;;\n linux-leaks|linux-reftable-leaks)\n \texport SANITIZE=leak\n-\texport GIT_TEST_PASSING_SANITIZE_LEAK=true\n \t;;\n linux-asan-ubsan)\n \texport SANITIZE=address,undefined\ndiff --git a/t/README b/t/README\nindex 8c0319b58e5c8333a13f4d07a47519fa8f137709..e84824dc002932102d0021e96c80f70354d4994c 100644\n--- a/t/README\n+++ b/t/README\n@@ -368,27 +368,6 @@ excluded as so much relies on it, but this might change in the future.\n GIT_TEST_SPLIT_INDEX=<boolean> forces split-index mode on the whole\n test suite. Accept any boolean values that are accepted by git-config.\n \n-GIT_TEST_PASSING_SANITIZE_LEAK=true skips those tests that haven't\n-declared themselves as leak-free by setting\n-\"TEST_PASSES_SANITIZE_LEAK=true\" before sourcing \"test-lib.sh\". This\n-test mode is used by the \"linux-leaks\" CI target.\n-\n-GIT_TEST_PASSING_SANITIZE_LEAK=check checks that our\n-\"TEST_PASSES_SANITIZE_LEAK=true\" markings are current. Rather than\n-skipping those tests that haven't set \"TEST_PASSES_SANITIZE_LEAK=true\"\n-before sourcing \"test-lib.sh\" this mode runs them with\n-\"--invert-exit-code\". This is used to check that there's a one-to-one\n-mapping between \"TEST_PASSES_SANITIZE_LEAK=true\" and those tests that\n-pass under \"SANITIZE=leak\". This is especially useful when testing a\n-series that fixes various memory leaks with \"git rebase -x\".\n-\n-GIT_TEST_PASSING_SANITIZE_LEAK=check when combined with \"--immediate\"\n-will run to completion faster, and result in the same failing\n-tests.\n-\n-GIT_TEST_PASSING_SANITIZE_LEAK=check-failing behaves the same as \"check\",\n-but skips all tests which are already marked as leak-free.\n-\n GIT_TEST_PROTOCOL_VERSION=<n>, when set, makes 'protocol.version'\n default to n.\n \ndiff --git a/t/lib-git-svn.sh b/t/lib-git-svn.sh\nindex ea28971e8ee6abfcd3c0394c6d8b143c75ac12dd..2fde2353fd38356548fd40e4808984618b0d9585 100644\n--- a/t/lib-git-svn.sh\n+++ b/t/lib-git-svn.sh\n@@ -1,7 +1,3 @@\n-if test -z \"$TEST_FAILS_SANITIZE_LEAK\"\n-then\n-\tTEST_PASSES_SANITIZE_LEAK=true\n-fi\n . ./test-lib.sh\n \n if test -n \"$NO_SVN_TESTS\"\ndiff --git a/t/test-lib.sh b/t/test-lib.sh\nindex a278181a0568a2422ab1e7f007bc016b95a58e63..508b5fe1f550db690ba769c9c57f5ca8ce3d3102 100644\n--- a/t/test-lib.sh\n+++ b/t/test-lib.sh\n@@ -1227,23 +1227,7 @@ check_test_results_san_file_ () {\n \tfi &&\n \tsay_color error \"$(cat \"$TEST_RESULTS_SAN_FILE\".*)\" &&\n \n-\tif test -n \"$passes_sanitize_leak\" && test \"$test_failure\" = 0\n-\tthen\n-\t\tsay \"As TEST_PASSES_SANITIZE_LEAK=true and our logs show we're leaking, exit non-zero!\" &&\n-\t\tinvert_exit_code=t\n-\telif test -n \"$passes_sanitize_leak\"\n-\tthen\n-\t\tsay \"As TEST_PASSES_SANITIZE_LEAK=true and our logs show we're leaking, and we're failing for other reasons too...\" &&\n-\t\tinvert_exit_code=\n-\telif test -n \"$sanitize_leak_check\" && test \"$test_failure\" = 0\n-\tthen\n-\t\tsay \"As TEST_PASSES_SANITIZE_LEAK=true isn't set the above leak is 'ok' with GIT_TEST_PASSING_SANITIZE_LEAK=check\" &&\n-\t\tinvert_exit_code=\n-\telif test -n \"$sanitize_leak_check\"\n-\tthen\n-\t\tsay \"As TEST_PASSES_SANITIZE_LEAK=true isn't set the above leak is 'ok' with GIT_TEST_PASSING_SANITIZE_LEAK=check\" &&\n-\t\tinvert_exit_code=t\n-\telif test \"$test_failure\" = 0\n+\tif test \"$test_failure\" = 0\n \tthen\n \t\tsay \"Our logs revealed a memory leak, exit non-zero!\" &&\n \t\tinvert_exit_code=t\n@@ -1274,11 +1258,6 @@ test_done () {\n \t\tEOF\n \tfi\n \n-\tif test -z \"$passes_sanitize_leak\" && test_bool_env TEST_PASSES_SANITIZE_LEAK false\n-\tthen\n-\t\tBAIL_OUT \"Please, set TEST_PASSES_SANITIZE_LEAK before sourcing test-lib.sh\"\n-\tfi\n-\n \tif test \"$test_fixed\" != 0\n \tthen\n \t\tsay_color error \"# $test_fixed known breakage(s) vanished; please update test(s)\"\n@@ -1515,51 +1494,8 @@ then\n \ttest_done\n fi\n \n-BAIL_OUT_ENV_NEEDS_SANITIZE_LEAK () {\n-\tBAIL_OUT \"$1 has no effect except when compiled with SANITIZE=leak\"\n-}\n-\n if test -n \"$SANITIZE_LEAK\"\n then\n-\t# Normalize with test_bool_env\n-\tpasses_sanitize_leak=\n-\n-\t# We need to see TEST_PASSES_SANITIZE_LEAK in \"test-tool\n-\t# env-helper\" (via test_bool_env)\n-\texport TEST_PASSES_SANITIZE_LEAK\n-\tif test_bool_env TEST_PASSES_SANITIZE_LEAK false\n-\tthen\n-\t\tpasses_sanitize_leak=t\n-\tfi\n-\n-\tif test \"$GIT_TEST_PASSING_SANITIZE_LEAK\" = \"check\" ||\n-\t   test \"$GIT_TEST_PASSING_SANITIZE_LEAK\" = \"check-failing\"\n-\tthen\n-\t\tif test \"$GIT_TEST_PASSING_SANITIZE_LEAK\" = \"check-failing\" &&\n-\t\t   test -n \"$passes_sanitize_leak\"\n-\t\tthen\n-\t\t\tskip_all=\"skipping leak-free $this_test under GIT_TEST_PASSING_SANITIZE_LEAK=check-failing\"\n-\t\t\ttest_done\n-\t\tfi\n-\n-\t\tsanitize_leak_check=t\n-\t\tif test -n \"$invert_exit_code\"\n-\t\tthen\n-\t\t\tBAIL_OUT \"cannot use --invert-exit-code under GIT_TEST_PASSING_SANITIZE_LEAK=check\"\n-\t\tfi\n-\n-\t\tif test -z \"$passes_sanitize_leak\"\n-\t\tthen\n-\t\t\tsay \"in GIT_TEST_PASSING_SANITIZE_LEAK=check mode, setting --invert-exit-code for TEST_PASSES_SANITIZE_LEAK != true\"\n-\t\t\tinvert_exit_code=t\n-\t\tfi\n-\telif test -z \"$passes_sanitize_leak\" &&\n-\t     test_bool_env GIT_TEST_PASSING_SANITIZE_LEAK false\n-\tthen\n-\t\tskip_all=\"skipping $this_test under GIT_TEST_PASSING_SANITIZE_LEAK=true\"\n-\t\ttest_done\n-\tfi\n-\n \trm -rf \"$TEST_RESULTS_SAN_DIR\"\n \tif ! mkdir -p \"$TEST_RESULTS_SAN_DIR\"\n \tthen\n@@ -1574,12 +1510,6 @@ then\n \tprepend_var LSAN_OPTIONS : log_exe_name=1\n \tprepend_var LSAN_OPTIONS : log_path=\"'$TEST_RESULTS_SAN_FILE'\"\n \texport LSAN_OPTIONS\n-\n-elif test \"$GIT_TEST_PASSING_SANITIZE_LEAK\" = \"check\" ||\n-     test \"$GIT_TEST_PASSING_SANITIZE_LEAK\" = \"check-failing\" ||\n-     test_bool_env GIT_TEST_PASSING_SANITIZE_LEAK false\n-then\n-\tBAIL_OUT_ENV_NEEDS_SANITIZE_LEAK \"GIT_TEST_PASSING_SANITIZE_LEAK=true\"\n fi\n \n if test \"${GIT_TEST_CHAIN_LINT:-1}\" != 0 &&\n\n-- \n2.47.0.229.g8f8d6eee53.dirty\n\n"},{"id":"507013","messageId":"20241111-b4-pks-leak-fixes-pt10-v2-27-6154bf91f0b0@pks.im","threadId":"62477","inReplyTo":"20241111-b4-pks-leak-fixes-pt10-v2-0-6154bf91f0b0@pks.im","subject":"[PATCH v2 27/27] t: remove TEST_PASSES_SANITIZE_LEAK annotations","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-11T10:38:56Z","receivedAt":"2024-11-11T10:39:11Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"Now that the default value for TEST_PASSES_SANITIZE_LEAK is `true` there\nis no longer a need to have that variable declared in all of our tests.\nDrop it.\n\nSigned-off-by: Patrick Steinhardt <ps@pks.im>\n---\n t/t0001-init.sh                                    | 1 -\n t/t0002-gitfile.sh                                 | 1 -\n t/t0003-attributes.sh                              | 1 -\n t/t0004-unwritable.sh                              | 1 -\n t/t0005-signals.sh                                 | 1 -\n t/t0006-date.sh                                    | 1 -\n t/t0007-git-var.sh                                 | 1 -\n t/t0008-ignores.sh                                 | 1 -\n t/t0010-racy-git.sh                                | 1 -\n t/t0012-help.sh                                    | 1 -\n t/t0013-sha1dc.sh                                  | 1 -\n t/t0014-alias.sh                                   | 1 -\n t/t0017-env-helper.sh                              | 1 -\n t/t0018-advice.sh                                  | 1 -\n t/t0019-json-writer.sh                             | 1 -\n t/t0020-crlf.sh                                    | 1 -\n t/t0021-conversion.sh                              | 1 -\n t/t0022-crlf-rename.sh                             | 1 -\n t/t0023-crlf-am.sh                                 | 1 -\n t/t0024-crlf-archive.sh                            | 1 -\n t/t0025-crlf-renormalize.sh                        | 1 -\n t/t0026-eol-config.sh                              | 1 -\n t/t0027-auto-crlf.sh                               | 1 -\n t/t0028-working-tree-encoding.sh                   | 1 -\n t/t0029-core-unsetenvvars.sh                       | 1 -\n t/t0030-stripspace.sh                              | 1 -\n t/t0033-safe-directory.sh                          | 1 -\n t/t0035-safe-bare-repository.sh                    | 1 -\n t/t0040-parse-options.sh                           | 1 -\n t/t0041-usage.sh                                   | 1 -\n t/t0050-filesystem.sh                              | 1 -\n t/t0052-simple-ipc.sh                              | 1 -\n t/t0055-beyond-symlinks.sh                         | 1 -\n t/t0056-git-C.sh                                   | 1 -\n t/t0060-path-utils.sh                              | 1 -\n t/t0061-run-command.sh                             | 1 -\n t/t0062-revision-walking.sh                        | 1 -\n t/t0063-string-list.sh                             | 1 -\n t/t0066-dir-iterator.sh                            | 1 -\n t/t0067-parse_pathspec_file.sh                     | 1 -\n t/t0068-for-each-repo.sh                           | 1 -\n t/t0070-fundamental.sh                             | 1 -\n t/t0071-sort.sh                                    | 1 -\n t/t0080-unit-test-output.sh                        | 1 -\n t/t0081-find-pack.sh                               | 1 -\n t/t0090-cache-tree.sh                              | 1 -\n t/t0091-bugreport.sh                               | 1 -\n t/t0092-diagnose.sh                                | 1 -\n t/t0095-bloom.sh                                   | 1 -\n t/t0100-previous.sh                                | 1 -\n t/t0101-at-syntax.sh                               | 1 -\n t/t0200-gettext-basic.sh                           | 1 -\n t/t0201-gettext-fallbacks.sh                       | 1 -\n t/t0202-gettext-perl.sh                            | 1 -\n t/t0203-gettext-setlocale-sanity.sh                | 1 -\n t/t0204-gettext-reencode-sanity.sh                 | 1 -\n t/t0210-trace2-normal.sh                           | 1 -\n t/t0211-trace2-perf.sh                             | 1 -\n t/t0212-trace2-event.sh                            | 1 -\n t/t0300-credentials.sh                             | 1 -\n t/t0301-credential-cache.sh                        | 1 -\n t/t0302-credential-store.sh                        | 1 -\n t/t0303-credential-external.sh                     | 1 -\n t/t0410-partial-clone.sh                           | 1 -\n t/t0411-clone-from-partial.sh                      | 1 -\n t/t0450-txt-doc-vs-help.sh                         | 1 -\n t/t0500-progress-display.sh                        | 1 -\n t/t0600-reffiles-backend.sh                        | 1 -\n t/t0601-reffiles-pack-refs.sh                      | 1 -\n t/t0602-reffiles-fsck.sh                           | 1 -\n t/t0610-reftable-basics.sh                         | 1 -\n t/t0611-reftable-httpd.sh                          | 1 -\n t/t0612-reftable-jgit-compatibility.sh             | 1 -\n t/t0613-reftable-write-options.sh                  | 1 -\n t/t1000-read-tree-m-3way.sh                        | 1 -\n t/t1001-read-tree-m-2way.sh                        | 1 -\n t/t1002-read-tree-m-u-2way.sh                      | 1 -\n t/t1003-read-tree-prefix.sh                        | 1 -\n t/t1004-read-tree-m-u-wf.sh                        | 1 -\n t/t1005-read-tree-reset.sh                         | 1 -\n t/t1006-cat-file.sh                                | 1 -\n t/t1007-hash-object.sh                             | 1 -\n t/t1008-read-tree-overlay.sh                       | 1 -\n t/t1009-read-tree-new-index.sh                     | 1 -\n t/t1010-mktree.sh                                  | 1 -\n t/t1011-read-tree-sparse-checkout.sh               | 1 -\n t/t1012-read-tree-df.sh                            | 1 -\n t/t1013-read-tree-submodule.sh                     | 1 -\n t/t1014-read-tree-confusing.sh                     | 1 -\n t/t1015-read-index-unmerged.sh                     | 1 -\n t/t1016-compatObjectFormat.sh                      | 1 -\n t/t1020-subdirectory.sh                            | 1 -\n t/t1021-rerere-in-workdir.sh                       | 1 -\n t/t1022-read-tree-partial-clone.sh                 | 1 -\n t/t1050-large.sh                                   | 1 -\n t/t1051-large-conversion.sh                        | 1 -\n t/t1060-object-corruption.sh                       | 1 -\n t/t1090-sparse-checkout-scope.sh                   | 1 -\n t/t1091-sparse-checkout-builtin.sh                 | 1 -\n t/t1092-sparse-checkout-compatibility.sh           | 1 -\n t/t1100-commit-tree-options.sh                     | 1 -\n t/t1300-config.sh                                  | 1 -\n t/t1301-shared-repo.sh                             | 1 -\n t/t1302-repo-version.sh                            | 1 -\n t/t1303-wacky-config.sh                            | 1 -\n t/t1304-default-acl.sh                             | 1 -\n t/t1305-config-include.sh                          | 1 -\n t/t1306-xdg-files.sh                               | 1 -\n t/t1307-config-blob.sh                             | 1 -\n t/t1308-config-set.sh                              | 1 -\n t/t1309-early-config.sh                            | 1 -\n t/t1310-config-default.sh                          | 1 -\n t/t1350-config-hooks-path.sh                       | 1 -\n t/t1400-update-ref.sh                              | 1 -\n t/t1401-symbolic-ref.sh                            | 1 -\n t/t1402-check-ref-format.sh                        | 1 -\n t/t1403-show-ref.sh                                | 1 -\n t/t1404-update-ref-errors.sh                       | 1 -\n t/t1405-main-ref-store.sh                          | 1 -\n t/t1406-submodule-ref-store.sh                     | 1 -\n t/t1407-worktree-ref-store.sh                      | 1 -\n t/t1408-packed-refs.sh                             | 1 -\n t/t1409-avoid-packing-refs.sh                      | 1 -\n t/t1410-reflog.sh                                  | 1 -\n t/t1411-reflog-show.sh                             | 1 -\n t/t1412-reflog-loop.sh                             | 1 -\n t/t1413-reflog-detach.sh                           | 1 -\n t/t1414-reflog-walk.sh                             | 1 -\n t/t1415-worktree-refs.sh                           | 1 -\n t/t1416-ref-transaction-hooks.sh                   | 1 -\n t/t1417-reflog-updateref.sh                        | 1 -\n t/t1418-reflog-exists.sh                           | 1 -\n t/t1419-exclude-refs.sh                            | 1 -\n t/t1420-lost-found.sh                              | 1 -\n t/t1430-bad-ref-name.sh                            | 1 -\n t/t1450-fsck.sh                                    | 1 -\n t/t1451-fsck-buffer.sh                             | 1 -\n t/t1460-refs-migrate.sh                            | 1 -\n t/t1500-rev-parse.sh                               | 1 -\n t/t1501-work-tree.sh                               | 1 -\n t/t1502-rev-parse-parseopt.sh                      | 1 -\n t/t1503-rev-parse-verify.sh                        | 1 -\n t/t1504-ceiling-dirs.sh                            | 1 -\n t/t1505-rev-parse-last.sh                          | 1 -\n t/t1506-rev-parse-diagnosis.sh                     | 1 -\n t/t1507-rev-parse-upstream.sh                      | 1 -\n t/t1508-at-combinations.sh                         | 1 -\n t/t1510-repo-setup.sh                              | 1 -\n t/t1511-rev-parse-caret.sh                         | 1 -\n t/t1512-rev-parse-disambiguation.sh                | 1 -\n t/t1513-rev-parse-prefix.sh                        | 1 -\n t/t1514-rev-parse-push.sh                          | 1 -\n t/t1515-rev-parse-outside-repo.sh                  | 1 -\n t/t1517-outside-repo.sh                            | 1 -\n t/t1600-index.sh                                   | 1 -\n t/t1601-index-bogus.sh                             | 1 -\n t/t1700-split-index.sh                             | 1 -\n t/t1701-racy-split-index.sh                        | 1 -\n t/t1800-hook.sh                                    | 1 -\n t/t2000-conflict-when-checking-files-out.sh        | 1 -\n t/t2002-checkout-cache-u.sh                        | 1 -\n t/t2003-checkout-cache-mkdir.sh                    | 1 -\n t/t2004-checkout-cache-temp.sh                     | 1 -\n t/t2005-checkout-index-symlinks.sh                 | 1 -\n t/t2006-checkout-index-basic.sh                    | 1 -\n t/t2007-checkout-symlink.sh                        | 1 -\n t/t2008-checkout-subdir.sh                         | 1 -\n t/t2009-checkout-statinfo.sh                       | 1 -\n t/t2010-checkout-ambiguous.sh                      | 1 -\n t/t2011-checkout-invalid-head.sh                   | 1 -\n t/t2012-checkout-last.sh                           | 1 -\n t/t2013-checkout-submodule.sh                      | 1 -\n t/t2014-checkout-switch.sh                         | 1 -\n t/t2015-checkout-unborn.sh                         | 1 -\n t/t2016-checkout-patch.sh                          | 1 -\n t/t2017-checkout-orphan.sh                         | 1 -\n t/t2018-checkout-branch.sh                         | 1 -\n t/t2019-checkout-ambiguous-ref.sh                  | 1 -\n t/t2020-checkout-detach.sh                         | 1 -\n t/t2021-checkout-overwrite.sh                      | 1 -\n t/t2022-checkout-paths.sh                          | 1 -\n t/t2023-checkout-m.sh                              | 1 -\n t/t2024-checkout-dwim.sh                           | 1 -\n t/t2025-checkout-no-overlay.sh                     | 1 -\n t/t2026-checkout-pathspec-file.sh                  | 1 -\n t/t2027-checkout-track.sh                          | 1 -\n t/t2030-unresolve-info.sh                          | 1 -\n t/t2050-git-dir-relative.sh                        | 1 -\n t/t2060-switch.sh                                  | 1 -\n t/t2070-restore.sh                                 | 1 -\n t/t2071-restore-patch.sh                           | 1 -\n t/t2072-restore-pathspec-file.sh                   | 1 -\n t/t2080-parallel-checkout-basics.sh                | 1 -\n t/t2081-parallel-checkout-collisions.sh            | 1 -\n t/t2082-parallel-checkout-attributes.sh            | 1 -\n t/t2100-update-cache-badpath.sh                    | 1 -\n t/t2101-update-index-reupdate.sh                   | 1 -\n t/t2102-update-index-symlinks.sh                   | 1 -\n t/t2103-update-index-ignore-missing.sh             | 1 -\n t/t2104-update-index-skip-worktree.sh              | 1 -\n t/t2105-update-index-gitfile.sh                    | 1 -\n t/t2106-update-index-assume-unchanged.sh           | 1 -\n t/t2107-update-index-basic.sh                      | 1 -\n t/t2108-update-index-refresh-racy.sh               | 1 -\n t/t2200-add-update.sh                              | 1 -\n t/t2201-add-update-typechange.sh                   | 1 -\n t/t2202-add-addremove.sh                           | 1 -\n t/t2203-add-intent.sh                              | 1 -\n t/t2204-add-ignored.sh                             | 1 -\n t/t2205-add-worktree-config.sh                     | 1 -\n t/t2300-cd-to-toplevel.sh                          | 1 -\n t/t2400-worktree-add.sh                            | 1 -\n t/t2401-worktree-prune.sh                          | 1 -\n t/t2402-worktree-list.sh                           | 1 -\n t/t2403-worktree-move.sh                           | 1 -\n t/t2404-worktree-config.sh                         | 1 -\n t/t2405-worktree-submodule.sh                      | 1 -\n t/t2406-worktree-repair.sh                         | 1 -\n t/t2407-worktree-heads.sh                          | 1 -\n t/t2408-worktree-relative.sh                       | 1 -\n t/t2500-untracked-overwriting.sh                   | 1 -\n t/t2501-cwd-empty.sh                               | 1 -\n t/t3000-ls-files-others.sh                         | 1 -\n t/t3001-ls-files-others-exclude.sh                 | 1 -\n t/t3002-ls-files-dashpath.sh                       | 1 -\n t/t3003-ls-files-exclude.sh                        | 1 -\n t/t3004-ls-files-basic.sh                          | 1 -\n t/t3005-ls-files-relative.sh                       | 1 -\n t/t3006-ls-files-long.sh                           | 1 -\n t/t3007-ls-files-recurse-submodules.sh             | 1 -\n t/t3008-ls-files-lazy-init-name-hash.sh            | 1 -\n t/t3009-ls-files-others-nonsubmodule.sh            | 1 -\n t/t3010-ls-files-killed-modified.sh                | 1 -\n t/t3011-common-prefixes-and-directory-traversal.sh | 1 -\n t/t3012-ls-files-dedup.sh                          | 1 -\n t/t3013-ls-files-format.sh                         | 1 -\n t/t3020-ls-files-error-unmatch.sh                  | 1 -\n t/t3040-subprojects-basic.sh                       | 1 -\n t/t3050-subprojects-fetch.sh                       | 1 -\n t/t3060-ls-files-with-tree.sh                      | 1 -\n t/t3070-wildmatch.sh                               | 1 -\n t/t3100-ls-tree-restrict.sh                        | 1 -\n t/t3101-ls-tree-dirname.sh                         | 1 -\n t/t3102-ls-tree-wildcards.sh                       | 1 -\n t/t3103-ls-tree-misc.sh                            | 1 -\n t/t3104-ls-tree-format.sh                          | 1 -\n t/t3105-ls-tree-output.sh                          | 1 -\n t/t3200-branch.sh                                  | 1 -\n t/t3201-branch-contains.sh                         | 1 -\n t/t3202-show-branch.sh                             | 1 -\n t/t3203-branch-output.sh                           | 1 -\n t/t3204-branch-name-interpretation.sh              | 1 -\n t/t3205-branch-color.sh                            | 1 -\n t/t3206-range-diff.sh                              | 1 -\n t/t3207-branch-submodule.sh                        | 1 -\n t/t3211-peel-ref.sh                                | 1 -\n t/t3300-funny-names.sh                             | 1 -\n t/t3301-notes.sh                                   | 1 -\n t/t3302-notes-index-expensive.sh                   | 1 -\n t/t3303-notes-subtrees.sh                          | 1 -\n t/t3304-notes-mixed.sh                             | 1 -\n t/t3305-notes-fanout.sh                            | 1 -\n t/t3306-notes-prune.sh                             | 1 -\n t/t3307-notes-man.sh                               | 1 -\n t/t3308-notes-merge.sh                             | 1 -\n t/t3309-notes-merge-auto-resolve.sh                | 1 -\n t/t3310-notes-merge-manual-resolve.sh              | 1 -\n t/t3311-notes-merge-fanout.sh                      | 1 -\n t/t3320-notes-merge-worktrees.sh                   | 1 -\n t/t3321-notes-stripspace.sh                        | 1 -\n t/t3400-rebase.sh                                  | 1 -\n t/t3401-rebase-and-am-rename.sh                    | 1 -\n t/t3402-rebase-merge.sh                            | 1 -\n t/t3403-rebase-skip.sh                             | 1 -\n t/t3404-rebase-interactive.sh                      | 1 -\n t/t3405-rebase-malformed.sh                        | 1 -\n t/t3406-rebase-message.sh                          | 1 -\n t/t3407-rebase-abort.sh                            | 1 -\n t/t3408-rebase-multi-line.sh                       | 1 -\n t/t3409-rebase-environ.sh                          | 1 -\n t/t3412-rebase-root.sh                             | 1 -\n t/t3413-rebase-hook.sh                             | 1 -\n t/t3415-rebase-autosquash.sh                       | 1 -\n t/t3416-rebase-onto-threedots.sh                   | 1 -\n t/t3417-rebase-whitespace-fix.sh                   | 1 -\n t/t3418-rebase-continue.sh                         | 1 -\n t/t3419-rebase-patch-id.sh                         | 1 -\n t/t3420-rebase-autostash.sh                        | 1 -\n t/t3421-rebase-topology-linear.sh                  | 1 -\n t/t3422-rebase-incompatible-options.sh             | 1 -\n t/t3423-rebase-reword.sh                           | 1 -\n t/t3424-rebase-empty.sh                            | 1 -\n t/t3425-rebase-topology-merges.sh                  | 1 -\n t/t3426-rebase-submodule.sh                        | 1 -\n t/t3427-rebase-subtree.sh                          | 1 -\n t/t3428-rebase-signoff.sh                          | 1 -\n t/t3429-rebase-edit-todo.sh                        | 1 -\n t/t3430-rebase-merges.sh                           | 1 -\n t/t3431-rebase-fork-point.sh                       | 1 -\n t/t3432-rebase-fast-forward.sh                     | 1 -\n t/t3433-rebase-across-mode-change.sh               | 1 -\n t/t3434-rebase-i18n.sh                             | 1 -\n t/t3435-rebase-gpg-sign.sh                         | 1 -\n t/t3436-rebase-more-options.sh                     | 1 -\n t/t3437-rebase-fixup-options.sh                    | 1 -\n t/t3438-rebase-broken-files.sh                     | 1 -\n t/t3500-cherry.sh                                  | 1 -\n t/t3501-revert-cherry-pick.sh                      | 1 -\n t/t3502-cherry-pick-merge.sh                       | 1 -\n t/t3503-cherry-pick-root.sh                        | 1 -\n t/t3504-cherry-pick-rerere.sh                      | 1 -\n t/t3505-cherry-pick-empty.sh                       | 1 -\n t/t3506-cherry-pick-ff.sh                          | 1 -\n t/t3507-cherry-pick-conflict.sh                    | 1 -\n t/t3508-cherry-pick-many-commits.sh                | 1 -\n t/t3509-cherry-pick-merge-df.sh                    | 1 -\n t/t3510-cherry-pick-sequence.sh                    | 1 -\n t/t3511-cherry-pick-x.sh                           | 1 -\n t/t3512-cherry-pick-submodule.sh                   | 1 -\n t/t3513-revert-submodule.sh                        | 1 -\n t/t3514-cherry-pick-revert-gpg.sh                  | 1 -\n t/t3600-rm.sh                                      | 1 -\n t/t3601-rm-pathspec-file.sh                        | 1 -\n t/t3602-rm-sparse-checkout.sh                      | 1 -\n t/t3650-replay-basics.sh                           | 1 -\n t/t3700-add.sh                                     | 1 -\n t/t3701-add-interactive.sh                         | 1 -\n t/t3702-add-edit.sh                                | 1 -\n t/t3703-add-magic-pathspec.sh                      | 1 -\n t/t3704-add-pathspec-file.sh                       | 1 -\n t/t3705-add-sparse-checkout.sh                     | 1 -\n t/t3800-mktag.sh                                   | 1 -\n t/t3900-i18n-commit.sh                             | 1 -\n t/t3901-i18n-patch.sh                              | 1 -\n t/t3902-quoted.sh                                  | 1 -\n t/t3903-stash.sh                                   | 1 -\n t/t3904-stash-patch.sh                             | 1 -\n t/t3905-stash-include-untracked.sh                 | 1 -\n t/t3906-stash-submodule.sh                         | 1 -\n t/t3907-stash-show-config.sh                       | 1 -\n t/t3908-stash-in-worktree.sh                       | 1 -\n t/t3909-stash-pathspec-file.sh                     | 1 -\n t/t3920-crlf-messages.sh                           | 1 -\n t/t4000-diff-format.sh                             | 1 -\n t/t4001-diff-rename.sh                             | 1 -\n t/t4002-diff-basic.sh                              | 1 -\n t/t4003-diff-rename-1.sh                           | 1 -\n t/t4004-diff-rename-symlink.sh                     | 1 -\n t/t4005-diff-rename-2.sh                           | 1 -\n t/t4006-diff-mode.sh                               | 1 -\n t/t4007-rename-3.sh                                | 1 -\n t/t4008-diff-break-rewrite.sh                      | 1 -\n t/t4009-diff-rename-4.sh                           | 1 -\n t/t4010-diff-pathspec.sh                           | 1 -\n t/t4011-diff-symlink.sh                            | 1 -\n t/t4012-diff-binary.sh                             | 1 -\n t/t4013-diff-various.sh                            | 1 -\n t/t4014-format-patch.sh                            | 1 -\n t/t4015-diff-whitespace.sh                         | 1 -\n t/t4016-diff-quote.sh                              | 1 -\n t/t4017-diff-retval.sh                             | 1 -\n t/t4018-diff-funcname.sh                           | 1 -\n t/t4019-diff-wserror.sh                            | 1 -\n t/t4020-diff-external.sh                           | 1 -\n t/t4021-format-patch-numbered.sh                   | 1 -\n t/t4022-diff-rewrite.sh                            | 1 -\n t/t4023-diff-rename-typechange.sh                  | 1 -\n t/t4024-diff-optimize-common.sh                    | 1 -\n t/t4025-hunk-header.sh                             | 1 -\n t/t4026-color.sh                                   | 1 -\n t/t4027-diff-submodule.sh                          | 1 -\n t/t4028-format-patch-mime-headers.sh               | 1 -\n t/t4029-diff-trailing-space.sh                     | 1 -\n t/t4030-diff-textconv.sh                           | 1 -\n t/t4031-diff-rewrite-binary.sh                     | 1 -\n t/t4032-diff-inter-hunk-context.sh                 | 1 -\n t/t4033-diff-patience.sh                           | 1 -\n t/t4034-diff-words.sh                              | 1 -\n t/t4035-diff-quiet.sh                              | 1 -\n t/t4036-format-patch-signer-mime.sh                | 1 -\n t/t4037-diff-r-t-dirs.sh                           | 1 -\n t/t4038-diff-combined.sh                           | 1 -\n t/t4039-diff-assume-unchanged.sh                   | 1 -\n t/t4040-whitespace-status.sh                       | 1 -\n t/t4041-diff-submodule-option.sh                   | 1 -\n t/t4042-diff-textconv-caching.sh                   | 1 -\n t/t4043-diff-rename-binary.sh                      | 1 -\n t/t4044-diff-index-unique-abbrev.sh                | 1 -\n t/t4045-diff-relative.sh                           | 1 -\n t/t4046-diff-unmerged.sh                           | 1 -\n t/t4047-diff-dirstat.sh                            | 1 -\n t/t4048-diff-combined-binary.sh                    | 1 -\n t/t4049-diff-stat-count.sh                         | 1 -\n t/t4050-diff-histogram.sh                          | 1 -\n t/t4051-diff-function-context.sh                   | 1 -\n t/t4052-stat-output.sh                             | 1 -\n t/t4053-diff-no-index.sh                           | 1 -\n t/t4054-diff-bogus-tree.sh                         | 1 -\n t/t4055-diff-context.sh                            | 1 -\n t/t4056-diff-order.sh                              | 1 -\n t/t4057-diff-combined-paths.sh                     | 1 -\n t/t4058-diff-duplicates.sh                         | 1 -\n t/t4059-diff-submodule-not-initialized.sh          | 1 -\n t/t4060-diff-submodule-option-diff-format.sh       | 1 -\n t/t4061-diff-indent.sh                             | 1 -\n t/t4062-diff-pickaxe.sh                            | 1 -\n t/t4063-diff-blobs.sh                              | 1 -\n t/t4064-diff-oidfind.sh                            | 1 -\n t/t4065-diff-anchored.sh                           | 1 -\n t/t4066-diff-emit-delay.sh                         | 1 -\n t/t4067-diff-partial-clone.sh                      | 1 -\n t/t4068-diff-symmetric-merge-base.sh               | 1 -\n t/t4069-remerge-diff.sh                            | 1 -\n t/t4100-apply-stat.sh                              | 1 -\n t/t4101-apply-nonl.sh                              | 1 -\n t/t4102-apply-rename.sh                            | 1 -\n t/t4103-apply-binary.sh                            | 1 -\n t/t4104-apply-boundary.sh                          | 1 -\n t/t4105-apply-fuzz.sh                              | 1 -\n t/t4106-apply-stdin.sh                             | 1 -\n t/t4107-apply-ignore-whitespace.sh                 | 1 -\n t/t4108-apply-threeway.sh                          | 1 -\n t/t4109-apply-multifrag.sh                         | 1 -\n t/t4110-apply-scan.sh                              | 1 -\n t/t4111-apply-subdir.sh                            | 1 -\n t/t4112-apply-renames.sh                           | 1 -\n t/t4113-apply-ending.sh                            | 1 -\n t/t4114-apply-typechange.sh                        | 1 -\n t/t4115-apply-symlink.sh                           | 1 -\n t/t4116-apply-reverse.sh                           | 1 -\n t/t4117-apply-reject.sh                            | 1 -\n t/t4118-apply-empty-context.sh                     | 1 -\n t/t4119-apply-config.sh                            | 1 -\n t/t4120-apply-popt.sh                              | 1 -\n t/t4121-apply-diffs.sh                             | 1 -\n t/t4122-apply-symlink-inside.sh                    | 1 -\n t/t4123-apply-shrink.sh                            | 1 -\n t/t4124-apply-ws-rule.sh                           | 1 -\n t/t4125-apply-ws-fuzz.sh                           | 1 -\n t/t4126-apply-empty.sh                             | 1 -\n t/t4127-apply-same-fn.sh                           | 1 -\n t/t4128-apply-root.sh                              | 1 -\n t/t4129-apply-samemode.sh                          | 1 -\n t/t4130-apply-criss-cross-rename.sh                | 1 -\n t/t4131-apply-fake-ancestor.sh                     | 1 -\n t/t4132-apply-removal.sh                           | 1 -\n t/t4133-apply-filenames.sh                         | 1 -\n t/t4134-apply-submodule.sh                         | 1 -\n t/t4135-apply-weird-filenames.sh                   | 1 -\n t/t4136-apply-check.sh                             | 1 -\n t/t4137-apply-submodule.sh                         | 1 -\n t/t4138-apply-ws-expansion.sh                      | 1 -\n t/t4139-apply-escape.sh                            | 1 -\n t/t4140-apply-ita.sh                               | 1 -\n t/t4141-apply-too-large.sh                         | 1 -\n t/t4150-am.sh                                      | 1 -\n t/t4151-am-abort.sh                                | 1 -\n t/t4152-am-subjects.sh                             | 1 -\n t/t4153-am-resume-override-opts.sh                 | 1 -\n t/t4200-rerere.sh                                  | 1 -\n t/t4201-shortlog.sh                                | 1 -\n t/t4202-log.sh                                     | 1 -\n t/t4203-mailmap.sh                                 | 1 -\n t/t4204-patch-id.sh                                | 1 -\n t/t4205-log-pretty-formats.sh                      | 1 -\n t/t4206-log-follow-harder-copies.sh                | 1 -\n t/t4207-log-decoration-colors.sh                   | 1 -\n t/t4208-log-magic-pathspec.sh                      | 1 -\n t/t4209-log-pickaxe.sh                             | 1 -\n t/t4210-log-i18n.sh                                | 1 -\n t/t4211-line-log.sh                                | 1 -\n t/t4212-log-corrupt.sh                             | 1 -\n t/t4213-log-tabexpand.sh                           | 1 -\n t/t4214-log-graph-octopus.sh                       | 1 -\n t/t4215-log-skewed-merges.sh                       | 1 -\n t/t4216-log-bloom.sh                               | 1 -\n t/t4217-log-limit.sh                               | 1 -\n t/t4252-am-options.sh                              | 1 -\n t/t4253-am-keep-cr-dos.sh                          | 1 -\n t/t4254-am-corrupt.sh                              | 1 -\n t/t4255-am-submodule.sh                            | 1 -\n t/t4256-am-format-flowed.sh                        | 1 -\n t/t4257-am-interactive.sh                          | 1 -\n t/t4258-am-quoted-cr.sh                            | 1 -\n t/t4300-merge-tree.sh                              | 1 -\n t/t4301-merge-tree-write-tree.sh                   | 1 -\n t/t5000-tar-tree.sh                                | 1 -\n t/t5001-archive-attr.sh                            | 1 -\n t/t5002-archive-attr-pattern.sh                    | 1 -\n t/t5003-archive-zip.sh                             | 1 -\n t/t5004-archive-corner-cases.sh                    | 1 -\n t/t5100-mailinfo.sh                                | 1 -\n t/t5150-request-pull.sh                            | 1 -\n t/t5200-update-server-info.sh                      | 1 -\n t/t5300-pack-object.sh                             | 1 -\n t/t5301-sliding-window.sh                          | 1 -\n t/t5302-pack-index.sh                              | 1 -\n t/t5303-pack-corruption-resilience.sh              | 1 -\n t/t5304-prune.sh                                   | 1 -\n t/t5305-include-tag.sh                             | 1 -\n t/t5306-pack-nobase.sh                             | 1 -\n t/t5307-pack-missing-commit.sh                     | 1 -\n t/t5308-pack-detect-duplicates.sh                  | 1 -\n t/t5309-pack-delta-cycles.sh                       | 1 -\n t/t5310-pack-bitmaps.sh                            | 1 -\n t/t5311-pack-bitmaps-shallow.sh                    | 1 -\n t/t5312-prune-corruption.sh                        | 1 -\n t/t5313-pack-bounds-checks.sh                      | 1 -\n t/t5314-pack-cycle-detection.sh                    | 1 -\n t/t5315-pack-objects-compression.sh                | 1 -\n t/t5316-pack-delta-depth.sh                        | 1 -\n t/t5317-pack-objects-filter-objects.sh             | 1 -\n t/t5318-commit-graph.sh                            | 1 -\n t/t5319-multi-pack-index.sh                        | 1 -\n t/t5320-delta-islands.sh                           | 1 -\n t/t5321-pack-large-objects.sh                      | 1 -\n t/t5322-pack-objects-sparse.sh                     | 1 -\n t/t5323-pack-redundant.sh                          | 1 -\n t/t5324-split-commit-graph.sh                      | 1 -\n t/t5325-reverse-index.sh                           | 1 -\n t/t5326-multi-pack-bitmaps.sh                      | 1 -\n t/t5327-multi-pack-bitmaps-rev.sh                  | 1 -\n t/t5328-commit-graph-64bit-time.sh                 | 1 -\n t/t5329-pack-objects-cruft.sh                      | 1 -\n t/t5330-no-lazy-fetch-with-commit-graph.sh         | 1 -\n t/t5331-pack-objects-stdin.sh                      | 1 -\n t/t5332-multi-pack-reuse.sh                        | 1 -\n t/t5333-pseudo-merge-bitmaps.sh                    | 1 -\n t/t5334-incremental-multi-pack-index.sh            | 1 -\n t/t5351-unpack-large-objects.sh                    | 1 -\n t/t5400-send-pack.sh                               | 1 -\n t/t5401-update-hooks.sh                            | 1 -\n t/t5402-post-merge-hook.sh                         | 1 -\n t/t5403-post-checkout-hook.sh                      | 1 -\n t/t5404-tracking-branches.sh                       | 1 -\n t/t5405-send-pack-rewind.sh                        | 1 -\n t/t5406-remote-rejects.sh                          | 1 -\n t/t5407-post-rewrite-hook.sh                       | 1 -\n t/t5408-send-pack-stdin.sh                         | 1 -\n t/t5409-colorize-remote-messages.sh                | 1 -\n t/t5410-receive-pack-alternates.sh                 | 1 -\n t/t5411-proc-receive-hook.sh                       | 1 -\n t/t5500-fetch-pack.sh                              | 1 -\n t/t5501-fetch-push-alternates.sh                   | 1 -\n t/t5502-quickfetch.sh                              | 1 -\n t/t5503-tagfollow.sh                               | 1 -\n t/t5504-fetch-receive-strict.sh                    | 1 -\n t/t5505-remote.sh                                  | 1 -\n t/t5506-remote-groups.sh                           | 1 -\n t/t5507-remote-environment.sh                      | 1 -\n t/t5509-fetch-push-namespaces.sh                   | 1 -\n t/t5510-fetch.sh                                   | 1 -\n t/t5511-refspec.sh                                 | 1 -\n t/t5512-ls-remote.sh                               | 1 -\n t/t5513-fetch-track.sh                             | 1 -\n t/t5514-fetch-multiple.sh                          | 1 -\n t/t5515-fetch-merge-logic.sh                       | 1 -\n t/t5516-fetch-push.sh                              | 1 -\n t/t5517-push-mirror.sh                             | 1 -\n t/t5518-fetch-exit-status.sh                       | 1 -\n t/t5519-push-alternates.sh                         | 1 -\n t/t5520-pull.sh                                    | 1 -\n t/t5521-pull-options.sh                            | 1 -\n t/t5522-pull-symlink.sh                            | 1 -\n t/t5523-push-upstream.sh                           | 1 -\n t/t5524-pull-msg.sh                                | 1 -\n t/t5525-fetch-tagopt.sh                            | 1 -\n t/t5526-fetch-submodules.sh                        | 1 -\n t/t5527-fetch-odd-refs.sh                          | 1 -\n t/t5528-push-default.sh                            | 1 -\n t/t5529-push-errors.sh                             | 1 -\n t/t5530-upload-pack-error.sh                       | 1 -\n t/t5531-deep-submodule-push.sh                     | 1 -\n t/t5532-fetch-proxy.sh                             | 1 -\n t/t5533-push-cas.sh                                | 1 -\n t/t5534-push-signed.sh                             | 1 -\n t/t5535-fetch-push-symref.sh                       | 1 -\n t/t5536-fetch-conflicts.sh                         | 1 -\n t/t5537-fetch-shallow.sh                           | 1 -\n t/t5538-push-shallow.sh                            | 1 -\n t/t5539-fetch-http-shallow.sh                      | 1 -\n t/t5540-http-push-webdav.sh                        | 1 -\n t/t5541-http-push-smart.sh                         | 1 -\n t/t5542-push-http-shallow.sh                       | 1 -\n t/t5543-atomic-push.sh                             | 1 -\n t/t5544-pack-objects-hook.sh                       | 1 -\n t/t5545-push-options.sh                            | 1 -\n t/t5546-receive-limits.sh                          | 1 -\n t/t5547-push-quarantine.sh                         | 1 -\n t/t5548-push-porcelain.sh                          | 1 -\n t/t5549-fetch-push-http.sh                         | 1 -\n t/t5550-http-fetch-dumb.sh                         | 1 -\n t/t5551-http-fetch-smart.sh                        | 1 -\n t/t5552-skipping-fetch-negotiator.sh               | 1 -\n t/t5553-set-upstream.sh                            | 1 -\n t/t5554-noop-fetch-negotiator.sh                   | 1 -\n t/t5555-http-smart-common.sh                       | 1 -\n t/t5557-http-get.sh                                | 1 -\n t/t5558-clone-bundle-uri.sh                        | 1 -\n t/t5560-http-backend-noserver.sh                   | 1 -\n t/t5561-http-backend.sh                            | 1 -\n t/t5562-http-backend-content-length.sh             | 1 -\n t/t5563-simple-http-auth.sh                        | 1 -\n t/t5564-http-proxy.sh                              | 1 -\n t/t5570-git-daemon.sh                              | 1 -\n t/t5571-pre-push-hook.sh                           | 1 -\n t/t5572-pull-submodule.sh                          | 1 -\n t/t5573-pull-verify-signatures.sh                  | 1 -\n t/t5574-fetch-output.sh                            | 1 -\n t/t5580-unc-paths.sh                               | 1 -\n t/t5581-http-curl-verbose.sh                       | 1 -\n t/t5582-fetch-negative-refspec.sh                  | 1 -\n t/t5583-push-branches.sh                           | 1 -\n t/t5600-clone-fail-cleanup.sh                      | 1 -\n t/t5601-clone.sh                                   | 1 -\n t/t5602-clone-remote-exec.sh                       | 1 -\n t/t5603-clone-dirname.sh                           | 1 -\n t/t5604-clone-reference.sh                         | 1 -\n t/t5605-clone-local.sh                             | 1 -\n t/t5606-clone-options.sh                           | 1 -\n t/t5607-clone-bundle.sh                            | 1 -\n t/t5609-clone-branch.sh                            | 1 -\n t/t5610-clone-detached.sh                          | 1 -\n t/t5611-clone-config.sh                            | 1 -\n t/t5612-clone-refspec.sh                           | 1 -\n t/t5613-info-alternate.sh                          | 1 -\n t/t5614-clone-submodules-shallow.sh                | 1 -\n t/t5615-alternate-env.sh                           | 1 -\n t/t5616-partial-clone.sh                           | 1 -\n t/t5617-clone-submodules-remote.sh                 | 1 -\n t/t5618-alternate-refs.sh                          | 1 -\n t/t5619-clone-local-ambiguous-transport.sh         | 1 -\n t/t5700-protocol-v1.sh                             | 1 -\n t/t5701-git-serve.sh                               | 1 -\n t/t5702-protocol-v2.sh                             | 1 -\n t/t5703-upload-pack-ref-in-want.sh                 | 1 -\n t/t5704-protocol-violations.sh                     | 1 -\n t/t5705-session-id-in-capabilities.sh              | 1 -\n t/t5730-protocol-v2-bundle-uri-file.sh             | 1 -\n t/t5731-protocol-v2-bundle-uri-git.sh              | 1 -\n t/t5732-protocol-v2-bundle-uri-http.sh             | 1 -\n t/t5750-bundle-uri-parse.sh                        | 1 -\n t/t5801-remote-helpers.sh                          | 1 -\n t/t5802-connect-helper.sh                          | 1 -\n t/t5810-proto-disable-local.sh                     | 1 -\n t/t5811-proto-disable-git.sh                       | 1 -\n t/t5812-proto-disable-http.sh                      | 1 -\n t/t5813-proto-disable-ssh.sh                       | 1 -\n t/t5814-proto-disable-ext.sh                       | 1 -\n t/t5815-submodule-protos.sh                        | 1 -\n t/t5900-repo-selection.sh                          | 1 -\n t/t6000-rev-list-misc.sh                           | 1 -\n t/t6001-rev-list-graft.sh                          | 1 -\n t/t6002-rev-list-bisect.sh                         | 1 -\n t/t6003-rev-list-topo-order.sh                     | 1 -\n t/t6004-rev-list-path-optim.sh                     | 1 -\n t/t6005-rev-list-count.sh                          | 1 -\n t/t6006-rev-list-format.sh                         | 1 -\n t/t6007-rev-list-cherry-pick-file.sh               | 1 -\n t/t6008-rev-list-submodule.sh                      | 1 -\n t/t6009-rev-list-parent.sh                         | 1 -\n t/t6010-merge-base.sh                              | 1 -\n t/t6011-rev-list-with-bad-commit.sh                | 1 -\n t/t6012-rev-list-simplify.sh                       | 1 -\n t/t6013-rev-list-reverse-parents.sh                | 1 -\n t/t6014-rev-list-all.sh                            | 1 -\n t/t6016-rev-list-graph-simplify-history.sh         | 1 -\n t/t6017-rev-list-stdin.sh                          | 1 -\n t/t6018-rev-list-glob.sh                           | 1 -\n t/t6019-rev-list-ancestry-path.sh                  | 1 -\n t/t6020-bundle-misc.sh                             | 1 -\n t/t6021-rev-list-exclude-hidden.sh                 | 1 -\n t/t6022-rev-list-missing.sh                        | 1 -\n t/t6030-bisect-porcelain.sh                        | 1 -\n t/t6040-tracking-info.sh                           | 1 -\n t/t6041-bisect-submodule.sh                        | 1 -\n t/t6050-replace.sh                                 | 1 -\n t/t6060-merge-index.sh                             | 1 -\n t/t6100-rev-list-in-order.sh                       | 1 -\n t/t6101-rev-parse-parents.sh                       | 1 -\n t/t6102-rev-list-unexpected-objects.sh             | 1 -\n t/t6110-rev-list-sparse.sh                         | 1 -\n t/t6111-rev-list-treesame.sh                       | 1 -\n t/t6112-rev-list-filters-objects.sh                | 1 -\n t/t6113-rev-list-bitmap-filters.sh                 | 1 -\n t/t6114-keep-packs.sh                              | 1 -\n t/t6115-rev-list-du.sh                             | 1 -\n t/t6120-describe.sh                                | 1 -\n t/t6130-pathspec-noglob.sh                         | 1 -\n t/t6131-pathspec-icase.sh                          | 1 -\n t/t6132-pathspec-exclude.sh                        | 1 -\n t/t6133-pathspec-rev-dwim.sh                       | 1 -\n t/t6134-pathspec-in-submodule.sh                   | 1 -\n t/t6135-pathspec-with-attrs.sh                     | 1 -\n t/t6136-pathspec-in-bare.sh                        | 1 -\n t/t6200-fmt-merge-msg.sh                           | 1 -\n t/t6300-for-each-ref.sh                            | 1 -\n t/t6301-for-each-ref-errors.sh                     | 1 -\n t/t6302-for-each-ref-filter.sh                     | 1 -\n t/t6400-merge-df.sh                                | 1 -\n t/t6401-merge-criss-cross.sh                       | 1 -\n t/t6402-merge-rename.sh                            | 1 -\n t/t6403-merge-file.sh                              | 1 -\n t/t6404-recursive-merge.sh                         | 1 -\n t/t6405-merge-symlinks.sh                          | 1 -\n t/t6406-merge-attr.sh                              | 1 -\n t/t6407-merge-binary.sh                            | 1 -\n t/t6408-merge-up-to-date.sh                        | 1 -\n t/t6409-merge-subtree.sh                           | 1 -\n t/t6411-merge-filemode.sh                          | 1 -\n t/t6412-merge-large-rename.sh                      | 1 -\n t/t6413-merge-crlf.sh                              | 1 -\n t/t6414-merge-rename-nocruft.sh                    | 1 -\n t/t6415-merge-dir-to-symlink.sh                    | 1 -\n t/t6416-recursive-corner-cases.sh                  | 1 -\n t/t6417-merge-ours-theirs.sh                       | 1 -\n t/t6418-merge-text-auto.sh                         | 1 -\n t/t6421-merge-partial-clone.sh                     | 1 -\n t/t6422-merge-rename-corner-cases.sh               | 1 -\n t/t6423-merge-rename-directories.sh                | 1 -\n t/t6424-merge-unrelated-index-changes.sh           | 1 -\n t/t6425-merge-rename-delete.sh                     | 1 -\n t/t6426-merge-skip-unneeded-updates.sh             | 1 -\n t/t6427-diff3-conflict-markers.sh                  | 1 -\n t/t6428-merge-conflicts-sparse.sh                  | 1 -\n t/t6429-merge-sequence-rename-caching.sh           | 1 -\n t/t6430-merge-recursive.sh                         | 1 -\n t/t6431-merge-criscross.sh                         | 1 -\n t/t6432-merge-recursive-space-options.sh           | 1 -\n t/t6433-merge-toplevel.sh                          | 1 -\n t/t6434-merge-recursive-rename-options.sh          | 1 -\n t/t6435-merge-sparse.sh                            | 1 -\n t/t6436-merge-overwrite.sh                         | 1 -\n t/t6437-submodule-merge.sh                         | 1 -\n t/t6438-submodule-directory-file-conflicts.sh      | 1 -\n t/t6439-merge-co-error-msgs.sh                     | 1 -\n t/t6500-gc.sh                                      | 1 -\n t/t6501-freshen-objects.sh                         | 1 -\n t/t6600-test-reach.sh                              | 1 -\n t/t6700-tree-depth.sh                              | 1 -\n t/t7001-mv.sh                                      | 1 -\n t/t7002-mv-sparse-checkout.sh                      | 1 -\n t/t7003-filter-branch.sh                           | 1 -\n t/t7004-tag.sh                                     | 1 -\n t/t7005-editor.sh                                  | 1 -\n t/t7006-pager.sh                                   | 1 -\n t/t7007-show.sh                                    | 1 -\n t/t7008-filter-branch-null-sha1.sh                 | 1 -\n t/t7010-setup.sh                                   | 1 -\n t/t7011-skip-worktree-reading.sh                   | 1 -\n t/t7012-skip-worktree-writing.sh                   | 1 -\n t/t7030-verify-tag.sh                              | 1 -\n t/t7031-verify-tag-signed-ssh.sh                   | 1 -\n t/t7060-wtstatus.sh                                | 1 -\n t/t7061-wtstatus-ignore.sh                         | 1 -\n t/t7062-wtstatus-ignorecase.sh                     | 1 -\n t/t7063-status-untracked-cache.sh                  | 1 -\n t/t7064-wtstatus-pv2.sh                            | 1 -\n t/t7101-reset-empty-subdirs.sh                     | 1 -\n t/t7102-reset.sh                                   | 1 -\n t/t7103-reset-bare.sh                              | 1 -\n t/t7104-reset-hard.sh                              | 1 -\n t/t7105-reset-patch.sh                             | 1 -\n t/t7106-reset-unborn-branch.sh                     | 1 -\n t/t7107-reset-pathspec-file.sh                     | 1 -\n t/t7110-reset-merge.sh                             | 1 -\n t/t7111-reset-table.sh                             | 1 -\n t/t7112-reset-submodule.sh                         | 1 -\n t/t7113-post-index-change-hook.sh                  | 1 -\n t/t7201-co.sh                                      | 1 -\n t/t7300-clean.sh                                   | 1 -\n t/t7301-clean-interactive.sh                       | 1 -\n t/t7400-submodule-basic.sh                         | 1 -\n t/t7401-submodule-summary.sh                       | 1 -\n t/t7402-submodule-rebase.sh                        | 1 -\n t/t7403-submodule-sync.sh                          | 1 -\n t/t7406-submodule-update.sh                        | 1 -\n t/t7407-submodule-foreach.sh                       | 1 -\n t/t7408-submodule-reference.sh                     | 1 -\n t/t7409-submodule-detached-work-tree.sh            | 1 -\n t/t7411-submodule-config.sh                        | 1 -\n t/t7412-submodule-absorbgitdirs.sh                 | 1 -\n t/t7413-submodule-is-active.sh                     | 1 -\n t/t7414-submodule-mistakes.sh                      | 1 -\n t/t7416-submodule-dash-url.sh                      | 1 -\n t/t7417-submodule-path-url.sh                      | 1 -\n t/t7418-submodule-sparse-gitmodules.sh             | 1 -\n t/t7419-submodule-set-branch.sh                    | 1 -\n t/t7420-submodule-set-url.sh                       | 1 -\n t/t7421-submodule-summary-add.sh                   | 1 -\n t/t7422-submodule-output.sh                        | 1 -\n t/t7423-submodule-symlinks.sh                      | 1 -\n t/t7424-submodule-mixed-ref-formats.sh             | 1 -\n t/t7450-bad-git-dotfiles.sh                        | 1 -\n t/t7500-commit-template-squash-signoff.sh          | 1 -\n t/t7501-commit-basic-functionality.sh              | 1 -\n t/t7502-commit-porcelain.sh                        | 1 -\n t/t7503-pre-commit-and-pre-merge-commit-hooks.sh   | 1 -\n t/t7504-commit-msg-hook.sh                         | 1 -\n t/t7505-prepare-commit-msg-hook.sh                 | 1 -\n t/t7506-status-submodule.sh                        | 1 -\n t/t7507-commit-verbose.sh                          | 1 -\n t/t7508-status.sh                                  | 1 -\n t/t7509-commit-authorship.sh                       | 1 -\n t/t7510-signed-commit.sh                           | 1 -\n t/t7511-status-index.sh                            | 1 -\n t/t7512-status-help.sh                             | 1 -\n t/t7513-interpret-trailers.sh                      | 1 -\n t/t7514-commit-patch.sh                            | 1 -\n t/t7515-status-symlinks.sh                         | 1 -\n t/t7516-commit-races.sh                            | 1 -\n t/t7517-per-repo-email.sh                          | 1 -\n t/t7518-ident-corner-cases.sh                      | 1 -\n t/t7519-status-fsmonitor.sh                        | 1 -\n t/t7520-ignored-hook-warning.sh                    | 1 -\n t/t7521-ignored-mode.sh                            | 1 -\n t/t7524-commit-summary.sh                          | 1 -\n t/t7525-status-rename.sh                           | 1 -\n t/t7526-commit-pathspec-file.sh                    | 1 -\n t/t7528-signed-commit-ssh.sh                       | 1 -\n t/t7600-merge.sh                                   | 1 -\n t/t7601-merge-pull-config.sh                       | 1 -\n t/t7602-merge-octopus-many.sh                      | 1 -\n t/t7603-merge-reduce-heads.sh                      | 1 -\n t/t7604-merge-custom-message.sh                    | 1 -\n t/t7605-merge-resolve.sh                           | 1 -\n t/t7606-merge-custom.sh                            | 1 -\n t/t7607-merge-state.sh                             | 1 -\n t/t7608-merge-messages.sh                          | 1 -\n t/t7609-mergetool--lib.sh                          | 1 -\n t/t7610-mergetool.sh                               | 1 -\n t/t7611-merge-abort.sh                             | 1 -\n t/t7612-merge-verify-signatures.sh                 | 1 -\n t/t7614-merge-signoff.sh                           | 1 -\n t/t7615-diff-algo-with-mergy-operations.sh         | 1 -\n t/t7700-repack.sh                                  | 1 -\n t/t7701-repack-unpack-unreachable.sh               | 1 -\n t/t7702-repack-cyclic-alternate.sh                 | 1 -\n t/t7703-repack-geometric.sh                        | 1 -\n t/t7704-repack-cruft.sh                            | 1 -\n t/t7800-difftool.sh                                | 1 -\n t/t7810-grep.sh                                    | 1 -\n t/t7811-grep-open.sh                               | 1 -\n t/t7812-grep-icase-non-ascii.sh                    | 1 -\n t/t7813-grep-icase-iso.sh                          | 1 -\n t/t7814-grep-recurse-submodules.sh                 | 1 -\n t/t7815-grep-binary.sh                             | 1 -\n t/t7816-grep-binary-pattern.sh                     | 1 -\n t/t7817-grep-sparse-checkout.sh                    | 1 -\n t/t7900-maintenance.sh                             | 1 -\n t/t8001-annotate.sh                                | 1 -\n t/t8002-blame.sh                                   | 1 -\n t/t8003-blame-corner-cases.sh                      | 1 -\n t/t8004-blame-with-conflicts.sh                    | 1 -\n t/t8005-blame-i18n.sh                              | 1 -\n t/t8006-blame-textconv.sh                          | 1 -\n t/t8007-cat-file-textconv.sh                       | 1 -\n t/t8008-blame-formats.sh                           | 1 -\n t/t8009-blame-vs-topicbranches.sh                  | 1 -\n t/t8010-cat-file-filters.sh                        | 1 -\n t/t8011-blame-split-file.sh                        | 1 -\n t/t8012-blame-colors.sh                            | 1 -\n t/t8013-blame-ignore-revs.sh                       | 1 -\n t/t8014-blame-ignore-fuzzy.sh                      | 1 -\n t/t9001-send-email.sh                              | 1 -\n t/t9002-column.sh                                  | 1 -\n t/t9003-help-autocorrect.sh                        | 1 -\n t/t9200-git-cvsexportcommit.sh                     | 1 -\n t/t9210-scalar.sh                                  | 1 -\n t/t9211-scalar-clone.sh                            | 1 -\n t/t9300-fast-import.sh                             | 1 -\n t/t9301-fast-import-notes.sh                       | 1 -\n t/t9302-fast-import-unpack-limit.sh                | 1 -\n t/t9303-fast-import-compression.sh                 | 1 -\n t/t9304-fast-import-marks.sh                       | 1 -\n t/t9350-fast-export.sh                             | 1 -\n t/t9351-fast-export-anonymize.sh                   | 1 -\n t/t9400-git-cvsserver-server.sh                    | 1 -\n t/t9401-git-cvsserver-crlf.sh                      | 1 -\n t/t9402-git-cvsserver-refs.sh                      | 1 -\n t/t9500-gitweb-standalone-no-errors.sh             | 1 -\n t/t9501-gitweb-standalone-http-status.sh           | 1 -\n t/t9502-gitweb-standalone-parse-output.sh          | 1 -\n t/t9600-cvsimport.sh                               | 1 -\n t/t9601-cvsimport-vendor-branch.sh                 | 1 -\n t/t9602-cvsimport-branches-tags.sh                 | 1 -\n t/t9603-cvsimport-patchsets.sh                     | 1 -\n t/t9604-cvsimport-timestamps.sh                    | 1 -\n t/t9700-perl-git.sh                                | 1 -\n t/t9800-git-p4-basic.sh                            | 1 -\n t/t9801-git-p4-branch.sh                           | 1 -\n t/t9802-git-p4-filetype.sh                         | 1 -\n t/t9803-git-p4-shell-metachars.sh                  | 1 -\n t/t9804-git-p4-label.sh                            | 1 -\n t/t9805-git-p4-skip-submit-edit.sh                 | 1 -\n t/t9806-git-p4-options.sh                          | 1 -\n t/t9808-git-p4-chdir.sh                            | 1 -\n t/t9809-git-p4-client-view.sh                      | 1 -\n t/t9810-git-p4-rcs.sh                              | 1 -\n t/t9811-git-p4-label-import.sh                     | 1 -\n t/t9812-git-p4-wildcards.sh                        | 1 -\n t/t9813-git-p4-preserve-users.sh                   | 1 -\n t/t9814-git-p4-rename.sh                           | 1 -\n t/t9815-git-p4-submit-fail.sh                      | 1 -\n t/t9816-git-p4-locked.sh                           | 1 -\n t/t9817-git-p4-exclude.sh                          | 1 -\n t/t9818-git-p4-block.sh                            | 1 -\n t/t9819-git-p4-case-folding.sh                     | 1 -\n t/t9820-git-p4-editor-handling.sh                  | 1 -\n t/t9821-git-p4-path-variations.sh                  | 1 -\n t/t9822-git-p4-path-encoding.sh                    | 1 -\n t/t9823-git-p4-mock-lfs.sh                         | 1 -\n t/t9825-git-p4-handle-utf16-without-bom.sh         | 1 -\n t/t9826-git-p4-keep-empty-commits.sh               | 1 -\n t/t9827-git-p4-change-filetype.sh                  | 1 -\n t/t9828-git-p4-map-user.sh                         | 1 -\n t/t9829-git-p4-jobs.sh                             | 1 -\n t/t9830-git-p4-symlink-dir.sh                      | 1 -\n t/t9831-git-p4-triggers.sh                         | 1 -\n t/t9832-unshelve.sh                                | 1 -\n t/t9833-errors.sh                                  | 1 -\n t/t9834-git-p4-file-dir-bug.sh                     | 1 -\n t/t9835-git-p4-metadata-encoding-python2.sh        | 1 -\n t/t9836-git-p4-metadata-encoding-python3.sh        | 1 -\n t/t9850-shell.sh                                   | 1 -\n t/t9901-git-web--browse.sh                         | 1 -\n t/t9902-completion.sh                              | 1 -\n t/t9903-bash-prompt.sh                             | 1 -\n 928 files changed, 928 deletions(-)\n\ndiff --git a/t/t0001-init.sh b/t/t0001-init.sh\nindex 0178aa62a41f1606f2382a4a10ab593ccf11e0e8..4890dff4b27311f0b187c72da61d9f1542257b16 100755\n--- a/t/t0001-init.sh\n+++ b/t/t0001-init.sh\n@@ -2,7 +2,6 @@\n \n test_description='git init'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n check_config () {\ndiff --git a/t/t0002-gitfile.sh b/t/t0002-gitfile.sh\nindex bf3bf604abe3470f19cc5a10e5c88c905cb28329..dfbcdddbcc1f0fd5cf632524b3dfa5a8337a7f02 100755\n--- a/t/t0002-gitfile.sh\n+++ b/t/t0002-gitfile.sh\n@@ -7,7 +7,6 @@ Verify that plumbing commands work when .git is a file\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n objpath() {\ndiff --git a/t/t0003-attributes.sh b/t/t0003-attributes.sh\nindex 66ccb5889d1e026e22862f7f09bb9b29f0722f6b..3c98b622f25b760138ed8a938c104ea017d0f408 100755\n--- a/t/t0003-attributes.sh\n+++ b/t/t0003-attributes.sh\n@@ -2,7 +2,6 @@\n \n test_description=gitattributes\n \n-TEST_PASSES_SANITIZE_LEAK=true\n TEST_CREATE_REPO_NO_TEMPLATE=1\n . ./test-lib.sh\n \ndiff --git a/t/t0004-unwritable.sh b/t/t0004-unwritable.sh\nindex 8114fac73b320b85949d8d7ce1422c35e1eb8158..3bdafbae0f003863b09d01c6ded07c8c1be14e03 100755\n--- a/t/t0004-unwritable.sh\n+++ b/t/t0004-unwritable.sh\n@@ -2,7 +2,6 @@\n \n test_description='detect unwritable repository and fail correctly'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t0005-signals.sh b/t/t0005-signals.sh\nindex eba75a2490ce7e0918e6a981d42ec8f5d9fd9b2d..afba0fc3fc673e5d7d4d55b2031607905853f737 100755\n--- a/t/t0005-signals.sh\n+++ b/t/t0005-signals.sh\n@@ -2,7 +2,6 @@\n \n test_description='signals work as we expect'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n cat >expect <<EOF\ndiff --git a/t/t0006-date.sh b/t/t0006-date.sh\nindex fd373e1b39185488bf7e5861b3457b151711be5c..53ced36df448f1b572eb39fd76b8de291c529d69 100755\n--- a/t/t0006-date.sh\n+++ b/t/t0006-date.sh\n@@ -2,7 +2,6 @@\n \n test_description='test date parsing and printing'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n # arbitrary reference time: 2009-08-30 19:20:00\ndiff --git a/t/t0007-git-var.sh b/t/t0007-git-var.sh\nindex 9fc5882387390aa8b30477c2037d28cefeea64fc..2b60317758c415acc9b054d7668a88fc085be97b 100755\n--- a/t/t0007-git-var.sh\n+++ b/t/t0007-git-var.sh\n@@ -2,7 +2,6 @@\n \n test_description='basic sanity checks for git var'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n sane_unset_all_editors () {\ndiff --git a/t/t0008-ignores.sh b/t/t0008-ignores.sh\nindex 02a18d4fdbd244dcc99290a28695ce7a89107d3a..c9376dffb58872787abc22a8654327d95ba256fb 100755\n--- a/t/t0008-ignores.sh\n+++ b/t/t0008-ignores.sh\n@@ -2,7 +2,6 @@\n \n test_description=check-ignore\n \n-TEST_PASSES_SANITIZE_LEAK=true\n TEST_CREATE_REPO_NO_TEMPLATE=1\n . ./test-lib.sh\n \ndiff --git a/t/t0010-racy-git.sh b/t/t0010-racy-git.sh\nindex 84172a3739094adc6cdf6496b016fe68e0b2a771..45229f57b821d73c4a1690e727eb9280d4ae631b 100755\n--- a/t/t0010-racy-git.sh\n+++ b/t/t0010-racy-git.sh\n@@ -2,7 +2,6 @@\n \n test_description='racy GIT'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n # This test can give false success if your machine is sufficiently\ndiff --git a/t/t0012-help.sh b/t/t0012-help.sh\nindex 9eae0d835637885dfc2c236544b4d828020e502e..1d273d91c2125ae2c16ae1a14c628cf23fcecc06 100755\n--- a/t/t0012-help.sh\n+++ b/t/t0012-help.sh\n@@ -2,7 +2,6 @@\n \n test_description='help'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n configure_help () {\ndiff --git a/t/t0013-sha1dc.sh b/t/t0013-sha1dc.sh\nindex 08814173cb111c941c59e2fa764ac271fcbe9dab..ce3d81227a0f0c9fece708f883d14cd6c1e2c3d3 100755\n--- a/t/t0013-sha1dc.sh\n+++ b/t/t0013-sha1dc.sh\n@@ -2,7 +2,6 @@\n \n test_description='test sha1 collision detection'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n TEST_DATA=\"$TEST_DIRECTORY/t0013\"\n \ndiff --git a/t/t0014-alias.sh b/t/t0014-alias.sh\nindex 2a6f39ad9c81958d5152139995feab57c4371363..854d59ec58c25ab2cfb58113bf5ea8d670829fe0 100755\n--- a/t/t0014-alias.sh\n+++ b/t/t0014-alias.sh\n@@ -2,7 +2,6 @@\n \n test_description='git command aliasing'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'nested aliases - internal execution' '\ndiff --git a/t/t0017-env-helper.sh b/t/t0017-env-helper.sh\nindex f3a16859cc20f1a3b80334d36113e757645c6c9b..32fe8481792325f05e6fdf9a83dee43871dce9ad 100755\n--- a/t/t0017-env-helper.sh\n+++ b/t/t0017-env-helper.sh\n@@ -2,7 +2,6 @@\n \n test_description='test test-tool env-helper'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n \ndiff --git a/t/t0018-advice.sh b/t/t0018-advice.sh\nindex fac52322a7f6739ce95feea6b527edce00941361..9a3db02fdedd076870d5fdb63953bdb235951b6e 100755\n--- a/t/t0018-advice.sh\n+++ b/t/t0018-advice.sh\n@@ -5,7 +5,6 @@ test_description='Test advise_if_enabled functionality'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=trunk\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'advice should be printed when config variable is unset' '\ndiff --git a/t/t0019-json-writer.sh b/t/t0019-json-writer.sh\nindex 19a730c29ed8f791d7885c31ff2a908cb1b5dfb3..3a4e1cc7e388ab0d0c24bca0ccaa7f07cf0a901e 100755\n--- a/t/t0019-json-writer.sh\n+++ b/t/t0019-json-writer.sh\n@@ -2,7 +2,6 @@\n \n test_description='test json-writer JSON generation'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'unit test of json-writer routines' '\ndiff --git a/t/t0020-crlf.sh b/t/t0020-crlf.sh\nindex 81946e87ccb9b478789164a6db54d9a80278288d..fd1cae09edcc2609c69df8b1e934eb428793face 100755\n--- a/t/t0020-crlf.sh\n+++ b/t/t0020-crlf.sh\n@@ -5,7 +5,6 @@ test_description='CRLF conversion'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n has_cr() {\ndiff --git a/t/t0021-conversion.sh b/t/t0021-conversion.sh\nindex 9e6c6ee0d44c0353dbf7dc10fe9c24a4421693a3..3f6433d3045826f776fe932c30a4aa5bef358d48 100755\n--- a/t/t0021-conversion.sh\n+++ b/t/t0021-conversion.sh\n@@ -5,7 +5,6 @@ test_description='blob conversion via gitattributes'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-terminal.sh\n \ndiff --git a/t/t0022-crlf-rename.sh b/t/t0022-crlf-rename.sh\nindex 9fe98912511d3b6cb050aa51e33906caf7fb51c5..9bd863a970d2b16ff5d9d44b3a23d6c39f310217 100755\n--- a/t/t0022-crlf-rename.sh\n+++ b/t/t0022-crlf-rename.sh\n@@ -2,7 +2,6 @@\n \n test_description='ignore CR in CRLF sequence while computing similiarity'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t0023-crlf-am.sh b/t/t0023-crlf-am.sh\nindex 575805513a3d7f6d27fee7ceefcb75e71753f1f9..f9bbb91f64e35d284a4ac79a6b2ecaa1d2913455 100755\n--- a/t/t0023-crlf-am.sh\n+++ b/t/t0023-crlf-am.sh\n@@ -2,7 +2,6 @@\n \n test_description='Test am with auto.crlf'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n cat >patchfile <<\\EOF\ndiff --git a/t/t0024-crlf-archive.sh b/t/t0024-crlf-archive.sh\nindex a7f4de4a43ffa022ae56ebf14999cbe81900a4a9..44958cb2c2d946656bae5289ee418bf3a295cec5 100755\n--- a/t/t0024-crlf-archive.sh\n+++ b/t/t0024-crlf-archive.sh\n@@ -2,7 +2,6 @@\n \n test_description='respect crlf in git archive'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t0025-crlf-renormalize.sh b/t/t0025-crlf-renormalize.sh\nindex f7202c192e7b63e07c904fe9dcf1b76252d8808d..2e28feb69c9fea23b4a8481925280eb333f1e91f 100755\n--- a/t/t0025-crlf-renormalize.sh\n+++ b/t/t0025-crlf-renormalize.sh\n@@ -2,7 +2,6 @@\n \n test_description='CRLF renormalization'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t0026-eol-config.sh b/t/t0026-eol-config.sh\nindex f426a185bb9b32e732c0404d65237f8278435f0e..493b01a0e7c6a01d2c3016f41bc218d1a3c56e96 100755\n--- a/t/t0026-eol-config.sh\n+++ b/t/t0026-eol-config.sh\n@@ -2,7 +2,6 @@\n \n test_description='CRLF conversion'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n has_cr() {\ndiff --git a/t/t0027-auto-crlf.sh b/t/t0027-auto-crlf.sh\nindex 2f57c8669cb5af3dd6fc79bfca4b486f50fa4d19..49dbf09da7738646e2614eba1fb0a6169482eae4 100755\n--- a/t/t0027-auto-crlf.sh\n+++ b/t/t0027-auto-crlf.sh\n@@ -2,7 +2,6 @@\n \n test_description='CRLF conversion all combinations'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n compare_files () {\ndiff --git a/t/t0028-working-tree-encoding.sh b/t/t0028-working-tree-encoding.sh\nindex 510da4ca12dfbabe6e093baa14c9a1873cacbde3..50b3b4649b614fe39a9e7e0202bd55593d666690 100755\n--- a/t/t0028-working-tree-encoding.sh\n+++ b/t/t0028-working-tree-encoding.sh\n@@ -5,7 +5,6 @@ test_description='working-tree-encoding conversion via gitattributes'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n TEST_CREATE_REPO_NO_TEMPLATE=1\n . ./test-lib.sh\n . \"$TEST_DIRECTORY/lib-encoding.sh\"\ndiff --git a/t/t0029-core-unsetenvvars.sh b/t/t0029-core-unsetenvvars.sh\nindex 4e8e90dd9824b33bd4420423a447decea46e848e..baa1b7e85b10b4a4973f570f5dccf87711bc682d 100755\n--- a/t/t0029-core-unsetenvvars.sh\n+++ b/t/t0029-core-unsetenvvars.sh\n@@ -2,7 +2,6 @@\n \n test_description='test the Windows-only core.unsetenvvars setting'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n if ! test_have_prereq MINGW\ndiff --git a/t/t0030-stripspace.sh b/t/t0030-stripspace.sh\nindex f10f42ff1e4a8716609a1e8dd86e1441e020db3d..43155f6bd86bf4c290d066b80b39af2523bfb581 100755\n--- a/t/t0030-stripspace.sh\n+++ b/t/t0030-stripspace.sh\n@@ -5,7 +5,6 @@\n \n test_description='git stripspace'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n t40='A quick brown fox jumps over the lazy do'\ndiff --git a/t/t0033-safe-directory.sh b/t/t0033-safe-directory.sh\nindex e97a84764f786769614fd096aa0ef67a12e14a90..e103fe710927ceaa9e04a75dd70f141a86c0a6dc 100755\n--- a/t/t0033-safe-directory.sh\n+++ b/t/t0033-safe-directory.sh\n@@ -2,7 +2,6 @@\n \n test_description='verify safe.directory checks'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n GIT_TEST_ASSUME_DIFFERENT_OWNER=1\ndiff --git a/t/t0035-safe-bare-repository.sh b/t/t0035-safe-bare-repository.sh\nindex d3cb2a1cb9edb8f9ad7480be6ec3e02b464046bd..ae7ef092abf6d9abec6aa99cb5bb362cafd091b2 100755\n--- a/t/t0035-safe-bare-repository.sh\n+++ b/t/t0035-safe-bare-repository.sh\n@@ -2,7 +2,6 @@\n \n test_description='verify safe.bareRepository checks'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n pwd=\"$(pwd)\"\ndiff --git a/t/t0040-parse-options.sh b/t/t0040-parse-options.sh\nindex 45a773642fd167e9190b9b693a08001bb5939883..2fe3522305f64d0f8366d160d4c03de81c4a210a 100755\n--- a/t/t0040-parse-options.sh\n+++ b/t/t0040-parse-options.sh\n@@ -5,7 +5,6 @@\n \n test_description='our own option parser'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n cat >expect <<\\EOF\ndiff --git a/t/t0041-usage.sh b/t/t0041-usage.sh\nindex 1464294bd1bfc36d48f06a3ead7826daeb9a745c..a0f6f134c718220e41d9eab8f70158b1c5fb1643 100755\n--- a/t/t0041-usage.sh\n+++ b/t/t0041-usage.sh\n@@ -5,7 +5,6 @@ test_description='Test commands behavior when given invalid argument value'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup ' '\ndiff --git a/t/t0050-filesystem.sh b/t/t0050-filesystem.sh\nindex 325eb1c3cd0add75bcaf3b629c2692420c279f8a..5c9dc90d0b096d9f104caedeb035b50b919b6811 100755\n--- a/t/t0050-filesystem.sh\n+++ b/t/t0050-filesystem.sh\n@@ -5,7 +5,6 @@ test_description='Various filesystem issues'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n auml=$(printf '\\303\\244')\ndiff --git a/t/t0052-simple-ipc.sh b/t/t0052-simple-ipc.sh\nindex 1a36a535743c14c29b993d77ed9bf6482c0b16a7..ff98be31a51b360ef917aba97dbda0e53719b58a 100755\n--- a/t/t0052-simple-ipc.sh\n+++ b/t/t0052-simple-ipc.sh\n@@ -2,7 +2,6 @@\n \n test_description='simple command server'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test-tool simple-ipc SUPPORTS_SIMPLE_IPC || {\ndiff --git a/t/t0055-beyond-symlinks.sh b/t/t0055-beyond-symlinks.sh\nindex c3eb1158ef9ae2eb10f3f7a6d5c882e41f3c576a..d0740038b8778e6ccb6e10c435cd23a6180ab6db 100755\n--- a/t/t0055-beyond-symlinks.sh\n+++ b/t/t0055-beyond-symlinks.sh\n@@ -2,7 +2,6 @@\n \n test_description='update-index and add refuse to add beyond symlinks'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success SYMLINKS setup '\ndiff --git a/t/t0056-git-C.sh b/t/t0056-git-C.sh\nindex 752aa8c945431b909e580f557ef738a455fa8132..2630e756dab7322a5360a67766a648a80a5a7222 100755\n--- a/t/t0056-git-C.sh\n+++ b/t/t0056-git-C.sh\n@@ -2,7 +2,6 @@\n \n test_description='\"-C <path>\" option and its effects on other path-related options'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success '\"git -C <path>\" runs git from the directory <path>' '\ndiff --git a/t/t0060-path-utils.sh b/t/t0060-path-utils.sh\nindex 0afa3d0d312ca6d1788b76d3b0dfcba04f8397e7..dbb2e73bcd912ae6a804603ff54e4c609966fa5d 100755\n--- a/t/t0060-path-utils.sh\n+++ b/t/t0060-path-utils.sh\n@@ -5,7 +5,6 @@\n \n test_description='Test various path utilities'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n norm_path() {\ndiff --git a/t/t0061-run-command.sh b/t/t0061-run-command.sh\nindex 20986b693cfbe8de91552f43daa11be630842f34..76d4936a879afdfcc8961117084174d88da96c26 100755\n--- a/t/t0061-run-command.sh\n+++ b/t/t0061-run-command.sh\n@@ -5,7 +5,6 @@\n \n test_description='Test run command'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n cat >hello-script <<-EOF\ndiff --git a/t/t0062-revision-walking.sh b/t/t0062-revision-walking.sh\nindex b9480c8178193e4eba46dd2d581e1aa4eaa5dae6..8e215867b8c197dedef32c569e1d1f632d22b631 100755\n--- a/t/t0062-revision-walking.sh\n+++ b/t/t0062-revision-walking.sh\n@@ -5,7 +5,6 @@\n \n test_description='Test revision walking api'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n cat >run_twice_expected <<-EOF\ndiff --git a/t/t0063-string-list.sh b/t/t0063-string-list.sh\nindex 1fee6d90102cc6f9b90786a6324f56e7086b91bf..aac63ba5064b786a29f1390554106eab271013ec 100755\n--- a/t/t0063-string-list.sh\n+++ b/t/t0063-string-list.sh\n@@ -5,7 +5,6 @@\n \n test_description='Test string list functionality'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_split () {\ndiff --git a/t/t0066-dir-iterator.sh b/t/t0066-dir-iterator.sh\nindex 7d0a0da8c01b8b69a9d9ca607c55145d96e59ad1..df3e9f5fa5d4b52deb5ecdb25daedc8ed0dc2ec5 100755\n--- a/t/t0066-dir-iterator.sh\n+++ b/t/t0066-dir-iterator.sh\n@@ -2,7 +2,6 @@\n \n test_description='Test the dir-iterator functionality'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t0067-parse_pathspec_file.sh b/t/t0067-parse_pathspec_file.sh\nindex 0188d0423a0aa246d40b0735a31470f1bb97e8a6..7bab49f361a9bfea7cf72042d60e65b25698e5a9 100755\n--- a/t/t0067-parse_pathspec_file.sh\n+++ b/t/t0067-parse_pathspec_file.sh\n@@ -2,7 +2,6 @@\n \n test_description='Test parse_pathspec_file()'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'one item from stdin' '\ndiff --git a/t/t0068-for-each-repo.sh b/t/t0068-for-each-repo.sh\nindex 95019e01ed33289aa025ec729d6b120f4c29f3c7..f2f3e50031291620dde9feef2aa0e2db9acf3c0a 100755\n--- a/t/t0068-for-each-repo.sh\n+++ b/t/t0068-for-each-repo.sh\n@@ -2,7 +2,6 @@\n \n test_description='git for-each-repo builtin'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'run based on configured value' '\ndiff --git a/t/t0070-fundamental.sh b/t/t0070-fundamental.sh\nindex 0ecec2ba71116959fd2efceac7fc46683d1a3e91..6b9dcf984bcb546a2a2dae276ae56c3c3d81f0c8 100755\n--- a/t/t0070-fundamental.sh\n+++ b/t/t0070-fundamental.sh\n@@ -6,7 +6,6 @@ test_description='check that the most basic functions work\n Verify wrappers and compatibility functions.\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'mktemp to nonexistent directory prints filename' '\ndiff --git a/t/t0071-sort.sh b/t/t0071-sort.sh\nindex ba8ad1d1ca0adeee8f001450951ec782e1fc3d74..2236a7e9563ab117876e52e6a6ca9b2d365cc525 100755\n--- a/t/t0071-sort.sh\n+++ b/t/t0071-sort.sh\n@@ -2,7 +2,6 @@\n \n test_description='verify sort functions'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'DEFINE_LIST_SORT_DEBUG' '\ndiff --git a/t/t0080-unit-test-output.sh b/t/t0080-unit-test-output.sh\nindex 3c369c88e2a416fa53c8ea8e8af135a26316251a..3db10f095c2edc63e7064e582884dc2553bd9365 100755\n--- a/t/t0080-unit-test-output.sh\n+++ b/t/t0080-unit-test-output.sh\n@@ -2,7 +2,6 @@\n \n test_description='Test the output of the unit test framework'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'TAP output from unit tests' - <<\\EOT\ndiff --git a/t/t0081-find-pack.sh b/t/t0081-find-pack.sh\nindex 67b11216a3e54185882d176bb59899411ae6666a..5a628bf7356445384ff97f5e55a8d233379bdecb 100755\n--- a/t/t0081-find-pack.sh\n+++ b/t/t0081-find-pack.sh\n@@ -2,7 +2,6 @@\n \n test_description='test `test-tool find-pack`'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t0090-cache-tree.sh b/t/t0090-cache-tree.sh\nindex d8e2fc42e15c73dfffebba57071b8d3e4bfd1ed1..ab80c9ef1358f0c29d7cdb877c1dd41e0a98e7aa 100755\n--- a/t/t0090-cache-tree.sh\n+++ b/t/t0090-cache-tree.sh\n@@ -6,7 +6,6 @@ Tests whether various commands properly update and/or rewrite the\n cache-tree extension.\n \"\n \n-TEST_PASSES_SANITIZE_LEAK=true\n  . ./test-lib.sh\n \n cmp_cache_tree () {\ndiff --git a/t/t0091-bugreport.sh b/t/t0091-bugreport.sh\nindex fca39048fe8840099c2d7a393e91dfd3a6683029..e11d819b62a15087575d639b28be3c64fcd06386 100755\n--- a/t/t0091-bugreport.sh\n+++ b/t/t0091-bugreport.sh\n@@ -2,7 +2,6 @@\n \n test_description='git bugreport'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'create a report' '\ndiff --git a/t/t0092-diagnose.sh b/t/t0092-diagnose.sh\nindex 133e5747d613e5ade6ab8bfe67ab46a31021d64e..6cabd6e67b9a141a4ac7839d296189d7e21d35f3 100755\n--- a/t/t0092-diagnose.sh\n+++ b/t/t0092-diagnose.sh\n@@ -2,7 +2,6 @@\n \n test_description='git diagnose'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success UNZIP 'creates diagnostics zip archive' '\ndiff --git a/t/t0095-bloom.sh b/t/t0095-bloom.sh\nindex 08df74cacfc6910c51568705855dffa90b79d5be..8f0c3b7325b8bd917934f31e51fc9325be29736b 100755\n--- a/t/t0095-bloom.sh\n+++ b/t/t0095-bloom.sh\n@@ -2,7 +2,6 @@\n \n test_description='Testing the various Bloom filter computations in bloom.c'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'compute unseeded murmur3 hash for empty string' '\ndiff --git a/t/t0100-previous.sh b/t/t0100-previous.sh\nindex 70a3223f2199b06833166863e58489ba0f632e59..dd5d9b4e5ebdf26839e091f446f93df8e0c95d8e 100755\n--- a/t/t0100-previous.sh\n+++ b/t/t0100-previous.sh\n@@ -5,7 +5,6 @@ test_description='previous branch syntax @{-n}'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'branch -d @{-1}' '\ndiff --git a/t/t0101-at-syntax.sh b/t/t0101-at-syntax.sh\nindex 878aadd64c9517dc1891031bd8bee0b298cfccb6..023b4c6f0b3a0c0007eec8f9673a2645d6029d2f 100755\n--- a/t/t0101-at-syntax.sh\n+++ b/t/t0101-at-syntax.sh\n@@ -2,7 +2,6 @@\n \n test_description='various @{whatever} syntax tests'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t0200-gettext-basic.sh b/t/t0200-gettext-basic.sh\nindex 522fb2ae696da93e0b8bb8d430f0a4dad6cbd7b3..8853d8afb923e62e5a60d6a52ddcc9a4c6e45aac 100755\n--- a/t/t0200-gettext-basic.sh\n+++ b/t/t0200-gettext-basic.sh\n@@ -5,7 +5,6 @@\n \n test_description='Gettext support for Git'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./lib-gettext.sh\n \n test_expect_success \"sanity: \\$GIT_INTERNAL_GETTEXT_SH_SCHEME is set (to $GIT_INTERNAL_GETTEXT_SH_SCHEME)\" '\ndiff --git a/t/t0201-gettext-fallbacks.sh b/t/t0201-gettext-fallbacks.sh\nindex 8724ce1052ddbf23ce421e15562c2416b2ea0ceb..6c74df0dc67e575d171c8ad4a4ab57465b1e622c 100755\n--- a/t/t0201-gettext-fallbacks.sh\n+++ b/t/t0201-gettext-fallbacks.sh\n@@ -8,7 +8,6 @@ test_description='Gettext Shell fallbacks'\n GIT_INTERNAL_GETTEXT_TEST_FALLBACKS=YesPlease\n export GIT_INTERNAL_GETTEXT_TEST_FALLBACKS\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./lib-gettext.sh\n \n test_expect_success \"sanity: \\$GIT_INTERNAL_GETTEXT_SH_SCHEME is set (to $GIT_INTERNAL_GETTEXT_SH_SCHEME)\" '\ndiff --git a/t/t0202-gettext-perl.sh b/t/t0202-gettext-perl.sh\nindex 5a6f28051bd275577110ddbba5618f756ca0937e..b15cb65d5d790007aa1a18365f69d873f913b353 100755\n--- a/t/t0202-gettext-perl.sh\n+++ b/t/t0202-gettext-perl.sh\n@@ -5,7 +5,6 @@\n \n test_description='Perl gettext interface (Git::I18N)'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./lib-gettext.sh\n . \"$TEST_DIRECTORY\"/lib-perl.sh\n skip_all_if_no_Test_More\ndiff --git a/t/t0203-gettext-setlocale-sanity.sh b/t/t0203-gettext-setlocale-sanity.sh\nindex 86cff324ff181110cf1ef8a44af6c4295b7f5d40..0ce1f22eff66285ee0da9b1830de961555fbad2b 100755\n--- a/t/t0203-gettext-setlocale-sanity.sh\n+++ b/t/t0203-gettext-setlocale-sanity.sh\n@@ -5,7 +5,6 @@\n \n test_description=\"The Git C functions aren't broken by setlocale(3)\"\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./lib-gettext.sh\n \n test_expect_success 'git show a ISO-8859-1 commit under C locale' '\ndiff --git a/t/t0204-gettext-reencode-sanity.sh b/t/t0204-gettext-reencode-sanity.sh\nindex 310a4500125f4a0d18f6c68a10cf1e8fe7d3beff..28d92bb9b7cade291d2dacbce893afdd6543c94e 100755\n--- a/t/t0204-gettext-reencode-sanity.sh\n+++ b/t/t0204-gettext-reencode-sanity.sh\n@@ -5,7 +5,6 @@\n \n test_description=\"Gettext reencoding of our *.po/*.mo files works\"\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./lib-gettext.sh\n \n # The constants used in a tricky observation for undefined behaviour\ndiff --git a/t/t0210-trace2-normal.sh b/t/t0210-trace2-normal.sh\nindex b9adc94aab41650da73e5541bc4666102e4baad5..eff9a59dbd0d5d865dff434fd7860cb1070100af 100755\n--- a/t/t0210-trace2-normal.sh\n+++ b/t/t0210-trace2-normal.sh\n@@ -2,7 +2,6 @@\n \n test_description='test trace2 facility (normal target)'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n # Turn off any inherited trace2 settings for this test.\ndiff --git a/t/t0211-trace2-perf.sh b/t/t0211-trace2-perf.sh\nindex 91260ce97e5bdb39550a9e1e4abbc4d5fea48a21..bac90465406d94743236024c20dbfdaf78782471 100755\n--- a/t/t0211-trace2-perf.sh\n+++ b/t/t0211-trace2-perf.sh\n@@ -2,7 +2,6 @@\n \n test_description='test trace2 facility (perf target)'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n # Turn off any inherited trace2 settings for this test.\ndiff --git a/t/t0212-trace2-event.sh b/t/t0212-trace2-event.sh\nindex 147643d582643efebf794000fa48e3d460c76173..1211db9f4687176810395d6fb28416612d7bc927 100755\n--- a/t/t0212-trace2-event.sh\n+++ b/t/t0212-trace2-event.sh\n@@ -2,7 +2,6 @@\n \n test_description='test trace2 facility'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n # Turn off any inherited trace2 settings for this test.\ndiff --git a/t/t0300-credentials.sh b/t/t0300-credentials.sh\nindex 6a76b7fdbd4557b2df8e34f9683323cf8073ea38..17952e52d69bfcad54faf3feafec324e0ac0825b 100755\n--- a/t/t0300-credentials.sh\n+++ b/t/t0300-credentials.sh\n@@ -2,7 +2,6 @@\n \n test_description='basic credential helper tests'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-credential.sh\n \ndiff --git a/t/t0301-credential-cache.sh b/t/t0301-credential-cache.sh\nindex 5d5b64205ffe35dfd74750b3188946200aab916e..dc30289f7539ee7ec8dac98be814f09472c23822 100755\n--- a/t/t0301-credential-cache.sh\n+++ b/t/t0301-credential-cache.sh\n@@ -2,7 +2,6 @@\n \n test_description='credential-cache tests'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-credential.sh\n \ndiff --git a/t/t0302-credential-store.sh b/t/t0302-credential-store.sh\nindex f83db659e2581444b9a9740df8cefd7fb530c359..c1cd60edd019a07128b130336f53d1a46d44baf6 100755\n--- a/t/t0302-credential-store.sh\n+++ b/t/t0302-credential-store.sh\n@@ -2,7 +2,6 @@\n \n test_description='credential-store tests'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-credential.sh\n \ndiff --git a/t/t0303-credential-external.sh b/t/t0303-credential-external.sh\nindex 8aadbe86c458560f1e23811db10679c806c5a324..72ae405c3ed979edee54cbe83e73ec566d23f6d1 100755\n--- a/t/t0303-credential-external.sh\n+++ b/t/t0303-credential-external.sh\n@@ -29,7 +29,6 @@ you can set GIT_TEST_CREDENTIAL_HELPER_SETUP to a sequence of shell\n commands.\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-credential.sh\n \ndiff --git a/t/t0410-partial-clone.sh b/t/t0410-partial-clone.sh\nindex 818700fbecd457a9fbb7cc3bb91984c1224631d5..34bdb3ab1f23b70115a47bb7b5bb01fb57beae8f 100755\n--- a/t/t0410-partial-clone.sh\n+++ b/t/t0410-partial-clone.sh\n@@ -2,7 +2,6 @@\n \n test_description='partial clone'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-terminal.sh\n \ndiff --git a/t/t0411-clone-from-partial.sh b/t/t0411-clone-from-partial.sh\nindex 932bf2067daaeb88de744762f2cdbc0b59c8b565..c98d5018695a137b57cc9634312f220cff897cce 100755\n--- a/t/t0411-clone-from-partial.sh\n+++ b/t/t0411-clone-from-partial.sh\n@@ -2,7 +2,6 @@\n \n test_description='check that local clone does not fetch from promisor remotes'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'create evil repo' '\ndiff --git a/t/t0450-txt-doc-vs-help.sh b/t/t0450-txt-doc-vs-help.sh\nindex f99a69ae1b74a91defa88ed74062fd13d29c2bad..853101b86ef53d8a1f6e31c45906496ca09d9cbb 100755\n--- a/t/t0450-txt-doc-vs-help.sh\n+++ b/t/t0450-txt-doc-vs-help.sh\n@@ -5,7 +5,6 @@ test_description='assert (unbuilt) Documentation/*.txt and -h output\n Run this with --debug to see a summary of where we still fail to make\n the two versions consistent with one another.'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup: list of builtins' '\ndiff --git a/t/t0500-progress-display.sh b/t/t0500-progress-display.sh\nindex 1eb3a8306ba15b3e782b940f605afa8ec551ec8c..d1a498a216fb522eefa57ac7cb2c63d0ebc21f47 100755\n--- a/t/t0500-progress-display.sh\n+++ b/t/t0500-progress-display.sh\n@@ -2,7 +2,6 @@\n \n test_description='progress display'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n show_cr () {\ndiff --git a/t/t0600-reffiles-backend.sh b/t/t0600-reffiles-backend.sh\nindex bef2b70871364931ab8b3ead950f59d11b6fe216..1e62c791d97250f081842c86316985bee0f7a940 100755\n--- a/t/t0600-reffiles-backend.sh\n+++ b/t/t0600-reffiles-backend.sh\n@@ -7,7 +7,6 @@ export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n GIT_TEST_DEFAULT_REF_FORMAT=files\n export GIT_TEST_DEFAULT_REF_FORMAT\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t0601-reffiles-pack-refs.sh b/t/t0601-reffiles-pack-refs.sh\nindex d8cbd3f202b5f00c9a94c5a2ea2dced6606b6f4d..aa7f6ecd813c44d4db8f9f6dc41f297742b2377e 100755\n--- a/t/t0601-reffiles-pack-refs.sh\n+++ b/t/t0601-reffiles-pack-refs.sh\n@@ -15,7 +15,6 @@ export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n GIT_TEST_DEFAULT_REF_FORMAT=files\n export GIT_TEST_DEFAULT_REF_FORMAT\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'enable reflogs' '\ndiff --git a/t/t0602-reffiles-fsck.sh b/t/t0602-reffiles-fsck.sh\nindex 71a4d1a5ae4bab3dcca3a8ecc1060cb2f360ab30..30e0a36242e2f280b9384438e52199d327028639 100755\n--- a/t/t0602-reffiles-fsck.sh\n+++ b/t/t0602-reffiles-fsck.sh\n@@ -6,7 +6,6 @@ GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n GIT_TEST_DEFAULT_REF_FORMAT=files\n export GIT_TEST_DEFAULT_REF_FORMAT\n-TEST_PASSES_SANITIZE_LEAK=true\n \n . ./test-lib.sh\n \ndiff --git a/t/t0610-reftable-basics.sh b/t/t0610-reftable-basics.sh\nindex babec7993e3f3ec1dc2a72b13fce797766765cfe..67bf3a82f6eb531b6791a294baf0194f139bdf47 100755\n--- a/t/t0610-reftable-basics.sh\n+++ b/t/t0610-reftable-basics.sh\n@@ -10,7 +10,6 @@ export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n GIT_TEST_DEFAULT_REF_FORMAT=reftable\n export GIT_TEST_DEFAULT_REF_FORMAT\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n INVALID_OID=$(test_oid 001)\ndiff --git a/t/t0611-reftable-httpd.sh b/t/t0611-reftable-httpd.sh\nindex 2805995cc8c6980b6e8477c21e21987254e5e3e0..5e05b9c1f2ac73deac78ce6fa91e60cb377a3c68 100755\n--- a/t/t0611-reftable-httpd.sh\n+++ b/t/t0611-reftable-httpd.sh\n@@ -2,7 +2,6 @@\n \n test_description='reftable HTTPD tests'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-httpd.sh\n \ndiff --git a/t/t0612-reftable-jgit-compatibility.sh b/t/t0612-reftable-jgit-compatibility.sh\nindex 84922153ab6a6d1aca3ce79d42a290a3899b372a..d0d7e80b492091d1949467f9835c35f622ae0bb4 100755\n--- a/t/t0612-reftable-jgit-compatibility.sh\n+++ b/t/t0612-reftable-jgit-compatibility.sh\n@@ -11,7 +11,6 @@ export GIT_TEST_DEFAULT_REF_FORMAT\n GIT_TEST_SPLIT_INDEX=0\n export GIT_TEST_SPLIT_INDEX\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n if ! test_have_prereq JGIT\ndiff --git a/t/t0613-reftable-write-options.sh b/t/t0613-reftable-write-options.sh\nindex b1c6c97524f16cb5ba15cf814ff8f959e4cb0c80..e2708e11d5b941cf707d3c22466e4cc6957d0302 100755\n--- a/t/t0613-reftable-write-options.sh\n+++ b/t/t0613-reftable-write-options.sh\n@@ -16,7 +16,6 @@ export GIT_TEST_DEFAULT_HASH\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=master\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'default write options' '\ndiff --git a/t/t1000-read-tree-m-3way.sh b/t/t1000-read-tree-m-3way.sh\nindex 0e8c0dfbbee643c80d2164b6dc8e80fe6522f2e0..b9dd21cfb6b1d51d1862ef3c6ad80f3496b04694 100755\n--- a/t/t1000-read-tree-m-3way.sh\n+++ b/t/t1000-read-tree-m-3way.sh\n@@ -72,7 +72,6 @@ In addition:\n \n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-read-tree.sh\n . \"$TEST_DIRECTORY\"/lib-read-tree-m-3way.sh\ndiff --git a/t/t1001-read-tree-m-2way.sh b/t/t1001-read-tree-m-2way.sh\nindex 48a1550371a14b8f92d72ac59efd463b229afb88..4a88bb9ef0c4012fc829c1d537c53747f67c05bb 100755\n--- a/t/t1001-read-tree-m-2way.sh\n+++ b/t/t1001-read-tree-m-2way.sh\n@@ -21,7 +21,6 @@ In the test, these paths are used:\n \tyomin   - not in H or M\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-read-tree.sh\n \ndiff --git a/t/t1002-read-tree-m-u-2way.sh b/t/t1002-read-tree-m-u-2way.sh\nindex a7c2ed0d7c0a31180e6af1abe9dcc6366e62e2c5..df6ef53725878015850c5ac55caf38829a55b242 100755\n--- a/t/t1002-read-tree-m-u-2way.sh\n+++ b/t/t1002-read-tree-m-u-2way.sh\n@@ -9,7 +9,6 @@ This is identical to t1001, but uses -u to update the work tree as well.\n \n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-read-tree.sh\n \ndiff --git a/t/t1003-read-tree-prefix.sh b/t/t1003-read-tree-prefix.sh\nindex c860c08ecb46a37a6f20bf403963afd7576fed9f..66e2bf4aec3d7a24bfd846e1125ae94bfdce5c74 100755\n--- a/t/t1003-read-tree-prefix.sh\n+++ b/t/t1003-read-tree-prefix.sh\n@@ -6,7 +6,6 @@\n test_description='git read-tree --prefix test.\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t1004-read-tree-m-u-wf.sh b/t/t1004-read-tree-m-u-wf.sh\nindex 2b9720b0feb465bb9c4651626c43829ec27cd7b8..11bf10424f16208cda726c612cb64bfc89d9c803 100755\n--- a/t/t1004-read-tree-m-u-wf.sh\n+++ b/t/t1004-read-tree-m-u-wf.sh\n@@ -5,7 +5,6 @@ test_description='read-tree -m -u checks working tree files'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-read-tree.sh\n \ndiff --git a/t/t1005-read-tree-reset.sh b/t/t1005-read-tree-reset.sh\nindex 26be4a2b5a007afa7ef1a9bd4438d16173c6aad5..6b5033d0ce3b3489598f0f1fba5b047bd3e5b43a 100755\n--- a/t/t1005-read-tree-reset.sh\n+++ b/t/t1005-read-tree-reset.sh\n@@ -2,7 +2,6 @@\n \n test_description='read-tree -u --reset'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-read-tree.sh\n \ndiff --git a/t/t1006-cat-file.sh b/t/t1006-cat-file.sh\nindex d36cd7c0863591d197cfc3ef340972943ff40e6f..ff9bf213aa2c73e42ab82d9b227fbbb7049c1e43 100755\n--- a/t/t1006-cat-file.sh\n+++ b/t/t1006-cat-file.sh\n@@ -2,7 +2,6 @@\n \n test_description='git cat-file'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_cmdmode_usage () {\ndiff --git a/t/t1007-hash-object.sh b/t/t1007-hash-object.sh\nindex d73a5cc23705e2b697d56f961b27a6815725f8c4..a0481139de5519bf65a3320f21dfd72e97a4f6f5 100755\n--- a/t/t1007-hash-object.sh\n+++ b/t/t1007-hash-object.sh\n@@ -2,7 +2,6 @@\n \n test_description=\"git hash-object\"\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n echo_without_newline() {\ndiff --git a/t/t1008-read-tree-overlay.sh b/t/t1008-read-tree-overlay.sh\nindex ad5936e54d1f73ed46c1066600f273f0847ca673..4512fb0b6e68b4ac12e54610441fe1f2de89ea0c 100755\n--- a/t/t1008-read-tree-overlay.sh\n+++ b/t/t1008-read-tree-overlay.sh\n@@ -5,7 +5,6 @@ test_description='test multi-tree read-tree without merging'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-read-tree.sh\n \ndiff --git a/t/t1009-read-tree-new-index.sh b/t/t1009-read-tree-new-index.sh\nindex fc179ac5dd604a085c9a19a491f0abb7ac4c066f..2935f68f8d215203ee1d2a9813de0039a89cb58f 100755\n--- a/t/t1009-read-tree-new-index.sh\n+++ b/t/t1009-read-tree-new-index.sh\n@@ -5,7 +5,6 @@ test_description='test read-tree into a fresh index file'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t1010-mktree.sh b/t/t1010-mktree.sh\nindex 22875ba598c2a82bba6c7504c420c690441f7167..c291a2b33d79b7af79b4039cf41a0d9dd1e2bc17 100755\n--- a/t/t1010-mktree.sh\n+++ b/t/t1010-mktree.sh\n@@ -2,7 +2,6 @@\n \n test_description='git mktree'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t1011-read-tree-sparse-checkout.sh b/t/t1011-read-tree-sparse-checkout.sh\nindex 595b24c0adb3081230fe65884fd436e1f12896d4..742f0fa909fd6e8a7fe2b376b3e5083a30d71c73 100755\n--- a/t/t1011-read-tree-sparse-checkout.sh\n+++ b/t/t1011-read-tree-sparse-checkout.sh\n@@ -12,7 +12,6 @@ test_description='sparse checkout tests\n '\n \n TEST_CREATE_REPO_NO_TEMPLATE=1\n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-read-tree.sh\n \ndiff --git a/t/t1012-read-tree-df.sh b/t/t1012-read-tree-df.sh\nindex cde93d22cde4ab09fe9fa594a58813f1d3f276af..57f0770df1410ea2005d8637323ff0eeeb82d880 100755\n--- a/t/t1012-read-tree-df.sh\n+++ b/t/t1012-read-tree-df.sh\n@@ -2,7 +2,6 @@\n \n test_description='read-tree D/F conflict corner cases'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-read-tree.sh\n \ndiff --git a/t/t1013-read-tree-submodule.sh b/t/t1013-read-tree-submodule.sh\nindex cf8b94ebedbdd2ce780550d6217e7223bcf20d8b..bfc90d4cf272e8a8d6b6d517787bed0f074f4e82 100755\n--- a/t/t1013-read-tree-submodule.sh\n+++ b/t/t1013-read-tree-submodule.sh\n@@ -2,7 +2,6 @@\n \n test_description='read-tree can handle submodules'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-submodule-update.sh\n \ndiff --git a/t/t1014-read-tree-confusing.sh b/t/t1014-read-tree-confusing.sh\nindex 8ea8d36818bea10b227640b4974cc57f2157fa2e..0c0e6da5cf5b20d7e0b5bb5267d4d08f655055ba 100755\n--- a/t/t1014-read-tree-confusing.sh\n+++ b/t/t1014-read-tree-confusing.sh\n@@ -2,7 +2,6 @@\n \n test_description='check that read-tree rejects confusing paths'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'create base tree' '\ndiff --git a/t/t1015-read-index-unmerged.sh b/t/t1015-read-index-unmerged.sh\nindex da737a32a271185882b6f1fb6b190e7e82d90a48..9b965d0294309f947339111a91a67e885972a6c3 100755\n--- a/t/t1015-read-index-unmerged.sh\n+++ b/t/t1015-read-index-unmerged.sh\n@@ -2,7 +2,6 @@\n \n test_description='Test various callers of read_index_unmerged'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup modify/delete + directory/file conflict' '\ndiff --git a/t/t1016-compatObjectFormat.sh b/t/t1016-compatObjectFormat.sh\nindex 8341a2fe8395a0ed41d46e442ddf3b2df465bd1e..5641271b23a445c12292de5242a499c2f178ded9 100755\n--- a/t/t1016-compatObjectFormat.sh\n+++ b/t/t1016-compatObjectFormat.sh\n@@ -5,7 +5,6 @@\n \n test_description='Test how well compatObjectFormat works'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-gpg.sh\n \ndiff --git a/t/t1020-subdirectory.sh b/t/t1020-subdirectory.sh\nindex 45eef9457fe13d9eef6e463405190ca84c67bda5..9fdbb2af80e0a82429289d06b24d4dcfac3f263d 100755\n--- a/t/t1020-subdirectory.sh\n+++ b/t/t1020-subdirectory.sh\n@@ -6,7 +6,6 @@\n test_description='Try various core-level commands in subdirectory.\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-read-tree.sh\n \ndiff --git a/t/t1021-rerere-in-workdir.sh b/t/t1021-rerere-in-workdir.sh\nindex 69bf9476cbf65dc39ac6460774938773424b61cf..0b892894eb9031d88aa26cf43fc09235a2aa07bc 100755\n--- a/t/t1021-rerere-in-workdir.sh\n+++ b/t/t1021-rerere-in-workdir.sh\n@@ -4,7 +4,6 @@ test_description='rerere run in a workdir'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success SYMLINKS setup '\ndiff --git a/t/t1022-read-tree-partial-clone.sh b/t/t1022-read-tree-partial-clone.sh\nindex cca4380e4319a024416c4bbe2e097f63e409af48..d390d7d5f857bb3c755d0c0d385e9045a754887c 100755\n--- a/t/t1022-read-tree-partial-clone.sh\n+++ b/t/t1022-read-tree-partial-clone.sh\n@@ -3,7 +3,6 @@\n test_description='git read-tree in partial clones'\n \n TEST_NO_CREATE_REPO=1\n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'read-tree in partial clone prefetches in one batch' '\ndiff --git a/t/t1050-large.sh b/t/t1050-large.sh\nindex ed638f664479bd1abfca19b985aeaaff66452f18..c71932b02423734908428a9b2be776fec229ce9e 100755\n--- a/t/t1050-large.sh\n+++ b/t/t1050-large.sh\n@@ -3,7 +3,6 @@\n \n test_description='adding and checking out large blobs'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'core.bigFileThreshold must be non-negative' '\ndiff --git a/t/t1051-large-conversion.sh b/t/t1051-large-conversion.sh\nindex f6709c9f569ec7170d24694b369abf0d6f8518ec..361afb679b0af752d1be91d29b9b42a7c6a6992d 100755\n--- a/t/t1051-large-conversion.sh\n+++ b/t/t1051-large-conversion.sh\n@@ -2,7 +2,6 @@\n \n test_description='test conversion filters on large files'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n set_attr() {\ndiff --git a/t/t1060-object-corruption.sh b/t/t1060-object-corruption.sh\nindex 5e0f0a334f4d43dd76199a50037c5900da2cb63b..502a5ea1c51e3ac808297148e1e2c27ec9784549 100755\n--- a/t/t1060-object-corruption.sh\n+++ b/t/t1060-object-corruption.sh\n@@ -2,7 +2,6 @@\n \n test_description='see how we handle various forms of corruption'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n # convert \"1234abcd\" to \".git/objects/12/34abcd\"\ndiff --git a/t/t1090-sparse-checkout-scope.sh b/t/t1090-sparse-checkout-scope.sh\nindex da0e7714d5ac5c94a04e7aa100288ef85f42a860..3a14218b245d4cf67f9bdde4c18a7eee8ac6524a 100755\n--- a/t/t1090-sparse-checkout-scope.sh\n+++ b/t/t1090-sparse-checkout-scope.sh\n@@ -6,7 +6,6 @@ GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n TEST_CREATE_REPO_NO_TEMPLATE=1\n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t1091-sparse-checkout-builtin.sh b/t/t1091-sparse-checkout-builtin.sh\nindex 8c5cd651b4b80ba05ab9fab572e384806a8404dd..ab3a105ffff2532b35074611de9e65d60b8db082 100755\n--- a/t/t1091-sparse-checkout-builtin.sh\n+++ b/t/t1091-sparse-checkout-builtin.sh\n@@ -8,7 +8,6 @@ export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n GIT_TEST_SPLIT_INDEX=false\n export GIT_TEST_SPLIT_INDEX\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n list_files() {\ndiff --git a/t/t1092-sparse-checkout-compatibility.sh b/t/t1092-sparse-checkout-compatibility.sh\nindex 2157f37da36fd61b6cfac3d09d3e01643bd1e6e4..a4c7c41fc00aa3043c3f18fdc4c5d7785d17f7de 100755\n--- a/t/t1092-sparse-checkout-compatibility.sh\n+++ b/t/t1092-sparse-checkout-compatibility.sh\n@@ -5,7 +5,6 @@ test_description='compare full workdir to sparse workdir'\n GIT_TEST_SPLIT_INDEX=0\n GIT_TEST_SPARSE_INDEX=\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t1100-commit-tree-options.sh b/t/t1100-commit-tree-options.sh\nindex 0f37a43fd3c5b2638fe41408a3860ce2facd6401..ae66ba5babf347f12f2c4cb213b0de72ea980da2 100755\n--- a/t/t1100-commit-tree-options.sh\n+++ b/t/t1100-commit-tree-options.sh\n@@ -12,7 +12,6 @@ Also make sure that command line parser understands the normal\n \"flags first and then non flag arguments\" command line.\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n cat >expected <<EOF\ndiff --git a/t/t1300-config.sh b/t/t1300-config.sh\nindex f13277c8f3e3c410aecd3aea9141323c0398058e..51a85e83c27b1300f29354b35a13726687b23997 100755\n--- a/t/t1300-config.sh\n+++ b/t/t1300-config.sh\n@@ -8,7 +8,6 @@ test_description='Test git config in different settings'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n for mode in legacy subcommands\ndiff --git a/t/t1301-shared-repo.sh b/t/t1301-shared-repo.sh\nindex 29cf8a966133a7851722c8cdf828fe3c524a12ec..630a47af21e6558f1d3c9985411a603aaaab5ec0 100755\n--- a/t/t1301-shared-repo.sh\n+++ b/t/t1301-shared-repo.sh\n@@ -9,7 +9,6 @@ GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n TEST_CREATE_REPO_NO_TEMPLATE=1\n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n # Remove a default ACL from the test dir if possible.\ndiff --git a/t/t1302-repo-version.sh b/t/t1302-repo-version.sh\nindex 42caa0d2978b58755d43b3361589c6e7691c34db..69723b88ff896130832c5081721c2393702f61ed 100755\n--- a/t/t1302-repo-version.sh\n+++ b/t/t1302-repo-version.sh\n@@ -5,7 +5,6 @@\n \n test_description='Test repository version check'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t1303-wacky-config.sh b/t/t1303-wacky-config.sh\nindex 0506f3d6bba6cb64255a1b7685481b8ccdb7784d..d971925ed021ccd38db89843bff19727fe823367 100755\n--- a/t/t1303-wacky-config.sh\n+++ b/t/t1303-wacky-config.sh\n@@ -2,7 +2,6 @@\n \n test_description='Test wacky input to git config'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n # Leaving off the newline is intentional!\ndiff --git a/t/t1304-default-acl.sh b/t/t1304-default-acl.sh\nindex 31b89dd9693afc95f30e0bb9e11dc704fda24b41..c69ae41306c90d33b2ac253a25961ae76fec81e7 100755\n--- a/t/t1304-default-acl.sh\n+++ b/t/t1304-default-acl.sh\n@@ -9,7 +9,6 @@ test_description='Test repository with default ACL'\n # => this must come before . ./test-lib.sh\n umask 077\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n # We need an arbitrary other user give permission to using ACLs. root\ndiff --git a/t/t1305-config-include.sh b/t/t1305-config-include.sh\nindex 517d6c869379bfdeef61a4c346d1e05fb7f55d99..8ff2b0c232b485a2d5225c30a9f75170c5bea952 100755\n--- a/t/t1305-config-include.sh\n+++ b/t/t1305-config-include.sh\n@@ -1,7 +1,6 @@\n #!/bin/sh\n \n test_description='test config file include directives'\n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n # Force setup_explicit_git_dir() to run until the end. This is needed\ndiff --git a/t/t1306-xdg-files.sh b/t/t1306-xdg-files.sh\nindex 53e5b290b9bcab0d8809e34f4343f191af4ed9dc..40d3c42618c04f8b0e656af83fb2e303601dd7ff 100755\n--- a/t/t1306-xdg-files.sh\n+++ b/t/t1306-xdg-files.sh\n@@ -7,7 +7,6 @@\n \n test_description='Compatibility with $XDG_CONFIG_HOME/git/ files'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'read config: xdg file exists and ~/.gitconfig doesn'\\''t' '\ndiff --git a/t/t1307-config-blob.sh b/t/t1307-config-blob.sh\nindex b9852fe40e4a045ae4a355a85aa6e2d14d758479..5cb546dd00c665b015f4002b21d50b8a7104ab79 100755\n--- a/t/t1307-config-blob.sh\n+++ b/t/t1307-config-blob.sh\n@@ -2,7 +2,6 @@\n \n test_description='support for reading config from a blob'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'create config blob' '\ndiff --git a/t/t1308-config-set.sh b/t/t1308-config-set.sh\nindex 3bfec07f1abcc1d997f428e84acf6cc3490b1b6a..e0e49053f07fbcdad817cf084fcd1328793302cb 100755\n--- a/t/t1308-config-set.sh\n+++ b/t/t1308-config-set.sh\n@@ -2,7 +2,6 @@\n \n test_description='Test git config-set API in different settings'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n # 'check_config get_* section.key value' verifies that the entry for\ndiff --git a/t/t1309-early-config.sh b/t/t1309-early-config.sh\nindex 523aa99a1e264661c9af03e450ff14c345831617..9710ee0ca4571dd578575ee1a08ede9afec6819e 100755\n--- a/t/t1309-early-config.sh\n+++ b/t/t1309-early-config.sh\n@@ -2,7 +2,6 @@\n \n test_description='Test read_early_config()'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'read early config' '\ndiff --git a/t/t1310-config-default.sh b/t/t1310-config-default.sh\nindex 1a90d31201a612b69944bffba27b347eeb0ab580..69e64c6c8686fb17fb24616bd7cb6fc2992cc9fa 100755\n--- a/t/t1310-config-default.sh\n+++ b/t/t1310-config-default.sh\n@@ -2,7 +2,6 @@\n \n test_description='Test git config in different settings (with --default)'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'uses --default when entry missing' '\ndiff --git a/t/t1350-config-hooks-path.sh b/t/t1350-config-hooks-path.sh\nindex ceeb7ac3a4745fd817dc601da93b836260fcf51a..45a04929170640b1fa673f88614728b449c43887 100755\n--- a/t/t1350-config-hooks-path.sh\n+++ b/t/t1350-config-hooks-path.sh\n@@ -2,7 +2,6 @@\n \n test_description='Test the core.hooksPath configuration variable'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'set up a pre-commit hook in core.hooksPath' '\ndiff --git a/t/t1400-update-ref.sh b/t/t1400-update-ref.sh\nindex bb057596f1e05abe4e0fa561a7eb1c1d087b91a1..e2316f1dd4c200df790ac639540d196df5c70c7b 100755\n--- a/t/t1400-update-ref.sh\n+++ b/t/t1400-update-ref.sh\n@@ -5,7 +5,6 @@\n \n test_description='Test git update-ref and basic ref logging'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n Z=$ZERO_OID\ndiff --git a/t/t1401-symbolic-ref.sh b/t/t1401-symbolic-ref.sh\nindex 90af3f955c018bd86807c2756f142968242e8ca5..a2a7e947164c2a304ce588a4433cca07a98e9469 100755\n--- a/t/t1401-symbolic-ref.sh\n+++ b/t/t1401-symbolic-ref.sh\n@@ -2,7 +2,6 @@\n \n test_description='basic symbolic-ref tests'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n # If the tests munging HEAD fail, they can break detection of\ndiff --git a/t/t1402-check-ref-format.sh b/t/t1402-check-ref-format.sh\nindex 5ed9d7318e0cc97435952039c7e8c1af842a24a9..cabc516ae9a4fa1c404c245f4b3b9efd7e93200e 100755\n--- a/t/t1402-check-ref-format.sh\n+++ b/t/t1402-check-ref-format.sh\n@@ -2,7 +2,6 @@\n \n test_description='Test git check-ref-format'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n valid_ref() {\ndiff --git a/t/t1403-show-ref.sh b/t/t1403-show-ref.sh\nindex 403f6b8f7daf00353cf741450c3390331ae40647..9d698b3cc35a7f13f30c36a0d8fe7b5ed1430b07 100755\n--- a/t/t1403-show-ref.sh\n+++ b/t/t1403-show-ref.sh\n@@ -4,7 +4,6 @@ test_description='show-ref'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t1404-update-ref-errors.sh b/t/t1404-update-ref-errors.sh\nindex df90112618c10681f887222ef9890c28c6c27bc8..28e6c380d76db10d313868b140eae6c4c1597c7e 100755\n--- a/t/t1404-update-ref-errors.sh\n+++ b/t/t1404-update-ref-errors.sh\n@@ -2,7 +2,6 @@\n \n test_description='Test git update-ref error handling'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n # Create some references, perhaps run pack-refs --all, then try to\ndiff --git a/t/t1405-main-ref-store.sh b/t/t1405-main-ref-store.sh\nindex a6bcd62ab658eefcd11ae1778692ad6d7f4c3008..6d8f401a2a98271e2cbd9c6a515c10044b53ce22 100755\n--- a/t/t1405-main-ref-store.sh\n+++ b/t/t1405-main-ref-store.sh\n@@ -5,7 +5,6 @@ test_description='test main ref store api'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n RUN=\"test-tool ref-store main\"\ndiff --git a/t/t1406-submodule-ref-store.sh b/t/t1406-submodule-ref-store.sh\nindex c01f0f14a1266f93f9066c738693d7c8a9a526dc..9b9e5d0766f38da19e4b532a003b7559efb28676 100755\n--- a/t/t1406-submodule-ref-store.sh\n+++ b/t/t1406-submodule-ref-store.sh\n@@ -5,7 +5,6 @@ test_description='test submodule ref store api'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n RUN=\"test-tool ref-store submodule:sub\"\ndiff --git a/t/t1407-worktree-ref-store.sh b/t/t1407-worktree-ref-store.sh\nindex 48b1c92a41450b25645d6cd782aa86c8e630164b..9d8e1a13432b8344088cb3282b22aa2e9240ec89 100755\n--- a/t/t1407-worktree-ref-store.sh\n+++ b/t/t1407-worktree-ref-store.sh\n@@ -5,7 +5,6 @@ test_description='test worktree ref store api'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n RWT=\"test-tool ref-store worktree:wt\"\ndiff --git a/t/t1408-packed-refs.sh b/t/t1408-packed-refs.sh\nindex 9469c79a585f051177a4c9223c0e0f9fd37124dd..41ba1f1d7fca94e9504e0c198b2e1f7885c41185 100755\n--- a/t/t1408-packed-refs.sh\n+++ b/t/t1408-packed-refs.sh\n@@ -5,7 +5,6 @@ test_description='packed-refs entries are covered by loose refs'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t1409-avoid-packing-refs.sh b/t/t1409-avoid-packing-refs.sh\nindex 7748973733e6adab07117192accabf7698189681..e3c501848a494c6ff11caaa6044cefae08e1dbc0 100755\n--- a/t/t1409-avoid-packing-refs.sh\n+++ b/t/t1409-avoid-packing-refs.sh\n@@ -2,7 +2,6 @@\n \n test_description='avoid rewriting packed-refs unnecessarily'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n if test_have_prereq !REFFILES\ndiff --git a/t/t1410-reflog.sh b/t/t1410-reflog.sh\nindex 246a3f46abafdf0e24528be59b33a4987ff791c1..388fdf9ae57dac4ed7d568e8043e090a445632cc 100755\n--- a/t/t1410-reflog.sh\n+++ b/t/t1410-reflog.sh\n@@ -7,7 +7,6 @@ test_description='Test prune and reflog expiration'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n check_have () {\ndiff --git a/t/t1411-reflog-show.sh b/t/t1411-reflog-show.sh\nindex da581ec19ac619cef717a4a3b4dc34f55c0142b8..975c4ea83a877b2dfaf6059c320c71c0282fee0c 100755\n--- a/t/t1411-reflog-show.sh\n+++ b/t/t1411-reflog-show.sh\n@@ -4,7 +4,6 @@ test_description='Test reflog display routines'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t1412-reflog-loop.sh b/t/t1412-reflog-loop.sh\nindex ff30874f940439fe979e3857400c54b944194dcb..f7d69b66ff33e8c23b858d58d0473e6f672f5c9f 100755\n--- a/t/t1412-reflog-loop.sh\n+++ b/t/t1412-reflog-loop.sh\n@@ -2,7 +2,6 @@\n \n test_description='reflog walk shows repeated commits again'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup commits' '\ndiff --git a/t/t1413-reflog-detach.sh b/t/t1413-reflog-detach.sh\nindex d2a4822d46fd05c45273f48b0caf48cadb2a07f1..934688a1ee82e29f2552bb2444eb06626fe254f8 100755\n--- a/t/t1413-reflog-detach.sh\n+++ b/t/t1413-reflog-detach.sh\n@@ -4,7 +4,6 @@ test_description='Test reflog interaction with detached HEAD'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n reset_state () {\ndiff --git a/t/t1414-reflog-walk.sh b/t/t1414-reflog-walk.sh\nindex 49d28166da0d93095988c959ad87842e17cc9860..be6c3f472c176525b64383b726ad7b05b664accd 100755\n--- a/t/t1414-reflog-walk.sh\n+++ b/t/t1414-reflog-walk.sh\n@@ -4,7 +4,6 @@ test_description='various tests of reflog walk (log -g) behavior'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'set up some reflog entries' '\ndiff --git a/t/t1415-worktree-refs.sh b/t/t1415-worktree-refs.sh\nindex eb4eec8becbfa64efcde4e866334363a866c01a2..51d79bae83b429378db2ebabc628719053d831e0 100755\n--- a/t/t1415-worktree-refs.sh\n+++ b/t/t1415-worktree-refs.sh\n@@ -2,7 +2,6 @@\n \n test_description='per-worktree refs'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t1416-ref-transaction-hooks.sh b/t/t1416-ref-transaction-hooks.sh\nindex 5a812ca3c0b5d3f7de60dc999de6aafaf1f384a6..dd003a196f718b7c5ee5f85be41f74ef7d538c32 100755\n--- a/t/t1416-ref-transaction-hooks.sh\n+++ b/t/t1416-ref-transaction-hooks.sh\n@@ -5,7 +5,6 @@ test_description='reference transaction hooks'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t1417-reflog-updateref.sh b/t/t1417-reflog-updateref.sh\nindex 0eb5e674bc1f0dbc688523dd3f94a5e5bb32b6d7..2f37402536743e164f6cc452afeec58a307e87cb 100755\n--- a/t/t1417-reflog-updateref.sh\n+++ b/t/t1417-reflog-updateref.sh\n@@ -2,7 +2,6 @@\n \n test_description='git reflog --updateref'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t1418-reflog-exists.sh b/t/t1418-reflog-exists.sh\nindex 2268bca3c11ac8e2d73e3a399b8debc44fc712cb..d51ecd5e9250f004e0b0c894b308172237e5666c 100755\n--- a/t/t1418-reflog-exists.sh\n+++ b/t/t1418-reflog-exists.sh\n@@ -4,7 +4,6 @@ test_description='Test reflog display routines'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t1419-exclude-refs.sh b/t/t1419-exclude-refs.sh\nindex 3256e4462f96db6f45f953ddc4473a6ba05213df..c04eeb72111662a607479f78f496ce36e75e9f51 100755\n--- a/t/t1419-exclude-refs.sh\n+++ b/t/t1419-exclude-refs.sh\n@@ -5,7 +5,6 @@ test_description='test exclude_patterns functionality in main ref store'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n for_each_ref__exclude () {\ndiff --git a/t/t1420-lost-found.sh b/t/t1420-lost-found.sh\nindex dbe15a0be1051608c4dc6dd727e1589e9422b7b5..2fb2f44f021ea36eb2f1601ba07974a041f19661 100755\n--- a/t/t1420-lost-found.sh\n+++ b/t/t1420-lost-found.sh\n@@ -5,7 +5,6 @@\n \n test_description='Test fsck --lost-found'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t1430-bad-ref-name.sh b/t/t1430-bad-ref-name.sh\nindex 0c00118c2b3f798777bad27a7082e5c0a2f29ea4..3ab65f72cdec882c8fab9079599e4fd55c1d1774 100755\n--- a/t/t1430-bad-ref-name.sh\n+++ b/t/t1430-bad-ref-name.sh\n@@ -4,7 +4,6 @@ test_description='Test handling of ref names that check-ref-format rejects'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t1450-fsck.sh b/t/t1450-fsck.sh\nindex 280cbf3e031e1ab67ed28aa2af4c3b105b7d254e..8a456b1142d1cc463f97c5e8809bcfc83ffa1e96 100755\n--- a/t/t1450-fsck.sh\n+++ b/t/t1450-fsck.sh\n@@ -6,7 +6,6 @@ test_description='git fsck random collection of tests\n * (main) A\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t1451-fsck-buffer.sh b/t/t1451-fsck-buffer.sh\nindex 3413da40e4ae0c197b42cb92e9a75983a27bdeb3..3a3d33f40548954313b8d3e58351ea8ceed6b469 100755\n--- a/t/t1451-fsck-buffer.sh\n+++ b/t/t1451-fsck-buffer.sh\n@@ -15,7 +15,6 @@ These tests _might_ catch such overruns in normal use, but should be run with\n ASan or valgrind for more confidence.\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n # the general idea for tags and commits is to build up the \"base\" file\ndiff --git a/t/t1460-refs-migrate.sh b/t/t1460-refs-migrate.sh\nindex f7c0783d30ccd61b0fee67c115193b42bb0e2c77..cf57cd66f2db2d6b42e66a8a4349706be002d940 100755\n--- a/t/t1460-refs-migrate.sh\n+++ b/t/t1460-refs-migrate.sh\n@@ -5,7 +5,6 @@ test_description='migration of ref storage backends'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_migration () {\ndiff --git a/t/t1500-rev-parse.sh b/t/t1500-rev-parse.sh\nindex 30c31918fde6539d52800e18dfbb3423b5b73491..bf2a90df9484662a13294ab3a0ffecdc44996c05 100755\n--- a/t/t1500-rev-parse.sh\n+++ b/t/t1500-rev-parse.sh\n@@ -4,7 +4,6 @@ test_description='test git rev-parse'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_one () {\ndiff --git a/t/t1501-work-tree.sh b/t/t1501-work-tree.sh\nindex ae6528aecea7d3b36cfe51c5f19c7098f05429e3..8c94ac2e70bdc6835a6f79705fe34e0744ddcc42 100755\n--- a/t/t1501-work-tree.sh\n+++ b/t/t1501-work-tree.sh\n@@ -2,7 +2,6 @@\n \n test_description='test separate work tree'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t1502-rev-parse-parseopt.sh b/t/t1502-rev-parse-parseopt.sh\nindex 5eaa6428c43917515f95baed1c1cf4ad2cb6110b..3962f1d2882a1f4331e0ca8c83c0ac27fecf2019 100755\n--- a/t/t1502-rev-parse-parseopt.sh\n+++ b/t/t1502-rev-parse-parseopt.sh\n@@ -2,7 +2,6 @@\n \n test_description='test git rev-parse --parseopt'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n check_invalid_long_option () {\ndiff --git a/t/t1503-rev-parse-verify.sh b/t/t1503-rev-parse-verify.sh\nindex 79df65ec7f619baa053b2aa50d5ec08557cb820a..75a708f9ba5f22d0eb007cc68871da5a62571905 100755\n--- a/t/t1503-rev-parse-verify.sh\n+++ b/t/t1503-rev-parse-verify.sh\n@@ -9,7 +9,6 @@ exec </dev/null\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n add_line_into_file()\ndiff --git a/t/t1504-ceiling-dirs.sh b/t/t1504-ceiling-dirs.sh\nindex c1679e31d8afca409323484d588bf63b264f45f2..e04420f4368b9305162f1fd7b0be7926a113e057 100755\n--- a/t/t1504-ceiling-dirs.sh\n+++ b/t/t1504-ceiling-dirs.sh\n@@ -2,7 +2,6 @@\n \n test_description='test GIT_CEILING_DIRECTORIES'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_prefix() {\ndiff --git a/t/t1505-rev-parse-last.sh b/t/t1505-rev-parse-last.sh\nindex 4a5758f08a8b2f38bc98e6ac4e26cfa36713780d..2803ca9489c7c6bc2accd85c62ec52805ce2bce3 100755\n--- a/t/t1505-rev-parse-last.sh\n+++ b/t/t1505-rev-parse-last.sh\n@@ -5,7 +5,6 @@ test_description='test @{-N} syntax'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n \ndiff --git a/t/t1506-rev-parse-diagnosis.sh b/t/t1506-rev-parse-diagnosis.sh\nindex a3464976e3a934ca1dc0b17703b6476339a07fcb..722884e65f45871e281954f814154cfe976d35c1 100755\n--- a/t/t1506-rev-parse-diagnosis.sh\n+++ b/t/t1506-rev-parse-diagnosis.sh\n@@ -7,7 +7,6 @@ exec </dev/null\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_did_you_mean ()\ndiff --git a/t/t1507-rev-parse-upstream.sh b/t/t1507-rev-parse-upstream.sh\nindex b9af6b3ac035a04858ae0c7e0963166af665bd81..cb9ef7e329eb06a693ead9ab747f9efd37021c94 100755\n--- a/t/t1507-rev-parse-upstream.sh\n+++ b/t/t1507-rev-parse-upstream.sh\n@@ -5,7 +5,6 @@ test_description='test <branch>@{upstream} syntax'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n \ndiff --git a/t/t1508-at-combinations.sh b/t/t1508-at-combinations.sh\nindex e841309d0eab1022f3442c23795f884ad98a8280..87a42864145f85ed539b9d1cbb9a3dd5f71fc708 100755\n--- a/t/t1508-at-combinations.sh\n+++ b/t/t1508-at-combinations.sh\n@@ -4,7 +4,6 @@ test_description='test various @{X} syntax combinations together'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n check() {\ndiff --git a/t/t1510-repo-setup.sh b/t/t1510-repo-setup.sh\nindex 591505a39c02786962a02161d533f28dca16951e..bbfe05b8e4a5c4c13e531647bfa460c0a552de2e 100755\n--- a/t/t1510-repo-setup.sh\n+++ b/t/t1510-repo-setup.sh\n@@ -43,7 +43,6 @@ A few rules for repo setup:\n # This test heavily relies on the standard error of nested function calls.\n test_untraceable=UnfortunatelyYes\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n here=$(pwd)\ndiff --git a/t/t1511-rev-parse-caret.sh b/t/t1511-rev-parse-caret.sh\nindex e7e78a402813368396632bdbc32793f4919a2f95..6ecfed86bc0d6aa6390f09dd3a06976208d3f8cb 100755\n--- a/t/t1511-rev-parse-caret.sh\n+++ b/t/t1511-rev-parse-caret.sh\n@@ -5,7 +5,6 @@ test_description='tests for ref^{stuff}'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t1512-rev-parse-disambiguation.sh b/t/t1512-rev-parse-disambiguation.sh\nindex f9d68ce74ea0950455300c761b5345e9db300a09..70f1e0a998e103704373e2cc4ffd21e09c7c64b0 100755\n--- a/t/t1512-rev-parse-disambiguation.sh\n+++ b/t/t1512-rev-parse-disambiguation.sh\n@@ -23,7 +23,6 @@ one tagged as v1.0.0.  They all have one regular file each.\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_cmp_failed_rev_parse () {\ndiff --git a/t/t1513-rev-parse-prefix.sh b/t/t1513-rev-parse-prefix.sh\nindex ba43387bf167b598de91bea497251d270214f545..5f437be8c9e8c932f5d355e3f8636e5cbcd69791 100755\n--- a/t/t1513-rev-parse-prefix.sh\n+++ b/t/t1513-rev-parse-prefix.sh\n@@ -5,7 +5,6 @@ test_description='Tests for rev-parse --prefix'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t1514-rev-parse-push.sh b/t/t1514-rev-parse-push.sh\nindex a835a196aa81be9e7aa79f38c3977a03b71b5336..d868a0811056c83810bdd468d85e6f3a90622da7 100755\n--- a/t/t1514-rev-parse-push.sh\n+++ b/t/t1514-rev-parse-push.sh\n@@ -4,7 +4,6 @@ test_description='test <branch>@{push} syntax'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n resolve () {\ndiff --git a/t/t1515-rev-parse-outside-repo.sh b/t/t1515-rev-parse-outside-repo.sh\nindex cdb26a30d726bb0088230c251a58ece0d160c72d..75e89c4b6e23c2659006615ba58e44526fc9e373 100755\n--- a/t/t1515-rev-parse-outside-repo.sh\n+++ b/t/t1515-rev-parse-outside-repo.sh\n@@ -2,7 +2,6 @@\n \n test_description='check that certain rev-parse options work outside repo'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'set up non-repo directory' '\ndiff --git a/t/t1517-outside-repo.sh b/t/t1517-outside-repo.sh\nindex 342defbb61762892744c3f4dfa96336c6a19d36a..dbd8cd6906338dff358c5fa5a9b8ce1524903110 100755\n--- a/t/t1517-outside-repo.sh\n+++ b/t/t1517-outside-repo.sh\n@@ -2,7 +2,6 @@\n \n test_description='check random commands outside repo'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'set up a non-repo directory and test file' '\ndiff --git a/t/t1600-index.sh b/t/t1600-index.sh\nindex 62e7fd15964bba7cbc8904471879027219368951..03239e9faa4b7e834b8b8420d8dc5cc17e8a7d4f 100755\n--- a/t/t1600-index.sh\n+++ b/t/t1600-index.sh\n@@ -2,7 +2,6 @@\n \n test_description='index file specific tests'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n sane_unset GIT_TEST_SPLIT_INDEX\ndiff --git a/t/t1601-index-bogus.sh b/t/t1601-index-bogus.sh\nindex 5dcc10188280b2c0ff4b6b9465c87651de47c5a8..a45a8b4eb046f637aa196412c4da7ddf14694546 100755\n--- a/t/t1601-index-bogus.sh\n+++ b/t/t1601-index-bogus.sh\n@@ -2,7 +2,6 @@\n \n test_description='test handling of bogus index entries'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'create tree with null sha1' '\ndiff --git a/t/t1700-split-index.sh b/t/t1700-split-index.sh\nindex 2625ac44889a5c9219e9575a9bbc5265d3c419d5..ac4a5b2734c0784c2cb8878112a5ead9593860de 100755\n--- a/t/t1700-split-index.sh\n+++ b/t/t1700-split-index.sh\n@@ -5,7 +5,6 @@ test_description='split index mode tests'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n # We need total control of index splitting here\ndiff --git a/t/t1701-racy-split-index.sh b/t/t1701-racy-split-index.sh\nindex d8fa489998acc5984da7e21a8a2adf43cfe88cee..5dc221ef382df13089b84dcb03002c2a8f19a9ba 100755\n--- a/t/t1701-racy-split-index.sh\n+++ b/t/t1701-racy-split-index.sh\n@@ -5,7 +5,6 @@\n \n test_description='racy split index'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t1800-hook.sh b/t/t1800-hook.sh\nindex 8b0234cf2d5d96980403d65b844639715acfe91b..4feaf0d7bef71fc558e640f5fae37ae1fb95c95c 100755\n--- a/t/t1800-hook.sh\n+++ b/t/t1800-hook.sh\n@@ -2,7 +2,6 @@\n \n test_description='git-hook command'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-terminal.sh\n \ndiff --git a/t/t2000-conflict-when-checking-files-out.sh b/t/t2000-conflict-when-checking-files-out.sh\nindex 79fc97f1d7eb42675c85ef29b8cb36a75d7e7669..f18616ad2be3eaaf6dc72ab9131c88a0c9bdf2fc 100755\n--- a/t/t2000-conflict-when-checking-files-out.sh\n+++ b/t/t2000-conflict-when-checking-files-out.sh\n@@ -21,7 +21,6 @@ test_description='git conflicts when checking files out test.'\n # path1 is occupied by a non-directory.  With \"-f\" flag, it should remove\n # the conflicting paths and succeed.\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n show_files() {\ndiff --git a/t/t2002-checkout-cache-u.sh b/t/t2002-checkout-cache-u.sh\nindex fc95cf90485366314dcebb7fe77f18b1d8d4ef1b..70361c806e1baf1b26810983374c53eb49ea2f2d 100755\n--- a/t/t2002-checkout-cache-u.sh\n+++ b/t/t2002-checkout-cache-u.sh\n@@ -8,7 +8,6 @@ test_description='git checkout-index -u test.\n With -u flag, git checkout-index internally runs the equivalent of\n git update-index --refresh on the checked out entry.'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success \\\ndiff --git a/t/t2003-checkout-cache-mkdir.sh b/t/t2003-checkout-cache-mkdir.sh\nindex f0fd441d810d52c909476a76107098d16ecc9f35..ff163cf6750f6d82c36964eb694efbcfae06135f 100755\n--- a/t/t2003-checkout-cache-mkdir.sh\n+++ b/t/t2003-checkout-cache-mkdir.sh\n@@ -10,7 +10,6 @@ also verifies that such leading path may contain symlinks, unlike\n the GIT controlled paths.\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t2004-checkout-cache-temp.sh b/t/t2004-checkout-cache-temp.sh\nindex 98e818f09f21fe6ea374dba692c3f4ed619af735..b92d96fdc4ed5fe1a4b577596133cc59becbd327 100755\n--- a/t/t2004-checkout-cache-temp.sh\n+++ b/t/t2004-checkout-cache-temp.sh\n@@ -8,7 +8,6 @@ test_description='git checkout-index --temp test.\n With --temp flag, git checkout-index writes to temporary merge files\n rather than the tracked path.'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t2005-checkout-index-symlinks.sh b/t/t2005-checkout-index-symlinks.sh\nindex 67d18cfa104b867bfdd2004df0bc8c9e305cfdc9..91b08e03717a619807e0687be6d538bbb6036824 100755\n--- a/t/t2005-checkout-index-symlinks.sh\n+++ b/t/t2005-checkout-index-symlinks.sh\n@@ -8,7 +8,6 @@ test_description='git checkout-index on filesystem w/o symlinks test.\n This tests that git checkout-index creates a symbolic link as a plain\n file if core.symlinks is false.'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success \\\ndiff --git a/t/t2006-checkout-index-basic.sh b/t/t2006-checkout-index-basic.sh\nindex 570ba38580d99513fe12a2c6ed1e1a4c6951e0e2..bac231b167c2c66522b067f027ae4b7801709f11 100755\n--- a/t/t2006-checkout-index-basic.sh\n+++ b/t/t2006-checkout-index-basic.sh\n@@ -3,7 +3,6 @@\n test_description='basic checkout-index tests\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'checkout-index --gobbledegook' '\ndiff --git a/t/t2007-checkout-symlink.sh b/t/t2007-checkout-symlink.sh\nindex bd9e9e7530da06da9eb3fc6ce103b82196625d23..6f0b90ce1271ec49f6fd78016c5f3cb082053674 100755\n--- a/t/t2007-checkout-symlink.sh\n+++ b/t/t2007-checkout-symlink.sh\n@@ -7,7 +7,6 @@ test_description='git checkout to switch between branches with symlink<->dir'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t2008-checkout-subdir.sh b/t/t2008-checkout-subdir.sh\nindex 8a518a44ea2d2a65f6ee2d9d88c5a8233476c902..eadb9434ae764cc0ca57085a6ce28dd5bee4bb77 100755\n--- a/t/t2008-checkout-subdir.sh\n+++ b/t/t2008-checkout-subdir.sh\n@@ -4,7 +4,6 @@\n \n test_description='git checkout from subdirectories'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t2009-checkout-statinfo.sh b/t/t2009-checkout-statinfo.sh\nindex 71195dd28f2258d3286cc478967b0319ae58b143..b0540636ae387104edae67cd7baa74949f7f5ffd 100755\n--- a/t/t2009-checkout-statinfo.sh\n+++ b/t/t2009-checkout-statinfo.sh\n@@ -5,7 +5,6 @@ test_description='checkout should leave clean stat info'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t2010-checkout-ambiguous.sh b/t/t2010-checkout-ambiguous.sh\nindex 82c3bfeac1ad9b96eb2adb9ae835fb2032222bd5..3a3d56018e525e9c2e0620fd3e06e0b916ca4782 100755\n--- a/t/t2010-checkout-ambiguous.sh\n+++ b/t/t2010-checkout-ambiguous.sh\n@@ -5,7 +5,6 @@ test_description='checkout and pathspecs/refspecs ambiguities'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t2011-checkout-invalid-head.sh b/t/t2011-checkout-invalid-head.sh\nindex 04f53b1ea14cb5046ee3cf3ad70804812c6fce8a..61417c756750bbd49c1da3cb7457cca481529207 100755\n--- a/t/t2011-checkout-invalid-head.sh\n+++ b/t/t2011-checkout-invalid-head.sh\n@@ -5,7 +5,6 @@ test_description='checkout switching away from an invalid branch'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t2012-checkout-last.sh b/t/t2012-checkout-last.sh\nindex 4b6372f4c3e946c26a490698335a821cff5701f2..1f6c4ed0428a5c966c76359c1f4fa2e536f37fcf 100755\n--- a/t/t2012-checkout-last.sh\n+++ b/t/t2012-checkout-last.sh\n@@ -5,7 +5,6 @@ test_description='checkout can switch to last branch and merge base'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t2013-checkout-submodule.sh b/t/t2013-checkout-submodule.sh\nindex 3c1d663d948490901fb3de330b35ae0227730158..b2bdd1fcb425a14a12df9fe896269e5f9c349434 100755\n--- a/t/t2013-checkout-submodule.sh\n+++ b/t/t2013-checkout-submodule.sh\n@@ -2,7 +2,6 @@\n \n test_description='checkout can handle submodules'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-submodule-update.sh\n \ndiff --git a/t/t2014-checkout-switch.sh b/t/t2014-checkout-switch.sh\nindex c138bdde4fea1536a06137c68ab100b6b0d1f49b..3e757c6e4e3250577d8327ad3d33651788d43561 100755\n--- a/t/t2014-checkout-switch.sh\n+++ b/t/t2014-checkout-switch.sh\n@@ -2,7 +2,6 @@\n \n test_description='Peter MacMillan'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t2015-checkout-unborn.sh b/t/t2015-checkout-unborn.sh\nindex fb0e13881cd8a290dd272c6dc16c3f097f49cb39..1820300c62fb3421b3ac3544f746d93207583c52 100755\n--- a/t/t2015-checkout-unborn.sh\n+++ b/t/t2015-checkout-unborn.sh\n@@ -4,7 +4,6 @@ test_description='checkout from unborn branch'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t2016-checkout-patch.sh b/t/t2016-checkout-patch.sh\nindex c40b661ac12d57209199ea397748409860345d8f..c4f9bf09aa4fd8d541a858d55cfbff34e78de1c0 100755\n--- a/t/t2016-checkout-patch.sh\n+++ b/t/t2016-checkout-patch.sh\n@@ -2,7 +2,6 @@\n \n test_description='git checkout --patch'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./lib-patch-mode.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t2017-checkout-orphan.sh b/t/t2017-checkout-orphan.sh\nindex a5c7358eeabefb3dacc94ae94e2c61d200381ac5..80ac661815d0a750ef2291ae3d10798cf96afea0 100755\n--- a/t/t2017-checkout-orphan.sh\n+++ b/t/t2017-checkout-orphan.sh\n@@ -10,7 +10,6 @@ Main Tests for --orphan functionality.'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n TEST_FILE=foo\ndiff --git a/t/t2018-checkout-branch.sh b/t/t2018-checkout-branch.sh\nindex 43551cc1481c3813c3aae0b291bac2b1a17b63d7..a48ebdbf4d0957181a881228ede5ccda29039f02 100755\n--- a/t/t2018-checkout-branch.sh\n+++ b/t/t2018-checkout-branch.sh\n@@ -3,7 +3,6 @@\n test_description='checkout'\n \n TEST_CREATE_REPO_NO_TEMPLATE=1\n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n # Arguments: [!] <branch> <oid> [<checkout options>]\ndiff --git a/t/t2019-checkout-ambiguous-ref.sh b/t/t2019-checkout-ambiguous-ref.sh\nindex c67261e2b68a9d330dc14c92783a485b0f605601..1fcef4be95ce14be0635fa44660a59996e8ed53b 100755\n--- a/t/t2019-checkout-ambiguous-ref.sh\n+++ b/t/t2019-checkout-ambiguous-ref.sh\n@@ -2,7 +2,6 @@\n \n test_description='checkout handling of ambiguous (branch/tag) refs'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup ambiguous refs' '\ndiff --git a/t/t2020-checkout-detach.sh b/t/t2020-checkout-detach.sh\nindex 8d90d0285045294b3f39233957ea4487bc7929e0..28bbbe6c05547a4ef8eae1cd671abd298013b68a 100755\n--- a/t/t2020-checkout-detach.sh\n+++ b/t/t2020-checkout-detach.sh\n@@ -4,7 +4,6 @@ test_description='checkout into detached HEAD state'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n check_detached () {\ndiff --git a/t/t2021-checkout-overwrite.sh b/t/t2021-checkout-overwrite.sh\nindex ecfacf0f7f3a5fa7c03fa837891c745dec10dda6..a5c03d5d4a2c5a31a8e921fc81344d9470dd79bb 100755\n--- a/t/t2021-checkout-overwrite.sh\n+++ b/t/t2021-checkout-overwrite.sh\n@@ -2,7 +2,6 @@\n \n test_description='checkout must not overwrite an untracked objects'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t2022-checkout-paths.sh b/t/t2022-checkout-paths.sh\nindex f1b709d58bef0080c1e8067b4b6e725b8141d027..c49ba7f9bd4fe0c6f8f88fbe5a0722b2d6337ac7 100755\n--- a/t/t2022-checkout-paths.sh\n+++ b/t/t2022-checkout-paths.sh\n@@ -4,7 +4,6 @@ test_description='checkout $tree -- $paths'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t2023-checkout-m.sh b/t/t2023-checkout-m.sh\nindex 81e772fb4ebbf1d6c4d156560aa10dfdb02a0852..7b327b754494a8ebb27bb11c7f70649063ccd8d2 100755\n--- a/t/t2023-checkout-m.sh\n+++ b/t/t2023-checkout-m.sh\n@@ -7,7 +7,6 @@ Ensures that checkout -m on a resolved file restores the conflicted file'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t2024-checkout-dwim.sh b/t/t2024-checkout-dwim.sh\nindex 2caada3d834ffc139c0af2e3f1b0b52f9eee9718..a3b1449ef1166756e5bd029a2f94ac6e1c50b03b 100755\n--- a/t/t2024-checkout-dwim.sh\n+++ b/t/t2024-checkout-dwim.sh\n@@ -4,7 +4,6 @@ test_description='checkout <branch>\n \n Ensures that checkout on an unborn branch does what the user expects'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n # Is the current branch \"refs/heads/$1\"?\ndiff --git a/t/t2025-checkout-no-overlay.sh b/t/t2025-checkout-no-overlay.sh\nindex 246609d54d050e5fce76730318123b30f322b75a..dda169bbc4a649989a519ff5b74ad34fc5791c1f 100755\n--- a/t/t2025-checkout-no-overlay.sh\n+++ b/t/t2025-checkout-no-overlay.sh\n@@ -2,7 +2,6 @@\n \n test_description='checkout --no-overlay <tree-ish> -- <pathspec>'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t2026-checkout-pathspec-file.sh b/t/t2026-checkout-pathspec-file.sh\nindex acd55217a6231c35d17f4fbefe2ea27e30d05501..161da054b6dbb534bd70e4150be3e41166d7c27a 100755\n--- a/t/t2026-checkout-pathspec-file.sh\n+++ b/t/t2026-checkout-pathspec-file.sh\n@@ -2,7 +2,6 @@\n \n test_description='checkout --pathspec-from-file'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_tick\ndiff --git a/t/t2027-checkout-track.sh b/t/t2027-checkout-track.sh\nindex 98f16c72399806d2e0a5cdc0580072dcc8c65dae..a397790df59d0bc015e2b1f244cbbbca27525b7a 100755\n--- a/t/t2027-checkout-track.sh\n+++ b/t/t2027-checkout-track.sh\n@@ -5,7 +5,6 @@ test_description='tests for git branch --track'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t2030-unresolve-info.sh b/t/t2030-unresolve-info.sh\nindex b3f6bc97b53d87a4442739d4d62cccd923b55bcd..be3fcdde07562c27da31e7dfe549058f3ced0ea9 100755\n--- a/t/t2030-unresolve-info.sh\n+++ b/t/t2030-unresolve-info.sh\n@@ -5,7 +5,6 @@ test_description='undoing resolution'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n check_resolve_undo () {\ndiff --git a/t/t2050-git-dir-relative.sh b/t/t2050-git-dir-relative.sh\nindex 1f193cde965303a8f2362e824e0a86e99f746548..21f4659a9d1c22fcc8c9eb3261315d67988dad2f 100755\n--- a/t/t2050-git-dir-relative.sh\n+++ b/t/t2050-git-dir-relative.sh\n@@ -12,7 +12,6 @@ into the subdir while keeping the worktree location,\n and tries commits from the top and the subdir, checking\n that the commit-hook still gets called.'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n COMMIT_FILE=\"$(pwd)/output\"\ndiff --git a/t/t2060-switch.sh b/t/t2060-switch.sh\nindex 77b2346291b39cfe16c614e8018a20195e7f1118..c91c4db9361133e4e790f2c0201c5f41c14eaff1 100755\n--- a/t/t2060-switch.sh\n+++ b/t/t2060-switch.sh\n@@ -5,7 +5,6 @@ test_description='switch basic functionality'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t2070-restore.sh b/t/t2070-restore.sh\nindex ac404945d4c4e28b608f664f64c4b422557b2684..16d6348b692806ab25faf89d77a73cd62fab4d93 100755\n--- a/t/t2070-restore.sh\n+++ b/t/t2070-restore.sh\n@@ -5,7 +5,6 @@ test_description='restore basic functionality'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t2071-restore-patch.sh b/t/t2071-restore-patch.sh\nindex 42d552211915754e14ddb79d869fc9ba8f517fce..27e85be40ad6957f9070a609d83ae334776ed855 100755\n--- a/t/t2071-restore-patch.sh\n+++ b/t/t2071-restore-patch.sh\n@@ -2,7 +2,6 @@\n \n test_description='git restore --patch'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./lib-patch-mode.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t2072-restore-pathspec-file.sh b/t/t2072-restore-pathspec-file.sh\nindex 86c9c887881b94a586dc96b3f495a72c022fd827..8198a1e5789cc963c32ecb028209a7a773144fd5 100755\n--- a/t/t2072-restore-pathspec-file.sh\n+++ b/t/t2072-restore-pathspec-file.sh\n@@ -2,7 +2,6 @@\n \n test_description='restore --pathspec-from-file'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_tick\ndiff --git a/t/t2080-parallel-checkout-basics.sh b/t/t2080-parallel-checkout-basics.sh\nindex 59e5570cb2d52298ba1c1045d2baef025fd86baf..5ffe1a41e2cd726e00b242a9f289c28c183ef5f0 100755\n--- a/t/t2080-parallel-checkout-basics.sh\n+++ b/t/t2080-parallel-checkout-basics.sh\n@@ -8,7 +8,6 @@ working tree.\n '\n \n TEST_NO_CREATE_REPO=1\n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY/lib-parallel-checkout.sh\"\n \ndiff --git a/t/t2081-parallel-checkout-collisions.sh b/t/t2081-parallel-checkout-collisions.sh\nindex 6acdb89d12bd046674c27aba12119a231dbb0f08..f6fcfc0c1e403930a602e694fe3bf7632b81192a 100755\n--- a/t/t2081-parallel-checkout-collisions.sh\n+++ b/t/t2081-parallel-checkout-collisions.sh\n@@ -11,7 +11,6 @@ The tests in this file exercise parallel checkout's collision detection code in\n both these mechanics.\n \"\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY/lib-parallel-checkout.sh\"\n \ndiff --git a/t/t2082-parallel-checkout-attributes.sh b/t/t2082-parallel-checkout-attributes.sh\nindex d02d6a555040c8fde2eb13ba1a990f1d6ce93fca..79fb11f139a2c105f4b86ba0147306166b9ddae9 100755\n--- a/t/t2082-parallel-checkout-attributes.sh\n+++ b/t/t2082-parallel-checkout-attributes.sh\n@@ -10,7 +10,6 @@ properly (without access to the index or attribute stack).\n '\n \n TEST_NO_CREATE_REPO=1\n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY/lib-parallel-checkout.sh\"\n . \"$TEST_DIRECTORY/lib-encoding.sh\"\ndiff --git a/t/t2100-update-cache-badpath.sh b/t/t2100-update-cache-badpath.sh\nindex 7915e7b8211dbb16f49c9f1e5f0433c6f3230e58..2df3fdde8bf665a2b531dd367b70a7a767ee3dbc 100755\n--- a/t/t2100-update-cache-badpath.sh\n+++ b/t/t2100-update-cache-badpath.sh\n@@ -22,7 +22,6 @@ and tries to git update-index --add the following:\n All of the attempts should fail.\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n mkdir path2 path3\ndiff --git a/t/t2101-update-index-reupdate.sh b/t/t2101-update-index-reupdate.sh\nindex e3c7acdbf9125d68d72d983ed692ce6851f785bd..6c32d42c8c688845682d578141dbef760a663215 100755\n--- a/t/t2101-update-index-reupdate.sh\n+++ b/t/t2101-update-index-reupdate.sh\n@@ -6,7 +6,6 @@\n test_description='git update-index --again test.\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'update-index --add' '\ndiff --git a/t/t2102-update-index-symlinks.sh b/t/t2102-update-index-symlinks.sh\nindex c49cdfb6e582f41ea4010df7f4556f7aad5f1cc4..9b11130ab93a327f9c5e57cbe37062e3e095dbee 100755\n--- a/t/t2102-update-index-symlinks.sh\n+++ b/t/t2102-update-index-symlinks.sh\n@@ -8,7 +8,6 @@ test_description='git update-index on filesystem w/o symlinks test.\n This tests that git update-index keeps the symbolic link property\n even if a plain file is in the working tree if core.symlinks is false.'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success \\\ndiff --git a/t/t2103-update-index-ignore-missing.sh b/t/t2103-update-index-ignore-missing.sh\nindex e9451cd567cd61ffb678ee33d3c01e646b4cbe3a..6938ecca86836660ea3f4e7d74a7ba2ca2913606 100755\n--- a/t/t2103-update-index-ignore-missing.sh\n+++ b/t/t2103-update-index-ignore-missing.sh\n@@ -2,7 +2,6 @@\n \n test_description='update-index with options'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success basics '\ndiff --git a/t/t2104-update-index-skip-worktree.sh b/t/t2104-update-index-skip-worktree.sh\nindex 7ec7f30b442b3bc04be5ac64cbf1898c0b5268b6..7a0778ed983a509a8fc65f06901b4c37ba4db0ee 100755\n--- a/t/t2104-update-index-skip-worktree.sh\n+++ b/t/t2104-update-index-skip-worktree.sh\n@@ -5,7 +5,6 @@\n \n test_description='skip-worktree bit test'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n sane_unset GIT_TEST_SPLIT_INDEX\ndiff --git a/t/t2105-update-index-gitfile.sh b/t/t2105-update-index-gitfile.sh\nindex 963ebe77eb6b49b733f249b4ee93020b35ca4097..a7f3d47aec2591f9da19ce24b2796005ddf87096 100755\n--- a/t/t2105-update-index-gitfile.sh\n+++ b/t/t2105-update-index-gitfile.sh\n@@ -6,7 +6,6 @@\n test_description='git update-index for gitlink to .git file.\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'submodule with absolute .git file' '\ndiff --git a/t/t2106-update-index-assume-unchanged.sh b/t/t2106-update-index-assume-unchanged.sh\nindex 95c004dc5c5462b8b18cf348e5b1c44115a73042..6b2ccc21a937dff83c7f408f06d4fe8355c81f4a 100755\n--- a/t/t2106-update-index-assume-unchanged.sh\n+++ b/t/t2106-update-index-assume-unchanged.sh\n@@ -3,7 +3,6 @@\n test_description='git update-index --assume-unchanged test.\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t2107-update-index-basic.sh b/t/t2107-update-index-basic.sh\nindex f0eab13f96a6b946f982db2543112cc7467d857d..cc72ead79f397873b5005196a99baad6b0ba2450 100755\n--- a/t/t2107-update-index-basic.sh\n+++ b/t/t2107-update-index-basic.sh\n@@ -5,7 +5,6 @@ test_description='basic update-index tests\n Tests for command-line parsing and basic operation.\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'update-index --nonsense fails' '\ndiff --git a/t/t2108-update-index-refresh-racy.sh b/t/t2108-update-index-refresh-racy.sh\nindex bc5f2886faf8877fc13adecd607b41f46d69b6d1..b31dd8ece5023ee7bcb122739997b07315c1f5d7 100755\n--- a/t/t2108-update-index-refresh-racy.sh\n+++ b/t/t2108-update-index-refresh-racy.sh\n@@ -2,7 +2,6 @@\n \n test_description='update-index refresh tests related to racy timestamps'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n reset_files () {\ndiff --git a/t/t2200-add-update.sh b/t/t2200-add-update.sh\nindex df235ac306e7126f7090bc62c451e906b174c387..06e83d33333dc8e11c48fdf33bd255ea66a41ec8 100755\n--- a/t/t2200-add-update.sh\n+++ b/t/t2200-add-update.sh\n@@ -14,7 +14,6 @@ only the updates to dir/sub.\n Also tested are \"git add -u\" without limiting, and \"git add -u\"\n without contents changes, and other conditions'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t2201-add-update-typechange.sh b/t/t2201-add-update-typechange.sh\nindex dba62d69c6c5c18172bdbc62c5138643cf284b00..687be974d413a1f50e0f25377d9ff3f30af47ec2 100755\n--- a/t/t2201-add-update-typechange.sh\n+++ b/t/t2201-add-update-typechange.sh\n@@ -2,7 +2,6 @@\n \n test_description='more git add -u'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t2202-add-addremove.sh b/t/t2202-add-addremove.sh\nindex 24c60bfd7905ba136ad59f090b40fe23a37d0a1e..9ee659098c45fbc18dfb5ccc2292f978320c1ebb 100755\n--- a/t/t2202-add-addremove.sh\n+++ b/t/t2202-add-addremove.sh\n@@ -2,7 +2,6 @@\n \n test_description='git add --all'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t2203-add-intent.sh b/t/t2203-add-intent.sh\nindex 8fa44a92a277f414018d3f71731f791ec4b4f490..192ad14b5f474f7718ff57b4f6700d0f7d93649a 100755\n--- a/t/t2203-add-intent.sh\n+++ b/t/t2203-add-intent.sh\n@@ -2,7 +2,6 @@\n \n test_description='Intent to add'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'intent to add' '\ndiff --git a/t/t2204-add-ignored.sh b/t/t2204-add-ignored.sh\nindex b7cf1e492c1073ee3fb4705bf8755d8b49c3d6d0..31eb233df51f5e7f145764a3aa8c5b1fd7142f80 100755\n--- a/t/t2204-add-ignored.sh\n+++ b/t/t2204-add-ignored.sh\n@@ -2,7 +2,6 @@\n \n test_description='giving ignored paths to git add'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t2205-add-worktree-config.sh b/t/t2205-add-worktree-config.sh\nindex 98265ba1b495eb91df0fa60467ebf0ac932cf1b5..43d950de6400fca709286c5316e71e037791f04f 100755\n--- a/t/t2205-add-worktree-config.sh\n+++ b/t/t2205-add-worktree-config.sh\n@@ -17,7 +17,6 @@ outside the repository.  Two instances for which this can occur are tested:\n \t   repository can be added to the index.\n \t'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success '1a: setup--config worktree' '\ndiff --git a/t/t2300-cd-to-toplevel.sh b/t/t2300-cd-to-toplevel.sh\nindex b40eeb263fe896a9553ef93f82e8a78b1dc2fb60..c8de6d8a1902209ef98ec0832296ed9060310429 100755\n--- a/t/t2300-cd-to-toplevel.sh\n+++ b/t/t2300-cd-to-toplevel.sh\n@@ -2,7 +2,6 @@\n \n test_description='cd_to_toplevel'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n EXEC_PATH=\"$(git --exec-path)\"\ndiff --git a/t/t2400-worktree-add.sh b/t/t2400-worktree-add.sh\nindex cfc4aeb1798c6d023909cec771e5b74e983af5ea..ba320dc4171aa7884591067c00853a955d84f4e8 100755\n--- a/t/t2400-worktree-add.sh\n+++ b/t/t2400-worktree-add.sh\n@@ -6,7 +6,6 @@ GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n TEST_CREATE_REPO_NO_TEMPLATE=1\n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n . \"$TEST_DIRECTORY\"/lib-rebase.sh\ndiff --git a/t/t2401-worktree-prune.sh b/t/t2401-worktree-prune.sh\nindex 976d048e3efc74be9cd909ce76d552b3944d2e10..aa5b42c0f7b9384641f7cb2b85728bd1a79c26c4 100755\n--- a/t/t2401-worktree-prune.sh\n+++ b/t/t2401-worktree-prune.sh\n@@ -5,7 +5,6 @@ test_description='prune $GIT_DIR/worktrees'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success initialize '\ndiff --git a/t/t2402-worktree-list.sh b/t/t2402-worktree-list.sh\nindex 33ea9cb21ba07c9563530b54da06753eaa993fe2..cb125ec2265b1dc378908079d859a7eac3dfc833 100755\n--- a/t/t2402-worktree-list.sh\n+++ b/t/t2402-worktree-list.sh\n@@ -5,7 +5,6 @@ test_description='test git worktree list'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t2403-worktree-move.sh b/t/t2403-worktree-move.sh\nindex 901342ea09b51a8e832f1109fbb737df84283aa2..08531deb5b203751489722802590d18b120d2015 100755\n--- a/t/t2403-worktree-move.sh\n+++ b/t/t2403-worktree-move.sh\n@@ -2,7 +2,6 @@\n \n test_description='test git worktree move, remove, lock and unlock'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t2404-worktree-config.sh b/t/t2404-worktree-config.sh\nindex 842937bfb9a8a660bf0696df324ec71f6693ae5b..9536d1091954b48a87b74eead0c382ce70355c4e 100755\n--- a/t/t2404-worktree-config.sh\n+++ b/t/t2404-worktree-config.sh\n@@ -2,7 +2,6 @@\n \n test_description=\"config file in multi worktree\"\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t2405-worktree-submodule.sh b/t/t2405-worktree-submodule.sh\nindex 1d7f60563387f9c2f53dfc3a79ac0289afe57611..11018f37c70c02e9052b36be9edb8b05211bcf8d 100755\n--- a/t/t2405-worktree-submodule.sh\n+++ b/t/t2405-worktree-submodule.sh\n@@ -5,7 +5,6 @@ test_description='Combination of submodules and multiple worktrees'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n base_path=$(pwd -P)\ndiff --git a/t/t2406-worktree-repair.sh b/t/t2406-worktree-repair.sh\nindex 7686e60f6ad186519b275f11a5e14064c905b207..bf340b877261b0201d321499da4d18cc6cf379d2 100755\n--- a/t/t2406-worktree-repair.sh\n+++ b/t/t2406-worktree-repair.sh\n@@ -2,7 +2,6 @@\n \n test_description='test git worktree repair'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t2407-worktree-heads.sh b/t/t2407-worktree-heads.sh\nindex 7750dc9265a90bdd8b0e3781accb13f00a23bb09..57c201869f02e6d9b763e004175d29d5769149b1 100755\n--- a/t/t2407-worktree-heads.sh\n+++ b/t/t2407-worktree-heads.sh\n@@ -2,7 +2,6 @@\n \n test_description='test operations trying to overwrite refs at worktree HEAD'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t2408-worktree-relative.sh b/t/t2408-worktree-relative.sh\nindex a3136db7e28cb20926ff44211e246ce625a6e51a..d51cc8c5ab7e4f51048afdb8ee8fbfcac3695042 100755\n--- a/t/t2408-worktree-relative.sh\n+++ b/t/t2408-worktree-relative.sh\n@@ -2,7 +2,6 @@\n \n test_description='test worktrees linked with relative paths'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'links worktrees with relative paths' '\ndiff --git a/t/t2500-untracked-overwriting.sh b/t/t2500-untracked-overwriting.sh\nindex 714feb83be5b36640008a96921b4b091e798df88..5c0bf4d21fcbb2a55e2c41c184ccb4c188c88ca4 100755\n--- a/t/t2500-untracked-overwriting.sh\n+++ b/t/t2500-untracked-overwriting.sh\n@@ -2,7 +2,6 @@\n \n test_description='Test handling of overwriting untracked files'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_setup_reset () {\ndiff --git a/t/t2501-cwd-empty.sh b/t/t2501-cwd-empty.sh\nindex 8af4e8cfe3c8414d2c8d676b5fec7f6bfcb6909a..f6d8d7d03d7ca42b566c2b177ee57345e09b7107 100755\n--- a/t/t2501-cwd-empty.sh\n+++ b/t/t2501-cwd-empty.sh\n@@ -2,7 +2,6 @@\n \n test_description='Test handling of the current working directory becoming empty'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t3000-ls-files-others.sh b/t/t3000-ls-files-others.sh\nindex 11af4552f7461e1091e71407517504a6497867e5..13f66fd649d81d9e7c620cf0693a82e041a2711a 100755\n--- a/t/t3000-ls-files-others.sh\n+++ b/t/t3000-ls-files-others.sh\n@@ -16,7 +16,6 @@ filesystem.\n     path4       - an empty directory\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup ' '\ndiff --git a/t/t3001-ls-files-others-exclude.sh b/t/t3001-ls-files-others-exclude.sh\nindex 1ed0aa967ece5a38cf49bc43178e4fba187d4cd4..4b676462852ab8436e1c72eb4ca759cfea2b8d34 100755\n--- a/t/t3001-ls-files-others-exclude.sh\n+++ b/t/t3001-ls-files-others-exclude.sh\n@@ -8,7 +8,6 @@ test_description='git ls-files --others --exclude\n This test runs git ls-files --others and tests --exclude patterns.\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n rm -fr one three\ndiff --git a/t/t3002-ls-files-dashpath.sh b/t/t3002-ls-files-dashpath.sh\nindex 4dd24550eba00ef005abea327ba1c1862768f3a1..31462cb441ef2fc4e2bab6e12a4e1aca9425ef4d 100755\n--- a/t/t3002-ls-files-dashpath.sh\n+++ b/t/t3002-ls-files-dashpath.sh\n@@ -13,7 +13,6 @@ filesystem.\n     --\t\t- another file with a funny name.\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t3003-ls-files-exclude.sh b/t/t3003-ls-files-exclude.sh\nindex 7933dff9b3849181b4c168096d166f1054a2a374..ac3c811f464c289f87536ea4dcbc2faf7b30f634 100755\n--- a/t/t3003-ls-files-exclude.sh\n+++ b/t/t3003-ls-files-exclude.sh\n@@ -2,7 +2,6 @@\n \n test_description='ls-files --exclude does not affect index files'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'create repo with file' '\ndiff --git a/t/t3004-ls-files-basic.sh b/t/t3004-ls-files-basic.sh\nindex 12e41a7b40e0ab73efa1fc30354e80996c3a91a4..a1078f8701dbfbc6a05237216f82eb334fb0b931 100755\n--- a/t/t3004-ls-files-basic.sh\n+++ b/t/t3004-ls-files-basic.sh\n@@ -6,7 +6,6 @@ This test runs git ls-files with various unusual or malformed\n command-line arguments.\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'ls-files in empty repository' '\ndiff --git a/t/t3005-ls-files-relative.sh b/t/t3005-ls-files-relative.sh\nindex fbfa210a50b2906e57853095a2830f3bc6e18136..db13aabf625b3aa26f4b5ca3dc2cf86f623c4e51 100755\n--- a/t/t3005-ls-files-relative.sh\n+++ b/t/t3005-ls-files-relative.sh\n@@ -5,7 +5,6 @@ test_description='ls-files tests with relative paths\n This test runs git ls-files with various relative path arguments.\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'prepare' '\ndiff --git a/t/t3006-ls-files-long.sh b/t/t3006-ls-files-long.sh\nindex 2aaf91ebc8c323a5ce4475bb8a7e03543dc319ad..22c7256c3aec853cc67aca7feca5600d656d7c3b 100755\n--- a/t/t3006-ls-files-long.sh\n+++ b/t/t3006-ls-files-long.sh\n@@ -2,7 +2,6 @@\n \n test_description='overly long paths'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t3007-ls-files-recurse-submodules.sh b/t/t3007-ls-files-recurse-submodules.sh\nindex f04bdc8c78b6e852d04ab4b93446248e40459f13..61771eec830c0688587588ee0a334282effdb1bb 100755\n--- a/t/t3007-ls-files-recurse-submodules.sh\n+++ b/t/t3007-ls-files-recurse-submodules.sh\n@@ -6,7 +6,6 @@ This test verifies the recurse-submodules feature correctly lists files from\n submodules.\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup directory structure and submodules' '\ndiff --git a/t/t3008-ls-files-lazy-init-name-hash.sh b/t/t3008-ls-files-lazy-init-name-hash.sh\nindex 51d3dffaa66528ff36ebe7b6660f823a2fe56371..85f370495876f51691322f3556b944a023ad8388 100755\n--- a/t/t3008-ls-files-lazy-init-name-hash.sh\n+++ b/t/t3008-ls-files-lazy-init-name-hash.sh\n@@ -2,7 +2,6 @@\n \n test_description='Test the lazy init name hash with various folder structures'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n if test 1 -eq $(test-tool online-cpus)\ndiff --git a/t/t3009-ls-files-others-nonsubmodule.sh b/t/t3009-ls-files-others-nonsubmodule.sh\nindex 14218b342437788fef40c539c45fb41575ef0071..963f3462b750b2a4fc7d009df6cf1fa1949090d6 100755\n--- a/t/t3009-ls-files-others-nonsubmodule.sh\n+++ b/t/t3009-ls-files-others-nonsubmodule.sh\n@@ -18,7 +18,6 @@ This test runs git ls-files --others with the following working tree:\n       git repository with a commit and an untracked file\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup: directories' '\ndiff --git a/t/t3010-ls-files-killed-modified.sh b/t/t3010-ls-files-killed-modified.sh\nindex 054178703d732403ce32eda9871d8d85c47dddaa..7af4532cd1dfd063f554f3b049052d27006db483 100755\n--- a/t/t3010-ls-files-killed-modified.sh\n+++ b/t/t3010-ls-files-killed-modified.sh\n@@ -42,7 +42,6 @@ We should report path0, path1, path2/file2, path3/file3, path7 and path8\n modified without reporting path9 and path10.  submod1 is also modified.\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'git update-index --add to add various paths.' '\ndiff --git a/t/t3011-common-prefixes-and-directory-traversal.sh b/t/t3011-common-prefixes-and-directory-traversal.sh\nindex 69e44c387fa83c576e80854424da694c8afa299c..3da5b2b6e795ec4587608ead8bc10abf0c6d9039 100755\n--- a/t/t3011-common-prefixes-and-directory-traversal.sh\n+++ b/t/t3011-common-prefixes-and-directory-traversal.sh\n@@ -2,7 +2,6 @@\n \n test_description='directory traversal handling, especially with common prefixes'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t3012-ls-files-dedup.sh b/t/t3012-ls-files-dedup.sh\nindex 190e2f6eed758229579a85118106e80d05c8d7d8..2682b1f43a666564a6f74bd20deca547f721ac34 100755\n--- a/t/t3012-ls-files-dedup.sh\n+++ b/t/t3012-ls-files-dedup.sh\n@@ -2,7 +2,6 @@\n \n test_description='git ls-files --deduplicate test'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t3013-ls-files-format.sh b/t/t3013-ls-files-format.sh\nindex 6e6ea0b6f3ca256eb3903b08ca7025e3508ecb0b..8bdaacd85ace3d871b4e8f188f77f5a889f252ea 100755\n--- a/t/t3013-ls-files-format.sh\n+++ b/t/t3013-ls-files-format.sh\n@@ -2,7 +2,6 @@\n \n test_description='git ls-files --format test'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n for flag in -s -o -k -t --resolve-undo --deduplicate --eol\ndiff --git a/t/t3020-ls-files-error-unmatch.sh b/t/t3020-ls-files-error-unmatch.sh\nindex 133593d23c0e898b41f697831d4f41dcbbf54d6c..ac82c9cee8a0f3267b7258c10857a4b46f485a98 100755\n--- a/t/t3020-ls-files-error-unmatch.sh\n+++ b/t/t3020-ls-files-error-unmatch.sh\n@@ -10,7 +10,6 @@ returns an error when a non-existent path is provided on the command\n line.\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t3040-subprojects-basic.sh b/t/t3040-subprojects-basic.sh\nindex bd65dfcffc7b80e6dceb1603a189d07ab0d4b0b3..768d702fbbfb4a4684904db59d3a664f07b5a452 100755\n--- a/t/t3040-subprojects-basic.sh\n+++ b/t/t3040-subprojects-basic.sh\n@@ -2,7 +2,6 @@\n \n test_description='Basic subproject functionality'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup: create superproject' '\ndiff --git a/t/t3050-subprojects-fetch.sh b/t/t3050-subprojects-fetch.sh\nindex 3884694165525b9e4a3d8527785f40758817be53..f1f09abdd9b254eed1efa6b0d06369f3c8606cf8 100755\n--- a/t/t3050-subprojects-fetch.sh\n+++ b/t/t3050-subprojects-fetch.sh\n@@ -2,7 +2,6 @@\n \n test_description='fetching and pushing project with subproject'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t3060-ls-files-with-tree.sh b/t/t3060-ls-files-with-tree.sh\nindex 5a06732ca730f4a4becff478cc96f20b8931f6fc..eb69da61fe7cd17dd4cc875181935e45d15931a8 100755\n--- a/t/t3060-ls-files-with-tree.sh\n+++ b/t/t3060-ls-files-with-tree.sh\n@@ -9,7 +9,6 @@ This test runs git ls-files --with-tree and in particular in\n a scenario known to trigger a crash with some versions of git.\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t3070-wildmatch.sh b/t/t3070-wildmatch.sh\nindex 4dd42df38c25615e0833b754d1a2c3132ef0bf1d..3da824117c61fd6d390f84ae56d631fe5d0d9071 100755\n--- a/t/t3070-wildmatch.sh\n+++ b/t/t3070-wildmatch.sh\n@@ -2,7 +2,6 @@\n \n test_description='wildmatch tests'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n should_create_test_file() {\ndiff --git a/t/t3100-ls-tree-restrict.sh b/t/t3100-ls-tree-restrict.sh\nindex 436de44971eca5d7cbbe79d45ff2a59cf51329eb..8f294d983267f394891340962dce944bb07bed71 100755\n--- a/t/t3100-ls-tree-restrict.sh\n+++ b/t/t3100-ls-tree-restrict.sh\n@@ -17,7 +17,6 @@ The new path restriction code should do the right thing for path2 and\n path2/baz.  Also path0/ should snow nothing.\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success \\\ndiff --git a/t/t3101-ls-tree-dirname.sh b/t/t3101-ls-tree-dirname.sh\nindex 5af2dac0e4b8d5fde4d6a11dae240086473e0571..ac44525810f977fca606034bc1eb8adb58219a7e 100755\n--- a/t/t3101-ls-tree-dirname.sh\n+++ b/t/t3101-ls-tree-dirname.sh\n@@ -20,7 +20,6 @@ Test the handling of multiple directories which have matching file\n entries.  Also test odd filename and missing entries handling.\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t3102-ls-tree-wildcards.sh b/t/t3102-ls-tree-wildcards.sh\nindex 3942db229000e0c367a93b200f30c57bba95e7ee..1e16c6b8ea610c4582e63950b8939205fc228b25 100755\n--- a/t/t3102-ls-tree-wildcards.sh\n+++ b/t/t3102-ls-tree-wildcards.sh\n@@ -2,7 +2,6 @@\n \n test_description='ls-tree with(out) globs'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t3103-ls-tree-misc.sh b/t/t3103-ls-tree-misc.sh\nindex 81c6343962381fc17b1bff4d3ca8958951bde70d..e7636f6908f19fe041246a644616b35cc99b5e13 100755\n--- a/t/t3103-ls-tree-misc.sh\n+++ b/t/t3103-ls-tree-misc.sh\n@@ -7,7 +7,6 @@ Miscellaneous tests for git ls-tree.\n \n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t3104-ls-tree-format.sh b/t/t3104-ls-tree-format.sh\nindex 3adb206a93bc58aac509a1f093f9dd86cb98e5be..a1b2069a256aab83a8f6ad0469d4c23eccc3ecc9 100755\n--- a/t/t3104-ls-tree-format.sh\n+++ b/t/t3104-ls-tree-format.sh\n@@ -2,7 +2,6 @@\n \n test_description='ls-tree --format'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-t3100.sh\n \ndiff --git a/t/t3105-ls-tree-output.sh b/t/t3105-ls-tree-output.sh\nindex ce2391e28be6f213aead49ec1315e6f5f08fa25d..8bdf400682dae54a8f22e1ef6fbb84c28981b7fa 100755\n--- a/t/t3105-ls-tree-output.sh\n+++ b/t/t3105-ls-tree-output.sh\n@@ -2,7 +2,6 @@\n \n test_description='ls-tree output'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-t3100.sh\n \ndiff --git a/t/t3200-branch.sh b/t/t3200-branch.sh\nindex ccfa6a720d090c2f7f2a085f60065bdcfaf8d1d9..2295db3dcb018cb1dcf2ad461e9f29b9ccb98a6d 100755\n--- a/t/t3200-branch.sh\n+++ b/t/t3200-branch.sh\n@@ -8,7 +8,6 @@ test_description='git branch assorted tests'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-rebase.sh\n \ndiff --git a/t/t3201-branch-contains.sh b/t/t3201-branch-contains.sh\nindex 6e587d27d7a5e3867d27d05d300f7e8149e77587..800fc33165a9eff0abe1f6edc27acb2b4978e317 100755\n--- a/t/t3201-branch-contains.sh\n+++ b/t/t3201-branch-contains.sh\n@@ -2,7 +2,6 @@\n \n test_description='branch --contains <commit>, --no-contains <commit> --merged, and --no-merged'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t3202-show-branch.sh b/t/t3202-show-branch.sh\nindex 3b6dad0c4661505b6c26ee111eb351efd3d0caca..a1139f79e2ccfdff2b562571bdd8bdf8aa974883 100755\n--- a/t/t3202-show-branch.sh\n+++ b/t/t3202-show-branch.sh\n@@ -2,7 +2,6 @@\n \n test_description='test show-branch'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'error descriptions on empty repository' '\ndiff --git a/t/t3203-branch-output.sh b/t/t3203-branch-output.sh\nindex e627f08a1790b39ea6d21d29cb769a8d58ceb580..500c9d0e727a2989ef0c37c71890d057f0d90819 100755\n--- a/t/t3203-branch-output.sh\n+++ b/t/t3203-branch-output.sh\n@@ -2,7 +2,6 @@\n \n test_description='git branch display tests'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-terminal.sh\n \ndiff --git a/t/t3204-branch-name-interpretation.sh b/t/t3204-branch-name-interpretation.sh\nindex 594e3e43e129a8848b5f2e65538087ca978743d6..3399344f25dc859ad743b3914a3f5c37e92bffbb 100755\n--- a/t/t3204-branch-name-interpretation.sh\n+++ b/t/t3204-branch-name-interpretation.sh\n@@ -9,7 +9,6 @@ This script aims to check the behavior of those corner cases.\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n expect_branch() {\ndiff --git a/t/t3205-branch-color.sh b/t/t3205-branch-color.sh\nindex 0b61da92b37763213e4cee3744f127971cb6fcb1..da1c202fa7134500a317f03f7baa5de1dc1d6da2 100755\n--- a/t/t3205-branch-color.sh\n+++ b/t/t3205-branch-color.sh\n@@ -1,7 +1,6 @@\n #!/bin/sh\n \n test_description='basic branch output coloring'\n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'set up some sample branches' '\ndiff --git a/t/t3206-range-diff.sh b/t/t3206-range-diff.sh\nindex 86010931ab6243e0e617b14cae0eb63975edee7d..d2ca43d6aab504a4802535e07cb9808f33cdcdca 100755\n--- a/t/t3206-range-diff.sh\n+++ b/t/t3206-range-diff.sh\n@@ -5,7 +5,6 @@ test_description='range-diff tests'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n # Note that because of the range-diff's heuristics, test_commit does more\ndiff --git a/t/t3207-branch-submodule.sh b/t/t3207-branch-submodule.sh\nindex 904eea7df598f7d4b6c03ce000c0db2a44556324..fe72b247164e56fc9a7af134583e2b9f8cc9bbdc 100755\n--- a/t/t3207-branch-submodule.sh\n+++ b/t/t3207-branch-submodule.sh\n@@ -5,7 +5,6 @@ test_description='git branch submodule tests'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-rebase.sh\n \ndiff --git a/t/t3211-peel-ref.sh b/t/t3211-peel-ref.sh\nindex 9cbc34fc5838b4d4a886135352e92d613ca8146a..37b9d26f4b6ba88396a2aaaecd4675470cfaa581 100755\n--- a/t/t3211-peel-ref.sh\n+++ b/t/t3211-peel-ref.sh\n@@ -4,7 +4,6 @@ test_description='tests for the peel_ref optimization of packed-refs'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'create annotated tag in refs/tags' '\ndiff --git a/t/t3300-funny-names.sh b/t/t3300-funny-names.sh\nindex d3ac826283e1a16315bb158754224067d5b0afe4..f5bf16abcd8ce2aae5929129913cbb8927b06539 100755\n--- a/t/t3300-funny-names.sh\n+++ b/t/t3300-funny-names.sh\n@@ -9,7 +9,6 @@ This test tries pathnames with funny characters in the working\n tree, index, and tree objects.\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n HT='\t'\ndiff --git a/t/t3301-notes.sh b/t/t3301-notes.sh\nindex 813dfd8db9759e90fed510734848e9dd28582549..d6c50460d08648622c519cca690ef21e32a23179 100755\n--- a/t/t3301-notes.sh\n+++ b/t/t3301-notes.sh\n@@ -5,7 +5,6 @@\n \n test_description='Test commit notes'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n write_script fake_editor <<\\EOF\ndiff --git a/t/t3302-notes-index-expensive.sh b/t/t3302-notes-index-expensive.sh\nindex d0c4d38b4d485d0b3faef4cdc7acbeb42b3c929c..bb5fea02a03a563a23e806d80dbb88a673c40802 100755\n--- a/t/t3302-notes-index-expensive.sh\n+++ b/t/t3302-notes-index-expensive.sh\n@@ -8,7 +8,6 @@ test_description='Test commit notes index (expensive!)'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n create_repo () {\ndiff --git a/t/t3303-notes-subtrees.sh b/t/t3303-notes-subtrees.sh\nindex bc9b791d1b9ed2a780de4544232f769e093072b1..eac193757bf1a5cd27ed4d54249a41de7b302bde 100755\n--- a/t/t3303-notes-subtrees.sh\n+++ b/t/t3303-notes-subtrees.sh\n@@ -5,7 +5,6 @@ test_description='Test commit notes organized in subtrees'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n number_of_commits=100\ndiff --git a/t/t3304-notes-mixed.sh b/t/t3304-notes-mixed.sh\nindex 2c3a2452668c514ce40c107537cc4e0c1abe5312..03dfcd3954cee5402dde186c6edd17b47db211dd 100755\n--- a/t/t3304-notes-mixed.sh\n+++ b/t/t3304-notes-mixed.sh\n@@ -5,7 +5,6 @@ test_description='Test notes trees that also contain non-notes'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n number_of_commits=100\ndiff --git a/t/t3305-notes-fanout.sh b/t/t3305-notes-fanout.sh\nindex 1ec1fb6715efda8a0ec546956a0deece76efefff..fcecdc94ff74c21f69435237ebc504d4328faaa0 100755\n--- a/t/t3305-notes-fanout.sh\n+++ b/t/t3305-notes-fanout.sh\n@@ -2,7 +2,6 @@\n \n test_description='Test that adding/removing many notes triggers automatic fanout restructuring'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n path_has_fanout() {\ndiff --git a/t/t3306-notes-prune.sh b/t/t3306-notes-prune.sh\nindex b6e9f643e3cd8d4a81d63e721c5a16390b879e05..8f4102ff9e446bce66436b5e7046c84d739c226f 100755\n--- a/t/t3306-notes-prune.sh\n+++ b/t/t3306-notes-prune.sh\n@@ -2,7 +2,6 @@\n \n test_description='Test git notes prune'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup: create a few commits with notes' '\ndiff --git a/t/t3307-notes-man.sh b/t/t3307-notes-man.sh\nindex ae316502c4531b7cdadfddff12e2f95ea7c9797c..1aa366a410e9a3e2ad4c2fa84431198fbb553a5f 100755\n--- a/t/t3307-notes-man.sh\n+++ b/t/t3307-notes-man.sh\n@@ -4,7 +4,6 @@ test_description='Examples from the git-notes man page\n \n Make sure the manual is not full of lies.'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t3308-notes-merge.sh b/t/t3308-notes-merge.sh\nindex e1d05ff6bc986a05bc42f02e2e86d78ddedd7aed..202702be1a78b7bb631952dc36af9a1cb69c2ecf 100755\n--- a/t/t3308-notes-merge.sh\n+++ b/t/t3308-notes-merge.sh\n@@ -5,7 +5,6 @@\n \n test_description='Test merging of notes trees'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t3309-notes-merge-auto-resolve.sh b/t/t3309-notes-merge-auto-resolve.sh\nindex f55277f499dd57661e166bf3487c792df1cb1bf3..9bd5dbf341fd81a80dbebf0e1fafe623defecfa4 100755\n--- a/t/t3309-notes-merge-auto-resolve.sh\n+++ b/t/t3309-notes-merge-auto-resolve.sh\n@@ -5,7 +5,6 @@\n \n test_description='Test notes merging with auto-resolving strategies'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n # Set up a notes merge scenario with all kinds of potential conflicts\ndiff --git a/t/t3310-notes-merge-manual-resolve.sh b/t/t3310-notes-merge-manual-resolve.sh\nindex 04866b89bed3146fe9506c748c0b824ef70b12b3..597df5ebc0a582018d30c018e734d1154c364ed6 100755\n--- a/t/t3310-notes-merge-manual-resolve.sh\n+++ b/t/t3310-notes-merge-manual-resolve.sh\n@@ -5,7 +5,6 @@\n \n test_description='Test notes merging with manual conflict resolution'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n # Set up a notes merge scenario with different kinds of conflicts\ndiff --git a/t/t3311-notes-merge-fanout.sh b/t/t3311-notes-merge-fanout.sh\nindex ce4144db0f24c7bd9ccbbe30575118b565bb4486..5b675417e9bbf9d21cac561473c90622b08def5a 100755\n--- a/t/t3311-notes-merge-fanout.sh\n+++ b/t/t3311-notes-merge-fanout.sh\n@@ -5,7 +5,6 @@\n \n test_description='Test notes merging at various fanout levels'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n verify_notes () {\ndiff --git a/t/t3320-notes-merge-worktrees.sh b/t/t3320-notes-merge-worktrees.sh\nindex 0fd33280cf91f7fe9384205df8b7570363a37076..96243b722224209e33fcc88fea10bd600852b377 100755\n--- a/t/t3320-notes-merge-worktrees.sh\n+++ b/t/t3320-notes-merge-worktrees.sh\n@@ -8,7 +8,6 @@ test_description='Test merging of notes trees in multiple worktrees'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup commit' '\ndiff --git a/t/t3321-notes-stripspace.sh b/t/t3321-notes-stripspace.sh\nindex beca34605672d407244b26ebcffb1f70527f5915..c4a7839540a99e047a99908d776d1aecd641146c 100755\n--- a/t/t3321-notes-stripspace.sh\n+++ b/t/t3321-notes-stripspace.sh\n@@ -5,7 +5,6 @@\n \n test_description='Test commit notes with stripspace behavior'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n MULTI_LF=\"$LF$LF$LF\"\ndiff --git a/t/t3400-rebase.sh b/t/t3400-rebase.sh\nindex 09f230eefb2cbc03a6b8f85e0f5c39cfcb2467d5..bab675938a3e06dc632bb7a9dcd1dac65f0c21e9 100755\n--- a/t/t3400-rebase.sh\n+++ b/t/t3400-rebase.sh\n@@ -11,7 +11,6 @@ among other things.\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n GIT_AUTHOR_NAME=author@name\ndiff --git a/t/t3401-rebase-and-am-rename.sh b/t/t3401-rebase-and-am-rename.sh\nindex 328c1d3a3f45bcf2a2c153c94556d0b56fb5bbce..f18bae94507587a4dc9118cc3d508902e02c6bc1 100755\n--- a/t/t3401-rebase-and-am-rename.sh\n+++ b/t/t3401-rebase-and-am-rename.sh\n@@ -2,7 +2,6 @@\n \n test_description='git rebase + directory rename tests'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-rebase.sh\n \ndiff --git a/t/t3402-rebase-merge.sh b/t/t3402-rebase-merge.sh\nindex 5c67d07ba3ecf6333d1967c341d9bfb75fc33769..761de63b6b982286c3ecb0c821d38920d0be7bf6 100755\n--- a/t/t3402-rebase-merge.sh\n+++ b/t/t3402-rebase-merge.sh\n@@ -8,7 +8,6 @@ test_description='git rebase --merge test'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n T=\"A quick brown fox\ndiff --git a/t/t3403-rebase-skip.sh b/t/t3403-rebase-skip.sh\nindex 4f1d6e8ea642e1a2f6b624ad333385e11036dcba..a1911c4a9d60e71f99d66ef6d7f30728ab8732df 100755\n--- a/t/t3403-rebase-skip.sh\n+++ b/t/t3403-rebase-skip.sh\n@@ -8,7 +8,6 @@ test_description='git rebase --merge --skip tests'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n . \"$TEST_DIRECTORY\"/lib-rebase.sh\ndiff --git a/t/t3404-rebase-interactive.sh b/t/t3404-rebase-interactive.sh\nindex 77cceda14a024b5144b426b66c41961beef935e7..b11f04eb3349b7fe489ef99996d972902ef45711 100755\n--- a/t/t3404-rebase-interactive.sh\n+++ b/t/t3404-rebase-interactive.sh\n@@ -26,7 +26,6 @@ Initial setup:\n  touch file \"conflict\".\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n . \"$TEST_DIRECTORY\"/lib-rebase.sh\ndiff --git a/t/t3405-rebase-malformed.sh b/t/t3405-rebase-malformed.sh\nindex 8979bc340734f860f56c49a4380366dca1d46ee8..2524331861869d6b9ee9f80082c09d2ed089e8fe 100755\n--- a/t/t3405-rebase-malformed.sh\n+++ b/t/t3405-rebase-malformed.sh\n@@ -5,7 +5,6 @@ test_description='rebase should handle arbitrary git message'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-rebase.sh\n \ndiff --git a/t/t3406-rebase-message.sh b/t/t3406-rebase-message.sh\nindex 82108b67e67c18230c385dfef03f7bdee37f9eb2..a1d7fa7f7c6965f49cc017303aca52a658211b10 100755\n--- a/t/t3406-rebase-message.sh\n+++ b/t/t3406-rebase-message.sh\n@@ -5,7 +5,6 @@ test_description='messages from rebase operation'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t3407-rebase-abort.sh b/t/t3407-rebase-abort.sh\nindex 2c3f38d45a848260995967cfce91a38cacfe82ee..9f49c4228b629589d7bfcf3435fda8e7c4b308be 100755\n--- a/t/t3407-rebase-abort.sh\n+++ b/t/t3407-rebase-abort.sh\n@@ -5,7 +5,6 @@ test_description='git rebase --abort tests'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t3408-rebase-multi-line.sh b/t/t3408-rebase-multi-line.sh\nindex 7b4607d72f2748df9d0800a5e471e4af1d6ae32a..cde3562e3a64f756544763107d9c607eaa4f38ca 100755\n--- a/t/t3408-rebase-multi-line.sh\n+++ b/t/t3408-rebase-multi-line.sh\n@@ -5,7 +5,6 @@ test_description='rebasing a commit with multi-line first paragraph.'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t3409-rebase-environ.sh b/t/t3409-rebase-environ.sh\nindex acaf5558dbe2e445efe2989e137b2f9ef5140aaf..83ffb39d9ffdfd869ecb24e5adbbe11944a73c53 100755\n--- a/t/t3409-rebase-environ.sh\n+++ b/t/t3409-rebase-environ.sh\n@@ -2,7 +2,6 @@\n \n test_description='git rebase interactive environment'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t3412-rebase-root.sh b/t/t3412-rebase-root.sh\nindex e75b3d0e07cb13b5d8b4fd3b83b07c35eeddce49..58371d8a5477f47d53384a84ad0dae14457128d9 100755\n--- a/t/t3412-rebase-root.sh\n+++ b/t/t3412-rebase-root.sh\n@@ -7,7 +7,6 @@ Tests if git rebase --root --onto <newparent> can rebase the root commit.\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n log_with_names () {\ndiff --git a/t/t3413-rebase-hook.sh b/t/t3413-rebase-hook.sh\nindex 426ff098e1dc738a57299a6499bf89174979db37..b4ff614987ed6270dc836f34a6e921bc8bb9b1d3 100755\n--- a/t/t3413-rebase-hook.sh\n+++ b/t/t3413-rebase-hook.sh\n@@ -5,7 +5,6 @@ test_description='git rebase with its hook(s)'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t3415-rebase-autosquash.sh b/t/t3415-rebase-autosquash.sh\nindex 22452ff84cb339936cf2efcb1b4147655943eeff..fcc40d6fe1fd5b2a9c4f2a5e4ede15e73c247790 100755\n--- a/t/t3415-rebase-autosquash.sh\n+++ b/t/t3415-rebase-autosquash.sh\n@@ -5,7 +5,6 @@ test_description='auto squash'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n . \"$TEST_DIRECTORY\"/lib-rebase.sh\ndiff --git a/t/t3416-rebase-onto-threedots.sh b/t/t3416-rebase-onto-threedots.sh\nindex f8c4ed78c9ef7ffd0fa970525bf3cab47842b55a..ea501f2b42b8cc43394192d11051992605bfb619 100755\n--- a/t/t3416-rebase-onto-threedots.sh\n+++ b/t/t3416-rebase-onto-threedots.sh\n@@ -5,7 +5,6 @@ test_description='git rebase --onto A...B'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY/lib-rebase.sh\"\n \ndiff --git a/t/t3417-rebase-whitespace-fix.sh b/t/t3417-rebase-whitespace-fix.sh\nindex 22ee3a204598cfed88dead7f00f7de548c94cb85..96f2cf22fafd4795e54928b14b5c2b4b2333e8f3 100755\n--- a/t/t3417-rebase-whitespace-fix.sh\n+++ b/t/t3417-rebase-whitespace-fix.sh\n@@ -5,7 +5,6 @@ test_description='git rebase --whitespace=fix\n This test runs git rebase --whitespace=fix and make sure that it works.\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n # prepare initial revision of \"file\" with a blank line at the end\ndiff --git a/t/t3418-rebase-continue.sh b/t/t3418-rebase-continue.sh\nindex c0d29c2154f0b4eff481352fd1acb0bb1f3c2331..127216f7225aa412022bb0f296f716c42ce15f56 100755\n--- a/t/t3418-rebase-continue.sh\n+++ b/t/t3418-rebase-continue.sh\n@@ -5,7 +5,6 @@ test_description='git rebase --continue tests'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n . \"$TEST_DIRECTORY\"/lib-rebase.sh\ndiff --git a/t/t3419-rebase-patch-id.sh b/t/t3419-rebase-patch-id.sh\nindex 6c61f240cf9874bbdb0190739b66a1c0ed99289f..7181f176b8136504b4a9bc5e962cf358b00ffbba 100755\n--- a/t/t3419-rebase-patch-id.sh\n+++ b/t/t3419-rebase-patch-id.sh\n@@ -5,7 +5,6 @@ test_description='git rebase - test patch id computation'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n scramble () {\ndiff --git a/t/t3420-rebase-autostash.sh b/t/t3420-rebase-autostash.sh\nindex b43046b3b0dfb89740692a16f0e365d091590657..ad3ba6a9848f8a940a71cba1e11579d0e831a209 100755\n--- a/t/t3420-rebase-autostash.sh\n+++ b/t/t3420-rebase-autostash.sh\n@@ -7,7 +7,6 @@ test_description='git rebase --autostash tests'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t3421-rebase-topology-linear.sh b/t/t3421-rebase-topology-linear.sh\nindex 737af80bb3dbb205346a3b6ccedf6cbb34fbfab2..f5b7807abd089d05a009aea8e67c2a04b1d4f736 100755\n--- a/t/t3421-rebase-topology-linear.sh\n+++ b/t/t3421-rebase-topology-linear.sh\n@@ -2,7 +2,6 @@\n \n test_description='basic rebase topology tests'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-rebase.sh\n \ndiff --git a/t/t3422-rebase-incompatible-options.sh b/t/t3422-rebase-incompatible-options.sh\nindex b40f26250b7e3d8ce95b149589822bd57d84dbbe..b9408f9ba1285f404f148e7f9cade54affed2f0a 100755\n--- a/t/t3422-rebase-incompatible-options.sh\n+++ b/t/t3422-rebase-incompatible-options.sh\n@@ -2,7 +2,6 @@\n \n test_description='test if rebase detects and aborts on incompatible options'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t3423-rebase-reword.sh b/t/t3423-rebase-reword.sh\nindex 2fab703d615485020f0692bdc2d39748ba0f72d4..4859bb8f722314df2fdb67aa51a4419009ce22ec 100755\n--- a/t/t3423-rebase-reword.sh\n+++ b/t/t3423-rebase-reword.sh\n@@ -2,7 +2,6 @@\n \n test_description='git rebase interactive with rewording'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n . \"$TEST_DIRECTORY\"/lib-rebase.sh\ndiff --git a/t/t3424-rebase-empty.sh b/t/t3424-rebase-empty.sh\nindex 515c949ae37269d056e9bf5b0fb88f409eba5c02..1ee6b00fd57726e055b95903e09f97c1e24ebcd2 100755\n--- a/t/t3424-rebase-empty.sh\n+++ b/t/t3424-rebase-empty.sh\n@@ -2,7 +2,6 @@\n \n test_description='git rebase of commits that start or become empty'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup test repository' '\ndiff --git a/t/t3425-rebase-topology-merges.sh b/t/t3425-rebase-topology-merges.sh\nindex a16428bdf54ab9157dfefb7cc9797e4c5dd86e1e..675491234a6155f6a3b09701d96ac048d648648c 100755\n--- a/t/t3425-rebase-topology-merges.sh\n+++ b/t/t3425-rebase-topology-merges.sh\n@@ -2,7 +2,6 @@\n \n test_description='rebase topology tests with merges'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-rebase.sh\n \ndiff --git a/t/t3426-rebase-submodule.sh b/t/t3426-rebase-submodule.sh\nindex 94ea88e384e6219c7d47c6c9fb8409640623680d..ba069dccbdf56197b0e93831fdb1316853d54ef4 100755\n--- a/t/t3426-rebase-submodule.sh\n+++ b/t/t3426-rebase-submodule.sh\n@@ -2,7 +2,6 @@\n \n test_description='rebase can handle submodules'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-submodule-update.sh\n . \"$TEST_DIRECTORY\"/lib-rebase.sh\ndiff --git a/t/t3427-rebase-subtree.sh b/t/t3427-rebase-subtree.sh\nindex 5e9046e3df3d5262c2845d190476b9d9bc56873e..1b3e97c8755f3d8b41549e70cf67529298118182 100755\n--- a/t/t3427-rebase-subtree.sh\n+++ b/t/t3427-rebase-subtree.sh\n@@ -7,7 +7,6 @@ This test runs git rebase and tests the subtree strategy.\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-rebase.sh\n \ndiff --git a/t/t3428-rebase-signoff.sh b/t/t3428-rebase-signoff.sh\nindex 365436ebfc36415333d01bd231f7f89e5223477d..6f57aed9fac68f1b5d670b2e3c35bcc84690a525 100755\n--- a/t/t3428-rebase-signoff.sh\n+++ b/t/t3428-rebase-signoff.sh\n@@ -5,7 +5,6 @@ test_description='git rebase --signoff\n This test runs git rebase --signoff and make sure that it works.\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-rebase.sh\n \ndiff --git a/t/t3429-rebase-edit-todo.sh b/t/t3429-rebase-edit-todo.sh\nindex 8e0d03969a2fec13fba015158b3380ec2ee37c42..abd66f360213e18ad80b1c7bb2396b06d3e77b28 100755\n--- a/t/t3429-rebase-edit-todo.sh\n+++ b/t/t3429-rebase-edit-todo.sh\n@@ -2,7 +2,6 @@\n \n test_description='rebase should reread the todo file if an exec modifies it'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-rebase.sh\n \ndiff --git a/t/t3430-rebase-merges.sh b/t/t3430-rebase-merges.sh\nindex cb891eeb5fd112bf94e31a2158a5dce7990e36e2..2593711fecdc9f18c1b83b8d921ae06fbd2495ac 100755\n--- a/t/t3430-rebase-merges.sh\n+++ b/t/t3430-rebase-merges.sh\n@@ -21,7 +21,6 @@ Initial setup:\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-rebase.sh\n . \"$TEST_DIRECTORY\"/lib-log-graph.sh\ndiff --git a/t/t3431-rebase-fork-point.sh b/t/t3431-rebase-fork-point.sh\nindex 7b9c135c6e2766ceff9d99e188ab92ab6a7cdc62..be09fc78c16aab1fe525daeaa1348a9db5cec9a6 100755\n--- a/t/t3431-rebase-fork-point.sh\n+++ b/t/t3431-rebase-fork-point.sh\n@@ -8,7 +8,6 @@ test_description='git rebase --fork-point test'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n # A---B---D---E    (main)\ndiff --git a/t/t3432-rebase-fast-forward.sh b/t/t3432-rebase-fast-forward.sh\nindex 7f1a5dd3deb10bef921654ef767a7cd53347bfd8..5086e14c02207184bd7c048ee2bc2419ad4d1b34 100755\n--- a/t/t3432-rebase-fast-forward.sh\n+++ b/t/t3432-rebase-fast-forward.sh\n@@ -8,7 +8,6 @@ test_description='ensure rebase fast-forwards commits when possible'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t3433-rebase-across-mode-change.sh b/t/t3433-rebase-across-mode-change.sh\nindex c8172b0852233b6f370eab47c6cc4877db54d8f7..05df964670f49d011bf35b414177a35f812a4c4e 100755\n--- a/t/t3433-rebase-across-mode-change.sh\n+++ b/t/t3433-rebase-across-mode-change.sh\n@@ -2,7 +2,6 @@\n \n test_description='git rebase across mode change'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t3434-rebase-i18n.sh b/t/t3434-rebase-i18n.sh\nindex 97fc9a23f21f9b02b0b6e0e132dd56dbe82eafcb..8c94fdffc43044b18f15605bc43c8014c021bb3b 100755\n--- a/t/t3434-rebase-i18n.sh\n+++ b/t/t3434-rebase-i18n.sh\n@@ -17,7 +17,6 @@ Initial setup:\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n if ! test_have_prereq ICONV\ndiff --git a/t/t3435-rebase-gpg-sign.sh b/t/t3435-rebase-gpg-sign.sh\nindex 6e329fea7c0fac0482e363a3d297134c942e256a..6aa2aeb628d0eda991ee16760985f9017dceebb1 100755\n--- a/t/t3435-rebase-gpg-sign.sh\n+++ b/t/t3435-rebase-gpg-sign.sh\n@@ -8,7 +8,6 @@ test_description='test rebase --[no-]gpg-sign'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY/lib-rebase.sh\"\n . \"$TEST_DIRECTORY/lib-gpg.sh\"\ndiff --git a/t/t3436-rebase-more-options.sh b/t/t3436-rebase-more-options.sh\nindex 4d9744e5fc7ade70fc4cf2b7a594d1b0513e0f58..94671d3c4650463525006090702210eda76594e0 100755\n--- a/t/t3436-rebase-more-options.sh\n+++ b/t/t3436-rebase-more-options.sh\n@@ -5,7 +5,6 @@\n \n test_description='tests to ensure compatibility between am and interactive backends'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n . \"$TEST_DIRECTORY\"/lib-rebase.sh\ndiff --git a/t/t3437-rebase-fixup-options.sh b/t/t3437-rebase-fixup-options.sh\nindex 7929e2e2e3a8fc1240af3991f85172c16dcbd2cf..6f9307e0e3cdfe8903b5a77229b2439d375b51b2 100755\n--- a/t/t3437-rebase-fixup-options.sh\n+++ b/t/t3437-rebase-fixup-options.sh\n@@ -14,7 +14,6 @@ to the \"fixup\" command that works with \"fixup!\", \"fixup -C\" works with\n \"amend!\" upon --autosquash.\n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n . \"$TEST_DIRECTORY\"/lib-rebase.sh\ndiff --git a/t/t3438-rebase-broken-files.sh b/t/t3438-rebase-broken-files.sh\nindex 821f08e5afb6983cf8f69abc525a54b6274885e6..78d42f4c799f144caabcc2b0e5f04e82122beb02 100755\n--- a/t/t3438-rebase-broken-files.sh\n+++ b/t/t3438-rebase-broken-files.sh\n@@ -2,7 +2,6 @@\n \n test_description='rebase behavior when on-disk files are broken'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'set up conflicting branches' '\ndiff --git a/t/t3500-cherry.sh b/t/t3500-cherry.sh\nindex 61ca87512d59dcc37a831619cb6691af97fa7d25..78c3eac54b599ef9cded9a042f4346621798b645 100755\n--- a/t/t3500-cherry.sh\n+++ b/t/t3500-cherry.sh\n@@ -11,7 +11,6 @@ checks that git cherry only returns the second patch in the local branch\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n GIT_AUTHOR_EMAIL=bogus_email_address\ndiff --git a/t/t3501-revert-cherry-pick.sh b/t/t3501-revert-cherry-pick.sh\nindex 411027fb58c7dfb657409980970e71005f2c79c5..17a993796254501a2dd3d35a08c1bd00594a61c9 100755\n--- a/t/t3501-revert-cherry-pick.sh\n+++ b/t/t3501-revert-cherry-pick.sh\n@@ -5,7 +5,6 @@ test_description='miscellaneous basic tests for cherry-pick and revert'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t3502-cherry-pick-merge.sh b/t/t3502-cherry-pick-merge.sh\nindex 1b2c0d6aca64e05a85ffd6568be17bb5897a297e..5495eacfec11a904ba24d69439cb1b98b5a353ec 100755\n--- a/t/t3502-cherry-pick-merge.sh\n+++ b/t/t3502-cherry-pick-merge.sh\n@@ -11,7 +11,6 @@ test_description='cherry picking and reverting a merge\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t3503-cherry-pick-root.sh b/t/t3503-cherry-pick-root.sh\nindex 76d393dc8a307ebef13dfab5e4eb3d88a7a7cd69..95fe4feaeee98f6432b39ee3a4817f05da5d649b 100755\n--- a/t/t3503-cherry-pick-root.sh\n+++ b/t/t3503-cherry-pick-root.sh\n@@ -5,7 +5,6 @@ test_description='test cherry-picking (and reverting) a root commit'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t3504-cherry-pick-rerere.sh b/t/t3504-cherry-pick-rerere.sh\nindex 109016eba92ac8d296edfbaf28ecf9b1a4fc32f7..18aeba161c0ae4821e0496269ed251763c245e6b 100755\n--- a/t/t3504-cherry-pick-rerere.sh\n+++ b/t/t3504-cherry-pick-rerere.sh\n@@ -5,7 +5,6 @@ test_description='cherry-pick should rerere for conflicts'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t3505-cherry-pick-empty.sh b/t/t3505-cherry-pick-empty.sh\nindex ead3fb46807ef33427172dde75a45f5cfa01bfb0..9748443530cd713c8c9d06e6eaa67552a69e978b 100755\n--- a/t/t3505-cherry-pick-empty.sh\n+++ b/t/t3505-cherry-pick-empty.sh\n@@ -5,7 +5,6 @@ test_description='test cherry-picking an empty commit'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t3506-cherry-pick-ff.sh b/t/t3506-cherry-pick-ff.sh\nindex b71bad17b853c566caac5828c19453da9c862647..7e11bd4a4c5c41c9e326244f598bdc9bb4e4e3ba 100755\n--- a/t/t3506-cherry-pick-ff.sh\n+++ b/t/t3506-cherry-pick-ff.sh\n@@ -5,7 +5,6 @@ test_description='test cherry-picking with --ff option'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success setup '\ndiff --git a/t/t3507-cherry-pick-conflict.sh b/t/t3507-cherry-pick-conflict.sh\nindex 10e9c91dbbd0f0f2655a5f35c769ba2fa5a10444..f3947b400a3a89970e400d3c3f5dc5d690292d83 100755\n--- a/t/t3507-cherry-pick-conflict.sh\n+++ b/t/t3507-cherry-pick-conflict.sh\n@@ -13,7 +13,6 @@ GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n TEST_CREATE_REPO_NO_TEMPLATE=1\n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n pristine_detach () {\ndiff --git a/t/t3508-cherry-pick-many-commits.sh b/t/t3508-cherry-pick-many-commits.sh\nindex afa7727a4af8e489b8b3f36213a15ed83dc9e561..2d53ce754c5fb75ceeaa43dc1ba2f748fd58f43e 100755\n--- a/t/t3508-cherry-pick-many-commits.sh\n+++ b/t/t3508-cherry-pick-many-commits.sh\n@@ -5,7 +5,6 @@ test_description='test cherry-picking many commits'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n check_head_differs_from() {\ndiff --git a/t/t3509-cherry-pick-merge-df.sh b/t/t3509-cherry-pick-merge-df.sh\nindex 171cc6d76b797c99638bda0d63083aecfd7a5a2d..f4159246e1e35d615bca2191393ea19427088dc0 100755\n--- a/t/t3509-cherry-pick-merge-df.sh\n+++ b/t/t3509-cherry-pick-merge-df.sh\n@@ -4,7 +4,6 @@ test_description='Test cherry-pick with directory/file conflicts'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'Initialize repository' '\ndiff --git a/t/t3510-cherry-pick-sequence.sh b/t/t3510-cherry-pick-sequence.sh\nindex 93c725bac3cb3edd9fdaab7f0ecf9985fd7f848e..7eb52b12edc55702f48812725bfddc282297f9a5 100755\n--- a/t/t3510-cherry-pick-sequence.sh\n+++ b/t/t3510-cherry-pick-sequence.sh\n@@ -12,7 +12,6 @@ test_description='Test cherry-pick continuation features\n \n '\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n # Repeat first match 10 times\ndiff --git a/t/t3511-cherry-pick-x.sh b/t/t3511-cherry-pick-x.sh\nindex dd5d92ef302124aeb9d6fe02642489875a9e1b22..84a587daf3af0356244c58c6472e202875679200 100755\n--- a/t/t3511-cherry-pick-x.sh\n+++ b/t/t3511-cherry-pick-x.sh\n@@ -2,7 +2,6 @@\n \n test_description='Test cherry-pick -x and -s'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n pristine_detach () {\ndiff --git a/t/t3512-cherry-pick-submodule.sh b/t/t3512-cherry-pick-submodule.sh\nindex 9387a22a9e7100335208713fcb069b31c69f7e80..f22d1ddead1ac94de714f61fc10b87cc4bae3aec 100755\n--- a/t/t3512-cherry-pick-submodule.sh\n+++ b/t/t3512-cherry-pick-submodule.sh\n@@ -5,7 +5,6 @@ test_description='cherry-pick can handle submodules'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-submodule-update.sh\n \ndiff --git a/t/t3513-revert-submodule.sh b/t/t3513-revert-submodule.sh\nindex e178968b408f4b9068bcc07055ffacf781154181..8bfe3ed2467fa17d9f1910cd76c721c73776d4ab 100755\n--- a/t/t3513-revert-submodule.sh\n+++ b/t/t3513-revert-submodule.sh\n@@ -2,7 +2,6 @@\n \n test_description='revert can handle submodules'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-submodule-update.sh\n \ndiff --git a/t/t3514-cherry-pick-revert-gpg.sh b/t/t3514-cherry-pick-revert-gpg.sh\nindex 133dc072178a161a33b05ca02f8872b5286a943a..5b2e250eaa509458d89d13f4a3728276525fa746 100755\n--- a/t/t3514-cherry-pick-revert-gpg.sh\n+++ b/t/t3514-cherry-pick-revert-gpg.sh\n@@ -5,7 +5,6 @@\n \n test_description='test {cherry-pick,revert} --[no-]gpg-sign'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY/lib-gpg.sh\"\n \ndiff --git a/t/t3600-rm.sh b/t/t3600-rm.sh\nindex 31ac31d4bcd3bbef54f10234cb5c437d3f97fc35..98259e2adaa9dba9fa6bbcb79e50948e69a6b9e6 100755\n--- a/t/t3600-rm.sh\n+++ b/t/t3600-rm.sh\n@@ -8,7 +8,6 @@ test_description='Test of the various options to git rm.'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n # Setup some files to be removed, some with funny characters\ndiff --git a/t/t3601-rm-pathspec-file.sh b/t/t3601-rm-pathspec-file.sh\nindex 7cef12981c4be0b611f70fe021d5960f1ad4e5a8..31bd9960fcde39a6d30095f05320a4e3d1fb1c9c 100755\n--- a/t/t3601-rm-pathspec-file.sh\n+++ b/t/t3601-rm-pathspec-file.sh\n@@ -2,7 +2,6 @@\n \n test_description='rm --pathspec-from-file'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_tick\ndiff --git a/t/t3602-rm-sparse-checkout.sh b/t/t3602-rm-sparse-checkout.sh\nindex fcdefba48cc76b9a86c8136342c828e30cd9e811..08580fd3dccb73bea98c787271ba49c362a55b6b 100755\n--- a/t/t3602-rm-sparse-checkout.sh\n+++ b/t/t3602-rm-sparse-checkout.sh\n@@ -2,7 +2,6 @@\n \n test_description='git rm in sparse checked out working trees'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' \"\ndiff --git a/t/t3650-replay-basics.sh b/t/t3650-replay-basics.sh\nindex 12bd3db4cb74635ff1a939c80897e9fb98a208a7..389670262e458eadb7029251aa44b52be8ae5350 100755\n--- a/t/t3650-replay-basics.sh\n+++ b/t/t3650-replay-basics.sh\n@@ -5,7 +5,6 @@ test_description='basic git replay tests'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n GIT_AUTHOR_NAME=author@name\ndiff --git a/t/t3700-add.sh b/t/t3700-add.sh\nindex 839c904745a2861487e04363060a951aaeb902c9..4c543a1a7e8f416acf58ac32ddf2b7394f159abd 100755\n--- a/t/t3700-add.sh\n+++ b/t/t3700-add.sh\n@@ -5,7 +5,6 @@\n \n test_description='Test of git add, including the -- option.'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n . \"$TEST_DIRECTORY\"/lib-unique-files.sh\ndiff --git a/t/t3701-add-interactive.sh b/t/t3701-add-interactive.sh\nindex 718438ffc7d2a8d3482544378749b0d4dfe6313b..b8a05d95f3f1304ac82618d8847cad026c6c44f4 100755\n--- a/t/t3701-add-interactive.sh\n+++ b/t/t3701-add-interactive.sh\n@@ -4,7 +4,6 @@ test_description='add -i basic tests'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-terminal.sh\n \ndiff --git a/t/t3702-add-edit.sh b/t/t3702-add-edit.sh\nindex 82bfb2fd2aca9eae78af33fa67620e76458b3ac6..8bacacbac6807c1ddab20aeca87ac34dbdd05bfb 100755\n--- a/t/t3702-add-edit.sh\n+++ b/t/t3702-add-edit.sh\n@@ -5,7 +5,6 @@\n \n test_description='add -e basic tests'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n \ndiff --git a/t/t3703-add-magic-pathspec.sh b/t/t3703-add-magic-pathspec.sh\nindex d84071038e051552f5676c5c687e4e5e2646a39a..3ef525a559d91b115a3dbe4a1373c8c51fb1fc98 100755\n--- a/t/t3703-add-magic-pathspec.sh\n+++ b/t/t3703-add-magic-pathspec.sh\n@@ -2,7 +2,6 @@\n \n test_description='magic pathspec tests using git-add'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t3704-add-pathspec-file.sh b/t/t3704-add-pathspec-file.sh\nindex 3aa59f6f639b5bfc79ab048f594cb2512755be73..b9c96e273fb71af8b4ee3cf376a53433d3fea5d7 100755\n--- a/t/t3704-add-pathspec-file.sh\n+++ b/t/t3704-add-pathspec-file.sh\n@@ -2,7 +2,6 @@\n \n test_description='add --pathspec-from-file'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_tick\ndiff --git a/t/t3705-add-sparse-checkout.sh b/t/t3705-add-sparse-checkout.sh\nindex 6ae45a788d1a97e04bf504a25efbd98a6ab5e41a..2bade9e804fcfc74df7d5629bbd409fda1c4a302 100755\n--- a/t/t3705-add-sparse-checkout.sh\n+++ b/t/t3705-add-sparse-checkout.sh\n@@ -2,7 +2,6 @@\n \n test_description='git add in sparse checked out working trees'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n SPARSE_ENTRY_BLOB=\"\"\ndiff --git a/t/t3800-mktag.sh b/t/t3800-mktag.sh\nindex d3e428ff46eb5c99d98a8fe27b54cf98d6d2a936..e3cf0ffbe59c449b218cafedd74bd3cf07e82ff1 100755\n--- a/t/t3800-mktag.sh\n+++ b/t/t3800-mktag.sh\n@@ -4,7 +4,6 @@\n \n test_description='git mktag: tag object verify test'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n ###########################################################\ndiff --git a/t/t3900-i18n-commit.sh b/t/t3900-i18n-commit.sh\nindex 9d4b5ab1f9520f3892a32e17239ae6cb34184269..3c930ec202d682d26b76a90b3ba80e3574331e19 100755\n--- a/t/t3900-i18n-commit.sh\n+++ b/t/t3900-i18n-commit.sh\n@@ -5,7 +5,6 @@\n \n test_description='commit and log output encodings'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n if ! test_have_prereq ICONV\ndiff --git a/t/t3901-i18n-patch.sh b/t/t3901-i18n-patch.sh\nindex e0659c92935e7f7582e03fd1121df7488e0e2b4a..f03601b49a93970eeb0d0393f9979fc71dbe9ce1 100755\n--- a/t/t3901-i18n-patch.sh\n+++ b/t/t3901-i18n-patch.sh\n@@ -8,7 +8,6 @@ test_description='i18n settings and format-patch | am pipe'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n if ! test_have_prereq ICONV\ndiff --git a/t/t3902-quoted.sh b/t/t3902-quoted.sh\nindex 72a5a565e973ad634ecfa4418d8934d3c7b85ae1..f528008c363c68f40da3b88a34ae8ec931d0c1ac 100755\n--- a/t/t3902-quoted.sh\n+++ b/t/t3902-quoted.sh\n@@ -5,7 +5,6 @@\n \n test_description='quoted output'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n FN='濱野'\ndiff --git a/t/t3903-stash.sh b/t/t3903-stash.sh\nindex c87592ee2f39fe3568fe98955d0df24bd2180f68..74666ff3e4b2b8fa5aa9651e85dc7c82621bd304 100755\n--- a/t/t3903-stash.sh\n+++ b/t/t3903-stash.sh\n@@ -8,7 +8,6 @@ test_description='Test git stash'\n GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main\n export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-unique-files.sh\n \ndiff --git a/t/t3904-stash-patch.sh b/t/t3904-stash-patch.sh\nindex aa5019fd6c3d59cc4f3ad870607c7e6e531e628b..ae313e3c705e460f2f905e4cbdd25b694f0417a0 100755\n--- a/t/t3904-stash-patch.sh\n+++ b/t/t3904-stash-patch.sh\n@@ -2,7 +2,6 @@\n \n test_description='stash -p'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./lib-patch-mode.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t3905-stash-include-untracked.sh b/t/t3905-stash-include-untracked.sh\nindex a1733f45c3aa13e642fe7aeb808391dbd10e6fab..1289ae3e07c635d30930067022969247b2b63f1f 100755\n--- a/t/t3905-stash-include-untracked.sh\n+++ b/t/t3905-stash-include-untracked.sh\n@@ -5,7 +5,6 @@\n \n test_description='Test git stash --include-untracked'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'stash save --include-untracked some dirty working directory' '\ndiff --git a/t/t3906-stash-submodule.sh b/t/t3906-stash-submodule.sh\nindex 0f61f01ef43b2c889bd2850fbd41c4a42f52c6e6..0f7348ec21b8821cb6b7594919bbc637ec0a7236 100755\n--- a/t/t3906-stash-submodule.sh\n+++ b/t/t3906-stash-submodule.sh\n@@ -2,7 +2,6 @@\n \n test_description='stash can handle submodules'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n . \"$TEST_DIRECTORY\"/lib-submodule-update.sh\n \ndiff --git a/t/t3907-stash-show-config.sh b/t/t3907-stash-show-config.sh\nindex 7a2eb98b86426ea7657fdce73cb8c0cb3a6d2848..10914bba7b3737ea89af320f93371e44b4694a11 100755\n--- a/t/t3907-stash-show-config.sh\n+++ b/t/t3907-stash-show-config.sh\n@@ -2,7 +2,6 @@\n \n test_description='Test git stash show configuration.'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t3908-stash-in-worktree.sh b/t/t3908-stash-in-worktree.sh\nindex 347a89b030b68dc87ecea8f40dfe9d1b0ca8db16..2b2b366ef94b7ca429416d81cc4858201658d3cb 100755\n--- a/t/t3908-stash-in-worktree.sh\n+++ b/t/t3908-stash-in-worktree.sh\n@@ -5,7 +5,6 @@\n \n test_description='Test git stash in a worktree'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_expect_success 'setup' '\ndiff --git a/t/t3909-stash-pathspec-file.sh b/t/t3909-stash-pathspec-file.sh\nindex 83269d0eb4cc42f21f58cb77043aae97f8644f94..73f2dbdeb022ee71d04e9961da959f60d6eabd5c 100755\n--- a/t/t3909-stash-pathspec-file.sh\n+++ b/t/t3909-stash-pathspec-file.sh\n@@ -2,7 +2,6 @@\n \n test_description='stash --pathspec-from-file'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n test_tick\ndiff --git a/t/t3920-crlf-messages.sh b/t/t3920-crlf-messages.sh\nindex 31877f00c77d81da8847164228a9ac58573a850d..e2e1251a057f245eebcfd0fecebec712aef48694 100755\n--- a/t/t3920-crlf-messages.sh\n+++ b/t/t3920-crlf-messages.sh\n@@ -2,7 +2,6 @@\n \n test_description='Test ref-filter and pretty APIs for commit and tag messages using CRLF'\n \n-TEST_PASSES_SANITIZE_LEAK=true\n . ./test-lib.sh\n \n LIB_CRLF_BRANCHES=\"\"\ndiff --git a/t/t4000-d"},{"id":"507087","messageId":"894bb8da-fd5d-4352-a31f-3167b3cd7e1b@gmail.com","threadId":"62477","inReplyTo":"20241111-b4-pks-leak-fixes-pt10-v2-0-6154bf91f0b0@pks.im","subject":"Re: [PATCH v2 00/27] Memory leak fixes (pt.10, final)","fromName":"Rubén Justo","fromEmail":"rjusto@gmail.com","sentAt":"2024-11-11T23:33:16Z","receivedAt":"2024-11-11T23:33:20Z","isPatch":true,"sender":{"key":"rjusto@gmail.com","avatar":"https://avatars.githubusercontent.com/u/5685487?v=4"},"body":"On Mon, Nov 11, 2024 at 11:38:29AM +0100, Patrick Steinhardt wrote:\n> Hi,\n> \n> this is the last part of my series of memory leak fixes. This series\n> goes a bit further than past series:\n> \n>   - Patches 1 to 16 plug remaining memory leaks exposed by our test\n>     suite.\n> \n>   - Patches 17 to 22 remove the last remaining `UNLEAK()` annotations\n>     and ultimately remove the macro itself.\n> \n>   - Patch 23 works around a bug in the leak sanitizer itself.\n> \n>   - Patches 24 and 25 drop annotations where leak-free tests pass with\n>     the leak sanitizer.\n> \n>   - Patches 26 and 27 unconditionally enable leak checking in all newly\n>     added tests and then drop the `TEST_PASSES_SANITIZE_LEAK`\n>     annotation.\n> \n> So once this series lands, the expectation is that any newly added test\n> needs to be leak free by default. We still have an escape hatch in the\n> form of the SANITIZE_LEAK prerequisite, but patch authors are expected\n> to provide good arguments why their test cannot be made leak free.\n> \n> Changes in v2:\n> \n>   - Some fixes to code formatting.\n> \n>   - Simplify the memory leak fixes in \"help.c\".\n> \n>   - Split out the removal of `UNLEAK()` into its own commit.\n> \n> Link to v1: https://lore.kernel.org/r/cover.1730901926.git.ps@pks.im\n> \n> Thanks!\n> \n> Patrick\n> \n> To: git@vger.kernel.org\n> Cc: Rubén Justo <rjusto@gmail.com>\n> \n> Patrick Steinhardt (27):\n>       builtin/blame: fix leaking blame entries with `--incremental`\n>       bisect: fix leaking good/bad terms when reading multipe times\n>       bisect: fix leaking string in `handle_bad_merge_base()`\n>       bisect: fix leaking `current_bad_oid`\n>       bisect: fix multiple leaks in `bisect_next_all()`\n>       bisect: fix leaking commit list items in `check_merge_base()`\n>       bisect: fix various cases where we leak commit list items\n>       line-log: fix leak when rewriting commit parents\n>       strvec: introduce new `strvec_splice()` function\n>       git: refactor alias handling to use a `struct strvec`\n>       git: refactor builtin handling to use a `struct strvec`\n>       split-index: fix memory leak in `move_cache_to_base_index()`\n>       builtin/sparse-checkout: fix leaking sanitized patterns\n>       help: refactor to not use globals for reading config\n>       help: fix leaking `struct cmdnames`\n>       help: fix leaking return value from `help_unknown_cmd()`\n>       builtin/help: fix leaks in `check_git_cmd()`\n>       builtin/init-db: fix leaking directory paths\n>       builtin/branch: fix leaking sorting options\n>       t/helper: fix leaking commit graph in \"read-graph\" subcommand\n>       global: drop `UNLEAK()` annotation\n>       git-compat-util: drop now-unused `UNLEAK()` macro\n>       t5601: work around leak sanitizer issue\n>       t: mark some tests as leak free\n>       t: remove unneeded !SANITIZE_LEAK prerequisites\n>       test-lib: unconditionally enable leak checking\n>       t: remove TEST_PASSES_SANITIZE_LEAK annotations\n> \n>  bisect.c                                           |  61 +++++++---\n>  bisect.h                                           |   2 +-\n>  blame.c                                            |   1 +\n>  blame.h                                            |   2 +-\n>  builtin/blame.c                                    |  12 +-\n>  builtin/branch.c                                   |  33 ++++--\n>  builtin/clone.c                                    |   1 -\n>  builtin/diff.c                                     |   1 -\n>  builtin/help.c                                     |  13 ++-\n>  builtin/init-db.c                                  |  34 +++---\n>  builtin/sparse-checkout.c                          |  61 ++++++----\n>  ci/lib.sh                                          |   1 -\n>  git-compat-util.h                                  |  20 ----\n>  git.c                                              | 124 +++++++++++----------\n>  help.c                                             |  58 +++++-----\n>  help.h                                             |   2 +-\n>  line-log.c                                         |   1 +\n>  revision.c                                         |   4 +-\n>  split-index.c                                      |   6 +-\n>  strvec.c                                           |  19 ++++\n>  strvec.h                                           |   9 ++\n>  t/README                                           |  21 ----\n>  t/helper/test-read-graph.c                         |   3 +-\n>  t/lib-git-svn.sh                                   |   4 -\n>  t/t0001-init.sh                                    |   1 -\n>  t/t0002-gitfile.sh                                 |   1 -\n>  t/t0003-attributes.sh                              |   1 -\n>  t/t0004-unwritable.sh                              |   1 -\n>  t/t0005-signals.sh                                 |   1 -\n>  t/t0006-date.sh                                    |   1 -\n>  t/t0007-git-var.sh                                 |   1 -\n>  t/t0008-ignores.sh                                 |   1 -\n>  t/t0010-racy-git.sh                                |   1 -\n>  t/t0012-help.sh                                    |   1 -\n>  t/t0013-sha1dc.sh                                  |   1 -\n>  t/t0017-env-helper.sh                              |   1 -\n>  t/t0018-advice.sh                                  |   1 -\n>  t/t0019-json-writer.sh                             |   1 -\n>  t/t0020-crlf.sh                                    |   1 -\n>  t/t0021-conversion.sh                              |   1 -\n>  t/t0022-crlf-rename.sh                             |   1 -\n>  t/t0023-crlf-am.sh                                 |   1 -\n>  t/t0024-crlf-archive.sh                            |   1 -\n>  t/t0025-crlf-renormalize.sh                        |   1 -\n>  t/t0026-eol-config.sh                              |   1 -\n>  t/t0027-auto-crlf.sh                               |   1 -\n>  t/t0028-working-tree-encoding.sh                   |   1 -\n>  t/t0029-core-unsetenvvars.sh                       |   1 -\n>  t/t0030-stripspace.sh                              |   1 -\n>  t/t0033-safe-directory.sh                          |   1 -\n>  t/t0035-safe-bare-repository.sh                    |   1 -\n>  t/t0040-parse-options.sh                           |   1 -\n>  t/t0041-usage.sh                                   |   1 -\n>  t/t0050-filesystem.sh                              |   1 -\n>  t/t0052-simple-ipc.sh                              |   1 -\n>  t/t0055-beyond-symlinks.sh                         |   1 -\n>  t/t0056-git-C.sh                                   |   1 -\n>  t/t0060-path-utils.sh                              |   1 -\n>  t/t0061-run-command.sh                             |   1 -\n>  t/t0062-revision-walking.sh                        |   1 -\n>  t/t0063-string-list.sh                             |   1 -\n>  t/t0066-dir-iterator.sh                            |   1 -\n>  t/t0067-parse_pathspec_file.sh                     |   1 -\n>  t/t0068-for-each-repo.sh                           |   1 -\n>  t/t0070-fundamental.sh                             |   1 -\n>  t/t0071-sort.sh                                    |   1 -\n>  t/t0080-unit-test-output.sh                        |   1 -\n>  t/t0081-find-pack.sh                               |   1 -\n>  t/t0090-cache-tree.sh                              |   1 -\n>  t/t0091-bugreport.sh                               |   1 -\n>  t/t0092-diagnose.sh                                |   1 -\n>  t/t0095-bloom.sh                                   |   3 +-\n>  t/t0100-previous.sh                                |   1 -\n>  t/t0101-at-syntax.sh                               |   1 -\n>  t/t0200-gettext-basic.sh                           |   1 -\n>  t/t0201-gettext-fallbacks.sh                       |   1 -\n>  t/t0202-gettext-perl.sh                            |   1 -\n>  t/t0203-gettext-setlocale-sanity.sh                |   1 -\n>  t/t0204-gettext-reencode-sanity.sh                 |   1 -\n>  t/t0210-trace2-normal.sh                           |   1 -\n>  t/t0211-trace2-perf.sh                             |   1 -\n>  t/t0212-trace2-event.sh                            |   1 -\n>  t/t0300-credentials.sh                             |   1 -\n>  t/t0301-credential-cache.sh                        |   1 -\n>  t/t0302-credential-store.sh                        |   1 -\n>  t/t0303-credential-external.sh                     |   1 -\n>  t/t0410-partial-clone.sh                           |   1 -\n>  t/t0411-clone-from-partial.sh                      |   1 -\n>  t/t0450-txt-doc-vs-help.sh                         |   1 -\n>  t/t0500-progress-display.sh                        |   1 -\n>  t/t0600-reffiles-backend.sh                        |   1 -\n>  t/t0601-reffiles-pack-refs.sh                      |   1 -\n>  t/t0602-reffiles-fsck.sh                           |   1 -\n>  t/t0610-reftable-basics.sh                         |   1 -\n>  t/t0611-reftable-httpd.sh                          |   1 -\n>  t/t0612-reftable-jgit-compatibility.sh             |   1 -\n>  t/t0613-reftable-write-options.sh                  |   1 -\n>  t/t1000-read-tree-m-3way.sh                        |   1 -\n>  t/t1001-read-tree-m-2way.sh                        |   1 -\n>  t/t1002-read-tree-m-u-2way.sh                      |   1 -\n>  t/t1003-read-tree-prefix.sh                        |   1 -\n>  t/t1004-read-tree-m-u-wf.sh                        |   1 -\n>  t/t1005-read-tree-reset.sh                         |   1 -\n>  t/t1006-cat-file.sh                                |   1 -\n>  t/t1007-hash-object.sh                             |   1 -\n>  t/t1008-read-tree-overlay.sh                       |   1 -\n>  t/t1009-read-tree-new-index.sh                     |   1 -\n>  t/t1010-mktree.sh                                  |   1 -\n>  t/t1011-read-tree-sparse-checkout.sh               |   1 -\n>  t/t1012-read-tree-df.sh                            |   1 -\n>  t/t1013-read-tree-submodule.sh                     |   1 -\n>  t/t1014-read-tree-confusing.sh                     |   1 -\n>  t/t1015-read-index-unmerged.sh                     |   1 -\n>  t/t1016-compatObjectFormat.sh                      |   1 -\n>  t/t1020-subdirectory.sh                            |   1 -\n>  t/t1021-rerere-in-workdir.sh                       |   1 -\n>  t/t1022-read-tree-partial-clone.sh                 |   1 -\n>  t/t1050-large.sh                                   |   1 -\n>  t/t1051-large-conversion.sh                        |   1 -\n>  t/t1060-object-corruption.sh                       |   1 -\n>  t/t1090-sparse-checkout-scope.sh                   |   1 -\n>  t/t1091-sparse-checkout-builtin.sh                 |   1 -\n>  t/t1092-sparse-checkout-compatibility.sh           |   1 -\n>  t/t1100-commit-tree-options.sh                     |   1 -\n>  t/t1300-config.sh                                  |   1 -\n>  t/t1301-shared-repo.sh                             |   1 -\n>  t/t1302-repo-version.sh                            |   1 -\n>  t/t1303-wacky-config.sh                            |   1 -\n>  t/t1304-default-acl.sh                             |   1 -\n>  t/t1305-config-include.sh                          |   1 -\n>  t/t1306-xdg-files.sh                               |   1 -\n>  t/t1307-config-blob.sh                             |   1 -\n>  t/t1308-config-set.sh                              |   1 -\n>  t/t1309-early-config.sh                            |   1 -\n>  t/t1310-config-default.sh                          |   1 -\n>  t/t1350-config-hooks-path.sh                       |   1 -\n>  t/t1400-update-ref.sh                              |   1 -\n>  t/t1401-symbolic-ref.sh                            |   1 -\n>  t/t1402-check-ref-format.sh                        |   1 -\n>  t/t1403-show-ref.sh                                |   1 -\n>  t/t1404-update-ref-errors.sh                       |   1 -\n>  t/t1405-main-ref-store.sh                          |   1 -\n>  t/t1406-submodule-ref-store.sh                     |   1 -\n>  t/t1407-worktree-ref-store.sh                      |   1 -\n>  t/t1408-packed-refs.sh                             |   1 -\n>  t/t1409-avoid-packing-refs.sh                      |   1 -\n>  t/t1410-reflog.sh                                  |   1 -\n>  t/t1411-reflog-show.sh                             |   1 -\n>  t/t1412-reflog-loop.sh                             |   1 -\n>  t/t1413-reflog-detach.sh                           |   1 -\n>  t/t1414-reflog-walk.sh                             |   1 -\n>  t/t1415-worktree-refs.sh                           |   1 -\n>  t/t1416-ref-transaction-hooks.sh                   |   1 -\n>  t/t1417-reflog-updateref.sh                        |   1 -\n>  t/t1418-reflog-exists.sh                           |   1 -\n>  t/t1419-exclude-refs.sh                            |   1 -\n>  t/t1420-lost-found.sh                              |   1 -\n>  t/t1430-bad-ref-name.sh                            |   1 -\n>  t/t1450-fsck.sh                                    |   1 -\n>  t/t1451-fsck-buffer.sh                             |   1 -\n>  t/t1460-refs-migrate.sh                            |   1 -\n>  t/t1500-rev-parse.sh                               |   1 -\n>  t/t1501-work-tree.sh                               |   1 -\n>  t/t1502-rev-parse-parseopt.sh                      |   1 -\n>  t/t1503-rev-parse-verify.sh                        |   1 -\n>  t/t1504-ceiling-dirs.sh                            |   1 -\n>  t/t1505-rev-parse-last.sh                          |   1 -\n>  t/t1506-rev-parse-diagnosis.sh                     |   1 -\n>  t/t1507-rev-parse-upstream.sh                      |   1 -\n>  t/t1508-at-combinations.sh                         |   1 -\n>  t/t1510-repo-setup.sh                              |   1 -\n>  t/t1511-rev-parse-caret.sh                         |   1 -\n>  t/t1512-rev-parse-disambiguation.sh                |   1 -\n>  t/t1513-rev-parse-prefix.sh                        |   1 -\n>  t/t1514-rev-parse-push.sh                          |   1 -\n>  t/t1515-rev-parse-outside-repo.sh                  |   1 -\n>  t/t1517-outside-repo.sh                            |   1 -\n>  t/t1600-index.sh                                   |   1 -\n>  t/t1601-index-bogus.sh                             |   1 -\n>  t/t1701-racy-split-index.sh                        |   1 -\n>  t/t1800-hook.sh                                    |   1 -\n>  t/t2000-conflict-when-checking-files-out.sh        |   1 -\n>  t/t2002-checkout-cache-u.sh                        |   1 -\n>  t/t2003-checkout-cache-mkdir.sh                    |   1 -\n>  t/t2004-checkout-cache-temp.sh                     |   1 -\n>  t/t2005-checkout-index-symlinks.sh                 |   1 -\n>  t/t2006-checkout-index-basic.sh                    |   1 -\n>  t/t2007-checkout-symlink.sh                        |   1 -\n>  t/t2008-checkout-subdir.sh                         |   1 -\n>  t/t2009-checkout-statinfo.sh                       |   1 -\n>  t/t2010-checkout-ambiguous.sh                      |   1 -\n>  t/t2011-checkout-invalid-head.sh                   |   1 -\n>  t/t2012-checkout-last.sh                           |   1 -\n>  t/t2013-checkout-submodule.sh                      |   1 -\n>  t/t2014-checkout-switch.sh                         |   1 -\n>  t/t2015-checkout-unborn.sh                         |   1 -\n>  t/t2016-checkout-patch.sh                          |   1 -\n>  t/t2017-checkout-orphan.sh                         |   1 -\n>  t/t2018-checkout-branch.sh                         |   1 -\n>  t/t2019-checkout-ambiguous-ref.sh                  |   1 -\n>  t/t2020-checkout-detach.sh                         |   1 -\n>  t/t2021-checkout-overwrite.sh                      |   1 -\n>  t/t2022-checkout-paths.sh                          |   1 -\n>  t/t2023-checkout-m.sh                              |   1 -\n>  t/t2024-checkout-dwim.sh                           |   1 -\n>  t/t2025-checkout-no-overlay.sh                     |   1 -\n>  t/t2026-checkout-pathspec-file.sh                  |   1 -\n>  t/t2027-checkout-track.sh                          |   1 -\n>  t/t2030-unresolve-info.sh                          |   1 -\n>  t/t2050-git-dir-relative.sh                        |   1 -\n>  t/t2060-switch.sh                                  |   1 -\n>  t/t2070-restore.sh                                 |   1 -\n>  t/t2071-restore-patch.sh                           |   1 -\n>  t/t2072-restore-pathspec-file.sh                   |   1 -\n>  t/t2080-parallel-checkout-basics.sh                |   1 -\n>  t/t2081-parallel-checkout-collisions.sh            |   1 -\n>  t/t2082-parallel-checkout-attributes.sh            |   1 -\n>  t/t2100-update-cache-badpath.sh                    |   1 -\n>  t/t2101-update-index-reupdate.sh                   |   1 -\n>  t/t2102-update-index-symlinks.sh                   |   1 -\n>  t/t2103-update-index-ignore-missing.sh             |   1 -\n>  t/t2104-update-index-skip-worktree.sh              |   1 -\n>  t/t2105-update-index-gitfile.sh                    |   1 -\n>  t/t2106-update-index-assume-unchanged.sh           |   1 -\n>  t/t2107-update-index-basic.sh                      |   1 -\n>  t/t2108-update-index-refresh-racy.sh               |   1 -\n>  t/t2200-add-update.sh                              |   1 -\n>  t/t2201-add-update-typechange.sh                   |   1 -\n>  t/t2202-add-addremove.sh                           |   1 -\n>  t/t2203-add-intent.sh                              |   1 -\n>  t/t2204-add-ignored.sh                             |   1 -\n>  t/t2205-add-worktree-config.sh                     |   1 -\n>  t/t2300-cd-to-toplevel.sh                          |   1 -\n>  t/t2400-worktree-add.sh                            |   1 -\n>  t/t2401-worktree-prune.sh                          |   1 -\n>  t/t2402-worktree-list.sh                           |   1 -\n>  t/t2403-worktree-move.sh                           |   1 -\n>  t/t2404-worktree-config.sh                         |   1 -\n>  t/t2405-worktree-submodule.sh                      |   1 -\n>  t/t2406-worktree-repair.sh                         |   1 -\n>  t/t2407-worktree-heads.sh                          |  17 ++-\n>  t/t2408-worktree-relative.sh                       |   1 -\n>  t/t2500-untracked-overwriting.sh                   |   1 -\n>  t/t2501-cwd-empty.sh                               |   1 -\n>  t/t3000-ls-files-others.sh                         |   1 -\n>  t/t3001-ls-files-others-exclude.sh                 |   1 -\n>  t/t3002-ls-files-dashpath.sh                       |   1 -\n>  t/t3003-ls-files-exclude.sh                        |   1 -\n>  t/t3004-ls-files-basic.sh                          |   1 -\n>  t/t3005-ls-files-relative.sh                       |   1 -\n>  t/t3006-ls-files-long.sh                           |   1 -\n>  t/t3007-ls-files-recurse-submodules.sh             |   1 -\n>  t/t3008-ls-files-lazy-init-name-hash.sh            |   1 -\n>  t/t3009-ls-files-others-nonsubmodule.sh            |   1 -\n>  t/t3010-ls-files-killed-modified.sh                |   1 -\n>  t/t3011-common-prefixes-and-directory-traversal.sh |   1 -\n>  t/t3012-ls-files-dedup.sh                          |   1 -\n>  t/t3013-ls-files-format.sh                         |   1 -\n>  t/t3020-ls-files-error-unmatch.sh                  |   1 -\n>  t/t3040-subprojects-basic.sh                       |   1 -\n>  t/t3050-subprojects-fetch.sh                       |   1 -\n>  t/t3060-ls-files-with-tree.sh                      |   1 -\n>  t/t3070-wildmatch.sh                               |   1 -\n>  t/t3100-ls-tree-restrict.sh                        |   1 -\n>  t/t3101-ls-tree-dirname.sh                         |   1 -\n>  t/t3102-ls-tree-wildcards.sh                       |   1 -\n>  t/t3103-ls-tree-misc.sh                            |   1 -\n>  t/t3104-ls-tree-format.sh                          |   1 -\n>  t/t3105-ls-tree-output.sh                          |   1 -\n>  t/t3200-branch.sh                                  |   1 -\n>  t/t3201-branch-contains.sh                         |   1 -\n>  t/t3202-show-branch.sh                             |   1 -\n>  t/t3203-branch-output.sh                           |   1 -\n>  t/t3204-branch-name-interpretation.sh              |   1 -\n>  t/t3205-branch-color.sh                            |   1 -\n>  t/t3206-range-diff.sh                              |   1 -\n>  t/t3207-branch-submodule.sh                        |   1 -\n>  t/t3211-peel-ref.sh                                |   1 -\n>  t/t3300-funny-names.sh                             |   1 -\n>  t/t3301-notes.sh                                   |   1 -\n>  t/t3302-notes-index-expensive.sh                   |   1 -\n>  t/t3303-notes-subtrees.sh                          |   1 -\n>  t/t3304-notes-mixed.sh                             |   1 -\n>  t/t3305-notes-fanout.sh                            |   1 -\n>  t/t3306-notes-prune.sh                             |   1 -\n>  t/t3307-notes-man.sh                               |   1 -\n>  t/t3308-notes-merge.sh                             |   1 -\n>  t/t3309-notes-merge-auto-resolve.sh                |   1 -\n>  t/t3310-notes-merge-manual-resolve.sh              |   1 -\n>  t/t3311-notes-merge-fanout.sh                      |   1 -\n>  t/t3320-notes-merge-worktrees.sh                   |   1 -\n>  t/t3321-notes-stripspace.sh                        |   1 -\n>  t/t3400-rebase.sh                                  |   1 -\n>  t/t3401-rebase-and-am-rename.sh                    |   1 -\n>  t/t3402-rebase-merge.sh                            |   1 -\n>  t/t3403-rebase-skip.sh                             |   1 -\n>  t/t3404-rebase-interactive.sh                      |   1 -\n>  t/t3405-rebase-malformed.sh                        |   1 -\n>  t/t3406-rebase-message.sh                          |   1 -\n>  t/t3407-rebase-abort.sh                            |   1 -\n>  t/t3408-rebase-multi-line.sh                       |   1 -\n>  t/t3409-rebase-environ.sh                          |   1 -\n>  t/t3412-rebase-root.sh                             |   1 -\n>  t/t3413-rebase-hook.sh                             |   1 -\n>  t/t3415-rebase-autosquash.sh                       |   1 -\n>  t/t3416-rebase-onto-threedots.sh                   |   1 -\n>  t/t3417-rebase-whitespace-fix.sh                   |   1 -\n>  t/t3418-rebase-continue.sh                         |   1 -\n>  t/t3419-rebase-patch-id.sh                         |   1 -\n>  t/t3420-rebase-autostash.sh                        |   1 -\n>  t/t3421-rebase-topology-linear.sh                  |   1 -\n>  t/t3422-rebase-incompatible-options.sh             |   1 -\n>  t/t3423-rebase-reword.sh                           |   1 -\n>  t/t3424-rebase-empty.sh                            |   1 -\n>  t/t3425-rebase-topology-merges.sh                  |   1 -\n>  t/t3426-rebase-submodule.sh                        |   1 -\n>  t/t3427-rebase-subtree.sh                          |   1 -\n>  t/t3428-rebase-signoff.sh                          |   1 -\n>  t/t3429-rebase-edit-todo.sh                        |   1 -\n>  t/t3430-rebase-merges.sh                           |   1 -\n>  t/t3431-rebase-fork-point.sh                       |   1 -\n>  t/t3432-rebase-fast-forward.sh                     |   1 -\n>  t/t3433-rebase-across-mode-change.sh               |   1 -\n>  t/t3434-rebase-i18n.sh                             |   1 -\n>  t/t3435-rebase-gpg-sign.sh                         |   1 -\n>  t/t3436-rebase-more-options.sh                     |   1 -\n>  t/t3437-rebase-fixup-options.sh                    |   1 -\n>  t/t3438-rebase-broken-files.sh                     |   1 -\n>  t/t3500-cherry.sh                                  |   1 -\n>  t/t3501-revert-cherry-pick.sh                      |   1 -\n>  t/t3502-cherry-pick-merge.sh                       |   1 -\n>  t/t3503-cherry-pick-root.sh                        |   1 -\n>  t/t3504-cherry-pick-rerere.sh                      |   1 -\n>  t/t3505-cherry-pick-empty.sh                       |   1 -\n>  t/t3506-cherry-pick-ff.sh                          |   1 -\n>  t/t3507-cherry-pick-conflict.sh                    |   1 -\n>  t/t3508-cherry-pick-many-commits.sh                |   1 -\n>  t/t3509-cherry-pick-merge-df.sh                    |   1 -\n>  t/t3510-cherry-pick-sequence.sh                    |   1 -\n>  t/t3511-cherry-pick-x.sh                           |   1 -\n>  t/t3512-cherry-pick-submodule.sh                   |   1 -\n>  t/t3513-revert-submodule.sh                        |   1 -\n>  t/t3514-cherry-pick-revert-gpg.sh                  |   1 -\n>  t/t3600-rm.sh                                      |   1 -\n>  t/t3601-rm-pathspec-file.sh                        |   1 -\n>  t/t3602-rm-sparse-checkout.sh                      |   1 -\n>  t/t3650-replay-basics.sh                           |   1 -\n>  t/t3700-add.sh                                     |   1 -\n>  t/t3701-add-interactive.sh                         |   1 -\n>  t/t3702-add-edit.sh                                |   1 -\n>  t/t3703-add-magic-pathspec.sh                      |   1 -\n>  t/t3704-add-pathspec-file.sh                       |   1 -\n>  t/t3705-add-sparse-checkout.sh                     |   1 -\n>  t/t3800-mktag.sh                                   |   1 -\n>  t/t3900-i18n-commit.sh                             |   1 -\n>  t/t3901-i18n-patch.sh                              |   1 -\n>  t/t3902-quoted.sh                                  |   1 -\n>  t/t3903-stash.sh                                   |   1 -\n>  t/t3904-stash-patch.sh                             |   1 -\n>  t/t3905-stash-include-untracked.sh                 |   1 -\n>  t/t3906-stash-submodule.sh                         |   1 -\n>  t/t3907-stash-show-config.sh                       |   1 -\n>  t/t3908-stash-in-worktree.sh                       |   1 -\n>  t/t3909-stash-pathspec-file.sh                     |   1 -\n>  t/t3920-crlf-messages.sh                           |   1 -\n>  t/t4000-diff-format.sh                             |   1 -\n>  t/t4001-diff-rename.sh                             |   1 -\n>  t/t4002-diff-basic.sh                              |   1 -\n>  t/t4003-diff-rename-1.sh                           |   1 -\n>  t/t4004-diff-rename-symlink.sh                     |   1 -\n>  t/t4005-diff-rename-2.sh                           |   1 -\n>  t/t4006-diff-mode.sh                               |   1 -\n>  t/t4007-rename-3.sh                                |   1 -\n>  t/t4008-diff-break-rewrite.sh                      |   1 -\n>  t/t4009-diff-rename-4.sh                           |   1 -\n>  t/t4010-diff-pathspec.sh                           |   1 -\n>  t/t4011-diff-symlink.sh                            |   1 -\n>  t/t4012-diff-binary.sh                             |   1 -\n>  t/t4013-diff-various.sh                            |   1 -\n>  t/t4014-format-patch.sh                            |   1 -\n>  t/t4015-diff-whitespace.sh                         |   1 -\n>  t/t4016-diff-quote.sh                              |   1 -\n>  t/t4017-diff-retval.sh                             |   1 -\n>  t/t4018-diff-funcname.sh                           |   1 -\n>  t/t4019-diff-wserror.sh                            |   1 -\n>  t/t4020-diff-external.sh                           |   5 +-\n>  t/t4021-format-patch-numbered.sh                   |   1 -\n>  t/t4022-diff-rewrite.sh                            |   1 -\n>  t/t4023-diff-rename-typechange.sh                  |   1 -\n>  t/t4024-diff-optimize-common.sh                    |   1 -\n>  t/t4025-hunk-header.sh                             |   1 -\n>  t/t4026-color.sh                                   |   1 -\n>  t/t4027-diff-submodule.sh                          |   1 -\n>  t/t4028-format-patch-mime-headers.sh               |   1 -\n>  t/t4029-diff-trailing-space.sh                     |   1 -\n>  t/t4030-diff-textconv.sh                           |   1 -\n>  t/t4031-diff-rewrite-binary.sh                     |   1 -\n>  t/t4032-diff-inter-hunk-context.sh                 |   1 -\n>  t/t4033-diff-patience.sh                           |   1 -\n>  t/t4034-diff-words.sh                              |   1 -\n>  t/t4035-diff-quiet.sh                              |   1 -\n>  t/t4036-format-patch-signer-mime.sh                |   1 -\n>  t/t4037-diff-r-t-dirs.sh                           |   1 -\n>  t/t4038-diff-combined.sh                           |   1 -\n>  t/t4039-diff-assume-unchanged.sh                   |   1 -\n>  t/t4040-whitespace-status.sh                       |   1 -\n>  t/t4041-diff-submodule-option.sh                   |   1 -\n>  t/t4042-diff-textconv-caching.sh                   |   1 -\n>  t/t4043-diff-rename-binary.sh                      |   1 -\n>  t/t4044-diff-index-unique-abbrev.sh                |   1 -\n>  t/t4045-diff-relative.sh                           |   1 -\n>  t/t4046-diff-unmerged.sh                           |   1 -\n>  t/t4047-diff-dirstat.sh                            |   1 -\n>  t/t4048-diff-combined-binary.sh                    |   1 -\n>  t/t4049-diff-stat-count.sh                         |   1 -\n>  t/t4050-diff-histogram.sh                          |   1 -\n>  t/t4051-diff-function-context.sh                   |   1 -\n>  t/t4052-stat-output.sh                             |   1 -\n>  t/t4053-diff-no-index.sh                           |   1 -\n>  t/t4054-diff-bogus-tree.sh                         |   1 -\n>  t/t4055-diff-context.sh                            |   1 -\n>  t/t4056-diff-order.sh                              |   1 -\n>  t/t4057-diff-combined-paths.sh                     |   1 -\n>  t/t4058-diff-duplicates.sh                         |   1 -\n>  t/t4059-diff-submodule-not-initialized.sh          |   1 -\n>  t/t4060-diff-submodule-option-diff-format.sh       |   1 -\n>  t/t4061-diff-indent.sh                             |   1 -\n>  t/t4062-diff-pickaxe.sh                            |   1 -\n>  t/t4063-diff-blobs.sh                              |   1 -\n>  t/t4064-diff-oidfind.sh                            |   1 -\n>  t/t4065-diff-anchored.sh                           |   1 -\n>  t/t4066-diff-emit-delay.sh                         |   1 -\n>  t/t4067-diff-partial-clone.sh                      |   1 -\n>  t/t4068-diff-symmetric-merge-base.sh               |   1 -\n>  t/t4069-remerge-diff.sh                            |   1 -\n>  t/t4100-apply-stat.sh                              |   1 -\n>  t/t4101-apply-nonl.sh                              |   1 -\n>  t/t4102-apply-rename.sh                            |   1 -\n>  t/t4103-apply-binary.sh                            |   1 -\n>  t/t4104-apply-boundary.sh                          |   1 -\n>  t/t4105-apply-fuzz.sh                              |   1 -\n>  t/t4106-apply-stdin.sh                             |   1 -\n>  t/t4107-apply-ignore-whitespace.sh                 |   1 -\n>  t/t4108-apply-threeway.sh                          |   1 -\n>  t/t4109-apply-multifrag.sh                         |   1 -\n>  t/t4110-apply-scan.sh                              |   1 -\n>  t/t4111-apply-subdir.sh                            |   1 -\n>  t/t4112-apply-renames.sh                           |   1 -\n>  t/t4113-apply-ending.sh                            |   1 -\n>  t/t4114-apply-typechange.sh                        |   1 -\n>  t/t4115-apply-symlink.sh                           |   1 -\n>  t/t4116-apply-reverse.sh                           |   1 -\n>  t/t4117-apply-reject.sh                            |   1 -\n>  t/t4118-apply-empty-context.sh                     |   1 -\n>  t/t4119-apply-config.sh                            |   1 -\n>  t/t4120-apply-popt.sh                              |   1 -\n>  t/t4121-apply-diffs.sh                             |   1 -\n>  t/t4122-apply-symlink-inside.sh                    |   1 -\n>  t/t4123-apply-shrink.sh                            |   1 -\n>  t/t4124-apply-ws-rule.sh                           |   1 -\n>  t/t4125-apply-ws-fuzz.sh                           |   1 -\n>  t/t4126-apply-empty.sh                             |   1 -\n>  t/t4127-apply-same-fn.sh                           |   1 -\n>  t/t4128-apply-root.sh                              |   1 -\n>  t/t4129-apply-samemode.sh                          |   1 -\n>  t/t4130-apply-criss-cross-rename.sh                |   1 -\n>  t/t4131-apply-fake-ancestor.sh                     |   1 -\n>  t/t4132-apply-removal.sh                           |   1 -\n>  t/t4133-apply-filenames.sh                         |   1 -\n>  t/t4134-apply-submodule.sh                         |   1 -\n>  t/t4135-apply-weird-filenames.sh                   |   1 -\n>  t/t4136-apply-check.sh                             |   1 -\n>  t/t4137-apply-submodule.sh                         |   1 -\n>  t/t4138-apply-ws-expansion.sh                      |   1 -\n>  t/t4139-apply-escape.sh                            |   1 -\n>  t/t4140-apply-ita.sh                               |   1 -\n>  t/t4141-apply-too-large.sh                         |   1 -\n>  t/t4150-am.sh                                      |   1 -\n>  t/t4151-am-abort.sh                                |   1 -\n>  t/t4152-am-subjects.sh                             |   1 -\n>  t/t4153-am-resume-override-opts.sh                 |   1 -\n>  t/t4200-rerere.sh                                  |   1 -\n>  t/t4201-shortlog.sh                                |   1 -\n>  t/t4202-log.sh                                     |   1 -\n>  t/t4203-mailmap.sh                                 |   1 -\n>  t/t4204-patch-id.sh                                |   1 -\n>  t/t4205-log-pretty-formats.sh                      |   1 -\n>  t/t4206-log-follow-harder-copies.sh                |   1 -\n>  t/t4207-log-decoration-colors.sh                   |   1 -\n>  t/t4208-log-magic-pathspec.sh                      |   1 -\n>  t/t4209-log-pickaxe.sh                             |   1 -\n>  t/t4210-log-i18n.sh                                |   1 -\n>  t/t4212-log-corrupt.sh                             |   1 -\n>  t/t4213-log-tabexpand.sh                           |   1 -\n>  t/t4214-log-graph-octopus.sh                       |   1 -\n>  t/t4215-log-skewed-merges.sh                       |   1 -\n>  t/t4216-log-bloom.sh                               |   1 -\n>  t/t4217-log-limit.sh                               |   1 -\n>  t/t4252-am-options.sh                              |   1 -\n>  t/t4253-am-keep-cr-dos.sh                          |   1 -\n>  t/t4254-am-corrupt.sh                              |   1 -\n>  t/t4255-am-submodule.sh                            |   1 -\n>  t/t4256-am-format-flowed.sh                        |   1 -\n>  t/t4257-am-interactive.sh                          |   1 -\n>  t/t4258-am-quoted-cr.sh                            |   1 -\n>  t/t4300-merge-tree.sh                              |   1 -\n>  t/t4301-merge-tree-write-tree.sh                   |   1 -\n>  t/t5000-tar-tree.sh                                |   1 -\n>  t/t5001-archive-attr.sh                            |   1 -\n>  t/t5002-archive-attr-pattern.sh                    |   1 -\n>  t/t5003-archive-zip.sh                             |   1 -\n>  t/t5004-archive-corner-cases.sh                    |   1 -\n>  t/t5100-mailinfo.sh                                |   1 -\n>  t/t5150-request-pull.sh                            |   1 -\n>  t/t5200-update-server-info.sh                      |   1 -\n>  t/t5300-pack-object.sh                             |   1 -\n>  t/t5301-sliding-window.sh                          |   1 -\n>  t/t5302-pack-index.sh                              |   1 -\n>  t/t5303-pack-corruption-resilience.sh              |   1 -\n>  t/t5304-prune.sh                                   |   1 -\n>  t/t5305-include-tag.sh                             |   1 -\n>  t/t5306-pack-nobase.sh                             |   1 -\n>  t/t5307-pack-missing-commit.sh                     |   1 -\n>  t/t5308-pack-detect-duplicates.sh                  |   1 -\n>  t/t5309-pack-delta-cycles.sh                       |   1 -\n>  t/t5310-pack-bitmaps.sh                            |   1 -\n>  t/t5311-pack-bitmaps-shallow.sh                    |   1 -\n>  t/t5312-prune-corruption.sh                        |   1 -\n>  t/t5313-pack-bounds-checks.sh                      |   1 -\n>  t/t5314-pack-cycle-detection.sh                    |   1 -\n>  t/t5315-pack-objects-compression.sh                |   1 -\n>  t/t5316-pack-delta-depth.sh                        |   1 -\n>  t/t5317-pack-objects-filter-objects.sh             |   1 -\n>  t/t5318-commit-graph.sh                            |   1 -\n>  t/t5319-multi-pack-index.sh                        |   1 -\n>  t/t5320-delta-islands.sh                           |   1 -\n>  t/t5321-pack-large-objects.sh                      |   1 -\n>  t/t5322-pack-objects-sparse.sh                     |   1 -\n>  t/t5323-pack-redundant.sh                          |   1 -\n>  t/t5324-split-commit-graph.sh                      |   1 -\n>  t/t5325-reverse-index.sh                           |   1 -\n>  t/t5326-multi-pack-bitmaps.sh                      |   1 -\n>  t/t5327-multi-pack-bitmaps-rev.sh                  |   1 -\n>  t/t5328-commit-graph-64bit-time.sh                 |   1 -\n>  t/t5329-pack-objects-cruft.sh                      |   1 -\n>  t/t5330-no-lazy-fetch-with-commit-graph.sh         |   1 -\n>  t/t5331-pack-objects-stdin.sh                      |   1 -\n>  t/t5332-multi-pack-reuse.sh                        |   1 -\n>  t/t5333-pseudo-merge-bitmaps.sh                    |   1 -\n>  t/t5334-incremental-multi-pack-index.sh            |   1 -\n>  t/t5351-unpack-large-objects.sh                    |   1 -\n>  t/t5400-send-pack.sh                               |   1 -\n>  t/t5401-update-hooks.sh                            |   1 -\n>  t/t5402-post-merge-hook.sh                         |   1 -\n>  t/t5403-post-checkout-hook.sh                      |   1 -\n>  t/t5404-tracking-branches.sh                       |   1 -\n>  t/t5405-send-pack-rewind.sh                        |   1 -\n>  t/t5406-remote-rejects.sh                          |   1 -\n>  t/t5407-post-rewrite-hook.sh                       |   1 -\n>  t/t5408-send-pack-stdin.sh                         |   1 -\n>  t/t5409-colorize-remote-messages.sh                |   1 -\n>  t/t5410-receive-pack-alternates.sh                 |   1 -\n>  t/t5411-proc-receive-hook.sh                       |   1 -\n>  t/t5500-fetch-pack.sh                              |   1 -\n>  t/t5501-fetch-push-alternates.sh                   |   1 -\n>  t/t5502-quickfetch.sh                              |   1 -\n>  t/t5503-tagfollow.sh                               |   1 -\n>  t/t5504-fetch-receive-strict.sh                    |   1 -\n>  t/t5505-remote.sh                                  |   1 -\n>  t/t5506-remote-groups.sh                           |   1 -\n>  t/t5507-remote-environment.sh                      |   1 -\n>  t/t5509-fetch-push-namespaces.sh                   |   1 -\n>  t/t5510-fetch.sh                                   |   1 -\n>  t/t5511-refspec.sh                                 |   1 -\n>  t/t5512-ls-remote.sh                               |   1 -\n>  t/t5513-fetch-track.sh                             |   1 -\n>  t/t5514-fetch-multiple.sh                          |   1 -\n>  t/t5515-fetch-merge-logic.sh                       |   1 -\n>  t/t5516-fetch-push.sh                              |   1 -\n>  t/t5517-push-mirror.sh                             |   1 -\n>  t/t5518-fetch-exit-status.sh                       |   1 -\n>  t/t5519-push-alternates.sh                         |   1 -\n>  t/t5520-pull.sh                                    |   1 -\n>  t/t5521-pull-options.sh                            |   1 -\n>  t/t5522-pull-symlink.sh                            |   1 -\n>  t/t5523-push-upstream.sh                           |   1 -\n>  t/t5524-pull-msg.sh                                |   1 -\n>  t/t5525-fetch-tagopt.sh                            |   1 -\n>  t/t5526-fetch-submodules.sh                        |   1 -\n>  t/t5527-fetch-odd-refs.sh                          |   1 -\n>  t/t5528-push-default.sh                            |   1 -\n>  t/t5529-push-errors.sh                             |   1 -\n>  t/t5530-upload-pack-error.sh                       |   1 -\n>  t/t5531-deep-submodule-push.sh                     |   1 -\n>  t/t5532-fetch-proxy.sh                             |   1 -\n>  t/t5533-push-cas.sh                                |   1 -\n>  t/t5534-push-signed.sh                             |   1 -\n>  t/t5535-fetch-push-symref.sh                       |   1 -\n>  t/t5536-fetch-conflicts.sh                         |   1 -\n>  t/t5537-fetch-shallow.sh                           |   1 -\n>  t/t5538-push-shallow.sh                            |   1 -\n>  t/t5539-fetch-http-shallow.sh                      |   1 -\n>  t/t5540-http-push-webdav.sh                        |   1 -\n>  t/t5541-http-push-smart.sh                         |   1 -\n>  t/t5542-push-http-shallow.sh                       |   1 -\n>  t/t5543-atomic-push.sh                             |   1 -\n>  t/t5544-pack-objects-hook.sh                       |   1 -\n>  t/t5545-push-options.sh                            |   1 -\n>  t/t5546-receive-limits.sh                          |   1 -\n>  t/t5547-push-quarantine.sh                         |   1 -\n>  t/t5548-push-porcelain.sh                          |   1 -\n>  t/t5549-fetch-push-http.sh                         |   1 -\n>  t/t5550-http-fetch-dumb.sh                         |   1 -\n>  t/t5551-http-fetch-smart.sh                        |   1 -\n>  t/t5552-skipping-fetch-negotiator.sh               |   1 -\n>  t/t5553-set-upstream.sh                            |   1 -\n>  t/t5554-noop-fetch-negotiator.sh                   |   1 -\n>  t/t5555-http-smart-common.sh                       |   1 -\n>  t/t5557-http-get.sh                                |   1 -\n>  t/t5560-http-backend-noserver.sh                   |   1 -\n>  t/t5561-http-backend.sh                            |   1 -\n>  t/t5562-http-backend-content-length.sh             |   1 -\n>  t/t5563-simple-http-auth.sh                        |   1 -\n>  t/t5564-http-proxy.sh                              |   1 -\n>  t/t5570-git-daemon.sh                              |   1 -\n>  t/t5571-pre-push-hook.sh                           |   1 -\n>  t/t5572-pull-submodule.sh                          |   1 -\n>  t/t5573-pull-verify-signatures.sh                  |   1 -\n>  t/t5574-fetch-output.sh                            |   1 -\n>  t/t5580-unc-paths.sh                               |   1 -\n>  t/t5581-http-curl-verbose.sh                       |   1 -\n>  t/t5582-fetch-negative-refspec.sh                  |   1 -\n>  t/t5583-push-branches.sh                           |   1 -\n>  t/t5600-clone-fail-cleanup.sh                      |   1 -\n>  t/t5601-clone.sh                                   |  26 +++--\n>  t/t5602-clone-remote-exec.sh                       |   1 -\n>  t/t5603-clone-dirname.sh                           |   1 -\n>  t/t5604-clone-reference.sh                         |   1 -\n>  t/t5605-clone-local.sh                             |   1 -\n>  t/t5606-clone-options.sh                           |   1 -\n>  t/t5607-clone-bundle.sh                            |   1 -\n>  t/t5609-clone-branch.sh                            |   1 -\n>  t/t5610-clone-detached.sh                          |   1 -\n>  t/t5611-clone-config.sh                            |   1 -\n>  t/t5612-clone-refspec.sh                           |   1 -\n>  t/t5613-info-alternate.sh                          |   1 -\n>  t/t5614-clone-submodules-shallow.sh                |   1 -\n>  t/t5615-alternate-env.sh                           |   1 -\n>  t/t5616-partial-clone.sh                           |   1 -\n>  t/t5617-clone-submodules-remote.sh                 |   1 -\n>  t/t5618-alternate-refs.sh                          |   1 -\n>  t/t5619-clone-local-ambiguous-transport.sh         |   1 -\n>  t/t5700-protocol-v1.sh                             |   1 -\n>  t/t5701-git-serve.sh                               |   1 -\n>  t/t5702-protocol-v2.sh                             |   1 -\n>  t/t5703-upload-pack-ref-in-want.sh                 |   1 -\n>  t/t5704-protocol-violations.sh                     |   1 -\n>  t/t5705-session-id-in-capabilities.sh              |   1 -\n>  t/t5730-protocol-v2-bundle-uri-file.sh             |   1 -\n>  t/t5731-protocol-v2-bundle-uri-git.sh              |   1 -\n>  t/t5732-protocol-v2-bundle-uri-http.sh             |   1 -\n>  t/t5750-bundle-uri-parse.sh                        |   1 -\n>  t/t5801-remote-helpers.sh                          |   1 -\n>  t/t5802-connect-helper.sh                          |   1 -\n>  t/t5810-proto-disable-local.sh                     |   1 -\n>  t/t5811-proto-disable-git.sh                       |   1 -\n>  t/t5812-proto-disable-http.sh                      |   1 -\n>  t/t5813-proto-disable-ssh.sh                       |   1 -\n>  t/t5814-proto-disable-ext.sh                       |   1 -\n>  t/t5815-submodule-protos.sh                        |   1 -\n>  t/t5900-repo-selection.sh                          |   1 -\n>  t/t6000-rev-list-misc.sh                           |   1 -\n>  t/t6001-rev-list-graft.sh                          |   1 -\n>  t/t6002-rev-list-bisect.sh                         |   1 -\n>  t/t6003-rev-list-topo-order.sh                     |   1 -\n>  t/t6004-rev-list-path-optim.sh                     |   1 -\n>  t/t6005-rev-list-count.sh                          |   1 -\n>  t/t6006-rev-list-format.sh                         |   1 -\n>  t/t6007-rev-list-cherry-pick-file.sh               |   1 -\n>  t/t6008-rev-list-submodule.sh                      |   1 -\n>  t/t6009-rev-list-parent.sh                         |   1 -\n>  t/t6010-merge-base.sh                              |   1 -\n>  t/t6011-rev-list-with-bad-commit.sh                |   1 -\n>  t/t6012-rev-list-simplify.sh                       |   1 -\n>  t/t6013-rev-list-reverse-parents.sh                |   1 -\n>  t/t6014-rev-list-all.sh                            |   1 -\n>  t/t6016-rev-list-graph-simplify-history.sh         |   1 -\n>  t/t6017-rev-list-stdin.sh                          |   1 -\n>  t/t6018-rev-list-glob.sh                           |   1 -\n>  t/t6019-rev-list-ancestry-path.sh                  |   1 -\n>  t/t6020-bundle-misc.sh                             |   1 -\n>  t/t6021-rev-list-exclude-hidden.sh                 |   1 -\n>  t/t6022-rev-list-missing.sh                        |   1 -\n>  t/t6040-tracking-info.sh                           |   1 -\n>  t/t6041-bisect-submodule.sh                        |   1 -\n>  t/t6050-replace.sh                                 |   1 -\n>  t/t6060-merge-index.sh                             |   1 -\n>  t/t6100-rev-list-in-order.sh                       |   1 -\n>  t/t6101-rev-parse-parents.sh                       |   1 -\n>  t/t6102-rev-list-unexpected-objects.sh             |   1 -\n>  t/t6110-rev-list-sparse.sh                         |   1 -\n>  t/t6111-rev-list-treesame.sh                       |   1 -\n>  t/t6112-rev-list-filters-objects.sh                |   1 -\n>  t/t6113-rev-list-bitmap-filters.sh                 |   1 -\n>  t/t6114-keep-packs.sh                              |   1 -\n>  t/t6115-rev-list-du.sh                             |   1 -\n>  t/t6120-describe.sh                                |   1 -\n>  t/t6130-pathspec-noglob.sh                         |   1 -\n>  t/t6131-pathspec-icase.sh                          |   1 -\n>  t/t6132-pathspec-exclude.sh                        |   1 -\n>  t/t6133-pathspec-rev-dwim.sh                       |   1 -\n>  t/t6134-pathspec-in-submodule.sh                   |   1 -\n>  t/t6135-pathspec-with-attrs.sh                     |   1 -\n>  t/t6136-pathspec-in-bare.sh                        |   1 -\n>  t/t6200-fmt-merge-msg.sh                           |   1 -\n>  t/t6300-for-each-ref.sh                            |   1 -\n>  t/t6301-for-each-ref-errors.sh                     |   1 -\n>  t/t6302-for-each-ref-filter.sh                     |   1 -\n>  t/t6400-merge-df.sh                                |   1 -\n>  t/t6401-merge-criss-cross.sh                       |   1 -\n>  t/t6402-merge-rename.sh                            |   1 -\n>  t/t6403-merge-file.sh                              |   1 -\n>  t/t6404-recursive-merge.sh                         |   1 -\n>  t/t6405-merge-symlinks.sh                          |   1 -\n>  t/t6406-merge-attr.sh                              |   1 -\n>  t/t6407-merge-binary.sh                            |   1 -\n>  t/t6408-merge-up-to-date.sh                        |   1 -\n>  t/t6409-merge-subtree.sh                           |   1 -\n>  t/t6411-merge-filemode.sh                          |   1 -\n>  t/t6412-merge-large-rename.sh                      |   1 -\n>  t/t6413-merge-crlf.sh                              |   1 -\n>  t/t6414-merge-rename-nocruft.sh                    |   1 -\n>  t/t6415-merge-dir-to-symlink.sh                    |   1 -\n>  t/t6416-recursive-corner-cases.sh                  |   1 -\n>  t/t6417-merge-ours-theirs.sh                       |   1 -\n>  t/t6418-merge-text-auto.sh                         |   1 -\n>  t/t6421-merge-partial-clone.sh                     |   1 -\n>  t/t6422-merge-rename-corner-cases.sh               |   1 -\n>  t/t6423-merge-rename-directories.sh                |   1 -\n>  t/t6424-merge-unrelated-index-changes.sh           |   1 -\n>  t/t6425-merge-rename-delete.sh                     |   1 -\n>  t/t6426-merge-skip-unneeded-updates.sh             |   1 -\n>  t/t6427-diff3-conflict-markers.sh                  |   1 -\n>  t/t6428-merge-conflicts-sparse.sh                  |   1 -\n>  t/t6429-merge-sequence-rename-caching.sh           |   1 -\n>  t/t6430-merge-recursive.sh                         |   1 -\n>  t/t6431-merge-criscross.sh                         |   1 -\n>  t/t6432-merge-recursive-space-options.sh           |   1 -\n>  t/t6433-merge-toplevel.sh                          |   1 -\n>  t/t6434-merge-recursive-rename-options.sh          |   1 -\n>  t/t6435-merge-sparse.sh                            |   1 -\n>  t/t6436-merge-overwrite.sh                         |   1 -\n>  t/t6437-submodule-merge.sh                         |   1 -\n>  t/t6438-submodule-directory-file-conflicts.sh      |   1 -\n>  t/t6439-merge-co-error-msgs.sh                     |   1 -\n>  t/t6500-gc.sh                                      |   1 -\n>  t/t6501-freshen-objects.sh                         |   1 -\n>  t/t6600-test-reach.sh                              |   1 -\n>  t/t6700-tree-depth.sh                              |   1 -\n>  t/t7001-mv.sh                                      |   1 -\n>  t/t7002-mv-sparse-checkout.sh                      |   1 -\n>  t/t7003-filter-branch.sh                           |   1 -\n>  t/t7004-tag.sh                                     |   1 -\n>  t/t7005-editor.sh                                  |   1 -\n>  t/t7006-pager.sh                                   |   1 -\n>  t/t7007-show.sh                                    |   1 -\n>  t/t7008-filter-branch-null-sha1.sh                 |   1 -\n>  t/t7010-setup.sh                                   |   1 -\n>  t/t7011-skip-worktree-reading.sh                   |   1 -\n>  t/t7012-skip-worktree-writing.sh                   |   1 -\n>  t/t7030-verify-tag.sh                              |   1 -\n>  t/t7031-verify-tag-signed-ssh.sh                   |   1 -\n>  t/t7060-wtstatus.sh                                |   1 -\n>  t/t7061-wtstatus-ignore.sh                         |   1 -\n>  t/t7062-wtstatus-ignorecase.sh                     |   1 -\n>  t/t7063-status-untracked-cache.sh                  |   1 -\n>  t/t7064-wtstatus-pv2.sh                            |   1 -\n>  t/t7101-reset-empty-subdirs.sh                     |   1 -\n>  t/t7102-reset.sh                                   |   1 -\n>  t/t7103-reset-bare.sh                              |   1 -\n>  t/t7104-reset-hard.sh                              |   1 -\n>  t/t7105-reset-patch.sh                             |   1 -\n>  t/t7106-reset-unborn-branch.sh                     |   1 -\n>  t/t7107-reset-pathspec-file.sh                     |   1 -\n>  t/t7110-reset-merge.sh                             |   1 -\n>  t/t7111-reset-table.sh                             |   1 -\n>  t/t7112-reset-submodule.sh                         |   1 -\n>  t/t7113-post-index-change-hook.sh                  |   1 -\n>  t/t7201-co.sh                                      |   1 -\n>  t/t7300-clean.sh                                   |   1 -\n>  t/t7301-clean-interactive.sh                       |   1 -\n>  t/t7400-submodule-basic.sh                         |   1 -\n>  t/t7401-submodule-summary.sh                       |   1 -\n>  t/t7402-submodule-rebase.sh                        |   1 -\n>  t/t7403-submodule-sync.sh                          |   1 -\n>  t/t7406-submodule-update.sh                        |   1 -\n>  t/t7407-submodule-foreach.sh                       |   1 -\n>  t/t7408-submodule-reference.sh                     |   1 -\n>  t/t7409-submodule-detached-work-tree.sh            |   1 -\n>  t/t7411-submodule-config.sh                        |   1 -\n>  t/t7412-submodule-absorbgitdirs.sh                 |   1 -\n>  t/t7413-submodule-is-active.sh                     |   1 -\n>  t/t7414-submodule-mistakes.sh                      |   1 -\n>  t/t7416-submodule-dash-url.sh                      |   1 -\n>  t/t7417-submodule-path-url.sh                      |   1 -\n>  t/t7418-submodule-sparse-gitmodules.sh             |   1 -\n>  t/t7419-submodule-set-branch.sh                    |   1 -\n>  t/t7420-submodule-set-url.sh                       |   1 -\n>  t/t7421-submodule-summary-add.sh                   |   1 -\n>  t/t7422-submodule-output.sh                        |   1 -\n>  t/t7423-submodule-symlinks.sh                      |   1 -\n>  t/t7424-submodule-mixed-ref-formats.sh             |   1 -\n>  t/t7450-bad-git-dotfiles.sh                        |   1 -\n>  t/t7500-commit-template-squash-signoff.sh          |   1 -\n>  t/t7501-commit-basic-functionality.sh              |   1 -\n>  t/t7502-commit-porcelain.sh                        |   1 -\n>  t/t7503-pre-commit-and-pre-merge-commit-hooks.sh   |   1 -\n>  t/t7504-commit-msg-hook.sh                         |   1 -\n>  t/t7505-prepare-commit-msg-hook.sh                 |   1 -\n>  t/t7506-status-submodule.sh                        |   1 -\n>  t/t7507-commit-verbose.sh                          |   1 -\n>  t/t7508-status.sh                                  |   1 -\n>  t/t7509-commit-authorship.sh                       |   1 -\n>  t/t7510-signed-commit.sh                           |   1 -\n>  t/t7511-status-index.sh                            |   1 -\n>  t/t7512-status-help.sh                             |   1 -\n>  t/t7513-interpret-trailers.sh                      |   1 -\n>  t/t7514-commit-patch.sh                            |   1 -\n>  t/t7515-status-symlinks.sh                         |   1 -\n>  t/t7516-commit-races.sh                            |   1 -\n>  t/t7517-per-repo-email.sh                          |   1 -\n>  t/t7518-ident-corner-cases.sh                      |   1 -\n>  t/t7519-status-fsmonitor.sh                        |   1 -\n>  t/t7520-ignored-hook-warning.sh                    |   1 -\n>  t/t7521-ignored-mode.sh                            |   1 -\n>  t/t7524-commit-summary.sh                          |   1 -\n>  t/t7525-status-rename.sh                           |   1 -\n>  t/t7526-commit-pathspec-file.sh                    |   1 -\n>  t/t7528-signed-commit-ssh.sh                       |   1 -\n>  t/t7600-merge.sh                                   |   1 -\n>  t/t7601-merge-pull-config.sh                       |   1 -\n>  t/t7602-merge-octopus-many.sh                      |   1 -\n>  t/t7603-merge-reduce-heads.sh                      |   1 -\n>  t/t7604-merge-custom-message.sh                    |   1 -\n>  t/t7605-merge-resolve.sh                           |   1 -\n>  t/t7606-merge-custom.sh                            |   1 -\n>  t/t7607-merge-state.sh                             |   1 -\n>  t/t7608-merge-messages.sh                          |   1 -\n>  t/t7609-mergetool--lib.sh                          |   1 -\n>  t/t7610-mergetool.sh                               |   1 -\n>  t/t7611-merge-abort.sh                             |   1 -\n>  t/t7612-merge-verify-signatures.sh                 |   1 -\n>  t/t7614-merge-signoff.sh                           |   1 -\n>  t/t7615-diff-algo-with-mergy-operations.sh         |   1 -\n>  t/t7700-repack.sh                                  |   1 -\n>  t/t7701-repack-unpack-unreachable.sh               |   1 -\n>  t/t7702-repack-cyclic-alternate.sh                 |   1 -\n>  t/t7703-repack-geometric.sh                        |   1 -\n>  t/t7704-repack-cruft.sh                            |   1 -\n>  t/t7800-difftool.sh                                |   1 -\n>  t/t7810-grep.sh                                    |   1 -\n>  t/t7811-grep-open.sh                               |   1 -\n>  t/t7812-grep-icase-non-ascii.sh                    |   1 -\n>  t/t7813-grep-icase-iso.sh                          |   1 -\n>  t/t7814-grep-recurse-submodules.sh                 |   1 -\n>  t/t7815-grep-binary.sh                             |   1 -\n>  t/t7816-grep-binary-pattern.sh                     |   1 -\n>  t/t7817-grep-sparse-checkout.sh                    |   1 -\n>  t/t7900-maintenance.sh                             |   1 -\n>  t/t8001-annotate.sh                                |   1 -\n>  t/t8002-blame.sh                                   |   1 -\n>  t/t8003-blame-corner-cases.sh                      |   1 -\n>  t/t8004-blame-with-conflicts.sh                    |   1 -\n>  t/t8005-blame-i18n.sh                              |   1 +\n>  t/t8006-blame-textconv.sh                          |   1 -\n>  t/t8007-cat-file-textconv.sh                       |   1 -\n>  t/t8008-blame-formats.sh                           |   1 -\n>  t/t8009-blame-vs-topicbranches.sh                  |   1 -\n>  t/t8010-cat-file-filters.sh                        |   1 -\n>  t/t8011-blame-split-file.sh                        |   1 -\n>  t/t8012-blame-colors.sh                            |   1 -\n>  t/t8013-blame-ignore-revs.sh                       |   1 -\n>  t/t8014-blame-ignore-fuzzy.sh                      |   1 -\n>  t/t9001-send-email.sh                              |   1 -\n>  t/t9002-column.sh                                  |   1 -\n>  t/t9003-help-autocorrect.sh                        |   1 -\n>  t/t9200-git-cvsexportcommit.sh                     |   1 -\n>  t/t9210-scalar.sh                                  |   1 -\n>  t/t9211-scalar-clone.sh                            |   1 -\n>  t/t9300-fast-import.sh                             |   1 -\n>  t/t9301-fast-import-notes.sh                       |   1 -\n>  t/t9302-fast-import-unpack-limit.sh                |   1 -\n>  t/t9303-fast-import-compression.sh                 |   1 -\n>  t/t9304-fast-import-marks.sh                       |   1 -\n>  t/t9350-fast-export.sh                             |   1 -\n>  t/t9351-fast-export-anonymize.sh                   |   1 -\n>  t/t9400-git-cvsserver-server.sh                    |   1 -\n>  t/t9401-git-cvsserver-crlf.sh                      |   1 -\n>  t/t9402-git-cvsserver-refs.sh                      |   1 -\n>  t/t9500-gitweb-standalone-no-errors.sh             |   1 -\n>  t/t9501-gitweb-standalone-http-status.sh           |   1 -\n>  t/t9502-gitweb-standalone-parse-output.sh          |   1 -\n>  t/t9600-cvsimport.sh                               |   1 -\n>  t/t9601-cvsimport-vendor-branch.sh                 |   1 -\n>  t/t9602-cvsimport-branches-tags.sh                 |   1 -\n>  t/t9603-cvsimport-patchsets.sh                     |   1 -\n>  t/t9604-cvsimport-timestamps.sh                    |   1 -\n>  t/t9700-perl-git.sh                                |   1 -\n>  t/t9800-git-p4-basic.sh                            |   1 -\n>  t/t9801-git-p4-branch.sh                           |   1 -\n>  t/t9802-git-p4-filetype.sh                         |   1 -\n>  t/t9803-git-p4-shell-metachars.sh                  |   1 -\n>  t/t9804-git-p4-label.sh                            |   1 -\n>  t/t9805-git-p4-skip-submit-edit.sh                 |   1 -\n>  t/t9806-git-p4-options.sh                          |   1 -\n>  t/t9808-git-p4-chdir.sh                            |   1 -\n>  t/t9809-git-p4-client-view.sh                      |   1 -\n>  t/t9810-git-p4-rcs.sh                              |   1 -\n>  t/t9811-git-p4-label-import.sh                     |   1 -\n>  t/t9812-git-p4-wildcards.sh                        |   1 -\n>  t/t9813-git-p4-preserve-users.sh                   |   1 -\n>  t/t9814-git-p4-rename.sh                           |   1 -\n>  t/t9815-git-p4-submit-fail.sh                      |   1 -\n>  t/t9816-git-p4-locked.sh                           |   1 -\n>  t/t9817-git-p4-exclude.sh                          |   1 -\n>  t/t9818-git-p4-block.sh                            |   1 -\n>  t/t9819-git-p4-case-folding.sh                     |   1 -\n>  t/t9820-git-p4-editor-handling.sh                  |   1 -\n>  t/t9821-git-p4-path-variations.sh                  |   1 -\n>  t/t9822-git-p4-path-encoding.sh                    |   1 -\n>  t/t9823-git-p4-mock-lfs.sh                         |   1 -\n>  t/t9825-git-p4-handle-utf16-without-bom.sh         |   1 -\n>  t/t9826-git-p4-keep-empty-commits.sh               |   1 -\n>  t/t9827-git-p4-change-filetype.sh                  |   1 -\n>  t/t9828-git-p4-map-user.sh                         |   1 -\n>  t/t9829-git-p4-jobs.sh                             |   1 -\n>  t/t9830-git-p4-symlink-dir.sh                      |   1 -\n>  t/t9831-git-p4-triggers.sh                         |   1 -\n>  t/t9832-unshelve.sh                                |   1 -\n>  t/t9833-errors.sh                                  |   1 -\n>  t/t9834-git-p4-file-dir-bug.sh                     |   1 -\n>  t/t9835-git-p4-metadata-encoding-python2.sh        |   1 -\n>  t/t9836-git-p4-metadata-encoding-python3.sh        |   1 -\n>  t/t9850-shell.sh                                   |   1 -\n>  t/t9901-git-web--browse.sh                         |   1 -\n>  t/t9902-completion.sh                              |   1 -\n>  t/t9903-bash-prompt.sh                             |   1 -\n>  t/test-lib.sh                                      |  72 +-----------\n>  t/unit-tests/strvec.c                              |  65 +++++++++++\n>  usage.c                                            |  15 ---\n>  950 files changed, 366 insertions(+), 1249 deletions(-)\n> \n> Range-diff versus v1:\n> \n>  1:  09dbc39ffb =  1:  76daa9584b builtin/blame: fix leaking blame entries with `--incremental`\n>  2:  15bbe539ea =  2:  6659f0d59b bisect: fix leaking good/bad terms when reading multipe times\n>  3:  739e28c864 =  3:  5a9011e1ef bisect: fix leaking string in `handle_bad_merge_base()`\n>  4:  fa91eb9dc6 =  4:  3afc0a7bfe bisect: fix leaking `current_bad_oid`\n>  5:  4ca01afd9e =  5:  15577aaae6 bisect: fix multiple leaks in `bisect_next_all()`\n>  6:  805b91ce20 =  6:  13ddfed4fc bisect: fix leaking commit list items in `check_merge_base()`\n>  7:  0f183fb264 !  7:  0bc49ed3bb bisect: fix various cases where we leak commit list items\n>     @@ bisect.c: static struct commit_list *skip_away(struct commit_list *list, int cou\n>      +\t\t\telse if (previous)\n>      +\t\t\t\tresult = previous;\n>      +\t\t\telse\n>     -+\t\t\t\tresult =  list;\n>     ++\t\t\t\tresult = list;\n>      +\t\t\tbreak;\n>       \t\t}\n>       \t\tprevious = cur;\n>  8:  163c36c78e =  8:  addba1afce line-log: fix leak when rewriting commit parents\n>  9:  c0bcfbd98b =  9:  6e501effad strvec: introduce new `strvec_splice()` function\n> 10:  cf0ac084c5 = 10:  2271761621 git: refactor alias handling to use a `struct strvec`\n> 11:  c4989aab86 = 11:  7bff5d167f git: refactor builtin handling to use a `struct strvec`\n> 12:  483d2951cc = 12:  e93d461504 split-index: fix memory leak in `move_cache_to_base_index()`\n> 13:  70b12d6347 = 13:  a0643da6f5 builtin/sparse-checkout: fix leaking sanitized patterns\n> 14:  f57d967cd5 = 14:  881feffeb1 help: refactor to not use globals for reading config\n> 15:  45aacddc8a <  -:  ---------- help: fix leaking `struct cmdnames`\n>  -:  ---------- > 15:  f1bbb676f2 help: fix leaking `struct cmdnames`\n> 16:  b61cc4da84 ! 16:  51c7ad993f help: fix leaking return value from `help_unknown_cmd()`\n>     @@ help.c: static const char bad_interpreter_advice[] =\n>       {\n>       \tstruct help_unknown_cmd_config cfg = { 0 };\n>       \tint i, n, best_similarity = 0;\n>     - \tstruct cmdnames main_cmds = { 0 };\n>     - \tstruct cmdnames other_cmds = { 0 };\n>     - \tstruct cmdname_help *common_cmds;\n>     --\tconst char *assumed = NULL;\n>     -+\tchar *assumed = NULL;\n>     - \n>     - \tread_early_config(the_repository, git_unknown_cmd_config, &cfg);\n>     - \n>      @@ help.c: const char *help_unknown_cmd(const char *cmd)\n>       \t\t\t; /* still counting */\n>       \t}\n>       \tif (cfg.autocorrect && n == 1 && SIMILAR_ENOUGH(best_similarity)) {\n>     --\t\tassumed = main_cmds.names[0]->name;\n>     +-\t\tconst char *assumed = main_cmds.names[0]->name;\n>      -\t\tmain_cmds.names[0] = NULL;\n>      -\t\tcmdnames_release(&main_cmds);\n>     -+\t\tassumed = xstrdup(main_cmds.names[0]->name);\n>     ++\t\tchar *assumed = xstrdup(main_cmds.names[0]->name);\n>      +\n>       \t\tfprintf_ln(stderr,\n>       \t\t\t   _(\"WARNING: You called a Git command named '%s', \"\n>       \t\t\t     \"which does not exist.\"),\n>     -@@ help.c: const char *help_unknown_cmd(const char *cmd)\n>     - \t\t\tstrbuf_release(&msg);\n>     - \t\t\tif (!(starts_with(answer, \"y\") ||\n>     - \t\t\t      starts_with(answer, \"Y\"))) {\n>     --\t\t\t\tassumed = NULL;\n>     -+\t\t\t\tFREE_AND_NULL(assumed);\n>     - \t\t\t\tgoto out;\n>     - \t\t\t}\n>     - \t\t} else {\n>      \n>       ## help.h ##\n>      @@ help.h: void list_all_other_cmds(struct string_list *list);\n> 17:  b38a39ef04 = 17:  38a25da315 builtin/help: fix leaks in `check_git_cmd()`\n> 18:  cd5cde9acb ! 18:  462c9fc110 builtin/init-db: fix leaking directory paths\n>     @@ builtin/init-db.c: int cmd_init_db(int argc,\n>      -\n>       \tflags |= INIT_DB_EXIST_OK;\n>      -\treturn init_db(git_dir, real_git_dir, template_dir, hash_algo,\n>     -+\tret =  init_db(git_dir, real_git_dir, template_dir, hash_algo,\n>     - \t\t       ref_storage_format, initial_branch,\n>     - \t\t       init_shared_repository, flags);\n>     +-\t\t       ref_storage_format, initial_branch,\n>     +-\t\t       init_shared_repository, flags);\n>     ++\tret = init_db(git_dir, real_git_dir, template_dir, hash_algo,\n>     ++\t\t      ref_storage_format, initial_branch,\n>     ++\t\t      init_shared_repository, flags);\n>      +\n>      +\tfree(template_dir_to_free);\n>      +\tfree(real_git_dir_to_free);\n> 19:  2c7b50461b = 19:  6eabeed343 builtin/branch: fix leaking sorting options\n> 20:  6865dda344 = 20:  2a44bbfba3 t/helper: fix leaking commit graph in \"read-graph\" subcommand\n>  -:  ---------- > 21:  fc8a96bac3 global: drop `UNLEAK()` annotation\n> 21:  d7d8ece289 ! 22:  10e44976c2 git-compat-util: drop `UNLEAK()` annotation\n>     @@ Metadata\n>      Author: Patrick Steinhardt <ps@pks.im>\n>      \n>       ## Commit message ##\n>     -    git-compat-util: drop `UNLEAK()` annotation\n>     +    git-compat-util: drop now-unused `UNLEAK()` macro\n>      \n>     -    There are two users of `UNLEAK()` left in our codebase:\n>     -\n>     -      - In \"builtin/clone.c\", annotating the `repo` variable. That leak has\n>     -        already been fixed though as you can see in the context, where we do\n>     -        know to free `repo_to_free`.\n>     -\n>     -      - In \"builtin/diff.c\", to unleak entries of the `blob[]` array. That\n>     -        leak has also been fixed, because the entries we assign to that\n>     -        array come from `rev.pending.objects`, and we do eventually release\n>     -        `rev`.\n>     -\n>     -    This neatly demonstrates one of the issues with `UNLEAK()`: it is quite\n>     -    easy for the annotation to become stale. A second issue is that its\n>     -    whole intent is to paper over leaks. And while that has been a necessary\n>     -    evil in the past, because Git was leaking left and right, it isn't\n>     -    really much of an issue nowadays where our test suite has no known leaks\n>     +    The `UNLEAK()` macro has been introduced with 0e5bba53af (add UNLEAK\n>     +    annotation for reducing leak false positives, 2017-09-08) to help us\n>     +    reduce the amount of reported memory leaks in cases we don't care about,\n>     +    e.g. when exiting immediately afterwards. We have since removed all of\n>     +    its users in favor of freeing the memory and thus don't need the macro\n>          anymore.\n>      \n>     -    Remove the last two users and drop the now-unused `UNLEAK()` annotation.\n>     +    Remove it.\n>      \n>          Signed-off-by: Patrick Steinhardt <ps@pks.im>\n>      \n>     - ## builtin/clone.c ##\n>     -@@ builtin/clone.c: int cmd_clone(int argc,\n>     - \tfree(dir);\n>     - \tfree(path);\n>     - \tfree(repo_to_free);\n>     --\tUNLEAK(repo);\n>     - \tjunk_mode = JUNK_LEAVE_ALL;\n>     - \n>     - \ttransport_ls_refs_options_release(&transport_ls_refs_options);\n>     -\n>     - ## builtin/diff.c ##\n>     -@@ builtin/diff.c: int cmd_diff(int argc,\n>     - \trelease_revisions(&rev);\n>     - \tobject_array_clear(&ent);\n>     - \tsymdiff_release(&sdiff);\n>     --\tUNLEAK(blob);\n>     - \treturn result;\n>     - }\n>     -\n>       ## git-compat-util.h ##\n>      @@ git-compat-util.h: int cmd_main(int, const char **);\n>       int common_exit(const char *file, int line, int code);\n> 22:  d52ca35b05 = 23:  218132b7d5 t5601: work around leak sanitizer issue\n> 23:  44b48929fb = 24:  832c87a045 t: mark some tests as leak free\n> 24:  b1fdbe04be = 25:  5fc1319241 t: remove unneeded !SANITIZE_LEAK prerequisites\n> 25:  2b752b71c6 = 26:  06a1e8b27c test-lib: unconditionally enable leak checking\n> 26:  53bc5f7d75 = 27:  19428158c8 t: remove TEST_PASSES_SANITIZE_LEAK annotations\n\nThis iteration addresses all of my comments.\n\nThanks again for working on this.  And congratulations, it's not even\nthe end of the year and memory leak checks are opt-out.\n\n> \n> ---\n> base-commit: b0c643d6a710e2b092902a3941655176b358bfd0\n> change-id: 20241111-b4-pks-leak-fixes-pt10-a6fa657f4fac\n> \n"},{"id":"507111","messageId":"3b311295-f43c-4b4d-bbbc-79e49eb5911d@gmail.com","threadId":"62477","inReplyTo":"894bb8da-fd5d-4352-a31f-3167b3cd7e1b@gmail.com","subject":"Re: [PATCH v2 00/27] Memory leak fixes (pt.10, final)","fromName":"Rubén Justo","fromEmail":"rjusto@gmail.com","sentAt":"2024-11-12T08:06:21Z","receivedAt":"2024-11-12T08:06:25Z","isPatch":true,"sender":{"key":"rjusto@gmail.com","avatar":"https://avatars.githubusercontent.com/u/5685487?v=4"},"body":"On Tue, Nov 12, 2024 at 12:33:16AM +0100, Rubén Justo wrote:\n\n>> Range-diff versus v1:\n>>\n>>  1:  09dbc39ffb =  1:  76daa9584b builtin/blame: fix leaking blame entries with `--incremental`\n>>  2:  15bbe539ea =  2:  6659f0d59b bisect: fix leaking good/bad terms when reading multipe times\n>>  3:  739e28c864 =  3:  5a9011e1ef bisect: fix leaking string in `handle_bad_merge_base()`\n>>  4:  fa91eb9dc6 =  4:  3afc0a7bfe bisect: fix leaking `current_bad_oid`\n>>  5:  4ca01afd9e =  5:  15577aaae6 bisect: fix multiple leaks in `bisect_next_all()`\n>>  6:  805b91ce20 =  6:  13ddfed4fc bisect: fix leaking commit list items in `check_merge_base()`\n>>  7:  0f183fb264 !  7:  0bc49ed3bb bisect: fix various cases where we leak commit list items\n>>     @@ bisect.c: static struct commit_list *skip_away(struct commit_list *list, int cou\n>>      +\t\t\telse if (previous)\n>>      +\t\t\t\tresult = previous;\n>>      +\t\t\telse\n>>     -+\t\t\t\tresult =  list;\n>>     ++\t\t\t\tresult = list;\n>>      +\t\t\tbreak;\n>>       \t\t}\n>>       \t\tprevious = cur;\n>>  8:  163c36c78e =  8:  addba1afce line-log: fix leak when rewriting commit parents\n>>  9:  c0bcfbd98b =  9:  6e501effad strvec: introduce new `strvec_splice()` function\n>> 10:  cf0ac084c5 = 10:  2271761621 git: refactor alias handling to use a `struct strvec`\n>> 11:  c4989aab86 = 11:  7bff5d167f git: refactor builtin handling to use a `struct strvec`\n>> 12:  483d2951cc = 12:  e93d461504 split-index: fix memory leak in `move_cache_to_base_index()`\n>> 13:  70b12d6347 = 13:  a0643da6f5 builtin/sparse-checkout: fix leaking sanitized patterns\n>> 14:  f57d967cd5 = 14:  881feffeb1 help: refactor to not use globals for reading config\n>> 15:  45aacddc8a <  -:  ---------- help: fix leaking `struct cmdnames`\n>>  -:  ---------- > 15:  f1bbb676f2 help: fix leaking `struct cmdnames`\n>> 16:  b61cc4da84 ! 16:  51c7ad993f help: fix leaking return value from `help_unknown_cmd()`\n>>     @@ help.c: static const char bad_interpreter_advice[] =\n>>       {\n>>       \tstruct help_unknown_cmd_config cfg = { 0 };\n>>       \tint i, n, best_similarity = 0;\n>>     - \tstruct cmdnames main_cmds = { 0 };\n>>     - \tstruct cmdnames other_cmds = { 0 };\n>>     - \tstruct cmdname_help *common_cmds;\n>>     --\tconst char *assumed = NULL;\n>>     -+\tchar *assumed = NULL;\n>>     - \n>>     - \tread_early_config(the_repository, git_unknown_cmd_config, &cfg);\n>>     - \n>>      @@ help.c: const char *help_unknown_cmd(const char *cmd)\n>>       \t\t\t; /* still counting */\n>>       \t}\n>>       \tif (cfg.autocorrect && n == 1 && SIMILAR_ENOUGH(best_similarity)) {\n>>     --\t\tassumed = main_cmds.names[0]->name;\n>>     +-\t\tconst char *assumed = main_cmds.names[0]->name;\n>>      -\t\tmain_cmds.names[0] = NULL;\n>>      -\t\tcmdnames_release(&main_cmds);\n>>     -+\t\tassumed = xstrdup(main_cmds.names[0]->name);\n>>     ++\t\tchar *assumed = xstrdup(main_cmds.names[0]->name);\n>>      +\n>>       \t\tfprintf_ln(stderr,\n>>       \t\t\t   _(\"WARNING: You called a Git command named '%s', \"\n>>       \t\t\t     \"which does not exist.\"),\n>>     -@@ help.c: const char *help_unknown_cmd(const char *cmd)\n>>     - \t\t\tstrbuf_release(&msg);\n>>     - \t\t\tif (!(starts_with(answer, \"y\") ||\n>>     - \t\t\t      starts_with(answer, \"Y\"))) {\n>>     --\t\t\t\tassumed = NULL;\n>>     -+\t\t\t\tFREE_AND_NULL(assumed);\n>>     - \t\t\t\tgoto out;\n>>     - \t\t\t}\n>>     - \t\t} else {\n>>      \n>>       ## help.h ##\n>>      @@ help.h: void list_all_other_cmds(struct string_list *list);\n>> 17:  b38a39ef04 = 17:  38a25da315 builtin/help: fix leaks in `check_git_cmd()`\n>> 18:  cd5cde9acb ! 18:  462c9fc110 builtin/init-db: fix leaking directory paths\n>>     @@ builtin/init-db.c: int cmd_init_db(int argc,\n>>      -\n>>       \tflags |= INIT_DB_EXIST_OK;\n>>      -\treturn init_db(git_dir, real_git_dir, template_dir, hash_algo,\n>>     -+\tret =  init_db(git_dir, real_git_dir, template_dir, hash_algo,\n>>     - \t\t       ref_storage_format, initial_branch,\n>>     - \t\t       init_shared_repository, flags);\n>>     +-\t\t       ref_storage_format, initial_branch,\n>>     +-\t\t       init_shared_repository, flags);\n>>     ++\tret = init_db(git_dir, real_git_dir, template_dir, hash_algo,\n>>     ++\t\t      ref_storage_format, initial_branch,\n>>     ++\t\t      init_shared_repository, flags);\n>>      +\n>>      +\tfree(template_dir_to_free);\n>>      +\tfree(real_git_dir_to_free);\n>> 19:  2c7b50461b = 19:  6eabeed343 builtin/branch: fix leaking sorting options\n>> 20:  6865dda344 = 20:  2a44bbfba3 t/helper: fix leaking commit graph in \"read-graph\" subcommand\n>>  -:  ---------- > 21:  fc8a96bac3 global: drop `UNLEAK()` annotation\n>> 21:  d7d8ece289 ! 22:  10e44976c2 git-compat-util: drop `UNLEAK()` annotation\n>>     @@ Metadata\n>>      Author: Patrick Steinhardt <ps@pks.im>\n>>      \n>>       ## Commit message ##\n>>     -    git-compat-util: drop `UNLEAK()` annotation\n>>     +    git-compat-util: drop now-unused `UNLEAK()` macro\n>>      \n>>     -    There are two users of `UNLEAK()` left in our codebase:\n>>     -\n>>     -      - In \"builtin/clone.c\", annotating the `repo` variable. That leak has\n>>     -        already been fixed though as you can see in the context, where we do\n>>     -        know to free `repo_to_free`.\n>>     -\n>>     -      - In \"builtin/diff.c\", to unleak entries of the `blob[]` array. That\n>>     -        leak has also been fixed, because the entries we assign to that\n>>     -        array come from `rev.pending.objects`, and we do eventually release\n>>     -        `rev`.\n>>     -\n>>     -    This neatly demonstrates one of the issues with `UNLEAK()`: it is quite\n>>     -    easy for the annotation to become stale. A second issue is that its\n>>     -    whole intent is to paper over leaks. And while that has been a necessary\n>>     -    evil in the past, because Git was leaking left and right, it isn't\n>>     -    really much of an issue nowadays where our test suite has no known leaks\n>>     +    The `UNLEAK()` macro has been introduced with 0e5bba53af (add UNLEAK\n>>     +    annotation for reducing leak false positives, 2017-09-08) to help us\n>>     +    reduce the amount of reported memory leaks in cases we don't care about,\n>>     +    e.g. when exiting immediately afterwards. We have since removed all of\n>>     +    its users in favor of freeing the memory and thus don't need the macro\n>>          anymore.\n>>      \n>>     -    Remove the last two users and drop the now-unused `UNLEAK()` annotation.\n>>     +    Remove it.\n>>      \n>>          Signed-off-by: Patrick Steinhardt <ps@pks.im>\n>>      \n>>     - ## builtin/clone.c ##\n>>     -@@ builtin/clone.c: int cmd_clone(int argc,\n>>     - \tfree(dir);\n>>     - \tfree(path);\n>>     - \tfree(repo_to_free);\n>>     --\tUNLEAK(repo);\n>>     - \tjunk_mode = JUNK_LEAVE_ALL;\n>>     - \n>>     - \ttransport_ls_refs_options_release(&transport_ls_refs_options);\n>>     -\n>>     - ## builtin/diff.c ##\n>>     -@@ builtin/diff.c: int cmd_diff(int argc,\n>>     - \trelease_revisions(&rev);\n>>     - \tobject_array_clear(&ent);\n>>     - \tsymdiff_release(&sdiff);\n>>     --\tUNLEAK(blob);\n>>     - \treturn result;\n>>     - }\n>>     -\n>>       ## git-compat-util.h ##\n>>      @@ git-compat-util.h: int cmd_main(int, const char **);\n>>       int common_exit(const char *file, int line, int code);\n>> 22:  d52ca35b05 = 23:  218132b7d5 t5601: work around leak sanitizer issue\n>> 23:  44b48929fb = 24:  832c87a045 t: mark some tests as leak free\n>> 24:  b1fdbe04be = 25:  5fc1319241 t: remove unneeded !SANITIZE_LEAK prerequisites\n>> 25:  2b752b71c6 = 26:  06a1e8b27c test-lib: unconditionally enable leak checking\n>> 26:  53bc5f7d75 = 27:  19428158c8 t: remove TEST_PASSES_SANITIZE_LEAK annotations\n>\n> This iteration addresses all of my comments.\n>\n> Thanks again for working on this.  And congratulations, it's not even\n> the end of the year and memory leak checks are opt-out.\n\nJunio, reviewing the range-diff again this morning with what has been\nqueued I noticed this:\n\n    $ git range-diff ea42eb76e7...a0c677023d\n    [...]\n    25:  67df655518 ! 26:  b2863b3f06 test-lib: unconditionally enable leak checking\n        @@ Commit message\n             finally fixed the last leak exposed by our test suite, which means that\n             we are now basically leak free wherever we have branch coverage.\n    \n        -    From hereon, the Git test suite should ideally stay free of memory\n        +    >From hereon, the Git test suite should ideally stay free of memory\n             leaks. Most importantly, any test suite that is being added should\n             automatically be subject to the leak checker, and if that test does not\n             pass it is a strong signal that the added code introduced new memory\n    26:  ea42eb76e7 = 27:  a0c677023d t: remove TEST_PASSES_SANITIZE_LEAK annotations\n\n>\n>>\n>> ---\n>> base-commit: b0c643d6a710e2b092902a3941655176b358bfd0\n>> change-id: 20241111-b4-pks-leak-fixes-pt10-a6fa657f4fac\n>>\n"},{"id":"507112","messageId":"20241112082609.GA3166560@coredump.intra.peff.net","threadId":"62477","inReplyTo":"20241111-b4-pks-leak-fixes-pt10-v2-21-6154bf91f0b0@pks.im","subject":"Re: [PATCH v2 21/27] global: drop `UNLEAK()` annotation","fromName":"Jeff King","fromEmail":"peff@peff.net","sentAt":"2024-11-12T08:26:09Z","receivedAt":"2024-11-12T08:26:18Z","isPatch":true,"sender":{"key":"peff@peff.net","avatar":"https://avatars.githubusercontent.com/u/45925?v=4"},"body":"On Mon, Nov 11, 2024 at 11:38:50AM +0100, Patrick Steinhardt wrote:\n\n> There are two users of `UNLEAK()` left in our codebase:\n> \n>   - In \"builtin/clone.c\", annotating the `repo` variable. That leak has\n>     already been fixed though as you can see in the context, where we do\n>     know to free `repo_to_free`.\n> \n>   - In \"builtin/diff.c\", to unleak entries of the `blob[]` array. That\n>     leak has also been fixed, because the entries we assign to that\n>     array come from `rev.pending.objects`, and we do eventually release\n>     `rev`.\n\nYay, as the author of UNLEAK() I'm in favor of getting rid of it.\n\n> This neatly demonstrates one of the issues with `UNLEAK()`: it is quite\n> easy for the annotation to become stale. A second issue is that its\n> whole intent is to paper over leaks. And while that has been a necessary\n> evil in the past, because Git was leaking left and right, it isn't\n> really much of an issue nowadays where our test suite has no known leaks\n> anymore.\n\nI do agree that stale annotations are a weakness (they do not hurt the\nleak-checker if they exist, but they are an eye-sore).\n\nI'm not sure I would agree that the intent was to paper over leaks. The\npoint was to avoid noise from the leak-checker about memory that was\nintentionally held until program exit and released by returning from\nmain(). I think the main thing that made it obsolete is that we decided\nit was worth it to spend the cycles freeing that memory rather than\nignoring it.\n\nBut it's possible I'm just splitting hairs. :)\n\nAt any rate, for whatever reason people did not seem to use it as\nintended, and _did_ end up annotating real leaks (papering over them). I\nguess I could have done a better job of explaining it.\n\n-Peff\n"},{"id":"507119","messageId":"ZzMXh-Pcb4SMSno0@pks.im","threadId":"62477","inReplyTo":"20241112082609.GA3166560@coredump.intra.peff.net","subject":"Re: [PATCH v2 21/27] global: drop `UNLEAK()` annotation","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-12T08:53:28Z","receivedAt":"2024-11-12T08:53:41Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"On Tue, Nov 12, 2024 at 03:26:09AM -0500, Jeff King wrote:\n> On Mon, Nov 11, 2024 at 11:38:50AM +0100, Patrick Steinhardt wrote:\n> > This neatly demonstrates one of the issues with `UNLEAK()`: it is quite\n> > easy for the annotation to become stale. A second issue is that its\n> > whole intent is to paper over leaks. And while that has been a necessary\n> > evil in the past, because Git was leaking left and right, it isn't\n> > really much of an issue nowadays where our test suite has no known leaks\n> > anymore.\n> \n> I do agree that stale annotations are a weakness (they do not hurt the\n> leak-checker if they exist, but they are an eye-sore).\n> \n> I'm not sure I would agree that the intent was to paper over leaks. The\n> point was to avoid noise from the leak-checker about memory that was\n> intentionally held until program exit and released by returning from\n> main(). I think the main thing that made it obsolete is that we decided\n> it was worth it to spend the cycles freeing that memory rather than\n> ignoring it.\n> \n> But it's possible I'm just splitting hairs. :)\n\nYeah, I know that this was also used to mark memory that intentionally\nleaks because we're about to exit anyway. I basically consider that as\nsome form of \"papering over\" it, but I get your comment that this may be\na bit too strongly worded.\n\nDo you want me to reformulate this, or do we just go with the current\ndescription?\n\nPatrick\n"},{"id":"507120","messageId":"20241112090303.GA3687943@coredump.intra.peff.net","threadId":"62477","inReplyTo":"ZzMXh-Pcb4SMSno0@pks.im","subject":"Re: [PATCH v2 21/27] global: drop `UNLEAK()` annotation","fromName":"Jeff King","fromEmail":"peff@peff.net","sentAt":"2024-11-12T09:03:03Z","receivedAt":"2024-11-12T09:03:04Z","isPatch":true,"sender":{"key":"peff@peff.net","avatar":"https://avatars.githubusercontent.com/u/45925?v=4"},"body":"On Tue, Nov 12, 2024 at 09:53:28AM +0100, Patrick Steinhardt wrote:\n\n> On Tue, Nov 12, 2024 at 03:26:09AM -0500, Jeff King wrote:\n> > On Mon, Nov 11, 2024 at 11:38:50AM +0100, Patrick Steinhardt wrote:\n> > > This neatly demonstrates one of the issues with `UNLEAK()`: it is quite\n> > > easy for the annotation to become stale. A second issue is that its\n> > > whole intent is to paper over leaks. And while that has been a necessary\n> > > evil in the past, because Git was leaking left and right, it isn't\n> > > really much of an issue nowadays where our test suite has no known leaks\n> > > anymore.\n> > \n> > I do agree that stale annotations are a weakness (they do not hurt the\n> > leak-checker if they exist, but they are an eye-sore).\n> > \n> > I'm not sure I would agree that the intent was to paper over leaks. The\n> > point was to avoid noise from the leak-checker about memory that was\n> > intentionally held until program exit and released by returning from\n> > main(). I think the main thing that made it obsolete is that we decided\n> > it was worth it to spend the cycles freeing that memory rather than\n> > ignoring it.\n> > \n> > But it's possible I'm just splitting hairs. :)\n> \n> Yeah, I know that this was also used to mark memory that intentionally\n> leaks because we're about to exit anyway. I basically consider that as\n> some form of \"papering over\" it, but I get your comment that this may be\n> a bit too strongly worded.\n> \n> Do you want me to reformulate this, or do we just go with the current\n> description?\n\nNah, I think it is OK to leave it as-is. The important thing is that it\nis gone. :)\n\n(Thanks for all your work on this, btw. I was so happy to see the commit\ndropping all of the PASSING_SANITIZE_LEAK infrastructure).\n\n-Peff\n"},{"id":"507698","messageId":"877c8yti5n.fsf@iotcl.com","threadId":"62477","inReplyTo":"20241111-b4-pks-leak-fixes-pt10-v2-9-6154bf91f0b0@pks.im","subject":"Re: [PATCH v2 09/27] strvec: introduce new `strvec_splice()` function","fromName":"Toon Claes","fromEmail":"toon@iotcl.com","sentAt":"2024-11-20T08:37:40Z","receivedAt":"2024-11-20T08:38:00Z","isPatch":true,"sender":{"key":"toon@iotcl.com","avatar":"https://avatars.githubusercontent.com/u/121621?v=4"},"body":"Patrick Steinhardt <ps@pks.im> writes:\n\n> Introduce a new `strvec_splice()` function that can replace a range of\n> strings in the vector with another array of strings. This function will\n> be used in subsequent commits.\n>\n> Signed-off-by: Patrick Steinhardt <ps@pks.im>\n> ---\n>  strvec.c              | 19 +++++++++++++++\n>  strvec.h              |  9 +++++++\n>  t/unit-tests/strvec.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++\n>  3 files changed, 93 insertions(+)\n>\n> diff --git a/strvec.c b/strvec.c\n> index f712070f5745d5f998d0846ac4009441dddfa500..81075c50cca4fe44608775541d876294a79d9e4e 100644\n> --- a/strvec.c\n> +++ b/strvec.c\n> @@ -56,6 +56,25 @@ void strvec_pushv(struct strvec *array, const char **items)\n>  \t\tstrvec_push(array, *items);\n>  }\n>  \n> +void strvec_splice(struct strvec *array, size_t pos, size_t len,\n> +\t\t   const char **replacement, size_t replacement_len)\n> +{\n> +\tif (pos + len > array->alloc)\n> +\t\tBUG(\"range outside of array boundary\");\n\nWhy aren't you checking against array->nr? I was trying a test case for\nthis, and this seems to be unexpected behavior:\n\n\tvoid test_strvec__splice_insert_after_nr(void)\n\t{\n\t\tstruct strvec vec = STRVEC_INIT;\n\t\tconst char *replacement[] = { \"1\" };\n\n\t\tstrvec_pushl(&vec, \"foo\", \"bar\", \"baz\", \"buzz\", \"fuzz\", NULL);\n\t\tstrvec_pop(&vec);\n\t\tcheck_strvec(&vec, \"foo\", \"bar\", \"baz\", \"buzz\", NULL);\n\t\tstrvec_pop(&vec);\n\t\tcheck_strvec(&vec, \"foo\", \"bar\", \"baz\", NULL);\n\t\tstrvec_pop(&vec);\n\t\tstrvec_splice(&vec, 4, 1, replacement, ARRAY_SIZE(replacement));\n\t\tcheck_strvec(&vec, \"foo\", \"bar\", \"baz\", NULL, \"1\", NULL);\n\t\tstrvec_clear(&vec);\n\t}\n\n> +\tif (replacement_len > len)\n> +\t\tALLOC_GROW(array->v, array->nr + (replacement_len - len) + 1,\n> +\t\t\t   array->alloc);\n> +\tfor (size_t i = 0; i < len; i++)\n> +\t\tfree((char *)array->v[pos + i]);\n> +\tif (replacement_len != len) {\n> +\t\tmemmove(array->v + pos + replacement_len, array->v + pos + len,\n> +\t\t\t(array->nr - pos - len + 1) * sizeof(char *));\n> +\t\tarray->nr += (replacement_len - len);\n> +\t}\n> +\tfor (size_t i = 0; i < replacement_len; i++)\n> +\t\tarray->v[pos + i] = xstrdup(replacement[i]);\n> +}\n> +\n>  const char *strvec_replace(struct strvec *array, size_t idx, const char *replacement)\n>  {\n>  \tchar *to_free;\n> diff --git a/strvec.h b/strvec.h\n> index 4b73c1f092e9b016ce3299035477713c6267cdae..4e61cc9336938a95318974903f9b35dcdc4da1cd 100644\n> --- a/strvec.h\n> +++ b/strvec.h\n> @@ -67,6 +67,15 @@ void strvec_pushl(struct strvec *, ...);\n>  /* Push a null-terminated array of strings onto the end of the array. */\n>  void strvec_pushv(struct strvec *, const char **);\n>  \n> +/*\n\nTiniest nit: I see the majority of the function comments in this file\nstart with a double asterisk, should we do the same here?\n\n> + * Replace `len` values starting at `pos` with the provided replacement\n> + * strings. If `len` is zero this is effectively an insert at the given `pos`.\n> + * If `replacement_len` is zero this is effectively a delete of `len` items\n> + * starting at `pos`.\n> + */\n> +void strvec_splice(struct strvec *array, size_t pos, size_t len,\n\nIn this file we seem to commonly use `idx` instead of `pos`.\n\n\n-- \nToon\n"},{"id":"507710","messageId":"875xoitcu8.fsf@iotcl.com","threadId":"62477","inReplyTo":"20241111-b4-pks-leak-fixes-pt10-v2-7-6154bf91f0b0@pks.im","subject":"Re: [PATCH v2 07/27] bisect: fix various cases where we leak commit list items","fromName":"Toon Claes","fromEmail":"toon@iotcl.com","sentAt":"2024-11-20T10:32:31Z","receivedAt":"2024-11-20T10:32:53Z","isPatch":true,"sender":{"key":"toon@iotcl.com","avatar":"https://avatars.githubusercontent.com/u/121621?v=4"},"body":"Patrick Steinhardt <ps@pks.im> writes:\n\n> There are various cases where we leak commit list items because we\n> evict items from the list, but don't free them. Plug those.\n>\n> Signed-off-by: Patrick Steinhardt <ps@pks.im>\n> ---\n>  bisect.c                    | 35 +++++++++++++++++++++++++++--------\n>  t/t6030-bisect-porcelain.sh |  1 +\n>  2 files changed, 28 insertions(+), 8 deletions(-)\n>\n> diff --git a/bisect.c b/bisect.c\n> index 12efcff2e3c1836ab6e63d36e4d42269fbcaeaab..0e804086cbf6a02d42bda98b62fb86daf099b82d 100644\n> --- a/bisect.c\n> +++ b/bisect.c\n> @@ -440,11 +440,19 @@ void find_bisection(struct commit_list **commit_list, int *reaches,\n>  \t\t\tfree_commit_list(list->next);\n>  \t\t\tbest = list;\n>  \t\t\tbest->next = NULL;\n> +\t\t} else {\n> +\t\t\tfor (p = list; p != best; p = next) {\n> +\t\t\t\tnext = p->next;\n> +\t\t\t\tfree(p);\n> +\t\t\t}\n\nThis makes the code do:\n\n    if (!something) {\n        // ...\n    } else {\n        // ...\n    }\n\nI find it odd reading code like that. Would you mind swapping them\naround? Or is there a reason we type it like this, because I see this\nalso being done like this around line 393?\n\nMore on the functional side of this code, I'd like to understand better\nwhat's happening here.\nIt's clear to me when `best` is NULL we want to free the whole\ncommit_list. And when `best` is set with FIND_BISECTION_ALL flag set, we\nwant to free the commit_list up to `best`. But when the\nFIND_BISECTION_ALL flag is not set, we want to do the opposite, free\nfrom `best->next` till the end? But what has this to do with\nFIND_BISECTION_ALL? \n\n--\nToon\n"},{"id":"507712","messageId":"8734jmtcjs.fsf@iotcl.com","threadId":"62477","inReplyTo":"20241111-b4-pks-leak-fixes-pt10-v2-11-6154bf91f0b0@pks.im","subject":"Re: [PATCH v2 11/27] git: refactor builtin handling to use a `struct strvec`","fromName":"Toon Claes","fromEmail":"toon@iotcl.com","sentAt":"2024-11-20T10:38:47Z","receivedAt":"2024-11-20T10:39:00Z","isPatch":true,"sender":{"key":"toon@iotcl.com","avatar":"https://avatars.githubusercontent.com/u/121621?v=4"},"body":"Patrick Steinhardt <ps@pks.im> writes:\n\n> Similar as with the preceding commit, `handle_builtin()` does not\n> properly track lifetimes of the `argv` array and its strings. As it may\n> end up modifying the array this can lead to memory leaks in case it\n> contains allocated strings.\n>\n> Refactor the function to use a `struct strvec` instead.\n>\n> Signed-off-by: Patrick Steinhardt <ps@pks.im>\n> ---\n>  git.c                  | 66 ++++++++++++++++++++++++--------------------------\n>  t/t0211-trace2-perf.sh |  2 +-\n>  2 files changed, 32 insertions(+), 36 deletions(-)\n>\n> diff --git a/git.c b/git.c\n> index 88356afe5fb568ccc147f055e3ab253c53a1befa..159dd45b08204c4a89d1dc4ab6990978e2454eb6 100644\n> --- a/git.c\n> +++ b/git.c\n> @@ -696,63 +696,57 @@ void load_builtin_commands(const char *prefix, struct cmdnames *cmds)\n>  }\n>  \n>  #ifdef STRIP_EXTENSION\n> -static void strip_extension(const char **argv)\n> +static void strip_extension(struct strvec *args)\n>  {\n>  \tsize_t len;\n>  \n> -\tif (strip_suffix(argv[0], STRIP_EXTENSION, &len))\n> -\t\targv[0] = xmemdupz(argv[0], len);\n> +\tif (strip_suffix(args->v[0], STRIP_EXTENSION, &len)) {\n> +\t\tchar *stripped = xmemdupz(args->v[0], len);\n> +\t\tstrvec_replace(args, 0, stripped);\n> +\t\tfree(stripped);\n> +\t}\n>  }\n>  #else\n>  #define strip_extension(cmd)\n>  #endif\n>  \n> -static void handle_builtin(int argc, const char **argv)\n> +static void handle_builtin(struct strvec *args)\n>  {\n> -\tstruct strvec args = STRVEC_INIT;\n> -\tconst char **argv_copy = NULL;\n>  \tconst char *cmd;\n>  \tstruct cmd_struct *builtin;\n>  \n> -\tstrip_extension(argv);\n> -\tcmd = argv[0];\n> +\tstrip_extension(args);\n> +\tcmd = args->v[0];\n>  \n>  \t/* Turn \"git cmd --help\" into \"git help --exclude-guides cmd\" */\n> -\tif (argc > 1 && !strcmp(argv[1], \"--help\")) {\n> -\t\tint i;\n> -\n> -\t\targv[1] = argv[0];\n> -\t\targv[0] = cmd = \"help\";\n> -\n> -\t\tfor (i = 0; i < argc; i++) {\n> -\t\t\tstrvec_push(&args, argv[i]);\n> -\t\t\tif (!i)\n> -\t\t\t\tstrvec_push(&args, \"--exclude-guides\");\n> -\t\t}\n> +\tif (args->nr > 1 && !strcmp(args->v[1], \"--help\")) {\n> +\t\tconst char *exclude_guides_arg[] = { \"--exclude-guides\" };\n> +\n> +\t\tstrvec_replace(args, 1, args->v[0]);\n> +\t\tstrvec_replace(args, 0, \"help\");\n> +\t\tcmd = \"help\";\n> +\t\tstrvec_splice(args, 2, 0, exclude_guides_arg,\n> +\t\t\t      ARRAY_SIZE(exclude_guides_arg));\n> +\t}\n>  \n> -\t\targc++;\n> +\tbuiltin = get_builtin(cmd);\n> +\tif (builtin) {\n> +\t\tconst char **argv_copy = NULL;\n> +\t\tint ret;\n>  \n>  \t\t/*\n>  \t\t * `run_builtin()` will modify the argv array, so we need to\n>  \t\t * create a shallow copy such that we can free all of its\n>  \t\t * strings.\n>  \t\t */\n> -\t\tCALLOC_ARRAY(argv_copy, argc + 1);\n> -\t\tCOPY_ARRAY(argv_copy, args.v, argc);\n> +\t\tif (args->nr)\n> +\t\t\tDUP_ARRAY(argv_copy, args->v, args->nr + 1);\n>  \n> -\t\targv = argv_copy;\n> -\t}\n> -\n> -\tbuiltin = get_builtin(cmd);\n> -\tif (builtin) {\n> -\t\tint ret = run_builtin(builtin, argc, argv, the_repository);\n> -\t\tstrvec_clear(&args);\n> +\t\tret = run_builtin(builtin, args->nr, argv_copy, the_repository);\n> +\t\tstrvec_clear(args);\n>  \t\tfree(argv_copy);\n>  \t\texit(ret);\n>  \t}\n> -\n> -\tstrvec_clear(&args);\n> -\tfree(argv_copy);\n>  }\n\nJust want to give you a little shout out how you've reorganized the code\nand it now makes a lot more sense how `argv_copy` is used by putting\nit inside the `if (builtin)` code block.\n\n-- \nToon\n"},{"id":"507714","messageId":"87y11erxww.fsf@iotcl.com","threadId":"62477","inReplyTo":"20241111-b4-pks-leak-fixes-pt10-v2-27-6154bf91f0b0@pks.im","subject":"Re: [PATCH v2 27/27] t: remove TEST_PASSES_SANITIZE_LEAK annotations","fromName":"Toon Claes","fromEmail":"toon@iotcl.com","sentAt":"2024-11-20T10:40:15Z","receivedAt":"2024-11-20T10:40:28Z","isPatch":true,"sender":{"key":"toon@iotcl.com","avatar":"https://avatars.githubusercontent.com/u/121621?v=4"},"body":"Patrick Steinhardt <ps@pks.im> writes:\n\n> Now that the default value for TEST_PASSES_SANITIZE_LEAK is `true` there\n> is no longer a need to have that variable declared in all of our tests.\n> Drop it.\n\nAmazing to see this finally fall into place. Thanks for all the hard\nwork. I've sent you some comments on some of the patches, and the other\nlook good to me.\n\n--\nToon\n"},{"id":"507728","messageId":"Zz3Y35YI9ysFabUJ@pks.im","threadId":"62477","inReplyTo":"877c8yti5n.fsf@iotcl.com","subject":"Re: [PATCH v2 09/27] strvec: introduce new `strvec_splice()` function","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-20T12:41:21Z","receivedAt":"2024-11-20T12:41:35Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"On Wed, Nov 20, 2024 at 09:37:40AM +0100, Toon Claes wrote:\n> Patrick Steinhardt <ps@pks.im> writes:\n> \n> > Introduce a new `strvec_splice()` function that can replace a range of\n> > strings in the vector with another array of strings. This function will\n> > be used in subsequent commits.\n> >\n> > Signed-off-by: Patrick Steinhardt <ps@pks.im>\n> > ---\n> >  strvec.c              | 19 +++++++++++++++\n> >  strvec.h              |  9 +++++++\n> >  t/unit-tests/strvec.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++\n> >  3 files changed, 93 insertions(+)\n> >\n> > diff --git a/strvec.c b/strvec.c\n> > index f712070f5745d5f998d0846ac4009441dddfa500..81075c50cca4fe44608775541d876294a79d9e4e 100644\n> > --- a/strvec.c\n> > +++ b/strvec.c\n> > @@ -56,6 +56,25 @@ void strvec_pushv(struct strvec *array, const char **items)\n> >  \t\tstrvec_push(array, *items);\n> >  }\n> >  \n> > +void strvec_splice(struct strvec *array, size_t pos, size_t len,\n> > +\t\t   const char **replacement, size_t replacement_len)\n> > +{\n> > +\tif (pos + len > array->alloc)\n> > +\t\tBUG(\"range outside of array boundary\");\n> \n> Why aren't you checking against array->nr? I was trying a test case for\n> this, and this seems to be unexpected behavior:\n\nOh, good catch!\n\n> \tvoid test_strvec__splice_insert_after_nr(void)\n> \t{\n> \t\tstruct strvec vec = STRVEC_INIT;\n> \t\tconst char *replacement[] = { \"1\" };\n> \n> \t\tstrvec_pushl(&vec, \"foo\", \"bar\", \"baz\", \"buzz\", \"fuzz\", NULL);\n> \t\tstrvec_pop(&vec);\n> \t\tcheck_strvec(&vec, \"foo\", \"bar\", \"baz\", \"buzz\", NULL);\n> \t\tstrvec_pop(&vec);\n> \t\tcheck_strvec(&vec, \"foo\", \"bar\", \"baz\", NULL);\n> \t\tstrvec_pop(&vec);\n> \t\tstrvec_splice(&vec, 4, 1, replacement, ARRAY_SIZE(replacement));\n> \t\tcheck_strvec(&vec, \"foo\", \"bar\", \"baz\", NULL, \"1\", NULL);\n> \t\tstrvec_clear(&vec);\n> \t}\n\nI'd love to add such a test and verify that it fails as expected. But\nthe problem is that the API we have just `BUG()`s and thus causes the\nprogram to die. We could adapt the new function to not die but instead\nbubble up error codes, but I'd rather do that in a separate patch series\nthat goes over the whole interface.\n\n> > diff --git a/strvec.h b/strvec.h\n> > index 4b73c1f092e9b016ce3299035477713c6267cdae..4e61cc9336938a95318974903f9b35dcdc4da1cd 100644\n> > --- a/strvec.h\n> > +++ b/strvec.h\n> > @@ -67,6 +67,15 @@ void strvec_pushl(struct strvec *, ...);\n> >  /* Push a null-terminated array of strings onto the end of the array. */\n> >  void strvec_pushv(struct strvec *, const char **);\n> >  \n> > +/*\n> \n> Tiniest nit: I see the majority of the function comments in this file\n> start with a double asterisk, should we do the same here?\n\nDouble asterisks are typically used in contexts where comments should be\nextracted via tools like Doxygen. We don't do that in Git, so I don't\nsee a reason to have the double asterisk. Our CodingGuidelines don't\nmention double asterisks, either.\n\n> > + * Replace `len` values starting at `pos` with the provided replacement\n> > + * strings. If `len` is zero this is effectively an insert at the given `pos`.\n> > + * If `replacement_len` is zero this is effectively a delete of `len` items\n> > + * starting at `pos`.\n> > + */\n> > +void strvec_splice(struct strvec *array, size_t pos, size_t len,\n> \n> In this file we seem to commonly use `idx` instead of `pos`.\n\nFair, will adapt.\n\nPatrick\n"},{"id":"507729","messageId":"Zz3Y9xJ-xQvBNNdm@pks.im","threadId":"62477","inReplyTo":"875xoitcu8.fsf@iotcl.com","subject":"Re: [PATCH v2 07/27] bisect: fix various cases where we leak commit list items","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-20T12:41:27Z","receivedAt":"2024-11-20T12:41:39Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"On Wed, Nov 20, 2024 at 11:32:31AM +0100, Toon Claes wrote:\n> Patrick Steinhardt <ps@pks.im> writes:\n> \n> > There are various cases where we leak commit list items because we\n> > evict items from the list, but don't free them. Plug those.\n> >\n> > Signed-off-by: Patrick Steinhardt <ps@pks.im>\n> > ---\n> >  bisect.c                    | 35 +++++++++++++++++++++++++++--------\n> >  t/t6030-bisect-porcelain.sh |  1 +\n> >  2 files changed, 28 insertions(+), 8 deletions(-)\n> >\n> > diff --git a/bisect.c b/bisect.c\n> > index 12efcff2e3c1836ab6e63d36e4d42269fbcaeaab..0e804086cbf6a02d42bda98b62fb86daf099b82d 100644\n> > --- a/bisect.c\n> > +++ b/bisect.c\n> > @@ -440,11 +440,19 @@ void find_bisection(struct commit_list **commit_list, int *reaches,\n> >  \t\t\tfree_commit_list(list->next);\n> >  \t\t\tbest = list;\n> >  \t\t\tbest->next = NULL;\n> > +\t\t} else {\n> > +\t\t\tfor (p = list; p != best; p = next) {\n> > +\t\t\t\tnext = p->next;\n> > +\t\t\t\tfree(p);\n> > +\t\t\t}\n> \n> This makes the code do:\n> \n>     if (!something) {\n>         // ...\n>     } else {\n>         // ...\n>     }\n> \n> I find it odd reading code like that. Would you mind swapping them\n> around? Or is there a reason we type it like this, because I see this\n> also being done like this around line 393?\n\nI mostly did it this way round to minimize the diff.\n\n> More on the functional side of this code, I'd like to understand better\n> what's happening here.\n> It's clear to me when `best` is NULL we want to free the whole\n> commit_list. And when `best` is set with FIND_BISECTION_ALL flag set, we\n> want to free the commit_list up to `best`. But when the\n> FIND_BISECTION_ALL flag is not set, we want to do the opposite, free\n> from `best->next` till the end? But what has this to do with\n> FIND_BISECTION_ALL? \n\nGood question.\n\nTypically, `find_bisection()` will only return a single commit, which is\nthe next bisection point in the range of bisected commit. This is done\nby approximation, where we want to find a commit that is roughly half\nway between the current good and bad commits. So the result should be a\nsingle commit, only, and thus we free all other commit items except for\nthe commit that we have determined to be the bisection point.\n\nWhen `FIND_BISECTION_ALL` is set this changes: instead of returning a\nsingle commit, we return all commits in the bisected range of commits,\nbut tag them with the distance to the included and excluded commits. So\nthe result is a list of commits, but that list may have been filtered\ndown from the list of commits passed into `do_find_bisection()`.\n\nSo when do we filter items? This happens in `best_bisection_sorted()`,\nwhere we skip over commits which are treesame. But for all I can see we\nnever end up skipping over the head of the list, we may only exclude\ntimes from its tail, and we do know to release the tail alright.\n\nWhich means... that the added code is effectively a no-op because `best`\nwill always be pointing to `list`. Removing the code and re-running with\nthe leak checker enabled confirms that there are no new leaks. I'll drop\nit, no idea what I saw here.\n\nPatrick\n"},{"id":"507730","messageId":"Zz3Y-yEqgaHeyLvB@pks.im","threadId":"62477","inReplyTo":"87y11erxww.fsf@iotcl.com","subject":"Re: [PATCH v2 27/27] t: remove TEST_PASSES_SANITIZE_LEAK annotations","fromName":"Patrick Steinhardt","fromEmail":"ps@pks.im","sentAt":"2024-11-20T12:41:31Z","receivedAt":"2024-11-20T12:41:43Z","isPatch":true,"sender":{"key":"ps@pks.im","avatar":"https://avatars.githubusercontent.com/u/4056630?v=4"},"body":"On Wed, Nov 20, 2024 at 11:40:15AM +0100, Toon Claes wrote:\n> Patrick Steinhardt <ps@pks.im> writes:\n> \n> > Now that the default value for TEST_PASSES_SANITIZE_LEAK is `true` there\n> > is no longer a need to have that variable declared in all of our tests.\n> > Drop it.\n> \n> Amazing to see this finally fall into place. Thanks for all the hard\n> work. I've sent you some comments on some of the patches, and the other\n> look good to me.\n\nThanks for your review!\n\nPatrick\n"},{"id":"507794","messageId":"xmqqcyipijma.fsf@gitster.g","threadId":"62477","inReplyTo":"Zz3Y35YI9ysFabUJ@pks.im","subject":"Re: [PATCH v2 09/27] strvec: introduce new `strvec_splice()` function","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2024-11-20T23:13:49Z","receivedAt":"2024-11-20T23:13:52Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Patrick Steinhardt <ps@pks.im> writes:\n\n> Double asterisks are typically used in contexts where comments should be\n> extracted via tools like Doxygen. We don't do that in Git, so I don't\n> see a reason to have the double asterisk. Our CodingGuidelines don't\n> mention double asterisks, either.\n\nShould we add an explicit mention that we frown upon double-asterisks,\neven though many have already slipped into our codebase already?\n\nI personally do not particularly mind people _preparing_ for that\nsomeday when somebody starts extracting document snippets out with\nthese double-asterisks as clues, but unless/until we decide to (or\nnot to) enable doxygen processing on our codebase, let's not insist\non adding/deleting double-asterisks in new code during the review,\nand let's not churn existing code with a patch that only adds more\ndouble-asterisks or removes existing ones.\n\nThanks.\n"},{"id":"507806","messageId":"20241121081146.GA581647@coredump.intra.peff.net","threadId":"62477","inReplyTo":"xmqqcyipijma.fsf@gitster.g","subject":"Re: [PATCH v2 09/27] strvec: introduce new `strvec_splice()` function","fromName":"Jeff King","fromEmail":"peff@peff.net","sentAt":"2024-11-21T08:11:46Z","receivedAt":"2024-11-21T08:11:55Z","isPatch":true,"sender":{"key":"peff@peff.net","avatar":"https://avatars.githubusercontent.com/u/45925?v=4"},"body":"On Thu, Nov 21, 2024 at 08:13:49AM +0900, Junio C Hamano wrote:\n\n> Patrick Steinhardt <ps@pks.im> writes:\n> \n> > Double asterisks are typically used in contexts where comments should be\n> > extracted via tools like Doxygen. We don't do that in Git, so I don't\n> > see a reason to have the double asterisk. Our CodingGuidelines don't\n> > mention double asterisks, either.\n> \n> Should we add an explicit mention that we frown upon double-asterisks,\n> even though many have already slipped into our codebase already?\n\nA bit of history:\n\nI'm not sure if \"slipped in\" is accurate here. IIRC, when I proposed\nmoving the contents of Documentation/technical/api-* into header files,\nthere was some push-back that people preferred to be able to extract\nthem to read as stand-alone, even if we did not support a full tool like\ndoxygen. But AFAIK nobody ever wrote that tool (or at least if they did\nthey did not share it with the list). So I started with \"/**\" as a\nmechanism to allow extraction, but it has probably bit-rotted\n\nLooking back in the archive, though, I think \"people\" was Jonathan\nNieder and \"push-back\" is probably over-stating his position. This is\nthe closest thread I found:\n\n  https://lore.kernel.org/git/20141209222337.GA16345@google.com/\n\nI dunno what any of that means for now, though. I am OK officially\ndeclaring the \"/**\" thing something we we do not care about, if nobody\nis using them. I've added Jonathan to the cc in case he has comments.\n\n> I personally do not particularly mind people _preparing_ for that\n> someday when somebody starts extracting document snippets out with\n> these double-asterisks as clues, but unless/until we decide to (or\n> not to) enable doxygen processing on our codebase, let's not insist\n> on adding/deleting double-asterisks in new code during the review,\n> and let's not churn existing code with a patch that only adds more\n> double-asterisks or removes existing ones.\n\nLike you, I would be happy not to see patches adding or removing them in\nexisting code. To me the point of an official declaration is just to\ntell people not to do so. :)\n\n-Peff\n"},{"id":"507807","messageId":"20241121082204.GB581647@coredump.intra.peff.net","threadId":"62477","inReplyTo":"20241121081146.GA581647@coredump.intra.peff.net","subject":"Re: [PATCH v2 09/27] strvec: introduce new `strvec_splice()` function","fromName":"Jeff King","fromEmail":"peff@peff.net","sentAt":"2024-11-21T08:22:04Z","receivedAt":"2024-11-21T08:22:06Z","isPatch":true,"sender":{"key":"peff@peff.net","avatar":"https://avatars.githubusercontent.com/u/45925?v=4"},"body":"On Thu, Nov 21, 2024 at 03:11:46AM -0500, Jeff King wrote:\n\n> Looking back in the archive, though, I think \"people\" was Jonathan\n> Nieder and \"push-back\" is probably over-stating his position. This is\n> the closest thread I found:\n> \n>   https://lore.kernel.org/git/20141209222337.GA16345@google.com/\n> \n> I dunno what any of that means for now, though. I am OK officially\n> declaring the \"/**\" thing something we we do not care about, if nobody\n> is using them. I've added Jonathan to the cc in case he has comments.\n\nAlso, déjà vu:\n\n  https://lore.kernel.org/git/20180927182528.GB2468@sigill.intra.peff.net/\n\nThat thread has more back-and-forth on the subject, but unless you have\nan abundance of spare time, I do not think it is worth reading in\ndetail.\n\n-Peff\n"},{"id":"507816","messageId":"87plmosx58.fsf@gitlab.com","threadId":"62477","inReplyTo":"20241121081146.GA581647@coredump.intra.peff.net","subject":"Doxygen-styled comments [was: Re: [PATCH v2 09/27] strvec: introduce new `strvec_splice()` function]","fromName":"Toon Claes","fromEmail":"toon@iotcl.com","sentAt":"2024-11-21T10:23:47Z","receivedAt":"2024-11-21T10:24:01Z","isPatch":true,"sender":{"key":"toon@iotcl.com","avatar":"https://avatars.githubusercontent.com/u/121621?v=4"},"body":"Jeff King <peff@peff.net> writes:\n\n> On Thu, Nov 21, 2024 at 08:13:49AM +0900, Junio C Hamano wrote:\n>\n>> let's not insist\n>> on adding/deleting double-asterisks in new code during the review,\n\nOkay, understood.\n\n>> and let's not churn existing code with a patch that only adds more\n>> double-asterisks or removes existing ones.\n>\n> Like you, I would be happy not to see patches adding or removing them in\n> existing code.\n\nOh yeah, I agree at this point it doesn't make sense.\n\n> To me the point of an official declaration is just to\n> tell people not to do so. :)\n\nWhat do you mean? Do you want to formalize in the contribution docs we\nwill not accept patches only changing the formatting of code comments?\n\n--\nToon\n"},{"id":"507818","messageId":"20241121103222.GA1133719@coredump.intra.peff.net","threadId":"62477","inReplyTo":"87plmosx58.fsf@gitlab.com","subject":"Re: Doxygen-styled comments [was: Re: [PATCH v2 09/27] strvec: introduce new `strvec_splice()` function]","fromName":"Jeff King","fromEmail":"peff@peff.net","sentAt":"2024-11-21T10:32:22Z","receivedAt":"2024-11-21T10:32:24Z","isPatch":true,"sender":{"key":"peff@peff.net","avatar":"https://avatars.githubusercontent.com/u/45925?v=4"},"body":"On Thu, Nov 21, 2024 at 11:23:47AM +0100, Toon Claes wrote:\n\n> > To me the point of an official declaration is just to\n> > tell people not to do so. :)\n> \n> What do you mean? Do you want to formalize in the contribution docs we\n> will not accept patches only changing the formatting of code comments?\n\nI just meant that by clarifying our position we would not have people\nsending patches adding or removing, or arguing about whether they should\nexist during review.\n\n-Peff\n"}]}