VCS: Further reduce QTextCodec dependency

Use the new Utils::TextEncoding (a thin wrapper containing a codec's name)
instead of a codec itself.

Change-Id: I29d61c9884b7e35dc59d8123e697c63f6b748caa
Reviewed-by: André Hartmann <aha_1980@gmx.de>
Reviewed-by: Orgad Shaneh <orgads@gmail.com>
This commit is contained in:
hjk
2025-06-12 15:35:42 +02:00
parent bd788ae034
commit 5373aa1d48
26 changed files with 212 additions and 169 deletions

View File

@@ -1803,6 +1803,11 @@ void Process::setCodec(const TextCodec &codec)
d->m_stdErrCodec = codec; d->m_stdErrCodec = codec;
} }
void Process::setEncoding(const TextEncoding &encoding)
{
setCodec(TextCodec::codecForName(encoding));
}
void Process::setUtf8Codec() void Process::setUtf8Codec()
{ {
d->m_stdOutCodec = TextCodec::utf8(); d->m_stdOutCodec = TextCodec::utf8();

View File

@@ -27,6 +27,7 @@ class DeviceProcessHooks;
class ProcessInterface; class ProcessInterface;
class ProcessResultData; class ProcessResultData;
class ProcessRunData; class ProcessRunData;
class TextEncoding;
class QTCREATOR_UTILS_EXPORT Process final : public QObject class QTCREATOR_UTILS_EXPORT Process final : public QObject
{ {
@@ -144,6 +145,7 @@ public:
EventLoopMode eventLoopMode = EventLoopMode::Off); EventLoopMode eventLoopMode = EventLoopMode::Off);
void setCodec(const TextCodec &codec); // for stdOut and stdErr void setCodec(const TextCodec &codec); // for stdOut and stdErr
void setEncoding(const TextEncoding &encoding); // for stdOut and stdErr
void setUtf8Codec(); // for stdOut and stdErr void setUtf8Codec(); // for stdOut and stdErr
void setUtf8StdOutCodec(); // for stdOut, stdErr uses executable.processStdErrCodec() void setUtf8StdOutCodec(); // for stdOut, stdErr uses executable.processStdErrCodec()

View File

@@ -11,6 +11,8 @@ namespace Utils {
// TextEncoding // TextEncoding
TextEncoding::TextEncoding() = default;
TextEncoding::TextEncoding(const QByteArray &name) TextEncoding::TextEncoding(const QByteArray &name)
: m_name(name) : m_name(name)
{} {}
@@ -19,6 +21,20 @@ TextEncoding::TextEncoding(QStringConverter::Encoding encoding)
: m_name(QStringConverter::nameForEncoding(encoding)) : m_name(QStringConverter::nameForEncoding(encoding))
{} {}
bool TextEncoding::isValid() const
{
return !m_name.isEmpty();
}
bool operator==(const TextEncoding &left, const TextEncoding &right)
{
return left.name() == right.name();
}
bool operator!=(const TextEncoding &left, const TextEncoding &right)
{
return left.name() != right.name();
}
// TextCodec // TextCodec

View File

@@ -17,13 +17,19 @@ namespace Utils {
class QTCREATOR_UTILS_EXPORT TextEncoding class QTCREATOR_UTILS_EXPORT TextEncoding
{ {
public: public:
TextEncoding();
TextEncoding(const QByteArray &name); TextEncoding(const QByteArray &name);
TextEncoding(QStringEncoder::Encoding encoding); TextEncoding(QStringEncoder::Encoding encoding);
operator QByteArray() const { return m_name; } operator QByteArray() const { return m_name; }
QByteArray name() const { return m_name; } QByteArray name() const { return m_name; }
bool isValid() const;
private: private:
QTCREATOR_UTILS_EXPORT friend bool operator==(const TextEncoding &left, const TextEncoding &right);
QTCREATOR_UTILS_EXPORT friend bool operator!=(const TextEncoding &left, const TextEncoding &right);
QByteArray m_name; QByteArray m_name;
}; };

View File

@@ -234,12 +234,12 @@ private:
FilePath ccViewRoot(const FilePath &directory) const; FilePath ccViewRoot(const FilePath &directory) const;
FilePath findTopLevel(const FilePath &directory) const; FilePath findTopLevel(const FilePath &directory) const;
IEditor *showOutputInEditor(const QString& title, const QString &output, Id id, IEditor *showOutputInEditor(const QString& title, const QString &output, Id id,
const FilePath &source, const TextCodec &codec) const; const FilePath &source, const TextEncoding &encoding) const;
CommandResult runCleartoolProc(const FilePath &workingDir, CommandResult runCleartoolProc(const FilePath &workingDir,
const QStringList &arguments) const; const QStringList &arguments) const;
CommandResult runCleartool(const FilePath &workingDir, const QStringList &arguments, CommandResult runCleartool(const FilePath &workingDir, const QStringList &arguments,
VcsBase::RunFlags flags = VcsBase::RunFlags::None, VcsBase::RunFlags flags = VcsBase::RunFlags::None,
const TextCodec &codec = {}, int timeoutMultiplier = 1) const; const TextEncoding &encoding = {}, int timeoutMultiplier = 1) const;
static void sync(QPromise<void> &promise, FilePaths files); static void sync(QPromise<void> &promise, FilePaths files);
void history(const FilePath &workingDir, void history(const FilePath &workingDir,
@@ -256,7 +256,7 @@ private:
QString diffExternal(QString file1, QString file2 = QString(), bool keep = false); QString diffExternal(QString file1, QString file2 = QString(), bool keep = false);
QString getFile(const QString &nativeFile, const QString &prefix); QString getFile(const QString &nativeFile, const QString &prefix);
QString runExtDiff(const FilePath &workingDir, const QStringList &arguments, int timeOutS, QString runExtDiff(const FilePath &workingDir, const QStringList &arguments, int timeOutS,
const TextCodec &outputCodec = {}); const TextEncoding &encoding = {});
static FilePath getDriveLetterOfPath(FilePath directory); static FilePath getDriveLetterOfPath(FilePath directory);
FileStatus::Status getFileStatus(const FilePath &fileName) const; FileStatus::Status getFileStatus(const FilePath &fileName) const;
@@ -1181,7 +1181,7 @@ void ClearCasePluginPrivate::ccDiffWithPred(const FilePath &workingDir, const QS
if (Constants::debug) if (Constants::debug)
qDebug() << Q_FUNC_INFO << files; qDebug() << Q_FUNC_INFO << files;
const FilePath source = VcsBaseEditor::getSource(workingDir, files); const FilePath source = VcsBaseEditor::getSource(workingDir, files);
const TextCodec codec = source.isEmpty() ? TextCodec() : VcsBaseEditor::getCodec(source); const TextEncoding encoding = source.isEmpty() ? TextEncoding() : VcsBaseEditor::getEncoding(source);
if ((m_settings.diffType == GraphicalDiff) && (files.count() == 1)) { if ((m_settings.diffType == GraphicalDiff) && (files.count() == 1)) {
const QString file = files.first(); const QString file = files.first();
@@ -1221,7 +1221,7 @@ void ClearCasePluginPrivate::ccDiffWithPred(const FilePath &workingDir, const QS
diffname = QDir::toNativeSeparators(files.first()); diffname = QDir::toNativeSeparators(files.first());
} }
const QString title = QString::fromLatin1("cc diff %1").arg(diffname); const QString title = QString::fromLatin1("cc diff %1").arg(diffname);
IEditor *editor = showOutputInEditor(title, result, DIFF_EDITOR_ID, source, codec); IEditor *editor = showOutputInEditor(title, result, DIFF_EDITOR_ID, source, encoding);
setWorkingDirectory(editor, workingDir); setWorkingDirectory(editor, workingDir);
VcsBaseEditor::tagEditor(editor, tag); VcsBaseEditor::tagEditor(editor, tag);
auto diffEditorWidget = qobject_cast<ClearCaseEditorWidget *>(editor->widget()); auto diffEditorWidget = qobject_cast<ClearCaseEditorWidget *>(editor->widget());
@@ -1438,7 +1438,7 @@ void ClearCasePluginPrivate::history(const FilePath &workingDir,
const QStringList &files, const QStringList &files,
bool enableAnnotationContextMenu) bool enableAnnotationContextMenu)
{ {
const TextCodec codec = VcsBaseEditor::getCodec(workingDir, files); const TextEncoding encoding = VcsBaseEditor::getEncoding(workingDir, files);
// no need for temp file // no need for temp file
QStringList args(QLatin1String("lshistory")); QStringList args(QLatin1String("lshistory"));
if (m_settings.historyCount > 0) if (m_settings.historyCount > 0)
@@ -1448,7 +1448,7 @@ void ClearCasePluginPrivate::history(const FilePath &workingDir,
for (const QString &file : files) for (const QString &file : files)
args.append(QDir::toNativeSeparators(file)); args.append(QDir::toNativeSeparators(file));
const CommandResult result = runCleartool(workingDir, args, RunFlags::None, codec); const CommandResult result = runCleartool(workingDir, args, RunFlags::None, encoding);
if (result.result() != ProcessResult::FinishedWithSuccess) if (result.result() != ProcessResult::FinishedWithSuccess)
return; return;
@@ -1465,7 +1465,7 @@ void ClearCasePluginPrivate::history(const FilePath &workingDir,
const QString title = QString::fromLatin1("cc history %1").arg(id); const QString title = QString::fromLatin1("cc history %1").arg(id);
const FilePath source = VcsBaseEditor::getSource(workingDir, files); const FilePath source = VcsBaseEditor::getSource(workingDir, files);
IEditor *newEditor = showOutputInEditor(title, result.cleanedStdOut(), IEditor *newEditor = showOutputInEditor(title, result.cleanedStdOut(),
LOG_EDITOR_ID, source, codec); LOG_EDITOR_ID, source, encoding);
VcsBaseEditor::tagEditor(newEditor, tag); VcsBaseEditor::tagEditor(newEditor, tag);
if (enableAnnotationContextMenu) if (enableAnnotationContextMenu)
VcsBaseEditor::getVcsBaseEditor(newEditor)->setFileLogAnnotateEnabled(true); VcsBaseEditor::getVcsBaseEditor(newEditor)->setFileLogAnnotateEnabled(true);
@@ -1528,7 +1528,7 @@ void ClearCasePluginPrivate::vcsAnnotateHelper(const FilePath &workingDir, const
qDebug() << Q_FUNC_INFO << file; qDebug() << Q_FUNC_INFO << file;
// FIXME: Should this be something like workingDir.resolvePath(file) ? // FIXME: Should this be something like workingDir.resolvePath(file) ?
const TextCodec codec = VcsBaseEditor::getCodec(FilePath::fromString(file)); const TextEncoding encoding = VcsBaseEditor::getEncoding(FilePath::fromString(file));
// Determine id // Determine id
QString id = file; QString id = file;
@@ -1541,7 +1541,7 @@ void ClearCasePluginPrivate::vcsAnnotateHelper(const FilePath &workingDir, const
args << QLatin1String("-out") << QLatin1String("-"); args << QLatin1String("-out") << QLatin1String("-");
args.append(QDir::toNativeSeparators(id)); args.append(QDir::toNativeSeparators(id));
const CommandResult result = runCleartool(workingDir, args, RunFlags::None, codec); const CommandResult result = runCleartool(workingDir, args, RunFlags::None, encoding);
if (result.result() != ProcessResult::FinishedWithSuccess) if (result.result() != ProcessResult::FinishedWithSuccess)
return; return;
@@ -1568,7 +1568,7 @@ void ClearCasePluginPrivate::vcsAnnotateHelper(const FilePath &workingDir, const
EditorManager::activateEditor(editor); EditorManager::activateEditor(editor);
} else { } else {
const QString title = QString::fromLatin1("cc annotate %1").arg(id); const QString title = QString::fromLatin1("cc annotate %1").arg(id);
IEditor *newEditor = showOutputInEditor(title, res, ANNOTATION_EDITOR_ID, source, codec); IEditor *newEditor = showOutputInEditor(title, res, ANNOTATION_EDITOR_ID, source, encoding);
VcsBaseEditor::tagEditor(newEditor, tag); VcsBaseEditor::tagEditor(newEditor, tag);
VcsBaseEditor::gotoLineOfEditor(newEditor, lineNumber); VcsBaseEditor::gotoLineOfEditor(newEditor, lineNumber);
} }
@@ -1587,8 +1587,8 @@ void ClearCasePluginPrivate::vcsDescribe(const FilePath &source, const QString &
const FilePath relPath = source.relativePathFromDir(topLevel); const FilePath relPath = source.relativePathFromDir(topLevel);
const QString id = QString::fromLatin1("%1@@%2").arg(relPath.toUserOutput(), changeNr); const QString id = QString::fromLatin1("%1@@%2").arg(relPath.toUserOutput(), changeNr);
const TextCodec codec = VcsBaseEditor::getCodec(source); const TextEncoding encoding = VcsBaseEditor::getEncoding(source);
const CommandResult result = runCleartool(topLevel, {"describe", id}, RunFlags::None, codec); const CommandResult result = runCleartool(topLevel, {"describe", id}, RunFlags::None, encoding);
description = result.cleanedStdOut(); description = result.cleanedStdOut();
if (m_settings.extDiffAvailable) if (m_settings.extDiffAvailable)
description += diffExternal(id); description += diffExternal(id);
@@ -1601,7 +1601,7 @@ void ClearCasePluginPrivate::vcsDescribe(const FilePath &source, const QString &
EditorManager::activateEditor(editor); EditorManager::activateEditor(editor);
} else { } else {
const QString title = QString::fromLatin1("cc describe %1").arg(id); const QString title = QString::fromLatin1("cc describe %1").arg(id);
IEditor *newEditor = showOutputInEditor(title, description, DIFF_EDITOR_ID, source, codec); IEditor *newEditor = showOutputInEditor(title, description, DIFF_EDITOR_ID, source, encoding);
VcsBaseEditor::tagEditor(newEditor, tag); VcsBaseEditor::tagEditor(newEditor, tag);
} }
} }
@@ -1625,7 +1625,7 @@ CommandResult ClearCasePluginPrivate::runCleartoolProc(const FilePath &workingDi
CommandResult ClearCasePluginPrivate::runCleartool(const FilePath &workingDir, CommandResult ClearCasePluginPrivate::runCleartool(const FilePath &workingDir,
const QStringList &arguments, const QStringList &arguments,
RunFlags flags, RunFlags flags,
const TextCodec &codec, const TextEncoding &encoding,
int timeoutMultiplier) const int timeoutMultiplier) const
{ {
if (m_settings.ccBinaryPath.isEmpty()) if (m_settings.ccBinaryPath.isEmpty())
@@ -1633,16 +1633,16 @@ CommandResult ClearCasePluginPrivate::runCleartool(const FilePath &workingDir,
const int timeoutS = m_settings.timeOutS * timeoutMultiplier; const int timeoutS = m_settings.timeOutS * timeoutMultiplier;
return VcsCommand::runBlocking(workingDir, Environment::systemEnvironment(), return VcsCommand::runBlocking(workingDir, Environment::systemEnvironment(),
{m_settings.ccBinaryPath, arguments}, flags, timeoutS, codec); {m_settings.ccBinaryPath, arguments}, flags, timeoutS, encoding);
} }
IEditor *ClearCasePluginPrivate::showOutputInEditor(const QString& title, const QString &output, IEditor *ClearCasePluginPrivate::showOutputInEditor(const QString& title, const QString &output,
Id id, const FilePath &source, Id id, const FilePath &source,
const TextCodec &codec) const const TextEncoding &encoding) const
{ {
if (Constants::debug) if (Constants::debug)
qDebug() << "ClearCasePlugin::showOutputInEditor" << title << id.name() qDebug() << "ClearCasePlugin::showOutputInEditor" << title << id.name()
<< "Size= " << output.size() << codec.displayName(); << "Size= " << output.size() << encoding.name();
QString s = title; QString s = title;
IEditor *editor = EditorManager::openEditorWithContents(id, &s, output.toUtf8()); IEditor *editor = EditorManager::openEditorWithContents(id, &s, output.toUtf8());
auto e = qobject_cast<ClearCaseEditorWidget*>(editor->widget()); auto e = qobject_cast<ClearCaseEditorWidget*>(editor->widget());
@@ -1655,8 +1655,8 @@ IEditor *ClearCasePluginPrivate::showOutputInEditor(const QString& title, const
e->textDocument()->setFallbackSaveAsFileName(s); e->textDocument()->setFallbackSaveAsFileName(s);
if (!source.isEmpty()) if (!source.isEmpty())
e->setSource(source); e->setSource(source);
if (codec.isValid()) if (encoding.isValid())
e->setCodec(codec); e->setEncoding(encoding);
return editor; return editor;
} }
@@ -2202,7 +2202,7 @@ QString ClearCasePluginPrivate::getFile(const QString &nativeFile, const QString
// runs external (GNU) diff, and returns the stdout result // runs external (GNU) diff, and returns the stdout result
QString ClearCasePluginPrivate::diffExternal(QString file1, QString file2, bool keep) QString ClearCasePluginPrivate::diffExternal(QString file1, QString file2, bool keep)
{ {
const TextCodec codec = VcsBaseEditor::getCodec(FilePath::fromString(file1)); const TextEncoding encoding = VcsBaseEditor::getEncoding(FilePath::fromString(file1));
// if file2 is empty, we should compare to predecessor // if file2 is empty, we should compare to predecessor
if (file2.isEmpty()) { if (file2.isEmpty()) {
@@ -2234,7 +2234,7 @@ QString ClearCasePluginPrivate::diffExternal(QString file1, QString file2, bool
} else { } else {
args << file2; args << file2;
} }
const QString diffResponse = runExtDiff(m_topLevel, args, m_settings.timeOutS, codec); const QString diffResponse = runExtDiff(m_topLevel, args, m_settings.timeOutS, encoding);
if (!keep && !tempFile1.isEmpty()) { if (!keep && !tempFile1.isEmpty()) {
QFile::remove(tempFile1); QFile::remove(tempFile1);
QFileInfo(tempFile1).dir().rmpath(QLatin1String(".")); QFileInfo(tempFile1).dir().rmpath(QLatin1String("."));
@@ -2266,11 +2266,11 @@ void ClearCasePluginPrivate::diffGraphical(const QString &file1, const QString &
} }
QString ClearCasePluginPrivate::runExtDiff(const FilePath &workingDir, const QStringList &arguments, QString ClearCasePluginPrivate::runExtDiff(const FilePath &workingDir, const QStringList &arguments,
int timeOutS, const TextCodec &outputCodec) int timeOutS, const TextEncoding &encoding)
{ {
Process process; Process process;
process.setWorkingDirectory(workingDir); process.setWorkingDirectory(workingDir);
process.setCodec(outputCodec.isValid() ? outputCodec : TextCodec::utf8()); process.setEncoding(encoding.isValid() ? encoding : TextEncoding(QStringConverter::Utf8));
process.setCommand({"diff", {m_settings.diffArgs.split(' ', Qt::SkipEmptyParts), arguments}}); process.setCommand({"diff", {m_settings.diffArgs.split(' ', Qt::SkipEmptyParts), arguments}});
process.runBlocking(seconds(timeOutS), EventLoopMode::On); process.runBlocking(seconds(timeOutS), EventLoopMode::On);
if (process.result() != ProcessResult::FinishedWithSuccess) if (process.result() != ProcessResult::FinishedWithSuccess)

View File

@@ -138,6 +138,16 @@ void BaseTextDocument::setCodec(const TextCodec &codec)
d->m_format.setCodec(codec); d->m_format.setCodec(codec);
} }
void BaseTextDocument::setEncoding(const TextEncoding &encoding)
{
setCodec(TextCodec::codecForName(encoding));
}
TextEncoding BaseTextDocument::encoding() const
{
return codec().name();
}
bool BaseTextDocument::supportsCodec(const QByteArray &) const bool BaseTextDocument::supportsCodec(const QByteArray &) const
{ {
return true; return true;

View File

@@ -24,6 +24,8 @@ public:
Utils::TextFileFormat format() const; Utils::TextFileFormat format() const;
Utils::TextCodec codec() const; Utils::TextCodec codec() const;
void setCodec(const Utils::TextCodec &codec); void setCodec(const Utils::TextCodec &codec);
Utils::TextEncoding encoding() const;
void setEncoding(const Utils::TextEncoding &encoding);
virtual bool supportsCodec(const QByteArray &) const; virtual bool supportsCodec(const QByteArray &) const;
void switchUtf8Bom(); void switchUtf8Bom();
bool supportsUtf8Bom() const; bool supportsUtf8Bom() const;

View File

@@ -231,10 +231,10 @@ private:
bool isCommitEditorOpen() const; bool isCommitEditorOpen() const;
Core::IEditor *showOutputInEditor(const QString& title, const QString &output, Core::IEditor *showOutputInEditor(const QString& title, const QString &output,
Id id, const FilePath &source, const TextCodec &codec); Id id, const FilePath &source, const TextEncoding &codec);
CommandResult runCvs(const FilePath &workingDirectory, const QStringList &arguments, CommandResult runCvs(const FilePath &workingDirectory, const QStringList &arguments,
RunFlags flags = RunFlags::None, const TextCodec &outputCodec = {}, RunFlags flags = RunFlags::None, const TextEncoding &outputCodec = {},
int timeoutMultiplier = 1) const; int timeoutMultiplier = 1) const;
void annotate(const FilePath &workingDir, const QString &file, void annotate(const FilePath &workingDir, const QString &file,
@@ -950,14 +950,14 @@ void CvsPluginPrivate::filelog(const FilePath &workingDir,
const QString &file, const QString &file,
bool enableAnnotationContextMenu) bool enableAnnotationContextMenu)
{ {
const TextCodec codec = VcsBaseEditor::getCodec(workingDir, QStringList(file)); const TextEncoding encoding = VcsBaseEditor::getEncoding(workingDir, QStringList(file));
// no need for temp file // no need for temp file
const QString id = VcsBaseEditor::getTitleId(workingDir, QStringList(file)); const QString id = VcsBaseEditor::getTitleId(workingDir, QStringList(file));
const FilePath source = VcsBaseEditor::getSource(workingDir, file); const FilePath source = VcsBaseEditor::getSource(workingDir, file);
QStringList args = {"log"}; QStringList args = {"log"};
if (!file.isEmpty()) if (!file.isEmpty())
args.append(file); args.append(file);
const auto response = runCvs(workingDir, args, RunFlags::None, codec); const auto response = runCvs(workingDir, args, RunFlags::None, encoding);
if (response.result() != ProcessResult::FinishedWithSuccess) if (response.result() != ProcessResult::FinishedWithSuccess)
return; return;
@@ -970,7 +970,7 @@ void CvsPluginPrivate::filelog(const FilePath &workingDir,
} else { } else {
const QString title = QString::fromLatin1("cvs log %1").arg(id); const QString title = QString::fromLatin1("cvs log %1").arg(id);
IEditor *newEditor = showOutputInEditor(title, response.cleanedStdOut(), IEditor *newEditor = showOutputInEditor(title, response.cleanedStdOut(),
CVS_FILELOG_EDITOR_ID, source, codec); CVS_FILELOG_EDITOR_ID, source, encoding);
VcsBaseEditor::tagEditor(newEditor, tag); VcsBaseEditor::tagEditor(newEditor, tag);
if (enableAnnotationContextMenu) if (enableAnnotationContextMenu)
VcsBaseEditor::getVcsBaseEditor(newEditor)->setFileLogAnnotateEnabled(true); VcsBaseEditor::getVcsBaseEditor(newEditor)->setFileLogAnnotateEnabled(true);
@@ -1086,14 +1086,14 @@ void CvsPluginPrivate::annotate(const FilePath &workingDir, const QString &file,
int lineNumber /* = -1 */) int lineNumber /* = -1 */)
{ {
const QStringList files(file); const QStringList files(file);
const TextCodec codec = VcsBaseEditor::getCodec(workingDir, files); const TextEncoding encoding = VcsBaseEditor::getEncoding(workingDir, files);
const QString id = VcsBaseEditor::getTitleId(workingDir, files, revision); const QString id = VcsBaseEditor::getTitleId(workingDir, files, revision);
const FilePath source = VcsBaseEditor::getSource(workingDir, file); const FilePath source = VcsBaseEditor::getSource(workingDir, file);
QStringList args{"annotate"}; QStringList args{"annotate"};
if (!revision.isEmpty()) if (!revision.isEmpty())
args << "-r" << revision; args << "-r" << revision;
args << file; args << file;
const auto response = runCvs(workingDir, args, RunFlags::None, codec); const auto response = runCvs(workingDir, args, RunFlags::None, encoding);
if (response.result() != ProcessResult::FinishedWithSuccess) if (response.result() != ProcessResult::FinishedWithSuccess)
return; return;
@@ -1110,7 +1110,7 @@ void CvsPluginPrivate::annotate(const FilePath &workingDir, const QString &file,
} else { } else {
const QString title = QString::fromLatin1("cvs annotate %1").arg(id); const QString title = QString::fromLatin1("cvs annotate %1").arg(id);
IEditor *newEditor = showOutputInEditor(title, response.cleanedStdOut(), IEditor *newEditor = showOutputInEditor(title, response.cleanedStdOut(),
CVS_ANNOTATION_EDITOR_ID, source, codec); CVS_ANNOTATION_EDITOR_ID, source, encoding);
VcsBaseEditor::tagEditor(newEditor, tag); VcsBaseEditor::tagEditor(newEditor, tag);
VcsBaseEditor::gotoLineOfEditor(newEditor, lineNumber); VcsBaseEditor::gotoLineOfEditor(newEditor, lineNumber);
} }
@@ -1241,12 +1241,12 @@ bool CvsPluginPrivate::describe(const FilePath &repositoryPath,
{ {
// Collect logs // Collect logs
QString output; QString output;
TextCodec codec; TextEncoding codec;
const QList<CvsLogEntry>::iterator lend = entries.end(); const QList<CvsLogEntry>::iterator lend = entries.end();
for (QList<CvsLogEntry>::iterator it = entries.begin(); it != lend; ++it) { for (QList<CvsLogEntry>::iterator it = entries.begin(); it != lend; ++it) {
// Before fiddling file names, try to find codec // Before fiddling file names, try to find codec
if (!codec.isValid()) if (!codec.isValid())
codec = VcsBaseEditor::getCodec(repositoryPath, QStringList(it->file)); codec = VcsBaseEditor::getEncoding(repositoryPath, QStringList(it->file));
// Run log // Run log
const QStringList args{"log", "-r", it->revisions.front().revision, it->file}; const QStringList args{"log", "-r", it->revisions.front().revision, it->file};
const auto logResponse = runCvs(repositoryPath, args); const auto logResponse = runCvs(repositoryPath, args);
@@ -1301,7 +1301,7 @@ bool CvsPluginPrivate::describe(const FilePath &repositoryPath,
// the working directory (see above). // the working directory (see above).
CommandResult CvsPluginPrivate::runCvs(const FilePath &workingDirectory, CommandResult CvsPluginPrivate::runCvs(const FilePath &workingDirectory,
const QStringList &arguments, RunFlags flags, const QStringList &arguments, RunFlags flags,
const TextCodec &outputCodec, int timeoutMultiplier) const const TextEncoding &outputCodec, int timeoutMultiplier) const
{ {
const FilePath executable = settings().binaryPath(); const FilePath executable = settings().binaryPath();
if (executable.isEmpty()) if (executable.isEmpty())
@@ -1315,7 +1315,7 @@ CommandResult CvsPluginPrivate::runCvs(const FilePath &workingDirectory,
IEditor *CvsPluginPrivate::showOutputInEditor(const QString& title, const QString &output, IEditor *CvsPluginPrivate::showOutputInEditor(const QString& title, const QString &output,
Utils::Id id, const FilePath &source, Utils::Id id, const FilePath &source,
const TextCodec &codec) const TextEncoding &encoding)
{ {
QString s = title; QString s = title;
IEditor *editor = EditorManager::openEditorWithContents(id, &s, output.toUtf8()); IEditor *editor = EditorManager::openEditorWithContents(id, &s, output.toUtf8());
@@ -1328,8 +1328,8 @@ IEditor *CvsPluginPrivate::showOutputInEditor(const QString& title, const QStrin
e->setForceReadOnly(true); e->setForceReadOnly(true);
if (!source.isEmpty()) if (!source.isEmpty())
e->setSource(source); e->setSource(source);
if (codec.isValid()) if (encoding.isValid())
e->setCodec(codec); e->setEncoding(encoding);
return editor; return editor;
} }

View File

@@ -674,7 +674,7 @@ void FossilClient::annotate(const FilePath &workingDir, const QString &file, int
const FilePath source = VcsBaseEditor::getSource(workingDir, file); const FilePath source = VcsBaseEditor::getSource(workingDir, file);
VcsBaseEditorWidget *editor = createVcsEditor(kind, title, source, VcsBaseEditorWidget *editor = createVcsEditor(kind, title, source,
VcsBaseEditor::getCodec(source), VcsBaseEditor::getEncoding(source),
vcsCmdString.toLatin1().constData(), id); vcsCmdString.toLatin1().constData(), id);
auto fossilEditor = qobject_cast<VcsBaseEditorWidget *>(editor); auto fossilEditor = qobject_cast<VcsBaseEditorWidget *>(editor);
@@ -790,7 +790,7 @@ void FossilClient::view(const FilePath &source, const QString &id, const QString
const QString title = vcsEditorTitle(vcsCommandString(DiffCommand), id); const QString title = vcsEditorTitle(vcsCommandString(DiffCommand), id);
VcsBaseEditorWidget *editor = createVcsEditor(kind, title, source, VcsBaseEditorWidget *editor = createVcsEditor(kind, title, source,
VcsBaseEditor::getCodec(source), "view", id); VcsBaseEditor::getEncoding(source), "view", id);
editor->setWorkingDirectory(workingDirectory); editor->setWorkingDirectory(workingDirectory);
enqueueJob(createCommand(workingDirectory, editor), args + extraOptions, source); enqueueJob(createCommand(workingDirectory, editor), args + extraOptions, source);
@@ -863,7 +863,7 @@ void FossilClient::log(const FilePath &workingDir, const QStringList &files,
const QString title = vcsEditorTitle(vcsCmdString, id); const QString title = vcsEditorTitle(vcsCmdString, id);
const FilePath source = VcsBaseEditor::getSource(workingDir, files); const FilePath source = VcsBaseEditor::getSource(workingDir, files);
VcsBaseEditorWidget *editor = createVcsEditor(kind, title, source, VcsBaseEditorWidget *editor = createVcsEditor(kind, title, source,
VcsBaseEditor::getCodec(source), VcsBaseEditor::getEncoding(source),
vcsCmdString.toLatin1().constData(), id); vcsCmdString.toLatin1().constData(), id);
auto fossilEditor = qobject_cast<VcsBaseEditorWidget *>(editor); auto fossilEditor = qobject_cast<VcsBaseEditorWidget *>(editor);
@@ -919,7 +919,7 @@ void FossilClient::logCurrentFile(const FilePath &workingDir, const QStringList
const QString title = vcsEditorTitle(vcsCmdString, id); const QString title = vcsEditorTitle(vcsCmdString, id);
const FilePath source = VcsBaseEditor::getSource(workingDir, files); const FilePath source = VcsBaseEditor::getSource(workingDir, files);
VcsBaseEditorWidget *editor = createVcsEditor(kind, title, source, VcsBaseEditorWidget *editor = createVcsEditor(kind, title, source,
VcsBaseEditor::getCodec(source), VcsBaseEditor::getEncoding(source),
vcsCmdString.toLatin1().constData(), id); vcsCmdString.toLatin1().constData(), id);
auto fossilEditor = qobject_cast<VcsBaseEditorWidget *>(editor); auto fossilEditor = qobject_cast<VcsBaseEditorWidget *>(editor);

View File

@@ -93,7 +93,7 @@ public:
CommitType commitType; CommitType commitType;
QString amendHash; QString amendHash;
Utils::TextCodec commitEncoding; Utils::TextEncoding commitEncoding;
GitSubmitEditorPanelInfo panelInfo; GitSubmitEditorPanelInfo panelInfo;
GitSubmitEditorPanelData panelData; GitSubmitEditorPanelData panelData;
bool enablePush = false; bool enablePush = false;

View File

@@ -239,7 +239,7 @@ GitDiffEditorController::GitDiffEditorController(IDocument *document,
const Storage<QString> diffInputStorage; const Storage<QString> diffInputStorage;
const auto onDiffSetup = [this, leftCommit, rightCommit, extraArgs](Process &process) { const auto onDiffSetup = [this, leftCommit, rightCommit, extraArgs](Process &process) {
process.setCodec(VcsBaseEditor::getCodec(workingDirectory(), {})); process.setEncoding(VcsBaseEditor::getEncoding(workingDirectory(), {}));
setupCommand(process, {addConfigurationArguments(diffArgs(leftCommit, rightCommit, extraArgs))}); setupCommand(process, {addConfigurationArguments(diffArgs(leftCommit, rightCommit, extraArgs))});
VcsOutputWindow::appendCommand(process.workingDirectory(), process.commandLine()); VcsOutputWindow::appendCommand(process.workingDirectory(), process.commandLine());
}; };
@@ -305,7 +305,7 @@ FileListDiffController::FileListDiffController(IDocument *document, const QStrin
const auto onStagedSetup = [this, stagedFiles](Process &process) { const auto onStagedSetup = [this, stagedFiles](Process &process) {
if (stagedFiles.isEmpty()) if (stagedFiles.isEmpty())
return SetupResult::StopWithError; return SetupResult::StopWithError;
process.setCodec(VcsBaseEditor::getCodec(workingDirectory(), stagedFiles)); process.setEncoding(VcsBaseEditor::getEncoding(workingDirectory(), stagedFiles));
setupCommand(process, addConfigurationArguments( setupCommand(process, addConfigurationArguments(
QStringList({"diff", "--cached", "--"}) + stagedFiles)); QStringList({"diff", "--cached", "--"}) + stagedFiles));
VcsOutputWindow::appendCommand(process.workingDirectory(), process.commandLine()); VcsOutputWindow::appendCommand(process.workingDirectory(), process.commandLine());
@@ -318,7 +318,7 @@ FileListDiffController::FileListDiffController(IDocument *document, const QStrin
const auto onUnstagedSetup = [this, unstagedFiles](Process &process) { const auto onUnstagedSetup = [this, unstagedFiles](Process &process) {
if (unstagedFiles.isEmpty()) if (unstagedFiles.isEmpty())
return SetupResult::StopWithError; return SetupResult::StopWithError;
process.setCodec(VcsBaseEditor::getCodec(workingDirectory(), unstagedFiles)); process.setEncoding(VcsBaseEditor::getEncoding(workingDirectory(), unstagedFiles));
setupCommand(process, addConfigurationArguments( setupCommand(process, addConfigurationArguments(
QStringList({"diff", "--"}) + unstagedFiles)); QStringList({"diff", "--"}) + unstagedFiles));
VcsOutputWindow::appendCommand(process.workingDirectory(), process.commandLine()); VcsOutputWindow::appendCommand(process.workingDirectory(), process.commandLine());
@@ -394,7 +394,7 @@ ShowController::ShowController(IDocument *document, const QString &id)
}; };
const auto onDescriptionSetup = [this, id](Process &process) { const auto onDescriptionSetup = [this, id](Process &process) {
process.setCodec(gitClient().encoding(GitClient::EncodingCommit, workingDirectory())); process.setEncoding(gitClient().encoding(GitClient::EncodingCommit, workingDirectory()));
const ColorNames colors = GitClient::colorNames(); const ColorNames colors = GitClient::colorNames();
const QString showFormat = QStringLiteral( const QString showFormat = QStringLiteral(
@@ -975,29 +975,29 @@ void GitClient::updateNextModificationInfo()
this, command, RunFlags::NoOutput); this, command, RunFlags::NoOutput);
} }
TextCodec GitClient::defaultCommitEncoding() const TextEncoding GitClient::defaultCommitEncoding() const
{ {
// Set default commit encoding to 'UTF-8', when it's not set, // Set default commit encoding to 'UTF-8', when it's not set,
// to solve displaying error of commit log with non-latin characters. // to solve displaying error of commit log with non-latin characters.
return TextCodec::utf8(); return QStringConverter::Utf8;
} }
TextCodec GitClient::encoding(GitClient::EncodingType encodingType, const FilePath &source) const TextEncoding GitClient::encoding(GitClient::EncodingType encodingType, const FilePath &source) const
{ {
auto codec = [this](const FilePath &workingDirectory, const QString &configVar) { auto encoding = [this](const FilePath &workingDirectory, const QString &configVar) {
const QString codecName = readConfigValue(workingDirectory, configVar).trimmed(); const QString codecName = readConfigValue(workingDirectory, configVar).trimmed();
if (codecName.isEmpty()) if (codecName.isEmpty())
return defaultCommitEncoding(); return defaultCommitEncoding();
return TextCodec::codecForName(codecName.toUtf8()); return TextEncoding(codecName.toUtf8());
}; };
switch (encodingType) { switch (encodingType) {
case EncodingSource: case EncodingSource:
return source.isFile() ? VcsBaseEditor::getCodec(source) : codec(source, "gui.encoding"); return source.isFile() ? VcsBaseEditor::getEncoding(source) : encoding(source, "gui.encoding");
case EncodingLogOutput: case EncodingLogOutput:
return codec(source, "i18n.logOutputEncoding"); return encoding(source, "i18n.logOutputEncoding");
case EncodingCommit: case EncodingCommit:
return codec(source, "i18n.commitEncoding"); return encoding(source, "i18n.commitEncoding");
default: default:
return {}; return {};
} }
@@ -2711,14 +2711,15 @@ Result<CommitData> GitClient::enrichCommitData(const FilePath &repoDirectory,
} }
CommitData commitData = commitDataIn; CommitData commitData = commitDataIn;
const TextCodec authorCodec = HostOsInfo::isWindowsHost() const TextEncoding authorEncoding = HostOsInfo::isWindowsHost()
? TextCodec::utf8() ? QStringConverter::Utf8
: commitData.commitEncoding; : commitData.commitEncoding;
const TextCodec authorCodec = TextCodec::codecForName(authorEncoding);
QByteArray stdOut = result.rawStdOut(); QByteArray stdOut = result.rawStdOut();
commitData.amendHash = QLatin1String(shiftLogLine(stdOut)); commitData.amendHash = QLatin1String(shiftLogLine(stdOut));
commitData.panelData.author = authorCodec.toUnicode(shiftLogLine(stdOut)); commitData.panelData.author = authorCodec.toUnicode(shiftLogLine(stdOut));
commitData.panelData.email = authorCodec.toUnicode(shiftLogLine(stdOut)); commitData.panelData.email = authorCodec.toUnicode(shiftLogLine(stdOut));
commitData.commitTemplate = commitData.commitEncoding.toUnicode(stdOut); commitData.commitTemplate = TextCodec::codecForName(commitData.commitEncoding).toUnicode(stdOut);
return commitData; return commitData;
} }
@@ -3565,20 +3566,20 @@ QString GitClient::readGitVar(const FilePath &workingDirectory, const QString &c
return readOneLine(workingDirectory, {"var", configVar}); return readOneLine(workingDirectory, {"var", configVar});
} }
static TextCodec configFileCodec() static TextEncoding configFileEncoding()
{ {
// Git for Windows always uses UTF-8 for configuration: // Git for Windows always uses UTF-8 for configuration:
// https://github.com/msysgit/msysgit/wiki/Git-for-Windows-Unicode-Support#convert-config-files // https://github.com/msysgit/msysgit/wiki/Git-for-Windows-Unicode-Support#convert-config-files
static const TextCodec codec = static const TextEncoding encoding =
HostOsInfo::isWindowsHost() ? TextCodec::utf8() : TextCodec::codecForLocale(); HostOsInfo::isWindowsHost() ? QStringConverter::Utf8 : TextCodec::encodingForLocale();
return codec; return encoding;
} }
QString GitClient::readOneLine(const FilePath &workingDirectory, const QStringList &arguments) const QString GitClient::readOneLine(const FilePath &workingDirectory, const QStringList &arguments) const
{ {
const CommandResult result = vcsSynchronousExec(workingDirectory, arguments, const CommandResult result = vcsSynchronousExec(workingDirectory, arguments,
RunFlags::NoOutput, vcsTimeoutS(), RunFlags::NoOutput, vcsTimeoutS(),
configFileCodec()); configFileEncoding());
if (result.result() == ProcessResult::FinishedWithSuccess) if (result.result() == ProcessResult::FinishedWithSuccess)
return result.cleanedStdOut().trimmed(); return result.cleanedStdOut().trimmed();
return {}; return {};
@@ -3588,7 +3589,7 @@ void GitClient::readConfigAsync(const FilePath &workingDirectory, const QStringL
const CommandHandler &handler) const const CommandHandler &handler) const
{ {
vcsExecWithHandler(workingDirectory, arguments, this, handler, RunFlags::NoOutput, vcsExecWithHandler(workingDirectory, arguments, this, handler, RunFlags::NoOutput,
configFileCodec()); configFileEncoding());
} }
QString GitClient::styleColorName(TextEditor::TextStyle style) QString GitClient::styleColorName(TextEditor::TextStyle style)

View File

@@ -362,9 +362,9 @@ public:
Author parseAuthor(const QString &authorInfo); Author parseAuthor(const QString &authorInfo);
Author getAuthor(const Utils::FilePath &workingDirectory); Author getAuthor(const Utils::FilePath &workingDirectory);
Utils::TextCodec defaultCommitEncoding() const; Utils::TextEncoding defaultCommitEncoding() const;
enum EncodingType { EncodingSource, EncodingLogOutput, EncodingCommit, EncodingDefault }; enum EncodingType { EncodingSource, EncodingLogOutput, EncodingCommit, EncodingDefault };
Utils::TextCodec encoding(EncodingType encodingType, const Utils::FilePath &source = {}) const; Utils::TextEncoding encoding(EncodingType encodingType, const Utils::FilePath &source = {}) const;
void readConfigAsync(const Utils::FilePath &workingDirectory, const QStringList &arguments, void readConfigAsync(const Utils::FilePath &workingDirectory, const QStringList &arguments,
const VcsBase::CommandHandler &handler) const; const VcsBase::CommandHandler &handler) const;

View File

@@ -265,7 +265,7 @@ void GitEditorWidget::aboutToOpen(const FilePath &filePath, const FilePath &real
|| editorId == Git::Constants::GIT_REBASE_EDITOR_ID) { || editorId == Git::Constants::GIT_REBASE_EDITOR_ID) {
const FilePath gitPath = filePath.absolutePath(); const FilePath gitPath = filePath.absolutePath();
setSource(gitPath); setSource(gitPath);
textDocument()->setCodec(gitClient().encoding(GitClient::EncodingCommit, gitPath)); textDocument()->setCodec(TextCodec::codecForName(gitClient().encoding(GitClient::EncodingCommit, gitPath)));
} }
} }

View File

@@ -330,7 +330,7 @@ QByteArray GitSubmitEditor::fileContents() const
// Do the encoding convert, When use user-defined encoding // Do the encoding convert, When use user-defined encoding
// e.g. git config --global i18n.commitencoding utf-8 // e.g. git config --global i18n.commitencoding utf-8
if (m_commitEncoding.isValid()) if (m_commitEncoding.isValid())
return m_commitEncoding.fromUnicode(text); return TextCodec::codecForName(m_commitEncoding).fromUnicode(text);
// Using utf-8 as the default encoding // Using utf-8 as the default encoding
return text.toUtf8(); return text.toUtf8();

View File

@@ -48,7 +48,7 @@ private:
inline const GitSubmitEditorWidget *submitEditorWidget() const; inline const GitSubmitEditorWidget *submitEditorWidget() const;
VcsBase::SubmitFileModel *m_model = nullptr; VcsBase::SubmitFileModel *m_model = nullptr;
Utils::TextCodec m_commitEncoding; Utils::TextEncoding m_commitEncoding;
CommitType m_commitType = SimpleCommit; CommitType m_commitType = SimpleCommit;
QString m_amenHash; QString m_amenHash;
Utils::FilePath m_workingDirectory; Utils::FilePath m_workingDirectory;

View File

@@ -211,7 +211,7 @@ void BlameMark::addNewLine(const QString &newLine)
InstantBlame::InstantBlame() InstantBlame::InstantBlame()
{ {
m_codec = gitClient().defaultCommitEncoding(); m_encoding = gitClient().defaultCommitEncoding();
m_cursorPositionChangedTimer = new QTimer(this); m_cursorPositionChangedTimer = new QTimer(this);
m_cursorPositionChangedTimer->setSingleShot(true); m_cursorPositionChangedTimer->setSingleShot(true);
connect(m_cursorPositionChangedTimer, &QTimer::timeout, this, &InstantBlame::perform); connect(m_cursorPositionChangedTimer, &QTimer::timeout, this, &InstantBlame::perform);
@@ -460,7 +460,7 @@ void InstantBlame::perform()
qCDebug(log) << "Running git" << lineDiffOptions.join(' '); qCDebug(log) << "Running git" << lineDiffOptions.join(' ');
gitClient().vcsExecWithHandler(topLevel, lineDiffOptions, this, gitClient().vcsExecWithHandler(topLevel, lineDiffOptions, this,
lineDiffHandler, RunFlags::NoOutput, m_codec); lineDiffHandler, RunFlags::NoOutput, m_encoding);
}; };
QStringList options = {"blame", "-p"}; QStringList options = {"blame", "-p"};
if (settings().instantBlameIgnoreSpaceChanges()) if (settings().instantBlameIgnoreSpaceChanges())
@@ -470,7 +470,7 @@ void InstantBlame::perform()
options.append({"-L", lineString, "--", filePath.toUrlishString()}); options.append({"-L", lineString, "--", filePath.toUrlishString()});
qCDebug(log) << "Running git" << options.join(' '); qCDebug(log) << "Running git" << options.join(' ');
gitClient().vcsExecWithHandler(workingDirectory, options, this, gitClient().vcsExecWithHandler(workingDirectory, options, this,
commandHandler, RunFlags::NoOutput, m_codec); commandHandler, RunFlags::NoOutput, m_encoding);
} }
void InstantBlame::stop() void InstantBlame::stop()
@@ -494,18 +494,18 @@ bool InstantBlame::refreshWorkingDirectory(const FilePath &workingDirectory)
m_workingDirectory = workingDirectory; m_workingDirectory = workingDirectory;
const auto commitCodecHandler = [this, workingDirectory](const CommandResult &result) { const auto commitCodecHandler = [this, workingDirectory](const CommandResult &result) {
TextCodec codec; TextEncoding encoding;
if (result.result() == ProcessResult::FinishedWithSuccess) { if (result.result() == ProcessResult::FinishedWithSuccess) {
const QString codecName = result.cleanedStdOut().trimmed(); const QString codecName = result.cleanedStdOut().trimmed();
codec = TextCodec::codecForName(codecName.toUtf8()); encoding = codecName.toUtf8();
} else { } else {
codec = gitClient().defaultCommitEncoding(); encoding = gitClient().defaultCommitEncoding();
} }
if (m_codec != codec) { if (m_encoding != encoding) {
qCInfo(log) << "Setting new text codec:" << codec.displayName(); qCInfo(log) << "Setting new text codec:" << encoding.name();
m_codec = codec; m_encoding = encoding;
force(); force();
} }
}; };

View File

@@ -64,7 +64,7 @@ private:
void slotDocumentChanged(); void slotDocumentChanged();
Utils::FilePath m_workingDirectory; Utils::FilePath m_workingDirectory;
Utils::TextCodec m_codec; Utils::TextEncoding m_encoding;
Author m_author; Author m_author;
int m_lastVisitedEditorLine = -1; int m_lastVisitedEditorLine = -1;
Core::IDocument *m_document = nullptr; Core::IDocument *m_document = nullptr;

View File

@@ -205,7 +205,7 @@ void MercurialClient::incoming(const FilePath &repositoryRoot, const QString &re
const QString title = Tr::tr("Hg incoming %1").arg(id); const QString title = Tr::tr("Hg incoming %1").arg(id);
VcsBaseEditorWidget *editor = createVcsEditor(Constants::DIFFLOG_ID, title, repositoryRoot, VcsBaseEditorWidget *editor = createVcsEditor(Constants::DIFFLOG_ID, title, repositoryRoot,
VcsBaseEditor::getCodec(repositoryRoot), VcsBaseEditor::getEncoding(repositoryRoot),
"incoming", id); "incoming", id);
enqueueJob(createCommand(FilePath::fromString(repository), editor), args, repositoryRoot); enqueueJob(createCommand(FilePath::fromString(repository), editor), args, repositoryRoot);
} }
@@ -218,7 +218,7 @@ void MercurialClient::outgoing(const FilePath &repositoryRoot)
const QString title = Tr::tr("Hg outgoing %1").arg(repositoryRoot.toUserOutput()); const QString title = Tr::tr("Hg outgoing %1").arg(repositoryRoot.toUserOutput());
VcsBaseEditorWidget *editor = createVcsEditor(Constants::DIFFLOG_ID, title, repositoryRoot, VcsBaseEditorWidget *editor = createVcsEditor(Constants::DIFFLOG_ID, title, repositoryRoot,
VcsBaseEditor::getCodec(repositoryRoot), VcsBaseEditor::getEncoding(repositoryRoot),
"outgoing", repositoryRoot.toUrlishString()); "outgoing", repositoryRoot.toUrlishString());
enqueueJob(createCommand(repositoryRoot, editor), args, repositoryRoot); enqueueJob(createCommand(repositoryRoot, editor), args, repositoryRoot);
} }

View File

@@ -238,7 +238,7 @@ public:
IEditor *showOutputInEditor(const QString &title, const QString &output, IEditor *showOutputInEditor(const QString &title, const QString &output,
Id id, const FilePath &source, Id id, const FilePath &source,
const TextCodec &codec = {}); const TextEncoding &encoding = {});
// args are passed as command line arguments // args are passed as command line arguments
// extra args via a tempfile and the option -x "temp-filename" // extra args via a tempfile and the option -x "temp-filename"
@@ -247,13 +247,13 @@ public:
unsigned flags = CommandToWindow|StdErrToWindow|ErrorToWindow, unsigned flags = CommandToWindow|StdErrToWindow|ErrorToWindow,
const QStringList &extraArgs = {}, const QStringList &extraArgs = {},
const QByteArray &stdInput = {}, const QByteArray &stdInput = {},
const Utils::TextCodec &outputCodec = {}) const; const Utils::TextEncoding &encoding = {}) const;
PerforceResponse synchronousProcess(const FilePath &workingDir, PerforceResponse synchronousProcess(const FilePath &workingDir,
const QStringList &args, const QStringList &args,
unsigned flags, unsigned flags,
const QByteArray &stdInput, const QByteArray &stdInput,
const Utils::TextCodec &outputCodec) const; const Utils::TextEncoding &encoding) const;
void annotate(const FilePath &workingDir, const QString &fileName, void annotate(const FilePath &workingDir, const QString &fileName,
const QString &changeList = QString(), int lineNumber = -1); const QString &changeList = QString(), int lineNumber = -1);
@@ -547,12 +547,12 @@ void PerforcePluginPrivate::revertCurrentFile()
const VcsBasePluginState state = currentState(); const VcsBasePluginState state = currentState();
QTC_ASSERT(state.hasFile(), return); QTC_ASSERT(state.hasFile(), return);
const TextCodec codec = VcsBaseEditor::getCodec(state.currentFile()); const TextEncoding encoding = VcsBaseEditor::getEncoding(state.currentFile());
QStringList args; QStringList args;
args << QLatin1String("diff") << QLatin1String("-sa") << state.relativeCurrentFile(); args << QLatin1String("diff") << QLatin1String("-sa") << state.relativeCurrentFile();
PerforceResponse result = runP4Cmd(state.currentFileTopLevel(), args, PerforceResponse result = runP4Cmd(state.currentFileTopLevel(), args,
RunFullySynchronous|CommandToWindow|StdErrToWindow|ErrorToWindow, RunFullySynchronous|CommandToWindow|StdErrToWindow|ErrorToWindow,
{}, {}, codec); {}, {}, encoding);
if (result.error) if (result.error)
return; return;
// "foo.cpp - file(s) not opened on this client." // "foo.cpp - file(s) not opened on this client."
@@ -796,7 +796,7 @@ void PerforcePluginPrivate::annotate(const FilePath &workingDir,
int lineNumber /* = -1 */) int lineNumber /* = -1 */)
{ {
const QStringList files = QStringList(fileName); const QStringList files = QStringList(fileName);
const TextCodec codec = VcsBaseEditor::getCodec(workingDir, files); const TextEncoding encoding = VcsBaseEditor::getEncoding(workingDir, files);
const QString id = VcsBaseEditor::getTitleId(workingDir, files, changeList); const QString id = VcsBaseEditor::getTitleId(workingDir, files, changeList);
const FilePath source = VcsBaseEditor::getSource(workingDir, files); const FilePath source = VcsBaseEditor::getSource(workingDir, files);
QStringList args; QStringList args;
@@ -807,13 +807,13 @@ void PerforcePluginPrivate::annotate(const FilePath &workingDir,
args << (fileName + QLatin1Char('@') + changeList); args << (fileName + QLatin1Char('@') + changeList);
const PerforceResponse result = runP4Cmd(workingDir, args, const PerforceResponse result = runP4Cmd(workingDir, args,
CommandToWindow|StdErrToWindow|ErrorToWindow, CommandToWindow|StdErrToWindow|ErrorToWindow,
{}, {}, codec); {}, {}, encoding);
if (!result.error) { if (!result.error) {
if (lineNumber < 1) if (lineNumber < 1)
lineNumber = VcsBaseEditor::lineNumberOfCurrentEditor(); lineNumber = VcsBaseEditor::lineNumberOfCurrentEditor();
IEditor *ed = showOutputInEditor(Tr::tr("p4 annotate %1").arg(id), IEditor *ed = showOutputInEditor(Tr::tr("p4 annotate %1").arg(id),
result.stdOut, PERFORCE_ANNOTATION_EDITOR_ID, result.stdOut, PERFORCE_ANNOTATION_EDITOR_ID,
source, codec); source, encoding);
VcsBaseEditor::gotoLineOfEditor(ed, lineNumber); VcsBaseEditor::gotoLineOfEditor(ed, lineNumber);
} }
} }
@@ -850,7 +850,7 @@ void PerforcePluginPrivate::filelog(const FilePath &workingDir, const QString &f
bool enableAnnotationContextMenu) bool enableAnnotationContextMenu)
{ {
const QString id = VcsBaseEditor::getTitleId(workingDir, QStringList(fileName)); const QString id = VcsBaseEditor::getTitleId(workingDir, QStringList(fileName));
const TextCodec codec = VcsBaseEditor::getCodec(workingDir, QStringList(fileName)); const TextEncoding encoding = VcsBaseEditor::getEncoding(workingDir, QStringList(fileName));
QStringList args; QStringList args;
args << QLatin1String("filelog") << QLatin1String("-li"); args << QLatin1String("filelog") << QLatin1String("-li");
if (settings().logCount() > 0) if (settings().logCount() > 0)
@@ -859,11 +859,11 @@ void PerforcePluginPrivate::filelog(const FilePath &workingDir, const QString &f
args.append(fileName); args.append(fileName);
const PerforceResponse result = runP4Cmd(workingDir, args, const PerforceResponse result = runP4Cmd(workingDir, args,
CommandToWindow|StdErrToWindow|ErrorToWindow, CommandToWindow|StdErrToWindow|ErrorToWindow,
{}, {}, codec); {}, {}, encoding);
if (!result.error) { if (!result.error) {
const FilePath source = VcsBaseEditor::getSource(workingDir, fileName); const FilePath source = VcsBaseEditor::getSource(workingDir, fileName);
IEditor *editor = showOutputInEditor(Tr::tr("p4 filelog %1").arg(id), result.stdOut, IEditor *editor = showOutputInEditor(Tr::tr("p4 filelog %1").arg(id), result.stdOut,
PERFORCE_LOG_EDITOR_ID, source, codec); PERFORCE_LOG_EDITOR_ID, source, encoding);
if (enableAnnotationContextMenu) if (enableAnnotationContextMenu)
VcsBaseEditor::getVcsBaseEditor(editor)->setFileLogAnnotateEnabled(true); VcsBaseEditor::getVcsBaseEditor(editor)->setFileLogAnnotateEnabled(true);
} }
@@ -872,7 +872,7 @@ void PerforcePluginPrivate::filelog(const FilePath &workingDir, const QString &f
void PerforcePluginPrivate::changelists(const FilePath &workingDir, const QString &fileName) void PerforcePluginPrivate::changelists(const FilePath &workingDir, const QString &fileName)
{ {
const QString id = VcsBaseEditor::getTitleId(workingDir, QStringList(fileName)); const QString id = VcsBaseEditor::getTitleId(workingDir, QStringList(fileName));
const TextCodec codec = VcsBaseEditor::getCodec(workingDir, QStringList(fileName)); const TextEncoding encoding = VcsBaseEditor::getEncoding(workingDir, QStringList(fileName));
QStringList args; QStringList args;
args << QLatin1String("changelists") << QLatin1String("-lit"); args << QLatin1String("changelists") << QLatin1String("-lit");
if (settings().logCount() > 0) if (settings().logCount() > 0)
@@ -881,11 +881,11 @@ void PerforcePluginPrivate::changelists(const FilePath &workingDir, const QStrin
args.append(fileName); args.append(fileName);
const PerforceResponse result = runP4Cmd(workingDir, args, const PerforceResponse result = runP4Cmd(workingDir, args,
CommandToWindow|StdErrToWindow|ErrorToWindow, CommandToWindow|StdErrToWindow|ErrorToWindow,
{}, {}, codec); {}, {}, encoding);
if (!result.error) { if (!result.error) {
const FilePath source = VcsBaseEditor::getSource(workingDir, fileName); const FilePath source = VcsBaseEditor::getSource(workingDir, fileName);
IEditor *editor = showOutputInEditor(Tr::tr("p4 changelists %1").arg(id), result.stdOut, IEditor *editor = showOutputInEditor(Tr::tr("p4 changelists %1").arg(id), result.stdOut,
PERFORCE_LOG_EDITOR_ID, source, codec); PERFORCE_LOG_EDITOR_ID, source, encoding);
VcsBaseEditor::gotoLineOfEditor(editor, 1); VcsBaseEditor::gotoLineOfEditor(editor, 1);
} }
} }
@@ -1161,14 +1161,14 @@ PerforceResponse PerforcePluginPrivate::synchronousProcess(const FilePath &worki
const QStringList &args, const QStringList &args,
unsigned flags, unsigned flags,
const QByteArray &stdInput, const QByteArray &stdInput,
const TextCodec &outputCodec) const const TextEncoding &encoding) const
{ {
// Run, connect stderr to the output window // Run, connect stderr to the output window
Process process; Process process;
process.setWriteData(stdInput); process.setWriteData(stdInput);
const int timeOutS = (flags & LongTimeOut) ? settings().longTimeOutS() : settings().timeOutS(); const int timeOutS = (flags & LongTimeOut) ? settings().longTimeOutS() : settings().timeOutS();
if (outputCodec.isValid()) if (encoding.isValid())
process.setCodec(outputCodec); process.setEncoding(encoding);
if (flags & OverrideDiffEnvironment) if (flags & OverrideDiffEnvironment)
process.setEnvironment(overrideDiffEnvironmentVariable()); process.setEnvironment(overrideDiffEnvironmentVariable());
if (!workingDir.isEmpty()) if (!workingDir.isEmpty())
@@ -1209,7 +1209,7 @@ PerforceResponse PerforcePluginPrivate::runP4Cmd(const FilePath &workingDir,
unsigned flags, unsigned flags,
const QStringList &extraArgs, const QStringList &extraArgs,
const QByteArray &stdInput, const QByteArray &stdInput,
const TextCodec &outputCodec) const const TextEncoding &encoding) const
{ {
if (!settings().isValid()) { if (!settings().isValid()) {
VcsOutputWindow::appendError(Tr::tr("Perforce is not correctly configured.")); VcsOutputWindow::appendError(Tr::tr("Perforce is not correctly configured."));
@@ -1232,7 +1232,7 @@ PerforceResponse PerforcePluginPrivate::runP4Cmd(const FilePath &workingDir,
QGuiApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); QGuiApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
const PerforceResponse response const PerforceResponse response
= synchronousProcess(workingDir, actualArgs, flags, stdInput, outputCodec); = synchronousProcess(workingDir, actualArgs, flags, stdInput, encoding);
if (flags & ShowBusyCursor) if (flags & ShowBusyCursor)
QGuiApplication::restoreOverrideCursor(); QGuiApplication::restoreOverrideCursor();
@@ -1243,7 +1243,7 @@ IEditor *PerforcePluginPrivate::showOutputInEditor(const QString &title,
const QString &output, const QString &output,
Id id, Id id,
const FilePath &source, const FilePath &source,
const TextCodec &codec) const TextEncoding &encoding)
{ {
QString s = title; QString s = title;
QString content = output; QString content = output;
@@ -1263,8 +1263,8 @@ IEditor *PerforcePluginPrivate::showOutputInEditor(const QString &title,
e->setSource(source); e->setSource(source);
s.replace(QLatin1Char(' '), QLatin1Char('_')); s.replace(QLatin1Char(' '), QLatin1Char('_'));
e->textDocument()->setFallbackSaveAsFileName(s); e->textDocument()->setFallbackSaveAsFileName(s);
if (codec.isValid()) if (encoding.isValid())
e->setCodec(codec); e->setEncoding(encoding);
return editor; return editor;
} }
@@ -1337,7 +1337,7 @@ void PerforcePluginPrivate::p4Diff(const FilePath &workingDir, const QStringList
void PerforcePluginPrivate::p4Diff(const PerforceDiffParameters &p) void PerforcePluginPrivate::p4Diff(const PerforceDiffParameters &p)
{ {
const TextCodec codec = VcsBaseEditor::getCodec(p.workingDir, p.files); const TextEncoding encoding = VcsBaseEditor::getEncoding(p.workingDir, p.files);
const QString id = VcsBaseEditor::getTitleId(p.workingDir, p.files); const QString id = VcsBaseEditor::getTitleId(p.workingDir, p.files);
// Reuse existing editors for that id // Reuse existing editors for that id
const QString tag = VcsBaseEditor::editorTag(DiffOutput, p.workingDir, p.files); const QString tag = VcsBaseEditor::editorTag(DiffOutput, p.workingDir, p.files);
@@ -1353,7 +1353,7 @@ void PerforcePluginPrivate::p4Diff(const PerforceDiffParameters &p)
else else
args.append(p.files); args.append(p.files);
const unsigned flags = CommandToWindow|StdErrToWindow|ErrorToWindow|OverrideDiffEnvironment; const unsigned flags = CommandToWindow|StdErrToWindow|ErrorToWindow|OverrideDiffEnvironment;
const PerforceResponse result = runP4Cmd(p.workingDir, args, flags, extraArgs, {}, codec); const PerforceResponse result = runP4Cmd(p.workingDir, args, flags, extraArgs, {}, encoding);
if (result.error) if (result.error)
return; return;
@@ -1366,7 +1366,7 @@ void PerforcePluginPrivate::p4Diff(const PerforceDiffParameters &p)
IEditor *editor = showOutputInEditor(Tr::tr("p4 diff %1").arg(id), result.stdOut, IEditor *editor = showOutputInEditor(Tr::tr("p4 diff %1").arg(id), result.stdOut,
PERFORCE_DIFF_EDITOR_ID, PERFORCE_DIFF_EDITOR_ID,
VcsBaseEditor::getSource(p.workingDir, p.files), VcsBaseEditor::getSource(p.workingDir, p.files),
codec); encoding);
VcsBaseEditor::tagEditor(editor, tag); VcsBaseEditor::tagEditor(editor, tag);
auto diffEditorWidget = qobject_cast<VcsBaseEditorWidget *>(editor->widget()); auto diffEditorWidget = qobject_cast<VcsBaseEditorWidget *>(editor->widget());
// Wire up the parameter widget to trigger a re-run on // Wire up the parameter widget to trigger a re-run on
@@ -1381,13 +1381,13 @@ void PerforcePluginPrivate::p4Diff(const PerforceDiffParameters &p)
void PerforcePluginPrivate::vcsDescribe(const FilePath &source, const QString &n) void PerforcePluginPrivate::vcsDescribe(const FilePath &source, const QString &n)
{ {
const TextCodec codec = source.isEmpty() ? TextCodec() : VcsBaseEditor::getCodec(source); const TextEncoding encoding = source.isEmpty() ? TextEncoding() : VcsBaseEditor::getEncoding(source);
QStringList args; QStringList args;
args << QLatin1String("describe") << QLatin1String("-du") << n; args << QLatin1String("describe") << QLatin1String("-du") << n;
const PerforceResponse result = runP4Cmd(settings().topLevel(), args, CommandToWindow|StdErrToWindow|ErrorToWindow, const PerforceResponse result = runP4Cmd(settings().topLevel(), args, CommandToWindow|StdErrToWindow|ErrorToWindow,
{}, {}, codec); {}, {}, encoding);
if (!result.error) if (!result.error)
showOutputInEditor(Tr::tr("p4 describe %1").arg(n), result.stdOut, PERFORCE_DIFF_EDITOR_ID, source, codec); showOutputInEditor(Tr::tr("p4 describe %1").arg(n), result.stdOut, PERFORCE_DIFF_EDITOR_ID, source, encoding);
} }
void PerforcePluginPrivate::cleanCommitMessageFile() void PerforcePluginPrivate::cleanCommitMessageFile()

View File

@@ -165,7 +165,7 @@ public:
QString monitorFile(const FilePath &repository) const; QString monitorFile(const FilePath &repository) const;
QString synchronousTopic(const FilePath &repository) const; QString synchronousTopic(const FilePath &repository) const;
CommandResult runSvn(const FilePath &workingDir, const CommandLine &command, CommandResult runSvn(const FilePath &workingDir, const CommandLine &command,
RunFlags flags = RunFlags::None, const TextCodec &outputCodec = {}, RunFlags flags = RunFlags::None, const TextEncoding &encoding = {},
int timeoutMutiplier = 1) const; int timeoutMutiplier = 1) const;
void vcsAnnotateHelper(const FilePath &workingDir, const QString &file, void vcsAnnotateHelper(const FilePath &workingDir, const QString &file,
const QString &revision = {}, int lineNumber = -1); const QString &revision = {}, int lineNumber = -1);
@@ -200,7 +200,7 @@ private:
inline bool isCommitEditorOpen() const; inline bool isCommitEditorOpen() const;
Core::IEditor *showOutputInEditor(const QString &title, const QString &output, Core::IEditor *showOutputInEditor(const QString &title, const QString &output,
Id id, const FilePath &source, Id id, const FilePath &source,
const TextCodec &codec); const TextEncoding &encoding);
void filelog(const FilePath &workingDir, void filelog(const FilePath &workingDir,
const QString &file = {}, const QString &file = {},
@@ -813,7 +813,7 @@ void SubversionPluginPrivate::vcsAnnotateHelper(const FilePath &workingDir, cons
int lineNumber /* = -1 */) int lineNumber /* = -1 */)
{ {
const FilePath source = VcsBaseEditor::getSource(workingDir, file); const FilePath source = VcsBaseEditor::getSource(workingDir, file);
const TextCodec codec = VcsBaseEditor::getCodec(source); const TextEncoding encoding = VcsBaseEditor::getEncoding(source);
CommandLine args{settings().binaryPath(), {"annotate"}}; CommandLine args{settings().binaryPath(), {"annotate"}};
args << SubversionClient::AddAuthOptions(); args << SubversionClient::AddAuthOptions();
@@ -823,7 +823,7 @@ void SubversionPluginPrivate::vcsAnnotateHelper(const FilePath &workingDir, cons
args << "-r" << revision; args << "-r" << revision;
args << "-v" << QDir::toNativeSeparators(SubversionClient::escapeFile(file)); args << "-v" << QDir::toNativeSeparators(SubversionClient::escapeFile(file));
const auto response = runSvn(workingDir, args, RunFlags::ForceCLocale, codec); const auto response = runSvn(workingDir, args, RunFlags::ForceCLocale, encoding);
if (response.result() != ProcessResult::FinishedWithSuccess) if (response.result() != ProcessResult::FinishedWithSuccess)
return; return;
@@ -842,7 +842,7 @@ void SubversionPluginPrivate::vcsAnnotateHelper(const FilePath &workingDir, cons
} else { } else {
const QString title = QString::fromLatin1("svn annotate %1").arg(id); const QString title = QString::fromLatin1("svn annotate %1").arg(id);
IEditor *newEditor = showOutputInEditor(title, response.cleanedStdOut(), IEditor *newEditor = showOutputInEditor(title, response.cleanedStdOut(),
Constants::SUBVERSION_BLAME_EDITOR_ID, source, codec); Constants::SUBVERSION_BLAME_EDITOR_ID, source, encoding);
VcsBaseEditor::tagEditor(newEditor, tag); VcsBaseEditor::tagEditor(newEditor, tag);
VcsBaseEditor::gotoLineOfEditor(newEditor, lineNumber); VcsBaseEditor::gotoLineOfEditor(newEditor, lineNumber);
} }
@@ -897,22 +897,22 @@ void SubversionPluginPrivate::slotDescribe()
CommandResult SubversionPluginPrivate::runSvn(const FilePath &workingDir, CommandResult SubversionPluginPrivate::runSvn(const FilePath &workingDir,
const CommandLine &command, RunFlags flags, const CommandLine &command, RunFlags flags,
const TextCodec &outputCodec, int timeoutMutiplier) const const TextEncoding &encoding, int timeoutMutiplier) const
{ {
if (settings().binaryPath().isEmpty()) if (settings().binaryPath().isEmpty())
return CommandResult(ProcessResult::StartFailed, Tr::tr("No subversion executable specified.")); return CommandResult(ProcessResult::StartFailed, Tr::tr("No subversion executable specified."));
const int timeoutS = settings().timeout() * timeoutMutiplier; const int timeoutS = settings().timeout() * timeoutMutiplier;
return subversionClient().vcsSynchronousExec(workingDir, command, flags, timeoutS, outputCodec); return subversionClient().vcsSynchronousExec(workingDir, command, flags, timeoutS, encoding);
} }
IEditor *SubversionPluginPrivate::showOutputInEditor(const QString &title, const QString &output, IEditor *SubversionPluginPrivate::showOutputInEditor(const QString &title, const QString &output,
Id id, const FilePath &source, Id id, const FilePath &source,
const TextCodec &codec) const TextEncoding &encoding)
{ {
if (Subversion::Constants::debug) if (Subversion::Constants::debug)
qDebug() << "SubversionPlugin::showOutputInEditor" << title << id.toString() qDebug() << "SubversionPlugin::showOutputInEditor" << title << id.toString()
<< "Size= " << output.size() << " Type=" << id << codec.displayName(); << "Size= " << output.size() << " Type=" << id << encoding.name();
QString s = title; QString s = title;
IEditor *editor = EditorManager::openEditorWithContents(id, &s, output.toUtf8()); IEditor *editor = EditorManager::openEditorWithContents(id, &s, output.toUtf8());
auto e = qobject_cast<SubversionEditorWidget*>(editor->widget()); auto e = qobject_cast<SubversionEditorWidget*>(editor->widget());
@@ -925,8 +925,8 @@ IEditor *SubversionPluginPrivate::showOutputInEditor(const QString &title, const
e->textDocument()->setFallbackSaveAsFileName(s); e->textDocument()->setFallbackSaveAsFileName(s);
if (!source.isEmpty()) if (!source.isEmpty())
e->setSource(source); e->setSource(source);
if (codec.isValid()) if (encoding.isValid())
e->setCodec(codec); e->setEncoding(encoding);
return editor; return editor;
} }

View File

@@ -130,23 +130,23 @@ QString VcsBaseClientImpl::stripLastNewline(const QString &in)
CommandResult VcsBaseClientImpl::vcsSynchronousExec(const FilePath &workingDir, CommandResult VcsBaseClientImpl::vcsSynchronousExec(const FilePath &workingDir,
const QStringList &args, RunFlags flags, const QStringList &args, RunFlags flags,
int timeoutS, const TextCodec &codec) const int timeoutS, const TextEncoding &encoding) const
{ {
return vcsSynchronousExec(workingDir, {vcsBinary(workingDir), args}, flags, timeoutS, codec); return vcsSynchronousExec(workingDir, {vcsBinary(workingDir), args}, flags, timeoutS, encoding);
} }
CommandResult VcsBaseClientImpl::vcsSynchronousExec(const FilePath &workingDir, CommandResult VcsBaseClientImpl::vcsSynchronousExec(const FilePath &workingDir,
const CommandLine &cmdLine, const CommandLine &cmdLine,
RunFlags flags, RunFlags flags,
int timeoutS, int timeoutS,
const TextCodec &codec) const const TextEncoding &encoding) const
{ {
return VcsCommand::runBlocking(workingDir, return VcsCommand::runBlocking(workingDir,
processEnvironment(workingDir), processEnvironment(workingDir),
cmdLine, cmdLine,
flags, flags,
timeoutS > 0 ? timeoutS : vcsTimeoutS(), timeoutS > 0 ? timeoutS : vcsTimeoutS(),
codec); encoding);
} }
void VcsBaseClientImpl::resetCachedVcsInfo(const FilePath &workingDir) void VcsBaseClientImpl::resetCachedVcsInfo(const FilePath &workingDir)
@@ -171,11 +171,11 @@ void VcsBaseClientImpl::vcsExecWithHandler(const FilePath &workingDirectory,
const QStringList &arguments, const QStringList &arguments,
const QObject *context, const QObject *context,
const CommandHandler &handler, const CommandHandler &handler,
RunFlags additionalFlags, const TextCodec codec) const RunFlags additionalFlags, const TextEncoding &encoding) const
{ {
VcsCommand *command = createCommand(workingDirectory); VcsCommand *command = createCommand(workingDirectory);
command->addFlags(additionalFlags); command->addFlags(additionalFlags);
command->setCodec(codec); command->setEncoding(encoding);
command->addJob({vcsBinary(workingDirectory), arguments}, vcsTimeoutS()); command->addJob({vcsBinary(workingDirectory), arguments}, vcsTimeoutS());
if (handler) { if (handler) {
const QObject *actualContext = context ? context : this; const QObject *actualContext = context ? context : this;
@@ -201,7 +201,7 @@ void VcsBaseClientImpl::vcsExecWithEditor(const Utils::FilePath &workingDirector
VcsBaseEditorWidget *editor) const VcsBaseEditorWidget *editor) const
{ {
VcsCommand *command = createCommand(workingDirectory, editor); VcsCommand *command = createCommand(workingDirectory, editor);
command->setCodec(editor->codec()); command->setEncoding(editor->encoding().name());
command->addJob({vcsBinary(workingDirectory), arguments}, vcsTimeoutS()); command->addJob({vcsBinary(workingDirectory), arguments}, vcsTimeoutS());
command->start(); command->start();
} }
@@ -221,7 +221,7 @@ VcsCommand *VcsBaseClientImpl::createVcsCommand(const FilePath &defaultWorkingDi
VcsBaseEditorWidget *VcsBaseClientImpl::createVcsEditor(Id kind, QString title, VcsBaseEditorWidget *VcsBaseClientImpl::createVcsEditor(Id kind, QString title,
const FilePath &source, const FilePath &source,
const TextCodec &codec, const TextEncoding &encoding,
const char *registerDynamicProperty, const char *registerDynamicProperty,
const QString &dynamicPropertyValue) const const QString &dynamicPropertyValue) const
{ {
@@ -243,8 +243,8 @@ VcsBaseEditorWidget *VcsBaseClientImpl::createVcsEditor(Id kind, QString title,
this, &VcsBaseClientImpl::annotateRevisionRequested); this, &VcsBaseClientImpl::annotateRevisionRequested);
baseEditor->setSource(source); baseEditor->setSource(source);
baseEditor->setDefaultLineNumber(1); baseEditor->setDefaultLineNumber(1);
if (codec.isValid()) if (encoding.isValid())
baseEditor->setCodec(codec); baseEditor->setEncoding(encoding);
} }
baseEditor->setForceReadOnly(true); baseEditor->setForceReadOnly(true);
@@ -344,7 +344,7 @@ void VcsBaseClient::annotate(const Utils::FilePath &workingDir, const QString &f
const FilePath source = VcsBaseEditor::getSource(workingDir, file); const FilePath source = VcsBaseEditor::getSource(workingDir, file);
VcsBaseEditorWidget *editor = createVcsEditor(kind, title, source, VcsBaseEditorWidget *editor = createVcsEditor(kind, title, source,
VcsBaseEditor::getCodec(source), VcsBaseEditor::getEncoding(source),
vcsCmdString.toLatin1().constData(), id); vcsCmdString.toLatin1().constData(), id);
VcsCommand *cmd = createCommand(workingDir, editor); VcsCommand *cmd = createCommand(workingDir, editor);
@@ -360,7 +360,7 @@ void VcsBaseClient::diff(const FilePath &workingDir, const QStringList &files)
const QString title = vcsEditorTitle(vcsCmdString, id); const QString title = vcsEditorTitle(vcsCmdString, id);
const FilePath source = VcsBaseEditor::getSource(workingDir, files); const FilePath source = VcsBaseEditor::getSource(workingDir, files);
VcsBaseEditorWidget *editor = createVcsEditor(kind, title, source, VcsBaseEditorWidget *editor = createVcsEditor(kind, title, source,
VcsBaseEditor::getCodec(source), VcsBaseEditor::getEncoding(source),
vcsCmdString.toLatin1().constData(), id); vcsCmdString.toLatin1().constData(), id);
editor->setWorkingDirectory(workingDir); editor->setWorkingDirectory(workingDir);
@@ -383,7 +383,7 @@ void VcsBaseClient::diff(const FilePath &workingDir, const QStringList &files)
args << editorConfig->arguments(); args << editorConfig->arguments();
args << files; args << files;
VcsCommand *command = createCommand(workingDir, editor); VcsCommand *command = createCommand(workingDir, editor);
command->setCodec(source.isEmpty() ? TextCodec() : VcsBaseEditor::getCodec(source)); command->setEncoding(source.isEmpty() ? TextEncoding() : VcsBaseEditor::getEncoding(source));
enqueueJob(command, args, workingDir, exitCodeInterpreter(DiffCommand)); enqueueJob(command, args, workingDir, exitCodeInterpreter(DiffCommand));
} }
@@ -399,7 +399,7 @@ void VcsBaseClient::log(const FilePath &workingDir,
const QString title = vcsEditorTitle(vcsCmdString, id); const QString title = vcsEditorTitle(vcsCmdString, id);
const FilePath source = VcsBaseEditor::getSource(workingDir, files); const FilePath source = VcsBaseEditor::getSource(workingDir, files);
VcsBaseEditorWidget *editor = createVcsEditor(kind, title, source, VcsBaseEditorWidget *editor = createVcsEditor(kind, title, source,
VcsBaseEditor::getCodec(source), VcsBaseEditor::getEncoding(source),
vcsCmdString.toLatin1().constData(), id); vcsCmdString.toLatin1().constData(), id);
editor->setFileLogAnnotateEnabled(enableAnnotationContextMenu); editor->setFileLogAnnotateEnabled(enableAnnotationContextMenu);
@@ -535,7 +535,7 @@ void VcsBaseClient::view(const FilePath &source,
const QString title = vcsEditorTitle(vcsCommandString(LogCommand), id); const QString title = vcsEditorTitle(vcsCommandString(LogCommand), id);
VcsBaseEditorWidget *editor = createVcsEditor(kind, title, source, VcsBaseEditorWidget *editor = createVcsEditor(kind, title, source,
VcsBaseEditor::getCodec(source), "view", id); VcsBaseEditor::getEncoding(source), "view", id);
const FilePath workingDirPath = source.isFile() ? source.absolutePath() : source; const FilePath workingDirPath = source.isFile() ? source.absolutePath() : source;
enqueueJob(createCommand(workingDirPath, editor), args, source); enqueueJob(createCommand(workingDirPath, editor), args, source);

View File

@@ -47,7 +47,7 @@ public:
VcsBaseEditorWidget *createVcsEditor(Utils::Id kind, QString title, VcsBaseEditorWidget *createVcsEditor(Utils::Id kind, QString title,
const Utils::FilePath &source, const Utils::FilePath &source,
const Utils::TextCodec &codec, const Utils::TextEncoding &encoding,
const char *registerDynamicProperty, const char *registerDynamicProperty,
const QString &dynamicPropertyValue) const; const QString &dynamicPropertyValue) const;
@@ -77,18 +77,18 @@ public:
// Fully synchronous VCS execution (QProcess-based) // Fully synchronous VCS execution (QProcess-based)
CommandResult vcsSynchronousExec(const Utils::FilePath &workingDir, CommandResult vcsSynchronousExec(const Utils::FilePath &workingDir,
const QStringList &args, RunFlags flags = RunFlags::None, const QStringList &args, RunFlags flags = RunFlags::None,
int timeoutS = -1, const Utils::TextCodec &codec = {}) const; int timeoutS = -1, const Utils::TextEncoding &encoding = {}) const;
CommandResult vcsSynchronousExec(const Utils::FilePath &workingDir, CommandResult vcsSynchronousExec(const Utils::FilePath &workingDir,
const Utils::CommandLine &cmdLine, const Utils::CommandLine &cmdLine,
RunFlags flags = RunFlags::None, RunFlags flags = RunFlags::None,
int timeoutS = -1, const Utils::TextCodec &codec = {}) const; int timeoutS = -1, const Utils::TextEncoding &encoding = {}) const;
void vcsExecWithHandler(const Utils::FilePath &workingDirectory, void vcsExecWithHandler(const Utils::FilePath &workingDirectory,
const QStringList &arguments, const QStringList &arguments,
const QObject *context, const QObject *context,
const CommandHandler &handler, const CommandHandler &handler,
RunFlags additionalFlags = RunFlags::None, RunFlags additionalFlags = RunFlags::None,
const Utils::TextCodec codec = {}) const; const Utils::TextEncoding &encoding = {}) const;
void vcsExec(const Utils::FilePath &workingDirectory, void vcsExec(const Utils::FilePath &workingDirectory,
const QStringList &arguments, const QStringList &arguments,
RunFlags additionalFlags = RunFlags::None) const; RunFlags additionalFlags = RunFlags::None) const;

View File

@@ -832,17 +832,17 @@ void VcsBaseEditorWidget::setWorkingDirectory(const FilePath &wd)
d->m_workingDirectory = wd; d->m_workingDirectory = wd;
} }
TextCodec VcsBaseEditorWidget::codec() const TextEncoding VcsBaseEditorWidget::encoding() const
{ {
return textDocument()->codec(); return textDocument()->encoding();
} }
void VcsBaseEditorWidget::setCodec(const TextCodec &codec) void VcsBaseEditorWidget::setEncoding(const TextEncoding &encoding)
{ {
if (codec.isValid()) if (encoding.isValid())
textDocument()->setCodec(codec); textDocument()->setEncoding(encoding);
else else
qWarning("%s: Attempt to set no codec.", Q_FUNC_INFO); qWarning("%s: Attempt to set invalid encoding.", Q_FUNC_INFO);
} }
EditorContentType VcsBaseEditorWidget::contentType() const EditorContentType VcsBaseEditorWidget::contentType() const
@@ -1229,43 +1229,43 @@ DiffChunk VcsBaseEditorWidget::diffChunk(QTextCursor cursor) const
} }
// Find the codec used for a file querying the editor. // Find the codec used for a file querying the editor.
static TextCodec findFileCodec(const FilePath &source) static TextEncoding findFileCodec(const FilePath &source)
{ {
IDocument *document = DocumentModel::documentForFilePath(source); IDocument *document = DocumentModel::documentForFilePath(source);
if (auto textDocument = qobject_cast<BaseTextDocument *>(document)) if (auto textDocument = qobject_cast<BaseTextDocument *>(document))
return textDocument->codec(); return textDocument->codec().name();
return {}; return {};
} }
// Find the codec by checking the projects (root dir of project file) // Find the codec by checking the projects (root dir of project file)
static TextCodec findProjectCodec(const FilePath &dirPath) static TextEncoding findProjectCodec(const FilePath &dirPath)
{ {
// Try to find a project under which file tree the file is. // Try to find a project under which file tree the file is.
const auto projects = ProjectExplorer::ProjectManager::projects(); const auto projects = ProjectExplorer::ProjectManager::projects();
const auto *p const auto *p
= findOrDefault(projects, equal(&ProjectExplorer::Project::projectDirectory, dirPath)); = findOrDefault(projects, equal(&ProjectExplorer::Project::projectDirectory, dirPath));
return p ? p->editorConfiguration()->textCodec() : TextCodec(); return p ? TextEncoding(p->editorConfiguration()->textCodec().name()) : TextEncoding();
} }
TextCodec VcsBaseEditor::getCodec(const FilePath &source) TextEncoding VcsBaseEditor::getEncoding(const FilePath &source)
{ {
if (!source.isEmpty()) { if (!source.isEmpty()) {
// Check file // Check file
if (source.isFile()) if (source.isFile())
if (TextCodec fc = findFileCodec(source); fc.isValid()) if (TextEncoding fc = findFileCodec(source); fc.isValid())
return fc; return fc;
// Find by project via directory // Find by project via directory
if (TextCodec pc = findProjectCodec(source.isFile() ? source.absolutePath() : source); pc.isValid()) if (TextEncoding pc = findProjectCodec(source.isFile() ? source.absolutePath() : source); pc.isValid())
return pc; return pc;
} }
return TextCodec::codecForLocale(); return QStringConverter::System;
} }
TextCodec VcsBaseEditor::getCodec(const FilePath &workingDirectory, const QStringList &files) TextEncoding VcsBaseEditor::getEncoding(const FilePath &workingDirectory, const QStringList &files)
{ {
if (files.empty()) if (files.empty())
return getCodec(workingDirectory); return getEncoding(workingDirectory);
return getCodec(workingDirectory / files.front()); return getEncoding(workingDirectory / files.front());
} }
VcsBaseEditorWidget *VcsBaseEditor::getVcsBaseEditor(const IEditor *editor) VcsBaseEditorWidget *VcsBaseEditor::getVcsBaseEditor(const IEditor *editor)

View File

@@ -70,8 +70,8 @@ public:
// the editor manager and the project managers (defaults to system codec). // the editor manager and the project managers (defaults to system codec).
// The codec should be set on editors displaying diff or annotation // The codec should be set on editors displaying diff or annotation
// output. // output.
static Utils::TextCodec getCodec(const Utils::FilePath &source); static Utils::TextEncoding getEncoding(const Utils::FilePath &source);
static Utils::TextCodec getCodec(const Utils::FilePath &workingDirectory, const QStringList &files); static Utils::TextEncoding getEncoding(const Utils::FilePath &workingDirectory, const QStringList &files);
// Utility to return the widget from the IEditor returned by the editor // Utility to return the widget from the IEditor returned by the editor
// manager which is a BaseTextEditor. // manager which is a BaseTextEditor.
@@ -173,8 +173,8 @@ public:
void setHighlightingEnabled(bool e); void setHighlightingEnabled(bool e);
Utils::TextCodec codec() const; Utils::TextEncoding encoding() const;
void setCodec(const Utils::TextCodec &codec); void setEncoding(const Utils::TextEncoding &encoding);
// Base directory for diff views // Base directory for diff views
Utils::FilePath workingDirectory() const; Utils::FilePath workingDirectory() const;

View File

@@ -67,7 +67,7 @@ public:
QString m_displayName; QString m_displayName;
const FilePath m_defaultWorkingDirectory; const FilePath m_defaultWorkingDirectory;
Environment m_environment; Environment m_environment;
TextCodec m_codec; TextEncoding m_encoding;
ProgressParser m_progressParser = {}; ProgressParser m_progressParser = {};
QList<Job> m_jobs; QList<Job> m_jobs;
@@ -105,8 +105,8 @@ void VcsCommandPrivate::setupProcess(Process *process, const Job &job)
process->setEnvironment(environment()); process->setEnvironment(environment());
if (m_flags & RunFlags::MergeOutputChannels) if (m_flags & RunFlags::MergeOutputChannels)
process->setProcessChannelMode(QProcess::MergedChannels); process->setProcessChannelMode(QProcess::MergedChannels);
if (m_codec.isValid()) if (m_encoding.isValid())
process->setCodec(m_codec); process->setEncoding(m_encoding);
process->setUseCtrlCStub(true); process->setUseCtrlCStub(true);
installStdCallbacks(process); installStdCallbacks(process);
@@ -290,11 +290,11 @@ ProcessResult VcsCommand::result() const
CommandResult VcsCommand::runBlocking(const FilePath &workingDirectory, CommandResult VcsCommand::runBlocking(const FilePath &workingDirectory,
const Environment &environment, const Environment &environment,
const CommandLine &command, RunFlags flags, const CommandLine &command, RunFlags flags,
int timeoutS, const TextCodec &codec) int timeoutS, const TextEncoding &codec)
{ {
VcsCommand vcsCommand(workingDirectory, environment); VcsCommand vcsCommand(workingDirectory, environment);
vcsCommand.addFlags(flags); vcsCommand.addFlags(flags);
vcsCommand.setCodec(codec); vcsCommand.setEncoding(codec);
return vcsCommand.runBlockingHelper(command, timeoutS); return vcsCommand.runBlockingHelper(command, timeoutS);
} }
@@ -317,9 +317,9 @@ CommandResult VcsCommand::runBlockingHelper(const CommandLine &command, int time
return CommandResult(process); return CommandResult(process);
} }
void VcsCommand::setCodec(const TextCodec &codec) void VcsCommand::setEncoding(const TextEncoding &codec)
{ {
d->m_codec = codec; d->m_encoding = codec;
} }
void VcsCommand::setProgressParser(const ProgressParser &parser) void VcsCommand::setProgressParser(const ProgressParser &parser)

View File

@@ -17,6 +17,7 @@ namespace Utils {
class CommandLine; class CommandLine;
class Environment; class Environment;
class Process; class Process;
class TextEncoding;
} }
namespace VcsBase { namespace VcsBase {
@@ -74,7 +75,7 @@ public:
void addFlags(RunFlags f); void addFlags(RunFlags f);
void setCodec(const Utils::TextCodec &codec); void setEncoding(const Utils::TextEncoding &codec);
void setProgressParser(const Core::ProgressParser &parser); void setProgressParser(const Core::ProgressParser &parser);
@@ -83,7 +84,7 @@ public:
const Utils::CommandLine &command, const Utils::CommandLine &command,
RunFlags flags, RunFlags flags,
int timeoutS, int timeoutS,
const Utils::TextCodec &codec); const Utils::TextEncoding &codec);
void cancel(); void cancel();
QString cleanedStdOut() const; QString cleanedStdOut() const;