Skip to content

Commit dc7bd38

Browse files
ungpsgitster
authored andcommitted
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 <[email protected]> Signed-off-by: Thomas Gummerer <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 130f269 commit dc7bd38

File tree

2 files changed

+88
-131
lines changed

2 files changed

+88
-131
lines changed

builtin/stash--helper.c

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,12 @@
1010
#include "run-command.h"
1111
#include "dir.h"
1212
#include "rerere.h"
13+
#include "revision.h"
14+
#include "log-tree.h"
1315

1416
static const char * const git_stash_helper_usage[] = {
1517
N_("git stash--helper list [<options>]"),
18+
N_("git stash--helper show [<options>] [<stash>]"),
1619
N_("git stash--helper drop [-q|--quiet] [<stash>]"),
1720
N_("git stash--helper ( pop | apply ) [--index] [-q|--quiet] [<stash>]"),
1821
N_("git stash--helper branch <branchname> [<stash>]"),
@@ -25,6 +28,11 @@ static const char * const git_stash_helper_list_usage[] = {
2528
NULL
2629
};
2730

31+
static const char * const git_stash_helper_show_usage[] = {
32+
N_("git stash--helper show [<options>] [<stash>]"),
33+
NULL
34+
};
35+
2836
static const char * const git_stash_helper_drop_usage[] = {
2937
N_("git stash--helper drop [-q|--quiet] [<stash>]"),
3038
NULL
@@ -644,6 +652,83 @@ static int list_stash(int argc, const char **argv, const char *prefix)
644652
return run_command(&cp);
645653
}
646654

655+
static int show_stat = 1;
656+
static int show_patch;
657+
658+
static int git_stash_config(const char *var, const char *value, void *cb)
659+
{
660+
if (!strcmp(var, "stash.showstat")) {
661+
show_stat = git_config_bool(var, value);
662+
return 0;
663+
}
664+
if (!strcmp(var, "stash.showpatch")) {
665+
show_patch = git_config_bool(var, value);
666+
return 0;
667+
}
668+
return git_default_config(var, value, cb);
669+
}
670+
671+
static int show_stash(int argc, const char **argv, const char *prefix)
672+
{
673+
int i;
674+
int opts = 0;
675+
int ret = 0;
676+
struct stash_info info;
677+
struct rev_info rev;
678+
struct argv_array stash_args = ARGV_ARRAY_INIT;
679+
struct option options[] = {
680+
OPT_END()
681+
};
682+
683+
init_diff_ui_defaults();
684+
git_config(git_diff_ui_config, NULL);
685+
init_revisions(&rev, prefix);
686+
687+
for (i = 1; i < argc; i++) {
688+
if (argv[i][0] != '-')
689+
argv_array_push(&stash_args, argv[i]);
690+
else
691+
opts++;
692+
}
693+
694+
ret = get_stash_info(&info, stash_args.argc, stash_args.argv);
695+
argv_array_clear(&stash_args);
696+
if (ret)
697+
return -1;
698+
699+
/*
700+
* The config settings are applied only if there are not passed
701+
* any options.
702+
*/
703+
if (!opts) {
704+
git_config(git_stash_config, NULL);
705+
if (show_stat)
706+
rev.diffopt.output_format = DIFF_FORMAT_DIFFSTAT;
707+
708+
if (show_patch)
709+
rev.diffopt.output_format |= DIFF_FORMAT_PATCH;
710+
711+
if (!show_stat && !show_patch) {
712+
free_stash_info(&info);
713+
return 0;
714+
}
715+
}
716+
717+
argc = setup_revisions(argc, argv, &rev, NULL);
718+
if (argc > 1) {
719+
free_stash_info(&info);
720+
usage_with_options(git_stash_helper_show_usage, options);
721+
}
722+
723+
rev.diffopt.flags.recursive = 1;
724+
setup_diff_pager(&rev.diffopt);
725+
diff_tree_oid(&info.b_commit, &info.w_commit, "", &rev.diffopt);
726+
log_tree_diff_flush(&rev);
727+
728+
free_stash_info(&info);
729+
return diff_result_code(&rev.diffopt, 0);
730+
}
731+
647732
int cmd_stash__helper(int argc, const char **argv, const char *prefix)
648733
{
649734
pid_t pid = getpid();
@@ -676,6 +761,8 @@ int cmd_stash__helper(int argc, const char **argv, const char *prefix)
676761
return !!branch_stash(argc, argv, prefix);
677762
else if (!strcmp(argv[0], "list"))
678763
return !!list_stash(argc, argv, prefix);
764+
else if (!strcmp(argv[0], "show"))
765+
return !!show_stash(argc, argv, prefix);
679766

680767
usage_msg_opt(xstrfmt(_("unknown subcommand: %s"), argv[0]),
681768
git_stash_helper_usage, options);

git-stash.sh

Lines changed: 1 addition & 131 deletions
Original file line numberDiff line numberDiff line change
@@ -395,35 +395,6 @@ save_stash () {
395395
fi
396396
}
397397

398-
have_stash () {
399-
git rev-parse --verify --quiet $ref_stash >/dev/null
400-
}
401-
402-
show_stash () {
403-
ALLOW_UNKNOWN_FLAGS=t
404-
assert_stash_like "$@"
405-
406-
if test -z "$FLAGS"
407-
then
408-
if test "$(git config --bool stash.showStat || echo true)" = "true"
409-
then
410-
FLAGS=--stat
411-
fi
412-
413-
if test "$(git config --bool stash.showPatch || echo false)" = "true"
414-
then
415-
FLAGS=${FLAGS}${FLAGS:+ }-p
416-
fi
417-
418-
if test -z "$FLAGS"
419-
then
420-
return 0
421-
fi
422-
fi
423-
424-
git diff ${FLAGS} $b_commit $w_commit
425-
}
426-
427398
show_help () {
428399
exec git help stash
429400
exit 1
@@ -465,107 +436,6 @@ show_help () {
465436
# * unknown flags were set and ALLOW_UNKNOWN_FLAGS is not "t"
466437
#
467438

468-
parse_flags_and_rev()
469-
{
470-
test "$PARSE_CACHE" = "$*" && return 0 # optimisation
471-
PARSE_CACHE="$*"
472-
473-
IS_STASH_LIKE=
474-
IS_STASH_REF=
475-
INDEX_OPTION=
476-
s=
477-
w_commit=
478-
b_commit=
479-
i_commit=
480-
u_commit=
481-
w_tree=
482-
b_tree=
483-
i_tree=
484-
u_tree=
485-
486-
FLAGS=
487-
REV=
488-
for opt
489-
do
490-
case "$opt" in
491-
-q|--quiet)
492-
GIT_QUIET=-t
493-
;;
494-
--index)
495-
INDEX_OPTION=--index
496-
;;
497-
--help)
498-
show_help
499-
;;
500-
-*)
501-
test "$ALLOW_UNKNOWN_FLAGS" = t ||
502-
die "$(eval_gettext "unknown option: \$opt")"
503-
FLAGS="${FLAGS}${FLAGS:+ }$opt"
504-
;;
505-
*)
506-
REV="${REV}${REV:+ }'$opt'"
507-
;;
508-
esac
509-
done
510-
511-
eval set -- $REV
512-
513-
case $# in
514-
0)
515-
have_stash || die "$(gettext "No stash entries found.")"
516-
set -- ${ref_stash}@{0}
517-
;;
518-
1)
519-
:
520-
;;
521-
*)
522-
die "$(eval_gettext "Too many revisions specified: \$REV")"
523-
;;
524-
esac
525-
526-
case "$1" in
527-
*[!0-9]*)
528-
:
529-
;;
530-
*)
531-
set -- "${ref_stash}@{$1}"
532-
;;
533-
esac
534-
535-
REV=$(git rev-parse --symbolic --verify --quiet "$1") || {
536-
reference="$1"
537-
die "$(eval_gettext "\$reference is not a valid reference")"
538-
}
539-
540-
i_commit=$(git rev-parse --verify --quiet "$REV^2") &&
541-
set -- $(git rev-parse "$REV" "$REV^1" "$REV:" "$REV^1:" "$REV^2:" 2>/dev/null) &&
542-
s=$1 &&
543-
w_commit=$1 &&
544-
b_commit=$2 &&
545-
w_tree=$3 &&
546-
b_tree=$4 &&
547-
i_tree=$5 &&
548-
IS_STASH_LIKE=t &&
549-
test "$ref_stash" = "$(git rev-parse --symbolic-full-name "${REV%@*}")" &&
550-
IS_STASH_REF=t
551-
552-
u_commit=$(git rev-parse --verify --quiet "$REV^3") &&
553-
u_tree=$(git rev-parse "$REV^3:" 2>/dev/null)
554-
}
555-
556-
is_stash_like()
557-
{
558-
parse_flags_and_rev "$@"
559-
test -n "$IS_STASH_LIKE"
560-
}
561-
562-
assert_stash_like() {
563-
is_stash_like "$@" || {
564-
args="$*"
565-
die "$(eval_gettext "'\$args' is not a stash-like commit")"
566-
}
567-
}
568-
569439
test "$1" = "-p" && set "push" "$@"
570440

571441
PARSE_CACHE='--not-parsed'
@@ -590,7 +460,7 @@ list)
590460
;;
591461
show)
592462
shift
593-
show_stash "$@"
463+
git stash--helper show "$@"
594464
;;
595465
save)
596466
shift

0 commit comments

Comments
 (0)