stash: convert show to builtin
Add stash show to the helper and delete the show_stash, have_stash, assert_stash_like, is_stash_like and parse_flags_and_rev functions from the shell script now that they are no longer needed. In shell version, although `git stash show` accepts `--index` and `--quiet` options, it ignores them. In C, both options are passed further to `git diff`. 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:
parent
130f2697da
commit
dc7bd382b1
@ -10,9 +10,12 @@
|
||||
#include "run-command.h"
|
||||
#include "dir.h"
|
||||
#include "rerere.h"
|
||||
#include "revision.h"
|
||||
#include "log-tree.h"
|
||||
|
||||
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>]"),
|
||||
@ -25,6 +28,11 @@ static const char * const git_stash_helper_list_usage[] = {
|
||||
NULL
|
||||
};
|
||||
|
||||
static const char * const git_stash_helper_show_usage[] = {
|
||||
N_("git stash--helper show [<options>] [<stash>]"),
|
||||
NULL
|
||||
};
|
||||
|
||||
static const char * const git_stash_helper_drop_usage[] = {
|
||||
N_("git stash--helper drop [-q|--quiet] [<stash>]"),
|
||||
NULL
|
||||
@ -644,6 +652,83 @@ static int list_stash(int argc, const char **argv, const char *prefix)
|
||||
return run_command(&cp);
|
||||
}
|
||||
|
||||
static int show_stat = 1;
|
||||
static int show_patch;
|
||||
|
||||
static int git_stash_config(const char *var, const char *value, void *cb)
|
||||
{
|
||||
if (!strcmp(var, "stash.showstat")) {
|
||||
show_stat = git_config_bool(var, value);
|
||||
return 0;
|
||||
}
|
||||
if (!strcmp(var, "stash.showpatch")) {
|
||||
show_patch = git_config_bool(var, value);
|
||||
return 0;
|
||||
}
|
||||
return git_default_config(var, value, cb);
|
||||
}
|
||||
|
||||
static int show_stash(int argc, const char **argv, const char *prefix)
|
||||
{
|
||||
int i;
|
||||
int opts = 0;
|
||||
int ret = 0;
|
||||
struct stash_info info;
|
||||
struct rev_info rev;
|
||||
struct argv_array stash_args = ARGV_ARRAY_INIT;
|
||||
struct option options[] = {
|
||||
OPT_END()
|
||||
};
|
||||
|
||||
init_diff_ui_defaults();
|
||||
git_config(git_diff_ui_config, NULL);
|
||||
init_revisions(&rev, prefix);
|
||||
|
||||
for (i = 1; i < argc; i++) {
|
||||
if (argv[i][0] != '-')
|
||||
argv_array_push(&stash_args, argv[i]);
|
||||
else
|
||||
opts++;
|
||||
}
|
||||
|
||||
ret = get_stash_info(&info, stash_args.argc, stash_args.argv);
|
||||
argv_array_clear(&stash_args);
|
||||
if (ret)
|
||||
return -1;
|
||||
|
||||
/*
|
||||
* The config settings are applied only if there are not passed
|
||||
* any options.
|
||||
*/
|
||||
if (!opts) {
|
||||
git_config(git_stash_config, NULL);
|
||||
if (show_stat)
|
||||
rev.diffopt.output_format = DIFF_FORMAT_DIFFSTAT;
|
||||
|
||||
if (show_patch)
|
||||
rev.diffopt.output_format |= DIFF_FORMAT_PATCH;
|
||||
|
||||
if (!show_stat && !show_patch) {
|
||||
free_stash_info(&info);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
argc = setup_revisions(argc, argv, &rev, NULL);
|
||||
if (argc > 1) {
|
||||
free_stash_info(&info);
|
||||
usage_with_options(git_stash_helper_show_usage, options);
|
||||
}
|
||||
|
||||
rev.diffopt.flags.recursive = 1;
|
||||
setup_diff_pager(&rev.diffopt);
|
||||
diff_tree_oid(&info.b_commit, &info.w_commit, "", &rev.diffopt);
|
||||
log_tree_diff_flush(&rev);
|
||||
|
||||
free_stash_info(&info);
|
||||
return diff_result_code(&rev.diffopt, 0);
|
||||
}
|
||||
|
||||
int cmd_stash__helper(int argc, const char **argv, const char *prefix)
|
||||
{
|
||||
pid_t pid = getpid();
|
||||
@ -676,6 +761,8 @@ int cmd_stash__helper(int argc, const char **argv, const char *prefix)
|
||||
return !!branch_stash(argc, argv, prefix);
|
||||
else if (!strcmp(argv[0], "list"))
|
||||
return !!list_stash(argc, argv, prefix);
|
||||
else if (!strcmp(argv[0], "show"))
|
||||
return !!show_stash(argc, argv, prefix);
|
||||
|
||||
usage_msg_opt(xstrfmt(_("unknown subcommand: %s"), argv[0]),
|
||||
git_stash_helper_usage, options);
|
||||
|
132
git-stash.sh
132
git-stash.sh
@ -395,35 +395,6 @@ save_stash () {
|
||||
fi
|
||||
}
|
||||
|
||||
have_stash () {
|
||||
git rev-parse --verify --quiet $ref_stash >/dev/null
|
||||
}
|
||||
|
||||
show_stash () {
|
||||
ALLOW_UNKNOWN_FLAGS=t
|
||||
assert_stash_like "$@"
|
||||
|
||||
if test -z "$FLAGS"
|
||||
then
|
||||
if test "$(git config --bool stash.showStat || echo true)" = "true"
|
||||
then
|
||||
FLAGS=--stat
|
||||
fi
|
||||
|
||||
if test "$(git config --bool stash.showPatch || echo false)" = "true"
|
||||
then
|
||||
FLAGS=${FLAGS}${FLAGS:+ }-p
|
||||
fi
|
||||
|
||||
if test -z "$FLAGS"
|
||||
then
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
|
||||
git diff ${FLAGS} $b_commit $w_commit
|
||||
}
|
||||
|
||||
show_help () {
|
||||
exec git help stash
|
||||
exit 1
|
||||
@ -465,107 +436,6 @@ show_help () {
|
||||
# * unknown flags were set and ALLOW_UNKNOWN_FLAGS is not "t"
|
||||
#
|
||||
|
||||
parse_flags_and_rev()
|
||||
{
|
||||
test "$PARSE_CACHE" = "$*" && return 0 # optimisation
|
||||
PARSE_CACHE="$*"
|
||||
|
||||
IS_STASH_LIKE=
|
||||
IS_STASH_REF=
|
||||
INDEX_OPTION=
|
||||
s=
|
||||
w_commit=
|
||||
b_commit=
|
||||
i_commit=
|
||||
u_commit=
|
||||
w_tree=
|
||||
b_tree=
|
||||
i_tree=
|
||||
u_tree=
|
||||
|
||||
FLAGS=
|
||||
REV=
|
||||
for opt
|
||||
do
|
||||
case "$opt" in
|
||||
-q|--quiet)
|
||||
GIT_QUIET=-t
|
||||
;;
|
||||
--index)
|
||||
INDEX_OPTION=--index
|
||||
;;
|
||||
--help)
|
||||
show_help
|
||||
;;
|
||||
-*)
|
||||
test "$ALLOW_UNKNOWN_FLAGS" = t ||
|
||||
die "$(eval_gettext "unknown option: \$opt")"
|
||||
FLAGS="${FLAGS}${FLAGS:+ }$opt"
|
||||
;;
|
||||
*)
|
||||
REV="${REV}${REV:+ }'$opt'"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
eval set -- $REV
|
||||
|
||||
case $# in
|
||||
0)
|
||||
have_stash || die "$(gettext "No stash entries found.")"
|
||||
set -- ${ref_stash}@{0}
|
||||
;;
|
||||
1)
|
||||
:
|
||||
;;
|
||||
*)
|
||||
die "$(eval_gettext "Too many revisions specified: \$REV")"
|
||||
;;
|
||||
esac
|
||||
|
||||
case "$1" in
|
||||
*[!0-9]*)
|
||||
:
|
||||
;;
|
||||
*)
|
||||
set -- "${ref_stash}@{$1}"
|
||||
;;
|
||||
esac
|
||||
|
||||
REV=$(git rev-parse --symbolic --verify --quiet "$1") || {
|
||||
reference="$1"
|
||||
die "$(eval_gettext "\$reference is not a valid reference")"
|
||||
}
|
||||
|
||||
i_commit=$(git rev-parse --verify --quiet "$REV^2") &&
|
||||
set -- $(git rev-parse "$REV" "$REV^1" "$REV:" "$REV^1:" "$REV^2:" 2>/dev/null) &&
|
||||
s=$1 &&
|
||||
w_commit=$1 &&
|
||||
b_commit=$2 &&
|
||||
w_tree=$3 &&
|
||||
b_tree=$4 &&
|
||||
i_tree=$5 &&
|
||||
IS_STASH_LIKE=t &&
|
||||
test "$ref_stash" = "$(git rev-parse --symbolic-full-name "${REV%@*}")" &&
|
||||
IS_STASH_REF=t
|
||||
|
||||
u_commit=$(git rev-parse --verify --quiet "$REV^3") &&
|
||||
u_tree=$(git rev-parse "$REV^3:" 2>/dev/null)
|
||||
}
|
||||
|
||||
is_stash_like()
|
||||
{
|
||||
parse_flags_and_rev "$@"
|
||||
test -n "$IS_STASH_LIKE"
|
||||
}
|
||||
|
||||
assert_stash_like() {
|
||||
is_stash_like "$@" || {
|
||||
args="$*"
|
||||
die "$(eval_gettext "'\$args' is not a stash-like commit")"
|
||||
}
|
||||
}
|
||||
|
||||
test "$1" = "-p" && set "push" "$@"
|
||||
|
||||
PARSE_CACHE='--not-parsed'
|
||||
@ -590,7 +460,7 @@ list)
|
||||
;;
|
||||
show)
|
||||
shift
|
||||
show_stash "$@"
|
||||
git stash--helper show "$@"
|
||||
;;
|
||||
save)
|
||||
shift
|
||||
|
Loading…
Reference in New Issue
Block a user