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;
}
void Process::setEncoding(const TextEncoding &encoding)
{
setCodec(TextCodec::codecForName(encoding));
}
void Process::setUtf8Codec()
{
d->m_stdOutCodec = TextCodec::utf8();

View File

@@ -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()

View File

@@ -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

View File

@@ -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;
};

View File

@@ -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<void> &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<ClearCaseEditorWidget *>(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<ClearCaseEditorWidget*>(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)

View File

@@ -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;

View File

@@ -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;

View File

@@ -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<CvsLogEntry>::iterator lend = entries.end();
for (QList<CvsLogEntry>::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;
}

View File

@@ -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<VcsBaseEditorWidget *>(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<VcsBaseEditorWidget *>(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<VcsBaseEditorWidget *>(editor);

View File

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

View File

@@ -239,7 +239,7 @@ GitDiffEditorController::GitDiffEditorController(IDocument *document,
const Storage<QString> 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<CommitData> 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)

View File

@@ -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;

View File

@@ -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)));
}
}

View File

@@ -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();

View File

@@ -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;

View File

@@ -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();
}
};

View File

@@ -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;

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);
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);
}

View File

@@ -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<VcsBaseEditorWidget *>(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()

View File

@@ -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<SubversionEditorWidget*>(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;
}

View File

@@ -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);

View File

@@ -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;

View File

@@ -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<BaseTextDocument *>(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)

View File

@@ -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;

View File

@@ -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<Job> 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)

View File

@@ -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;