From: Taylor Blau <me@ttaylorr.com>
To: git@vger.kernel.org
Cc: peff@peff.net, dstolee@microsoft.com, gitster@pobox.com,
martin.agren@gmail.com
Subject: [PATCH v2 0/3] builtin/commit-graph.c: new split/merge options
Date: Tue, 4 Feb 2020 16:28:29 -0800 [thread overview]
Message-ID: <cover.1580862307.git.me@ttaylorr.com> (raw)
In-Reply-To: <cover.1580430057.git.me@ttaylorr.com>
Hi,
Here is an updated 'v2' of my series to introduce new splitting and
merging options to the 'commit-graph write' builtin.
These patches are updated to be based on the latest changes in the
series upon which this is based (tb/commit-graph-use-odb), and contain
some other fixes that I picked up during the last round of review. For
convenience, I included a range-diff against 'v1' below.
Thanks as always for your review.
Taylor
Taylor Blau (3):
builtin/commit-graph.c: support '--split[=<strategy>]'
builtin/commit-graph.c: introduce '--input=<source>'
builtin/commit-graph.c: support '--input=none'
Documentation/git-commit-graph.txt | 50 ++++++++-----
builtin/commit-graph.c | 115 +++++++++++++++++++++++------
commit-graph.c | 28 ++++---
commit-graph.h | 10 ++-
t/t5318-commit-graph.sh | 4 +-
t/t5324-split-commit-graph.sh | 53 ++++++++++++-
6 files changed, 204 insertions(+), 56 deletions(-)
Range-diff against v1:
1: 470bbe3cef ! 1: 3e19d50148 builtin/commit-graph.c: support '--split[=<strategy>]'
@@ Commit message
With '--split', the commit-graph machinery writes new commits in another
incremental commit-graph which is part of the existing chain, and
optionally decides to condense the chain into a single commit-graph.
- This is done to ensure that the aysmptotic behavior of looking up a
+ This is done to ensure that the asymptotic behavior of looking up a
commit in an incremental chain is dominated by the number of
incrementals in that chain. It can be controlled by the '--max-commits'
and '--size-multiple' options.
@@ Documentation/git-commit-graph.txt: or `--stdin-packs`.)
+conducted, and the remaining options are ignored. Conversely, if
+`--split=no-merge` is specified, a merge is never performed, and the
+remaining options are ignored. A bare `--split` defers to the remaining
-+options. (Note that merging a chain of commit graphs replaces the
-+existing chain with a length-1 chain where the first and only
-+incremental holds the entire graph).
++options.
+
* If `--size-multiple=<X>` is not specified, let `X` equal 2. If the new
tip file would have `N` commits and the previous tip has `M` commits and
@@ builtin/commit-graph.c: static int graph_verify(int argc, const char **argv)
+ enum commit_graph_split_flags *flags = opt->value;
+
+ opts.split = 1;
-+ if (!arg)
++ if (!arg) {
++ *flags = COMMIT_GRAPH_SPLIT_MERGE_AUTO;
+ return 0;
++ }
+
+ if (!strcmp(arg, "merge-all"))
+ *flags = COMMIT_GRAPH_SPLIT_MERGE_REQUIRED;
@@ builtin/commit-graph.c: static int graph_write(int argc, const char **argv)
## commit-graph.c ##
@@ commit-graph.c: static void split_graph_merge_strategy(struct write_commit_graph_context *ctx)
+
+ int max_commits = 0;
+ int size_mult = 2;
++ enum commit_graph_split_flags flags = COMMIT_GRAPH_SPLIT_MERGE_AUTO;
+
+ if (ctx->split_opts) {
+ max_commits = ctx->split_opts->max_commits;
+
+ if (ctx->split_opts->size_multiple)
+ size_mult = ctx->split_opts->size_multiple;
++
++ flags = ctx->split_opts->flags;
+ }
+
+ g = ctx->r->objects->commit_graph;
num_commits = ctx->commits.nr;
ctx->num_commit_graphs_after = ctx->num_commit_graphs_before + 1;
@@ commit-graph.c: static void split_graph_merge_strategy(struct write_commit_graph
- (max_commits && num_commits > max_commits))) {
- if (g->odb != ctx->odb)
- break;
-+ if (ctx->split_opts->flags != COMMIT_GRAPH_SPLIT_MERGE_PROHIBITED) {
++ if (flags != COMMIT_GRAPH_SPLIT_MERGE_PROHIBITED) {
+ while (g && (g->num_commits <= size_mult * num_commits ||
+ (max_commits && num_commits > max_commits) ||
-+ (ctx->split_opts->flags == COMMIT_GRAPH_SPLIT_MERGE_REQUIRED))) {
++ (flags == COMMIT_GRAPH_SPLIT_MERGE_REQUIRED))) {
+ if (g->odb != ctx->odb)
+ break;
@@ commit-graph.c: int write_commit_graph(struct object_directory *odb,
}
- if (!ctx->commits.nr)
-+ if (!ctx->commits.nr && (!ctx->split || ctx->split_opts->flags != COMMIT_GRAPH_SPLIT_MERGE_REQUIRED))
++ if (!ctx->commits.nr && (!ctx->split_opts || ctx->split_opts->flags != COMMIT_GRAPH_SPLIT_MERGE_REQUIRED))
goto cleanup;
if (ctx->split) {
@@ commit-graph.h: enum commit_graph_write_flags {
};
+enum commit_graph_split_flags {
-+ COMMIT_GRAPH_SPLIT_UNSPECIFIED = 0,
++ COMMIT_GRAPH_SPLIT_MERGE_AUTO = 0,
+ COMMIT_GRAPH_SPLIT_MERGE_REQUIRED = 1,
+ COMMIT_GRAPH_SPLIT_MERGE_PROHIBITED = 2
+};
2: 1b585fe4e7 ! 2: 1589bc1d69 builtin/commit-graph.c: introduce '--input=<source>'
@@ Documentation/git-commit-graph.txt: $ git commit-graph write
## builtin/commit-graph.c ##
@@
+
static char const * const builtin_commit_graph_usage[] = {
N_("git commit-graph verify [--object-dir <objdir>] [--shallow] [--[no-]progress]"),
- N_("git commit-graph write [--object-dir <objdir>] [--append] "
+- N_("git commit-graph write [--object-dir <objdir>] [--append] "
- "[--split[=<strategy>]] [--reachable|--stdin-packs|--stdin-commits] "
-+ "[--split[=<strategy>]] [--input=<reachable|stdin-packs|stdin-commits>] "
++ N_("git commit-graph write [--object-dir <objdir>] "
++ "[--split[=<strategy>]] "
++ "[--input=<reachable|stdin-packs|stdin-commits|append>] "
"[--[no-]progress] <split options>"),
NULL
};
@@ builtin/commit-graph.c: static const char * const builtin_commit_graph_verify_usage[] = {
+ };
static const char * const builtin_commit_graph_write_usage[] = {
- N_("git commit-graph write [--object-dir <objdir>] [--append] "
+- N_("git commit-graph write [--object-dir <objdir>] [--append] "
- "[--split[=<strategy>]] [--reachable|--stdin-packs|--stdin-commits] "
-+ "[--split[=<strategy>]] [--input=<reachable|stdin-packs|stdin-commits>] "
++ N_("git commit-graph write [--object-dir <objdir>] "
++ "[--split[=<strategy>]] "
++ "[--input=<reachable|stdin-packs|stdin-commits|append>] "
"[--[no-]progress] <split options>"),
NULL
};
@@ builtin/commit-graph.c: static int graph_write(int argc, const char **argv)
}
## t/t5318-commit-graph.sh ##
-@@ t/t5318-commit-graph.sh: test_expect_success 'write graph with no packs' '
- test_path_is_missing $objdir/info/commit-graph
- '
-
--test_expect_success 'exit with correct error on bad input to --stdin-packs' '
-+test_expect_success 'exit with correct error on bad input to --input=stdin-packs' '
- cd "$TRASH_DIRECTORY/full" &&
- echo doesnotexist >in &&
-- test_expect_code 1 git commit-graph write --stdin-packs <in 2>stderr &&
-+ test_expect_code 1 git commit-graph write --input=stdin-packs <in 2>stderr &&
- test_i18ngrep "error adding pack" stderr
- '
-
-@@ t/t5318-commit-graph.sh: test_expect_success 'create commits and repack' '
- git repack
- '
-
--test_expect_success 'exit with correct error on bad input to --stdin-commits' '
-+test_expect_success 'exit with correct error on bad input to --input=stdin-commits' '
- cd "$TRASH_DIRECTORY/full" &&
-- echo HEAD | test_expect_code 1 git commit-graph write --stdin-commits 2>stderr &&
-+ echo HEAD | test_expect_code 1 git commit-graph write --input=stdin-commits 2>stderr &&
- test_i18ngrep "invalid commit object id" stderr &&
- # valid tree OID, but not a commit OID
-- git rev-parse HEAD^{tree} | test_expect_code 1 git commit-graph write --stdin-commits 2>stderr &&
-+ git rev-parse HEAD^{tree} | test_expect_code 1 git commit-graph write --input=stdin-commits 2>stderr &&
- test_i18ngrep "invalid commit object id" stderr
- '
-
@@ t/t5318-commit-graph.sh: graph_git_behavior 'cleared graph, commit 8 vs merge 2' full commits/8 merge/2
test_expect_success 'build graph from latest pack with closure' '
@@ t/t5318-commit-graph.sh: test_expect_success 'build graph from commits with clos
test_path_is_file $objdir/info/commit-graph &&
graph_read_expect "6"
'
-@@ t/t5318-commit-graph.sh: graph_git_behavior 'graph from commits, commit 8 vs merge 2' full commits/8 merg
-
- test_expect_success 'build graph from commits with append' '
- cd "$TRASH_DIRECTORY/full" &&
-- git rev-parse merge/3 | git commit-graph write --stdin-commits --append &&
-+ git rev-parse merge/3 | git commit-graph write --input=stdin-commits --input=append &&
- test_path_is_file $objdir/info/commit-graph &&
- graph_read_expect "10" "extra_edges"
- '
-@@ t/t5318-commit-graph.sh: graph_git_behavior 'append graph, commit 8 vs merge 2' full commits/8 merge/2
-
- test_expect_success 'build graph using --reachable' '
- cd "$TRASH_DIRECTORY/full" &&
-- git commit-graph write --reachable &&
-+ git commit-graph write --input=reachable &&
- test_path_is_file $objdir/info/commit-graph &&
- graph_read_expect "11" "extra_edges"
- '
-@@ t/t5318-commit-graph.sh: test_expect_success 'perform fast-forward merge in full repo' '
- test_expect_success 'check that gc computes commit-graph' '
- cd "$TRASH_DIRECTORY/full" &&
- git commit --allow-empty -m "blank" &&
-- git commit-graph write --reachable &&
-+ git commit-graph write --input=reachable &&
- cp $objdir/info/commit-graph commit-graph-before-gc &&
- git reset --hard HEAD~1 &&
- git config gc.writeCommitGraph true &&
- git gc &&
- cp $objdir/info/commit-graph commit-graph-after-gc &&
- ! test_cmp_bin commit-graph-before-gc commit-graph-after-gc &&
-- git commit-graph write --reachable &&
-+ git commit-graph write --input=reachable &&
- test_cmp_bin commit-graph-after-gc $objdir/info/commit-graph
- '
-
-@@ t/t5318-commit-graph.sh: test_expect_success 'replace-objects invalidates commit-graph' '
- git clone full replace &&
- (
- cd replace &&
-- git commit-graph write --reachable &&
-+ git commit-graph write --input=reachable &&
- test_path_is_file .git/objects/info/commit-graph &&
- git replace HEAD~1 HEAD~2 &&
- git -c core.commitGraph=false log >expect &&
- git -c core.commitGraph=true log >actual &&
- test_cmp expect actual &&
-- git commit-graph write --reachable &&
-+ git commit-graph write --input=reachable &&
- git -c core.commitGraph=false --no-replace-objects log >expect &&
- git -c core.commitGraph=true --no-replace-objects log >actual &&
- test_cmp expect actual &&
- rm -rf .git/objects/info/commit-graph &&
-- git commit-graph write --reachable &&
-+ git commit-graph write --input=reachable &&
- test_path_is_file .git/objects/info/commit-graph
- )
- '
-@@ t/t5318-commit-graph.sh: test_expect_success 'commit grafts invalidate commit-graph' '
- git clone full graft &&
- (
- cd graft &&
-- git commit-graph write --reachable &&
-+ git commit-graph write --input=reachable &&
- test_path_is_file .git/objects/info/commit-graph &&
- H1=$(git rev-parse --verify HEAD~1) &&
- H3=$(git rev-parse --verify HEAD~3) &&
-@@ t/t5318-commit-graph.sh: test_expect_success 'commit grafts invalidate commit-graph' '
- git -c core.commitGraph=false log >expect &&
- git -c core.commitGraph=true log >actual &&
- test_cmp expect actual &&
-- git commit-graph write --reachable &&
-+ git commit-graph write --input=reachable &&
- git -c core.commitGraph=false --no-replace-objects log >expect &&
- git -c core.commitGraph=true --no-replace-objects log >actual &&
- test_cmp expect actual &&
- rm -rf .git/objects/info/commit-graph &&
-- git commit-graph write --reachable &&
-+ git commit-graph write --input=reachable &&
- test_path_is_missing .git/objects/info/commit-graph
- )
- '
-@@ t/t5318-commit-graph.sh: test_expect_success 'replace-objects invalidates commit-graph' '
- git clone --depth 2 "file://$TRASH_DIRECTORY/full" shallow &&
- (
- cd shallow &&
-- git commit-graph write --reachable &&
-+ git commit-graph write --input=reachable &&
- test_path_is_missing .git/objects/info/commit-graph &&
- git fetch origin --unshallow &&
-- git commit-graph write --reachable &&
-+ git commit-graph write --input=reachable &&
- test_path_is_file .git/objects/info/commit-graph
- )
- '
-@@ t/t5318-commit-graph.sh: test_expect_success 'replace-objects invalidates commit-graph' '
-
- test_expect_success 'git commit-graph verify' '
- cd "$TRASH_DIRECTORY/full" &&
-- git rev-parse commits/8 | git commit-graph write --stdin-commits &&
-+ git rev-parse commits/8 | git commit-graph write --input=stdin-commits &&
- git commit-graph verify >output
- '
-
-@@ t/t5318-commit-graph.sh: test_expect_success 'setup non-the_repository tests' '
- test_commit -C repo two &&
- git -C repo config core.commitGraph true &&
- git -C repo rev-parse two | \
-- git -C repo commit-graph write --stdin-commits
-+ git -C repo commit-graph write --input=stdin-commits
- '
-
- test_expect_success 'parse_commit_in_graph works for non-the_repository' '
-@@ t/t5318-commit-graph.sh: test_expect_success 'corrupt commit-graph write (broken parent)' '
- EOF
- broken="$(git hash-object -w -t commit --literally broken)" &&
- git commit-tree -p "$broken" -m "good commit" "$empty" >good &&
-- test_must_fail git commit-graph write --stdin-commits \
-+ test_must_fail git commit-graph write --input=stdin-commits \
- <good 2>test_err &&
- test_i18ngrep "unable to parse commit" test_err
- )
-@@ t/t5318-commit-graph.sh: test_expect_success 'corrupt commit-graph write (missing tree)' '
- EOF
- broken="$(git hash-object -w -t commit --literally broken)" &&
- git commit-tree -p "$broken" -m "good" "$tree" >good &&
-- test_must_fail git commit-graph write --stdin-commits \
-+ test_must_fail git commit-graph write --input=stdin-commits \
- <good 2>test_err &&
- test_i18ngrep "unable to parse commit" test_err
- )
## t/t5324-split-commit-graph.sh ##
@@ t/t5324-split-commit-graph.sh: test_expect_success 'create commits and write commit-graph' '
@@ t/t5324-split-commit-graph.sh: test_expect_success 'create commits and write com
test_path_is_file $infodir/commit-graph &&
graph_read_expect 3
'
-@@ t/t5324-split-commit-graph.sh: test_expect_success 'add more commits, and write a new base graph' '
- git reset --hard commits/4 &&
- git merge commits/6 &&
- git branch merge/2 &&
-- git commit-graph write --reachable &&
-+ git commit-graph write --input=reachable &&
- graph_read_expect 12
- '
-
-@@ t/t5324-split-commit-graph.sh: test_expect_success 'fork and fail to base a chain on a commit-graph file' '
- rm .git/objects/info/commit-graph &&
- echo "$(pwd)/../.git/objects" >.git/objects/info/alternates &&
- test_commit new-commit &&
-- git commit-graph write --reachable --split &&
-+ git commit-graph write --input=reachable --split &&
- test_path_is_file $graphdir/commit-graph-chain &&
- test_line_count = 1 $graphdir/commit-graph-chain &&
- verify_chain_files_exist $graphdir
-@@ t/t5324-split-commit-graph.sh: test_expect_success 'add three more commits, write a tip graph' '
- git merge commits/5 &&
- git merge merge/2 &&
- git branch merge/3 &&
-- git commit-graph write --reachable --split &&
-+ git commit-graph write --input=reachable --split &&
- test_path_is_missing $infodir/commit-graph &&
- test_path_is_file $graphdir/commit-graph-chain &&
- ls $graphdir/graph-*.graph >graph-files &&
-@@ t/t5324-split-commit-graph.sh: graph_git_behavior 'split commit-graph: merge 3 vs 2' merge/3 merge/2
- test_expect_success 'add one commit, write a tip graph' '
- test_commit 11 &&
- git branch commits/11 &&
-- git commit-graph write --reachable --split &&
-+ git commit-graph write --input=reachable --split &&
- test_path_is_missing $infodir/commit-graph &&
- test_path_is_file $graphdir/commit-graph-chain &&
- ls $graphdir/graph-*.graph >graph-files &&
-@@ t/t5324-split-commit-graph.sh: graph_git_behavior 'three-layer commit-graph: commit 11 vs 6' commits/11 commits
- test_expect_success 'add one commit, write a merged graph' '
- test_commit 12 &&
- git branch commits/12 &&
-- git commit-graph write --reachable --split &&
-+ git commit-graph write --input=reachable --split &&
- test_path_is_file $graphdir/commit-graph-chain &&
- test_line_count = 2 $graphdir/commit-graph-chain &&
- ls $graphdir/graph-*.graph >graph-files &&
-@@ t/t5324-split-commit-graph.sh: test_expect_success 'create fork and chain across alternate' '
- echo "$(pwd)/../.git/objects" >.git/objects/info/alternates &&
- test_commit 13 &&
- git branch commits/13 &&
-- git commit-graph write --reachable --split &&
-+ git commit-graph write --input=reachable --split &&
- test_path_is_file $graphdir/commit-graph-chain &&
- test_line_count = 3 $graphdir/commit-graph-chain &&
- ls $graphdir/graph-*.graph >graph-files &&
-@@ t/t5324-split-commit-graph.sh: test_expect_success 'create fork and chain across alternate' '
- git -c core.commitGraph=false rev-list HEAD >actual &&
- test_cmp expect actual &&
- test_commit 14 &&
-- git commit-graph write --reachable --split --object-dir=.git/objects/ &&
-+ git commit-graph write --input=reachable --split --object-dir=.git/objects/ &&
- test_line_count = 3 $graphdir/commit-graph-chain &&
- ls $graphdir/graph-*.graph >graph-files &&
- test_line_count = 1 graph-files
-@@ t/t5324-split-commit-graph.sh: test_expect_success 'test merge stragety constants' '
- git config core.commitGraph true &&
- test_line_count = 2 $graphdir/commit-graph-chain &&
- test_commit 14 &&
-- git commit-graph write --reachable --split --size-multiple=2 &&
-+ git commit-graph write --input=reachable --split --size-multiple=2 &&
- test_line_count = 3 $graphdir/commit-graph-chain
-
- ) &&
-@@ t/t5324-split-commit-graph.sh: test_expect_success 'test merge stragety constants' '
- git config core.commitGraph true &&
- test_line_count = 2 $graphdir/commit-graph-chain &&
- test_commit 14 &&
-- git commit-graph write --reachable --split --size-multiple=10 &&
-+ git commit-graph write --input=reachable --split --size-multiple=10 &&
- test_line_count = 1 $graphdir/commit-graph-chain &&
- ls $graphdir/graph-*.graph >graph-files &&
- test_line_count = 1 graph-files
-@@ t/t5324-split-commit-graph.sh: test_expect_success 'test merge stragety constants' '
- git config core.commitGraph true &&
- test_line_count = 2 $graphdir/commit-graph-chain &&
- test_commit 15 &&
-- git commit-graph write --reachable --split --size-multiple=10 --expire-time=1980-01-01 &&
-+ git commit-graph write --input=reachable --split --size-multiple=10 --expire-time=1980-01-01 &&
- test_line_count = 1 $graphdir/commit-graph-chain &&
- ls $graphdir/graph-*.graph >graph-files &&
- test_line_count = 3 graph-files
-@@ t/t5324-split-commit-graph.sh: test_expect_success 'test merge stragety constants' '
- test_line_count = 2 $graphdir/commit-graph-chain &&
- test_commit 16 &&
- test_commit 17 &&
-- git commit-graph write --reachable --split --max-commits=1 &&
-+ git commit-graph write --input=reachable --split --max-commits=1 &&
- test_line_count = 1 $graphdir/commit-graph-chain &&
- ls $graphdir/graph-*.graph >graph-files &&
- test_line_count = 1 graph-files
-@@ t/t5324-split-commit-graph.sh: test_expect_success 'remove commit-graph-chain file after flattening' '
- (
- cd flatten &&
- test_line_count = 2 $graphdir/commit-graph-chain &&
-- git commit-graph write --reachable &&
-+ git commit-graph write --input=reachable &&
- test_path_is_missing $graphdir/commit-graph-chain &&
- ls $graphdir >graph-files &&
- test_line_count = 0 graph-files
-@@ t/t5324-split-commit-graph.sh: test_expect_success 'verify across alternates' '
- echo "$altdir" >.git/objects/info/alternates &&
- git commit-graph verify --object-dir="$altdir/" &&
- test_commit extra &&
-- git commit-graph write --reachable --split &&
-+ git commit-graph write --input=reachable --split &&
- tip_file=$graphdir/graph-$(tail -n 1 $graphdir/commit-graph-chain).graph &&
- corrupt_file "$tip_file" 100 "\01" &&
- test_must_fail git commit-graph verify --shallow 2>test_err &&
-@@ t/t5324-split-commit-graph.sh: test_expect_success 'add octopus merge' '
- git reset --hard commits/10 &&
- git merge commits/3 commits/4 &&
- git branch merge/octopus &&
-- git commit-graph write --reachable --split &&
-+ git commit-graph write --input=reachable --split &&
- git commit-graph verify --progress 2>err &&
- test_line_count = 3 err &&
- test_i18ngrep ! warning err &&
-@@ t/t5324-split-commit-graph.sh: test_expect_success 'add octopus merge' '
- graph_git_behavior 'graph exists' merge/octopus commits/12
-
- test_expect_success 'split across alternate where alternate is not split' '
-- git commit-graph write --reachable &&
-+ git commit-graph write --input=reachable &&
- test_path_is_file .git/objects/info/commit-graph &&
- cp .git/objects/info/commit-graph . &&
- git clone --no-hardlinks . alt-split &&
-@@ t/t5324-split-commit-graph.sh: test_expect_success 'split across alternate where alternate is not split' '
- rm -f .git/objects/info/commit-graph &&
- echo "$(pwd)"/../.git/objects >.git/objects/info/alternates &&
- test_commit 18 &&
-- git commit-graph write --reachable --split &&
-+ git commit-graph write --input=reachable --split &&
- test_line_count = 1 $graphdir/commit-graph-chain
- ) &&
- test_cmp commit-graph .git/objects/info/commit-graph
-@@ t/t5324-split-commit-graph.sh: test_expect_success '--split=merge-all always merges incrementals' '
- git rev-list -3 HEAD~4 >a &&
- git rev-list -2 HEAD~2 >b &&
- git rev-list -2 HEAD >c &&
-- git commit-graph write --split=no-merge --stdin-commits <a &&
-- git commit-graph write --split=no-merge --stdin-commits <b &&
-+ git commit-graph write --split=no-merge --input=stdin-commits <a &&
-+ git commit-graph write --split=no-merge --input=stdin-commits <b &&
- test_line_count = 2 $graphdir/commit-graph-chain &&
-- git commit-graph write --split=merge-all --stdin-commits <c &&
-+ git commit-graph write --split=merge-all --input=stdin-commits <c &&
- test_line_count = 1 $graphdir/commit-graph-chain
- '
-
-@@ t/t5324-split-commit-graph.sh: test_expect_success '--split=no-merge always writes an incremental' '
- git reset --hard commits/2 &&
- git rev-list HEAD~1 >a &&
- git rev-list HEAD >b &&
-- git commit-graph write --split --stdin-commits <a &&
-- git commit-graph write --split=no-merge --stdin-commits <b &&
-+ git commit-graph write --split --input=stdin-commits <a &&
-+ git commit-graph write --split=no-merge --input=stdin-commits <b &&
- test_line_count = 2 $graphdir/commit-graph-chain
- '
-
3: a5d3367788 ! 3: 4c6425f0da builtin/commit-graph.c: support '--input=none'
@@ Metadata
## Commit message ##
builtin/commit-graph.c: support '--input=none'
- In the previous commit, we introduced '--[no-]merge', and alluded to the
- fact that '--merge' would be useful for callers who wish to always
- trigger a merge of an incremental chain.
+ In the previous commit, we introduced '--split=<no-merge|merge-all>',
+ and alluded to the fact that '--split=merge-all' would be useful for
+ callers who wish to always trigger a merge of an incremental chain.
There is a problem with the above approach, which is that there is no
way to specify to the commit-graph builtin that a caller only wants to
@@ Documentation/git-commit-graph.txt: COMMANDS
'write'::
-Write a commit-graph file based on the commits found in packfiles.
-+Write a commit-graph file based on the commits specified:
-+* With the `--input=stdin-packs` option, generate the new commit graph
-+by walking objects only in the specified pack-indexes. (Cannot be
-+combined with `--input=stdin-commits` or `--input=reachable`.)
++Write a commit-graph file based on the specified sources of input:
+
--With the `--input=stdin-packs` option, generate the new commit graph by
--walking objects only in the specified pack-indexes. (Cannot be combined
--with `--input=stdin-commits` or `--input=reachable`.)
--+
--With the `--input=stdin-commits` option, generate the new commit graph
-+* With the `--input=stdin-commits` option, generate the new commit graph
- by walking commits starting at the commits specified in stdin as a list
- of OIDs in hex, one OID per line. (Cannot be combined with
- `--input=stdin-packs` or `--input=reachable`.)
- +
--With the `--input=reachable` option, generate the new commit graph by
-+* With the `--input=reachable` option, generate the new commit graph by
- walking commits starting at all refs. (Cannot be combined with
- `--input=stdin-commits` or `--input=stdin-packs`.)
- +
--With the `--input=append` option, include all commits that are present
-+* With the `--input=append` option, include all commits that are present
+ With the `--input=stdin-packs` option, generate the new commit graph by
+ walking objects only in the specified pack-indexes. (Cannot be combined
+@@ Documentation/git-commit-graph.txt: walking commits starting at all refs. (Cannot be combined with
+ With the `--input=append` option, include all commits that are present
in the existing commit-graph file.
+
-+* With the `--input=none` option, behave as if `input=append` were
++With the `--input=none` option, behave as if `--input=append` were
+given, but do not walk other packs to find additional commits.
+
-+If none of the above options are given, then commits found in
-+packfiles are specified.
++If none of the above options are given, then generate the new
++commit-graph by walking over all pack-indexes.
++
With the `--split[=<strategy>]` option, write the commit-graph as a
chain of multiple commit-graph files stored in
`<dir>/info/commit-graphs`. Commit-graph layers are merged based on the
## builtin/commit-graph.c ##
-@@
- static char const * const builtin_commit_graph_usage[] = {
+@@ builtin/commit-graph.c: static char const * const builtin_commit_graph_usage[] = {
N_("git commit-graph verify [--object-dir <objdir>] [--shallow] [--[no-]progress]"),
- N_("git commit-graph write [--object-dir <objdir>] [--append] "
-- "[--split[=<strategy>]] [--input=<reachable|stdin-packs|stdin-commits>] "
-+ "[--split[=<strategy>]] "
-+ "[--input=<reachable|stdin-packs|stdin-commits|none>] "
+ N_("git commit-graph write [--object-dir <objdir>] "
+ "[--split[=<strategy>]] "
+- "[--input=<reachable|stdin-packs|stdin-commits|append>] "
++ "[--input=<reachable|stdin-packs|stdin-commits|append|none>] "
"[--[no-]progress] <split options>"),
NULL
};
@@ builtin/commit-graph.c: static const char * const builtin_commit_graph_verify_usage[] = {
-
static const char * const builtin_commit_graph_write_usage[] = {
- N_("git commit-graph write [--object-dir <objdir>] [--append] "
-- "[--split[=<strategy>]] [--input=<reachable|stdin-packs|stdin-commits>] "
-+ "[--split[=<strategy>]] "
-+ "[--input=<reachable|stdin-packs|stdin-commits|none>] "
+ N_("git commit-graph write [--object-dir <objdir>] "
+ "[--split[=<strategy>]] "
+- "[--input=<reachable|stdin-packs|stdin-commits|append>] "
++ "[--input=<reachable|stdin-packs|stdin-commits|append|none>] "
"[--[no-]progress] <split options>"),
NULL
};
--
2.25.0.119.gaa12b7378b
next prev parent reply other threads:[~2020-02-05 0:28 UTC|newest]
Thread overview: 58+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-01-31 0:28 [PATCH 0/3] builtin/commit-graph.c: new split/merge options Taylor Blau
2020-01-31 0:28 ` [PATCH 1/3] builtin/commit-graph.c: support '--split[=<strategy>]' Taylor Blau
2020-01-31 14:19 ` Derrick Stolee
2020-02-04 3:47 ` Taylor Blau
2020-01-31 19:27 ` Martin Ågren
2020-02-04 4:06 ` Taylor Blau
2020-02-06 19:15 ` Martin Ågren
2020-02-09 23:27 ` Taylor Blau
2020-01-31 23:34 ` SZEDER Gábor
2020-02-01 21:25 ` Johannes Schindelin
2020-02-03 10:47 ` SZEDER Gábor
2020-02-03 11:11 ` Jeff King
2020-02-04 3:58 ` Taylor Blau
2020-02-04 14:14 ` Jeff King
2020-02-04 3:59 ` Taylor Blau
2020-02-04 3:59 ` Taylor Blau
2020-01-31 0:28 ` [PATCH 2/3] builtin/commit-graph.c: introduce '--input=<source>' Taylor Blau
2020-01-31 14:40 ` Derrick Stolee
2020-02-04 4:21 ` Taylor Blau
2020-01-31 19:34 ` Martin Ågren
2020-02-04 4:51 ` Taylor Blau
2020-02-13 11:33 ` SZEDER Gábor
2020-02-13 11:48 ` SZEDER Gábor
2020-02-13 17:56 ` Taylor Blau
2020-01-31 0:28 ` [PATCH 3/3] builtin/commit-graph.c: support '--input=none' Taylor Blau
2020-01-31 14:40 ` Derrick Stolee
2020-01-31 19:45 ` Martin Ågren
2020-02-04 5:01 ` Taylor Blau
2020-01-31 0:32 ` [PATCH 0/3] builtin/commit-graph.c: new split/merge options Taylor Blau
2020-01-31 13:26 ` Derrick Stolee
2020-01-31 14:41 ` Derrick Stolee
2020-02-04 23:44 ` Junio C Hamano
2020-02-05 0:30 ` Taylor Blau
2020-02-05 0:28 ` Taylor Blau [this message]
2020-02-05 0:28 ` [PATCH v2 1/3] builtin/commit-graph.c: support '--split[=<strategy>]' Taylor Blau
2020-02-06 19:41 ` Martin Ågren
2020-02-07 15:48 ` Derrick Stolee
2020-02-09 23:32 ` Taylor Blau
2020-02-12 6:03 ` Martin Ågren
2020-02-12 20:50 ` Taylor Blau
2020-02-09 23:30 ` Taylor Blau
2020-02-05 0:28 ` [PATCH v2 2/3] builtin/commit-graph.c: introduce '--input=<source>' Taylor Blau
2020-02-05 0:28 ` [PATCH v2 3/3] builtin/commit-graph.c: support '--input=none' Taylor Blau
2020-02-06 19:50 ` Martin Ågren
2020-02-09 23:32 ` Taylor Blau
2020-02-05 20:07 ` [PATCH v2 0/3] builtin/commit-graph.c: new split/merge options Junio C Hamano
2020-02-12 5:47 ` [PATCH v3 " Taylor Blau
2020-02-12 5:47 ` [PATCH v3 1/3] builtin/commit-graph.c: support '--split[=<strategy>]' Taylor Blau
2020-02-12 5:47 ` [PATCH v3 2/3] builtin/commit-graph.c: introduce '--input=<source>' Taylor Blau
2020-02-12 5:47 ` [PATCH v3 3/3] builtin/commit-graph.c: support '--input=none' Taylor Blau
2020-02-13 11:39 ` SZEDER Gábor
2020-02-13 12:31 ` SZEDER Gábor
2020-02-13 16:08 ` Junio C Hamano
2020-02-13 17:58 ` Taylor Blau
2020-02-13 17:56 ` Taylor Blau
2020-02-12 18:19 ` [PATCH v3 0/3] builtin/commit-graph.c: new split/merge options Junio C Hamano
2020-02-13 17:41 ` Taylor Blau
2020-02-17 18:24 ` Martin Ågren
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=cover.1580862307.git.me@ttaylorr.com \
--to=me@ttaylorr.com \
--cc=dstolee@microsoft.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=martin.agren@gmail.com \
--cc=peff@peff.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.