sparse-checkout: create builtin with 'list' subcommand
The sparse-checkout feature is mostly hidden to users, as its only documentation is supplementary information in the docs for 'git read-tree'. In addition, users need to know how to edit the .git/info/sparse-checkout file with the right patterns, then run the appropriate 'git read-tree -mu HEAD' command. Keeping the working directory in sync with the sparse-checkout file requires care. Begin an effort to make the sparse-checkout feature a porcelain feature by creating a new 'git sparse-checkout' builtin. This builtin will be the preferred mechanism for manipulating the sparse-checkout file and syncing the working directory. The documentation provided is adapted from the "git read-tree" documentation with a few edits for clarity in the new context. Extra sections are added to hint toward a future change to a more restricted pattern set. Helped-by: Elijah Newren <newren@gmail.com> Signed-off-by: Derrick Stolee <dstolee@microsoft.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
d9f6f3b619
commit
94c0956b60
86
builtin/sparse-checkout.c
Normal file
86
builtin/sparse-checkout.c
Normal file
@ -0,0 +1,86 @@
|
||||
#include "builtin.h"
|
||||
#include "config.h"
|
||||
#include "dir.h"
|
||||
#include "parse-options.h"
|
||||
#include "pathspec.h"
|
||||
#include "repository.h"
|
||||
#include "run-command.h"
|
||||
#include "strbuf.h"
|
||||
|
||||
static char const * const builtin_sparse_checkout_usage[] = {
|
||||
N_("git sparse-checkout list"),
|
||||
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;
|
||||
|
||||
for (i = 0; i < pl->nr; i++) {
|
||||
struct path_pattern *p = pl->patterns[i];
|
||||
|
||||
if (p->flags & PATTERN_FLAG_NEGATIVE)
|
||||
fprintf(fp, "!");
|
||||
|
||||
fprintf(fp, "%s", p->pattern);
|
||||
|
||||
if (p->flags & PATTERN_FLAG_MUSTBEDIR)
|
||||
fprintf(fp, "/");
|
||||
|
||||
fprintf(fp, "\n");
|
||||
}
|
||||
}
|
||||
|
||||
static int sparse_checkout_list(int argc, const char **argv)
|
||||
{
|
||||
struct pattern_list pl;
|
||||
char *sparse_filename;
|
||||
int res;
|
||||
|
||||
memset(&pl, 0, sizeof(pl));
|
||||
|
||||
sparse_filename = get_sparse_checkout_filename();
|
||||
res = add_patterns_from_file_to_list(sparse_filename, "", 0, &pl, NULL);
|
||||
free(sparse_filename);
|
||||
|
||||
if (res < 0) {
|
||||
warning(_("this worktree is not sparse (sparse-checkout file may not exist)"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
write_patterns_to_file(stdout, &pl);
|
||||
clear_pattern_list(&pl);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int cmd_sparse_checkout(int argc, const char **argv, const char *prefix)
|
||||
{
|
||||
static struct option builtin_sparse_checkout_options[] = {
|
||||
OPT_END(),
|
||||
};
|
||||
|
||||
if (argc == 2 && !strcmp(argv[1], "-h"))
|
||||
usage_with_options(builtin_sparse_checkout_usage,
|
||||
builtin_sparse_checkout_options);
|
||||
|
||||
argc = parse_options(argc, argv, prefix,
|
||||
builtin_sparse_checkout_options,
|
||||
builtin_sparse_checkout_usage,
|
||||
PARSE_OPT_STOP_AT_NON_OPTION);
|
||||
|
||||
git_config(git_default_config, NULL);
|
||||
|
||||
if (argc > 0) {
|
||||
if (!strcmp(argv[0], "list"))
|
||||
return sparse_checkout_list(argc, argv);
|
||||
}
|
||||
|
||||
usage_with_options(builtin_sparse_checkout_usage,
|
||||
builtin_sparse_checkout_options);
|
||||
}
|
Reference in New Issue
Block a user