From 70d619a173394be64700360d601c6363b38a304b Mon Sep 17 00:00:00 2001 From: mlangkabel Date: Fri, 9 Feb 2018 15:54:28 +0100 Subject: [PATCH] logic: implemented handling of non-ASCII characters in Gradle and Maven project paths * also: fixed loading sqlite database from path with non-ascii characters --- src/lib/data/indexer/TaskBuildIndex.cpp | 2 +- src/lib/data/storage/sqlite/SqliteStorage.cpp | 3 +- .../cxx_header/CxxVs15HeaderPathDetector.cpp | 2 +- src/lib_gui/utility/utilityApp.cpp | 12 ++--- src/lib_gui/utility/utilityApp.h | 7 +-- src/lib_java/utility/utilityGradle.cpp | 44 ++++++++++++++----- src/lib_java/utility/utilityMaven.cpp | 6 +-- 7 files changed, 51 insertions(+), 25 deletions(-) diff --git a/src/lib/data/indexer/TaskBuildIndex.cpp b/src/lib/data/indexer/TaskBuildIndex.cpp index 977ece48..b86e1272 100644 --- a/src/lib/data/indexer/TaskBuildIndex.cpp +++ b/src/lib/data/indexer/TaskBuildIndex.cpp @@ -199,7 +199,7 @@ void TaskBuildIndex::runIndexerProcess(int processId, const std::string& logFile int result = 1; while (result != 0 && !m_interrupted) { - result = utility::executeProcessAndGetExitCode(command.c_str(), "", -1); + result = utility::executeProcessAndGetExitCode(command.c_str(), FilePath(), -1); LOG_INFO_STREAM(<< "Indexer process " << processId << " returned with " + std::to_string(result)); } diff --git a/src/lib/data/storage/sqlite/SqliteStorage.cpp b/src/lib/data/storage/sqlite/SqliteStorage.cpp index 067bb658..7c34fd2f 100644 --- a/src/lib/data/storage/sqlite/SqliteStorage.cpp +++ b/src/lib/data/storage/sqlite/SqliteStorage.cpp @@ -2,11 +2,12 @@ #include "utility/logging/logging.h" #include "utility/TimeStamp.h" +#include "utility/utilityString.h" SqliteStorage::SqliteStorage(const FilePath& dbFilePath) : m_dbFilePath(dbFilePath.getCanonical()) { - m_database.open(m_dbFilePath.str().c_str()); + m_database.open(utility::encodeToUtf8(m_dbFilePath.wstr()).c_str()); executeStatement("PRAGMA foreign_keys=ON;"); diff --git a/src/lib_gui/utility/path_detector/cxx_header/CxxVs15HeaderPathDetector.cpp b/src/lib_gui/utility/path_detector/cxx_header/CxxVs15HeaderPathDetector.cpp index ced95921..be88a7bf 100644 --- a/src/lib_gui/utility/path_detector/cxx_header/CxxVs15HeaderPathDetector.cpp +++ b/src/lib_gui/utility/path_detector/cxx_header/CxxVs15HeaderPathDetector.cpp @@ -27,7 +27,7 @@ std::vector CxxVs15HeaderPathDetector::getPaths() const { const std::string command = "\"" + expandedPaths[0].str() + "\" -latest -property installationPath"; const std::string command2 = "\"C:/Program Files (x86)/Microsoft Visual Studio/Installer/vswhere.exe\""; - const std::string output = utility::executeProcess(command, "", 10000); + const std::string output = utility::executeProcess(command, FilePath(), 10000); const FilePath vsInstallPath(output); if (vsInstallPath.exists()) diff --git a/src/lib_gui/utility/utilityApp.cpp b/src/lib_gui/utility/utilityApp.cpp index cb4c0752..0fb6bd02 100644 --- a/src/lib_gui/utility/utilityApp.cpp +++ b/src/lib_gui/utility/utilityApp.cpp @@ -18,14 +18,14 @@ namespace utility std::set s_runningProcesses; } -std::string utility::executeProcess(const std::string& command, const std::string& workingDirectory, const int timeout) +std::string utility::executeProcess(const std::string& command, const FilePath& workingDirectory, const int timeout) { QProcess process; process.setProcessChannelMode(QProcess::MergedChannels); if (!workingDirectory.empty()) { - process.setWorkingDirectory(workingDirectory.c_str()); + process.setWorkingDirectory(QString::fromStdWString(workingDirectory.wstr())); } { @@ -49,14 +49,14 @@ std::string utility::executeProcess(const std::string& command, const std::strin return processoutput; } -std::string utility::executeProcessUntilNoOutput(const std::string& command, const std::string& workingDirectory, const int waitTime) +std::string utility::executeProcessUntilNoOutput(const std::string& command, const FilePath& workingDirectory, const int waitTime) { QProcess process; process.setProcessChannelMode(QProcess::MergedChannels); if (!workingDirectory.empty()) { - process.setWorkingDirectory(workingDirectory.c_str()); + process.setWorkingDirectory(QString::fromStdWString(workingDirectory.wstr())); } { @@ -92,13 +92,13 @@ std::string utility::executeProcessUntilNoOutput(const std::string& command, con return processoutput; } -int utility::executeProcessAndGetExitCode(const std::string& command, const std::string& workingDirectory, const int timeout) +int utility::executeProcessAndGetExitCode(const std::string& command, const FilePath& workingDirectory, const int timeout) { QProcess process; if (!workingDirectory.empty()) { - process.setWorkingDirectory(workingDirectory.c_str()); + process.setWorkingDirectory(QString::fromStdWString(workingDirectory.wstr())); } { diff --git a/src/lib_gui/utility/utilityApp.h b/src/lib_gui/utility/utilityApp.h index dab8c521..051a06a2 100644 --- a/src/lib_gui/utility/utilityApp.h +++ b/src/lib_gui/utility/utilityApp.h @@ -6,14 +6,15 @@ #include #include "utility/OsType.h" +#include "utility/file/FilePath.h" class License; namespace utility { - std::string executeProcess(const std::string& command, const std::string& workingDirectory = "", const int timeout = 30000); - std::string executeProcessUntilNoOutput(const std::string& command, const std::string& workingDirectory, int waitTime = 10000); - int executeProcessAndGetExitCode(const std::string& command, const std::string& workingDirectory = "", const int timeout = 30000); + std::string executeProcess(const std::string& command, const FilePath& workingDirectory = FilePath(), const int timeout = 30000); + std::string executeProcessUntilNoOutput(const std::string& command, const FilePath& workingDirectory, int waitTime = 10000); + int executeProcessAndGetExitCode(const std::string& command, const FilePath& workingDirectory = FilePath(), const int timeout = 30000); void killRunningProcesses(); diff --git a/src/lib_java/utility/utilityGradle.cpp b/src/lib_java/utility/utilityGradle.cpp index 552ffde9..46657e18 100644 --- a/src/lib_java/utility/utilityGradle.cpp +++ b/src/lib_java/utility/utilityGradle.cpp @@ -32,17 +32,29 @@ namespace utility { bool gradleCopyDependencies(const FilePath& projectDirectoryPath, const FilePath& outputDirectoryPath, bool addTestDependencies) { - const std::string gradleInitScriptPath = ResourcePaths::getJavaPath().str() + "gradle/init.gradle"; + const FilePath gradleInitScriptPath = ResourcePaths::getJavaPath().concatenate(L"gradle/init.gradle"); setJavaHomeVariableIfNotExists(); utility::prepareJavaEnvironment(); std::shared_ptr javaEnvironment = JavaEnvironmentFactory::getInstance()->createEnvironment(); - bool success = javaEnvironment->callStaticVoidMethod("com/sourcetrail/gradle/InfoRetriever", "copyCompileLibs", projectDirectoryPath.str(), gradleInitScriptPath, outputDirectoryPath.str()); + bool success = javaEnvironment->callStaticVoidMethod( + "com/sourcetrail/gradle/InfoRetriever", + "copyCompileLibs", + utility::encodeToUtf8(projectDirectoryPath.wstr()), + utility::encodeToUtf8(gradleInitScriptPath.wstr()), + utility::encodeToUtf8(outputDirectoryPath.wstr()) + ); if (success && addTestDependencies) { - success = javaEnvironment->callStaticVoidMethod("com/sourcetrail/gradle/InfoRetriever", "copyTestCompileLibs", projectDirectoryPath.str(), gradleInitScriptPath, outputDirectoryPath.str()); + success = javaEnvironment->callStaticVoidMethod( + "com/sourcetrail/gradle/InfoRetriever", + "copyTestCompileLibs", + utility::encodeToUtf8(projectDirectoryPath.wstr()), + utility::encodeToUtf8(gradleInitScriptPath.wstr()), + utility::encodeToUtf8(outputDirectoryPath.wstr()) + ); } return success; @@ -50,17 +62,23 @@ namespace utility std::vector gradleGetAllSourceDirectories(const FilePath& projectDirectoryPath, bool addTestDirectories) { - const std::string gradleInitScriptPath = ResourcePaths::getJavaPath().str() + "gradle/init.gradle"; + const FilePath gradleInitScriptPath = ResourcePaths::getJavaPath().concatenate(L"gradle/init.gradle"); setJavaHomeVariableIfNotExists(); utility::prepareJavaEnvironment(); - std::set uncheckedDirectories; + std::set uncheckedDirectories; { std::shared_ptr javaEnvironment = JavaEnvironmentFactory::getInstance()->createEnvironment(); { std::string output = ""; - javaEnvironment->callStaticStringMethod("com/sourcetrail/gradle/InfoRetriever", "getMainSrcDirs", output, projectDirectoryPath.str(), gradleInitScriptPath); + javaEnvironment->callStaticStringMethod( + "com/sourcetrail/gradle/InfoRetriever", + "getMainSrcDirs", + output, + utility::encodeToUtf8(projectDirectoryPath.wstr()), + utility::encodeToUtf8(gradleInitScriptPath.wstr()) + ); if (utility::isPrefix("[ERROR]", utility::trim(output))) { @@ -75,14 +93,20 @@ namespace utility for (const std::string mainSrcDir : utility::splitToVector(output, ";")) { - uncheckedDirectories.insert(mainSrcDir); + uncheckedDirectories.insert(utility::decodeFromUtf8(mainSrcDir)); } } if (addTestDirectories) { std::string output = ""; - javaEnvironment->callStaticStringMethod("com/sourcetrail/gradle/InfoRetriever", "getTestSrcDirs", output, projectDirectoryPath.str(), gradleInitScriptPath); + javaEnvironment->callStaticStringMethod( + "com/sourcetrail/gradle/InfoRetriever", + "getTestSrcDirs", + output, + utility::encodeToUtf8(projectDirectoryPath.wstr()), + utility::encodeToUtf8(gradleInitScriptPath.wstr()) + ); if (utility::isPrefix("[ERROR]", utility::trim(output))) { @@ -97,13 +121,13 @@ namespace utility for (const std::string testSrcDir : utility::splitToVector(output, ";")) { - uncheckedDirectories.insert(testSrcDir); + uncheckedDirectories.insert(utility::decodeFromUtf8(testSrcDir)); } } } std::vector directories; - for (const std::string& uncheckedDirectory: uncheckedDirectories) + for (const std::wstring& uncheckedDirectory: uncheckedDirectories) { FilePath uncheckedDirectoryPath(uncheckedDirectory); if (uncheckedDirectoryPath.exists()) diff --git a/src/lib_java/utility/utilityMaven.cpp b/src/lib_java/utility/utilityMaven.cpp index 1b1cd58f..886e5ffd 100644 --- a/src/lib_java/utility/utilityMaven.cpp +++ b/src/lib_java/utility/utilityMaven.cpp @@ -68,7 +68,7 @@ namespace utility const std::string output = utility::executeProcessUntilNoOutput( "\"" + mavenPath.str() + "\" generate-sources", - projectDirectoryPath.str(), + projectDirectoryPath, 60000 ); return !output.empty(); @@ -80,7 +80,7 @@ namespace utility const std::string output = utility::executeProcessUntilNoOutput( "\"" + mavenPath.str() + "\" dependency:copy-dependencies -DoutputDirectory=" + outputDirectoryPath.str(), - projectDirectoryPath.str(), + projectDirectoryPath, 60000 ); @@ -107,7 +107,7 @@ namespace utility std::shared_ptr outputAccess = TextAccess::createFromString(utility::executeProcessUntilNoOutput( "\"" + mavenPath.str() + "\" help:effective-pom", - projectDirectoryPath.str(), + projectDirectoryPath, 60000 ));