зеркало из https://github.com/microsoft/git.git
stash: optionally use the scripted version again
We recently converted the `git stash` command from Unix shell scripts to builtins. Let's end users a way out when they discover a bug in the builtin command: `stash.useBuiltin`. As the file name `git-stash` is already in use, let's rename the scripted backend to `git-legacy-stash`. To make the test suite pass with `stash.useBuiltin=false`, this commit also backports rudimentary support for `-q` (but only *just* enough to appease the test suite), and adds a super-ugly hack to force exit code 129 for `git stash -h`. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> Signed-off-by: Thomas Gummerer <t.gummerer@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Родитель
8d8e9c2a94
Коммит
90a462725e
|
@ -82,6 +82,7 @@
|
||||||
/git-interpret-trailers
|
/git-interpret-trailers
|
||||||
/git-instaweb
|
/git-instaweb
|
||||||
/git-legacy-rebase
|
/git-legacy-rebase
|
||||||
|
/git-legacy-stash
|
||||||
/git-log
|
/git-log
|
||||||
/git-ls-files
|
/git-ls-files
|
||||||
/git-ls-remote
|
/git-ls-remote
|
||||||
|
|
1
Makefile
1
Makefile
|
@ -617,6 +617,7 @@ SCRIPT_SH += git-merge-resolve.sh
|
||||||
SCRIPT_SH += git-mergetool.sh
|
SCRIPT_SH += git-mergetool.sh
|
||||||
SCRIPT_SH += git-quiltimport.sh
|
SCRIPT_SH += git-quiltimport.sh
|
||||||
SCRIPT_SH += git-legacy-rebase.sh
|
SCRIPT_SH += git-legacy-rebase.sh
|
||||||
|
SCRIPT_SH += git-legacy-stash.sh
|
||||||
SCRIPT_SH += git-remote-testgit.sh
|
SCRIPT_SH += git-remote-testgit.sh
|
||||||
SCRIPT_SH += git-request-pull.sh
|
SCRIPT_SH += git-request-pull.sh
|
||||||
SCRIPT_SH += git-submodule.sh
|
SCRIPT_SH += git-submodule.sh
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
#include "revision.h"
|
#include "revision.h"
|
||||||
#include "log-tree.h"
|
#include "log-tree.h"
|
||||||
#include "diffcore.h"
|
#include "diffcore.h"
|
||||||
|
#include "exec-cmd.h"
|
||||||
|
|
||||||
#define INCLUDE_ALL_FILES 2
|
#define INCLUDE_ALL_FILES 2
|
||||||
|
|
||||||
|
@ -1510,6 +1511,26 @@ static int save_stash(int argc, const char **argv, const char *prefix)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int use_builtin_stash(void)
|
||||||
|
{
|
||||||
|
struct child_process cp = CHILD_PROCESS_INIT;
|
||||||
|
struct strbuf out = STRBUF_INIT;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
argv_array_pushl(&cp.args,
|
||||||
|
"config", "--bool", "stash.usebuiltin", NULL);
|
||||||
|
cp.git_cmd = 1;
|
||||||
|
if (capture_command(&cp, &out, 6)) {
|
||||||
|
strbuf_release(&out);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
strbuf_trim(&out);
|
||||||
|
ret = !strcmp("true", out.buf);
|
||||||
|
strbuf_release(&out);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
int cmd_stash(int argc, const char **argv, const char *prefix)
|
int cmd_stash(int argc, const char **argv, const char *prefix)
|
||||||
{
|
{
|
||||||
int i = -1;
|
int i = -1;
|
||||||
|
@ -1521,6 +1542,20 @@ int cmd_stash(int argc, const char **argv, const char *prefix)
|
||||||
OPT_END()
|
OPT_END()
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if (!use_builtin_stash()) {
|
||||||
|
const char *path = mkpath("%s/git-legacy-stash",
|
||||||
|
git_exec_path());
|
||||||
|
|
||||||
|
if (sane_execvp(path, (char **)argv) < 0)
|
||||||
|
die_errno(_("could not exec %s"), path);
|
||||||
|
else
|
||||||
|
BUG("sane_execvp() returned???");
|
||||||
|
}
|
||||||
|
|
||||||
|
prefix = setup_git_directory();
|
||||||
|
trace_repo_setup(prefix);
|
||||||
|
setup_work_tree();
|
||||||
|
|
||||||
git_config(git_diff_basic_config, NULL);
|
git_config(git_diff_basic_config, NULL);
|
||||||
|
|
||||||
argc = parse_options(argc, argv, prefix, options, git_stash_usage,
|
argc = parse_options(argc, argv, prefix, options, git_stash_usage,
|
||||||
|
|
|
@ -80,6 +80,28 @@ clear_stash () {
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
maybe_quiet () {
|
||||||
|
case "$1" in
|
||||||
|
--keep-stdout)
|
||||||
|
shift
|
||||||
|
if test -n "$GIT_QUIET"
|
||||||
|
then
|
||||||
|
eval "$@" 2>/dev/null
|
||||||
|
else
|
||||||
|
eval "$@"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
if test -n "$GIT_QUIET"
|
||||||
|
then
|
||||||
|
eval "$@" >/dev/null 2>&1
|
||||||
|
else
|
||||||
|
eval "$@"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
create_stash () {
|
create_stash () {
|
||||||
|
|
||||||
prepare_fallback_ident
|
prepare_fallback_ident
|
||||||
|
@ -112,15 +134,18 @@ create_stash () {
|
||||||
done
|
done
|
||||||
|
|
||||||
git update-index -q --refresh
|
git update-index -q --refresh
|
||||||
if no_changes "$@"
|
if maybe_quiet no_changes "$@"
|
||||||
then
|
then
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# state of the base commit
|
# state of the base commit
|
||||||
if b_commit=$(git rev-parse --verify HEAD)
|
if b_commit=$(maybe_quiet --keep-stdout git rev-parse --verify HEAD)
|
||||||
then
|
then
|
||||||
head=$(git rev-list --oneline -n 1 HEAD --)
|
head=$(git rev-list --oneline -n 1 HEAD --)
|
||||||
|
elif test -n "$GIT_QUIET"
|
||||||
|
then
|
||||||
|
exit 1
|
||||||
else
|
else
|
||||||
die "$(gettext "You do not have the initial commit yet")"
|
die "$(gettext "You do not have the initial commit yet")"
|
||||||
fi
|
fi
|
||||||
|
@ -315,7 +340,7 @@ push_stash () {
|
||||||
test -n "$untracked" || git ls-files --error-unmatch -- "$@" >/dev/null || exit 1
|
test -n "$untracked" || git ls-files --error-unmatch -- "$@" >/dev/null || exit 1
|
||||||
|
|
||||||
git update-index -q --refresh
|
git update-index -q --refresh
|
||||||
if no_changes "$@"
|
if maybe_quiet no_changes "$@"
|
||||||
then
|
then
|
||||||
say "$(gettext "No local changes to save")"
|
say "$(gettext "No local changes to save")"
|
||||||
exit 0
|
exit 0
|
||||||
|
@ -370,6 +395,9 @@ save_stash () {
|
||||||
while test $# != 0
|
while test $# != 0
|
||||||
do
|
do
|
||||||
case "$1" in
|
case "$1" in
|
||||||
|
-q|--quiet)
|
||||||
|
GIT_QUIET=t
|
||||||
|
;;
|
||||||
--)
|
--)
|
||||||
shift
|
shift
|
||||||
break
|
break
|
|
@ -101,6 +101,7 @@ $LONG_USAGE")"
|
||||||
case "$1" in
|
case "$1" in
|
||||||
-h)
|
-h)
|
||||||
echo "$LONG_USAGE"
|
echo "$LONG_USAGE"
|
||||||
|
case "$0" in *git-legacy-stash) exit 129;; esac
|
||||||
exit
|
exit
|
||||||
esac
|
esac
|
||||||
fi
|
fi
|
||||||
|
|
7
git.c
7
git.c
|
@ -554,7 +554,12 @@ static struct cmd_struct commands[] = {
|
||||||
{ "show-index", cmd_show_index },
|
{ "show-index", cmd_show_index },
|
||||||
{ "show-ref", cmd_show_ref, RUN_SETUP },
|
{ "show-ref", cmd_show_ref, RUN_SETUP },
|
||||||
{ "stage", cmd_add, RUN_SETUP | NEED_WORK_TREE },
|
{ "stage", cmd_add, RUN_SETUP | NEED_WORK_TREE },
|
||||||
{ "stash", cmd_stash, RUN_SETUP | NEED_WORK_TREE },
|
/*
|
||||||
|
* NEEDSWORK: Until the builtin stash is thoroughly robust and no
|
||||||
|
* longer needs redirection to the stash shell script this is kept as
|
||||||
|
* is, then should be changed to RUN_SETUP | NEED_WORK_TREE
|
||||||
|
*/
|
||||||
|
{ "stash", cmd_stash },
|
||||||
{ "status", cmd_status, RUN_SETUP | NEED_WORK_TREE },
|
{ "status", cmd_status, RUN_SETUP | NEED_WORK_TREE },
|
||||||
{ "stripspace", cmd_stripspace },
|
{ "stripspace", cmd_stripspace },
|
||||||
{ "submodule--helper", cmd_submodule__helper, RUN_SETUP | SUPPORT_SUPER_PREFIX | NO_PARSEOPT },
|
{ "submodule--helper", cmd_submodule__helper, RUN_SETUP | SUPPORT_SUPER_PREFIX | NO_PARSEOPT },
|
||||||
|
|
Загрузка…
Ссылка в новой задаче