diff options
author | Thiago Macieira <thiago.macieira@intel.com> | 2012-12-20 15:28:18 -0800 |
---|---|---|
committer | Thiago Macieira <thiago.macieira@intel.com> | 2013-01-02 14:05:33 +0100 |
commit | 9cf144ec106e4aee7c5ab208a3295aaa9ad69f0b (patch) | |
tree | 2af8010331862911384f3acf155a2e5a77289961 | |
parent | 61ae33bfe84a8daf26bfead78d4a7a4ff488f9d6 (diff) |
Accept the -print-env and -list-versions commands only on "qtchooser"
Do not accept those options when called with another tool, especially
when using argv[0]. This allows the target tools to have options with
identical names.
Change-Id: I7c2881100ccc10c73ddfc5d15dcc7f89555392cf
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
-rw-r--r-- | src/qtchooser/Makefile | 7 | ||||
-rw-r--r-- | src/qtchooser/main.cpp | 54 | ||||
-rw-r--r-- | tests/auto/qtchooser/tst_qtchooser.cpp | 24 |
3 files changed, 62 insertions, 23 deletions
diff --git a/src/qtchooser/Makefile b/src/qtchooser/Makefile index 7e1598f..fcff0ce 100644 --- a/src/qtchooser/Makefile +++ b/src/qtchooser/Makefile @@ -15,7 +15,7 @@ OBJECTS = main.o TARGET = qtchooser OBJECTS_TEST = main-test.o -TARGET_TEST = qtchooser-test +TARGET_TEST = test/qtchooser first: all check: $(TARGET_TEST) @@ -28,6 +28,7 @@ $(TARGET): $(OBJECTS) $(CXX) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(TARGET_TEST): $(OBJECTS_TEST) + $(MKDIR) test $(CXX) $(LFLAGS) -o $(TARGET_TEST) $(OBJECTS_TEST) clean: @@ -48,10 +49,10 @@ uninstall: ####### Compile main.o: main.cpp - $(CXX) -c $(CXXFLAGS) $(INCPATH) -o main.o main.cpp + $(CXX) -c -Wall -Wextra $(CXXFLAGS) $(INCPATH) -o main.o main.cpp main-test.o: main.cpp - $(CXX) -c -DQTCHOOSER_TEST_MODE -g $(CXXFLAGS) $(INCPATH) -o main-test.o main.cpp + $(CXX) -c -Wall -Wextra -DQTCHOOSER_TEST_MODE -g $(CXXFLAGS) $(INCPATH) -o main-test.o main.cpp ####### Install diff --git a/src/qtchooser/main.cpp b/src/qtchooser/main.cpp index 69750fc..9b7688c 100644 --- a/src/qtchooser/main.cpp +++ b/src/qtchooser/main.cpp @@ -53,6 +53,7 @@ #include <string> #include <vector> +#include <assert.h> #include <errno.h> #include <stdio.h> #include <string.h> @@ -78,6 +79,8 @@ static const char myName[] = "qtchooser" EXE_SUFFIX; static const char *argv0; enum Mode { + Unknown, + PrintHelp, RunTool, ListVersions, PrintEnvironment @@ -326,7 +329,7 @@ static inline bool endsWith(const char *haystack, const char *needle) int main(int argc, char **argv) { // search the environment for defaults - Mode operatingMode = RunTool; + Mode operatingMode = Unknown; argv0 = basename(argv[0]); const char *targetSdk = getenv("QT_SELECT"); const char *targetTool = getenv("QTCHOOSER_RUNTOOL"); @@ -356,10 +359,6 @@ int main(int argc, char **argv) // -run-tool= argument targetTool = arg + strlen("run-tool="); operatingMode = RunTool; - } else if (strcmp(arg, "list-versions") == 0) { - operatingMode = ListVersions; - } else if (beginsWith(arg, "print-env")) { - operatingMode = PrintEnvironment; } else { // not one of our arguments, must be for the target tool break; @@ -380,16 +379,49 @@ int main(int argc, char **argv) haveTargetTool = false; ToolWrapper wrapper; + if (operatingMode == RunTool || haveTargetTool) { + if (!haveTargetTool) { + fprintf(stderr, "%s: no tool selected. Stop.\n", argv0); + return 1; + } + return wrapper.runTool(targetSdk, + targetTool, + argv + optind - 1); + } + + // running qtchooser itself + // check for our arguments + operatingMode = PrintHelp; + for ( ; optind < argc; ++optind) { + char *arg = argv[optind]; + if (*arg == '-') { + ++arg; + if (*arg == '-') + ++arg; + if (strcmp(arg, "list-versions") == 0) { + operatingMode = ListVersions; + } else if (beginsWith(arg, "print-env")) { + operatingMode = PrintEnvironment; + } else if (strcmp(arg, "help") != 0) { + fprintf(stderr, "%s: unknown option: %s\n", argv0, arg - 1); + return 1; + } + } else { + fprintf(stderr, "%s: unknown argument: %s\n", argv0, arg); + return 1; + } + } // dispatch switch (operatingMode) { case RunTool: - if (haveTargetTool) - return wrapper.runTool(targetSdk, - targetTool, - argv + optind - 1); - else - return wrapper.printHelp(); + case Unknown: + // can't happen! + assert(false); + return 127; + + case PrintHelp: + return wrapper.printHelp(); case PrintEnvironment: return wrapper.printEnvironment(targetSdk); diff --git a/tests/auto/qtchooser/tst_qtchooser.cpp b/tests/auto/qtchooser/tst_qtchooser.cpp index 8f11c32..cb697a5 100644 --- a/tests/auto/qtchooser/tst_qtchooser.cpp +++ b/tests/auto/qtchooser/tst_qtchooser.cpp @@ -50,8 +50,10 @@ #ifdef Q_OS_WIN # define LIST_SEP ";" +# define EXE_SUFFIX ".exe" #else # define LIST_SEP ":" +# define EXE_SUFFIX "" #endif #define VERIFY_NORMAL_EXIT(proc) \ @@ -107,12 +109,7 @@ tst_ToolChooser::tst_ToolChooser() pathsWithDefault.prepend(testData + "/default" LIST_SEP); -#ifdef Q_OS_WIN - toolPath = QCoreApplication::applicationDirPath() + "/../../../src/qtchooser/qtchooser-test.exe"; -#else - toolPath = QCoreApplication::applicationDirPath() + "/../../../src/qtchooser/qtchooser-test"; -#endif - + toolPath = QCoreApplication::applicationDirPath() + "/../../../src/qtchooser/test/qtchooser" EXE_SUFFIX; QVERIFY(QFile::exists(toolPath)); } @@ -139,7 +136,7 @@ QString tst_ToolChooser::tempFileName() const void tst_ToolChooser::list() { - QScopedPointer<QProcess> proc(execute(QStringList() << "-list-versions")); + QScopedPointer<QProcess> proc(execute(QStringList() << "-list-versions", testModeEnvironment)); VERIFY_NORMAL_EXIT(proc); QStringList foundVersions; @@ -304,7 +301,7 @@ void tst_ToolChooser::defaultQt() if (withDefault) env.insert("XDG_CONFIG_DIRS", pathsWithDefault); - QScopedPointer<QProcess> proc(execute(QStringList() << "-print-qmake", env)); + QScopedPointer<QProcess> proc(execute(QStringList() << "-run-tool=qmake", env)); QVERIFY(proc); if (withDefault) { QCOMPARE(proc->readAllStandardError().constData(), ""); @@ -338,6 +335,13 @@ void tst_ToolChooser::passArgs_data() QTest::newRow("unknown-opt-qt5") << (QStringList() << "-query" << "-qt5") << (QStringList() << "-query" << "-qt5"); QTest::newRow("non-opt") << (QStringList() << ".") << (QStringList() << "."); QTest::newRow("non-opt-qt5") << (QStringList() << "." << "-qt5") << (QStringList() << "." << "-qt5"); + + // Since we're running a tool with QTCHOOSER_RUNTOOL set, it should not + // swallow the -print-env and -list-versions arguments either. + QTest::newRow("list-versions") << (QStringList() << "-list-versions") << (QStringList() << "-list-versions"); + QTest::newRow("qt5-list-versions") << (QStringList() << "-qt5" << "-list-versions") << (QStringList() << "-list-versions"); + QTest::newRow("print-env") << (QStringList() << "-print-env") << (QStringList() << "-print-env"); + QTest::newRow("qt5-print-env") << (QStringList() << "-qt5" << "-print-env") << (QStringList() << "-print-env"); } void tst_ToolChooser::passArgs() @@ -345,7 +349,9 @@ void tst_ToolChooser::passArgs() QFETCH(QStringList, args); QFETCH(QStringList, expected); - QScopedPointer<QProcess> proc(execute(args)); + QProcessEnvironment env = testModeEnvironment; + env.insert("QTCHOOSER_RUNTOOL", "testtool"); + QScopedPointer<QProcess> proc(execute(args, env)); VERIFY_NORMAL_EXIT(proc); // skip the first line of procstdout, as it contains the tool name |