mirror of
https://github.com/git/git.git
synced 2024-11-08 10:13:18 +01:00
Merge branch 'mv/parseopt-checkout-index'
* mv/parseopt-checkout-index: parse-opt: migrate builtin-checkout-index.
This commit is contained in:
commit
7bc9ed0d5b
1 changed files with 83 additions and 69 deletions
|
@ -40,6 +40,7 @@
|
||||||
#include "cache.h"
|
#include "cache.h"
|
||||||
#include "quote.h"
|
#include "quote.h"
|
||||||
#include "cache-tree.h"
|
#include "cache-tree.h"
|
||||||
|
#include "parse-options.h"
|
||||||
|
|
||||||
#define CHECKOUT_ALL 4
|
#define CHECKOUT_ALL 4
|
||||||
static int line_termination = '\n';
|
static int line_termination = '\n';
|
||||||
|
@ -153,11 +154,58 @@ static void checkout_all(const char *prefix, int prefix_length)
|
||||||
exit(128);
|
exit(128);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char checkout_cache_usage[] =
|
static const char * const builtin_checkout_index_usage[] = {
|
||||||
"git checkout-index [-u] [-q] [-a] [-f] [-n] [--stage=[123]|all] [--prefix=<string>] [--temp] [--] <file>...";
|
"git checkout-index [options] [--] <file>...",
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
static struct lock_file lock_file;
|
static struct lock_file lock_file;
|
||||||
|
|
||||||
|
static int option_parse_u(const struct option *opt,
|
||||||
|
const char *arg, int unset)
|
||||||
|
{
|
||||||
|
int *newfd = opt->value;
|
||||||
|
|
||||||
|
state.refresh_cache = 1;
|
||||||
|
if (*newfd < 0)
|
||||||
|
*newfd = hold_locked_index(&lock_file, 1);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int option_parse_z(const struct option *opt,
|
||||||
|
const char *arg, int unset)
|
||||||
|
{
|
||||||
|
if (unset)
|
||||||
|
line_termination = '\n';
|
||||||
|
else
|
||||||
|
line_termination = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int option_parse_prefix(const struct option *opt,
|
||||||
|
const char *arg, int unset)
|
||||||
|
{
|
||||||
|
state.base_dir = arg;
|
||||||
|
state.base_dir_len = strlen(arg);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int option_parse_stage(const struct option *opt,
|
||||||
|
const char *arg, int unset)
|
||||||
|
{
|
||||||
|
if (!strcmp(arg, "all")) {
|
||||||
|
to_tempfile = 1;
|
||||||
|
checkout_stage = CHECKOUT_ALL;
|
||||||
|
} else {
|
||||||
|
int ch = arg[0];
|
||||||
|
if ('1' <= ch && ch <= '3')
|
||||||
|
checkout_stage = arg[0] - '0';
|
||||||
|
else
|
||||||
|
die("stage should be between 1 and 3 or all");
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int cmd_checkout_index(int argc, const char **argv, const char *prefix)
|
int cmd_checkout_index(int argc, const char **argv, const char *prefix)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
@ -165,6 +213,33 @@ int cmd_checkout_index(int argc, const char **argv, const char *prefix)
|
||||||
int all = 0;
|
int all = 0;
|
||||||
int read_from_stdin = 0;
|
int read_from_stdin = 0;
|
||||||
int prefix_length;
|
int prefix_length;
|
||||||
|
int force = 0, quiet = 0, not_new = 0;
|
||||||
|
struct option builtin_checkout_index_options[] = {
|
||||||
|
OPT_BOOLEAN('a', "all", &all,
|
||||||
|
"checks out all files in the index"),
|
||||||
|
OPT_BOOLEAN('f', "force", &force,
|
||||||
|
"forces overwrite of existing files"),
|
||||||
|
OPT__QUIET(&quiet),
|
||||||
|
OPT_BOOLEAN('n', "no-create", ¬_new,
|
||||||
|
"don't checkout new files"),
|
||||||
|
{ OPTION_CALLBACK, 'u', "index", &newfd, NULL,
|
||||||
|
"update stat information in the index file",
|
||||||
|
PARSE_OPT_NOARG, option_parse_u },
|
||||||
|
{ OPTION_CALLBACK, 'z', NULL, NULL, NULL,
|
||||||
|
"paths are separated with NUL character",
|
||||||
|
PARSE_OPT_NOARG, option_parse_z },
|
||||||
|
OPT_BOOLEAN(0, "stdin", &read_from_stdin,
|
||||||
|
"read list of paths from the standard input"),
|
||||||
|
OPT_BOOLEAN(0, "temp", &to_tempfile,
|
||||||
|
"write the content to temporary files"),
|
||||||
|
OPT_CALLBACK(0, "prefix", NULL, "string",
|
||||||
|
"when creating files, prepend <string>",
|
||||||
|
option_parse_prefix),
|
||||||
|
OPT_CALLBACK(0, "stage", NULL, NULL,
|
||||||
|
"copy out the files from named stage",
|
||||||
|
option_parse_stage),
|
||||||
|
OPT_END()
|
||||||
|
};
|
||||||
|
|
||||||
git_config(git_default_config, NULL);
|
git_config(git_default_config, NULL);
|
||||||
state.base_dir = "";
|
state.base_dir = "";
|
||||||
|
@ -174,72 +249,11 @@ int cmd_checkout_index(int argc, const char **argv, const char *prefix)
|
||||||
die("invalid cache");
|
die("invalid cache");
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 1; i < argc; i++) {
|
argc = parse_options(argc, argv, builtin_checkout_index_options,
|
||||||
const char *arg = argv[i];
|
builtin_checkout_index_usage, 0);
|
||||||
|
state.force = force;
|
||||||
if (!strcmp(arg, "--")) {
|
state.quiet = quiet;
|
||||||
i++;
|
state.not_new = not_new;
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (!strcmp(arg, "-a") || !strcmp(arg, "--all")) {
|
|
||||||
all = 1;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (!strcmp(arg, "-f") || !strcmp(arg, "--force")) {
|
|
||||||
state.force = 1;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (!strcmp(arg, "-q") || !strcmp(arg, "--quiet")) {
|
|
||||||
state.quiet = 1;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (!strcmp(arg, "-n") || !strcmp(arg, "--no-create")) {
|
|
||||||
state.not_new = 1;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (!strcmp(arg, "-u") || !strcmp(arg, "--index")) {
|
|
||||||
state.refresh_cache = 1;
|
|
||||||
if (newfd < 0)
|
|
||||||
newfd = hold_locked_index(&lock_file, 1);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (!strcmp(arg, "-z")) {
|
|
||||||
line_termination = 0;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (!strcmp(arg, "--stdin")) {
|
|
||||||
if (i != argc - 1)
|
|
||||||
die("--stdin must be at the end");
|
|
||||||
read_from_stdin = 1;
|
|
||||||
i++; /* do not consider arg as a file name */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (!strcmp(arg, "--temp")) {
|
|
||||||
to_tempfile = 1;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (!prefixcmp(arg, "--prefix=")) {
|
|
||||||
state.base_dir = arg+9;
|
|
||||||
state.base_dir_len = strlen(state.base_dir);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (!prefixcmp(arg, "--stage=")) {
|
|
||||||
if (!strcmp(arg + 8, "all")) {
|
|
||||||
to_tempfile = 1;
|
|
||||||
checkout_stage = CHECKOUT_ALL;
|
|
||||||
} else {
|
|
||||||
int ch = arg[8];
|
|
||||||
if ('1' <= ch && ch <= '3')
|
|
||||||
checkout_stage = arg[8] - '0';
|
|
||||||
else
|
|
||||||
die("stage should be between 1 and 3 or all");
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (arg[0] == '-')
|
|
||||||
usage(checkout_cache_usage);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (state.base_dir_len || to_tempfile) {
|
if (state.base_dir_len || to_tempfile) {
|
||||||
/* when --prefix is specified we do not
|
/* when --prefix is specified we do not
|
||||||
|
@ -253,7 +267,7 @@ int cmd_checkout_index(int argc, const char **argv, const char *prefix)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check out named files first */
|
/* Check out named files first */
|
||||||
for ( ; i < argc; i++) {
|
for (i = 0; i < argc; i++) {
|
||||||
const char *arg = argv[i];
|
const char *arg = argv[i];
|
||||||
const char *p;
|
const char *p;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue