git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v3 0/3] [RFC] Create 'core.featureAdoptionRate' setting to update config defaults

From
Derrick Stolee via GitGitGadget <gitgitgadget@gmail.com>
Date
Jul 1, 2019, 14:29 UTC
Message-ID
<pull.254.v3.git.gitgitgadget@gmail.com>
In-Reply-To
<pull.254.v2.git.gitgitgadget@gmail.com>

Here is a second run at this RFC, which aims to create a "meta" config setting that automatically turns on other settings according to a user's willingness to trade new Git behavior or new feature risk for performance benefits. The new name for the setting is "core.featureAdoptionRate" and is an integer scale from 0 to 10. There will be multiple "categories" of settings, and the intention is to allow more granular levels as necessary.

The first category is "3 or higher" which means that the user is willing to adopt features that have been tested in multiple major releases. The settings to include here are core.commitGraph=true, gc.writeCommitGraph=true, and index.version=4.

The second category is "5 or higher" which means the user is willing to adopt features that have not been out for multiple major releases. The setting included here is pack.useSparse=true.

In the future, I would add a "7 or higher" setting which means the user is willing to have a change of behavior in exchange for performance benefits. The two settings to place here are 'status.aheadBehind=false' and 'fetch.showForcedUpdates=false'. Instead of including these settings in the current series, I've submitted them independently for full review [1, 2].

Hopefully this direction is amenable to allow "early adopters" gain access to new performance features even if they are not necessary reading every line of the release notes.

Thanks, -Stolee
[1] https://public-inbox.org/git/pull.272.git.gitgitgadget@gmail.com/
[2] https://public-inbox.org/git/pull.273.git.gitgitgadget@gmail.com/
Derrick Stolee (3):
  repo-settings: create core.featureAdoptionRate setting
  repo-settings: use index.version=4 by default
  repo-settings: pack.useSparse=true
 Documentation/config/core.txt  | 34 +++++++++++++++++++-
 Documentation/config/gc.txt    |  4 +--
 Documentation/config/index.txt |  2 ++
 Documentation/config/pack.txt  |  3 +-
 Makefile                       |  1 +
 builtin/gc.c                   |  6 ++--
 builtin/pack-objects.c         |  9 +++---
 commit-graph.c                 |  7 ++--
 read-cache.c                   | 12 ++++---
 repo-settings.c                | 58 ++++++++++++++++++++++++++++++++++
 repo-settings.h                | 15 +++++++++
 repository.h                   |  3 ++
 t/t1600-index.sh               | 34 +++++++++++++++++---
 13 files changed, 164 insertions(+), 24 deletions(-)
 create mode 100644 repo-settings.c
 create mode 100644 repo-settings.h
base-commit: aa25c82427ae70aebf3b8f970f2afd54e9a2a8c6
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-254%2Fderrickstolee%2Fconfig-large%2Fupstream-v3
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-254/derrickstolee/config-large/upstream-v3
Pull-Request: https://github.com/gitgitgadget/git/pull/254
Range-diff vs v2:
 1:  bdaee3ea9d ! 1:  13b9e71b38 repo-settings: create core.featureAdoptionRate setting
     @@ -71,8 +71,9 @@
      ++
      +If the value is at least 3, then the following defaults are modified.
      +These represent relatively new features that have existed for multiple
     -+major releases, and present significant performance benefits. They do
     -+not modify the user-facing output of porcelain commands.
     ++major releases, and may present performance benefits. These benefits
     ++depend on the amount and kind of data in your repo and how you use it.
     ++The settings do not modify the user-facing output of porcelain commands.
      ++
      +* `core.commitGraph=true` enables reading commit-graph files.
      ++
     @@ -236,8 +237,8 @@
      +#define REPO_SETTINGS_H
      +
      +struct repo_settings {
     -+	char core_commit_graph;
     -+	char gc_write_commit_graph;
     ++	int core_commit_graph;
     ++	int gc_write_commit_graph;
      +};
      +
      +struct repository;
 2:  02c89415fe ! 2:  4fe896e423 repo-settings: use index.version=4 by default
     @@ -6,6 +6,12 @@
          This means the index could be compressed using version 4. Set this as
          a default when core.featureAdoptionRate is at least three.
      
     +    Since the index version is written to a file, this is an excellent
     +    opportunity to test that the config settings are working correctly
     +    with the different precedence rules. Adapt a test from t1600-index.sh
     +    to verify the version is set properly with different values of
     +    index.version config, core.featureAdoptionRate, and GIT_INDEX_VERSION.
     +
          Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
      
       diff --git a/Documentation/config/core.txt b/Documentation/config/core.txt
     @@ -108,9 +114,60 @@
       +++ b/repo-settings.h
      @@
       struct repo_settings {
     - 	char core_commit_graph;
     - 	char gc_write_commit_graph;
     + 	int core_commit_graph;
     + 	int gc_write_commit_graph;
      +	int index_version;
       };
       
       struct repository;
     +
     + diff --git a/t/t1600-index.sh b/t/t1600-index.sh
     + --- a/t/t1600-index.sh
     + +++ b/t/t1600-index.sh
     +@@
     + 	)
     + '
     + 
     +-test_expect_success 'GIT_INDEX_VERSION takes precedence over config' '
     ++test_index_version () {
     ++	INDEX_VERSION_CONFIG=$1 &&
     ++	REPO_ADOPTION_RATE=$2 &&
     ++	ENV_VAR_VERSION=$3
     ++	EXPECTED_OUTPUT_VERSION=$4 &&
     + 	(
     + 		rm -f .git/index &&
     +-		GIT_INDEX_VERSION=4 &&
     +-		export GIT_INDEX_VERSION &&
     +-		git config --add index.version 2 &&
     ++		rm -f .git/config &&
     ++		if test "$INDEX_VERSION_CONFIG" -ne 0
     ++		then
     ++			git config --add index.version $INDEX_VERSION_CONFIG
     ++		fi &&
     ++		if test "$REPO_ADOPTION_RATE" -ne 0
     ++		then
     ++			git config --add core.featureAdoptionRate $REPO_ADOPTION_RATE
     ++		fi &&
     ++		if test "$ENV_VAR_VERSION" -ne 0
     ++		then
     ++			GIT_INDEX_VERSION=$ENV_VAR_VERSION &&
     ++			export GIT_INDEX_VERSION
     ++		else
     ++			unset GIT_INDEX_VERSION
     ++		fi &&
     + 		git add a 2>&1 &&
     +-		echo 4 >expect &&
     ++		echo $EXPECTED_OUTPUT_VERSION >expect &&
     + 		test-tool index-version <.git/index >actual &&
     + 		test_cmp expect actual
     + 	)
     ++}
     ++
     ++test_expect_success 'index version config precedence' '
     ++	test_index_version 2 0 4 4 &&
     ++	test_index_version 2 3 0 2 &&
     ++	test_index_version 0 3 0 4 &&
     ++	test_index_version 0 3 2 2
     + '
     + 
     + test_done
 3:  5bba9062f4 ! 3:  d080065a92 repo-settings: pack.useSparse=true
     @@ -117,9 +117,9 @@
       +++ b/repo-settings.h
      @@
       struct repo_settings {
     - 	char core_commit_graph;
     - 	char gc_write_commit_graph;
     -+	char pack_use_sparse;
     + 	int core_commit_graph;
     + 	int gc_write_commit_graph;
     ++	int pack_use_sparse;
       	int index_version;
       };
       
-- 
gitgitgadget
Previous: Junio C HamanoNext: Derrick Stolee via GitGitGadget
Message 34 of 48 in “[RFC] Create 'core.size=large' setting to update config defaults”
  1. 00/11 [RFC] Create 'core.size=large' setting to update config defaultsDerrick Stolee via GitGitGadget, Jun 3, 2019
  2. 01/11 repo-settings: create repo.size=large settingDerrick Stolee via GitGitGadget, Jun 3, 2019
  3. Jeff HostetlerJun 3, 2019
  4. 02/11 repo-settings: use index.version=4 by defaultDerrick Stolee via GitGitGadget, Jun 3, 2019
  5. 05/11 status: add warning when a/b calculation takes too long for long/normal formatJeff Hostetler via GitGitGadget, Jun 3, 2019
  6. 09/11 fetch: warn about forced updates after branch listDerrick Stolee via GitGitGadget, Jun 3, 2019
  7. 07/11 repo-settings: status.aheadBehind=falseDerrick Stolee via GitGitGadget, Jun 3, 2019
  8. 11/11 repo-settings: fetch.showForcedUpdates=falseDerrick Stolee via GitGitGadget, Jun 3, 2019
  9. 10/11 pull: add --[no-]show-forced-updates passthrough to fetchDerrick Stolee via GitGitGadget, Jun 3, 2019
  10. 08/11 fetch: add --[no-]show-forced-updates argumentDerrick Stolee via GitGitGadget, Jun 3, 2019
  11. 03/11 repo-settings: pack.useSparse=trueDerrick Stolee via GitGitGadget, Jun 3, 2019
  12. 06/11 status: ignore status.aheadbehind in porcelain formatsJeff Hostetler via GitGitGadget, Jun 3, 2019
  13. 04/11 status: add status.aheadbehind settingJeff Hostetler via GitGitGadget, Jun 3, 2019
  14. Derrick StoleeJun 3, 2019
  15. Johannes SchindelinJun 4, 2019
  16. Derrick StoleeJun 4, 2019
  17. Junio C HamanoJun 5, 2019
  18. Derrick StoleeJun 6, 2019
  19. Junio C HamanoJun 6, 2019
  20. 0/3 [RFC] Create 'core.featureAdoptionRate' setting to update config defaultsDerrick Stolee via GitGitGadget, Jun 19, 2019
  21. 2/3 repo-settings: use index.version=4 by defaultDerrick Stolee via GitGitGadget, Jun 19, 2019
  22. 3/3 repo-settings: pack.useSparse=trueDerrick Stolee via GitGitGadget, Jun 19, 2019
  23. 1/3 repo-settings: create core.featureAdoptionRate settingDerrick Stolee via GitGitGadget, Jun 19, 2019
  24. Junio C HamanoJun 28, 2019
  25. Derrick StoleeJun 28, 2019
  26. Junio C HamanoJun 28, 2019
  27. Derrick StoleeJun 29, 2019
  28. Carlo ArenasJun 30, 2019
  29. Derrick StoleeJul 1, 2019
  30. Ævar Arnfjörð BjarmasonJul 2, 2019
  31. Duy NguyenJul 2, 2019
  32. Derrick StoleeJul 2, 2019
  33. Junio C HamanoJul 2, 2019
  34. 0/3 [RFC] Create 'core.featureAdoptionRate' setting to update config defaultsDerrick Stolee via GitGitGadget, Jul 1, 2019
  35. 2/3 repo-settings: use index.version=4 by defaultDerrick Stolee via GitGitGadget, Jul 1, 2019
  36. 1/3 repo-settings: create core.featureAdoptionRate settingDerrick Stolee via GitGitGadget, Jul 1, 2019
  37. Carlo ArenasJul 1, 2019
  38. Duy NguyenJul 2, 2019
  39. Ævar Arnfjörð BjarmasonJul 2, 2019
  40. Jakub NarebskiJul 4, 2019
  41. 3/3 repo-settings: pack.useSparse=trueDerrick Stolee via GitGitGadget, Jul 1, 2019
  42. Derrick StoleeJul 8, 2019
  43. Taylor BlauJul 9, 2019
  44. Junio C HamanoJul 9, 2019
  45. Derrick StoleeJul 9, 2019
  46. Junio C HamanoJul 9, 2019
  47. Derrick StoleeJul 22, 2019
  48. Jakub NarebskiJul 11, 2019

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.