mirror of
https://github.com/git/git
synced 2024-10-30 14:03:28 +00:00
sparse-checkout: use new update_sparsity() function
Remove the equivalent of 'git read-tree -mu HEAD' in the sparse-checkout codepaths for setting the SKIP_WORKTREE bits and instead use the new update_sparsity() function. Note that when an issue is hit, the error message splits 'error' and 'Cannot update sparse checkout' on separate lines. For now, we use two greps to find both pieces of the error message but subsequent commits will clean up the messages reported to the user. Reviewed-by: Derrick Stolee <dstolee@microsoft.com> Signed-off-by: Elijah Newren <newren@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
7af7a25853
commit
f56f31af03
2 changed files with 39 additions and 40 deletions
|
@ -94,49 +94,35 @@ static int sparse_checkout_list(int argc, const char **argv)
|
||||||
|
|
||||||
static int update_working_directory(struct pattern_list *pl)
|
static int update_working_directory(struct pattern_list *pl)
|
||||||
{
|
{
|
||||||
int result = 0;
|
enum update_sparsity_result result;
|
||||||
struct unpack_trees_options o;
|
struct unpack_trees_options o;
|
||||||
struct lock_file lock_file = LOCK_INIT;
|
struct lock_file lock_file = LOCK_INIT;
|
||||||
struct object_id oid;
|
|
||||||
struct tree *tree;
|
|
||||||
struct tree_desc t;
|
|
||||||
struct repository *r = the_repository;
|
struct repository *r = the_repository;
|
||||||
|
|
||||||
if (repo_read_index_unmerged(r))
|
|
||||||
die(_("you need to resolve your current index first"));
|
|
||||||
|
|
||||||
if (get_oid("HEAD", &oid))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
tree = parse_tree_indirect(&oid);
|
|
||||||
parse_tree(tree);
|
|
||||||
init_tree_desc(&t, tree->buffer, tree->size);
|
|
||||||
|
|
||||||
memset(&o, 0, sizeof(o));
|
memset(&o, 0, sizeof(o));
|
||||||
o.verbose_update = isatty(2);
|
o.verbose_update = isatty(2);
|
||||||
o.merge = 1;
|
|
||||||
o.update = 1;
|
o.update = 1;
|
||||||
o.fn = oneway_merge;
|
|
||||||
o.head_idx = -1;
|
o.head_idx = -1;
|
||||||
o.src_index = r->index;
|
o.src_index = r->index;
|
||||||
o.dst_index = r->index;
|
o.dst_index = r->index;
|
||||||
o.skip_sparse_checkout = 0;
|
o.skip_sparse_checkout = 0;
|
||||||
o.pl = pl;
|
o.pl = pl;
|
||||||
|
|
||||||
resolve_undo_clear_index(r->index);
|
|
||||||
setup_work_tree();
|
setup_work_tree();
|
||||||
|
|
||||||
cache_tree_free(&r->index->cache_tree);
|
|
||||||
|
|
||||||
repo_hold_locked_index(r, &lock_file, LOCK_DIE_ON_ERROR);
|
repo_hold_locked_index(r, &lock_file, LOCK_DIE_ON_ERROR);
|
||||||
|
|
||||||
core_apply_sparse_checkout = 1;
|
result = update_sparsity(&o);
|
||||||
result = unpack_trees(1, &t, &o);
|
|
||||||
|
|
||||||
if (!result) {
|
if (result == UPDATE_SPARSITY_WARNINGS)
|
||||||
prime_cache_tree(r, r->index, tree);
|
/*
|
||||||
|
* We don't do any special handling of warnings from untracked
|
||||||
|
* files in the way or dirty entries that can't be removed.
|
||||||
|
*/
|
||||||
|
result = UPDATE_SPARSITY_SUCCESS;
|
||||||
|
if (result == UPDATE_SPARSITY_SUCCESS)
|
||||||
write_locked_index(r->index, &lock_file, COMMIT_LOCK);
|
write_locked_index(r->index, &lock_file, COMMIT_LOCK);
|
||||||
} else
|
else
|
||||||
rollback_lock_file(&lock_file);
|
rollback_lock_file(&lock_file);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
@ -303,8 +289,6 @@ static int sparse_checkout_init(int argc, const char **argv)
|
||||||
};
|
};
|
||||||
|
|
||||||
repo_read_index(the_repository);
|
repo_read_index(the_repository);
|
||||||
require_clean_work_tree(the_repository,
|
|
||||||
N_("initialize sparse-checkout"), NULL, 1, 0);
|
|
||||||
|
|
||||||
argc = parse_options(argc, argv, NULL,
|
argc = parse_options(argc, argv, NULL,
|
||||||
builtin_sparse_checkout_init_options,
|
builtin_sparse_checkout_init_options,
|
||||||
|
@ -559,8 +543,6 @@ static int sparse_checkout_set(int argc, const char **argv, const char *prefix,
|
||||||
};
|
};
|
||||||
|
|
||||||
repo_read_index(the_repository);
|
repo_read_index(the_repository);
|
||||||
require_clean_work_tree(the_repository,
|
|
||||||
N_("set sparse-checkout patterns"), NULL, 1, 0);
|
|
||||||
|
|
||||||
argc = parse_options(argc, argv, prefix,
|
argc = parse_options(argc, argv, prefix,
|
||||||
builtin_sparse_checkout_set_options,
|
builtin_sparse_checkout_set_options,
|
||||||
|
@ -576,8 +558,6 @@ static int sparse_checkout_disable(int argc, const char **argv)
|
||||||
struct strbuf match_all = STRBUF_INIT;
|
struct strbuf match_all = STRBUF_INIT;
|
||||||
|
|
||||||
repo_read_index(the_repository);
|
repo_read_index(the_repository);
|
||||||
require_clean_work_tree(the_repository,
|
|
||||||
N_("disable sparse-checkout"), NULL, 1, 0);
|
|
||||||
|
|
||||||
memset(&pl, 0, sizeof(pl));
|
memset(&pl, 0, sizeof(pl));
|
||||||
hashmap_init(&pl.recursive_hashmap, pl_hashmap_cmp, NULL, 0);
|
hashmap_init(&pl.recursive_hashmap, pl_hashmap_cmp, NULL, 0);
|
||||||
|
|
|
@ -277,16 +277,23 @@ test_expect_success 'cone mode: add parent path' '
|
||||||
check_files repo a deep folder1
|
check_files repo a deep folder1
|
||||||
'
|
'
|
||||||
|
|
||||||
test_expect_success 'revert to old sparse-checkout on bad update' '
|
test_expect_success 'not-up-to-date does not block rest of sparsification' '
|
||||||
test_when_finished git -C repo sparse-checkout disable &&
|
test_when_finished git -C repo sparse-checkout disable &&
|
||||||
test_when_finished git -C repo reset --hard &&
|
test_when_finished git -C repo reset --hard &&
|
||||||
git -C repo sparse-checkout set deep &&
|
git -C repo sparse-checkout set deep &&
|
||||||
|
|
||||||
echo update >repo/deep/deeper2/a &&
|
echo update >repo/deep/deeper2/a &&
|
||||||
cp repo/.git/info/sparse-checkout expect &&
|
cp repo/.git/info/sparse-checkout expect &&
|
||||||
test_must_fail git -C repo sparse-checkout set deep/deeper1 2>err &&
|
test_write_lines "!/deep/*/" "/deep/deeper1/" >>expect &&
|
||||||
test_i18ngrep "cannot set sparse-checkout patterns" err &&
|
|
||||||
test_cmp repo/.git/info/sparse-checkout expect &&
|
git -C repo sparse-checkout set deep/deeper1 2>err &&
|
||||||
check_files repo/deep a deeper1 deeper2
|
|
||||||
|
test_i18ngrep "Cannot update sparse checkout" err &&
|
||||||
|
test_cmp expect repo/.git/info/sparse-checkout &&
|
||||||
|
check_files repo/deep a deeper1 deeper2 &&
|
||||||
|
check_files repo/deep/deeper1 a deepest &&
|
||||||
|
check_files repo/deep/deeper1/deepest a &&
|
||||||
|
check_files repo/deep/deeper2 a
|
||||||
'
|
'
|
||||||
|
|
||||||
test_expect_success 'revert to old sparse-checkout on empty update' '
|
test_expect_success 'revert to old sparse-checkout on empty update' '
|
||||||
|
@ -316,16 +323,28 @@ test_expect_success '.gitignore should not warn about cone mode' '
|
||||||
test_i18ngrep ! "disabling cone patterns" err
|
test_i18ngrep ! "disabling cone patterns" err
|
||||||
'
|
'
|
||||||
|
|
||||||
test_expect_success 'sparse-checkout (init|set|disable) fails with dirty status' '
|
test_expect_success 'sparse-checkout (init|set|disable) warns with dirty status' '
|
||||||
git clone repo dirty &&
|
git clone repo dirty &&
|
||||||
echo dirty >dirty/folder1/a &&
|
echo dirty >dirty/folder1/a &&
|
||||||
test_must_fail git -C dirty sparse-checkout init &&
|
|
||||||
test_must_fail git -C dirty sparse-checkout set /folder2/* /deep/deeper1/* &&
|
git -C dirty sparse-checkout init 2>err &&
|
||||||
test_must_fail git -C dirty sparse-checkout disable &&
|
test_i18ngrep "error" err &&
|
||||||
|
test_i18ngrep "Cannot update sparse checkout" err &&
|
||||||
|
|
||||||
|
git -C dirty sparse-checkout set /folder2/* /deep/deeper1/* 2>err &&
|
||||||
|
test_i18ngrep "error" err &&
|
||||||
|
test_i18ngrep "Cannot update sparse checkout" err &&
|
||||||
|
test_path_is_file dirty/folder1/a &&
|
||||||
|
|
||||||
|
git -C dirty sparse-checkout disable 2>err &&
|
||||||
|
test_must_be_empty err &&
|
||||||
|
|
||||||
git -C dirty reset --hard &&
|
git -C dirty reset --hard &&
|
||||||
git -C dirty sparse-checkout init &&
|
git -C dirty sparse-checkout init &&
|
||||||
git -C dirty sparse-checkout set /folder2/* /deep/deeper1/* &&
|
git -C dirty sparse-checkout set /folder2/* /deep/deeper1/* &&
|
||||||
git -C dirty sparse-checkout disable
|
test_path_is_missing dirty/folder1/a &&
|
||||||
|
git -C dirty sparse-checkout disable &&
|
||||||
|
test_path_is_file dirty/folder1/a
|
||||||
'
|
'
|
||||||
|
|
||||||
test_expect_success 'cone mode: set with core.ignoreCase=true' '
|
test_expect_success 'cone mode: set with core.ignoreCase=true' '
|
||||||
|
|
Loading…
Reference in a new issue