Message ID | 07be7b8dda679d79ac9b218b2a9b08e47d7762fd.1577393347.git.gitgitgadget@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | sparse-checkout: list directories in cone mode | expand |
"Derrick Stolee via GitGitGadget" <gitgitgadget@gmail.com> writes: > From: Derrick Stolee <dstolee@microsoft.com> > Subject: Re: [PATCH 1/1] sparse-checkout: list folders in cone mode s/folder/directory/ everywhere as the rest of Git. > When core.sparseCheckoutCone is enabled, the 'git sparse-checkout set' > command taks a list of folders as input, then creates an ordered "takes" > list of sparse-checkout patterns such that those folders are > recursively included and all sibling blobs along the parent folders In this sentence, what does a "blob" really mean? Do you mean a filesystem entity, that is not a folder, that is immediately contained in the "parent folder" (in other words, regular files and symbolic links)? How would this interact with a submodule by the way? > are also included. Listing the patterns is less user-friendly than the > folders themselves. > > In cone mode, and as long as the patterns match the expected cone-mode > pattern types, change the output of 'git sparse-checkout list' to only > show the folders that created the patterns. > ... > +In the cone mode case, the `git sparse-checkout list` subcommand will list the > +folders that define the recursive patterns. For the example sparse-checkout file > +above, the output is as follows: > + > +-------------------------- > +$ git sparse-checkout list > +A/B/C > +-------------------------- > + Sounds like a worthwhile usability improvement.
On 12/26/2019 4:17 PM, Junio C Hamano wrote: > "Derrick Stolee via GitGitGadget" <gitgitgadget@gmail.com> writes: > >> From: Derrick Stolee <dstolee@microsoft.com> > >> Subject: Re: [PATCH 1/1] sparse-checkout: list folders in cone mode > s/folder/directory/ everywhere as the rest of Git. > >> When core.sparseCheckoutCone is enabled, the 'git sparse-checkout set' >> command taks a list of folders as input, then creates an ordered > > "takes" Good catch. >> list of sparse-checkout patterns such that those folders are >> recursively included and all sibling blobs along the parent folders > > In this sentence, what does a "blob" really mean? Do you mean a > filesystem entity, that is not a folder, that is immediately > contained in the "parent folder" (in other words, regular files > and symbolic links)? You're right, I'm using strange wording here. How about "sibling entries"? > How would this interact with a submodule by the way? I just checked with the Git repo by running: git submodule init git submodule update git sparse-checkout init --cone The working directory then contains all blobs at root AND the sha1collisiondetection submodule. Interesting that the sparse- checkout feature ignores submodules. That seems like the best approach since the user can already enlist in a subset of the submodules. >> are also included. Listing the patterns is less user-friendly than the >> folders themselves. >> >> In cone mode, and as long as the patterns match the expected cone-mode >> pattern types, change the output of 'git sparse-checkout list' to only >> show the folders that created the patterns. >> ... >> +In the cone mode case, the `git sparse-checkout list` subcommand will list the >> +folders that define the recursive patterns. For the example sparse-checkout file >> +above, the output is as follows: >> + >> +-------------------------- >> +$ git sparse-checkout list >> +A/B/C >> +-------------------------- >> + > > Sounds like a worthwhile usability improvement. Thanks, -Stolee
On Thu, Dec 26, 2019 at 12:49 PM Derrick Stolee via GitGitGadget <gitgitgadget@gmail.com> wrote: > > From: Derrick Stolee <dstolee@microsoft.com> > > When core.sparseCheckoutCone is enabled, the 'git sparse-checkout set' > command taks a list of folders as input, then creates an ordered > list of sparse-checkout patterns such that those folders are > recursively included and all sibling blobs along the parent folders > are also included. Listing the patterns is less user-friendly than the > folders themselves. I didn't spot anything that Junio hasn't already mentioned, but I'm just chiming in to say that this sounds good and thanks so much for working on the sparse-checkout command. :-)
diff --git a/Documentation/git-sparse-checkout.txt b/Documentation/git-sparse-checkout.txt index 9c3c66cc37..dcca9ee826 100644 --- a/Documentation/git-sparse-checkout.txt +++ b/Documentation/git-sparse-checkout.txt @@ -28,7 +28,7 @@ THE FUTURE. COMMANDS -------- 'list':: - Provide a list of the contents in the sparse-checkout file. + Describe the patterns in the sparse-checkout file. 'init':: Enable the `core.sparseCheckout` setting. If the @@ -150,6 +150,15 @@ expecting patterns of these types. Git will warn if the patterns do not match. If the patterns do match the expected format, then Git will use faster hash- based algorithms to compute inclusion in the sparse-checkout. +In the cone mode case, the `git sparse-checkout list` subcommand will list the +folders that define the recursive patterns. For the example sparse-checkout file +above, the output is as follows: + +-------------------------- +$ git sparse-checkout list +A/B/C +-------------------------- + If `core.ignoreCase=true`, then the pattern-matching algorithm will use a case-insensitive check. This corrects for case mismatched filenames in the 'git sparse-checkout set' command to reflect the expected cone in the working diff --git a/builtin/sparse-checkout.c b/builtin/sparse-checkout.c index 5d62f7a66d..b3bed891cb 100644 --- a/builtin/sparse-checkout.c +++ b/builtin/sparse-checkout.c @@ -53,6 +53,8 @@ static int sparse_checkout_list(int argc, const char **argv) memset(&pl, 0, sizeof(pl)); + pl.use_cone_patterns = core_sparse_checkout_cone; + sparse_filename = get_sparse_checkout_filename(); res = add_patterns_from_file_to_list(sparse_filename, "", 0, &pl, NULL); free(sparse_filename); @@ -62,6 +64,25 @@ static int sparse_checkout_list(int argc, const char **argv) return 0; } + if (pl.use_cone_patterns) { + int i; + struct pattern_entry *pe; + struct hashmap_iter iter; + struct string_list sl = STRING_LIST_INIT_DUP; + + hashmap_for_each_entry(&pl.recursive_hashmap, &iter, pe, ent) { + /* pe->pattern starts with "/", skip it */ + string_list_insert(&sl, pe->pattern + 1); + } + + string_list_sort(&sl); + + for (i = 0; i < sl.nr; i++) + printf("%s\n", sl.items[i].string); + + return 0; + } + write_patterns_to_file(stdout, &pl); clear_pattern_list(&pl); diff --git a/t/t1091-sparse-checkout-builtin.sh b/t/t1091-sparse-checkout-builtin.sh index 6f7e2d0c9e..37f6d8fa90 100755 --- a/t/t1091-sparse-checkout-builtin.sh +++ b/t/t1091-sparse-checkout-builtin.sh @@ -246,6 +246,17 @@ test_expect_success 'cone mode: init and set' ' test_cmp expect dir ' +test_expect_success 'cone mode: list' ' + cat >expect <<-EOF && + folder1 + folder2 + EOF + git -C repo sparse-checkout set --stdin <expect && + git -C repo sparse-checkout list >actual 2>err && + test_must_be_empty err && + test_cmp expect actual +' + test_expect_success 'cone mode: set with nested folders' ' git -C repo sparse-checkout set deep deep/deeper1/deepest 2>err && test_line_count = 0 err &&