From 0f64593ccd90e07e8cb8fba2c6f2c914f12260ec Mon Sep 17 00:00:00 2001 From: Jimmy Miller Date: Sun, 27 Jul 2025 15:51:24 -0400 Subject: [PATCH 1/4] feat: add support for -- to separate cabin args from program args --- src/Cmd/Run.cc | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/Cmd/Run.cc b/src/Cmd/Run.cc index 79c009f4c..0fb9f2ad5 100644 --- a/src/Cmd/Run.cc +++ b/src/Cmd/Run.cc @@ -30,8 +30,9 @@ const Subcmd RUN_CMD = .setDesc("Build and execute src/main.cc") .addOpt(OPT_RELEASE) .addOpt(OPT_JOBS) - .setArg(Arg{ "args" } - .setDesc("Arguments passed to the program") + .setArg(Arg{ "[-- args]" } + .setDesc("Arguments passed to the program (use -- to " + "separate cabin options from program arguments)") .setVariadic(true) .setRequired(false)) .setMainFn(runMain); @@ -61,6 +62,10 @@ static Result runMain(const CliArgsView args) { nextArg.data(), nextArg.data() + nextArg.size(), numThreads); Ensure(ec == std::errc(), "invalid number of threads: {}", nextArg); setParallelism(numThreads); + } else if (arg == "--") { + // End of cabin options, everything after is for the program + ++itr; + break; } else { // Unknown argument is the start of the program arguments. break; From df110208e67c12cad4ff94f35929d78b7b50beca Mon Sep 17 00:00:00 2001 From: Jimmy Miller Date: Sun, 27 Jul 2025 23:50:55 -0400 Subject: [PATCH 2/4] test: add integration test for -- --- tests/06-run.sh | 56 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/tests/06-run.sh b/tests/06-run.sh index 553f7f1d8..b88ae745d 100644 --- a/tests/06-run.sh +++ b/tests/06-run.sh @@ -34,4 +34,60 @@ EOF ) ' +test_expect_success 'cabin run -- passes arguments to program' ' + OUT=$(mktemp -d) && + test_when_finished "rm -rf $OUT" && + cd $OUT && + "$CABIN" new test_args && + cd test_args && + cat >src/main.cc <<-EOF && +#include +int main(int argc, char* argv[]) { + std::cout << "argc=" << argc << std::endl; + for (int i = 1; i < argc; ++i) { + std::cout << "arg[" << i << "]=" << argv[i] << std::endl; + } + return 0; +} +EOF + "$CABIN" run -- --help --version foo 1>stdout 2>stderr && + ( + cat >stdout_exp <<-EOF && +argc=4 +arg[1]=--help +arg[2]=--version +arg[3]=foo +EOF + test_cmp stdout_exp stdout + ) +' + +test_expect_success 'cabin run without -- stops at first unknown arg' ' + OUT=$(mktemp -d) && + test_when_finished "rm -rf $OUT" && + cd $OUT && + "$CABIN" new test_args2 && + cd test_args2 && + cat >src/main.cc <<-EOF && +#include +int main(int argc, char* argv[]) { + std::cout << "argc=" << argc << std::endl; + for (int i = 1; i < argc; ++i) { + std::cout << "arg[" << i << "]=" << argv[i] << std::endl; + } + return 0; +} +EOF + "$CABIN" run foo bar --release 1>stdout 2>stderr && + ( + cat >stdout_exp <<-EOF && +argc=4 +arg[1]=foo +arg[2]=bar +arg[3]=--release +EOF + test_cmp stdout_exp stdout + ) +' + test_done From 1c4639ed5de70522b085219db2c9ba9c4d59a37b Mon Sep 17 00:00:00 2001 From: Jimmy Miller Date: Sat, 2 Aug 2025 11:36:35 -0400 Subject: [PATCH 3/4] test: address PR feedback --- tests/06-run.sh | 26 ++++---------------------- tests/06-run/test_args.cc | 7 +++++++ 2 files changed, 11 insertions(+), 22 deletions(-) create mode 100644 tests/06-run/test_args.cc diff --git a/tests/06-run.sh b/tests/06-run.sh index b88ae745d..64efea005 100644 --- a/tests/06-run.sh +++ b/tests/06-run.sh @@ -40,17 +40,8 @@ test_expect_success 'cabin run -- passes arguments to program' ' cd $OUT && "$CABIN" new test_args && cd test_args && - cat >src/main.cc <<-EOF && -#include -int main(int argc, char* argv[]) { - std::cout << "argc=" << argc << std::endl; - for (int i = 1; i < argc; ++i) { - std::cout << "arg[" << i << "]=" << argv[i] << std::endl; - } - return 0; -} -EOF - "$CABIN" run -- --help --version foo 1>stdout 2>stderr && + cp "$WHEREAMI/06-run/test_args.cc" src/main.cc && + "$CABIN" run -- --help --version foo 1>stdout && ( cat >stdout_exp <<-EOF && argc=4 @@ -68,17 +59,8 @@ test_expect_success 'cabin run without -- stops at first unknown arg' ' cd $OUT && "$CABIN" new test_args2 && cd test_args2 && - cat >src/main.cc <<-EOF && -#include -int main(int argc, char* argv[]) { - std::cout << "argc=" << argc << std::endl; - for (int i = 1; i < argc; ++i) { - std::cout << "arg[" << i << "]=" << argv[i] << std::endl; - } - return 0; -} -EOF - "$CABIN" run foo bar --release 1>stdout 2>stderr && + cp "$WHEREAMI/06-run/test_args.cc" src/main.cc && + "$CABIN" run foo bar --release 1>stdout && ( cat >stdout_exp <<-EOF && argc=4 diff --git a/tests/06-run/test_args.cc b/tests/06-run/test_args.cc new file mode 100644 index 000000000..61ea6d388 --- /dev/null +++ b/tests/06-run/test_args.cc @@ -0,0 +1,7 @@ +#include +int main(int argc, char* argv[]) { + std::cout << "argc=" << argc << '\n'; + for (int i = 1; i < argc; ++i) { + std::cout << "arg[" << i << "]=" << argv[i] << '\n'; + } +} \ No newline at end of file From ccec061bded1a76cae8957a4d606d966f6d99cd2 Mon Sep 17 00:00:00 2001 From: Jimmy Miller Date: Sat, 2 Aug 2025 12:50:26 -0400 Subject: [PATCH 4/4] test: fix format --- tests/06-run/test_args.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/06-run/test_args.cc b/tests/06-run/test_args.cc index 61ea6d388..e03e9c2c5 100644 --- a/tests/06-run/test_args.cc +++ b/tests/06-run/test_args.cc @@ -1,7 +1,7 @@ #include int main(int argc, char* argv[]) { - std::cout << "argc=" << argc << '\n'; - for (int i = 1; i < argc; ++i) { - std::cout << "arg[" << i << "]=" << argv[i] << '\n'; - } + std::cout << "argc=" << argc << '\n'; + for (int i = 1; i < argc; ++i) { + std::cout << "arg[" << i << "]=" << argv[i] << '\n'; + } } \ No newline at end of file