Imported Upstream version 2.27.0
[platform/upstream/git.git] / builtin / sparse-checkout.c
index 740da4b..95d0882 100644 (file)
@@ -18,7 +18,7 @@
 static const char *empty_base = "";
 
 static char const * const builtin_sparse_checkout_usage[] = {
-       N_("git sparse-checkout (init|list|set|add|disable) <options>"),
+       N_("git sparse-checkout (init|list|set|add|reapply|disable) <options>"),
        NULL
 };
 
@@ -94,50 +94,37 @@ static int sparse_checkout_list(int argc, const char **argv)
 
 static int update_working_directory(struct pattern_list *pl)
 {
-       int result = 0;
+       enum update_sparsity_result result;
        struct unpack_trees_options o;
        struct lock_file lock_file = LOCK_INIT;
-       struct object_id oid;
-       struct tree *tree;
-       struct tree_desc t;
        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));
        o.verbose_update = isatty(2);
-       o.merge = 1;
        o.update = 1;
-       o.fn = oneway_merge;
        o.head_idx = -1;
        o.src_index = r->index;
        o.dst_index = r->index;
        o.skip_sparse_checkout = 0;
        o.pl = pl;
-       o.keep_pattern_list = !!pl;
 
-       resolve_undo_clear_index(r->index);
        setup_work_tree();
 
-       cache_tree_free(&r->index->cache_tree);
-
        repo_hold_locked_index(r, &lock_file, LOCK_DIE_ON_ERROR);
 
-       core_apply_sparse_checkout = 1;
-       result = unpack_trees(1, &t, &o);
-
-       if (!result) {
-               prime_cache_tree(r, r->index, tree);
+       setup_unpack_trees_porcelain(&o, "sparse-checkout");
+       result = update_sparsity(&o);
+       clear_unpack_trees_porcelain(&o);
+
+       if (result == UPDATE_SPARSITY_WARNINGS)
+               /*
+                * 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);
-       else
+       else
                rollback_lock_file(&lock_file);
 
        return result;
@@ -304,8 +291,6 @@ static int sparse_checkout_init(int argc, const char **argv)
        };
 
        repo_read_index(the_repository);
-       require_clean_work_tree(the_repository,
-                               N_("initialize sparse-checkout"), NULL, 1, 0);
 
        argc = parse_options(argc, argv, NULL,
                             builtin_sparse_checkout_init_options,
@@ -560,8 +545,6 @@ static int sparse_checkout_set(int argc, const char **argv, const char *prefix,
        };
 
        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,
                             builtin_sparse_checkout_set_options,
@@ -571,14 +554,18 @@ static int sparse_checkout_set(int argc, const char **argv, const char *prefix,
        return modify_pattern_list(argc, argv, m);
 }
 
+static int sparse_checkout_reapply(int argc, const char **argv)
+{
+       repo_read_index(the_repository);
+       return update_working_directory(NULL);
+}
+
 static int sparse_checkout_disable(int argc, const char **argv)
 {
        struct pattern_list pl;
        struct strbuf match_all = STRBUF_INIT;
 
        repo_read_index(the_repository);
-       require_clean_work_tree(the_repository,
-                               N_("disable sparse-checkout"), NULL, 1, 0);
 
        memset(&pl, 0, sizeof(pl));
        hashmap_init(&pl.recursive_hashmap, pl_hashmap_cmp, NULL, 0);
@@ -622,6 +609,8 @@ int cmd_sparse_checkout(int argc, const char **argv, const char *prefix)
                        return sparse_checkout_set(argc, argv, prefix, REPLACE);
                if (!strcmp(argv[0], "add"))
                        return sparse_checkout_set(argc, argv, prefix, ADD);
+               if (!strcmp(argv[0], "reapply"))
+                       return sparse_checkout_reapply(argc, argv);
                if (!strcmp(argv[0], "disable"))
                        return sparse_checkout_disable(argc, argv);
        }