diff --git a/src/libs/utils/qtcprocess.cpp b/src/libs/utils/qtcprocess.cpp index 504234cea6c..453a620aeec 100644 --- a/src/libs/utils/qtcprocess.cpp +++ b/src/libs/utils/qtcprocess.cpp @@ -1803,6 +1803,11 @@ void Process::setCodec(const TextCodec &codec) d->m_stdErrCodec = codec; } +void Process::setEncoding(const TextEncoding &encoding) +{ + setCodec(TextCodec::codecForName(encoding)); +} + void Process::setUtf8Codec() { d->m_stdOutCodec = TextCodec::utf8(); diff --git a/src/libs/utils/qtcprocess.h b/src/libs/utils/qtcprocess.h index a1d87747c75..ff2c50ddb47 100644 --- a/src/libs/utils/qtcprocess.h +++ b/src/libs/utils/qtcprocess.h @@ -27,6 +27,7 @@ class DeviceProcessHooks; class ProcessInterface; class ProcessResultData; class ProcessRunData; +class TextEncoding; class QTCREATOR_UTILS_EXPORT Process final : public QObject { @@ -144,6 +145,7 @@ public: EventLoopMode eventLoopMode = EventLoopMode::Off); 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 setUtf8StdOutCodec(); // for stdOut, stdErr uses executable.processStdErrCodec() diff --git a/src/libs/utils/textcodec.cpp b/src/libs/utils/textcodec.cpp index ab3e37cb6ac..141ed23e5a1 100644 --- a/src/libs/utils/textcodec.cpp +++ b/src/libs/utils/textcodec.cpp @@ -11,6 +11,8 @@ namespace Utils { // TextEncoding +TextEncoding::TextEncoding() = default; + TextEncoding::TextEncoding(const QByteArray &name) : m_name(name) {} @@ -19,6 +21,20 @@ TextEncoding::TextEncoding(QStringConverter::Encoding 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 diff --git a/src/libs/utils/textcodec.h b/src/libs/utils/textcodec.h index cc11712a161..9ed3f6970c5 100644 --- a/src/libs/utils/textcodec.h +++ b/src/libs/utils/textcodec.h @@ -17,13 +17,19 @@ namespace Utils { class QTCREATOR_UTILS_EXPORT TextEncoding { public: + TextEncoding(); TextEncoding(const QByteArray &name); TextEncoding(QStringEncoder::Encoding encoding); operator QByteArray() const { return m_name; } QByteArray name() const { return m_name; } + bool isValid() const; + 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; }; diff --git a/src/plugins/clearcase/clearcaseplugin.cpp b/src/plugins/clearcase/clearcaseplugin.cpp index a41f46a8c35..c00151a79f3 100644 --- a/src/plugins/clearcase/clearcaseplugin.cpp +++ b/src/plugins/clearcase/clearcaseplugin.cpp @@ -234,12 +234,12 @@ private: FilePath ccViewRoot(const FilePath &directory) const; FilePath findTopLevel(const FilePath &directory) const; 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, const QStringList &arguments) const; CommandResult runCleartool(const FilePath &workingDir, const QStringList &arguments, VcsBase::RunFlags flags = VcsBase::RunFlags::None, - const TextCodec &codec = {}, int timeoutMultiplier = 1) const; + const TextEncoding &encoding = {}, int timeoutMultiplier = 1) const; static void sync(QPromise &promise, FilePaths files); void history(const FilePath &workingDir, @@ -256,7 +256,7 @@ private: QString diffExternal(QString file1, QString file2 = QString(), bool keep = false); QString getFile(const QString &nativeFile, const QString &prefix); QString runExtDiff(const FilePath &workingDir, const QStringList &arguments, int timeOutS, - const TextCodec &outputCodec = {}); + const TextEncoding &encoding = {}); static FilePath getDriveLetterOfPath(FilePath directory); FileStatus::Status getFileStatus(const FilePath &fileName) const; @@ -1181,7 +1181,7 @@ void ClearCasePluginPrivate::ccDiffWithPred(const FilePath &workingDir, const QS if (Constants::debug) qDebug() << Q_FUNC_INFO << 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)) { const QString file = files.first(); @@ -1221,7 +1221,7 @@ void ClearCasePluginPrivate::ccDiffWithPred(const FilePath &workingDir, const QS diffname = QDir::toNativeSeparators(files.first()); } 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); VcsBaseEditor::tagEditor(editor, tag); auto diffEditorWidget = qobject_cast(editor->widget()); @@ -1438,7 +1438,7 @@ void ClearCasePluginPrivate::history(const FilePath &workingDir, const QStringList &files, bool enableAnnotationContextMenu) { - const TextCodec codec = VcsBaseEditor::getCodec(workingDir, files); + const TextEncoding encoding = VcsBaseEditor::getEncoding(workingDir, files); // no need for temp file QStringList args(QLatin1String("lshistory")); if (m_settings.historyCount > 0) @@ -1448,7 +1448,7 @@ void ClearCasePluginPrivate::history(const FilePath &workingDir, for (const QString &file : files) 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) return; @@ -1465,7 +1465,7 @@ void ClearCasePluginPrivate::history(const FilePath &workingDir, const QString title = QString::fromLatin1("cc history %1").arg(id); const FilePath source = VcsBaseEditor::getSource(workingDir, files); IEditor *newEditor = showOutputInEditor(title, result.cleanedStdOut(), - LOG_EDITOR_ID, source, codec); + LOG_EDITOR_ID, source, encoding); VcsBaseEditor::tagEditor(newEditor, tag); if (enableAnnotationContextMenu) VcsBaseEditor::getVcsBaseEditor(newEditor)->setFileLogAnnotateEnabled(true); @@ -1528,7 +1528,7 @@ void ClearCasePluginPrivate::vcsAnnotateHelper(const FilePath &workingDir, const qDebug() << Q_FUNC_INFO << 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 QString id = file; @@ -1541,7 +1541,7 @@ void ClearCasePluginPrivate::vcsAnnotateHelper(const FilePath &workingDir, const args << QLatin1String("-out") << QLatin1String("-"); 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) return; @@ -1568,7 +1568,7 @@ void ClearCasePluginPrivate::vcsAnnotateHelper(const FilePath &workingDir, const EditorManager::activateEditor(editor); } else { 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::gotoLineOfEditor(newEditor, lineNumber); } @@ -1587,8 +1587,8 @@ void ClearCasePluginPrivate::vcsDescribe(const FilePath &source, const QString & const FilePath relPath = source.relativePathFromDir(topLevel); const QString id = QString::fromLatin1("%1@@%2").arg(relPath.toUserOutput(), changeNr); - const TextCodec codec = VcsBaseEditor::getCodec(source); - const CommandResult result = runCleartool(topLevel, {"describe", id}, RunFlags::None, codec); + const TextEncoding encoding = VcsBaseEditor::getEncoding(source); + const CommandResult result = runCleartool(topLevel, {"describe", id}, RunFlags::None, encoding); description = result.cleanedStdOut(); if (m_settings.extDiffAvailable) description += diffExternal(id); @@ -1601,7 +1601,7 @@ void ClearCasePluginPrivate::vcsDescribe(const FilePath &source, const QString & EditorManager::activateEditor(editor); } else { 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); } } @@ -1625,7 +1625,7 @@ CommandResult ClearCasePluginPrivate::runCleartoolProc(const FilePath &workingDi CommandResult ClearCasePluginPrivate::runCleartool(const FilePath &workingDir, const QStringList &arguments, RunFlags flags, - const TextCodec &codec, + const TextEncoding &encoding, int timeoutMultiplier) const { if (m_settings.ccBinaryPath.isEmpty()) @@ -1633,16 +1633,16 @@ CommandResult ClearCasePluginPrivate::runCleartool(const FilePath &workingDir, const int timeoutS = m_settings.timeOutS * timeoutMultiplier; 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, Id id, const FilePath &source, - const TextCodec &codec) const + const TextEncoding &encoding) const { if (Constants::debug) qDebug() << "ClearCasePlugin::showOutputInEditor" << title << id.name() - << "Size= " << output.size() << codec.displayName(); + << "Size= " << output.size() << encoding.name(); QString s = title; IEditor *editor = EditorManager::openEditorWithContents(id, &s, output.toUtf8()); auto e = qobject_cast(editor->widget()); @@ -1655,8 +1655,8 @@ IEditor *ClearCasePluginPrivate::showOutputInEditor(const QString& title, const e->textDocument()->setFallbackSaveAsFileName(s); if (!source.isEmpty()) e->setSource(source); - if (codec.isValid()) - e->setCodec(codec); + if (encoding.isValid()) + e->setEncoding(encoding); return editor; } @@ -2202,7 +2202,7 @@ QString ClearCasePluginPrivate::getFile(const QString &nativeFile, const QString // runs external (GNU) diff, and returns the stdout result 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.isEmpty()) { @@ -2234,7 +2234,7 @@ QString ClearCasePluginPrivate::diffExternal(QString file1, QString file2, bool } else { 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()) { QFile::remove(tempFile1); 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, - int timeOutS, const TextCodec &outputCodec) + int timeOutS, const TextEncoding &encoding) { Process process; 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.runBlocking(seconds(timeOutS), EventLoopMode::On); if (process.result() != ProcessResult::FinishedWithSuccess) diff --git a/src/plugins/coreplugin/textdocument.cpp b/src/plugins/coreplugin/textdocument.cpp index f952d264207..366fd9a9a40 100644 --- a/src/plugins/coreplugin/textdocument.cpp +++ b/src/plugins/coreplugin/textdocument.cpp @@ -138,6 +138,16 @@ void BaseTextDocument::setCodec(const TextCodec &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 { return true; diff --git a/src/plugins/coreplugin/textdocument.h b/src/plugins/coreplugin/textdocument.h index c55fdcd33cc..b0a49c18d34 100644 --- a/src/plugins/coreplugin/textdocument.h +++ b/src/plugins/coreplugin/textdocument.h @@ -24,6 +24,8 @@ public: Utils::TextFileFormat format() const; Utils::TextCodec codec() const; void setCodec(const Utils::TextCodec &codec); + Utils::TextEncoding encoding() const; + void setEncoding(const Utils::TextEncoding &encoding); virtual bool supportsCodec(const QByteArray &) const; void switchUtf8Bom(); bool supportsUtf8Bom() const; diff --git a/src/plugins/cvs/cvsplugin.cpp b/src/plugins/cvs/cvsplugin.cpp index 4d982f22bd4..27d67e431d0 100644 --- a/src/plugins/cvs/cvsplugin.cpp +++ b/src/plugins/cvs/cvsplugin.cpp @@ -231,10 +231,10 @@ private: bool isCommitEditorOpen() const; 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, - RunFlags flags = RunFlags::None, const TextCodec &outputCodec = {}, + RunFlags flags = RunFlags::None, const TextEncoding &outputCodec = {}, int timeoutMultiplier = 1) const; void annotate(const FilePath &workingDir, const QString &file, @@ -950,14 +950,14 @@ void CvsPluginPrivate::filelog(const FilePath &workingDir, const QString &file, bool enableAnnotationContextMenu) { - const TextCodec codec = VcsBaseEditor::getCodec(workingDir, QStringList(file)); + const TextEncoding encoding = VcsBaseEditor::getEncoding(workingDir, QStringList(file)); // no need for temp file const QString id = VcsBaseEditor::getTitleId(workingDir, QStringList(file)); const FilePath source = VcsBaseEditor::getSource(workingDir, file); QStringList args = {"log"}; if (!file.isEmpty()) 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) return; @@ -970,7 +970,7 @@ void CvsPluginPrivate::filelog(const FilePath &workingDir, } else { const QString title = QString::fromLatin1("cvs log %1").arg(id); IEditor *newEditor = showOutputInEditor(title, response.cleanedStdOut(), - CVS_FILELOG_EDITOR_ID, source, codec); + CVS_FILELOG_EDITOR_ID, source, encoding); VcsBaseEditor::tagEditor(newEditor, tag); if (enableAnnotationContextMenu) VcsBaseEditor::getVcsBaseEditor(newEditor)->setFileLogAnnotateEnabled(true); @@ -1086,14 +1086,14 @@ void CvsPluginPrivate::annotate(const FilePath &workingDir, const QString &file, int lineNumber /* = -1 */) { 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 FilePath source = VcsBaseEditor::getSource(workingDir, file); QStringList args{"annotate"}; if (!revision.isEmpty()) args << "-r" << revision; 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) return; @@ -1110,7 +1110,7 @@ void CvsPluginPrivate::annotate(const FilePath &workingDir, const QString &file, } else { const QString title = QString::fromLatin1("cvs annotate %1").arg(id); IEditor *newEditor = showOutputInEditor(title, response.cleanedStdOut(), - CVS_ANNOTATION_EDITOR_ID, source, codec); + CVS_ANNOTATION_EDITOR_ID, source, encoding); VcsBaseEditor::tagEditor(newEditor, tag); VcsBaseEditor::gotoLineOfEditor(newEditor, lineNumber); } @@ -1241,12 +1241,12 @@ bool CvsPluginPrivate::describe(const FilePath &repositoryPath, { // Collect logs QString output; - TextCodec codec; + TextEncoding codec; const QList::iterator lend = entries.end(); for (QList::iterator it = entries.begin(); it != lend; ++it) { // Before fiddling file names, try to find codec if (!codec.isValid()) - codec = VcsBaseEditor::getCodec(repositoryPath, QStringList(it->file)); + codec = VcsBaseEditor::getEncoding(repositoryPath, QStringList(it->file)); // Run log const QStringList args{"log", "-r", it->revisions.front().revision, it->file}; const auto logResponse = runCvs(repositoryPath, args); @@ -1301,7 +1301,7 @@ bool CvsPluginPrivate::describe(const FilePath &repositoryPath, // the working directory (see above). CommandResult CvsPluginPrivate::runCvs(const FilePath &workingDirectory, const QStringList &arguments, RunFlags flags, - const TextCodec &outputCodec, int timeoutMultiplier) const + const TextEncoding &outputCodec, int timeoutMultiplier) const { const FilePath executable = settings().binaryPath(); if (executable.isEmpty()) @@ -1315,7 +1315,7 @@ CommandResult CvsPluginPrivate::runCvs(const FilePath &workingDirectory, IEditor *CvsPluginPrivate::showOutputInEditor(const QString& title, const QString &output, Utils::Id id, const FilePath &source, - const TextCodec &codec) + const TextEncoding &encoding) { QString s = title; IEditor *editor = EditorManager::openEditorWithContents(id, &s, output.toUtf8()); @@ -1328,8 +1328,8 @@ IEditor *CvsPluginPrivate::showOutputInEditor(const QString& title, const QStrin e->setForceReadOnly(true); if (!source.isEmpty()) e->setSource(source); - if (codec.isValid()) - e->setCodec(codec); + if (encoding.isValid()) + e->setEncoding(encoding); return editor; } diff --git a/src/plugins/fossil/fossilclient.cpp b/src/plugins/fossil/fossilclient.cpp index 9754a06967b..267c1d37252 100644 --- a/src/plugins/fossil/fossilclient.cpp +++ b/src/plugins/fossil/fossilclient.cpp @@ -674,7 +674,7 @@ void FossilClient::annotate(const FilePath &workingDir, const QString &file, int const FilePath source = VcsBaseEditor::getSource(workingDir, file); VcsBaseEditorWidget *editor = createVcsEditor(kind, title, source, - VcsBaseEditor::getCodec(source), + VcsBaseEditor::getEncoding(source), vcsCmdString.toLatin1().constData(), id); auto fossilEditor = qobject_cast(editor); @@ -790,7 +790,7 @@ void FossilClient::view(const FilePath &source, const QString &id, const QString const QString title = vcsEditorTitle(vcsCommandString(DiffCommand), id); VcsBaseEditorWidget *editor = createVcsEditor(kind, title, source, - VcsBaseEditor::getCodec(source), "view", id); + VcsBaseEditor::getEncoding(source), "view", id); editor->setWorkingDirectory(workingDirectory); 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 FilePath source = VcsBaseEditor::getSource(workingDir, files); VcsBaseEditorWidget *editor = createVcsEditor(kind, title, source, - VcsBaseEditor::getCodec(source), + VcsBaseEditor::getEncoding(source), vcsCmdString.toLatin1().constData(), id); auto fossilEditor = qobject_cast(editor); @@ -919,7 +919,7 @@ void FossilClient::logCurrentFile(const FilePath &workingDir, const QStringList const QString title = vcsEditorTitle(vcsCmdString, id); const FilePath source = VcsBaseEditor::getSource(workingDir, files); VcsBaseEditorWidget *editor = createVcsEditor(kind, title, source, - VcsBaseEditor::getCodec(source), + VcsBaseEditor::getEncoding(source), vcsCmdString.toLatin1().constData(), id); auto fossilEditor = qobject_cast(editor); diff --git a/src/plugins/git/commitdata.h b/src/plugins/git/commitdata.h index c64bd635089..d970d76dfe5 100644 --- a/src/plugins/git/commitdata.h +++ b/src/plugins/git/commitdata.h @@ -93,7 +93,7 @@ public: CommitType commitType; QString amendHash; - Utils::TextCodec commitEncoding; + Utils::TextEncoding commitEncoding; GitSubmitEditorPanelInfo panelInfo; GitSubmitEditorPanelData panelData; bool enablePush = false; diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp index 62c66adb04d..17c6c88a623 100644 --- a/src/plugins/git/gitclient.cpp +++ b/src/plugins/git/gitclient.cpp @@ -239,7 +239,7 @@ GitDiffEditorController::GitDiffEditorController(IDocument *document, const Storage diffInputStorage; 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))}); VcsOutputWindow::appendCommand(process.workingDirectory(), process.commandLine()); }; @@ -305,7 +305,7 @@ FileListDiffController::FileListDiffController(IDocument *document, const QStrin const auto onStagedSetup = [this, stagedFiles](Process &process) { if (stagedFiles.isEmpty()) return SetupResult::StopWithError; - process.setCodec(VcsBaseEditor::getCodec(workingDirectory(), stagedFiles)); + process.setEncoding(VcsBaseEditor::getEncoding(workingDirectory(), stagedFiles)); setupCommand(process, addConfigurationArguments( QStringList({"diff", "--cached", "--"}) + stagedFiles)); VcsOutputWindow::appendCommand(process.workingDirectory(), process.commandLine()); @@ -318,7 +318,7 @@ FileListDiffController::FileListDiffController(IDocument *document, const QStrin const auto onUnstagedSetup = [this, unstagedFiles](Process &process) { if (unstagedFiles.isEmpty()) return SetupResult::StopWithError; - process.setCodec(VcsBaseEditor::getCodec(workingDirectory(), unstagedFiles)); + process.setEncoding(VcsBaseEditor::getEncoding(workingDirectory(), unstagedFiles)); setupCommand(process, addConfigurationArguments( QStringList({"diff", "--"}) + unstagedFiles)); VcsOutputWindow::appendCommand(process.workingDirectory(), process.commandLine()); @@ -394,7 +394,7 @@ ShowController::ShowController(IDocument *document, const QString &id) }; 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 QString showFormat = QStringLiteral( @@ -975,29 +975,29 @@ void GitClient::updateNextModificationInfo() this, command, RunFlags::NoOutput); } -TextCodec GitClient::defaultCommitEncoding() const +TextEncoding GitClient::defaultCommitEncoding() const { // Set default commit encoding to 'UTF-8', when it's not set, // 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(); if (codecName.isEmpty()) return defaultCommitEncoding(); - return TextCodec::codecForName(codecName.toUtf8()); + return TextEncoding(codecName.toUtf8()); }; switch (encodingType) { case EncodingSource: - return source.isFile() ? VcsBaseEditor::getCodec(source) : codec(source, "gui.encoding"); + return source.isFile() ? VcsBaseEditor::getEncoding(source) : encoding(source, "gui.encoding"); case EncodingLogOutput: - return codec(source, "i18n.logOutputEncoding"); + return encoding(source, "i18n.logOutputEncoding"); case EncodingCommit: - return codec(source, "i18n.commitEncoding"); + return encoding(source, "i18n.commitEncoding"); default: return {}; } @@ -2711,14 +2711,15 @@ Result GitClient::enrichCommitData(const FilePath &repoDirectory, } CommitData commitData = commitDataIn; - const TextCodec authorCodec = HostOsInfo::isWindowsHost() - ? TextCodec::utf8() + const TextEncoding authorEncoding = HostOsInfo::isWindowsHost() + ? QStringConverter::Utf8 : commitData.commitEncoding; + const TextCodec authorCodec = TextCodec::codecForName(authorEncoding); QByteArray stdOut = result.rawStdOut(); commitData.amendHash = QLatin1String(shiftLogLine(stdOut)); commitData.panelData.author = 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; } @@ -3565,20 +3566,20 @@ QString GitClient::readGitVar(const FilePath &workingDirectory, const QString &c return readOneLine(workingDirectory, {"var", configVar}); } -static TextCodec configFileCodec() +static TextEncoding configFileEncoding() { // Git for Windows always uses UTF-8 for configuration: // https://github.com/msysgit/msysgit/wiki/Git-for-Windows-Unicode-Support#convert-config-files - static const TextCodec codec = - HostOsInfo::isWindowsHost() ? TextCodec::utf8() : TextCodec::codecForLocale(); - return codec; + static const TextEncoding encoding = + HostOsInfo::isWindowsHost() ? QStringConverter::Utf8 : TextCodec::encodingForLocale(); + return encoding; } QString GitClient::readOneLine(const FilePath &workingDirectory, const QStringList &arguments) const { const CommandResult result = vcsSynchronousExec(workingDirectory, arguments, RunFlags::NoOutput, vcsTimeoutS(), - configFileCodec()); + configFileEncoding()); if (result.result() == ProcessResult::FinishedWithSuccess) return result.cleanedStdOut().trimmed(); return {}; @@ -3588,7 +3589,7 @@ void GitClient::readConfigAsync(const FilePath &workingDirectory, const QStringL const CommandHandler &handler) const { vcsExecWithHandler(workingDirectory, arguments, this, handler, RunFlags::NoOutput, - configFileCodec()); + configFileEncoding()); } QString GitClient::styleColorName(TextEditor::TextStyle style) diff --git a/src/plugins/git/gitclient.h b/src/plugins/git/gitclient.h index aa4586a08d1..49a47afb7d2 100644 --- a/src/plugins/git/gitclient.h +++ b/src/plugins/git/gitclient.h @@ -362,9 +362,9 @@ public: Author parseAuthor(const QString &authorInfo); Author getAuthor(const Utils::FilePath &workingDirectory); - Utils::TextCodec defaultCommitEncoding() const; + Utils::TextEncoding defaultCommitEncoding() const; 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, const VcsBase::CommandHandler &handler) const; diff --git a/src/plugins/git/giteditor.cpp b/src/plugins/git/giteditor.cpp index d00a39226aa..fef32ebfb2f 100644 --- a/src/plugins/git/giteditor.cpp +++ b/src/plugins/git/giteditor.cpp @@ -265,7 +265,7 @@ void GitEditorWidget::aboutToOpen(const FilePath &filePath, const FilePath &real || editorId == Git::Constants::GIT_REBASE_EDITOR_ID) { const FilePath gitPath = filePath.absolutePath(); setSource(gitPath); - textDocument()->setCodec(gitClient().encoding(GitClient::EncodingCommit, gitPath)); + textDocument()->setCodec(TextCodec::codecForName(gitClient().encoding(GitClient::EncodingCommit, gitPath))); } } diff --git a/src/plugins/git/gitsubmiteditor.cpp b/src/plugins/git/gitsubmiteditor.cpp index 48cb82c575a..338eb8aa2ab 100644 --- a/src/plugins/git/gitsubmiteditor.cpp +++ b/src/plugins/git/gitsubmiteditor.cpp @@ -330,7 +330,7 @@ QByteArray GitSubmitEditor::fileContents() const // Do the encoding convert, When use user-defined encoding // e.g. git config --global i18n.commitencoding utf-8 if (m_commitEncoding.isValid()) - return m_commitEncoding.fromUnicode(text); + return TextCodec::codecForName(m_commitEncoding).fromUnicode(text); // Using utf-8 as the default encoding return text.toUtf8(); diff --git a/src/plugins/git/gitsubmiteditor.h b/src/plugins/git/gitsubmiteditor.h index e74565df84a..2fbb529a2eb 100644 --- a/src/plugins/git/gitsubmiteditor.h +++ b/src/plugins/git/gitsubmiteditor.h @@ -48,7 +48,7 @@ private: inline const GitSubmitEditorWidget *submitEditorWidget() const; VcsBase::SubmitFileModel *m_model = nullptr; - Utils::TextCodec m_commitEncoding; + Utils::TextEncoding m_commitEncoding; CommitType m_commitType = SimpleCommit; QString m_amenHash; Utils::FilePath m_workingDirectory; diff --git a/src/plugins/git/instantblame.cpp b/src/plugins/git/instantblame.cpp index 10b9a364350..6672453d1c0 100644 --- a/src/plugins/git/instantblame.cpp +++ b/src/plugins/git/instantblame.cpp @@ -211,7 +211,7 @@ void BlameMark::addNewLine(const QString &newLine) InstantBlame::InstantBlame() { - m_codec = gitClient().defaultCommitEncoding(); + m_encoding = gitClient().defaultCommitEncoding(); m_cursorPositionChangedTimer = new QTimer(this); m_cursorPositionChangedTimer->setSingleShot(true); connect(m_cursorPositionChangedTimer, &QTimer::timeout, this, &InstantBlame::perform); @@ -460,7 +460,7 @@ void InstantBlame::perform() qCDebug(log) << "Running git" << lineDiffOptions.join(' '); gitClient().vcsExecWithHandler(topLevel, lineDiffOptions, this, - lineDiffHandler, RunFlags::NoOutput, m_codec); + lineDiffHandler, RunFlags::NoOutput, m_encoding); }; QStringList options = {"blame", "-p"}; if (settings().instantBlameIgnoreSpaceChanges()) @@ -470,7 +470,7 @@ void InstantBlame::perform() options.append({"-L", lineString, "--", filePath.toUrlishString()}); qCDebug(log) << "Running git" << options.join(' '); gitClient().vcsExecWithHandler(workingDirectory, options, this, - commandHandler, RunFlags::NoOutput, m_codec); + commandHandler, RunFlags::NoOutput, m_encoding); } void InstantBlame::stop() @@ -494,18 +494,18 @@ bool InstantBlame::refreshWorkingDirectory(const FilePath &workingDirectory) m_workingDirectory = workingDirectory; const auto commitCodecHandler = [this, workingDirectory](const CommandResult &result) { - TextCodec codec; + TextEncoding encoding; if (result.result() == ProcessResult::FinishedWithSuccess) { const QString codecName = result.cleanedStdOut().trimmed(); - codec = TextCodec::codecForName(codecName.toUtf8()); + encoding = codecName.toUtf8(); } else { - codec = gitClient().defaultCommitEncoding(); + encoding = gitClient().defaultCommitEncoding(); } - if (m_codec != codec) { - qCInfo(log) << "Setting new text codec:" << codec.displayName(); - m_codec = codec; + if (m_encoding != encoding) { + qCInfo(log) << "Setting new text codec:" << encoding.name(); + m_encoding = encoding; force(); } }; diff --git a/src/plugins/git/instantblame.h b/src/plugins/git/instantblame.h index cffd26ad5e8..2595ca1f769 100644 --- a/src/plugins/git/instantblame.h +++ b/src/plugins/git/instantblame.h @@ -64,7 +64,7 @@ private: void slotDocumentChanged(); Utils::FilePath m_workingDirectory; - Utils::TextCodec m_codec; + Utils::TextEncoding m_encoding; Author m_author; int m_lastVisitedEditorLine = -1; Core::IDocument *m_document = nullptr; diff --git a/src/plugins/mercurial/mercurialclient.cpp b/src/plugins/mercurial/mercurialclient.cpp index 4850cc3674d..bb32871d57e 100644 --- a/src/plugins/mercurial/mercurialclient.cpp +++ b/src/plugins/mercurial/mercurialclient.cpp @@ -205,7 +205,7 @@ void MercurialClient::incoming(const FilePath &repositoryRoot, const QString &re const QString title = Tr::tr("Hg incoming %1").arg(id); VcsBaseEditorWidget *editor = createVcsEditor(Constants::DIFFLOG_ID, title, repositoryRoot, - VcsBaseEditor::getCodec(repositoryRoot), + VcsBaseEditor::getEncoding(repositoryRoot), "incoming", id); 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()); VcsBaseEditorWidget *editor = createVcsEditor(Constants::DIFFLOG_ID, title, repositoryRoot, - VcsBaseEditor::getCodec(repositoryRoot), + VcsBaseEditor::getEncoding(repositoryRoot), "outgoing", repositoryRoot.toUrlishString()); enqueueJob(createCommand(repositoryRoot, editor), args, repositoryRoot); } diff --git a/src/plugins/perforce/perforceplugin.cpp b/src/plugins/perforce/perforceplugin.cpp index 2643747cc6c..dfaae6e7c2d 100644 --- a/src/plugins/perforce/perforceplugin.cpp +++ b/src/plugins/perforce/perforceplugin.cpp @@ -238,7 +238,7 @@ public: IEditor *showOutputInEditor(const QString &title, const QString &output, Id id, const FilePath &source, - const TextCodec &codec = {}); + const TextEncoding &encoding = {}); // args are passed as command line arguments // extra args via a tempfile and the option -x "temp-filename" @@ -247,13 +247,13 @@ public: unsigned flags = CommandToWindow|StdErrToWindow|ErrorToWindow, const QStringList &extraArgs = {}, const QByteArray &stdInput = {}, - const Utils::TextCodec &outputCodec = {}) const; + const Utils::TextEncoding &encoding = {}) const; PerforceResponse synchronousProcess(const FilePath &workingDir, const QStringList &args, unsigned flags, const QByteArray &stdInput, - const Utils::TextCodec &outputCodec) const; + const Utils::TextEncoding &encoding) const; void annotate(const FilePath &workingDir, const QString &fileName, const QString &changeList = QString(), int lineNumber = -1); @@ -547,12 +547,12 @@ void PerforcePluginPrivate::revertCurrentFile() const VcsBasePluginState state = currentState(); QTC_ASSERT(state.hasFile(), return); - const TextCodec codec = VcsBaseEditor::getCodec(state.currentFile()); + const TextEncoding encoding = VcsBaseEditor::getEncoding(state.currentFile()); QStringList args; args << QLatin1String("diff") << QLatin1String("-sa") << state.relativeCurrentFile(); PerforceResponse result = runP4Cmd(state.currentFileTopLevel(), args, RunFullySynchronous|CommandToWindow|StdErrToWindow|ErrorToWindow, - {}, {}, codec); + {}, {}, encoding); if (result.error) return; // "foo.cpp - file(s) not opened on this client." @@ -796,7 +796,7 @@ void PerforcePluginPrivate::annotate(const FilePath &workingDir, int lineNumber /* = -1 */) { 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 FilePath source = VcsBaseEditor::getSource(workingDir, files); QStringList args; @@ -807,13 +807,13 @@ void PerforcePluginPrivate::annotate(const FilePath &workingDir, args << (fileName + QLatin1Char('@') + changeList); const PerforceResponse result = runP4Cmd(workingDir, args, CommandToWindow|StdErrToWindow|ErrorToWindow, - {}, {}, codec); + {}, {}, encoding); if (!result.error) { if (lineNumber < 1) lineNumber = VcsBaseEditor::lineNumberOfCurrentEditor(); IEditor *ed = showOutputInEditor(Tr::tr("p4 annotate %1").arg(id), result.stdOut, PERFORCE_ANNOTATION_EDITOR_ID, - source, codec); + source, encoding); VcsBaseEditor::gotoLineOfEditor(ed, lineNumber); } } @@ -850,7 +850,7 @@ void PerforcePluginPrivate::filelog(const FilePath &workingDir, const QString &f bool enableAnnotationContextMenu) { 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; args << QLatin1String("filelog") << QLatin1String("-li"); if (settings().logCount() > 0) @@ -859,11 +859,11 @@ void PerforcePluginPrivate::filelog(const FilePath &workingDir, const QString &f args.append(fileName); const PerforceResponse result = runP4Cmd(workingDir, args, CommandToWindow|StdErrToWindow|ErrorToWindow, - {}, {}, codec); + {}, {}, encoding); if (!result.error) { const FilePath source = VcsBaseEditor::getSource(workingDir, fileName); 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) 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) { 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; args << QLatin1String("changelists") << QLatin1String("-lit"); if (settings().logCount() > 0) @@ -881,11 +881,11 @@ void PerforcePluginPrivate::changelists(const FilePath &workingDir, const QStrin args.append(fileName); const PerforceResponse result = runP4Cmd(workingDir, args, CommandToWindow|StdErrToWindow|ErrorToWindow, - {}, {}, codec); + {}, {}, encoding); if (!result.error) { const FilePath source = VcsBaseEditor::getSource(workingDir, fileName); 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); } } @@ -1161,14 +1161,14 @@ PerforceResponse PerforcePluginPrivate::synchronousProcess(const FilePath &worki const QStringList &args, unsigned flags, const QByteArray &stdInput, - const TextCodec &outputCodec) const + const TextEncoding &encoding) const { // Run, connect stderr to the output window Process process; process.setWriteData(stdInput); const int timeOutS = (flags & LongTimeOut) ? settings().longTimeOutS() : settings().timeOutS(); - if (outputCodec.isValid()) - process.setCodec(outputCodec); + if (encoding.isValid()) + process.setEncoding(encoding); if (flags & OverrideDiffEnvironment) process.setEnvironment(overrideDiffEnvironmentVariable()); if (!workingDir.isEmpty()) @@ -1209,7 +1209,7 @@ PerforceResponse PerforcePluginPrivate::runP4Cmd(const FilePath &workingDir, unsigned flags, const QStringList &extraArgs, const QByteArray &stdInput, - const TextCodec &outputCodec) const + const TextEncoding &encoding) const { if (!settings().isValid()) { VcsOutputWindow::appendError(Tr::tr("Perforce is not correctly configured.")); @@ -1232,7 +1232,7 @@ PerforceResponse PerforcePluginPrivate::runP4Cmd(const FilePath &workingDir, QGuiApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); const PerforceResponse response - = synchronousProcess(workingDir, actualArgs, flags, stdInput, outputCodec); + = synchronousProcess(workingDir, actualArgs, flags, stdInput, encoding); if (flags & ShowBusyCursor) QGuiApplication::restoreOverrideCursor(); @@ -1243,7 +1243,7 @@ IEditor *PerforcePluginPrivate::showOutputInEditor(const QString &title, const QString &output, Id id, const FilePath &source, - const TextCodec &codec) + const TextEncoding &encoding) { QString s = title; QString content = output; @@ -1263,8 +1263,8 @@ IEditor *PerforcePluginPrivate::showOutputInEditor(const QString &title, e->setSource(source); s.replace(QLatin1Char(' '), QLatin1Char('_')); e->textDocument()->setFallbackSaveAsFileName(s); - if (codec.isValid()) - e->setCodec(codec); + if (encoding.isValid()) + e->setEncoding(encoding); return editor; } @@ -1337,7 +1337,7 @@ void PerforcePluginPrivate::p4Diff(const FilePath &workingDir, const QStringList 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); // Reuse existing editors for that id const QString tag = VcsBaseEditor::editorTag(DiffOutput, p.workingDir, p.files); @@ -1353,7 +1353,7 @@ void PerforcePluginPrivate::p4Diff(const PerforceDiffParameters &p) else args.append(p.files); 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) return; @@ -1366,7 +1366,7 @@ void PerforcePluginPrivate::p4Diff(const PerforceDiffParameters &p) IEditor *editor = showOutputInEditor(Tr::tr("p4 diff %1").arg(id), result.stdOut, PERFORCE_DIFF_EDITOR_ID, VcsBaseEditor::getSource(p.workingDir, p.files), - codec); + encoding); VcsBaseEditor::tagEditor(editor, tag); auto diffEditorWidget = qobject_cast(editor->widget()); // 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) { - const TextCodec codec = source.isEmpty() ? TextCodec() : VcsBaseEditor::getCodec(source); + const TextEncoding encoding = source.isEmpty() ? TextEncoding() : VcsBaseEditor::getEncoding(source); QStringList args; args << QLatin1String("describe") << QLatin1String("-du") << n; const PerforceResponse result = runP4Cmd(settings().topLevel(), args, CommandToWindow|StdErrToWindow|ErrorToWindow, - {}, {}, codec); + {}, {}, encoding); 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() diff --git a/src/plugins/subversion/subversionplugin.cpp b/src/plugins/subversion/subversionplugin.cpp index 8fb89e6dbdd..cf1cbfc534a 100644 --- a/src/plugins/subversion/subversionplugin.cpp +++ b/src/plugins/subversion/subversionplugin.cpp @@ -165,7 +165,7 @@ public: QString monitorFile(const FilePath &repository) const; QString synchronousTopic(const FilePath &repository) const; 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; void vcsAnnotateHelper(const FilePath &workingDir, const QString &file, const QString &revision = {}, int lineNumber = -1); @@ -200,7 +200,7 @@ private: inline bool isCommitEditorOpen() const; Core::IEditor *showOutputInEditor(const QString &title, const QString &output, Id id, const FilePath &source, - const TextCodec &codec); + const TextEncoding &encoding); void filelog(const FilePath &workingDir, const QString &file = {}, @@ -813,7 +813,7 @@ void SubversionPluginPrivate::vcsAnnotateHelper(const FilePath &workingDir, cons int lineNumber /* = -1 */) { const FilePath source = VcsBaseEditor::getSource(workingDir, file); - const TextCodec codec = VcsBaseEditor::getCodec(source); + const TextEncoding encoding = VcsBaseEditor::getEncoding(source); CommandLine args{settings().binaryPath(), {"annotate"}}; args << SubversionClient::AddAuthOptions(); @@ -823,7 +823,7 @@ void SubversionPluginPrivate::vcsAnnotateHelper(const FilePath &workingDir, cons args << "-r" << revision; 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) return; @@ -842,7 +842,7 @@ void SubversionPluginPrivate::vcsAnnotateHelper(const FilePath &workingDir, cons } else { const QString title = QString::fromLatin1("svn annotate %1").arg(id); 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::gotoLineOfEditor(newEditor, lineNumber); } @@ -897,22 +897,22 @@ void SubversionPluginPrivate::slotDescribe() CommandResult SubversionPluginPrivate::runSvn(const FilePath &workingDir, const CommandLine &command, RunFlags flags, - const TextCodec &outputCodec, int timeoutMutiplier) const + const TextEncoding &encoding, int timeoutMutiplier) const { if (settings().binaryPath().isEmpty()) return CommandResult(ProcessResult::StartFailed, Tr::tr("No subversion executable specified.")); 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, Id id, const FilePath &source, - const TextCodec &codec) + const TextEncoding &encoding) { if (Subversion::Constants::debug) qDebug() << "SubversionPlugin::showOutputInEditor" << title << id.toString() - << "Size= " << output.size() << " Type=" << id << codec.displayName(); + << "Size= " << output.size() << " Type=" << id << encoding.name(); QString s = title; IEditor *editor = EditorManager::openEditorWithContents(id, &s, output.toUtf8()); auto e = qobject_cast(editor->widget()); @@ -925,8 +925,8 @@ IEditor *SubversionPluginPrivate::showOutputInEditor(const QString &title, const e->textDocument()->setFallbackSaveAsFileName(s); if (!source.isEmpty()) e->setSource(source); - if (codec.isValid()) - e->setCodec(codec); + if (encoding.isValid()) + e->setEncoding(encoding); return editor; } diff --git a/src/plugins/vcsbase/vcsbaseclient.cpp b/src/plugins/vcsbase/vcsbaseclient.cpp index 4314ff71fbb..afd24e6e4ab 100644 --- a/src/plugins/vcsbase/vcsbaseclient.cpp +++ b/src/plugins/vcsbase/vcsbaseclient.cpp @@ -130,23 +130,23 @@ QString VcsBaseClientImpl::stripLastNewline(const QString &in) CommandResult VcsBaseClientImpl::vcsSynchronousExec(const FilePath &workingDir, 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, const CommandLine &cmdLine, RunFlags flags, int timeoutS, - const TextCodec &codec) const + const TextEncoding &encoding) const { return VcsCommand::runBlocking(workingDir, processEnvironment(workingDir), cmdLine, flags, timeoutS > 0 ? timeoutS : vcsTimeoutS(), - codec); + encoding); } void VcsBaseClientImpl::resetCachedVcsInfo(const FilePath &workingDir) @@ -171,11 +171,11 @@ void VcsBaseClientImpl::vcsExecWithHandler(const FilePath &workingDirectory, const QStringList &arguments, const QObject *context, const CommandHandler &handler, - RunFlags additionalFlags, const TextCodec codec) const + RunFlags additionalFlags, const TextEncoding &encoding) const { VcsCommand *command = createCommand(workingDirectory); command->addFlags(additionalFlags); - command->setCodec(codec); + command->setEncoding(encoding); command->addJob({vcsBinary(workingDirectory), arguments}, vcsTimeoutS()); if (handler) { const QObject *actualContext = context ? context : this; @@ -201,7 +201,7 @@ void VcsBaseClientImpl::vcsExecWithEditor(const Utils::FilePath &workingDirector VcsBaseEditorWidget *editor) const { VcsCommand *command = createCommand(workingDirectory, editor); - command->setCodec(editor->codec()); + command->setEncoding(editor->encoding().name()); command->addJob({vcsBinary(workingDirectory), arguments}, vcsTimeoutS()); command->start(); } @@ -221,7 +221,7 @@ VcsCommand *VcsBaseClientImpl::createVcsCommand(const FilePath &defaultWorkingDi VcsBaseEditorWidget *VcsBaseClientImpl::createVcsEditor(Id kind, QString title, const FilePath &source, - const TextCodec &codec, + const TextEncoding &encoding, const char *registerDynamicProperty, const QString &dynamicPropertyValue) const { @@ -243,8 +243,8 @@ VcsBaseEditorWidget *VcsBaseClientImpl::createVcsEditor(Id kind, QString title, this, &VcsBaseClientImpl::annotateRevisionRequested); baseEditor->setSource(source); baseEditor->setDefaultLineNumber(1); - if (codec.isValid()) - baseEditor->setCodec(codec); + if (encoding.isValid()) + baseEditor->setEncoding(encoding); } baseEditor->setForceReadOnly(true); @@ -344,7 +344,7 @@ void VcsBaseClient::annotate(const Utils::FilePath &workingDir, const QString &f const FilePath source = VcsBaseEditor::getSource(workingDir, file); VcsBaseEditorWidget *editor = createVcsEditor(kind, title, source, - VcsBaseEditor::getCodec(source), + VcsBaseEditor::getEncoding(source), vcsCmdString.toLatin1().constData(), id); 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 FilePath source = VcsBaseEditor::getSource(workingDir, files); VcsBaseEditorWidget *editor = createVcsEditor(kind, title, source, - VcsBaseEditor::getCodec(source), + VcsBaseEditor::getEncoding(source), vcsCmdString.toLatin1().constData(), id); editor->setWorkingDirectory(workingDir); @@ -383,7 +383,7 @@ void VcsBaseClient::diff(const FilePath &workingDir, const QStringList &files) args << editorConfig->arguments(); args << files; 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)); } @@ -399,7 +399,7 @@ void VcsBaseClient::log(const FilePath &workingDir, const QString title = vcsEditorTitle(vcsCmdString, id); const FilePath source = VcsBaseEditor::getSource(workingDir, files); VcsBaseEditorWidget *editor = createVcsEditor(kind, title, source, - VcsBaseEditor::getCodec(source), + VcsBaseEditor::getEncoding(source), vcsCmdString.toLatin1().constData(), id); editor->setFileLogAnnotateEnabled(enableAnnotationContextMenu); @@ -535,7 +535,7 @@ void VcsBaseClient::view(const FilePath &source, const QString title = vcsEditorTitle(vcsCommandString(LogCommand), id); VcsBaseEditorWidget *editor = createVcsEditor(kind, title, source, - VcsBaseEditor::getCodec(source), "view", id); + VcsBaseEditor::getEncoding(source), "view", id); const FilePath workingDirPath = source.isFile() ? source.absolutePath() : source; enqueueJob(createCommand(workingDirPath, editor), args, source); diff --git a/src/plugins/vcsbase/vcsbaseclient.h b/src/plugins/vcsbase/vcsbaseclient.h index 7417a17c8dc..d5d7df452a3 100644 --- a/src/plugins/vcsbase/vcsbaseclient.h +++ b/src/plugins/vcsbase/vcsbaseclient.h @@ -47,7 +47,7 @@ public: VcsBaseEditorWidget *createVcsEditor(Utils::Id kind, QString title, const Utils::FilePath &source, - const Utils::TextCodec &codec, + const Utils::TextEncoding &encoding, const char *registerDynamicProperty, const QString &dynamicPropertyValue) const; @@ -77,18 +77,18 @@ public: // Fully synchronous VCS execution (QProcess-based) CommandResult vcsSynchronousExec(const Utils::FilePath &workingDir, 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, const Utils::CommandLine &cmdLine, 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, const QStringList &arguments, const QObject *context, const CommandHandler &handler, RunFlags additionalFlags = RunFlags::None, - const Utils::TextCodec codec = {}) const; + const Utils::TextEncoding &encoding = {}) const; void vcsExec(const Utils::FilePath &workingDirectory, const QStringList &arguments, RunFlags additionalFlags = RunFlags::None) const; diff --git a/src/plugins/vcsbase/vcsbaseeditor.cpp b/src/plugins/vcsbase/vcsbaseeditor.cpp index 356912aab3c..8190a00f2db 100644 --- a/src/plugins/vcsbase/vcsbaseeditor.cpp +++ b/src/plugins/vcsbase/vcsbaseeditor.cpp @@ -832,17 +832,17 @@ void VcsBaseEditorWidget::setWorkingDirectory(const FilePath &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()) - textDocument()->setCodec(codec); + if (encoding.isValid()) + textDocument()->setEncoding(encoding); 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 @@ -1229,43 +1229,43 @@ DiffChunk VcsBaseEditorWidget::diffChunk(QTextCursor cursor) const } // 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); if (auto textDocument = qobject_cast(document)) - return textDocument->codec(); + return textDocument->codec().name(); return {}; } // 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. const auto projects = ProjectExplorer::ProjectManager::projects(); const auto *p = 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()) { // Check file if (source.isFile()) - if (TextCodec fc = findFileCodec(source); fc.isValid()) + if (TextEncoding fc = findFileCodec(source); fc.isValid()) return fc; // 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 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()) - return getCodec(workingDirectory); - return getCodec(workingDirectory / files.front()); + return getEncoding(workingDirectory); + return getEncoding(workingDirectory / files.front()); } VcsBaseEditorWidget *VcsBaseEditor::getVcsBaseEditor(const IEditor *editor) diff --git a/src/plugins/vcsbase/vcsbaseeditor.h b/src/plugins/vcsbase/vcsbaseeditor.h index 94b2a3d1a90..b493abc1b11 100644 --- a/src/plugins/vcsbase/vcsbaseeditor.h +++ b/src/plugins/vcsbase/vcsbaseeditor.h @@ -70,8 +70,8 @@ public: // the editor manager and the project managers (defaults to system codec). // The codec should be set on editors displaying diff or annotation // output. - static Utils::TextCodec getCodec(const Utils::FilePath &source); - static Utils::TextCodec getCodec(const Utils::FilePath &workingDirectory, const QStringList &files); + static Utils::TextEncoding getEncoding(const Utils::FilePath &source); + static Utils::TextEncoding getEncoding(const Utils::FilePath &workingDirectory, const QStringList &files); // Utility to return the widget from the IEditor returned by the editor // manager which is a BaseTextEditor. @@ -173,8 +173,8 @@ public: void setHighlightingEnabled(bool e); - Utils::TextCodec codec() const; - void setCodec(const Utils::TextCodec &codec); + Utils::TextEncoding encoding() const; + void setEncoding(const Utils::TextEncoding &encoding); // Base directory for diff views Utils::FilePath workingDirectory() const; diff --git a/src/plugins/vcsbase/vcscommand.cpp b/src/plugins/vcsbase/vcscommand.cpp index 4d96213fea8..254693d33cb 100644 --- a/src/plugins/vcsbase/vcscommand.cpp +++ b/src/plugins/vcsbase/vcscommand.cpp @@ -67,7 +67,7 @@ public: QString m_displayName; const FilePath m_defaultWorkingDirectory; Environment m_environment; - TextCodec m_codec; + TextEncoding m_encoding; ProgressParser m_progressParser = {}; QList m_jobs; @@ -105,8 +105,8 @@ void VcsCommandPrivate::setupProcess(Process *process, const Job &job) process->setEnvironment(environment()); if (m_flags & RunFlags::MergeOutputChannels) process->setProcessChannelMode(QProcess::MergedChannels); - if (m_codec.isValid()) - process->setCodec(m_codec); + if (m_encoding.isValid()) + process->setEncoding(m_encoding); process->setUseCtrlCStub(true); installStdCallbacks(process); @@ -290,11 +290,11 @@ ProcessResult VcsCommand::result() const CommandResult VcsCommand::runBlocking(const FilePath &workingDirectory, const Environment &environment, const CommandLine &command, RunFlags flags, - int timeoutS, const TextCodec &codec) + int timeoutS, const TextEncoding &codec) { VcsCommand vcsCommand(workingDirectory, environment); vcsCommand.addFlags(flags); - vcsCommand.setCodec(codec); + vcsCommand.setEncoding(codec); return vcsCommand.runBlockingHelper(command, timeoutS); } @@ -317,9 +317,9 @@ CommandResult VcsCommand::runBlockingHelper(const CommandLine &command, int time 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) diff --git a/src/plugins/vcsbase/vcscommand.h b/src/plugins/vcsbase/vcscommand.h index 785364d27ac..be40064356d 100644 --- a/src/plugins/vcsbase/vcscommand.h +++ b/src/plugins/vcsbase/vcscommand.h @@ -17,6 +17,7 @@ namespace Utils { class CommandLine; class Environment; class Process; +class TextEncoding; } namespace VcsBase { @@ -74,7 +75,7 @@ public: void addFlags(RunFlags f); - void setCodec(const Utils::TextCodec &codec); + void setEncoding(const Utils::TextEncoding &codec); void setProgressParser(const Core::ProgressParser &parser); @@ -83,7 +84,7 @@ public: const Utils::CommandLine &command, RunFlags flags, int timeoutS, - const Utils::TextCodec &codec); + const Utils::TextEncoding &codec); void cancel(); QString cleanedStdOut() const;