Skip to content

Commit

Permalink
Merge branch 'jc/rev-parse-argh-dashed-multi-words'
Browse files Browse the repository at this point in the history
Make sure that the help text given to describe the "<param>" part
of the "git cmd --option=<param>" does not contain SP or _,
e.g. "--gpg-sign=<key-id>" option for "git commit" is not spelled
as "--gpg-sign=<key id>".

* jc/rev-parse-argh-dashed-multi-words:
  parse-options: make sure argh string does not have SP or _
  update-index: teach --cacheinfo a new syntax "mode,sha1,path"
  parse-options: multi-word argh should use dash to separate words
  • Loading branch information
gitster committed Apr 8, 2014
2 parents bdb830c + b6c2a0d commit b5a52fa
Show file tree
Hide file tree
Showing 17 changed files with 77 additions and 29 deletions.
6 changes: 3 additions & 3 deletions Documentation/git-cherry-pick.txt
Expand Up @@ -9,7 +9,7 @@ SYNOPSIS
--------
[verse]
'git cherry-pick' [--edit] [-n] [-m parent-number] [-s] [-x] [--ff]
[-S[<keyid>]] <commit>...
[-S[<key-id>]] <commit>...
'git cherry-pick' --continue
'git cherry-pick' --quit
'git cherry-pick' --abort
Expand Down Expand Up @@ -101,8 +101,8 @@ effect to your index in a row.
--signoff::
Add Signed-off-by line at the end of the commit message.

-S[<keyid>]::
--gpg-sign[=<keyid>]::
-S[<key-id>]::
--gpg-sign[=<key-id>]::
GPG-sign commits.

--ff::
Expand Down
2 changes: 1 addition & 1 deletion Documentation/git-commit.txt
Expand Up @@ -13,7 +13,7 @@ SYNOPSIS
[-F <file> | -m <msg>] [--reset-author] [--allow-empty]
[--allow-empty-message] [--no-verify] [-e] [--author=<author>]
[--date=<date>] [--cleanup=<mode>] [--[no-]status]
[-i | -o] [-S[<keyid>]] [--] [<file>...]
[-i | -o] [-S[<key-id>]] [--] [<file>...]

DESCRIPTION
-----------
Expand Down
2 changes: 1 addition & 1 deletion Documentation/git-merge.txt
Expand Up @@ -10,7 +10,7 @@ SYNOPSIS
--------
[verse]
'git merge' [-n] [--stat] [--no-commit] [--squash] [--[no-]edit]
[-s <strategy>] [-X <strategy-option>] [-S[<keyid>]]
[-s <strategy>] [-X <strategy-option>] [-S[<key-id>]]
[--[no-]rerere-autoupdate] [-m <msg>] [<commit>...]
'git merge' <msg> HEAD <commit>...
'git merge' --abort
Expand Down
2 changes: 1 addition & 1 deletion Documentation/git-notes.txt
Expand Up @@ -14,7 +14,7 @@ SYNOPSIS
'git notes' append [-F <file> | -m <msg> | (-c | -C) <object>] [<object>]
'git notes' edit [<object>]
'git notes' show [<object>]
'git notes' merge [-v | -q] [-s <strategy> ] <notes_ref>
'git notes' merge [-v | -q] [-s <strategy> ] <notes-ref>
'git notes' merge --commit [-v | -q]
'git notes' merge --abort [-v | -q]
'git notes' remove [--ignore-missing] [--stdin] [<object>...]
Expand Down
16 changes: 8 additions & 8 deletions Documentation/git-rev-parse.txt
Expand Up @@ -290,14 +290,14 @@ The lines after the separator describe the options.
Each line of options has this format:

------------
<opt_spec><flags>*<arg_hint>? SP+ help LF
<opt-spec><flags>*<arg-hint>? SP+ help LF
------------

`<opt_spec>`::
`<opt-spec>`::
its format is the short option character, then the long option name
separated by a comma. Both parts are not required, though at least one
is necessary. `h,help`, `dry-run` and `f` are all three correct
`<opt_spec>`.
`<opt-spec>`.

`<flags>`::
`<flags>` are of `*`, `=`, `?` or `!`.
Expand All @@ -313,11 +313,11 @@ Each line of options has this format:

* Use `!` to not make the corresponding negated long option available.

`<arg_hint>`::
`<arg_hint>`, if specified, is used as a name of the argument in the
help output, for options that take arguments. `<arg_hint>` is
terminated by the first whitespace. When you need to use space in the
argument hint use dash instead.
`<arg-hint>`::
`<arg-hint>`, if specified, is used as a name of the argument in the
help output, for options that take arguments. `<arg-hint>` is
terminated by the first whitespace. It is customary to use a
dash to separate words in a multi-word argument hint.

The remainder of the line, after stripping the spaces, is used
as the help associated to the option.
Expand Down
6 changes: 3 additions & 3 deletions Documentation/git-revert.txt
Expand Up @@ -8,7 +8,7 @@ git-revert - Revert some existing commits
SYNOPSIS
--------
[verse]
'git revert' [--[no-]edit] [-n] [-m parent-number] [-s] [-S[<keyid>]] <commit>...
'git revert' [--[no-]edit] [-n] [-m parent-number] [-s] [-S[<key-id>]] <commit>...
'git revert' --continue
'git revert' --quit
'git revert' --abort
Expand Down Expand Up @@ -80,8 +80,8 @@ more details.
This is useful when reverting more than one commits'
effect to your index in a row.

-S[<keyid>]::
--gpg-sign[=<keyid>]::
-S[<key-id>]::
--gpg-sign[=<key-id>]::
GPG-sign commits.

-s::
Expand Down
8 changes: 6 additions & 2 deletions Documentation/git-update-index.txt
Expand Up @@ -12,7 +12,7 @@ SYNOPSIS
'git update-index'
[--add] [--remove | --force-remove] [--replace]
[--refresh] [-q] [--unmerged] [--ignore-missing]
[(--cacheinfo <mode> <object> <file>)...]
[(--cacheinfo <mode>,<object>,<file>)...]
[--chmod=(+|-)x]
[--[no-]assume-unchanged]
[--[no-]skip-worktree]
Expand Down Expand Up @@ -68,8 +68,12 @@ OPTIONS
--ignore-missing::
Ignores missing files during a --refresh

--cacheinfo <mode>,<object>,<path>::
--cacheinfo <mode> <object> <path>::
Directly insert the specified info into the index.
Directly insert the specified info into the index. For
backward compatibility, you can also give these three
arguments as three separate parameters, but new users are
encouraged to use a single-parameter form.

--index-info::
Read index information from stdin.
Expand Down
2 changes: 1 addition & 1 deletion builtin/checkout.c
Expand Up @@ -1095,7 +1095,7 @@ int cmd_checkout(int argc, const char **argv, const char *prefix)
OPT_BOOL(0, "detach", &opts.force_detach, N_("detach the HEAD at named commit")),
OPT_SET_INT('t', "track", &opts.track, N_("set upstream info for new branch"),
BRANCH_TRACK_EXPLICIT),
OPT_STRING(0, "orphan", &opts.new_orphan_branch, N_("new branch"), N_("new unparented branch")),
OPT_STRING(0, "orphan", &opts.new_orphan_branch, N_("new-branch"), N_("new unparented branch")),
OPT_SET_INT('2', "ours", &opts.writeout_stage, N_("checkout our version for unmerged files"),
2),
OPT_SET_INT('3', "theirs", &opts.writeout_stage, N_("checkout their version for unmerged files"),
Expand Down
2 changes: 1 addition & 1 deletion builtin/commit.c
Expand Up @@ -1501,7 +1501,7 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
OPT_BOOL('e', "edit", &edit_flag, N_("force edit of commit")),
OPT_STRING(0, "cleanup", &cleanup_arg, N_("default"), N_("how to strip spaces and #comments from message")),
OPT_BOOL(0, "status", &include_status, N_("include status in commit message template")),
{ OPTION_STRING, 'S', "gpg-sign", &sign_commit, N_("key id"),
{ OPTION_STRING, 'S', "gpg-sign", &sign_commit, N_("key-id"),
N_("GPG sign commit"), PARSE_OPT_OPTARG, NULL, (intptr_t) "" },
/* end commit message options */

Expand Down
2 changes: 1 addition & 1 deletion builtin/merge.c
Expand Up @@ -220,7 +220,7 @@ static struct option builtin_merge_options[] = {
OPT_BOOL(0, "abort", &abort_current_merge,
N_("abort the current in-progress merge")),
OPT_SET_INT(0, "progress", &show_progress, N_("force progress reporting"), 1),
{ OPTION_STRING, 'S', "gpg-sign", &sign_commit, N_("key id"),
{ OPTION_STRING, 'S', "gpg-sign", &sign_commit, N_("key-id"),
N_("GPG sign commit"), PARSE_OPT_OPTARG, NULL, (intptr_t) "" },
OPT_BOOL(0, "overwrite-ignore", &overwrite_ignore, N_("update ignored files (default)")),
OPT_END()
Expand Down
2 changes: 1 addition & 1 deletion builtin/notes.c
Expand Up @@ -939,7 +939,7 @@ int cmd_notes(int argc, const char **argv, const char *prefix)
int result;
const char *override_notes_ref = NULL;
struct option options[] = {
OPT_STRING(0, "ref", &override_notes_ref, N_("notes_ref"),
OPT_STRING(0, "ref", &override_notes_ref, N_("notes-ref"),
N_("use notes from <notes_ref>")),
OPT_END()
};
Expand Down
2 changes: 1 addition & 1 deletion builtin/revert.c
Expand Up @@ -89,7 +89,7 @@ static void parse_args(int argc, const char **argv, struct replay_opts *opts)
OPT_STRING(0, "strategy", &opts->strategy, N_("strategy"), N_("merge strategy")),
OPT_CALLBACK('X', "strategy-option", &opts, N_("option"),
N_("option for merge strategy"), option_parse_x),
{ OPTION_STRING, 'S', "gpg-sign", &opts->gpg_sign, N_("key id"),
{ OPTION_STRING, 'S', "gpg-sign", &opts->gpg_sign, N_("key-id"),
N_("GPG sign commit"), PARSE_OPT_OPTARG, NULL, (intptr_t) "" },
OPT_END(),
OPT_END(),
Expand Down
2 changes: 1 addition & 1 deletion builtin/tag.c
Expand Up @@ -513,7 +513,7 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
OPT_BOOL('s', "sign", &opt.sign, N_("annotated and GPG-signed tag")),
OPT_STRING(0, "cleanup", &cleanup_arg, N_("mode"),
N_("how to strip spaces and #comments from message")),
OPT_STRING('u', "local-user", &keyid, N_("key id"),
OPT_STRING('u', "local-user", &keyid, N_("key-id"),
N_("use another key to sign the tag")),
OPT__FORCE(&force, N_("replace the tag if exists")),
OPT_COLUMN(0, "column", &colopts, N_("show tag list in columns")),
Expand Down
34 changes: 31 additions & 3 deletions builtin/update-index.c
Expand Up @@ -629,14 +629,42 @@ static int resolve_undo_clear_callback(const struct option *opt,
return 0;
}

static int parse_new_style_cacheinfo(const char *arg,
unsigned int *mode,
unsigned char sha1[],
const char **path)
{
unsigned long ul;
char *endp;

errno = 0;
ul = strtoul(arg, &endp, 8);
if (errno || endp == arg || *endp != ',' || (unsigned int) ul != ul)
return -1; /* not a new-style cacheinfo */
*mode = ul;
endp++;
if (get_sha1_hex(endp, sha1) || endp[40] != ',')
return -1;
*path = endp + 41;
return 0;
}

static int cacheinfo_callback(struct parse_opt_ctx_t *ctx,
const struct option *opt, int unset)
{
unsigned char sha1[20];
unsigned int mode;
const char *path;

if (!parse_new_style_cacheinfo(ctx->argv[1], &mode, sha1, &path)) {
if (add_cacheinfo(mode, sha1, path, 0))
die("git update-index: --cacheinfo cannot add %s", path);
ctx->argv++;
ctx->argc--;
return 0;
}
if (ctx->argc <= 3)
return error("option 'cacheinfo' expects three arguments");
return error("option 'cacheinfo' expects <mode>,<sha1>,<path>");
if (strtoul_ui(*++ctx->argv, 8, &mode) ||
get_sha1_hex(*++ctx->argv, sha1) ||
add_cacheinfo(mode, sha1, *++ctx->argv, 0))
Expand Down Expand Up @@ -740,9 +768,9 @@ int cmd_update_index(int argc, const char **argv, const char *prefix)
PARSE_OPT_NOARG | PARSE_OPT_NONEG,
really_refresh_callback},
{OPTION_LOWLEVEL_CALLBACK, 0, "cacheinfo", NULL,
N_("<mode> <object> <path>"),
N_("<mode>,<object>,<path>"),
N_("add the specified entry to the index"),
PARSE_OPT_NOARG | /* disallow --cacheinfo=<mode> form */
PARSE_OPT_NOARG | /* disallow --cacheinfo=<mode> form */
PARSE_OPT_NONEG | PARSE_OPT_LITERAL_ARGHELP,
(parse_opt_cb *) cacheinfo_callback},
{OPTION_CALLBACK, 0, "chmod", &set_executable_bit, N_("(+/-)x"),
Expand Down
3 changes: 3 additions & 0 deletions parse-options.c
Expand Up @@ -375,6 +375,9 @@ static void parse_options_check(const struct option *opts)
default:
; /* ok. (usually accepts an argument) */
}
if (opts->argh &&
strcspn(opts->argh, " _") != strlen(opts->argh))
err |= optbug(opts, "multi-word argh should use dash to separate words");
}
if (err)
exit(128);
Expand Down
2 changes: 1 addition & 1 deletion parse-options.h
Expand Up @@ -143,7 +143,7 @@ struct option {
{ OPTION_CALLBACK, (s), (l), (v), N_("time"),(h), 0, \
parse_opt_approxidate_cb }
#define OPT_EXPIRY_DATE(s, l, v, h) \
{ OPTION_CALLBACK, (s), (l), (v), N_("expiry date"),(h), 0, \
{ OPTION_CALLBACK, (s), (l), (v), N_("expiry-date"),(h), 0, \
parse_opt_expiry_date_cb }
#define OPT_CALLBACK(s, l, v, a, h, f) \
{ OPTION_CALLBACK, (s), (l), (v), (a), (h), 0, (f) }
Expand Down
13 changes: 13 additions & 0 deletions t/t2107-update-index-basic.sh
Expand Up @@ -48,4 +48,17 @@ test_expect_success '--cacheinfo does not accept gitlink null sha1' '
test_cmp expect actual
'

test_expect_success '--cacheinfo mode,sha1,path (new syntax)' '
echo content >file &&
git hash-object -w --stdin <file >expect &&
git update-index --add --cacheinfo 100644 "$(cat expect)" file &&
git rev-parse :file >actual &&
test_cmp expect actual &&
git update-index --add --cacheinfo "100644,$(cat expect),elif" &&
git rev-parse :elif >actual &&
test_cmp expect actual
'

test_done

0 comments on commit b5a52fa

Please sign in to comment.