diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp index b9bbbdbc383f94a1e5442be9b55aa9b2798c56a7..95d4d7ced98ea4774f95c69103e5b00c53ed50f4 100644 --- a/src/plugins/git/gitclient.cpp +++ b/src/plugins/git/gitclient.cpp @@ -1147,8 +1147,9 @@ GitClient::StatusResult GitClient::gitStatus(const QString &workingDirectory, } return StatusFailed; } - // Unchanged? - if (outputText.contains("nothing to commit")) + // Unchanged (output text depending on whether -u was passed) + if (outputText.contains("nothing to commit") + || outputText.contains("nothing added to commit but untracked files present")) return StatusUnchanged; return StatusChanged; } diff --git a/src/plugins/mercurial/mercurialclient.cpp b/src/plugins/mercurial/mercurialclient.cpp index eda48fe909e89c578b0fd278ab961df099e4d372..c798e538822a7b861355910c1b62cfe92d84009d 100644 --- a/src/plugins/mercurial/mercurialclient.cpp +++ b/src/plugins/mercurial/mercurialclient.cpp @@ -121,6 +121,7 @@ bool MercurialClient::executeHgSynchronously(const QString &workingDir, QProcess hgProcess; if (!workingDir.isEmpty()) hgProcess.setWorkingDirectory(workingDir); + MercurialJobRunner::setProcessEnvironment(hgProcess); const MercurialSettings &settings = MercurialPlugin::instance()->settings(); const QString binary = settings.binary(); diff --git a/src/plugins/mercurial/mercurialjobrunner.cpp b/src/plugins/mercurial/mercurialjobrunner.cpp index 17e2ea4f111812c0cd430f67a6572f79cd6cbaf6..54f343c122ddb04a90bd7e453efb0a5dbe7e80aa 100644 --- a/src/plugins/mercurial/mercurialjobrunner.cpp +++ b/src/plugins/mercurial/mercurialjobrunner.cpp @@ -37,6 +37,7 @@ #include <utils/synchronousprocess.h> #include <QtCore/QProcess> +#include <QtCore/QProcessEnvironment> #include <QtCore/QString> #include <QtCore/QDebug> @@ -161,6 +162,16 @@ QString MercurialJobRunner::msgTimeout(int timeoutSeconds) return tr("Timed out after %1s waiting for mercurial process to finish.").arg(timeoutSeconds); } +// Set environment for a hg process to run in locale "C". Note that there appears +// to be a bug in hg that causes special characters to be garbled when running +// in a different language, which seems to be independent from the encoding. +void MercurialJobRunner::setProcessEnvironment(QProcess &p) +{ + QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); + env.insert(QLatin1String("LANG"), QString(QLatin1Char('C'))); + p.setProcessEnvironment(env); +} + void MercurialJobRunner::task(const QSharedPointer<HgTask> &job) { HgTask *taskData = job.data(); @@ -193,7 +204,7 @@ void MercurialJobRunner::task(const QSharedPointer<HgTask> &job) QProcess hgProcess; hgProcess.setWorkingDirectory(taskData->repositoryRoot()); - + MercurialJobRunner::setProcessEnvironment(hgProcess); hgProcess.start(binary, args); diff --git a/src/plugins/mercurial/mercurialjobrunner.h b/src/plugins/mercurial/mercurialjobrunner.h index 8d124e2457e083b13ba2f548bc1b38dff4d76811..df6f1f79d632b214cdc74e0d9694f6131eff4410 100644 --- a/src/plugins/mercurial/mercurialjobrunner.h +++ b/src/plugins/mercurial/mercurialjobrunner.h @@ -39,6 +39,10 @@ #include <QtCore/QVariant> #include <QtCore/QString> +QT_BEGIN_NAMESPACE +class QProcess; +QT_END_NAMESPACE + namespace VCSBase { class VCSBaseEditor; } @@ -95,6 +99,9 @@ public: static QString msgStartFailed(const QString &binary, const QString &why); static QString msgTimeout(int timeoutSeconds); + // Set environment for a hg process to run in locale "C" + static void setProcessEnvironment(QProcess &p); + protected: void run();