summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThiago Macieira <thiago.macieira@intel.com>2012-12-20 15:28:18 -0800
committerThiago Macieira <thiago.macieira@intel.com>2013-01-02 14:05:33 +0100
commit9cf144ec106e4aee7c5ab208a3295aaa9ad69f0b (patch)
tree2af8010331862911384f3acf155a2e5a77289961
parent61ae33bfe84a8daf26bfead78d4a7a4ff488f9d6 (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/Makefile7
-rw-r--r--src/qtchooser/main.cpp54
-rw-r--r--tests/auto/qtchooser/tst_qtchooser.cpp24
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