]> git.ipfire.org Git - thirdparty/git.git/commitdiff
sparse-checkout: load sparse-checkout patterns
authorDerrick Stolee <dstolee@microsoft.com>
Sat, 23 Jan 2021 19:58:17 +0000 (19:58 +0000)
committerJunio C Hamano <gitster@pobox.com>
Sun, 24 Jan 2021 01:14:07 +0000 (17:14 -0800)
A future feature will want to load the sparse-checkout patterns into a
pattern_list, but the current mechanism to do so is a bit complicated.
This is made difficult due to needing to find the sparse-checkout file
in different ways throughout the codebase.

The logic implemented in the new get_sparse_checkout_patterns() was
duplicated in populate_from_existing_patterns() in unpack-trees.c. Use
the new method instead, keeping the logic around handling the struct
unpack_trees_options.

The callers to get_sparse_checkout_filename() in
builtin/sparse-checkout.c manipulate the sparse-checkout file directly,
so it is not appropriate to replace logic in that file with
get_sparse_checkout_patterns().

Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/sparse-checkout.c
dir.c
dir.h
unpack-trees.c

index e3140db2a0a63f244070d6f9fb9e838a4c2dbe4f..2306a9ad98e08a0c9d5240cdd21d1caf9669eb27 100644 (file)
@@ -22,11 +22,6 @@ static char const * const builtin_sparse_checkout_usage[] = {
        NULL
 };
 
-static char *get_sparse_checkout_filename(void)
-{
-       return git_pathdup("info/sparse-checkout");
-}
-
 static void write_patterns_to_file(FILE *fp, struct pattern_list *pl)
 {
        int i;
diff --git a/dir.c b/dir.c
index d637461da5cb9a03f86fe06d7524b756045755ac..d153a63bbd14e1ee197602368717fb2ca42c4e72 100644 (file)
--- a/dir.c
+++ b/dir.c
@@ -2998,6 +2998,23 @@ void setup_standard_excludes(struct dir_struct *dir)
        }
 }
 
+char *get_sparse_checkout_filename(void)
+{
+       return git_pathdup("info/sparse-checkout");
+}
+
+int get_sparse_checkout_patterns(struct pattern_list *pl)
+{
+       int res;
+       char *sparse_filename = get_sparse_checkout_filename();
+
+       pl->use_cone_patterns = core_sparse_checkout_cone;
+       res = add_patterns_from_file_to_list(sparse_filename, "", 0, pl, NULL);
+
+       free(sparse_filename);
+       return res;
+}
+
 int remove_path(const char *name)
 {
        char *slash;
diff --git a/dir.h b/dir.h
index a3c40dec5165425ec00181a152b1ddac37dba43d..facfae47402adcd982f3fc3b066a7dbbd1f615bd 100644 (file)
--- a/dir.h
+++ b/dir.h
@@ -448,6 +448,8 @@ int is_empty_dir(const char *dir);
 
 void setup_standard_excludes(struct dir_struct *dir);
 
+char *get_sparse_checkout_filename(void);
+int get_sparse_checkout_patterns(struct pattern_list *pl);
 
 /* Constants for remove_dir_recursively: */
 
index a810b79657ee948ac2197486b998e5badba73ef0..f5f668f532d8d574735da064f4dfb5feb8c0cd95 100644 (file)
@@ -1549,14 +1549,10 @@ static void mark_new_skip_worktree(struct pattern_list *pl,
 static void populate_from_existing_patterns(struct unpack_trees_options *o,
                                            struct pattern_list *pl)
 {
-       char *sparse = git_pathdup("info/sparse-checkout");
-
-       pl->use_cone_patterns = core_sparse_checkout_cone;
-       if (add_patterns_from_file_to_list(sparse, "", 0, pl, NULL) < 0)
+       if (get_sparse_checkout_patterns(pl) < 0)
                o->skip_sparse_checkout = 1;
        else
                o->pl = pl;
-       free(sparse);
 }