зеркало из https://github.com/microsoft/git.git
format-patch: migrate to parse-options API
Signed-off-by: Stephen Boyd <bebarino@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Родитель
f044fe2de6
Коммит
fff02ee666
255
builtin-log.c
255
builtin-log.c
|
@ -18,6 +18,7 @@
|
||||||
#include "shortlog.h"
|
#include "shortlog.h"
|
||||||
#include "remote.h"
|
#include "remote.h"
|
||||||
#include "string-list.h"
|
#include "string-list.h"
|
||||||
|
#include "parse-options.h"
|
||||||
|
|
||||||
/* Set a default date-time format for git log ("log.date" config variable) */
|
/* Set a default date-time format for git log ("log.date" config variable) */
|
||||||
static const char *default_date_mode = NULL;
|
static const char *default_date_mode = NULL;
|
||||||
|
@ -740,17 +741,117 @@ static const char *set_outdir(const char *prefix, const char *output_directory)
|
||||||
output_directory));
|
output_directory));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const char * const builtin_format_patch_usage[] = {
|
||||||
|
"git format-patch [options] [<since> | <revision range>]",
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
static int keep_subject = 0;
|
||||||
|
|
||||||
|
static int keep_callback(const struct option *opt, const char *arg, int unset)
|
||||||
|
{
|
||||||
|
((struct rev_info *)opt->value)->total = -1;
|
||||||
|
keep_subject = 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int subject_prefix = 0;
|
||||||
|
|
||||||
|
static int subject_prefix_callback(const struct option *opt, const char *arg,
|
||||||
|
int unset)
|
||||||
|
{
|
||||||
|
subject_prefix = 1;
|
||||||
|
((struct rev_info *)opt->value)->subject_prefix = arg;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int numbered_callback(const struct option *opt, const char *arg,
|
||||||
|
int unset)
|
||||||
|
{
|
||||||
|
*(int *)opt->value = unset ? 0 : 1;
|
||||||
|
if (unset)
|
||||||
|
auto_number = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int no_numbered_callback(const struct option *opt, const char *arg,
|
||||||
|
int unset)
|
||||||
|
{
|
||||||
|
return numbered_callback(opt, arg, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int output_directory_callback(const struct option *opt, const char *arg,
|
||||||
|
int unset)
|
||||||
|
{
|
||||||
|
const char **dir = (const char **)opt->value;
|
||||||
|
if (*dir)
|
||||||
|
die("Two output directories?");
|
||||||
|
*dir = arg;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int thread_callback(const struct option *opt, const char *arg, int unset)
|
||||||
|
{
|
||||||
|
int *thread = (int *)opt->value;
|
||||||
|
if (unset)
|
||||||
|
*thread = 0;
|
||||||
|
else if (!arg || !strcmp(arg, "shallow"))
|
||||||
|
*thread = THREAD_SHALLOW;
|
||||||
|
else if (!strcmp(arg, "deep"))
|
||||||
|
*thread = THREAD_DEEP;
|
||||||
|
else
|
||||||
|
return 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int attach_callback(const struct option *opt, const char *arg, int unset)
|
||||||
|
{
|
||||||
|
struct rev_info *rev = (struct rev_info *)opt->value;
|
||||||
|
if (unset)
|
||||||
|
rev->mime_boundary = NULL;
|
||||||
|
else if (arg)
|
||||||
|
rev->mime_boundary = arg;
|
||||||
|
else
|
||||||
|
rev->mime_boundary = git_version_string;
|
||||||
|
rev->no_inline = unset ? 0 : 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int inline_callback(const struct option *opt, const char *arg, int unset)
|
||||||
|
{
|
||||||
|
struct rev_info *rev = (struct rev_info *)opt->value;
|
||||||
|
if (unset)
|
||||||
|
rev->mime_boundary = NULL;
|
||||||
|
else if (arg)
|
||||||
|
rev->mime_boundary = arg;
|
||||||
|
else
|
||||||
|
rev->mime_boundary = git_version_string;
|
||||||
|
rev->no_inline = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int header_callback(const struct option *opt, const char *arg, int unset)
|
||||||
|
{
|
||||||
|
add_header(arg);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int cc_callback(const struct option *opt, const char *arg, int unset)
|
||||||
|
{
|
||||||
|
ALLOC_GROW(extra_cc, extra_cc_nr + 1, extra_cc_alloc);
|
||||||
|
extra_cc[extra_cc_nr++] = xstrdup(arg);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int cmd_format_patch(int argc, const char **argv, const char *prefix)
|
int cmd_format_patch(int argc, const char **argv, const char *prefix)
|
||||||
{
|
{
|
||||||
struct commit *commit;
|
struct commit *commit;
|
||||||
struct commit **list = NULL;
|
struct commit **list = NULL;
|
||||||
struct rev_info rev;
|
struct rev_info rev;
|
||||||
int nr = 0, total, i, j;
|
int nr = 0, total, i;
|
||||||
int use_stdout = 0;
|
int use_stdout = 0;
|
||||||
int start_number = -1;
|
int start_number = -1;
|
||||||
int keep_subject = 0;
|
|
||||||
int numbered_files = 0; /* _just_ numbers */
|
int numbered_files = 0; /* _just_ numbers */
|
||||||
int subject_prefix = 0;
|
|
||||||
int ignore_if_in_upstream = 0;
|
int ignore_if_in_upstream = 0;
|
||||||
int cover_letter = 0;
|
int cover_letter = 0;
|
||||||
int boundary_count = 0;
|
int boundary_count = 0;
|
||||||
|
@ -760,6 +861,57 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
|
||||||
struct patch_ids ids;
|
struct patch_ids ids;
|
||||||
char *add_signoff = NULL;
|
char *add_signoff = NULL;
|
||||||
struct strbuf buf = STRBUF_INIT;
|
struct strbuf buf = STRBUF_INIT;
|
||||||
|
const struct option builtin_format_patch_options[] = {
|
||||||
|
{ OPTION_CALLBACK, 'n', "numbered", &numbered, NULL,
|
||||||
|
"use [PATCH n/m] even with a single patch",
|
||||||
|
PARSE_OPT_NOARG, numbered_callback },
|
||||||
|
{ OPTION_CALLBACK, 'N', "no-numbered", &numbered, NULL,
|
||||||
|
"use [PATCH] even with multiple patches",
|
||||||
|
PARSE_OPT_NOARG, no_numbered_callback },
|
||||||
|
OPT_BOOLEAN('s', "signoff", &do_signoff, "add Signed-off-by:"),
|
||||||
|
OPT_BOOLEAN(0, "stdout", &use_stdout,
|
||||||
|
"print patches to standard out"),
|
||||||
|
OPT_BOOLEAN(0, "cover-letter", &cover_letter,
|
||||||
|
"generate a cover letter"),
|
||||||
|
OPT_BOOLEAN(0, "numbered-files", &numbered_files,
|
||||||
|
"use simple number sequence for output file names"),
|
||||||
|
OPT_STRING(0, "suffix", &fmt_patch_suffix, "sfx",
|
||||||
|
"use <sfx> instead of '.patch'"),
|
||||||
|
OPT_INTEGER(0, "start-number", &start_number,
|
||||||
|
"start numbering patches at <n> instead of 1"),
|
||||||
|
{ OPTION_CALLBACK, 0, "subject-prefix", &rev, "prefix",
|
||||||
|
"Use [<prefix>] instead of [PATCH]",
|
||||||
|
PARSE_OPT_NONEG, subject_prefix_callback },
|
||||||
|
{ OPTION_CALLBACK, 'o', "output-directory", &output_directory,
|
||||||
|
"dir", "store resulting files in <dir>",
|
||||||
|
PARSE_OPT_NONEG, output_directory_callback },
|
||||||
|
{ OPTION_CALLBACK, 'k', "keep-subject", &rev, NULL,
|
||||||
|
"don't strip/add [PATCH]",
|
||||||
|
PARSE_OPT_NOARG | PARSE_OPT_NONEG, keep_callback },
|
||||||
|
OPT_BOOLEAN(0, "no-binary", &no_binary_diff,
|
||||||
|
"don't output binary diffs"),
|
||||||
|
OPT_BOOLEAN(0, "ignore-if-in-upstream", &ignore_if_in_upstream,
|
||||||
|
"don't include a patch matching a commit upstream"),
|
||||||
|
OPT_GROUP("Messaging"),
|
||||||
|
{ OPTION_CALLBACK, 0, "add-header", NULL, "header",
|
||||||
|
"add email header", PARSE_OPT_NONEG,
|
||||||
|
header_callback },
|
||||||
|
{ OPTION_CALLBACK, 0, "cc", NULL, "email", "add Cc: header",
|
||||||
|
PARSE_OPT_NONEG, cc_callback },
|
||||||
|
OPT_STRING(0, "in-reply-to", &in_reply_to, "message-id",
|
||||||
|
"make first mail a reply to <message-id>"),
|
||||||
|
{ OPTION_CALLBACK, 0, "attach", &rev, "boundary",
|
||||||
|
"attach the patch", PARSE_OPT_OPTARG,
|
||||||
|
attach_callback },
|
||||||
|
{ OPTION_CALLBACK, 0, "inline", &rev, "boundary",
|
||||||
|
"inline the patch",
|
||||||
|
PARSE_OPT_OPTARG | PARSE_OPT_NONEG,
|
||||||
|
inline_callback },
|
||||||
|
{ OPTION_CALLBACK, 0, "thread", &thread, "style",
|
||||||
|
"enable message threading, styles: shallow, deep",
|
||||||
|
PARSE_OPT_OPTARG, thread_callback },
|
||||||
|
OPT_END()
|
||||||
|
};
|
||||||
|
|
||||||
git_config(git_format_config, NULL);
|
git_config(git_format_config, NULL);
|
||||||
init_revisions(&rev, prefix);
|
init_revisions(&rev, prefix);
|
||||||
|
@ -782,100 +934,9 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
|
||||||
* like "git format-patch -o a123 HEAD^.." may fail; a123 is
|
* like "git format-patch -o a123 HEAD^.." may fail; a123 is
|
||||||
* possibly a valid SHA1.
|
* possibly a valid SHA1.
|
||||||
*/
|
*/
|
||||||
for (i = 1, j = 1; i < argc; i++) {
|
argc = parse_options(argc, argv, builtin_format_patch_options,
|
||||||
if (!strcmp(argv[i], "--stdout"))
|
builtin_format_patch_usage,
|
||||||
use_stdout = 1;
|
PARSE_OPT_KEEP_ARGV0 | PARSE_OPT_KEEP_UNKNOWN);
|
||||||
else if (!strcmp(argv[i], "-n") ||
|
|
||||||
!strcmp(argv[i], "--numbered"))
|
|
||||||
numbered = 1;
|
|
||||||
else if (!strcmp(argv[i], "-N") ||
|
|
||||||
!strcmp(argv[i], "--no-numbered")) {
|
|
||||||
numbered = 0;
|
|
||||||
auto_number = 0;
|
|
||||||
}
|
|
||||||
else if (!prefixcmp(argv[i], "--start-number="))
|
|
||||||
start_number = strtol(argv[i] + 15, NULL, 10);
|
|
||||||
else if (!strcmp(argv[i], "--numbered-files"))
|
|
||||||
numbered_files = 1;
|
|
||||||
else if (!strcmp(argv[i], "--start-number")) {
|
|
||||||
i++;
|
|
||||||
if (i == argc)
|
|
||||||
die("Need a number for --start-number");
|
|
||||||
start_number = strtol(argv[i], NULL, 10);
|
|
||||||
}
|
|
||||||
else if (!prefixcmp(argv[i], "--cc=")) {
|
|
||||||
ALLOC_GROW(extra_cc, extra_cc_nr + 1, extra_cc_alloc);
|
|
||||||
extra_cc[extra_cc_nr++] = xstrdup(argv[i] + 5);
|
|
||||||
}
|
|
||||||
else if (!strcmp(argv[i], "-k") ||
|
|
||||||
!strcmp(argv[i], "--keep-subject")) {
|
|
||||||
keep_subject = 1;
|
|
||||||
rev.total = -1;
|
|
||||||
}
|
|
||||||
else if (!strcmp(argv[i], "--output-directory") ||
|
|
||||||
!strcmp(argv[i], "-o")) {
|
|
||||||
i++;
|
|
||||||
if (argc <= i)
|
|
||||||
die("Which directory?");
|
|
||||||
if (output_directory)
|
|
||||||
die("Two output directories?");
|
|
||||||
output_directory = argv[i];
|
|
||||||
}
|
|
||||||
else if (!strcmp(argv[i], "--signoff") ||
|
|
||||||
!strcmp(argv[i], "-s")) {
|
|
||||||
do_signoff = 1;
|
|
||||||
}
|
|
||||||
else if (!strcmp(argv[i], "--attach")) {
|
|
||||||
rev.mime_boundary = git_version_string;
|
|
||||||
rev.no_inline = 1;
|
|
||||||
}
|
|
||||||
else if (!prefixcmp(argv[i], "--attach=")) {
|
|
||||||
rev.mime_boundary = argv[i] + 9;
|
|
||||||
rev.no_inline = 1;
|
|
||||||
}
|
|
||||||
else if (!strcmp(argv[i], "--no-attach")) {
|
|
||||||
rev.mime_boundary = NULL;
|
|
||||||
rev.no_inline = 0;
|
|
||||||
}
|
|
||||||
else if (!strcmp(argv[i], "--inline")) {
|
|
||||||
rev.mime_boundary = git_version_string;
|
|
||||||
rev.no_inline = 0;
|
|
||||||
}
|
|
||||||
else if (!prefixcmp(argv[i], "--inline=")) {
|
|
||||||
rev.mime_boundary = argv[i] + 9;
|
|
||||||
rev.no_inline = 0;
|
|
||||||
}
|
|
||||||
else if (!strcmp(argv[i], "--ignore-if-in-upstream"))
|
|
||||||
ignore_if_in_upstream = 1;
|
|
||||||
else if (!strcmp(argv[i], "--thread")
|
|
||||||
|| !strcmp(argv[i], "--thread=shallow"))
|
|
||||||
thread = THREAD_SHALLOW;
|
|
||||||
else if (!strcmp(argv[i], "--thread=deep"))
|
|
||||||
thread = THREAD_DEEP;
|
|
||||||
else if (!strcmp(argv[i], "--no-thread"))
|
|
||||||
thread = 0;
|
|
||||||
else if (!prefixcmp(argv[i], "--in-reply-to="))
|
|
||||||
in_reply_to = argv[i] + 14;
|
|
||||||
else if (!strcmp(argv[i], "--in-reply-to")) {
|
|
||||||
i++;
|
|
||||||
if (i == argc)
|
|
||||||
die("Need a Message-Id for --in-reply-to");
|
|
||||||
in_reply_to = argv[i];
|
|
||||||
} else if (!prefixcmp(argv[i], "--subject-prefix=")) {
|
|
||||||
subject_prefix = 1;
|
|
||||||
rev.subject_prefix = argv[i] + 17;
|
|
||||||
} else if (!prefixcmp(argv[i], "--suffix="))
|
|
||||||
fmt_patch_suffix = argv[i] + 9;
|
|
||||||
else if (!strcmp(argv[i], "--cover-letter"))
|
|
||||||
cover_letter = 1;
|
|
||||||
else if (!strcmp(argv[i], "--no-binary"))
|
|
||||||
no_binary_diff = 1;
|
|
||||||
else if (!prefixcmp(argv[i], "--add-header="))
|
|
||||||
add_header(argv[i] + 13);
|
|
||||||
else
|
|
||||||
argv[j++] = argv[i];
|
|
||||||
}
|
|
||||||
argc = j;
|
|
||||||
|
|
||||||
if (do_signoff) {
|
if (do_signoff) {
|
||||||
const char *committer;
|
const char *committer;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче