summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohannes Schindelin <johannes.schindelin@gmx.de>2019-04-18 13:16:49 (GMT)
committerJunio C Hamano <gitster@pobox.com>2019-04-19 05:03:24 (GMT)
commit6ea18fffb016f7267f1f8bd2a4871500c4174f68 (patch)
tree8281b35f661bf6933a09a1f2e089b283896a0807
parent31cf4a6ba96c97867451bf6aeca4ea1659c69dcf (diff)
downloadgit-6ea18fffb016f7267f1f8bd2a4871500c4174f68.zip
git-6ea18fffb016f7267f1f8bd2a4871500c4174f68.tar.gz
git-6ea18fffb016f7267f1f8bd2a4871500c4174f68.tar.bz2
test-tool: handle the `-C <directory>` option just like `git`
In preparation for moving `git serve` into `test-tool` (because it really is only used by the test suite), we teach the `test-tool` the useful trick to change the working directory before running the test command, which will avoid introducing subshells in the test code. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--t/helper/test-tool.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/t/helper/test-tool.c b/t/helper/test-tool.c
index 99db740..2b21943 100644
--- a/t/helper/test-tool.c
+++ b/t/helper/test-tool.c
@@ -1,5 +1,11 @@
#include "git-compat-util.h"
#include "test-tool.h"
+#include "parse-options.h"
+
+static const char * const test_tool_usage[] = {
+ "test-tool [-C <directory>] <command [<arguments>...]]",
+ NULL
+};
struct test_cmd {
const char *name;
@@ -73,11 +79,24 @@ static NORETURN void die_usage(void)
int cmd_main(int argc, const char **argv)
{
int i;
+ const char *working_directory = NULL;
+ struct option options[] = {
+ OPT_STRING('C', NULL, &working_directory, "directory",
+ "change the working directory"),
+ OPT_END()
+ };
BUG_exit_code = 99;
+ argc = parse_options(argc, argv, NULL, options, test_tool_usage,
+ PARSE_OPT_STOP_AT_NON_OPTION |
+ PARSE_OPT_KEEP_ARGV0);
+
if (argc < 2)
die_usage();
+ if (working_directory && chdir(working_directory) < 0)
+ die("Could not cd to '%s'", working_directory);
+
for (i = 0; i < ARRAY_SIZE(cmds); i++) {
if (!strcmp(cmds[i].name, argv[1])) {
argv++;