This series is useless until now because no one would use read-tree to checkout. At least with this, you can really use/test the series. Porcelain design was originally "if you have .git/info/sparse, porcelains will use it, if you don't like that, remove .git/info/sparse" while plumblings have an option to enable/disable this feature. And I still like that behavior. How about we enable sparse checkout by default for porcelains and make a config option to disable it? Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> --- builtin-checkout.c | 4 ++++ builtin-merge.c | 5 ++++- git-pull.sh | 6 +++++- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/builtin-checkout.c b/builtin-checkout.c index 446cac7..cec21ab 100644 --- a/builtin-checkout.c +++ b/builtin-checkout.c @@ -30,6 +30,7 @@ struct checkout_opts { int force; int writeout_stage; int writeout_error; + int apply_sparse; const char *new_branch; int new_branch_log; @@ -402,6 +403,7 @@ static int merge_working_tree(struct checkout_opts *opts, topts.dir = xcalloc(1, sizeof(*topts.dir)); topts.dir->flags |= DIR_SHOW_IGNORED; topts.dir->exclude_per_dir = ".gitignore"; + topts.apply_sparse = opts->apply_sparse; tree = parse_tree_indirect(old->commit->object.sha1); init_tree_desc(&trees[0], tree->buffer, tree->size); tree = parse_tree_indirect(new->commit->object.sha1); @@ -594,6 +596,8 @@ int cmd_checkout(int argc, const char **argv, const char *prefix) OPT_BOOLEAN('m', "merge", &opts.merge, "merge"), OPT_STRING(0, "conflict", &conflict_style, "style", "conflict style (merge or diff3)"), + OPT_SET_INT(0, "sparse", &opts.apply_sparse, + "apply sparse checkout filter", 1), OPT_END(), }; int has_dash_dash; diff --git a/builtin-merge.c b/builtin-merge.c index 0b12fb3..c14b91d 100644 --- a/builtin-merge.c +++ b/builtin-merge.c @@ -43,7 +43,7 @@ static const char * const builtin_merge_usage[] = { static int show_diffstat = 1, option_log, squash; static int option_commit = 1, allow_fast_forward = 1; -static int allow_trivial = 1, have_message; +static int allow_trivial = 1, have_message, apply_sparse; static struct strbuf merge_msg; static struct commit_list *remoteheads; static unsigned char head[20], stash[20]; @@ -172,6 +172,7 @@ static struct option builtin_merge_options[] = { OPT_CALLBACK('m', "message", &merge_msg, "message", "message to be used for the merge commit (if any)", option_parse_message), + OPT_SET_INT(0, "sparse", &apply_sparse, "apply sparse checkout filter", 1), OPT__VERBOSITY(&verbosity), OPT_END() }; @@ -494,6 +495,7 @@ static int read_tree_trivial(unsigned char *common, unsigned char *head, opts.verbose_update = 1; opts.trivial_merges_only = 1; opts.merge = 1; + opts.apply_sparse = apply_sparse; trees[nr_trees] = parse_tree_indirect(common); if (!trees[nr_trees++]) return -1; @@ -646,6 +648,7 @@ static int checkout_fast_forward(unsigned char *head, unsigned char *remote) opts.verbose_update = 1; opts.merge = 1; opts.fn = twoway_merge; + opts.apply_sparse = apply_sparse; trees[nr_trees] = parse_tree_indirect(head); if (!trees[nr_trees++]) diff --git a/git-pull.sh b/git-pull.sh index 0f24182..ba583bf 100755 --- a/git-pull.sh +++ b/git-pull.sh @@ -20,6 +20,7 @@ strategy_args= diffstat= no_commit= squash= no_ff= log_arg= verbosity= curr_branch=$(git symbolic-ref -q HEAD) curr_branch_short=$(echo "$curr_branch" | sed "s|refs/heads/||") rebase=$(git config --bool branch.$curr_branch_short.rebase) +sparse= while : do case "$1" in @@ -65,6 +66,9 @@ do --no-r|--no-re|--no-reb|--no-reba|--no-rebas|--no-rebase) rebase=false ;; + --sparse) + sparse=--sparse + ;; -h|--h|--he|--hel|--help) usage ;; @@ -201,5 +205,5 @@ merge_name=$(git fmt-merge-msg $log_arg <"$GIT_DIR/FETCH_HEAD") || exit test true = "$rebase" && exec git-rebase $diffstat $strategy_args --onto $merge_head \ ${oldremoteref:-$merge_head} -exec git-merge $diffstat $no_commit $squash $no_ff $log_arg $strategy_args \ +exec git-merge $sparse $diffstat $no_commit $squash $no_ff $log_arg $strategy_args \ "$merge_name" HEAD $merge_head $verbosity -- 1.6.3.GIT -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html