logic: implemented handling of non-ASCII characters in Gradle and Maven project paths

* also: fixed loading sqlite database from path with non-ascii characters
This commit is contained in:
mlangkabel
2018-02-09 15:54:28 +01:00
parent 333fc7eea2
commit 70d619a173
7 changed files with 51 additions and 25 deletions
+1 -1
View File
@@ -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));
}
@@ -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;");
@@ -27,7 +27,7 @@ std::vector<FilePath> 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())
+6 -6
View File
@@ -18,14 +18,14 @@ namespace utility
std::set<QProcess*> 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()));
}
{
+4 -3
View File
@@ -6,14 +6,15 @@
#include <string>
#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();
+34 -10
View File
@@ -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> 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<FilePath> 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<std::string> uncheckedDirectories;
std::set<std::wstring> uncheckedDirectories;
{
std::shared_ptr<JavaEnvironment> 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<FilePath> directories;
for (const std::string& uncheckedDirectory: uncheckedDirectories)
for (const std::wstring& uncheckedDirectory: uncheckedDirectories)
{
FilePath uncheckedDirectoryPath(uncheckedDirectory);
if (uncheckedDirectoryPath.exists())
+3 -3
View File
@@ -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<TextAccess> outputAccess = TextAccess::createFromString(utility::executeProcessUntilNoOutput(
"\"" + mavenPath.str() + "\" help:effective-pom",
projectDirectoryPath.str(),
projectDirectoryPath,
60000
));