{"thread":{"id":"52066","subject":"[ANNOUNCE] Git v2.24.0-rc0","startedAt":"2019-10-18T06:30:29Z","lastAt":"2019-10-25T16:58:52Z","messageCount":12,"participants":["Junio C Hamano","Derrick Stolee","Johannes Schindelin","Elijah Newren","Jeff King","Philip Oakley","Bryan Turner"],"isPatch":false,"patchVersion":null,"patchTotal":null},"messages":[{"id":"384365","messageId":"xmqq4l065zx5.fsf@gitster-ct.c.googlers.com","threadId":"52066","inReplyTo":null,"subject":"[ANNOUNCE] Git v2.24.0-rc0","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2019-10-18T06:29:58Z","receivedAt":"2019-10-18T06:30:29Z","isPatch":false,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"An early preview release Git v2.24.0-rc0 is now available for\ntesting at the usual places.  It is comprised of 493 non-merge\ncommits since v2.23.0, contributed by 63 people, 15 of which are\nnew faces.\n\nThe tarballs are found at:\n\n    https://www.kernel.org/pub/software/scm/git/testing/\n\nThe following public repositories all have a copy of the\n'v2.24.0-rc0' tag and the 'master' branch that the tag points at:\n\n  url = https://kernel.googlesource.com/pub/scm/git/git\n  url = git://repo.or.cz/alt-git.git\n  url = https://github.com/gitster/git\n\nNew contributors whose contributions weren't in v2.23.0 are as follows.\nWelcome to the Git development community!\n\n  Alexandr Miloslavskiy, Ali Utku Selen, Ben Milman, Cameron\n  Steffen, CB Bailey, Garima Singh, Hervé Beraud, Jakob Jarmar,\n  Kunal Tyagi, Max Rothman, Paul Wise, Pedro Sousa, Philip.McGraw,\n  Pratyush Yadav, and YanKe.\n\nReturning contributors who helped this release are as follows.\nThanks for your continued support.\n\n  Adam Roben, Ævar Arnfjörð Bjarmason, Alex Henrie, Andrey Mazo,\n  Beat Bolli, Ben Wijen, Bert Wesarg, Birger Skogeng Pedersen,\n  brian m. carlson, Carlo Marcelo Arenas Belón, Christian\n  Couder, Clément Chigot, Corentin BOMPARD, David Turner,\n  Denton Liu, Derrick Stolee, Elijah Newren, Emily Shaffer,\n  Eric Wong, Gabriele Mazzotta, Jeff Hostetler, Jeff King,\n  Johannes Schindelin, Johannes Sixt, Jonathan Tan, Jon Simons,\n  Josh Steadmon, Junio C Hamano, Martin Ågren, Masaya Suzuki,\n  Matheus Tavares, Matthew DeVore, Michael J Gruber, Mike Hommey,\n  Mischa POSLAWSKY, Paul Mackerras, Phillip Wood, René Scharfe,\n  Stephen Boyd, Stephen P. Smith, Sun Chao, SZEDER Gábor,\n  Tanay Abhra, Taylor Blau, Thomas Gummerer, Tobias Klauser,\n  Torsten Bögershausen, and Varun Naik.\n\n----------------------------------------------------------------\n\nGit 2.24 Release Notes (draft)\n==============================\n\nUpdates since v2.23\n-------------------\n\nBackward compatibility note\n\n * Although it is not officially deprecated, \"filter-branch\" is\n   showing its age and alternatives are available.  From this release,\n   we started to discourage its uses and hint people about\n   filter-repo.\n\nUI, Workflows & Features\n\n * We now have an active interim maintainer for the Git-Gui part of\n   the system.  Praise and thank Pratyush Yadav for volunteering.\n\n * The command line parser learned \"--end-of-options\" notation; the\n   standard convention for scripters to have hardcoded set of options\n   first on the command line, and force the command to treat end-user\n   input as non-options, has been to use \"--\" as the delimiter, but\n   that would not work for commands that use \"--\" as a delimiter\n   between revs and pathspec.\n\n * A mechanism to affect the default setting for a (related) group of\n   configuration variables is introduced.\n\n * \"git fetch\" learned \"--set-upstream\" option to help those who first\n   clone from their private fork they intend to push to, add the true\n   upstream via \"git remote add\" and then \"git fetch\" from it.\n\n * Device-tree files learned their own userdiff patterns.\n   (merge 3c81760bc6 sb/userdiff-dts later to maint).\n\n * \"git rebase --rebase-merges\" learned to drive different merge\n   strategies and pass strategy specific options to them.\n\n * A new \"pre-merge-commit\" hook has been introduced.\n\n * Command line completion updates for \"git -c var.name=val\" have been\n   added.\n\n * The lazy clone machinery has been taught that there can be more\n   than one promisor remote and consult them in order when downloading\n   missing objects on demand.\n\n * The list-objects-filter API (used to create a sparse/lazy clone)\n   learned to take a combined filter specification.\n\n * The documentation and tests for \"git format-patch\" have been\n   cleaned up.\n\n * On Windows, the root level of UNC share is now allowed to be used\n   just like any other directory.\n\n * The command line completion support (in contrib/) learned about the\n   \"--skip\" option of \"git revert\" and \"git cherry-pick\".\n\n * \"git rebase --keep-base <upstream>\" tries to find the original base\n   of the topic being rebased and rebase on top of that same base,\n   which is useful when running the \"git rebase -i\" (and its limited\n   variant \"git rebase -x\").\n\n   The command also has learned to fast-forward in more cases where it\n   can instead of replaying to recreate identical commits.\n\n * A configuration variable tells \"git fetch\" to write the commit\n   graph after finishing.\n\n * \"git add -i\" has been taught to show the total number of hunks and\n   the hunks that has been processed so far when showing prompts.\n\n * \"git fetch --jobs=<n>\" allowed <n> parallel jobs when fetching\n   submodules, but this did not apply to \"git fetch --multiple\" that\n   fetches from multiple remote repositories.  It now does.\n\n\nPerformance, Internal Implementation, Development Support etc.\n\n * The code to write commit-graph over given commit object names has\n   been made a bit more robust.\n\n * The first line of verbose output from each test piece now carries\n   the test name and number to help scanning with eyeballs.\n\n * Further clean-up of the initialization code.\n\n * xmalloc() used to have a mechanism to ditch memory and address\n   space resources as the last resort upon seeing an allocation\n   failure from the underlying malloc(), which made the code complex\n   and thread-unsafe with dubious benefit, as major memory resource\n   users already do limit their uses with various other mechanisms.\n   It has been simplified away.\n\n * Unnecessary full-tree diff in \"git log -L\" machinery has been\n   optimized away.\n\n * The http transport lacked some optimization the native transports\n   learned to avoid unnecessary ref advertisement, which has been\n   corrected.\n\n * Preparation for SHA-256 upgrade continues in the test department.\n   (merge 0c37c41d13 bc/hash-independent-tests-part-5 later to maint).\n\n * The memory ownership model of the \"git fast-import\" got\n   straightened out.\n\n * Output from trace2 subsystem is formatted more prettily now.\n\n * The internal code originally invented for \".gitignore\" processing\n   got reshuffled and renamed to make it less tied to \"excluding\" and\n   stress more that it is about \"matching\", as it has been reused for\n   things like sparse checkout specification that want to check if a\n   path is \"included\".\n\n * \"git stash\" learned to write refreshed index back to disk.\n\n * Coccinelle checks are done on more source files than before now.\n\n * The cache-tree code has been taught to be less aggressive in\n   attempting to see if a tree object it computed already exists in\n   the repository.\n\n * The code to parse and use the commit-graph file has been made more\n   robust against corrupted input.\n\n * The hg-to-git script (in contrib/) has been updated to work with\n   Python 3.\n\n * Update the way build artifacts in t/helper/ directory are ignored.\n\n * Preparation for SHA-256 upgrade continues.\n\n * \"git log --graph\" for an octopus merge is sometimes colored\n   incorrectly, which is demonstrated and documented but not yet\n   fixed.\n\n * The trace2 output, when sending them to files in a designated\n   directory, can populate the directory with too many files; a\n   mechanism is introduced to set the maximum number of files and\n   discard further logs when the maximum is reached.\n\n * We have adopted a Code-of-conduct document.\n   (merge 3f9ef874a7 jk/coc later to maint).\n\n\nFixes since v2.23\n-----------------\n\n * \"git grep --recurse-submodules\" that looks at the working tree\n   files looked at the contents in the index in submodules, instead of\n   files in the working tree.\n   (merge 6a289d45c0 mt/grep-submodules-working-tree later to maint).\n\n * Codepaths to walk tree objects have been audited for integer\n   overflows and hardened.\n   (merge 5aa02f9868 jk/tree-walk-overflow later to maint).\n\n * \"git pack-refs\" can lose refs that are created while running, which\n   is getting corrected.\n   (merge a613d4f817 sc/pack-refs-deletion-racefix later to maint).\n\n * \"git checkout\" and \"git restore\" to re-populate the index from a\n   tree-ish (typically HEAD) did not work correctly for a path that\n   was removed and then added again with the intent-to-add bit, when\n   the corresponding working tree file was empty.  This has been\n   corrected.\n\n * Compilation fix.\n   (merge 70597e8386 rs/nedalloc-fixlets later to maint).\n\n * \"git gui\" learned to call the clean-up procedure before exiting.\n   (merge 0d88f3d2c5 py/git-gui-do-quit later to maint).\n\n * We promoted the \"indent heuristics\" that decides where to split\n   diff hunks from experimental to the default a few years ago, but\n   some stale documentation still marked it as experimental, which has\n   been corrected.\n   (merge 64e5e1fba1 sg/diff-indent-heuristic-non-experimental later to maint).\n\n * Fix a mismerge that happened in 2.22 timeframe.\n   (merge acb7da05ac en/checkout-mismerge-fix later to maint).\n\n * \"git archive\" recorded incorrect length in extended pax header in\n   some corner cases, which has been corrected.\n   (merge 71d41ff651 rs/pax-extended-header-length-fix later to maint).\n\n * On-demand object fetching in lazy clone incorrectly tried to fetch\n   commits from submodule projects, while still working in the\n   superproject, which has been corrected.\n   (merge a63694f523 jt/diff-lazy-fetch-submodule-fix later to maint).\n\n * Prepare get_short_oid() codepath to be thread-safe.\n   (merge 7cfcb16b0e rs/sort-oid-array-thread-safe later to maint).\n\n * \"for-each-ref\" and friends that show refs did not protect themselves\n   against ancient tags that did not record tagger names when asked to\n   show \"%(taggername)\", which have been corrected.\n   (merge 8b3f33ef11 mp/for-each-ref-missing-name-or-email later to maint).\n\n * The \"git am\" based backend of \"git rebase\" ignored the result of\n   updating \".gitattributes\" done in one step when replaying\n   subsequent steps.\n   (merge 2c65d90f75 bc/reread-attributes-during-rebase later to maint).\n\n * Tell cURL library to use the same malloc() implementation, with the\n   xmalloc() wrapper, as the rest of the system, for consistency.\n   (merge 93b980e58f cb/curl-use-xmalloc later to maint).\n\n * Build fix to adjust .gitignore to unignore a path that we started to track.\n   (merge aac6ff7b5b js/visual-studio later to maint).\n\n * A few implementation fixes in the notes API.\n   (merge 60fe477a0b mh/notes-duplicate-entries later to maint).\n\n * Fix an earlier regression to \"git push --all\" which should have\n   been forbidden when the target remote repository is set to be a\n   mirror.\n   (merge 8e4c8af058 tg/push-all-in-mirror-forbidden later to maint).\n\n * Fix an earlier regression in the test suite, which mistakenly\n   stopped running HTTPD tests.\n   (merge 3960290675 sg/git-test-boolean later to maint).\n\n * \"git rebase --autostash <upstream> <branch>\", when <branch> is\n   different from the current branch, incorrectly moved the tip of the\n   current branch, which has been corrected.\n   (merge bf1e28e0ad bw/rebase-autostash-keep-current-branch later to maint).\n\n * Update support for Asciidoctor documentation toolchain.\n   (merge 83b0b8953e ma/asciidoctor-refmiscinfo later to maint).\n\n * Start using DocBook 5 (instead of DocBook 4.5) as Asciidoctor 2.0\n   no longer works with the older one.\n   (merge f6461b82b9 bc/doc-use-docbook-5 later to maint).\n\n * The markup used in user-manual has been updated to work better with\n   asciidoctor.\n   (merge c4d2f6143a ma/user-manual-markup-update later to maint).\n\n * Make sure the grep machinery does not abort when seeing a payload\n   that is not UTF-8 even when JIT is not in use with PCRE1.\n   (merge ad7c543e3b cb/skip-utf8-check-with-pcre1 later to maint).\n\n * The name of the blob object that stores the filter specification\n   for sparse cloning/fetching was interpreted in a wrong place in the\n   code, causing Git to abort.\n\n * \"git log --decorate-refs-exclude=<pattern>\" was incorrectly\n   overruled when the \"--simplify-by-decoration\" option is used, which\n   has been corrected.\n   (merge 0cc7380d88 rs/simplify-by-deco-with-deco-refs-exclude later to maint).\n\n * The \"upload-pack\" (the counterpart of \"git fetch\") needs to disable\n   commit-graph when responding to a shallow clone/fetch request, but\n   the way this was done made Git panic, which has been corrected.\n\n * The object traversal machinery has been optimized not to load tree\n   objects when we are only interested in commit history.\n   (merge 72ed80c784 jk/list-objects-optim-wo-trees later to maint).\n\n * The object name parser for \"Nth parent\" syntax has been made more\n   robust against integer overflows.\n   (merge 59fa5f5a25 rs/nth-parent-parse later to maint).\n\n * The code used in following tags in \"git fetch\" has been optimized.\n   (merge b7e2d8bca5 ms/fetch-follow-tag-optim later to maint).\n\n * Regression fix for progress output.\n   (merge 2bb74b53a4 sg/progress-fix later to maint).\n\n * A bug in merge-recursive code that triggers when a branch with a\n   symbolic link is merged with a branch that replaces it with a\n   directory has been fixed.\n   (merge 83e3ad3b12 jt/merge-recursive-symlink-is-not-a-dir-in-way later to maint).\n\n * The rename detection logic sorts a list of rename source candidates\n   by similarity to pick the best candidate, which means that a tie\n   between sources with the same similarity is broken by the original\n   location in the original candidate list (which is sorted by path).\n   Force the sorting by similarity done with a stable sort, which is\n   not promised by system supplied qsort(3), to ensure consistent\n   results across platforms.\n   (merge 2049b8dc65 js/diff-rename-force-stable-sort later to maint).\n\n * The code to skip \"UTF\" and \"UTF-\" prefix, when computing an advice\n   message, did not work correctly when the prefix was \"UTF\", which\n   has been fixed.\n   (merge b181676ce9 rs/convert-fix-utf-without-dash later to maint).\n\n * The author names taken from SVN repositories may have extra leading\n   or trailing whitespaces, which are now munged away.\n   (merge 4ddd4bddb1 tk/git-svn-trim-author-name later to maint).\n\n * \"git rebase -i\" showed a wrong HEAD while \"reword\" open the editor.\n   (merge b0a3186140 pw/rebase-i-show-HEAD-to-reword later to maint).\n\n * A few simplification and bugfixes to PCRE interface.\n   (merge c581e4a749 ab/pcre-jit-fixes later to maint).\n\n * PCRE fixes.\n   (merge ff61681b46 cb/pcre1-cleanup later to maint).\n\n * \"git range-diff\" segfaulted when diff.noprefix configuration was\n   used, as it blindly expected the patch it internally generates to\n   have the standard a/ and b/ prefixes.  The command now forces the\n   internal patch to be built without any prefix, not to be affected\n   by any end-user configuration.\n   (merge 937b76ed49 js/range-diff-noprefix later to maint).\n\n * \"git stash apply\" in a subdirectory of a secondary worktree failed\n   to access the worktree correctly, which has been corrected.\n   (merge dfd557c978 js/stash-apply-in-secondary-worktree later to maint).\n\n * The merge-recursive machiery is one of the most complex parts of\n   the system that accumulated cruft over time.  This large series\n   cleans up the implementation quite a bit.\n   (merge b657047719 en/merge-recursive-cleanup later to maint).\n\n * Pretty-printed command line formatter (used in e.g. reporting the\n   command being run by the tracing API) had a bug that lost an\n   argument that is an empty string, which has been corrected.\n   (merge ce2d7ed2fd gs/sq-quote-buf-pretty later to maint).\n\n * \"git range-diff\" failed to handle mode-only change, which has been\n   corrected.\n   (merge 2b6a9b13ca tg/range-diff-output-update later to maint).\n\n * Dev support update.\n   (merge 4f3c1dc5d6 dl/allow-running-cocci-verbosely later to maint).\n\n * \"git format-patch -o <outdir>\" did an equivalent of \"mkdir <outdir>\"\n   not \"mkdir -p <outdir>\", which was corrected.\n\n * \"git stash save\" lost local changes to submodules, which has been\n   corrected.\n   (merge 556895d0c8 jj/stash-reset-only-toplevel later to maint).\n\n * Other code cleanup, docfix, build fix, etc.\n   (merge d1387d3895 en/fast-import-merge-doc later to maint).\n   (merge 1c24a54ea4 bm/repository-layout-typofix later to maint).\n   (merge 415b770b88 ds/midx-expire-repack later to maint).\n   (merge 19800bdc3f nd/diff-parseopt later to maint).\n   (merge 58166c2e9d tg/t0021-racefix later to maint).\n   (merge 7027f508c7 dl/compat-cleanup later to maint).\n   (merge e770fbfeff jc/test-cleanup later to maint).\n   (merge 1fd881d404 rs/trace2-dst-warning later to maint).\n   (merge 7e92756751 mh/http-urlmatch-cleanup later to maint).\n   (merge 9784f97321 mh/release-commit-memory-fix later to maint).\n   (merge 60d198d022 tb/banned-vsprintf-namefix later to maint).\n   (merge 80e3658647 rs/help-unknown-ref-does-not-return later to maint).\n   (merge 0a8bc7068f dt/remote-helper-doc-re-lock-option later to maint).\n   (merge 27fd1e4ea7 en/merge-options-ff-and-friends later to maint).\n   (merge 502c386ff9 sg/clean-nested-repo-with-ignored later to maint).\n   (merge 26e3d1cbea am/mailmap-andrey-mazo later to maint).\n   (merge 47b27c96fa ss/get-time-cleanup later to maint).\n   (merge dd2e50a84e jk/commit-graph-cleanup later to maint).\n   (merge 4fd39c76e6 cs/pretty-formats-doc-typofix later to maint).\n   (merge 40e747e89d dl/submodule-set-branch later to maint).\n   (merge 689a146c91 rs/commit-graph-use-list-count later to maint).\n   (merge 0eb7c37a8a js/doc-patch-text later to maint).\n   (merge 4b3aa170d1 rs/nth-switch-code-simplification later to maint).\n   (merge 0d4304c124 ah/doc-submodule-ignore-submodules later to maint).\n   (merge af78249463 cc/svn-fe-py-shebang later to maint).\n   (merge 7bd97d6dff rs/alias-use-copy-array later to maint).\n   (merge c46ebc2496 sg/travis-help-debug later to maint).\n   (merge 24c681794f ps/my-first-contribution-alphasort later to maint).\n   (merge 75b2c15435 cb/do-not-use-test-cmp-with-a later to maint).\n   (merge cda0d497e3 bw/submodule-helper-usage-fix later to maint).\n   (merge fe0ed5d5e9 am/visual-studio-config-fix later to maint).\n   (merge 2e09c01232 sg/name-rev-cutoff-underflow-fix later to maint).\n   (merge ddb3c856f3 as/shallow-slab-use-fix later to maint).\n   (merge 71f4960b91 js/mingw-spawn-with-spaces-in-path later to maint).\n   (merge 53d687bf5f ah/cleanups later to maint).\n   (merge f537485fa5 rs/test-remove-useless-debugging-cat later to maint).\n   (merge 11a3d3aadd dl/rev-list-doc-cleanup later to maint).\n   (merge d928a8388a am/t0028-utf16-tests later to maint).\n   (merge b05b40930e dl/t0000-skip-test-test later to maint).\n   (merge 03d3b1297c js/xdiffi-comment-updates later to maint).\n   (merge 57d8f4b4c7 js/doc-stash-save later to maint).\n   (merge 8c1cfd58e3 ta/t1308-typofix later to maint).\n   (merge fa364ad790 bb/utf8-wcwidth-cleanup later to maint).\n   (merge 68b69211b2 bb/compat-util-comment-fix later to maint).\n   (merge 5cc6a4be11 rs/http-push-simplify later to maint).\n   (merge a81e42d235 rs/column-use-utf8-strnwidth later to maint).\n   (merge 062a309d36 rs/remote-curl-use-argv-array later to maint).\n\n----------------------------------------------------------------\n\nChanges since v2.23.0 are as follows:\n\nAdam Roben (1):\n      mingw: fix launching of externals from Unicode paths\n\nAlex Henrie (4):\n      doc: fix reference to --ignore-submodules\n      commit-graph: remove a duplicate assignment\n      diffcore-break: use a goto instead of a redundant if statement\n      wrapper: use a loop instead of repetitive statements\n\nAlexandr Miloslavskiy (4):\n      contrib/buildsystems: fix Visual Studio Debug configuration\n      t0028: fix test for UTF-16-LE-BOM\n      t0028: add more tests\n      t0061: fix test for argv[0] with spaces (MINGW only)\n\nAli Utku Selen (1):\n      shallow.c: don't free unallocated slabs\n\nAndrey Mazo (1):\n      .mailmap: update email address of Andrey Mazo\n\nBeat Bolli (3):\n      grep: under --debug, show whether PCRE JIT is enabled\n      utf8: use ARRAY_SIZE() in git_wcwidth()\n      git-compat-util: fix documentation syntax\n\nBen Milman (1):\n      repository-layout.txt: correct pluralization of 'object'\n\nBen Wijen (2):\n      builtin/rebase.c: make sure the active branch isn't moved when autostashing\n      builtin/rebase.c: Remove pointless message\n\nBert Wesarg (4):\n      git-gui: convert new/amend commit radiobutton to checkbutton\n      git-gui: add horizontal scrollbar to commit buffer\n      builtin/submodule--helper: fix usage string for 'update-clone'\n      format-patch: create leading components of output directory\n\nBirger Skogeng Pedersen (2):\n      git-gui: add hotkeys to set widget focus\n      git-gui: add hotkey to toggle \"Amend Last Commit\"\n\nCB Bailey (1):\n      t4038: Remove non-portable '-a' option passed to test_cmp\n\nCameron Steffen (1):\n      doc: minor formatting fix\n\nCarlo Marcelo Arenas Belón (4):\n      http: use xmalloc with cURL\n      grep: make sure NO_LIBPCRE1_JIT disable JIT in PCRE1\n      grep: refactor and simplify PCRE1 support\n      grep: skip UTF8 checks explicitly\n\nChristian Couder (15):\n      t0410: remove pipes after git commands\n      fetch-object: make functions return an error code\n      Add initial support for many promisor remotes\n      promisor-remote: implement promisor_remote_get_direct()\n      promisor-remote: add promisor_remote_reinit()\n      promisor-remote: use repository_format_partial_clone\n      Use promisor_remote_get_direct() and has_promisor_remote()\n      promisor-remote: parse remote.*.partialclonefilter\n      builtin/fetch: remove unique promisor remote limitation\n      t0410: test fetching from many promisor remotes\n      partial-clone: add multiple remotes in the doc\n      remote: add promisor and partial clone config to the doc\n      Remove fetch-object.{c,h} in favor of promisor-remote.{c,h}\n      Move repository_format_partial_clone to promisor-remote.c\n      Move core_partial_clone_filter_default to promisor-remote.c\n\nClément Chigot (1):\n      contrib/svn-fe: fix shebang for svnrdump_sim.py\n\nCorentin BOMPARD (1):\n      pull, fetch: add --set-upstream option\n\nDavid Turner (1):\n      clarify documentation for remote helpers\n\nDenton Liu (49):\n      packfile.h: drop extern from function declaration\n      t4014: drop unnecessary blank lines from test cases\n      t3431: add rebase --fork-point tests\n      t3432: test rebase fast-forward behavior\n      completion: merge options for cherry-pick and revert\n      completion: add --skip for cherry-pick and revert\n      status: mention --skip for revert and cherry-pick\n      rebase: refactor can_fast_forward into goto tower\n      rebase: fast-forward --onto in more cases\n      rebase: fast-forward --fork-point in more cases\n      rebase: teach rebase --keep-base\n      mingw: apply array.cocci rule\n      compat/*.[ch]: remove extern from function declarations using spatch\n      t4014: s/expected/expect/\n      t4014: move closing sq onto its own line\n      t4014: use sq for test case names\n      t4014: remove spaces after redirect operators\n      t4014: use indentable here-docs\n      t4014: drop redirections to /dev/null\n      t4014: let sed open its own files\n      t4014: use test_line_count() where possible\n      t4014: remove confusing pipe in check_threading()\n      t4014: stop losing return codes of git commands\n      Doc: add more detail for git-format-patch\n      config/format.txt: specify default value of format.coverLetter\n      t: use common $SQ variable\n      completion: teach rebase to use __gitcomp_builtin\n      completion: teach archive to use __gitcomp_builtin\n      git-submodule.txt: fix AsciiDoc formatting error\n      Makefile: strip leading ./ in $(LIB_H)\n      Makefile: define THIRD_PARTY_SOURCES\n      Makefile: strip leading ./ in $(FIND_SOURCE_FILES)\n      Makefile: run coccicheck on more source files\n      gitk: rename zh_CN.po to zh_cn.po\n      promisor-remote.h: drop extern from function declaration\n      apply.h: include missing header\n      promisor-remote.h: include missing header\n      pack-bitmap.h: remove magic number\n      Makefile: emulate compile in $(HCO) target better\n      test-lib: let test_merge() perform octopus merges\n      t4214: use test_merge\n      t4214: generate expect in their own test cases\n      t4214: explicitly list tags in log\n      t4214: demonstrate octopus graph coloring failure\n      git-rev-list.txt: prune options in synopsis\n      t4014: treat rev-list output as the expected value\n      t0000: cover GIT_SKIP_TESTS blindspots\n      pthread.h: manually align parameter lists\n      Makefile: respect $(V) in %.cocci.patch target\n\nDerrick Stolee (14):\n      repo-settings: consolidate some config settings\n      t6501: use 'git gc' in quiet mode\n      commit-graph: turn on commit-graph by default\n      repo-settings: parse core.untrackedCache\n      repo-settings: create feature.manyFiles setting\n      repo-settings: create feature.experimental setting\n      merge-recursive: introduce an enum for detect_directory_renames values\n      checkout: add simple check for 'git checkout -b'\n      fetch: add fetch.writeCommitGraph config setting\n      treewide: rename 'struct exclude' to 'struct path_pattern'\n      treewide: rename 'struct exclude_list' to 'struct pattern_list'\n      treewide: rename 'EXCL_FLAG_' to 'PATTERN_FLAG_'\n      treewide: rename 'exclude' methods to 'pattern'\n      unpack-trees: rename 'is_excluded_from_list()'\n\nElijah Newren (53):\n      git-fast-import.txt: clarify that multiple merge commits are allowed\n      checkout: remove duplicate code\n      merge-recursive: be consistent with assert\n      checkout: provide better conflict hunk description with detached HEAD\n      merge-recursive: enforce opt->ancestor != NULL when calling merge_trees()\n      merge-recursive: provide a better label for diff3 common ancestor\n      merge-recursive: future-proof update_file_flags() against memory leaks\n      merge-recursive: remove another implicit dependency on the_repository\n      Ensure index matches head before invoking merge machinery, round N\n      merge-recursive: exit early if index != head\n      merge-recursive: remove useless parameter in merge_trees()\n      merge-recursive: don't force external callers to do our logging\n      cache-tree: share code between functions writing an index as a tree\n      merge-recursive: fix some overly long lines\n      merge-recursive: use common name for ancestors/common/base_list\n      merge-recursive: rename 'mrtree' to 'result_tree', for clarity\n      merge-recursive: rename merge_options argument to opt in header\n      merge-recursive: move some definitions around to clean up the header\n      merge-recursive: consolidate unnecessary fields in merge_options\n      merge-recursive: comment and reorder the merge_options fields\n      merge-recursive: avoid losing output and leaking memory holding that output\n      merge-recursive: split internal fields into a separate struct\n      merge-recursive: rename MERGE_RECURSIVE_* to MERGE_VARIANT_*\n      merge-recursive: add sanity checks for relevant merge_options\n      merge-recursive: alphabetize include list\n      merge-options.txt: clarify meaning of various ff-related options\n      t3427: accelerate this test by using fast-export and fast-import\n      t6006: simplify, fix, and optimize empty message test\n      Recommend git-filter-repo instead of git-filter-branch\n      t9902: use a non-deprecated command for testing\n      t7300: add testcases showing failure to clean specified pathspecs\n      dir: fix typo in comment\n      dir: fix off-by-one error in match_pathspec_item\n      dir: also check directories for matching pathspecs\n      dir: make the DO_MATCH_SUBMODULE code reusable for a non-submodule case\n      dir: if our pathspec might match files under a dir, recurse into it\n      dir: add commentary explaining match_pathspec_item's return value\n      git-clean.txt: do not claim we will delete files with -n/--dry-run\n      clean: disambiguate the definition of -d\n      clean: avoid removing untracked files in a nested git repository\n      clean: rewrap overly long line\n      clean: fix theoretical path corruption\n      fast-export: fix exporting a tag and nothing else\n      dir: special case check for the possibility that pathspec is NULL\n      merge-recursive: fix the diff3 common ancestor label for virtual commits\n      fast-import: fix handling of deleted tags\n      fast-import: allow tags to be identified by mark labels\n      fast-import: add support for new 'alias' command\n      fast-export: add support for --import-marks-if-exists\n      fast-export: allow user to request tags be marked with --mark-tags\n      t9350: add tests for tags of things other than a commit\n      fast-export: handle nested tags\n      merge-recursive: fix the fix to the diff3 common ancestor label\n\nEmily Shaffer (1):\n      promisor-remote: skip move_to_tail when no-op\n\nEric Wong (20):\n      diff: use hashmap_entry_init on moved_entry.ent\n      coccicheck: detect hashmap_entry.hash assignment\n      packfile: use hashmap_entry in delta_base_cache_entry\n      hashmap_entry_init takes \"struct hashmap_entry *\"\n      hashmap_get_next takes \"const struct hashmap_entry *\"\n      hashmap_add takes \"struct hashmap_entry *\"\n      hashmap_get takes \"const struct hashmap_entry *\"\n      hashmap_remove takes \"const struct hashmap_entry *\"\n      hashmap_put takes \"struct hashmap_entry *\"\n      introduce container_of macro\n      hashmap_get_next returns \"struct hashmap_entry *\"\n      hashmap: use *_entry APIs to wrap container_of\n      hashmap_get{,_from_hash} return \"struct hashmap_entry *\"\n      hashmap_cmp_fn takes hashmap_entry params\n      hashmap: use *_entry APIs for iteration\n      hashmap: hashmap_{put,remove} return hashmap_entry *\n      hashmap: introduce hashmap_free_entries\n      OFFSETOF_VAR macro to simplify hashmap iterators\n      hashmap: remove type arg from hashmap_{get,put,remove}_entry\n      hashmap_entry: remove first member requirement from docs\n\nGabriele Mazzotta (1):\n      gitk: Do not mistake unchanged lines for submodule changes\n\nGarima Singh (3):\n      commit-graph: add --[no-]progress to write and verify\n      commit-graph: emit trace2 cmd_mode for each sub-command\n      sq_quote_buf_pretty: don't drop empty arguments\n\nHervé Beraud (1):\n      hg-to-git: make it compatible with both python3 and python2\n\nJakob Jarmar (1):\n      stash: avoid recursive hard reset on submodules\n\nJeff Hostetler (7):\n      trace2: cleanup column alignment in perf target format\n      trace2: trim whitespace in region messages in perf target format\n      trace2: remove dead code in maybe_add_string_va()\n      trace2: trim trailing whitespace in normal format error message\n      quote: add sq_append_quote_argv_pretty()\n      trace2: cleanup whitespace in normal format\n      trace2: cleanup whitespace in perf format\n\nJeff King (32):\n      setup_traverse_info(): stop copying oid\n      tree-walk: drop oid from traverse_info\n      tree-walk: use size_t consistently\n      tree-walk: accept a raw length for traverse_path_len()\n      tree-walk: add a strbuf wrapper for make_traverse_path()\n      tree-walk: harden make_traverse_path() length computations\n      revision: allow --end-of-options to end option parsing\n      parse-options: allow --end-of-options as a synonym for \"--\"\n      gitcli: document --end-of-options\n      t1309: use short branch name in includeIf.onbranch test\n      common-main: delay trace2 initialization\n      config: stop checking whether the_repository is NULL\n      t/perf: rename duplicate-numbered test script\n      packfile: drop release_pack_memory()\n      notes: avoid potential use-after-free during insertion\n      fast-import: duplicate parsed encoding string\n      fast-import: duplicate into history rather than passing ownership\n      git-am: handle missing \"author\" when parsing commit\n      pack-objects: use object_id in packlist_alloc()\n      bulk-checkin: zero-initialize hashfile_checkpoint\n      diff-delta: set size out-parameter to 0 for NULL delta\n      test-read-cache: drop namelen variable\n      pack-objects: drop packlist index_pos optimization\n      commit-graph: turn off save_commit_buffer\n      list-objects: don't queue root trees unless revs->tree_objects is set\n      commit-graph: bump DIE_ON_LOAD check to actual load-time\n      upload-pack: disable commit graph more gently for shallow traversal\n      list-objects-filter: delay parsing of sparse oid\n      list-objects-filter: use empty string instead of NULL for sparse \"base\"\n      git_mkstemps_mode(): replace magic numbers with computed value\n      add a Code of Conduct document\n      CODE_OF_CONDUCT: mention individual project-leader emails\n\nJohannes Schindelin (41):\n      Drop unused git-rebase--am.sh\n      t3400: stop referring to the scripted rebase\n      .gitignore: there is no longer a built-in `git-rebase--interactive`\n      sequencer: the `am` and `rebase--interactive` scripts are gone\n      rebase: fold git-rebase--common into the -p backend\n      t3427: add a clarifying comment\n      t3427: simplify the `setup` test case significantly\n      t3427: move the `filter-branch` invocation into the `setup` case\n      t3427: condense the unnecessarily repetitive test cases into three\n      t3427: fix erroneous assumption\n      t3427: accommodate for the `rebase --merge` backend having been replaced\n      t3427: fix another incorrect assumption\n      rebase -r: support merge strategies other than `recursive`\n      t/lib-rebase: prepare for testing `git rebase --rebase-merges`\n      t3418: test `rebase -r` with merge strategies\n      rebase -r: do not (re-)generate root commits with `--root` *and* `--onto`\n      setup_git_directory(): handle UNC paths correctly\n      Fix .git/ discovery at the root of UNC shares\n      setup_git_directory(): handle UNC root paths correctly\n      .gitignore: stop ignoring `.manifest` files\n      Move git_sort(), a stable sort, into into libgit.a\n      diffcore_rename(): use a stable sort\n      ci: run `hdr-check` as part of the `Static Analysis` job\n      range-diff: internally force `diff.noprefix=true`\n      push: do not pretend to return `int` from `die_push_simple()`\n      fetch: let --jobs=<n> parallelize --multiple, too\n      stash apply: report status correctly even in a worktree's subdirectory\n      msvc: avoid using minus operator on unsigned types\n      winansi: use FLEX_ARRAY to avoid compiler warning\n      compat/win32/path-utils.h: add #include guards\n      msvc: ignore some libraries when linking\n      msvc: handle DEVELOPER=1\n      msvc: work around a bug in GetEnvironmentVariable()\n      vcxproj: only copy `git-remote-http.exe` once it was built\n      vcxproj: include more generated files\n      test-tool run-command: learn to run (parts of) the testsuite\n      tests: let --immediate and --write-junit-xml play well together\n      ci: really use shallow clones on Azure Pipelines\n      ci: also build and test with MS Visual Studio on Azure Pipelines\n      xdiffi: fix typos and touch up comments\n      doc(stash): clarify the description of `save`\n\nJohannes Sixt (2):\n      diff, log doc: say \"patch text\" instead of \"patches\"\n      diff, log doc: small grammer, format, and language fixes\n\nJon Simons (2):\n      t5616: test cloning/fetching with sparse:oid=<oid> filter\n      list-objects-filter: give a more specific error sparse parsing error\n\nJonathan Tan (6):\n      diff: skip GITLINK when lazy fetching missing objs\n      transport-helper: skip ls-refs if unnecessary\n      transport: teach all vtables to allow fetch first\n      cache-tree: do not lazy-fetch tentative tree\n      merge-recursive: symlink's descendants not in way\n      send-pack: never fetch when checking exclusions\n\nJosh Steadmon (7):\n      t7503: verify proper hook execution\n      fetch: add trace2 instrumentation\n      push: add trace2 instrumentation\n      docs: mention trace2 target-dir mode in git-config\n      docs: clarify trace2 version invariants\n      trace2: discard new traces if target directory has too many files\n      trace2: write discard message to sentinel files\n\nJunio C Hamano (14):\n      First batch after Git 2.23\n      t: use LF variable defined in the test harness\n      t3005: remove unused variable\n      Second batch\n      Third batch\n      SubmittingPatches: git-gui has a new maintainer\n      Fourth batch\n      Fifth batch\n      Sixth batch\n      transport: push codepath can take arbitrary repository\n      Seventh batch\n      Eighth batch\n      Ninth batch\n      Git 2.24-rc0\n\nKunal Tyagi (1):\n      add -i: show progress counter in the prompt\n\nMartin Ågren (14):\n      Documentation: wrap blocks with \"--\"\n      git-merge-base.txt: render indentations correctly under Asciidoctor\n      Documentation: wrap config listings in \"----\"\n      git-ls-remote.txt: wrap shell listing in \"----\"\n      git-receive-pack.txt: wrap shell [script] listing in \"----\"\n      git-merge-index.txt: wrap shell listing in \"----\"\n      gitweb.conf.txt: switch pluses to backticks to help Asciidoctor\n      Doc/Makefile: give mansource/-version/-manual attributes\n      asciidoctor-extensions: provide `<refmiscinfo/>`\n      doc-diff: replace --cut-header-footer with --cut-footer\n      user-manual.txt: add missing section label\n      user-manual.txt: change header notation\n      asciidoctor-extensions.rb: handle \"book\" doctype in linkgit\n      user-manual.txt: render ASCII art correctly under Asciidoctor\n\nMasaya Suzuki (1):\n      fetch: use oidset to keep the want OIDs for faster lookup\n\nMatheus Tavares (1):\n      grep: fix worktree case in submodules\n\nMatthew DeVore (10):\n      list-objects-filter: encapsulate filter components\n      list-objects-filter: put omits set in filter struct\n      list-objects-filter-options: always supply *errbuf\n      list-objects-filter: implement composite filters\n      list-objects-filter-options: move error check up\n      list-objects-filter-options: make filter_spec a string_list\n      strbuf: give URL-encoding API a char predicate fn\n      list-objects-filter-options: allow mult. --filter\n      list-objects-filter-options: clean up use of ALLOC_GROW\n      list-objects-filter-options: make parser void\n\nMax Rothman (1):\n      completion: add missing completions for log, diff, show\n\nMichael J Gruber (3):\n      merge: do no-verify like commit\n      git-merge: honor pre-merge-commit hook\n      merge: --no-verify to bypass pre-merge-commit hook\n\nMike Hommey (3):\n      notes: avoid leaking duplicate entries\n      commit: free the right buffer in release_commit_memory\n      http: don't leak urlmatch_config.vars\n\nMischa POSLAWSKY (1):\n      ref-filter: initialize empty name or email fields\n\nPaul Mackerras (1):\n      gitk: Make web links clickable\n\nPaul Wise (1):\n      gitk: Use right colour for remote refs in the \"Tags and heads\" dialog\n\nPedro Sousa (1):\n      doc: MyFirstContribution: fix cmd placement instructions\n\nPhilip.McGraw (1):\n      git-p4: auto-delete named temporary file\n\nPhillip Wood (3):\n      rebase -i: always update HEAD before rewording\n      rebase -i: check for updated todo after squash and reword\n      sequencer: simplify root commit creation\n\nPratyush Yadav (6):\n      git-gui: call do_quit before destroying the main window\n      git-gui: allow reverting selected lines\n      git-gui: allow reverting selected hunk\n      git-gui: return early when patch fails to apply\n      git-gui: allow undoing last revert\n      Documentation: update the location of the git-gui repo\n\nRené Scharfe (28):\n      nedmalloc: do assignments only after the declaration section\n      nedmalloc: avoid compiler warning about unused value\n      archive-tar: report wrong pax extended header length\n      archive-tar: fix pax extended header length calculation\n      archive-tar: use size_t in strbuf_append_ext_header()\n      archive-tar: turn length miscalculation warning into BUG\n      parseopt: move definition of enum parse_opt_result up\n      sha1-name: make sort_ambiguous_oid_array() thread-safe\n      log-tree: always use return value of strbuf_detach()\n      grep: use return value of strbuf_detach()\n      trace2: use warning() directly in tr2_dst_malformed_warning()\n      help: make help_unknown_ref() NORETURN\n      tree: simplify parse_tree_indirect()\n      tag: factor out get_tagged_oid()\n      use get_tagged_oid()\n      log: test --decorate-refs-exclude with --simplify-by-decoration\n      log-tree: call load_ref_decorations() in get_name_decoration()\n      rev-parse: demonstrate overflow of N for \"foo^N\" and \"foo~N\"\n      sha1-name: check for overflow of N in \"foo^N\" and \"foo~N\"\n      commit-graph: use commit_list_count()\n      sha1_name: simplify strbuf handling in interpret_nth_prior_checkout()\n      git: use COPY_ARRAY and MOVE_ARRAY in handle_alias()\n      treewide: remove duplicate #include directives\n      convert: fix handling of dashless UTF prefix in validate_encoding()\n      tests: remove \"cat foo\" before \"test_i18ngrep bar foo\"\n      http-push: simplify deleting a list item\n      column: use utf8_strnwidth() to strip out ANSI color escapes\n      remote-curl: use argv_array in parse_push()\n\nSZEDER Gábor (33):\n      t5510-fetch: fix negated 'test_i18ngrep' invocation\n      t5510-fetch: run non-httpd-specific test before sourcing 'lib-httpd.sh'\n      t5703: run all non-httpd-specific tests before sourcing 'lib-httpd.sh'\n      t: warn against adding non-httpd-specific tests after sourcing 'lib-httpd'\n      t5318-commit-graph: use 'test_expect_code'\n      commit-graph: turn a group of write-related macro flags into an enum\n      commit-graph: error out on invalid commit oids in 'write --stdin-commits'\n      t0000-basic: use realistic test script names in the verbose tests\n      tests: show the test name and number at the start of verbose output\n      completion: fix a typo in a comment\n      completion: complete more values of more 'color.*' configuration variables\n      completion: add tests for 'git config' completion\n      completion: deduplicate configuration sections\n      completion: use 'sort -u' to deduplicate config variable names\n      completion: simplify inner 'case' pattern in __gitcomp()\n      completion: split _git_config()\n      completion: complete configuration sections and variable names for 'git -c'\n      completion: complete values of configuration variables after 'git -c var='\n      completion: complete config variables names and values for 'git clone -c'\n      completion: complete config variables and values for 'git clone --config='\n      worktree remove: clarify error message on dirty worktree\n      diff: 'diff.indentHeuristic' is no longer experimental\n      line-log: extract pathspec parsing from line ranges into a helper function\n      line-log: avoid unnecessary full tree diffs\n      t7300-clean: demonstrate deleting nested repo with an ignored file breakage\n      t/lib-git-svn.sh: check GIT_TEST_SVN_HTTPD when running SVN HTTP tests\n      ci: restore running httpd tests\n      commit-graph: don't show progress percentages while expanding reachable commits\n      Revert \"progress: use term_clear_line()\"\n      Test the progress display\n      t/helper: ignore only executable files\n      travis-ci: do not skip successfully tested trees in debug mode\n      name-rev: avoid cutoff timestamp underflow\n\nStephen Boyd (1):\n      userdiff: add a builtin pattern for dts files\n\nStephen P. Smith (2):\n      Quit passing 'now' to date code\n      test_date.c: remove reference to GIT_TEST_DATE_NOW\n\nSun Chao (1):\n      pack-refs: always refresh after taking the lock file\n\nTanay Abhra (1):\n      t1308-config-set: fix a test that has a typo\n\nTaylor Blau (4):\n      banned.h: fix vsprintf()'s ban message\n      t/t5318: introduce failing 'git commit-graph write' tests\n      commit-graph.c: handle commit parsing errors\n      commit-graph.c: handle corrupt/missing trees\n\nThomas Gummerer (6):\n      t0021: make sure clean filter runs\n      push: disallow --all and refspecs when remote.<name>.mirror is set\n      factor out refresh_and_write_cache function\n      merge: use refresh_and_write_cache\n      stash: make sure to write refreshed cache\n      range-diff: don't segfault with mode-only changes\n\nTobias Klauser (1):\n      git-svn: trim leading and trailing whitespaces in author name\n\nTorsten Bögershausen (1):\n      mingw: support UNC in git clone file://server/share/repo\n\nVarun Naik (2):\n      checkout.c: unstage empty deleted ita files\n      restore: add test for deleted ita files\n\nYanKe (1):\n      gitk: Add Chinese (zh_CN) translation\n\nbrian m. carlson (43):\n      builtin/replace: make hash size independent\n      patch-id: convert to use the_hash_algo\n      fetch-pack: use parse_oid_hex\n      builtin/receive-pack: switch to use the_hash_algo\n      builtin/blame: switch uses of GIT_SHA1_HEXSZ to the_hash_algo\n      builtin/rev-parse: switch to use the_hash_algo\n      blame: remove needless comparison with GIT_SHA1_HEXSZ\n      show-index: switch hard-coded constants to the_hash_algo\n      connected: switch GIT_SHA1_HEXSZ to the_hash_algo\n      bundle: switch to use the_hash_algo\n      combine-diff: replace GIT_SHA1_HEXSZ with the_hash_algo\n      config: use the_hash_algo in abbrev comparison\n      sha1-lookup: switch hard-coded constants to the_hash_algo\n      bisect: switch to using the_hash_algo\n      sequencer: convert to use the_hash_algo\n      pack-write: use hash_to_hex when writing checksums\n      builtin/repack: write object IDs of the proper length\n      builtin/worktree: switch null_sha1 to null_oid\n      cache: remove null_sha1\n      wt-status: convert struct wt_status to object_id\n      packfile: replace sha1_to_hex\n      builtin/index-pack: replace sha1_to_hex\n      builtin/receive-pack: replace sha1_to_hex\n      rerere: replace sha1_to_hex\n      builtin/show-index: replace sha1_to_hex\n      midx: switch to using the_hash_algo\n      t3201: abstract away SHA-1-specific constants\n      t3206: abstract away hash size constants\n      t3301: abstract away SHA-1-specific constants\n      t3305: make hash size independent\n      t3306: abstract away SHA-1-specific constants\n      t3404: abstract away SHA-1-specific constants\n      t3430: avoid hard-coded object IDs\n      t3506: make hash independent\n      t3600: make hash size independent\n      t3800: make hash-size independent\n      t3903: abstract away SHA-1-specific constants\n      t4000: make hash size independent\n      t4002: make hash independent\n      t4009: make hash size independent\n      path: add a function to check for path suffix\n      am: reload .gitattributes after patching it\n      Documentation: fix build with Asciidoctor 2\n\nÆvar Arnfjörð Bjarmason (20):\n      log tests: test regex backends in \"--encode=<enc>\" tests\n      grep: don't use PCRE2?_UTF8 with \"log --encoding=<non-utf8>\"\n      t4210: skip more command-line encoding tests on MinGW\n      grep: inline the return value of a function call used only once\n      grep tests: move \"grep binary\" alongside the rest\n      grep tests: move binary pattern tests into their own file\n      grep: make the behavior for NUL-byte in patterns sane\n      grep: drop support for \\0 in --fixed-strings <pattern>\n      grep: remove the kwset optimization\n      grep: use PCRE v2 for optimized fixed-string search\n      grep: remove overly paranoid BUG(...) code\n      grep: stop \"using\" a custom JIT stack with PCRE v2\n      grep: stop using a custom JIT stack with PCRE v1\n      grep: consistently use \"p->fixed\" in compile_regexp()\n      grep: create a \"is_fixed\" member in \"grep_pat\"\n      grep: stess test PCRE v2 on invalid UTF-8 data\n      grep: do not enter PCRE2_UTF mode on fixed matching\n      t3432: distinguish \"noop-same\" v.s. \"work-same\" in \"same head\" tests\n      t3432: test for --no-ff's interaction with fast-forward\n      rebase tests: test linear branch topology\n\n"},{"id":"384565","messageId":"c554383b-b569-79f8-88f6-7017be76da9d@gmail.com","threadId":"52066","inReplyTo":"xmqq4l065zx5.fsf@gitster-ct.c.googlers.com","subject":"Re: [ANNOUNCE] Git v2.24.0-rc0","fromName":"Derrick Stolee","fromEmail":"stolee@gmail.com","sentAt":"2019-10-21T20:48:09Z","receivedAt":"2019-10-21T20:48:13Z","isPatch":false,"sender":{"key":"stolee@gmail.com","avatar":"https://avatars.githubusercontent.com/u/570044?v=4"},"body":"(dropping some of the other aliases from this reply)\n\nI ran a few of the performance tests against the Linux repository\nusing v2.22.0, v2.23.0, and the new v2.24.0-rc0. I thought it worth\npointing out that the drastic performance improvements are due to\nturning on the commit-graph by default. I had computed a commit-graph\nfor my Linux repo, but used my global config to enable core.commitGraph.\nThe global config is ignored by perf tests, so v2.22.0 and v2.23.0 were\noperating without looking at the commit-graph.\n\n(These were run on my old dev machine, which is now running Ubuntu on\nbare metal. No VM this time!)\n\nTest                                                          v2.22.0               v2.23.0                     v2.24.0-rc0             \n----------------------------------------------------------------------------------------------------------------------------------------\n0001.1: rev-list --all                                        6.01(5.73+0.28)       5.99(5.73+0.25) -0.3%       0.97(0.80+0.16) -83.9%  \n0001.2: rev-list --all --objects                              40.40(39.86+0.54)     40.22(39.59+0.62) -0.4%     35.28(34.75+0.52) -12.7%\n0001.3: rev-list --parents                                    6.11(5.83+0.27)       6.07(5.82+0.25) -0.7%       1.03(0.86+0.16) -83.1%  \n0001.5: rev-list -- dummy                                     0.64(0.58+0.06)       0.66(0.59+0.07) +3.1%       0.34(0.29+0.05) -46.9%  \n0001.6: rev-list --parents -- dummy                           0.66(0.60+0.05)       0.67(0.62+0.05) +1.5%       0.36(0.32+0.03) -45.5%  \n0001.8: rev-list $commit --not --all                          0.03(0.02+0.01)       0.03(0.02+0.01) +0.0%       0.03(0.02+0.01) +0.0%   \n0001.9: rev-list --objects $commit --not --all                0.08(0.05+0.03)       0.08(0.05+0.03) +0.0%       0.09(0.07+0.02) +12.5%  \n0002.1: read_cache/discard_cache 1000 times                   3.33(3.07+0.25)       3.32(3.05+0.27) -0.3%       3.31(3.10+0.21) -0.6%   \n0005.2: read-tree status br_ballast (65695)                   0.48(0.42+0.23)       0.46(0.43+0.19) -4.2%       0.49(0.48+0.18) +2.1%   \n0006.2: read-tree br_base br_ballast (65695)                  0.17(0.14+0.03)       0.17(0.15+0.01) +0.0%       0.18(0.16+0.02) +5.9%   \n0006.3: switch between br_base br_ballast (65695)             7.17(5.35+2.10)       6.84(5.14+2.04) -4.6%       6.67(5.07+1.88) -7.0%   \n0006.4: switch between br_ballast br_ballast_plus_1 (65695)   0.35(0.37+0.29)       0.34(0.32+0.33) -2.9%       0.35(0.33+0.34) +0.0%   \n0006.5: switch between aliases (65695)                        0.33(0.34+0.31)       0.32(0.34+0.30) -3.0%       0.34(0.34+0.32) +3.0%   \n0007.2: write_locked_index 3 times (65695 files)              0.17(0.16+0.01)       0.17(0.15+0.02) +0.0%       0.18(0.16+0.01) +5.9%   \n0071.2: sort(1)                                               6.01(17.44+1.78)      6.05(17.44+1.69) +0.7%      5.85(17.07+1.69) -2.7%  \n0071.3: string_list_sort()                                    15.81(14.94+0.87)     15.80(14.83+0.97) -0.1%     15.86(15.03+0.83) +0.3% \n4205.1: log with %H                                           6.46(6.14+0.31)       6.42(6.15+0.26) -0.6%       5.95(5.71+0.24) -7.9%   \n4205.2: log with %h                                           7.06(6.74+0.32)       7.02(6.75+0.27) -0.6%       6.47(6.26+0.21) -8.4%   \n4205.3: log with %T                                           6.43(6.13+0.29)       6.41(6.10+0.30) -0.3%       6.24(5.95+0.29) -3.0%   \n4205.4: log with %t                                           7.29(7.04+0.24)       7.28(6.96+0.32) -0.1%       7.05(6.78+0.27) -3.3%   \n4205.5: log with %P                                           6.44(6.19+0.24)       6.51(6.19+0.31) +1.1%       5.95(5.69+0.25) -7.6%   \n4205.6: log with %p                                           7.03(6.70+0.33)       7.01(6.74+0.27) -0.3%       6.52(6.26+0.26) -7.3%   \n4205.7: log with %h-%h-%h                                     7.79(7.57+0.22)       7.79(7.55+0.24) +0.0%       7.10(6.84+0.26) -8.9%   \n4211.2: git rev-list --topo-order (baseline)                  6.32(6.04+0.28)       6.30(6.09+0.21) -0.3%       1.15(0.96+0.19) -81.8%  \n4211.3: git log --follow (baseline for -M)                    8.58(8.43+0.14)       8.56(8.41+0.15) -0.2%       3.67(3.53+0.13) -57.2%  \n4211.4: git log -L (renames off)                              32.79(30.68+2.10)     32.80(30.69+2.11) +0.0%     27.17(25.24+1.93) -17.1%\n4211.5: git log -L (renames on)                               212.64(210.39+2.24)   213.48(211.26+2.20) +0.4%   27.38(25.53+1.84) -87.1%\n4211.6: git log --oneline --raw --parents                     46.41(45.97+0.43)     46.34(45.81+0.52) -0.2%     46.03(45.46+0.57) -0.8% \n4211.7: git log --oneline --raw --parents -1000               0.09(0.07+0.01)       0.09(0.09+0.00) +0.0%       0.09(0.08+0.00) +0.0%   \n\nThe tests below are some that I don't run very often, but seemed\ninteresting. Interesting that rebase got a lot faster!\n\nTest                                                            v2.22.0               v2.23.0                     v2.24.0-rc0              \n-------------------------------------------------------------------------------------------------------------------------------------------\n0100.2: refglob((a*)^nb) against tag (a^100).t; n = 1           0.01(0.01+0.00)       0.00(0.01+0.00) -100.0%     0.01(0.01+0.00) +0.0%    \n0100.3: refglob((a*)^nb) against tag (a^100).t; n = 2           0.01(0.01+0.00)       0.01(0.01+0.00) +0.0%       0.01(0.01+0.00) +0.0%    \n0100.4: refglob((a*)^nb) against tag (a^100).t; n = 3           0.01(0.01+0.00)       0.01(0.01+0.00) +0.0%       0.01(0.01+0.00) +0.0%    \n0100.5: refglob((a*)^nb) against tag (a^100).t; n = 4           0.02(0.02+0.00)       0.02(0.02+0.00) +0.0%       0.02(0.02+0.00) +0.0%    \n0100.6: refglob((a*)^nb) against tag (a^100).t; n = 5           0.14(0.14+0.00)       0.14(0.13+0.00) +0.0%       0.14(0.14+0.00) +0.0%    \n0100.7: refglob((a*)^nb) against tag (a^100).t; n = 6           2.11(2.11+0.00)       2.11(2.10+0.00) +0.0%       2.14(2.14+0.00) +1.4%    \n0100.8: fileglob((a*)^nb) against file (a^100).t; n = 1         0.01(0.01+0.00)       0.01(0.01+0.00) +0.0%       0.01(0.01+0.00) +0.0%    \n0100.9: fileglob((a*)^nb) against file (a^100).t; n = 2         0.01(0.01+0.00)       0.01(0.01+0.00) +0.0%       0.01(0.01+0.00) +0.0%    \n0100.10: fileglob((a*)^nb) against file (a^100).t; n = 3        0.01(0.00+0.01)       0.01(0.01+0.00) +0.0%       0.01(0.01+0.00) +0.0%    \n0100.11: fileglob((a*)^nb) against file (a^100).t; n = 4        0.02(0.02+0.00)       0.02(0.02+0.00) +0.0%       0.02(0.02+0.00) +0.0%    \n0100.12: fileglob((a*)^nb) against file (a^100).t; n = 5        0.14(0.14+0.00)       0.14(0.14+0.00) +0.0%       0.15(0.15+0.00) +7.1%    \n0100.13: fileglob((a*)^nb) against file (a^100).t; n = 6        2.10(2.09+0.00)       2.11(2.11+0.00) +0.5%       2.10(2.10+0.00) +0.0%    \n1450.1: fsck                                                    535.66(535.16+0.48)   531.12(530.65+0.46) -0.8%   533.41(532.91+0.48) -0.4%\n1451.3: fsck with 0 skipped bad commits                         7.47(7.02+0.45)       7.42(7.03+0.39) -0.7%       7.24(6.83+0.41) -3.1%    \n1451.5: fsck with 1 skipped bad commits                         7.49(7.12+0.37)       7.42(7.02+0.39) -0.9%       7.26(6.92+0.34) -3.1%    \n1451.7: fsck with 10 skipped bad commits                        7.45(7.02+0.42)       7.47(7.07+0.39) +0.3%       7.26(6.84+0.41) -2.6%    \n1451.9: fsck with 100 skipped bad commits                       7.55(7.10+0.44)       7.49(7.07+0.41) -0.8%       7.29(6.87+0.42) -3.4%    \n1451.11: fsck with 1000 skipped bad commits                     7.56(7.14+0.42)       7.46(7.06+0.40) -1.3%       7.28(6.94+0.33) -3.7%    \n1451.13: fsck with 10000 skipped bad commits                    7.48(7.13+0.34)       7.49(7.11+0.37) +0.1%       7.57(7.19+0.38) +1.2%    \n1451.15: fsck with 100000 skipped bad commits                   7.40(7.04+0.35)       7.38(7.02+0.36) -0.3%       7.21(6.80+0.41) -2.6%    \n1451.17: fsck with 1000000 skipped bad commits                  6.19(6.10+0.09)       6.16(6.05+0.11) -0.5%       5.98(5.87+0.10) -3.4%    \n3400.2: rebase on top of a lot of unrelated changes             18.86(17.80+1.71)     18.80(17.80+1.66) -0.3%     2.63(2.49+0.79) -86.1%   \n3400.4: rebase a lot of unrelated changes without split-index   68.00(62.32+5.04)     68.50(62.34+5.30) +0.7%     45.25(41.37+4.18) -33.5% \n3400.6: rebase a lot of unrelated changes with split-index      46.39(44.89+2.19)     46.24(44.66+2.30) -0.3%     25.00(24.49+1.23) -46.1% \n4000.1: log -3000 (baseline)                                    0.07(0.06+0.00)       0.07(0.06+0.01) +0.0%       0.07(0.05+0.01) +0.0%    \n4000.2: log --raw -3000 (tree-only)                             0.21(0.18+0.02)       0.20(0.19+0.01) -4.8%       0.21(0.18+0.02) +0.0%    \n4000.3: log -p -3000 (Myers)                                    2.01(1.89+0.12)       2.03(1.92+0.10) +1.0%       2.03(1.91+0.11) +1.0%    \n4000.4: log -p -3000 --histogram                                2.02(1.94+0.08)       2.04(1.95+0.08) +1.0%       2.02(1.96+0.07) +0.0%    \n4000.5: log -p -3000 --patience                                 2.57(2.50+0.07)       2.57(2.46+0.10) +0.0%       2.54(2.45+0.09) -1.2%    \n4001.2: diff --no-index                                         0.01(0.01+0.00)       0.01(0.01+0.00) +0.0%       0.01(0.01+0.00) +0.0%    \n5304.4: prune with no objects                                   0.00(0.01+0.00)       0.01(0.00+0.00) +inf        0.01(0.00+0.00) +inf     \n5304.6: prune with bitmaps                                      2.76(2.47+0.29)       2.69(2.45+0.23) -2.5%       2.67(2.36+0.31) -3.3%    \n7300.2: clean many untracked sub dirs, check for nested git     1.36(0.54+0.81)       1.35(0.51+0.82) -0.7%       1.53(0.62+0.90) +12.5%   \n7300.3: clean many untracked sub dirs, ignore nested git        1.19(0.47+0.71)       1.22(0.51+0.69) +2.5%       1.19(0.53+0.64) +0.0%    \n7300.4: ls-files -o                                             0.75(0.33+0.41)       0.76(0.34+0.41) +1.3%       0.74(0.25+0.48) -1.3%   \n\nAny thoughts on 7300.2? Seems to not just be noise, or maybe it is?\n\nThanks,\n-Stolee\n"},{"id":"384570","messageId":"nycvar.QRO.7.76.6.1910220004190.46@tvgsbejvaqbjf.bet","threadId":"52066","inReplyTo":"xmqq4l065zx5.fsf@gitster-ct.c.googlers.com","subject":"Git for Windows v2.24.0-rc0, was Re: [ANNOUNCE] Git v2.24.0-rc0","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2019-10-21T22:05:26Z","receivedAt":"2019-10-21T22:06:11Z","isPatch":false,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"Team,\n\na couple of days later than I wanted, but at least it is now here:\nhttps://github.com/git-for-windows/git/releases/tag/v2.24.0-rc0.windows.1\n\nPlease test...\n\nThank you,\nJohannes\n\n\n"},{"id":"384571","messageId":"CABPp-BG0Vrdo_w-e270oauLwHoLyaiTHKpfOwgLNBoeikoqq-g@mail.gmail.com","threadId":"52066","inReplyTo":"c554383b-b569-79f8-88f6-7017be76da9d@gmail.com","subject":"Re: [ANNOUNCE] Git v2.24.0-rc0","fromName":"Elijah Newren","fromEmail":"newren@gmail.com","sentAt":"2019-10-21T23:04:22Z","receivedAt":"2019-10-21T23:04:36Z","isPatch":false,"sender":{"key":"newren@gmail.com","avatar":"https://avatars.githubusercontent.com/u/5455730?v=4"},"body":" On Mon, Oct 21, 2019 at 1:50 PM Derrick Stolee <stolee@gmail.com> wrote:\n> I ran a few of the performance tests against the Linux repository\n> using v2.22.0, v2.23.0, and the new v2.24.0-rc0. I thought it worth\n> pointing out that the drastic performance improvements are due to\n> turning on the commit-graph by default. I had computed a commit-graph\n> for my Linux repo, but used my global config to enable core.commitGraph.\n> The global config is ignored by perf tests, so v2.22.0 and v2.23.0 were\n> operating without looking at the commit-graph.\n>\n> (These were run on my old dev machine, which is now running Ubuntu on\n> bare metal. No VM this time!)\n>\n> Test                                                          v2.22.0               v2.23.0                     v2.24.0-rc0\n> ----------------------------------------------------------------------------------------------------------------------------------------\n> 0001.1: rev-list --all                                        6.01(5.73+0.28)       5.99(5.73+0.25) -0.3%       0.97(0.80+0.16) -83.9%\n> 0001.2: rev-list --all --objects                              40.40(39.86+0.54)     40.22(39.59+0.62) -0.4%     35.28(34.75+0.52) -12.7%\n> 0001.3: rev-list --parents                                    6.11(5.83+0.27)       6.07(5.82+0.25) -0.7%       1.03(0.86+0.16) -83.1%\n> 0001.5: rev-list -- dummy                                     0.64(0.58+0.06)       0.66(0.59+0.07) +3.1%       0.34(0.29+0.05) -46.9%\n> 0001.6: rev-list --parents -- dummy                           0.66(0.60+0.05)       0.67(0.62+0.05) +1.5%       0.36(0.32+0.03) -45.5%\n[...]\n> 4211.2: git rev-list --topo-order (baseline)                  6.32(6.04+0.28)       6.30(6.09+0.21) -0.3%       1.15(0.96+0.19) -81.8%\n> 4211.3: git log --follow (baseline for -M)                    8.58(8.43+0.14)       8.56(8.41+0.15) -0.2%       3.67(3.53+0.13) -57.2%\n> 4211.4: git log -L (renames off)                              32.79(30.68+2.10)     32.80(30.69+2.11) +0.0%     27.17(25.24+1.93) -17.1%\n> 4211.5: git log -L (renames on)                               212.64(210.39+2.24)   213.48(211.26+2.20) +0.4%   27.38(25.53+1.84) -87.1%\n\nMany nice speedups here, not just commit-graph (the rev-list cases)\nbut also log -L (from sg/line-log-tree-diff-optim, I believe), and log\n--follow.  I'm curious if the log --follow speedup comes from sg's\nseries or something else...\n\n> 0001.9: rev-list --objects $commit --not --all                0.08(0.05+0.03)       0.08(0.05+0.03) +0.0%       0.09(0.07+0.02) +12.5%\n\nLooks like this one increased too, with a similar magnitude to the\n7300.2 you pointed out.  But the base is kinda small; is this just\nnoise?\n\n> The tests below are some that I don't run very often, but seemed\n> interesting. Interesting that rebase got a lot faster!\n>\n> Test                                                            v2.22.0               v2.23.0                     v2.24.0-rc0\n> -------------------------------------------------------------------------------------------------------------------------------------------\n> 3400.2: rebase on top of a lot of unrelated changes             18.86(17.80+1.71)     18.80(17.80+1.66) -0.3%     2.63(2.49+0.79) -86.1%\n> 3400.4: rebase a lot of unrelated changes without split-index   68.00(62.32+5.04)     68.50(62.34+5.30) +0.7%     45.25(41.37+4.18) -33.5%\n> 3400.6: rebase a lot of unrelated changes with split-index      46.39(44.89+2.19)     46.24(44.66+2.30) -0.3%     25.00(24.49+1.23) -46.1%\n\nI'm also curious what change it was that made these rebase tests faster.\n\n> 7300.2: clean many untracked sub dirs, check for nested git     1.36(0.54+0.81)       1.35(0.51+0.82) -0.7%       1.53(0.62+0.90) +12.5%\n[...]\n> Any thoughts on 7300.2? Seems to not just be noise, or maybe it is?\n\nWell, en/clean-nested-with-ignored is a very likely the cause of any\nperformance difference here, but given the nasty bug it was fixing\n(see sg/clean-nested-repo-with-ignored topic), the performance change\nis totally warranted if necessary for the fix.  And it looks like that\ntest is exercising one of the areas of logic that my series was\nmodifying (namely the clean -fd case in conjunction with the\npossibility of nested .git dirs).\n\nThat's enough for me to accept the performance change.  If soemone\nelse wants to dig a little further to determine whether this perf\nchange was part of the important fix or just due to a separate change,\nI'll provide a few pointers.  Assuming it's one of my commits, I think\nit has to be one of the following three:\n\n404ebceda01c (\"dir: also check directories for matching pathspecs\",\n2019-09-17): if this one causes the perf change, I think we just suck\nit up.\n\n89a1f4aaf765 (\"dir: if our pathspec might match files under a dir,\nrecurse into it\", 2019-09-17): if this one causes the perf change, we\nmight be able to do something by somehow rearranging the if-block\nlogic.  Checking bits is going to be faster than calling the\nget_dtype() function, but calling get_dtype() should be much faster\nthan calling do_match_pathspec().  Any change here would probably make\nthis if-block harder to read, but on the off chance it's the one\nresponsible for most the change, maybe it is worth it?\n\n09487f2cbad3 (\"clean: avoid removing untracked files in a nested git\nrepository\", 2019-09-17): if this commit causes the perf change, I\nthink we could change the \"else\" block to \"else if (force > 0)\".\nActually, wait, 7300.2 uses -f so I don't think this can affect this\ntestcase.  If someone finds it strongly affects some other testcase,\nwe could look closer at that change.\n\n\nElijah\n"},{"id":"384572","messageId":"20191022064252.GA11308@sigill.intra.peff.net","threadId":"52066","inReplyTo":"CABPp-BG0Vrdo_w-e270oauLwHoLyaiTHKpfOwgLNBoeikoqq-g@mail.gmail.com","subject":"Re: [ANNOUNCE] Git v2.24.0-rc0","fromName":"Jeff King","fromEmail":"peff@peff.net","sentAt":"2019-10-22T06:42:52Z","receivedAt":"2019-10-22T06:42:57Z","isPatch":false,"sender":{"key":"peff@peff.net","avatar":"https://avatars.githubusercontent.com/u/45925?v=4"},"body":"On Mon, Oct 21, 2019 at 04:04:22PM -0700, Elijah Newren wrote:\n\n> > 4211.3: git log --follow [...]8.56(8.41+0.15) -0.2%       3.67(3.53+0.13) -57.2%\n> \n> Many nice speedups here, not just commit-graph (the rev-list cases)\n> but also log -L (from sg/line-log-tree-diff-optim, I believe), and log\n> --follow.  I'm curious if the log --follow speedup comes from sg's\n> series or something else...\n\nThe \"log --follow\" speedup comes from turning on commit-graphs. You can\nsee a similar effect without \"--follow\", since \"git log <path>\" is going\nto be dominated by the commit traversal, and not accessing the trees\n(especially if <path> is at the top-level).\n\n> > 0001.9: rev-list --objects $commit --not --all                0.08(0.05+0.03)       0.08(0.05+0.03) +0.0%       0.09(0.07+0.02) +12.5%\n> \n> Looks like this one increased too, with a similar magnitude to the\n> 7300.2 you pointed out.  But the base is kinda small; is this just\n> noise?\n\nProbably. I also frequently run the perf suite between major version\nreleases, and this kind of noise is quite common.\n\n> I'm also curious what change it was that made these rebase tests faster.\n\nPerf changes of this magnitude are usually pretty easy to bisect. You\ncan even do:\n\n  git bisect start --term-old=slow --term-new=fast\n\nso you don't have to confuse yourself with opposite good/bad markers.\nI just ran:\n\n  make && (cd t/perf && GIT_SKIP_TESTS=p3400.[3456] ./p3400*)\n\nat each stopping point and eyeballed the resulting time (which for some\nreason seems to be about 10x faster than Stolee's machine, but does\nstill show the same relative speedup). I was surprised that this also\nyields 31b1de6a09 (commit-graph: turn on commit-graph by default,\n2019-08-13). I wouldn't have expected commit access to dominate the\nrebase time so much.\n\n-Peff\n"},{"id":"384609","messageId":"74f50326-e613-8545-2c69-65cd29dd3cfb@iee.email","threadId":"52066","inReplyTo":"nycvar.QRO.7.76.6.1910220004190.46@tvgsbejvaqbjf.bet","subject":"Re: [git-for-windows] Git for Windows v2.24.0-rc0, was Re: [ANNOUNCE] Git v2.24.0-rc0","fromName":"Philip Oakley","fromEmail":"philipoakley@iee.email","sentAt":"2019-10-22T14:50:28Z","receivedAt":"2019-10-22T14:50:31Z","isPatch":false,"sender":{"key":"philipoakley@iee.email","avatar":"https://avatars.githubusercontent.com/u/914343?v=4"},"body":"Hi Dscho,\n\nInstall went Ok.\n\nDid a quick test on the config locations and `git config -l \n-show-origin` has 'lost' the ProgramData location as planned.\n\nThe minor pedant did notice that the new location is listed slightly \ndifferently from the release notes.\n`file:C:/Program Files/Git/mingw64/../etc/gitconfig`  --system,\nwhile the release notes simplify the path to C:/Program \nFiles/Git/etc/gitconfig\n\nDunno if that's worth a minor fix to the release notes to clarify for \nthe broader Windows community. Maybe others can comment if they think \nit's even worth it.\n\nPhilip\n\nOn 21/10/2019 23:05, Johannes Schindelin wrote:\n> Team,\n>\n> a couple of days later than I wanted, but at least it is now here:\n> https://github.com/git-for-windows/git/releases/tag/v2.24.0-rc0.windows.1\n>\n> Please test...\n>\n> Thank you,\n> Johannes\n>\n>\n\n"},{"id":"384783","messageId":"CAGyf7-EyK0COjea2CPM7U5h6uekcFfL1eREQ6tatM3nQ21J_yw@mail.gmail.com","threadId":"52066","inReplyTo":"nycvar.QRO.7.76.6.1910220004190.46@tvgsbejvaqbjf.bet","subject":"Re: Git for Windows v2.24.0-rc0, was Re: [ANNOUNCE] Git v2.24.0-rc0","fromName":"Bryan Turner","fromEmail":"bturner@atlassian.com","sentAt":"2019-10-24T18:24:31Z","receivedAt":"2019-10-24T18:24:45Z","isPatch":false,"sender":{"key":"bturner@atlassian.com","avatar":"https://gravatar.com/avatar/16bcf3167981c1ef7c804e502642366d888a35b0d0b0a4ca01fdc442aa1acb1e?d=mp&s=160"},"body":"On Mon, Oct 21, 2019 at 3:05 PM Johannes Schindelin\n<Johannes.Schindelin@gmx.de> wrote:\n>\n> Team,\n>\n> a couple of days later than I wanted, but at least it is now here:\n> https://github.com/git-for-windows/git/releases/tag/v2.24.0-rc0.windows.1\n>\n> Please test...\n\nI've run both the Linux and Windows 2.24.0-rc0 candidates through\nBitbucket Server's test matrix (~6,000 forked git processes,\nexercising various commands and verifying behavior/output). No issues\nfound.\n\nThanks again for these early builds!\n\nBest regards,\nBryan Turner\n\n>\n> Thank you,\n> Johannes\n>\n>\n"},{"id":"384802","messageId":"nycvar.QRO.7.76.6.1910250051450.46@tvgsbejvaqbjf.bet","threadId":"52066","inReplyTo":"CAGyf7-EyK0COjea2CPM7U5h6uekcFfL1eREQ6tatM3nQ21J_yw@mail.gmail.com","subject":"Re: Git for Windows v2.24.0-rc0, was Re: [ANNOUNCE] Git v2.24.0-rc0","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2019-10-24T22:52:04Z","receivedAt":"2019-10-24T22:52:50Z","isPatch":false,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"Hi Bryan,\n\nOn Thu, 24 Oct 2019, Bryan Turner wrote:\n\n> On Mon, Oct 21, 2019 at 3:05 PM Johannes Schindelin\n> <Johannes.Schindelin@gmx.de> wrote:\n> >\n> > a couple of days later than I wanted, but at least it is now here:\n> > https://github.com/git-for-windows/git/releases/tag/v2.24.0-rc0.windows.1\n> >\n> > Please test...\n>\n> I've run both the Linux and Windows 2.24.0-rc0 candidates through\n> Bitbucket Server's test matrix (~6,000 forked git processes,\n> exercising various commands and verifying behavior/output). No issues\n> found.\n\nThank you so much!\nDscho\n\n>\n> Thanks again for these early builds!\n>\n> Best regards,\n> Bryan Turner\n>\n> >\n> > Thank you,\n> > Johannes\n> >\n> >\n>\n"},{"id":"384804","messageId":"nycvar.QRO.7.76.6.1910250052350.46@tvgsbejvaqbjf.bet","threadId":"52066","inReplyTo":"74f50326-e613-8545-2c69-65cd29dd3cfb@iee.email","subject":"Re: [git-for-windows] Git for Windows v2.24.0-rc0, was Re: [ANNOUNCE] Git v2.24.0-rc0","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2019-10-24T23:08:16Z","receivedAt":"2019-10-24T23:08:42Z","isPatch":false,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"Hi Philip,\n\nOn Tue, 22 Oct 2019, Philip Oakley wrote:\n\n> The minor pedant did notice that the new location is listed slightly\n> differently from the release notes.\n> `file:C:/Program Files/Git/mingw64/../etc/gitconfig`  --system,\n> while the release notes simplify the path to C:/Program\n> Files/Git/etc/gitconfig\n\nThat's a good point. I guess that it would make sense to normalize the\nlocation of the system gitconfig:\n\n-- snip --\nSubject: [PATCH] config: normalize the path of the system gitconfig\n\nGit for Windows is compiled with a runtime prefix, and that runtime\nprefix is typically `C:/Program Files/Git/mingw64`. As we want the\nsystem gitconfig to live in the sibling directory `etc`, we define the\nrelative path as `../etc/gitconfig`.\n\nHowever, as reported by Philip Oakley, the output of `git config\n--show-origin --system -l` looks rather ugly, as it shows the path as\n`file:C:/Program Files/Git/mingw64/../etc/gitconfig`, i.e. with the\n`mingw64/../` part.\n\nBy normalizing the path, we get a prettier path.\n\nSigned-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>\n---\n config.c | 4 +++-\n 1 file changed, 3 insertions(+), 1 deletion(-)\n\ndiff --git a/config.c b/config.c\nindex e7052b39773..8e2f4748c49 100644\n--- a/config.c\n+++ b/config.c\n@@ -1658,8 +1658,10 @@ static int git_config_from_blob_ref(config_fn_t fn,\n const char *git_etc_gitconfig(void)\n {\n \tstatic const char *system_wide;\n-\tif (!system_wide)\n+\tif (!system_wide) {\n \t\tsystem_wide = system_path(ETC_GITCONFIG);\n+\t\tnormalize_path_copy((char *)system_wide, system_wide);\n+\t}\n \treturn system_wide;\n }\n\n--\n2.24.0.rc1.windows.1\n-- snap --\n\nSee also https://github.com/git-for-windows/git/pull/2370\n\nCiao,\nDscho\n"},{"id":"384811","messageId":"20191024233432.GB32602@sigill.intra.peff.net","threadId":"52066","inReplyTo":"nycvar.QRO.7.76.6.1910250052350.46@tvgsbejvaqbjf.bet","subject":"Re: [git-for-windows] Git for Windows v2.24.0-rc0, was Re: [ANNOUNCE] Git v2.24.0-rc0","fromName":"Jeff King","fromEmail":"peff@peff.net","sentAt":"2019-10-24T23:34:33Z","receivedAt":"2019-10-24T23:34:37Z","isPatch":false,"sender":{"key":"peff@peff.net","avatar":"https://avatars.githubusercontent.com/u/45925?v=4"},"body":"On Fri, Oct 25, 2019 at 01:08:16AM +0200, Johannes Schindelin wrote:\n\n> diff --git a/config.c b/config.c\n> index e7052b39773..8e2f4748c49 100644\n> --- a/config.c\n> +++ b/config.c\n> @@ -1658,8 +1658,10 @@ static int git_config_from_blob_ref(config_fn_t fn,\n>  const char *git_etc_gitconfig(void)\n>  {\n>  \tstatic const char *system_wide;\n> -\tif (!system_wide)\n> +\tif (!system_wide) {\n>  \t\tsystem_wide = system_path(ETC_GITCONFIG);\n> +\t\tnormalize_path_copy((char *)system_wide, system_wide);\n> +\t}\n>  \treturn system_wide;\n\nThis cast made me wonder why it was OK to write to system_wide. The\nanswer is that system_path() hands ownership of the memory to us, since\n59362e560d (system_path(): always return free'able memory to the caller,\n2014-11-24). So I think the better solution than the cast is to drop the\n\"const\" from its declaration to better indicate our ownership within the\nfunction.\n\nI also wondered how we know that system_wide is a large enough buffer,\nbut I guess normalizing always makes things smaller. It would be nice if\nnormalize_path_copy() said so in its docstring, but that is certainly\nnot new to your patch. :)\n\n-Peff\n"},{"id":"384847","messageId":"nycvar.QRO.7.76.6.1910251007550.46@tvgsbejvaqbjf.bet","threadId":"52066","inReplyTo":"20191024233432.GB32602@sigill.intra.peff.net","subject":"Re: [git-for-windows] Git for Windows v2.24.0-rc0, was Re: [ANNOUNCE] Git v2.24.0-rc0","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2019-10-25T08:18:30Z","receivedAt":"2019-10-25T08:19:02Z","isPatch":false,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"Hi Peff,\n\nOn Thu, 24 Oct 2019, Jeff King wrote:\n\n> On Fri, Oct 25, 2019 at 01:08:16AM +0200, Johannes Schindelin wrote:\n>\n> > diff --git a/config.c b/config.c\n> > index e7052b39773..8e2f4748c49 100644\n> > --- a/config.c\n> > +++ b/config.c\n> > @@ -1658,8 +1658,10 @@ static int git_config_from_blob_ref(config_fn_t fn,\n> >  const char *git_etc_gitconfig(void)\n> >  {\n> >  \tstatic const char *system_wide;\n> > -\tif (!system_wide)\n> > +\tif (!system_wide) {\n> >  \t\tsystem_wide = system_path(ETC_GITCONFIG);\n> > +\t\tnormalize_path_copy((char *)system_wide, system_wide);\n> > +\t}\n> >  \treturn system_wide;\n>\n> This cast made me wonder why it was OK to write to system_wide. The\n> answer is that system_path() hands ownership of the memory to us, since\n> 59362e560d (system_path(): always return free'able memory to the caller,\n> 2014-11-24). So I think the better solution than the cast is to drop the\n> \"const\" from its declaration to better indicate our ownership within the\n> function.\n\nMakes sense, I changed it to `static char *system_wide;`.\n\n> I also wondered how we know that system_wide is a large enough buffer,\n> but I guess normalizing always makes things smaller. It would be nice if\n> normalize_path_copy() said so in its docstring, but that is certainly\n> not new to your patch. :)\n\nWell, `normalize_path_copy()`'s documentation says:\n\n\tIt is okay if dst == src, but they should not overlap otherwise.\n\nBut yes, that does not state explicitly that the resulting string won't\nbe longer than the original one. It is currently true, though the\ndocumentation hints at the possibility that a future version might\nfollow symbolic links (in which case it would no longer be true). But\nthen, that would technically not be normalization anymore, but\ncanonicalization.\n\nCiao,\nDscho\n"},{"id":"384876","messageId":"20191025165849.GA20304@sigill.intra.peff.net","threadId":"52066","inReplyTo":"nycvar.QRO.7.76.6.1910251007550.46@tvgsbejvaqbjf.bet","subject":"Re: [git-for-windows] Git for Windows v2.24.0-rc0, was Re: [ANNOUNCE] Git v2.24.0-rc0","fromName":"Jeff King","fromEmail":"peff@peff.net","sentAt":"2019-10-25T16:58:49Z","receivedAt":"2019-10-25T16:58:52Z","isPatch":false,"sender":{"key":"peff@peff.net","avatar":"https://avatars.githubusercontent.com/u/45925?v=4"},"body":"On Fri, Oct 25, 2019 at 10:18:30AM +0200, Johannes Schindelin wrote:\n\n> > This cast made me wonder why it was OK to write to system_wide. The\n> > answer is that system_path() hands ownership of the memory to us, since\n> > 59362e560d (system_path(): always return free'able memory to the caller,\n> > 2014-11-24). So I think the better solution than the cast is to drop the\n> > \"const\" from its declaration to better indicate our ownership within the\n> > function.\n> \n> Makes sense, I changed it to `static char *system_wide;`.\n\nThanks, perfect.\n\n> > I also wondered how we know that system_wide is a large enough buffer,\n> > but I guess normalizing always makes things smaller. It would be nice if\n> > normalize_path_copy() said so in its docstring, but that is certainly\n> > not new to your patch. :)\n> \n> Well, `normalize_path_copy()`'s documentation says:\n> \n> \tIt is okay if dst == src, but they should not overlap otherwise.\n> \n> But yes, that does not state explicitly that the resulting string won't\n> be longer than the original one. It is currently true, though the\n> documentation hints at the possibility that a future version might\n> follow symbolic links (in which case it would no longer be true). But\n> then, that would technically not be normalization anymore, but\n> canonicalization.\n\nYeah, and I think we already have functions that do that (and return an\nallocated buffer). I have a few cleanups around some callers of\nnormalize_path_copy(), so I'll roll in the documentation change I\nsuggested.\n\n-Peff\n"}]}