stash: convert stash--helper.c into stash.c

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 <ungureanupaulsebastian@gmail.com>
Signed-off-by: Thomas Gummerer <t.gummerer@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Paul-Sebastian Ungureanu 2019-02-25 23:16:28 +00:00 committed by Junio C Hamano
parent 48ee24ab72
commit 40af146834
6 changed files with 92 additions and 225 deletions

1
.gitignore vendored
View File

@ -162,7 +162,6 @@
/git-show-ref
/git-stage
/git-stash
/git-stash--helper
/git-status
/git-stripspace
/git-submodule

View File

@ -619,7 +619,6 @@ SCRIPT_SH += git-quiltimport.sh
SCRIPT_SH += git-legacy-rebase.sh
SCRIPT_SH += git-remote-testgit.sh
SCRIPT_SH += git-request-pull.sh
SCRIPT_SH += git-stash.sh
SCRIPT_SH += git-submodule.sh
SCRIPT_SH += git-web--browse.sh
@ -1117,7 +1116,7 @@ BUILTIN_OBJS += builtin/shortlog.o
BUILTIN_OBJS += builtin/show-branch.o
BUILTIN_OBJS += builtin/show-index.o
BUILTIN_OBJS += builtin/show-ref.o
BUILTIN_OBJS += builtin/stash--helper.o
BUILTIN_OBJS += builtin/stash.o
BUILTIN_OBJS += builtin/stripspace.o
BUILTIN_OBJS += builtin/submodule--helper.o
BUILTIN_OBJS += builtin/symbolic-ref.o

View File

@ -225,7 +225,7 @@ extern int cmd_show(int argc, const char **argv, const char *prefix);
extern int cmd_show_branch(int argc, const char **argv, const char *prefix);
extern int cmd_show_index(int argc, const char **argv, const char *prefix);
extern int cmd_status(int argc, const char **argv, const char *prefix);
extern int cmd_stash__helper(int argc, const char **argv, const char *prefix);
extern int cmd_stash(int argc, const char **argv, const char *prefix);
extern int cmd_stripspace(int argc, const char **argv, const char *prefix);
extern int cmd_submodule__helper(int argc, const char **argv, const char *prefix);
extern int cmd_symbolic_ref(int argc, const char **argv, const char *prefix);

View File

@ -16,75 +16,70 @@
#define INCLUDE_ALL_FILES 2
static const char * const git_stash_helper_usage[] = {
N_("git stash--helper list [<options>]"),
N_("git stash--helper show [<options>] [<stash>]"),
N_("git stash--helper drop [-q|--quiet] [<stash>]"),
N_("git stash--helper ( pop | apply ) [--index] [-q|--quiet] [<stash>]"),
N_("git stash--helper branch <branchname> [<stash>]"),
N_("git stash--helper clear"),
N_("git stash--helper [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n"
static const char * const git_stash_usage[] = {
N_("git stash list [<options>]"),
N_("git stash show [<options>] [<stash>]"),
N_("git stash drop [-q|--quiet] [<stash>]"),
N_("git stash ( pop | apply ) [--index] [-q|--quiet] [<stash>]"),
N_("git stash branch <branchname> [<stash>]"),
N_("git stash clear"),
N_("git stash [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n"
" [-u|--include-untracked] [-a|--all] [-m|--message <message>]\n"
" [--] [<pathspec>...]]"),
N_("git stash--helper save [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n"
N_("git stash save [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n"
" [-u|--include-untracked] [-a|--all] [<message>]"),
NULL
};
static const char * const git_stash_helper_list_usage[] = {
N_("git stash--helper list [<options>]"),
static const char * const git_stash_list_usage[] = {
N_("git stash list [<options>]"),
NULL
};
static const char * const git_stash_helper_show_usage[] = {
N_("git stash--helper show [<options>] [<stash>]"),
static const char * const git_stash_show_usage[] = {
N_("git stash show [<options>] [<stash>]"),
NULL
};
static const char * const git_stash_helper_drop_usage[] = {
N_("git stash--helper drop [-q|--quiet] [<stash>]"),
static const char * const git_stash_drop_usage[] = {
N_("git stash drop [-q|--quiet] [<stash>]"),
NULL
};
static const char * const git_stash_helper_pop_usage[] = {
N_("git stash--helper pop [--index] [-q|--quiet] [<stash>]"),
static const char * const git_stash_pop_usage[] = {
N_("git stash pop [--index] [-q|--quiet] [<stash>]"),
NULL
};
static const char * const git_stash_helper_apply_usage[] = {
N_("git stash--helper apply [--index] [-q|--quiet] [<stash>]"),
static const char * const git_stash_apply_usage[] = {
N_("git stash apply [--index] [-q|--quiet] [<stash>]"),
NULL
};
static const char * const git_stash_helper_branch_usage[] = {
N_("git stash--helper branch <branchname> [<stash>]"),
static const char * const git_stash_branch_usage[] = {
N_("git stash branch <branchname> [<stash>]"),
NULL
};
static const char * const git_stash_helper_clear_usage[] = {
N_("git stash--helper clear"),
static const char * const git_stash_clear_usage[] = {
N_("git stash clear"),
NULL
};
static const char * const git_stash_helper_store_usage[] = {
N_("git stash--helper store [-m|--message <message>] [-q|--quiet] <commit>"),
static const char * const git_stash_store_usage[] = {
N_("git stash store [-m|--message <message>] [-q|--quiet] <commit>"),
NULL
};
static const char * const git_stash_helper_create_usage[] = {
N_("git stash--helper create [<message>]"),
NULL
};
static const char * const git_stash_helper_push_usage[] = {
N_("git stash--helper [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n"
static const char * const git_stash_push_usage[] = {
N_("git stash [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n"
" [-u|--include-untracked] [-a|--all] [-m|--message <message>]\n"
" [--] [<pathspec>...]]"),
NULL
};
static const char * const git_stash_helper_save_usage[] = {
N_("git stash--helper save [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n"
static const char * const git_stash_save_usage[] = {
N_("git stash save [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n"
" [-u|--include-untracked] [-a|--all] [<message>]"),
NULL
};
@ -220,7 +215,7 @@ static int clear_stash(int argc, const char **argv, const char *prefix)
};
argc = parse_options(argc, argv, prefix, options,
git_stash_helper_clear_usage,
git_stash_clear_usage,
PARSE_OPT_STOP_AT_NON_OPTION);
if (argc)
@ -521,7 +516,7 @@ static int apply_stash(int argc, const char **argv, const char *prefix)
};
argc = parse_options(argc, argv, prefix, options,
git_stash_helper_apply_usage, 0);
git_stash_apply_usage, 0);
if (get_stash_info(&info, argc, argv))
return -1;
@ -594,7 +589,7 @@ static int drop_stash(int argc, const char **argv, const char *prefix)
};
argc = parse_options(argc, argv, prefix, options,
git_stash_helper_drop_usage, 0);
git_stash_drop_usage, 0);
if (get_stash_info(&info, argc, argv))
return -1;
@ -620,7 +615,7 @@ static int pop_stash(int argc, const char **argv, const char *prefix)
};
argc = parse_options(argc, argv, prefix, options,
git_stash_helper_pop_usage, 0);
git_stash_pop_usage, 0);
if (get_stash_info(&info, argc, argv))
return -1;
@ -647,7 +642,7 @@ static int branch_stash(int argc, const char **argv, const char *prefix)
};
argc = parse_options(argc, argv, prefix, options,
git_stash_helper_branch_usage, 0);
git_stash_branch_usage, 0);
if (!argc) {
fprintf_ln(stderr, _("No branch name specified"));
@ -682,7 +677,7 @@ static int list_stash(int argc, const char **argv, const char *prefix)
};
argc = parse_options(argc, argv, prefix, options,
git_stash_helper_list_usage,
git_stash_list_usage,
PARSE_OPT_KEEP_UNKNOWN);
if (!ref_exists(ref_stash))
@ -762,7 +757,7 @@ static int show_stash(int argc, const char **argv, const char *prefix)
argc = setup_revisions(argc, argv, &rev, NULL);
if (argc > 1) {
free_stash_info(&info);
usage_with_options(git_stash_helper_show_usage, options);
usage_with_options(git_stash_show_usage, options);
}
rev.diffopt.flags.recursive = 1;
@ -808,7 +803,7 @@ static int store_stash(int argc, const char **argv, const char *prefix)
};
argc = parse_options(argc, argv, prefix, options,
git_stash_helper_store_usage,
git_stash_store_usage,
PARSE_OPT_KEEP_UNKNOWN);
if (argc != 1) {
@ -1221,30 +1216,19 @@ done:
static int create_stash(int argc, const char **argv, const char *prefix)
{
int include_untracked = 0;
int ret = 0;
const char *stash_msg = NULL;
struct strbuf stash_msg_buf = STRBUF_INIT;
struct stash_info info;
struct pathspec ps;
struct option options[] = {
OPT_BOOL('u', "include-untracked", &include_untracked,
N_("include untracked files in stash")),
OPT_STRING('m', "message", &stash_msg, N_("message"),
N_("stash message")),
OPT_END()
};
argc = parse_options(argc, argv, prefix, options,
git_stash_helper_create_usage,
0);
/* Starting with argv[1], since argv[0] is "create" */
strbuf_join_argv(&stash_msg_buf, argc - 1, ++argv, ' ');
memset(&ps, 0, sizeof(ps));
if (!check_changes_tracked_files(ps))
return 0;
strbuf_addstr(&stash_msg_buf, stash_msg);
ret = do_create_stash(ps, &stash_msg_buf, include_untracked, 0, &info,
ret = do_create_stash(ps, &stash_msg_buf, 0, 0, &info,
NULL, 0);
if (!ret)
printf_ln("%s", oid_to_hex(&info.w_commit));
@ -1476,9 +1460,10 @@ static int push_stash(int argc, const char **argv, const char *prefix)
OPT_END()
};
argc = parse_options(argc, argv, prefix, options,
git_stash_helper_push_usage,
0);
if (argc)
argc = parse_options(argc, argv, prefix, options,
git_stash_push_usage,
0);
parse_pathspec(&ps, 0, PATHSPEC_PREFER_FULL, prefix, argv);
return do_push_stash(ps, stash_msg, quiet, keep_index, patch_mode,
@ -1511,7 +1496,7 @@ static int save_stash(int argc, const char **argv, const char *prefix)
};
argc = parse_options(argc, argv, prefix, options,
git_stash_helper_save_usage,
git_stash_save_usage,
PARSE_OPT_KEEP_DASHDASH);
if (argc)
@ -1525,10 +1510,12 @@ static int save_stash(int argc, const char **argv, const char *prefix)
return ret;
}
int cmd_stash__helper(int argc, const char **argv, const char *prefix)
int cmd_stash(int argc, const char **argv, const char *prefix)
{
int i = -1;
pid_t pid = getpid();
const char *index_file;
struct argv_array args = ARGV_ARRAY_INIT;
struct option options[] = {
OPT_END()
@ -1536,16 +1523,16 @@ int cmd_stash__helper(int argc, const char **argv, const char *prefix)
git_config(git_diff_basic_config, NULL);
argc = parse_options(argc, argv, prefix, options, git_stash_helper_usage,
argc = parse_options(argc, argv, prefix, options, git_stash_usage,
PARSE_OPT_KEEP_UNKNOWN | PARSE_OPT_KEEP_DASHDASH);
index_file = get_index_file();
strbuf_addf(&stash_index_path, "%s.stash.%" PRIuMAX, index_file,
(uintmax_t)pid);
if (argc < 1)
usage_with_options(git_stash_helper_usage, options);
if (!strcmp(argv[0], "apply"))
if (!argc)
return !!push_stash(0, NULL, prefix);
else if (!strcmp(argv[0], "apply"))
return !!apply_stash(argc, argv, prefix);
else if (!strcmp(argv[0], "clear"))
return !!clear_stash(argc, argv, prefix);
@ -1567,7 +1554,42 @@ 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);
usage_msg_opt(xstrfmt(_("unknown subcommand: %s"), argv[0]),
git_stash_helper_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 (starts_with(argv[i], "-m") ||
starts_with(argv[i], "--message="))
continue;
usage_with_options(git_stash_usage, options);
}
}
argv_array_push(&args, "push");
argv_array_pushv(&args, argv);
return !!push_stash(args.argc, args.argv, prefix);
}

View File

@ -1,153 +0,0 @@
#!/bin/sh
# Copyright (c) 2007, Nanako Shiraishi
dashless=$(basename "$0" | sed -e 's/-/ /')
USAGE="list [<options>]
or: $dashless show [<stash>]
or: $dashless drop [-q|--quiet] [<stash>]
or: $dashless ( pop | apply ) [--index] [-q|--quiet] [<stash>]
or: $dashless branch <branchname> [<stash>]
or: $dashless save [--patch] [-k|--[no-]keep-index] [-q|--quiet]
[-u|--include-untracked] [-a|--all] [<message>]
or: $dashless [push [--patch] [-k|--[no-]keep-index] [-q|--quiet]
[-u|--include-untracked] [-a|--all] [-m <message>]
[-- <pathspec>...]]
or: $dashless clear"
SUBDIRECTORY_OK=Yes
OPTIONS_SPEC=
START_DIR=$(pwd)
. git-sh-setup
require_work_tree
prefix=$(git rev-parse --show-prefix) || exit 1
cd_to_toplevel
TMP="$GIT_DIR/.git-stash.$$"
TMPindex=${GIT_INDEX_FILE-"$(git rev-parse --git-path index)"}.stash.$$
trap 'rm -f "$TMP-"* "$TMPindex"' 0
ref_stash=refs/stash
if git config --get-colorbool color.interactive; then
help_color="$(git config --get-color color.interactive.help 'red bold')"
reset_color="$(git config --get-color '' reset)"
else
help_color=
reset_color=
fi
#
# Parses the remaining options looking for flags and
# at most one revision defaulting to ${ref_stash}@{0}
# if none found.
#
# Derives related tree and commit objects from the
# revision, if one is found.
#
# stash records the work tree, and is a merge between the
# base commit (first parent) and the index tree (second parent).
#
# REV is set to the symbolic version of the specified stash-like commit
# IS_STASH_LIKE is non-blank if ${REV} looks like a stash
# IS_STASH_REF is non-blank if the ${REV} looks like a stash ref
# s is set to the SHA1 of the stash commit
# w_commit is set to the commit containing the working tree
# b_commit is set to the base commit
# i_commit is set to the commit containing the index tree
# u_commit is set to the commit containing the untracked files tree
# w_tree is set to the working tree
# b_tree is set to the base tree
# i_tree is set to the index tree
# u_tree is set to the untracked files tree
#
# GIT_QUIET is set to t if -q is specified
# INDEX_OPTION is set to --index if --index is specified.
# FLAGS is set to the remaining flags (if allowed)
#
# dies if:
# * too many revisions specified
# * no revision is specified and there is no stash stack
# * a revision is specified which cannot be resolve to a SHA1
# * a non-existent stash reference is specified
# * unknown flags were set and ALLOW_UNKNOWN_FLAGS is not "t"
#
test "$1" = "-p" && set "push" "$@"
PARSE_CACHE='--not-parsed'
# The default command is "push" if nothing but options are given
seen_non_option=
for opt
do
case "$opt" in
--) break ;;
-*) ;;
*) seen_non_option=t; break ;;
esac
done
test -n "$seen_non_option" || set "push" "$@"
# Main command set
case "$1" in
list)
shift
git stash--helper list "$@"
;;
show)
shift
git stash--helper show "$@"
;;
save)
shift
cd "$START_DIR"
git stash--helper save "$@"
;;
push)
shift
cd "$START_DIR"
git stash--helper push "$@"
;;
apply)
shift
cd "$START_DIR"
git stash--helper apply "$@"
;;
clear)
shift
git stash--helper clear "$@"
;;
create)
shift
git stash--helper create --message "$*"
;;
store)
shift
git stash--helper store "$@"
;;
drop)
shift
git stash--helper drop "$@"
;;
pop)
shift
cd "$START_DIR"
git stash--helper pop "$@"
;;
branch)
shift
cd "$START_DIR"
git stash--helper branch "$@"
;;
*)
case $# in
0)
cd "$START_DIR"
git stash--helper push &&
say "$(gettext "(To restore them type \"git stash apply\")")"
;;
*)
usage
esac
;;
esac

2
git.c
View File

@ -554,7 +554,7 @@ static struct cmd_struct commands[] = {
{ "show-index", cmd_show_index },
{ "show-ref", cmd_show_ref, RUN_SETUP },
{ "stage", cmd_add, RUN_SETUP | NEED_WORK_TREE },
{ "stash--helper", cmd_stash__helper, RUN_SETUP | NEED_WORK_TREE },
{ "stash", cmd_stash, RUN_SETUP | NEED_WORK_TREE },
{ "status", cmd_status, RUN_SETUP | NEED_WORK_TREE },
{ "stripspace", cmd_stripspace },
{ "submodule--helper", cmd_submodule__helper, RUN_SETUP | SUPPORT_SUPER_PREFIX | NO_PARSEOPT },