зеркало из https://github.com/microsoft/git.git
bisect--helper: `check_and_set_terms` shell function in C
Reimplement the `check_and_set_terms` shell function in C and add `check-and-set-terms` subcommand to `git bisect--helper` to call it from git-bisect.sh Using `--check-and-set-terms` subcommand is a temporary measure to port shell function in C so as to use the existing test suite. As more functions are ported, this subcommand will be retired but its implementation will be called by some other methods. check_and_set_terms() sets and receives two global variables namely TERM_GOOD and TERM_BAD in the shell script. Luckily the file BISECT_TERMS also contains the value of those variables so its appropriate to evoke the method get_terms() after calling the subcommand so that it retrieves the value of TERM_GOOD and TERM_BAD from the file BISECT_TERMS. The two global variables are passed as arguments to the subcommand. Mentored-by: Lars Schneider <larsxschneider@gmail.com> Mentored-by: Christian Couder <chriscool@tuxfamily.org> Mentored-by: Johannes Schindelin <Johannes.Schindelin@gmx.de> Signed-off-by: Pranit Bauva <pranit.bauva@gmail.com> Signed-off-by: Tanushree Tumane <tanushreetumane@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Родитель
e3b1e3bdc0
Коммит
4fbdbd5bff
|
@ -20,6 +20,7 @@ static const char * const git_bisect_helper_usage[] = {
|
||||||
N_("git bisect--helper --bisect-clean-state"),
|
N_("git bisect--helper --bisect-clean-state"),
|
||||||
N_("git bisect--helper --bisect-reset [<commit>]"),
|
N_("git bisect--helper --bisect-reset [<commit>]"),
|
||||||
N_("git bisect--helper --bisect-write [--no-log] <state> <revision> <good_term> <bad_term>"),
|
N_("git bisect--helper --bisect-write [--no-log] <state> <revision> <good_term> <bad_term>"),
|
||||||
|
N_("git bisect--helper --bisect-check-and-set-terms <command> <good_term> <bad_term>"),
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -234,6 +235,33 @@ finish:
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int check_and_set_terms(struct bisect_terms *terms, const char *cmd)
|
||||||
|
{
|
||||||
|
int has_term_file = !is_empty_or_missing_file(git_path_bisect_terms());
|
||||||
|
|
||||||
|
if (one_of(cmd, "skip", "start", "terms", NULL))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (has_term_file && strcmp(cmd, terms->term_bad) &&
|
||||||
|
strcmp(cmd, terms->term_good))
|
||||||
|
return error(_("Invalid command: you're currently in a "
|
||||||
|
"%s/%s bisect"), terms->term_bad,
|
||||||
|
terms->term_good);
|
||||||
|
|
||||||
|
if (!has_term_file) {
|
||||||
|
if (one_of(cmd, "bad", "good", NULL)) {
|
||||||
|
set_terms(terms, "bad", "good");
|
||||||
|
return write_terms(terms->term_bad, terms->term_good);
|
||||||
|
}
|
||||||
|
if (one_of(cmd, "new", "old", NULL)) {
|
||||||
|
set_terms(terms, "new", "old");
|
||||||
|
return write_terms(terms->term_bad, terms->term_good);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int cmd_bisect__helper(int argc, const char **argv, const char *prefix)
|
int cmd_bisect__helper(int argc, const char **argv, const char *prefix)
|
||||||
{
|
{
|
||||||
enum {
|
enum {
|
||||||
|
@ -242,7 +270,8 @@ int cmd_bisect__helper(int argc, const char **argv, const char *prefix)
|
||||||
BISECT_CLEAN_STATE,
|
BISECT_CLEAN_STATE,
|
||||||
CHECK_EXPECTED_REVS,
|
CHECK_EXPECTED_REVS,
|
||||||
BISECT_RESET,
|
BISECT_RESET,
|
||||||
BISECT_WRITE
|
BISECT_WRITE,
|
||||||
|
CHECK_AND_SET_TERMS
|
||||||
} cmdmode = 0;
|
} cmdmode = 0;
|
||||||
int no_checkout = 0, res = 0, nolog = 0;
|
int no_checkout = 0, res = 0, nolog = 0;
|
||||||
struct option options[] = {
|
struct option options[] = {
|
||||||
|
@ -258,6 +287,8 @@ int cmd_bisect__helper(int argc, const char **argv, const char *prefix)
|
||||||
N_("reset the bisection state"), BISECT_RESET),
|
N_("reset the bisection state"), BISECT_RESET),
|
||||||
OPT_CMDMODE(0, "bisect-write", &cmdmode,
|
OPT_CMDMODE(0, "bisect-write", &cmdmode,
|
||||||
N_("write out the bisection state in BISECT_LOG"), BISECT_WRITE),
|
N_("write out the bisection state in BISECT_LOG"), BISECT_WRITE),
|
||||||
|
OPT_CMDMODE(0, "check-and-set-terms", &cmdmode,
|
||||||
|
N_("check and set terms in a bisection state"), CHECK_AND_SET_TERMS),
|
||||||
OPT_BOOL(0, "no-checkout", &no_checkout,
|
OPT_BOOL(0, "no-checkout", &no_checkout,
|
||||||
N_("update BISECT_HEAD instead of checking out the current commit")),
|
N_("update BISECT_HEAD instead of checking out the current commit")),
|
||||||
OPT_BOOL(0, "no-log", &nolog,
|
OPT_BOOL(0, "no-log", &nolog,
|
||||||
|
@ -296,6 +327,12 @@ int cmd_bisect__helper(int argc, const char **argv, const char *prefix)
|
||||||
set_terms(&terms, argv[3], argv[2]);
|
set_terms(&terms, argv[3], argv[2]);
|
||||||
res = bisect_write(argv[0], argv[1], &terms, nolog);
|
res = bisect_write(argv[0], argv[1], &terms, nolog);
|
||||||
break;
|
break;
|
||||||
|
case CHECK_AND_SET_TERMS:
|
||||||
|
if (argc != 3)
|
||||||
|
return error(_("--check-and-set-terms requires 3 arguments"));
|
||||||
|
set_terms(&terms, argv[2], argv[1]);
|
||||||
|
res = check_and_set_terms(&terms, argv[0]);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return error("BUG: unknown subcommand '%d'", cmdmode);
|
return error("BUG: unknown subcommand '%d'", cmdmode);
|
||||||
}
|
}
|
||||||
|
|
|
@ -238,7 +238,8 @@ bisect_skip() {
|
||||||
bisect_state() {
|
bisect_state() {
|
||||||
bisect_autostart
|
bisect_autostart
|
||||||
state=$1
|
state=$1
|
||||||
check_and_set_terms $state
|
git bisect--helper --check-and-set-terms $state $TERM_GOOD $TERM_BAD || exit
|
||||||
|
get_terms
|
||||||
case "$#,$state" in
|
case "$#,$state" in
|
||||||
0,*)
|
0,*)
|
||||||
die "Please call 'bisect_state' with at least one argument." ;;
|
die "Please call 'bisect_state' with at least one argument." ;;
|
||||||
|
@ -390,7 +391,8 @@ bisect_replay () {
|
||||||
command="$bisect"
|
command="$bisect"
|
||||||
fi
|
fi
|
||||||
get_terms
|
get_terms
|
||||||
check_and_set_terms "$command"
|
git bisect--helper --check-and-set-terms "$command" "$TERM_GOOD" "$TERM_BAD" || exit
|
||||||
|
get_terms
|
||||||
case "$command" in
|
case "$command" in
|
||||||
start)
|
start)
|
||||||
cmd="bisect_start $rev"
|
cmd="bisect_start $rev"
|
||||||
|
@ -482,36 +484,6 @@ get_terms () {
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
check_and_set_terms () {
|
|
||||||
cmd="$1"
|
|
||||||
case "$cmd" in
|
|
||||||
skip|start|terms) ;;
|
|
||||||
*)
|
|
||||||
if test -s "$GIT_DIR/BISECT_TERMS" && test "$cmd" != "$TERM_BAD" && test "$cmd" != "$TERM_GOOD"
|
|
||||||
then
|
|
||||||
die "$(eval_gettext "Invalid command: you're currently in a \$TERM_BAD/\$TERM_GOOD bisect.")"
|
|
||||||
fi
|
|
||||||
case "$cmd" in
|
|
||||||
bad|good)
|
|
||||||
if ! test -s "$GIT_DIR/BISECT_TERMS"
|
|
||||||
then
|
|
||||||
TERM_BAD=bad
|
|
||||||
TERM_GOOD=good
|
|
||||||
git bisect--helper --write-terms "$TERM_BAD" "$TERM_GOOD" || exit
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
new|old)
|
|
||||||
if ! test -s "$GIT_DIR/BISECT_TERMS"
|
|
||||||
then
|
|
||||||
TERM_BAD=new
|
|
||||||
TERM_GOOD=old
|
|
||||||
git bisect--helper --write-terms "$TERM_BAD" "$TERM_GOOD" || exit
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
esac ;;
|
|
||||||
esac
|
|
||||||
}
|
|
||||||
|
|
||||||
bisect_voc () {
|
bisect_voc () {
|
||||||
case "$1" in
|
case "$1" in
|
||||||
bad) echo "bad|new" ;;
|
bad) echo "bad|new" ;;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче