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>maint
parent
130f2697da
commit
dc7bd382b1
|
@ -10,9 +10,12 @@
|
||||||
#include "run-command.h"
|
#include "run-command.h"
|
||||||
#include "dir.h"
|
#include "dir.h"
|
||||||
#include "rerere.h"
|
#include "rerere.h"
|
||||||
|
#include "revision.h"
|
||||||
|
#include "log-tree.h"
|
||||||
|
|
||||||
static const char * const git_stash_helper_usage[] = {
|
static const char * const git_stash_helper_usage[] = {
|
||||||
N_("git stash--helper list [<options>]"),
|
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 drop [-q|--quiet] [<stash>]"),
|
||||||
N_("git stash--helper ( pop | apply ) [--index] [-q|--quiet] [<stash>]"),
|
N_("git stash--helper ( pop | apply ) [--index] [-q|--quiet] [<stash>]"),
|
||||||
N_("git stash--helper branch <branchname> [<stash>]"),
|
N_("git stash--helper branch <branchname> [<stash>]"),
|
||||||
|
@ -25,6 +28,11 @@ static const char * const git_stash_helper_list_usage[] = {
|
||||||
NULL
|
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[] = {
|
static const char * const git_stash_helper_drop_usage[] = {
|
||||||
N_("git stash--helper drop [-q|--quiet] [<stash>]"),
|
N_("git stash--helper drop [-q|--quiet] [<stash>]"),
|
||||||
NULL
|
NULL
|
||||||
|
@ -644,6 +652,83 @@ static int list_stash(int argc, const char **argv, const char *prefix)
|
||||||
return run_command(&cp);
|
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)
|
int cmd_stash__helper(int argc, const char **argv, const char *prefix)
|
||||||
{
|
{
|
||||||
pid_t pid = getpid();
|
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);
|
return !!branch_stash(argc, argv, prefix);
|
||||||
else if (!strcmp(argv[0], "list"))
|
else if (!strcmp(argv[0], "list"))
|
||||||
return !!list_stash(argc, argv, prefix);
|
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]),
|
usage_msg_opt(xstrfmt(_("unknown subcommand: %s"), argv[0]),
|
||||||
git_stash_helper_usage, options);
|
git_stash_helper_usage, options);
|
||||||
|
|
132
git-stash.sh
132
git-stash.sh
|
@ -395,35 +395,6 @@ save_stash () {
|
||||||
fi
|
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 () {
|
show_help () {
|
||||||
exec git help stash
|
exec git help stash
|
||||||
exit 1
|
exit 1
|
||||||
|
@ -465,107 +436,6 @@ show_help () {
|
||||||
# * unknown flags were set and ALLOW_UNKNOWN_FLAGS is not "t"
|
# * 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" "$@"
|
test "$1" = "-p" && set "push" "$@"
|
||||||
|
|
||||||
PARSE_CACHE='--not-parsed'
|
PARSE_CACHE='--not-parsed'
|
||||||
|
@ -590,7 +460,7 @@ list)
|
||||||
;;
|
;;
|
||||||
show)
|
show)
|
||||||
shift
|
shift
|
||||||
show_stash "$@"
|
git stash--helper show "$@"
|
||||||
;;
|
;;
|
||||||
save)
|
save)
|
||||||
shift
|
shift
|
||||||
|
|
Loading…
Reference in New Issue