On 09/26, Paul-Sebastian Ungureanu wrote:
> The old shell script `git-stash.sh` was removed and replaced
> entirely by `builtin/stash.c`. In order to do that, `create` and
> `push` were adapted to work without `stash.sh`. For example, before
> this commit, `git stash create` called `git stash--helper create
> --message "$*"`. If it called `git stash--helper create "$@"`, then
> some of these changes wouldn't have been necessary.
>
> This commit also removes the word `helper` since now stash is
> called directly and not by a shell script.
>
> Signed-off-by: Paul-Sebastian Ungureanu <[email protected]>
> ---
> .gitignore | 1 -
> Makefile | 3 +-
> builtin.h | 2 +-
> builtin/{stash--helper.c => stash.c} | 162 ++++++++++++++++-----------
> git-stash.sh | 153 -------------------------
> git.c | 2 +-
> 6 files changed, 98 insertions(+), 225 deletions(-)
> rename builtin/{stash--helper.c => stash.c} (90%)
> delete mode 100755 git-stash.sh
>
> [...]
>
> @@ -1571,7 +1562,44 @@ int cmd_stash__helper(int argc, const char **argv,
> const char *prefix)
> return !!push_stash(argc, argv, prefix);
> else if (!strcmp(argv[0], "save"))
> return !!save_stash(argc, argv, prefix);
> + else if (*argv[0] != '-')
> + usage_msg_opt(xstrfmt(_("unknown subcommand: %s"), argv[0]),
> + git_stash_usage, options);
> +
> + if (strcmp(argv[0], "-p")) {
> + while (++i < argc && strcmp(argv[i], "--")) {
> + /*
> + * `akpqu` is a string which contains all short options,
> + * except `-m` which is verified separately.
> + */
> + if ((strlen(argv[i]) == 2) && *argv[i] == '-' &&
> + strchr("akpqu", argv[i][1]))
> + continue;
> +
> + if (!strcmp(argv[i], "--all") ||
> + !strcmp(argv[i], "--keep-index") ||
> + !strcmp(argv[i], "--no-keep-index") ||
> + !strcmp(argv[i], "--patch") ||
> + !strcmp(argv[i], "--quiet") ||
> + !strcmp(argv[i], "--include-untracked"))
> + continue;
> +
> + /*
> + * `-m` and `--message=` are verified separately because
> + * they need to be immediately followed by a string
> + * (i.e.`-m"foobar"` or `--message="foobar"`).
> + */
> + if ((strlen(argv[i]) > 2 &&
> + !strncmp(argv[i], "-m", 2)) ||
> + (strlen(argv[i]) > 10 &&
> + !strncmp(argv[i], "--message=", 10)))
These 'strlen && !strncmp' calls could be replaced with
'starts_with()'.
> + continue;
> +
> + usage_with_options(git_stash_usage, options);
> + }
> + }
This is a bit more complex than what we used to have, which was just
"if it starts with a "-" it's an option", but I don't think it hurts
being more explicit here either.
>
> - usage_msg_opt(xstrfmt(_("unknown subcommand: %s"), argv[0]),
> - git_stash_helper_usage, options);
> + argv_array_push(&args, "push");
> + argv_array_pushv(&args, argv);
> + return !!push_stash(args.argc, args.argv, prefix);
> }