forked from qt-creator/qt-creator
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:
@@ -1803,6 +1803,11 @@ void Process::setCodec(const TextCodec &codec)
|
|||||||
d->m_stdErrCodec = codec;
|
d->m_stdErrCodec = codec;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Process::setEncoding(const TextEncoding &encoding)
|
||||||
|
{
|
||||||
|
setCodec(TextCodec::codecForName(encoding));
|
||||||
|
}
|
||||||
|
|
||||||
void Process::setUtf8Codec()
|
void Process::setUtf8Codec()
|
||||||
{
|
{
|
||||||
d->m_stdOutCodec = TextCodec::utf8();
|
d->m_stdOutCodec = TextCodec::utf8();
|
||||||
|
@@ -27,6 +27,7 @@ class DeviceProcessHooks;
|
|||||||
class ProcessInterface;
|
class ProcessInterface;
|
||||||
class ProcessResultData;
|
class ProcessResultData;
|
||||||
class ProcessRunData;
|
class ProcessRunData;
|
||||||
|
class TextEncoding;
|
||||||
|
|
||||||
class QTCREATOR_UTILS_EXPORT Process final : public QObject
|
class QTCREATOR_UTILS_EXPORT Process final : public QObject
|
||||||
{
|
{
|
||||||
@@ -144,6 +145,7 @@ public:
|
|||||||
EventLoopMode eventLoopMode = EventLoopMode::Off);
|
EventLoopMode eventLoopMode = EventLoopMode::Off);
|
||||||
|
|
||||||
void setCodec(const TextCodec &codec); // for stdOut and stdErr
|
void setCodec(const TextCodec &codec); // for stdOut and stdErr
|
||||||
|
void setEncoding(const TextEncoding &encoding); // for stdOut and stdErr
|
||||||
void setUtf8Codec(); // for stdOut and stdErr
|
void setUtf8Codec(); // for stdOut and stdErr
|
||||||
void setUtf8StdOutCodec(); // for stdOut, stdErr uses executable.processStdErrCodec()
|
void setUtf8StdOutCodec(); // for stdOut, stdErr uses executable.processStdErrCodec()
|
||||||
|
|
||||||
|
@@ -11,6 +11,8 @@ namespace Utils {
|
|||||||
|
|
||||||
// TextEncoding
|
// TextEncoding
|
||||||
|
|
||||||
|
TextEncoding::TextEncoding() = default;
|
||||||
|
|
||||||
TextEncoding::TextEncoding(const QByteArray &name)
|
TextEncoding::TextEncoding(const QByteArray &name)
|
||||||
: m_name(name)
|
: m_name(name)
|
||||||
{}
|
{}
|
||||||
@@ -19,6 +21,20 @@ TextEncoding::TextEncoding(QStringConverter::Encoding encoding)
|
|||||||
: m_name(QStringConverter::nameForEncoding(encoding))
|
: m_name(QStringConverter::nameForEncoding(encoding))
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
bool TextEncoding::isValid() const
|
||||||
|
{
|
||||||
|
return !m_name.isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator==(const TextEncoding &left, const TextEncoding &right)
|
||||||
|
{
|
||||||
|
return left.name() == right.name();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator!=(const TextEncoding &left, const TextEncoding &right)
|
||||||
|
{
|
||||||
|
return left.name() != right.name();
|
||||||
|
}
|
||||||
|
|
||||||
// TextCodec
|
// TextCodec
|
||||||
|
|
||||||
|
@@ -17,13 +17,19 @@ namespace Utils {
|
|||||||
class QTCREATOR_UTILS_EXPORT TextEncoding
|
class QTCREATOR_UTILS_EXPORT TextEncoding
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
TextEncoding();
|
||||||
TextEncoding(const QByteArray &name);
|
TextEncoding(const QByteArray &name);
|
||||||
TextEncoding(QStringEncoder::Encoding encoding);
|
TextEncoding(QStringEncoder::Encoding encoding);
|
||||||
|
|
||||||
operator QByteArray() const { return m_name; }
|
operator QByteArray() const { return m_name; }
|
||||||
QByteArray name() const { return m_name; }
|
QByteArray name() const { return m_name; }
|
||||||
|
|
||||||
|
bool isValid() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
QTCREATOR_UTILS_EXPORT friend bool operator==(const TextEncoding &left, const TextEncoding &right);
|
||||||
|
QTCREATOR_UTILS_EXPORT friend bool operator!=(const TextEncoding &left, const TextEncoding &right);
|
||||||
|
|
||||||
QByteArray m_name;
|
QByteArray m_name;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -234,12 +234,12 @@ private:
|
|||||||
FilePath ccViewRoot(const FilePath &directory) const;
|
FilePath ccViewRoot(const FilePath &directory) const;
|
||||||
FilePath findTopLevel(const FilePath &directory) const;
|
FilePath findTopLevel(const FilePath &directory) const;
|
||||||
IEditor *showOutputInEditor(const QString& title, const QString &output, Id id,
|
IEditor *showOutputInEditor(const QString& title, const QString &output, Id id,
|
||||||
const FilePath &source, const TextCodec &codec) const;
|
const FilePath &source, const TextEncoding &encoding) const;
|
||||||
CommandResult runCleartoolProc(const FilePath &workingDir,
|
CommandResult runCleartoolProc(const FilePath &workingDir,
|
||||||
const QStringList &arguments) const;
|
const QStringList &arguments) const;
|
||||||
CommandResult runCleartool(const FilePath &workingDir, const QStringList &arguments,
|
CommandResult runCleartool(const FilePath &workingDir, const QStringList &arguments,
|
||||||
VcsBase::RunFlags flags = VcsBase::RunFlags::None,
|
VcsBase::RunFlags flags = VcsBase::RunFlags::None,
|
||||||
const TextCodec &codec = {}, int timeoutMultiplier = 1) const;
|
const TextEncoding &encoding = {}, int timeoutMultiplier = 1) const;
|
||||||
static void sync(QPromise<void> &promise, FilePaths files);
|
static void sync(QPromise<void> &promise, FilePaths files);
|
||||||
|
|
||||||
void history(const FilePath &workingDir,
|
void history(const FilePath &workingDir,
|
||||||
@@ -256,7 +256,7 @@ private:
|
|||||||
QString diffExternal(QString file1, QString file2 = QString(), bool keep = false);
|
QString diffExternal(QString file1, QString file2 = QString(), bool keep = false);
|
||||||
QString getFile(const QString &nativeFile, const QString &prefix);
|
QString getFile(const QString &nativeFile, const QString &prefix);
|
||||||
QString runExtDiff(const FilePath &workingDir, const QStringList &arguments, int timeOutS,
|
QString runExtDiff(const FilePath &workingDir, const QStringList &arguments, int timeOutS,
|
||||||
const TextCodec &outputCodec = {});
|
const TextEncoding &encoding = {});
|
||||||
static FilePath getDriveLetterOfPath(FilePath directory);
|
static FilePath getDriveLetterOfPath(FilePath directory);
|
||||||
|
|
||||||
FileStatus::Status getFileStatus(const FilePath &fileName) const;
|
FileStatus::Status getFileStatus(const FilePath &fileName) const;
|
||||||
@@ -1181,7 +1181,7 @@ void ClearCasePluginPrivate::ccDiffWithPred(const FilePath &workingDir, const QS
|
|||||||
if (Constants::debug)
|
if (Constants::debug)
|
||||||
qDebug() << Q_FUNC_INFO << files;
|
qDebug() << Q_FUNC_INFO << files;
|
||||||
const FilePath source = VcsBaseEditor::getSource(workingDir, files);
|
const FilePath source = VcsBaseEditor::getSource(workingDir, files);
|
||||||
const TextCodec codec = source.isEmpty() ? TextCodec() : VcsBaseEditor::getCodec(source);
|
const TextEncoding encoding = source.isEmpty() ? TextEncoding() : VcsBaseEditor::getEncoding(source);
|
||||||
|
|
||||||
if ((m_settings.diffType == GraphicalDiff) && (files.count() == 1)) {
|
if ((m_settings.diffType == GraphicalDiff) && (files.count() == 1)) {
|
||||||
const QString file = files.first();
|
const QString file = files.first();
|
||||||
@@ -1221,7 +1221,7 @@ void ClearCasePluginPrivate::ccDiffWithPred(const FilePath &workingDir, const QS
|
|||||||
diffname = QDir::toNativeSeparators(files.first());
|
diffname = QDir::toNativeSeparators(files.first());
|
||||||
}
|
}
|
||||||
const QString title = QString::fromLatin1("cc diff %1").arg(diffname);
|
const QString title = QString::fromLatin1("cc diff %1").arg(diffname);
|
||||||
IEditor *editor = showOutputInEditor(title, result, DIFF_EDITOR_ID, source, codec);
|
IEditor *editor = showOutputInEditor(title, result, DIFF_EDITOR_ID, source, encoding);
|
||||||
setWorkingDirectory(editor, workingDir);
|
setWorkingDirectory(editor, workingDir);
|
||||||
VcsBaseEditor::tagEditor(editor, tag);
|
VcsBaseEditor::tagEditor(editor, tag);
|
||||||
auto diffEditorWidget = qobject_cast<ClearCaseEditorWidget *>(editor->widget());
|
auto diffEditorWidget = qobject_cast<ClearCaseEditorWidget *>(editor->widget());
|
||||||
@@ -1438,7 +1438,7 @@ void ClearCasePluginPrivate::history(const FilePath &workingDir,
|
|||||||
const QStringList &files,
|
const QStringList &files,
|
||||||
bool enableAnnotationContextMenu)
|
bool enableAnnotationContextMenu)
|
||||||
{
|
{
|
||||||
const TextCodec codec = VcsBaseEditor::getCodec(workingDir, files);
|
const TextEncoding encoding = VcsBaseEditor::getEncoding(workingDir, files);
|
||||||
// no need for temp file
|
// no need for temp file
|
||||||
QStringList args(QLatin1String("lshistory"));
|
QStringList args(QLatin1String("lshistory"));
|
||||||
if (m_settings.historyCount > 0)
|
if (m_settings.historyCount > 0)
|
||||||
@@ -1448,7 +1448,7 @@ void ClearCasePluginPrivate::history(const FilePath &workingDir,
|
|||||||
for (const QString &file : files)
|
for (const QString &file : files)
|
||||||
args.append(QDir::toNativeSeparators(file));
|
args.append(QDir::toNativeSeparators(file));
|
||||||
|
|
||||||
const CommandResult result = runCleartool(workingDir, args, RunFlags::None, codec);
|
const CommandResult result = runCleartool(workingDir, args, RunFlags::None, encoding);
|
||||||
if (result.result() != ProcessResult::FinishedWithSuccess)
|
if (result.result() != ProcessResult::FinishedWithSuccess)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -1465,7 +1465,7 @@ void ClearCasePluginPrivate::history(const FilePath &workingDir,
|
|||||||
const QString title = QString::fromLatin1("cc history %1").arg(id);
|
const QString title = QString::fromLatin1("cc history %1").arg(id);
|
||||||
const FilePath source = VcsBaseEditor::getSource(workingDir, files);
|
const FilePath source = VcsBaseEditor::getSource(workingDir, files);
|
||||||
IEditor *newEditor = showOutputInEditor(title, result.cleanedStdOut(),
|
IEditor *newEditor = showOutputInEditor(title, result.cleanedStdOut(),
|
||||||
LOG_EDITOR_ID, source, codec);
|
LOG_EDITOR_ID, source, encoding);
|
||||||
VcsBaseEditor::tagEditor(newEditor, tag);
|
VcsBaseEditor::tagEditor(newEditor, tag);
|
||||||
if (enableAnnotationContextMenu)
|
if (enableAnnotationContextMenu)
|
||||||
VcsBaseEditor::getVcsBaseEditor(newEditor)->setFileLogAnnotateEnabled(true);
|
VcsBaseEditor::getVcsBaseEditor(newEditor)->setFileLogAnnotateEnabled(true);
|
||||||
@@ -1528,7 +1528,7 @@ void ClearCasePluginPrivate::vcsAnnotateHelper(const FilePath &workingDir, const
|
|||||||
qDebug() << Q_FUNC_INFO << file;
|
qDebug() << Q_FUNC_INFO << file;
|
||||||
|
|
||||||
// FIXME: Should this be something like workingDir.resolvePath(file) ?
|
// FIXME: Should this be something like workingDir.resolvePath(file) ?
|
||||||
const TextCodec codec = VcsBaseEditor::getCodec(FilePath::fromString(file));
|
const TextEncoding encoding = VcsBaseEditor::getEncoding(FilePath::fromString(file));
|
||||||
|
|
||||||
// Determine id
|
// Determine id
|
||||||
QString id = file;
|
QString id = file;
|
||||||
@@ -1541,7 +1541,7 @@ void ClearCasePluginPrivate::vcsAnnotateHelper(const FilePath &workingDir, const
|
|||||||
args << QLatin1String("-out") << QLatin1String("-");
|
args << QLatin1String("-out") << QLatin1String("-");
|
||||||
args.append(QDir::toNativeSeparators(id));
|
args.append(QDir::toNativeSeparators(id));
|
||||||
|
|
||||||
const CommandResult result = runCleartool(workingDir, args, RunFlags::None, codec);
|
const CommandResult result = runCleartool(workingDir, args, RunFlags::None, encoding);
|
||||||
if (result.result() != ProcessResult::FinishedWithSuccess)
|
if (result.result() != ProcessResult::FinishedWithSuccess)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -1568,7 +1568,7 @@ void ClearCasePluginPrivate::vcsAnnotateHelper(const FilePath &workingDir, const
|
|||||||
EditorManager::activateEditor(editor);
|
EditorManager::activateEditor(editor);
|
||||||
} else {
|
} else {
|
||||||
const QString title = QString::fromLatin1("cc annotate %1").arg(id);
|
const QString title = QString::fromLatin1("cc annotate %1").arg(id);
|
||||||
IEditor *newEditor = showOutputInEditor(title, res, ANNOTATION_EDITOR_ID, source, codec);
|
IEditor *newEditor = showOutputInEditor(title, res, ANNOTATION_EDITOR_ID, source, encoding);
|
||||||
VcsBaseEditor::tagEditor(newEditor, tag);
|
VcsBaseEditor::tagEditor(newEditor, tag);
|
||||||
VcsBaseEditor::gotoLineOfEditor(newEditor, lineNumber);
|
VcsBaseEditor::gotoLineOfEditor(newEditor, lineNumber);
|
||||||
}
|
}
|
||||||
@@ -1587,8 +1587,8 @@ void ClearCasePluginPrivate::vcsDescribe(const FilePath &source, const QString &
|
|||||||
const FilePath relPath = source.relativePathFromDir(topLevel);
|
const FilePath relPath = source.relativePathFromDir(topLevel);
|
||||||
const QString id = QString::fromLatin1("%1@@%2").arg(relPath.toUserOutput(), changeNr);
|
const QString id = QString::fromLatin1("%1@@%2").arg(relPath.toUserOutput(), changeNr);
|
||||||
|
|
||||||
const TextCodec codec = VcsBaseEditor::getCodec(source);
|
const TextEncoding encoding = VcsBaseEditor::getEncoding(source);
|
||||||
const CommandResult result = runCleartool(topLevel, {"describe", id}, RunFlags::None, codec);
|
const CommandResult result = runCleartool(topLevel, {"describe", id}, RunFlags::None, encoding);
|
||||||
description = result.cleanedStdOut();
|
description = result.cleanedStdOut();
|
||||||
if (m_settings.extDiffAvailable)
|
if (m_settings.extDiffAvailable)
|
||||||
description += diffExternal(id);
|
description += diffExternal(id);
|
||||||
@@ -1601,7 +1601,7 @@ void ClearCasePluginPrivate::vcsDescribe(const FilePath &source, const QString &
|
|||||||
EditorManager::activateEditor(editor);
|
EditorManager::activateEditor(editor);
|
||||||
} else {
|
} else {
|
||||||
const QString title = QString::fromLatin1("cc describe %1").arg(id);
|
const QString title = QString::fromLatin1("cc describe %1").arg(id);
|
||||||
IEditor *newEditor = showOutputInEditor(title, description, DIFF_EDITOR_ID, source, codec);
|
IEditor *newEditor = showOutputInEditor(title, description, DIFF_EDITOR_ID, source, encoding);
|
||||||
VcsBaseEditor::tagEditor(newEditor, tag);
|
VcsBaseEditor::tagEditor(newEditor, tag);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1625,7 +1625,7 @@ CommandResult ClearCasePluginPrivate::runCleartoolProc(const FilePath &workingDi
|
|||||||
CommandResult ClearCasePluginPrivate::runCleartool(const FilePath &workingDir,
|
CommandResult ClearCasePluginPrivate::runCleartool(const FilePath &workingDir,
|
||||||
const QStringList &arguments,
|
const QStringList &arguments,
|
||||||
RunFlags flags,
|
RunFlags flags,
|
||||||
const TextCodec &codec,
|
const TextEncoding &encoding,
|
||||||
int timeoutMultiplier) const
|
int timeoutMultiplier) const
|
||||||
{
|
{
|
||||||
if (m_settings.ccBinaryPath.isEmpty())
|
if (m_settings.ccBinaryPath.isEmpty())
|
||||||
@@ -1633,16 +1633,16 @@ CommandResult ClearCasePluginPrivate::runCleartool(const FilePath &workingDir,
|
|||||||
|
|
||||||
const int timeoutS = m_settings.timeOutS * timeoutMultiplier;
|
const int timeoutS = m_settings.timeOutS * timeoutMultiplier;
|
||||||
return VcsCommand::runBlocking(workingDir, Environment::systemEnvironment(),
|
return VcsCommand::runBlocking(workingDir, Environment::systemEnvironment(),
|
||||||
{m_settings.ccBinaryPath, arguments}, flags, timeoutS, codec);
|
{m_settings.ccBinaryPath, arguments}, flags, timeoutS, encoding);
|
||||||
}
|
}
|
||||||
|
|
||||||
IEditor *ClearCasePluginPrivate::showOutputInEditor(const QString& title, const QString &output,
|
IEditor *ClearCasePluginPrivate::showOutputInEditor(const QString& title, const QString &output,
|
||||||
Id id, const FilePath &source,
|
Id id, const FilePath &source,
|
||||||
const TextCodec &codec) const
|
const TextEncoding &encoding) const
|
||||||
{
|
{
|
||||||
if (Constants::debug)
|
if (Constants::debug)
|
||||||
qDebug() << "ClearCasePlugin::showOutputInEditor" << title << id.name()
|
qDebug() << "ClearCasePlugin::showOutputInEditor" << title << id.name()
|
||||||
<< "Size= " << output.size() << codec.displayName();
|
<< "Size= " << output.size() << encoding.name();
|
||||||
QString s = title;
|
QString s = title;
|
||||||
IEditor *editor = EditorManager::openEditorWithContents(id, &s, output.toUtf8());
|
IEditor *editor = EditorManager::openEditorWithContents(id, &s, output.toUtf8());
|
||||||
auto e = qobject_cast<ClearCaseEditorWidget*>(editor->widget());
|
auto e = qobject_cast<ClearCaseEditorWidget*>(editor->widget());
|
||||||
@@ -1655,8 +1655,8 @@ IEditor *ClearCasePluginPrivate::showOutputInEditor(const QString& title, const
|
|||||||
e->textDocument()->setFallbackSaveAsFileName(s);
|
e->textDocument()->setFallbackSaveAsFileName(s);
|
||||||
if (!source.isEmpty())
|
if (!source.isEmpty())
|
||||||
e->setSource(source);
|
e->setSource(source);
|
||||||
if (codec.isValid())
|
if (encoding.isValid())
|
||||||
e->setCodec(codec);
|
e->setEncoding(encoding);
|
||||||
return editor;
|
return editor;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2202,7 +2202,7 @@ QString ClearCasePluginPrivate::getFile(const QString &nativeFile, const QString
|
|||||||
// runs external (GNU) diff, and returns the stdout result
|
// runs external (GNU) diff, and returns the stdout result
|
||||||
QString ClearCasePluginPrivate::diffExternal(QString file1, QString file2, bool keep)
|
QString ClearCasePluginPrivate::diffExternal(QString file1, QString file2, bool keep)
|
||||||
{
|
{
|
||||||
const TextCodec codec = VcsBaseEditor::getCodec(FilePath::fromString(file1));
|
const TextEncoding encoding = VcsBaseEditor::getEncoding(FilePath::fromString(file1));
|
||||||
|
|
||||||
// if file2 is empty, we should compare to predecessor
|
// if file2 is empty, we should compare to predecessor
|
||||||
if (file2.isEmpty()) {
|
if (file2.isEmpty()) {
|
||||||
@@ -2234,7 +2234,7 @@ QString ClearCasePluginPrivate::diffExternal(QString file1, QString file2, bool
|
|||||||
} else {
|
} else {
|
||||||
args << file2;
|
args << file2;
|
||||||
}
|
}
|
||||||
const QString diffResponse = runExtDiff(m_topLevel, args, m_settings.timeOutS, codec);
|
const QString diffResponse = runExtDiff(m_topLevel, args, m_settings.timeOutS, encoding);
|
||||||
if (!keep && !tempFile1.isEmpty()) {
|
if (!keep && !tempFile1.isEmpty()) {
|
||||||
QFile::remove(tempFile1);
|
QFile::remove(tempFile1);
|
||||||
QFileInfo(tempFile1).dir().rmpath(QLatin1String("."));
|
QFileInfo(tempFile1).dir().rmpath(QLatin1String("."));
|
||||||
@@ -2266,11 +2266,11 @@ void ClearCasePluginPrivate::diffGraphical(const QString &file1, const QString &
|
|||||||
}
|
}
|
||||||
|
|
||||||
QString ClearCasePluginPrivate::runExtDiff(const FilePath &workingDir, const QStringList &arguments,
|
QString ClearCasePluginPrivate::runExtDiff(const FilePath &workingDir, const QStringList &arguments,
|
||||||
int timeOutS, const TextCodec &outputCodec)
|
int timeOutS, const TextEncoding &encoding)
|
||||||
{
|
{
|
||||||
Process process;
|
Process process;
|
||||||
process.setWorkingDirectory(workingDir);
|
process.setWorkingDirectory(workingDir);
|
||||||
process.setCodec(outputCodec.isValid() ? outputCodec : TextCodec::utf8());
|
process.setEncoding(encoding.isValid() ? encoding : TextEncoding(QStringConverter::Utf8));
|
||||||
process.setCommand({"diff", {m_settings.diffArgs.split(' ', Qt::SkipEmptyParts), arguments}});
|
process.setCommand({"diff", {m_settings.diffArgs.split(' ', Qt::SkipEmptyParts), arguments}});
|
||||||
process.runBlocking(seconds(timeOutS), EventLoopMode::On);
|
process.runBlocking(seconds(timeOutS), EventLoopMode::On);
|
||||||
if (process.result() != ProcessResult::FinishedWithSuccess)
|
if (process.result() != ProcessResult::FinishedWithSuccess)
|
||||||
|
@@ -138,6 +138,16 @@ void BaseTextDocument::setCodec(const TextCodec &codec)
|
|||||||
d->m_format.setCodec(codec);
|
d->m_format.setCodec(codec);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void BaseTextDocument::setEncoding(const TextEncoding &encoding)
|
||||||
|
{
|
||||||
|
setCodec(TextCodec::codecForName(encoding));
|
||||||
|
}
|
||||||
|
|
||||||
|
TextEncoding BaseTextDocument::encoding() const
|
||||||
|
{
|
||||||
|
return codec().name();
|
||||||
|
}
|
||||||
|
|
||||||
bool BaseTextDocument::supportsCodec(const QByteArray &) const
|
bool BaseTextDocument::supportsCodec(const QByteArray &) const
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
|
@@ -24,6 +24,8 @@ public:
|
|||||||
Utils::TextFileFormat format() const;
|
Utils::TextFileFormat format() const;
|
||||||
Utils::TextCodec codec() const;
|
Utils::TextCodec codec() const;
|
||||||
void setCodec(const Utils::TextCodec &codec);
|
void setCodec(const Utils::TextCodec &codec);
|
||||||
|
Utils::TextEncoding encoding() const;
|
||||||
|
void setEncoding(const Utils::TextEncoding &encoding);
|
||||||
virtual bool supportsCodec(const QByteArray &) const;
|
virtual bool supportsCodec(const QByteArray &) const;
|
||||||
void switchUtf8Bom();
|
void switchUtf8Bom();
|
||||||
bool supportsUtf8Bom() const;
|
bool supportsUtf8Bom() const;
|
||||||
|
@@ -231,10 +231,10 @@ private:
|
|||||||
|
|
||||||
bool isCommitEditorOpen() const;
|
bool isCommitEditorOpen() const;
|
||||||
Core::IEditor *showOutputInEditor(const QString& title, const QString &output,
|
Core::IEditor *showOutputInEditor(const QString& title, const QString &output,
|
||||||
Id id, const FilePath &source, const TextCodec &codec);
|
Id id, const FilePath &source, const TextEncoding &codec);
|
||||||
|
|
||||||
CommandResult runCvs(const FilePath &workingDirectory, const QStringList &arguments,
|
CommandResult runCvs(const FilePath &workingDirectory, const QStringList &arguments,
|
||||||
RunFlags flags = RunFlags::None, const TextCodec &outputCodec = {},
|
RunFlags flags = RunFlags::None, const TextEncoding &outputCodec = {},
|
||||||
int timeoutMultiplier = 1) const;
|
int timeoutMultiplier = 1) const;
|
||||||
|
|
||||||
void annotate(const FilePath &workingDir, const QString &file,
|
void annotate(const FilePath &workingDir, const QString &file,
|
||||||
@@ -950,14 +950,14 @@ void CvsPluginPrivate::filelog(const FilePath &workingDir,
|
|||||||
const QString &file,
|
const QString &file,
|
||||||
bool enableAnnotationContextMenu)
|
bool enableAnnotationContextMenu)
|
||||||
{
|
{
|
||||||
const TextCodec codec = VcsBaseEditor::getCodec(workingDir, QStringList(file));
|
const TextEncoding encoding = VcsBaseEditor::getEncoding(workingDir, QStringList(file));
|
||||||
// no need for temp file
|
// no need for temp file
|
||||||
const QString id = VcsBaseEditor::getTitleId(workingDir, QStringList(file));
|
const QString id = VcsBaseEditor::getTitleId(workingDir, QStringList(file));
|
||||||
const FilePath source = VcsBaseEditor::getSource(workingDir, file);
|
const FilePath source = VcsBaseEditor::getSource(workingDir, file);
|
||||||
QStringList args = {"log"};
|
QStringList args = {"log"};
|
||||||
if (!file.isEmpty())
|
if (!file.isEmpty())
|
||||||
args.append(file);
|
args.append(file);
|
||||||
const auto response = runCvs(workingDir, args, RunFlags::None, codec);
|
const auto response = runCvs(workingDir, args, RunFlags::None, encoding);
|
||||||
if (response.result() != ProcessResult::FinishedWithSuccess)
|
if (response.result() != ProcessResult::FinishedWithSuccess)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -970,7 +970,7 @@ void CvsPluginPrivate::filelog(const FilePath &workingDir,
|
|||||||
} else {
|
} else {
|
||||||
const QString title = QString::fromLatin1("cvs log %1").arg(id);
|
const QString title = QString::fromLatin1("cvs log %1").arg(id);
|
||||||
IEditor *newEditor = showOutputInEditor(title, response.cleanedStdOut(),
|
IEditor *newEditor = showOutputInEditor(title, response.cleanedStdOut(),
|
||||||
CVS_FILELOG_EDITOR_ID, source, codec);
|
CVS_FILELOG_EDITOR_ID, source, encoding);
|
||||||
VcsBaseEditor::tagEditor(newEditor, tag);
|
VcsBaseEditor::tagEditor(newEditor, tag);
|
||||||
if (enableAnnotationContextMenu)
|
if (enableAnnotationContextMenu)
|
||||||
VcsBaseEditor::getVcsBaseEditor(newEditor)->setFileLogAnnotateEnabled(true);
|
VcsBaseEditor::getVcsBaseEditor(newEditor)->setFileLogAnnotateEnabled(true);
|
||||||
@@ -1086,14 +1086,14 @@ void CvsPluginPrivate::annotate(const FilePath &workingDir, const QString &file,
|
|||||||
int lineNumber /* = -1 */)
|
int lineNumber /* = -1 */)
|
||||||
{
|
{
|
||||||
const QStringList files(file);
|
const QStringList files(file);
|
||||||
const TextCodec codec = VcsBaseEditor::getCodec(workingDir, files);
|
const TextEncoding encoding = VcsBaseEditor::getEncoding(workingDir, files);
|
||||||
const QString id = VcsBaseEditor::getTitleId(workingDir, files, revision);
|
const QString id = VcsBaseEditor::getTitleId(workingDir, files, revision);
|
||||||
const FilePath source = VcsBaseEditor::getSource(workingDir, file);
|
const FilePath source = VcsBaseEditor::getSource(workingDir, file);
|
||||||
QStringList args{"annotate"};
|
QStringList args{"annotate"};
|
||||||
if (!revision.isEmpty())
|
if (!revision.isEmpty())
|
||||||
args << "-r" << revision;
|
args << "-r" << revision;
|
||||||
args << file;
|
args << file;
|
||||||
const auto response = runCvs(workingDir, args, RunFlags::None, codec);
|
const auto response = runCvs(workingDir, args, RunFlags::None, encoding);
|
||||||
if (response.result() != ProcessResult::FinishedWithSuccess)
|
if (response.result() != ProcessResult::FinishedWithSuccess)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -1110,7 +1110,7 @@ void CvsPluginPrivate::annotate(const FilePath &workingDir, const QString &file,
|
|||||||
} else {
|
} else {
|
||||||
const QString title = QString::fromLatin1("cvs annotate %1").arg(id);
|
const QString title = QString::fromLatin1("cvs annotate %1").arg(id);
|
||||||
IEditor *newEditor = showOutputInEditor(title, response.cleanedStdOut(),
|
IEditor *newEditor = showOutputInEditor(title, response.cleanedStdOut(),
|
||||||
CVS_ANNOTATION_EDITOR_ID, source, codec);
|
CVS_ANNOTATION_EDITOR_ID, source, encoding);
|
||||||
VcsBaseEditor::tagEditor(newEditor, tag);
|
VcsBaseEditor::tagEditor(newEditor, tag);
|
||||||
VcsBaseEditor::gotoLineOfEditor(newEditor, lineNumber);
|
VcsBaseEditor::gotoLineOfEditor(newEditor, lineNumber);
|
||||||
}
|
}
|
||||||
@@ -1241,12 +1241,12 @@ bool CvsPluginPrivate::describe(const FilePath &repositoryPath,
|
|||||||
{
|
{
|
||||||
// Collect logs
|
// Collect logs
|
||||||
QString output;
|
QString output;
|
||||||
TextCodec codec;
|
TextEncoding codec;
|
||||||
const QList<CvsLogEntry>::iterator lend = entries.end();
|
const QList<CvsLogEntry>::iterator lend = entries.end();
|
||||||
for (QList<CvsLogEntry>::iterator it = entries.begin(); it != lend; ++it) {
|
for (QList<CvsLogEntry>::iterator it = entries.begin(); it != lend; ++it) {
|
||||||
// Before fiddling file names, try to find codec
|
// Before fiddling file names, try to find codec
|
||||||
if (!codec.isValid())
|
if (!codec.isValid())
|
||||||
codec = VcsBaseEditor::getCodec(repositoryPath, QStringList(it->file));
|
codec = VcsBaseEditor::getEncoding(repositoryPath, QStringList(it->file));
|
||||||
// Run log
|
// Run log
|
||||||
const QStringList args{"log", "-r", it->revisions.front().revision, it->file};
|
const QStringList args{"log", "-r", it->revisions.front().revision, it->file};
|
||||||
const auto logResponse = runCvs(repositoryPath, args);
|
const auto logResponse = runCvs(repositoryPath, args);
|
||||||
@@ -1301,7 +1301,7 @@ bool CvsPluginPrivate::describe(const FilePath &repositoryPath,
|
|||||||
// the working directory (see above).
|
// the working directory (see above).
|
||||||
CommandResult CvsPluginPrivate::runCvs(const FilePath &workingDirectory,
|
CommandResult CvsPluginPrivate::runCvs(const FilePath &workingDirectory,
|
||||||
const QStringList &arguments, RunFlags flags,
|
const QStringList &arguments, RunFlags flags,
|
||||||
const TextCodec &outputCodec, int timeoutMultiplier) const
|
const TextEncoding &outputCodec, int timeoutMultiplier) const
|
||||||
{
|
{
|
||||||
const FilePath executable = settings().binaryPath();
|
const FilePath executable = settings().binaryPath();
|
||||||
if (executable.isEmpty())
|
if (executable.isEmpty())
|
||||||
@@ -1315,7 +1315,7 @@ CommandResult CvsPluginPrivate::runCvs(const FilePath &workingDirectory,
|
|||||||
|
|
||||||
IEditor *CvsPluginPrivate::showOutputInEditor(const QString& title, const QString &output,
|
IEditor *CvsPluginPrivate::showOutputInEditor(const QString& title, const QString &output,
|
||||||
Utils::Id id, const FilePath &source,
|
Utils::Id id, const FilePath &source,
|
||||||
const TextCodec &codec)
|
const TextEncoding &encoding)
|
||||||
{
|
{
|
||||||
QString s = title;
|
QString s = title;
|
||||||
IEditor *editor = EditorManager::openEditorWithContents(id, &s, output.toUtf8());
|
IEditor *editor = EditorManager::openEditorWithContents(id, &s, output.toUtf8());
|
||||||
@@ -1328,8 +1328,8 @@ IEditor *CvsPluginPrivate::showOutputInEditor(const QString& title, const QStrin
|
|||||||
e->setForceReadOnly(true);
|
e->setForceReadOnly(true);
|
||||||
if (!source.isEmpty())
|
if (!source.isEmpty())
|
||||||
e->setSource(source);
|
e->setSource(source);
|
||||||
if (codec.isValid())
|
if (encoding.isValid())
|
||||||
e->setCodec(codec);
|
e->setEncoding(encoding);
|
||||||
return editor;
|
return editor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -674,7 +674,7 @@ void FossilClient::annotate(const FilePath &workingDir, const QString &file, int
|
|||||||
const FilePath source = VcsBaseEditor::getSource(workingDir, file);
|
const FilePath source = VcsBaseEditor::getSource(workingDir, file);
|
||||||
|
|
||||||
VcsBaseEditorWidget *editor = createVcsEditor(kind, title, source,
|
VcsBaseEditorWidget *editor = createVcsEditor(kind, title, source,
|
||||||
VcsBaseEditor::getCodec(source),
|
VcsBaseEditor::getEncoding(source),
|
||||||
vcsCmdString.toLatin1().constData(), id);
|
vcsCmdString.toLatin1().constData(), id);
|
||||||
|
|
||||||
auto fossilEditor = qobject_cast<VcsBaseEditorWidget *>(editor);
|
auto fossilEditor = qobject_cast<VcsBaseEditorWidget *>(editor);
|
||||||
@@ -790,7 +790,7 @@ void FossilClient::view(const FilePath &source, const QString &id, const QString
|
|||||||
const QString title = vcsEditorTitle(vcsCommandString(DiffCommand), id);
|
const QString title = vcsEditorTitle(vcsCommandString(DiffCommand), id);
|
||||||
|
|
||||||
VcsBaseEditorWidget *editor = createVcsEditor(kind, title, source,
|
VcsBaseEditorWidget *editor = createVcsEditor(kind, title, source,
|
||||||
VcsBaseEditor::getCodec(source), "view", id);
|
VcsBaseEditor::getEncoding(source), "view", id);
|
||||||
editor->setWorkingDirectory(workingDirectory);
|
editor->setWorkingDirectory(workingDirectory);
|
||||||
|
|
||||||
enqueueJob(createCommand(workingDirectory, editor), args + extraOptions, source);
|
enqueueJob(createCommand(workingDirectory, editor), args + extraOptions, source);
|
||||||
@@ -863,7 +863,7 @@ void FossilClient::log(const FilePath &workingDir, const QStringList &files,
|
|||||||
const QString title = vcsEditorTitle(vcsCmdString, id);
|
const QString title = vcsEditorTitle(vcsCmdString, id);
|
||||||
const FilePath source = VcsBaseEditor::getSource(workingDir, files);
|
const FilePath source = VcsBaseEditor::getSource(workingDir, files);
|
||||||
VcsBaseEditorWidget *editor = createVcsEditor(kind, title, source,
|
VcsBaseEditorWidget *editor = createVcsEditor(kind, title, source,
|
||||||
VcsBaseEditor::getCodec(source),
|
VcsBaseEditor::getEncoding(source),
|
||||||
vcsCmdString.toLatin1().constData(), id);
|
vcsCmdString.toLatin1().constData(), id);
|
||||||
|
|
||||||
auto fossilEditor = qobject_cast<VcsBaseEditorWidget *>(editor);
|
auto fossilEditor = qobject_cast<VcsBaseEditorWidget *>(editor);
|
||||||
@@ -919,7 +919,7 @@ void FossilClient::logCurrentFile(const FilePath &workingDir, const QStringList
|
|||||||
const QString title = vcsEditorTitle(vcsCmdString, id);
|
const QString title = vcsEditorTitle(vcsCmdString, id);
|
||||||
const FilePath source = VcsBaseEditor::getSource(workingDir, files);
|
const FilePath source = VcsBaseEditor::getSource(workingDir, files);
|
||||||
VcsBaseEditorWidget *editor = createVcsEditor(kind, title, source,
|
VcsBaseEditorWidget *editor = createVcsEditor(kind, title, source,
|
||||||
VcsBaseEditor::getCodec(source),
|
VcsBaseEditor::getEncoding(source),
|
||||||
vcsCmdString.toLatin1().constData(), id);
|
vcsCmdString.toLatin1().constData(), id);
|
||||||
|
|
||||||
auto fossilEditor = qobject_cast<VcsBaseEditorWidget *>(editor);
|
auto fossilEditor = qobject_cast<VcsBaseEditorWidget *>(editor);
|
||||||
|
@@ -93,7 +93,7 @@ public:
|
|||||||
|
|
||||||
CommitType commitType;
|
CommitType commitType;
|
||||||
QString amendHash;
|
QString amendHash;
|
||||||
Utils::TextCodec commitEncoding;
|
Utils::TextEncoding commitEncoding;
|
||||||
GitSubmitEditorPanelInfo panelInfo;
|
GitSubmitEditorPanelInfo panelInfo;
|
||||||
GitSubmitEditorPanelData panelData;
|
GitSubmitEditorPanelData panelData;
|
||||||
bool enablePush = false;
|
bool enablePush = false;
|
||||||
|
@@ -239,7 +239,7 @@ GitDiffEditorController::GitDiffEditorController(IDocument *document,
|
|||||||
const Storage<QString> diffInputStorage;
|
const Storage<QString> diffInputStorage;
|
||||||
|
|
||||||
const auto onDiffSetup = [this, leftCommit, rightCommit, extraArgs](Process &process) {
|
const auto onDiffSetup = [this, leftCommit, rightCommit, extraArgs](Process &process) {
|
||||||
process.setCodec(VcsBaseEditor::getCodec(workingDirectory(), {}));
|
process.setEncoding(VcsBaseEditor::getEncoding(workingDirectory(), {}));
|
||||||
setupCommand(process, {addConfigurationArguments(diffArgs(leftCommit, rightCommit, extraArgs))});
|
setupCommand(process, {addConfigurationArguments(diffArgs(leftCommit, rightCommit, extraArgs))});
|
||||||
VcsOutputWindow::appendCommand(process.workingDirectory(), process.commandLine());
|
VcsOutputWindow::appendCommand(process.workingDirectory(), process.commandLine());
|
||||||
};
|
};
|
||||||
@@ -305,7 +305,7 @@ FileListDiffController::FileListDiffController(IDocument *document, const QStrin
|
|||||||
const auto onStagedSetup = [this, stagedFiles](Process &process) {
|
const auto onStagedSetup = [this, stagedFiles](Process &process) {
|
||||||
if (stagedFiles.isEmpty())
|
if (stagedFiles.isEmpty())
|
||||||
return SetupResult::StopWithError;
|
return SetupResult::StopWithError;
|
||||||
process.setCodec(VcsBaseEditor::getCodec(workingDirectory(), stagedFiles));
|
process.setEncoding(VcsBaseEditor::getEncoding(workingDirectory(), stagedFiles));
|
||||||
setupCommand(process, addConfigurationArguments(
|
setupCommand(process, addConfigurationArguments(
|
||||||
QStringList({"diff", "--cached", "--"}) + stagedFiles));
|
QStringList({"diff", "--cached", "--"}) + stagedFiles));
|
||||||
VcsOutputWindow::appendCommand(process.workingDirectory(), process.commandLine());
|
VcsOutputWindow::appendCommand(process.workingDirectory(), process.commandLine());
|
||||||
@@ -318,7 +318,7 @@ FileListDiffController::FileListDiffController(IDocument *document, const QStrin
|
|||||||
const auto onUnstagedSetup = [this, unstagedFiles](Process &process) {
|
const auto onUnstagedSetup = [this, unstagedFiles](Process &process) {
|
||||||
if (unstagedFiles.isEmpty())
|
if (unstagedFiles.isEmpty())
|
||||||
return SetupResult::StopWithError;
|
return SetupResult::StopWithError;
|
||||||
process.setCodec(VcsBaseEditor::getCodec(workingDirectory(), unstagedFiles));
|
process.setEncoding(VcsBaseEditor::getEncoding(workingDirectory(), unstagedFiles));
|
||||||
setupCommand(process, addConfigurationArguments(
|
setupCommand(process, addConfigurationArguments(
|
||||||
QStringList({"diff", "--"}) + unstagedFiles));
|
QStringList({"diff", "--"}) + unstagedFiles));
|
||||||
VcsOutputWindow::appendCommand(process.workingDirectory(), process.commandLine());
|
VcsOutputWindow::appendCommand(process.workingDirectory(), process.commandLine());
|
||||||
@@ -394,7 +394,7 @@ ShowController::ShowController(IDocument *document, const QString &id)
|
|||||||
};
|
};
|
||||||
|
|
||||||
const auto onDescriptionSetup = [this, id](Process &process) {
|
const auto onDescriptionSetup = [this, id](Process &process) {
|
||||||
process.setCodec(gitClient().encoding(GitClient::EncodingCommit, workingDirectory()));
|
process.setEncoding(gitClient().encoding(GitClient::EncodingCommit, workingDirectory()));
|
||||||
const ColorNames colors = GitClient::colorNames();
|
const ColorNames colors = GitClient::colorNames();
|
||||||
|
|
||||||
const QString showFormat = QStringLiteral(
|
const QString showFormat = QStringLiteral(
|
||||||
@@ -975,29 +975,29 @@ void GitClient::updateNextModificationInfo()
|
|||||||
this, command, RunFlags::NoOutput);
|
this, command, RunFlags::NoOutput);
|
||||||
}
|
}
|
||||||
|
|
||||||
TextCodec GitClient::defaultCommitEncoding() const
|
TextEncoding GitClient::defaultCommitEncoding() const
|
||||||
{
|
{
|
||||||
// Set default commit encoding to 'UTF-8', when it's not set,
|
// Set default commit encoding to 'UTF-8', when it's not set,
|
||||||
// to solve displaying error of commit log with non-latin characters.
|
// to solve displaying error of commit log with non-latin characters.
|
||||||
return TextCodec::utf8();
|
return QStringConverter::Utf8;
|
||||||
}
|
}
|
||||||
|
|
||||||
TextCodec GitClient::encoding(GitClient::EncodingType encodingType, const FilePath &source) const
|
TextEncoding GitClient::encoding(GitClient::EncodingType encodingType, const FilePath &source) const
|
||||||
{
|
{
|
||||||
auto codec = [this](const FilePath &workingDirectory, const QString &configVar) {
|
auto encoding = [this](const FilePath &workingDirectory, const QString &configVar) {
|
||||||
const QString codecName = readConfigValue(workingDirectory, configVar).trimmed();
|
const QString codecName = readConfigValue(workingDirectory, configVar).trimmed();
|
||||||
if (codecName.isEmpty())
|
if (codecName.isEmpty())
|
||||||
return defaultCommitEncoding();
|
return defaultCommitEncoding();
|
||||||
return TextCodec::codecForName(codecName.toUtf8());
|
return TextEncoding(codecName.toUtf8());
|
||||||
};
|
};
|
||||||
|
|
||||||
switch (encodingType) {
|
switch (encodingType) {
|
||||||
case EncodingSource:
|
case EncodingSource:
|
||||||
return source.isFile() ? VcsBaseEditor::getCodec(source) : codec(source, "gui.encoding");
|
return source.isFile() ? VcsBaseEditor::getEncoding(source) : encoding(source, "gui.encoding");
|
||||||
case EncodingLogOutput:
|
case EncodingLogOutput:
|
||||||
return codec(source, "i18n.logOutputEncoding");
|
return encoding(source, "i18n.logOutputEncoding");
|
||||||
case EncodingCommit:
|
case EncodingCommit:
|
||||||
return codec(source, "i18n.commitEncoding");
|
return encoding(source, "i18n.commitEncoding");
|
||||||
default:
|
default:
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
@@ -2711,14 +2711,15 @@ Result<CommitData> GitClient::enrichCommitData(const FilePath &repoDirectory,
|
|||||||
}
|
}
|
||||||
|
|
||||||
CommitData commitData = commitDataIn;
|
CommitData commitData = commitDataIn;
|
||||||
const TextCodec authorCodec = HostOsInfo::isWindowsHost()
|
const TextEncoding authorEncoding = HostOsInfo::isWindowsHost()
|
||||||
? TextCodec::utf8()
|
? QStringConverter::Utf8
|
||||||
: commitData.commitEncoding;
|
: commitData.commitEncoding;
|
||||||
|
const TextCodec authorCodec = TextCodec::codecForName(authorEncoding);
|
||||||
QByteArray stdOut = result.rawStdOut();
|
QByteArray stdOut = result.rawStdOut();
|
||||||
commitData.amendHash = QLatin1String(shiftLogLine(stdOut));
|
commitData.amendHash = QLatin1String(shiftLogLine(stdOut));
|
||||||
commitData.panelData.author = authorCodec.toUnicode(shiftLogLine(stdOut));
|
commitData.panelData.author = authorCodec.toUnicode(shiftLogLine(stdOut));
|
||||||
commitData.panelData.email = authorCodec.toUnicode(shiftLogLine(stdOut));
|
commitData.panelData.email = authorCodec.toUnicode(shiftLogLine(stdOut));
|
||||||
commitData.commitTemplate = commitData.commitEncoding.toUnicode(stdOut);
|
commitData.commitTemplate = TextCodec::codecForName(commitData.commitEncoding).toUnicode(stdOut);
|
||||||
return commitData;
|
return commitData;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3565,20 +3566,20 @@ QString GitClient::readGitVar(const FilePath &workingDirectory, const QString &c
|
|||||||
return readOneLine(workingDirectory, {"var", configVar});
|
return readOneLine(workingDirectory, {"var", configVar});
|
||||||
}
|
}
|
||||||
|
|
||||||
static TextCodec configFileCodec()
|
static TextEncoding configFileEncoding()
|
||||||
{
|
{
|
||||||
// Git for Windows always uses UTF-8 for configuration:
|
// Git for Windows always uses UTF-8 for configuration:
|
||||||
// https://github.com/msysgit/msysgit/wiki/Git-for-Windows-Unicode-Support#convert-config-files
|
// https://github.com/msysgit/msysgit/wiki/Git-for-Windows-Unicode-Support#convert-config-files
|
||||||
static const TextCodec codec =
|
static const TextEncoding encoding =
|
||||||
HostOsInfo::isWindowsHost() ? TextCodec::utf8() : TextCodec::codecForLocale();
|
HostOsInfo::isWindowsHost() ? QStringConverter::Utf8 : TextCodec::encodingForLocale();
|
||||||
return codec;
|
return encoding;
|
||||||
}
|
}
|
||||||
|
|
||||||
QString GitClient::readOneLine(const FilePath &workingDirectory, const QStringList &arguments) const
|
QString GitClient::readOneLine(const FilePath &workingDirectory, const QStringList &arguments) const
|
||||||
{
|
{
|
||||||
const CommandResult result = vcsSynchronousExec(workingDirectory, arguments,
|
const CommandResult result = vcsSynchronousExec(workingDirectory, arguments,
|
||||||
RunFlags::NoOutput, vcsTimeoutS(),
|
RunFlags::NoOutput, vcsTimeoutS(),
|
||||||
configFileCodec());
|
configFileEncoding());
|
||||||
if (result.result() == ProcessResult::FinishedWithSuccess)
|
if (result.result() == ProcessResult::FinishedWithSuccess)
|
||||||
return result.cleanedStdOut().trimmed();
|
return result.cleanedStdOut().trimmed();
|
||||||
return {};
|
return {};
|
||||||
@@ -3588,7 +3589,7 @@ void GitClient::readConfigAsync(const FilePath &workingDirectory, const QStringL
|
|||||||
const CommandHandler &handler) const
|
const CommandHandler &handler) const
|
||||||
{
|
{
|
||||||
vcsExecWithHandler(workingDirectory, arguments, this, handler, RunFlags::NoOutput,
|
vcsExecWithHandler(workingDirectory, arguments, this, handler, RunFlags::NoOutput,
|
||||||
configFileCodec());
|
configFileEncoding());
|
||||||
}
|
}
|
||||||
|
|
||||||
QString GitClient::styleColorName(TextEditor::TextStyle style)
|
QString GitClient::styleColorName(TextEditor::TextStyle style)
|
||||||
|
@@ -362,9 +362,9 @@ public:
|
|||||||
Author parseAuthor(const QString &authorInfo);
|
Author parseAuthor(const QString &authorInfo);
|
||||||
Author getAuthor(const Utils::FilePath &workingDirectory);
|
Author getAuthor(const Utils::FilePath &workingDirectory);
|
||||||
|
|
||||||
Utils::TextCodec defaultCommitEncoding() const;
|
Utils::TextEncoding defaultCommitEncoding() const;
|
||||||
enum EncodingType { EncodingSource, EncodingLogOutput, EncodingCommit, EncodingDefault };
|
enum EncodingType { EncodingSource, EncodingLogOutput, EncodingCommit, EncodingDefault };
|
||||||
Utils::TextCodec encoding(EncodingType encodingType, const Utils::FilePath &source = {}) const;
|
Utils::TextEncoding encoding(EncodingType encodingType, const Utils::FilePath &source = {}) const;
|
||||||
|
|
||||||
void readConfigAsync(const Utils::FilePath &workingDirectory, const QStringList &arguments,
|
void readConfigAsync(const Utils::FilePath &workingDirectory, const QStringList &arguments,
|
||||||
const VcsBase::CommandHandler &handler) const;
|
const VcsBase::CommandHandler &handler) const;
|
||||||
|
@@ -265,7 +265,7 @@ void GitEditorWidget::aboutToOpen(const FilePath &filePath, const FilePath &real
|
|||||||
|| editorId == Git::Constants::GIT_REBASE_EDITOR_ID) {
|
|| editorId == Git::Constants::GIT_REBASE_EDITOR_ID) {
|
||||||
const FilePath gitPath = filePath.absolutePath();
|
const FilePath gitPath = filePath.absolutePath();
|
||||||
setSource(gitPath);
|
setSource(gitPath);
|
||||||
textDocument()->setCodec(gitClient().encoding(GitClient::EncodingCommit, gitPath));
|
textDocument()->setCodec(TextCodec::codecForName(gitClient().encoding(GitClient::EncodingCommit, gitPath)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -330,7 +330,7 @@ QByteArray GitSubmitEditor::fileContents() const
|
|||||||
// Do the encoding convert, When use user-defined encoding
|
// Do the encoding convert, When use user-defined encoding
|
||||||
// e.g. git config --global i18n.commitencoding utf-8
|
// e.g. git config --global i18n.commitencoding utf-8
|
||||||
if (m_commitEncoding.isValid())
|
if (m_commitEncoding.isValid())
|
||||||
return m_commitEncoding.fromUnicode(text);
|
return TextCodec::codecForName(m_commitEncoding).fromUnicode(text);
|
||||||
|
|
||||||
// Using utf-8 as the default encoding
|
// Using utf-8 as the default encoding
|
||||||
return text.toUtf8();
|
return text.toUtf8();
|
||||||
|
@@ -48,7 +48,7 @@ private:
|
|||||||
inline const GitSubmitEditorWidget *submitEditorWidget() const;
|
inline const GitSubmitEditorWidget *submitEditorWidget() const;
|
||||||
|
|
||||||
VcsBase::SubmitFileModel *m_model = nullptr;
|
VcsBase::SubmitFileModel *m_model = nullptr;
|
||||||
Utils::TextCodec m_commitEncoding;
|
Utils::TextEncoding m_commitEncoding;
|
||||||
CommitType m_commitType = SimpleCommit;
|
CommitType m_commitType = SimpleCommit;
|
||||||
QString m_amenHash;
|
QString m_amenHash;
|
||||||
Utils::FilePath m_workingDirectory;
|
Utils::FilePath m_workingDirectory;
|
||||||
|
@@ -211,7 +211,7 @@ void BlameMark::addNewLine(const QString &newLine)
|
|||||||
|
|
||||||
InstantBlame::InstantBlame()
|
InstantBlame::InstantBlame()
|
||||||
{
|
{
|
||||||
m_codec = gitClient().defaultCommitEncoding();
|
m_encoding = gitClient().defaultCommitEncoding();
|
||||||
m_cursorPositionChangedTimer = new QTimer(this);
|
m_cursorPositionChangedTimer = new QTimer(this);
|
||||||
m_cursorPositionChangedTimer->setSingleShot(true);
|
m_cursorPositionChangedTimer->setSingleShot(true);
|
||||||
connect(m_cursorPositionChangedTimer, &QTimer::timeout, this, &InstantBlame::perform);
|
connect(m_cursorPositionChangedTimer, &QTimer::timeout, this, &InstantBlame::perform);
|
||||||
@@ -460,7 +460,7 @@ void InstantBlame::perform()
|
|||||||
|
|
||||||
qCDebug(log) << "Running git" << lineDiffOptions.join(' ');
|
qCDebug(log) << "Running git" << lineDiffOptions.join(' ');
|
||||||
gitClient().vcsExecWithHandler(topLevel, lineDiffOptions, this,
|
gitClient().vcsExecWithHandler(topLevel, lineDiffOptions, this,
|
||||||
lineDiffHandler, RunFlags::NoOutput, m_codec);
|
lineDiffHandler, RunFlags::NoOutput, m_encoding);
|
||||||
};
|
};
|
||||||
QStringList options = {"blame", "-p"};
|
QStringList options = {"blame", "-p"};
|
||||||
if (settings().instantBlameIgnoreSpaceChanges())
|
if (settings().instantBlameIgnoreSpaceChanges())
|
||||||
@@ -470,7 +470,7 @@ void InstantBlame::perform()
|
|||||||
options.append({"-L", lineString, "--", filePath.toUrlishString()});
|
options.append({"-L", lineString, "--", filePath.toUrlishString()});
|
||||||
qCDebug(log) << "Running git" << options.join(' ');
|
qCDebug(log) << "Running git" << options.join(' ');
|
||||||
gitClient().vcsExecWithHandler(workingDirectory, options, this,
|
gitClient().vcsExecWithHandler(workingDirectory, options, this,
|
||||||
commandHandler, RunFlags::NoOutput, m_codec);
|
commandHandler, RunFlags::NoOutput, m_encoding);
|
||||||
}
|
}
|
||||||
|
|
||||||
void InstantBlame::stop()
|
void InstantBlame::stop()
|
||||||
@@ -494,18 +494,18 @@ bool InstantBlame::refreshWorkingDirectory(const FilePath &workingDirectory)
|
|||||||
m_workingDirectory = workingDirectory;
|
m_workingDirectory = workingDirectory;
|
||||||
|
|
||||||
const auto commitCodecHandler = [this, workingDirectory](const CommandResult &result) {
|
const auto commitCodecHandler = [this, workingDirectory](const CommandResult &result) {
|
||||||
TextCodec codec;
|
TextEncoding encoding;
|
||||||
|
|
||||||
if (result.result() == ProcessResult::FinishedWithSuccess) {
|
if (result.result() == ProcessResult::FinishedWithSuccess) {
|
||||||
const QString codecName = result.cleanedStdOut().trimmed();
|
const QString codecName = result.cleanedStdOut().trimmed();
|
||||||
codec = TextCodec::codecForName(codecName.toUtf8());
|
encoding = codecName.toUtf8();
|
||||||
} else {
|
} else {
|
||||||
codec = gitClient().defaultCommitEncoding();
|
encoding = gitClient().defaultCommitEncoding();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_codec != codec) {
|
if (m_encoding != encoding) {
|
||||||
qCInfo(log) << "Setting new text codec:" << codec.displayName();
|
qCInfo(log) << "Setting new text codec:" << encoding.name();
|
||||||
m_codec = codec;
|
m_encoding = encoding;
|
||||||
force();
|
force();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@@ -64,7 +64,7 @@ private:
|
|||||||
void slotDocumentChanged();
|
void slotDocumentChanged();
|
||||||
|
|
||||||
Utils::FilePath m_workingDirectory;
|
Utils::FilePath m_workingDirectory;
|
||||||
Utils::TextCodec m_codec;
|
Utils::TextEncoding m_encoding;
|
||||||
Author m_author;
|
Author m_author;
|
||||||
int m_lastVisitedEditorLine = -1;
|
int m_lastVisitedEditorLine = -1;
|
||||||
Core::IDocument *m_document = nullptr;
|
Core::IDocument *m_document = nullptr;
|
||||||
|
@@ -205,7 +205,7 @@ void MercurialClient::incoming(const FilePath &repositoryRoot, const QString &re
|
|||||||
const QString title = Tr::tr("Hg incoming %1").arg(id);
|
const QString title = Tr::tr("Hg incoming %1").arg(id);
|
||||||
|
|
||||||
VcsBaseEditorWidget *editor = createVcsEditor(Constants::DIFFLOG_ID, title, repositoryRoot,
|
VcsBaseEditorWidget *editor = createVcsEditor(Constants::DIFFLOG_ID, title, repositoryRoot,
|
||||||
VcsBaseEditor::getCodec(repositoryRoot),
|
VcsBaseEditor::getEncoding(repositoryRoot),
|
||||||
"incoming", id);
|
"incoming", id);
|
||||||
enqueueJob(createCommand(FilePath::fromString(repository), editor), args, repositoryRoot);
|
enqueueJob(createCommand(FilePath::fromString(repository), editor), args, repositoryRoot);
|
||||||
}
|
}
|
||||||
@@ -218,7 +218,7 @@ void MercurialClient::outgoing(const FilePath &repositoryRoot)
|
|||||||
const QString title = Tr::tr("Hg outgoing %1").arg(repositoryRoot.toUserOutput());
|
const QString title = Tr::tr("Hg outgoing %1").arg(repositoryRoot.toUserOutput());
|
||||||
|
|
||||||
VcsBaseEditorWidget *editor = createVcsEditor(Constants::DIFFLOG_ID, title, repositoryRoot,
|
VcsBaseEditorWidget *editor = createVcsEditor(Constants::DIFFLOG_ID, title, repositoryRoot,
|
||||||
VcsBaseEditor::getCodec(repositoryRoot),
|
VcsBaseEditor::getEncoding(repositoryRoot),
|
||||||
"outgoing", repositoryRoot.toUrlishString());
|
"outgoing", repositoryRoot.toUrlishString());
|
||||||
enqueueJob(createCommand(repositoryRoot, editor), args, repositoryRoot);
|
enqueueJob(createCommand(repositoryRoot, editor), args, repositoryRoot);
|
||||||
}
|
}
|
||||||
|
@@ -238,7 +238,7 @@ public:
|
|||||||
|
|
||||||
IEditor *showOutputInEditor(const QString &title, const QString &output,
|
IEditor *showOutputInEditor(const QString &title, const QString &output,
|
||||||
Id id, const FilePath &source,
|
Id id, const FilePath &source,
|
||||||
const TextCodec &codec = {});
|
const TextEncoding &encoding = {});
|
||||||
|
|
||||||
// args are passed as command line arguments
|
// args are passed as command line arguments
|
||||||
// extra args via a tempfile and the option -x "temp-filename"
|
// extra args via a tempfile and the option -x "temp-filename"
|
||||||
@@ -247,13 +247,13 @@ public:
|
|||||||
unsigned flags = CommandToWindow|StdErrToWindow|ErrorToWindow,
|
unsigned flags = CommandToWindow|StdErrToWindow|ErrorToWindow,
|
||||||
const QStringList &extraArgs = {},
|
const QStringList &extraArgs = {},
|
||||||
const QByteArray &stdInput = {},
|
const QByteArray &stdInput = {},
|
||||||
const Utils::TextCodec &outputCodec = {}) const;
|
const Utils::TextEncoding &encoding = {}) const;
|
||||||
|
|
||||||
PerforceResponse synchronousProcess(const FilePath &workingDir,
|
PerforceResponse synchronousProcess(const FilePath &workingDir,
|
||||||
const QStringList &args,
|
const QStringList &args,
|
||||||
unsigned flags,
|
unsigned flags,
|
||||||
const QByteArray &stdInput,
|
const QByteArray &stdInput,
|
||||||
const Utils::TextCodec &outputCodec) const;
|
const Utils::TextEncoding &encoding) const;
|
||||||
|
|
||||||
void annotate(const FilePath &workingDir, const QString &fileName,
|
void annotate(const FilePath &workingDir, const QString &fileName,
|
||||||
const QString &changeList = QString(), int lineNumber = -1);
|
const QString &changeList = QString(), int lineNumber = -1);
|
||||||
@@ -547,12 +547,12 @@ void PerforcePluginPrivate::revertCurrentFile()
|
|||||||
const VcsBasePluginState state = currentState();
|
const VcsBasePluginState state = currentState();
|
||||||
QTC_ASSERT(state.hasFile(), return);
|
QTC_ASSERT(state.hasFile(), return);
|
||||||
|
|
||||||
const TextCodec codec = VcsBaseEditor::getCodec(state.currentFile());
|
const TextEncoding encoding = VcsBaseEditor::getEncoding(state.currentFile());
|
||||||
QStringList args;
|
QStringList args;
|
||||||
args << QLatin1String("diff") << QLatin1String("-sa") << state.relativeCurrentFile();
|
args << QLatin1String("diff") << QLatin1String("-sa") << state.relativeCurrentFile();
|
||||||
PerforceResponse result = runP4Cmd(state.currentFileTopLevel(), args,
|
PerforceResponse result = runP4Cmd(state.currentFileTopLevel(), args,
|
||||||
RunFullySynchronous|CommandToWindow|StdErrToWindow|ErrorToWindow,
|
RunFullySynchronous|CommandToWindow|StdErrToWindow|ErrorToWindow,
|
||||||
{}, {}, codec);
|
{}, {}, encoding);
|
||||||
if (result.error)
|
if (result.error)
|
||||||
return;
|
return;
|
||||||
// "foo.cpp - file(s) not opened on this client."
|
// "foo.cpp - file(s) not opened on this client."
|
||||||
@@ -796,7 +796,7 @@ void PerforcePluginPrivate::annotate(const FilePath &workingDir,
|
|||||||
int lineNumber /* = -1 */)
|
int lineNumber /* = -1 */)
|
||||||
{
|
{
|
||||||
const QStringList files = QStringList(fileName);
|
const QStringList files = QStringList(fileName);
|
||||||
const TextCodec codec = VcsBaseEditor::getCodec(workingDir, files);
|
const TextEncoding encoding = VcsBaseEditor::getEncoding(workingDir, files);
|
||||||
const QString id = VcsBaseEditor::getTitleId(workingDir, files, changeList);
|
const QString id = VcsBaseEditor::getTitleId(workingDir, files, changeList);
|
||||||
const FilePath source = VcsBaseEditor::getSource(workingDir, files);
|
const FilePath source = VcsBaseEditor::getSource(workingDir, files);
|
||||||
QStringList args;
|
QStringList args;
|
||||||
@@ -807,13 +807,13 @@ void PerforcePluginPrivate::annotate(const FilePath &workingDir,
|
|||||||
args << (fileName + QLatin1Char('@') + changeList);
|
args << (fileName + QLatin1Char('@') + changeList);
|
||||||
const PerforceResponse result = runP4Cmd(workingDir, args,
|
const PerforceResponse result = runP4Cmd(workingDir, args,
|
||||||
CommandToWindow|StdErrToWindow|ErrorToWindow,
|
CommandToWindow|StdErrToWindow|ErrorToWindow,
|
||||||
{}, {}, codec);
|
{}, {}, encoding);
|
||||||
if (!result.error) {
|
if (!result.error) {
|
||||||
if (lineNumber < 1)
|
if (lineNumber < 1)
|
||||||
lineNumber = VcsBaseEditor::lineNumberOfCurrentEditor();
|
lineNumber = VcsBaseEditor::lineNumberOfCurrentEditor();
|
||||||
IEditor *ed = showOutputInEditor(Tr::tr("p4 annotate %1").arg(id),
|
IEditor *ed = showOutputInEditor(Tr::tr("p4 annotate %1").arg(id),
|
||||||
result.stdOut, PERFORCE_ANNOTATION_EDITOR_ID,
|
result.stdOut, PERFORCE_ANNOTATION_EDITOR_ID,
|
||||||
source, codec);
|
source, encoding);
|
||||||
VcsBaseEditor::gotoLineOfEditor(ed, lineNumber);
|
VcsBaseEditor::gotoLineOfEditor(ed, lineNumber);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -850,7 +850,7 @@ void PerforcePluginPrivate::filelog(const FilePath &workingDir, const QString &f
|
|||||||
bool enableAnnotationContextMenu)
|
bool enableAnnotationContextMenu)
|
||||||
{
|
{
|
||||||
const QString id = VcsBaseEditor::getTitleId(workingDir, QStringList(fileName));
|
const QString id = VcsBaseEditor::getTitleId(workingDir, QStringList(fileName));
|
||||||
const TextCodec codec = VcsBaseEditor::getCodec(workingDir, QStringList(fileName));
|
const TextEncoding encoding = VcsBaseEditor::getEncoding(workingDir, QStringList(fileName));
|
||||||
QStringList args;
|
QStringList args;
|
||||||
args << QLatin1String("filelog") << QLatin1String("-li");
|
args << QLatin1String("filelog") << QLatin1String("-li");
|
||||||
if (settings().logCount() > 0)
|
if (settings().logCount() > 0)
|
||||||
@@ -859,11 +859,11 @@ void PerforcePluginPrivate::filelog(const FilePath &workingDir, const QString &f
|
|||||||
args.append(fileName);
|
args.append(fileName);
|
||||||
const PerforceResponse result = runP4Cmd(workingDir, args,
|
const PerforceResponse result = runP4Cmd(workingDir, args,
|
||||||
CommandToWindow|StdErrToWindow|ErrorToWindow,
|
CommandToWindow|StdErrToWindow|ErrorToWindow,
|
||||||
{}, {}, codec);
|
{}, {}, encoding);
|
||||||
if (!result.error) {
|
if (!result.error) {
|
||||||
const FilePath source = VcsBaseEditor::getSource(workingDir, fileName);
|
const FilePath source = VcsBaseEditor::getSource(workingDir, fileName);
|
||||||
IEditor *editor = showOutputInEditor(Tr::tr("p4 filelog %1").arg(id), result.stdOut,
|
IEditor *editor = showOutputInEditor(Tr::tr("p4 filelog %1").arg(id), result.stdOut,
|
||||||
PERFORCE_LOG_EDITOR_ID, source, codec);
|
PERFORCE_LOG_EDITOR_ID, source, encoding);
|
||||||
if (enableAnnotationContextMenu)
|
if (enableAnnotationContextMenu)
|
||||||
VcsBaseEditor::getVcsBaseEditor(editor)->setFileLogAnnotateEnabled(true);
|
VcsBaseEditor::getVcsBaseEditor(editor)->setFileLogAnnotateEnabled(true);
|
||||||
}
|
}
|
||||||
@@ -872,7 +872,7 @@ void PerforcePluginPrivate::filelog(const FilePath &workingDir, const QString &f
|
|||||||
void PerforcePluginPrivate::changelists(const FilePath &workingDir, const QString &fileName)
|
void PerforcePluginPrivate::changelists(const FilePath &workingDir, const QString &fileName)
|
||||||
{
|
{
|
||||||
const QString id = VcsBaseEditor::getTitleId(workingDir, QStringList(fileName));
|
const QString id = VcsBaseEditor::getTitleId(workingDir, QStringList(fileName));
|
||||||
const TextCodec codec = VcsBaseEditor::getCodec(workingDir, QStringList(fileName));
|
const TextEncoding encoding = VcsBaseEditor::getEncoding(workingDir, QStringList(fileName));
|
||||||
QStringList args;
|
QStringList args;
|
||||||
args << QLatin1String("changelists") << QLatin1String("-lit");
|
args << QLatin1String("changelists") << QLatin1String("-lit");
|
||||||
if (settings().logCount() > 0)
|
if (settings().logCount() > 0)
|
||||||
@@ -881,11 +881,11 @@ void PerforcePluginPrivate::changelists(const FilePath &workingDir, const QStrin
|
|||||||
args.append(fileName);
|
args.append(fileName);
|
||||||
const PerforceResponse result = runP4Cmd(workingDir, args,
|
const PerforceResponse result = runP4Cmd(workingDir, args,
|
||||||
CommandToWindow|StdErrToWindow|ErrorToWindow,
|
CommandToWindow|StdErrToWindow|ErrorToWindow,
|
||||||
{}, {}, codec);
|
{}, {}, encoding);
|
||||||
if (!result.error) {
|
if (!result.error) {
|
||||||
const FilePath source = VcsBaseEditor::getSource(workingDir, fileName);
|
const FilePath source = VcsBaseEditor::getSource(workingDir, fileName);
|
||||||
IEditor *editor = showOutputInEditor(Tr::tr("p4 changelists %1").arg(id), result.stdOut,
|
IEditor *editor = showOutputInEditor(Tr::tr("p4 changelists %1").arg(id), result.stdOut,
|
||||||
PERFORCE_LOG_EDITOR_ID, source, codec);
|
PERFORCE_LOG_EDITOR_ID, source, encoding);
|
||||||
VcsBaseEditor::gotoLineOfEditor(editor, 1);
|
VcsBaseEditor::gotoLineOfEditor(editor, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1161,14 +1161,14 @@ PerforceResponse PerforcePluginPrivate::synchronousProcess(const FilePath &worki
|
|||||||
const QStringList &args,
|
const QStringList &args,
|
||||||
unsigned flags,
|
unsigned flags,
|
||||||
const QByteArray &stdInput,
|
const QByteArray &stdInput,
|
||||||
const TextCodec &outputCodec) const
|
const TextEncoding &encoding) const
|
||||||
{
|
{
|
||||||
// Run, connect stderr to the output window
|
// Run, connect stderr to the output window
|
||||||
Process process;
|
Process process;
|
||||||
process.setWriteData(stdInput);
|
process.setWriteData(stdInput);
|
||||||
const int timeOutS = (flags & LongTimeOut) ? settings().longTimeOutS() : settings().timeOutS();
|
const int timeOutS = (flags & LongTimeOut) ? settings().longTimeOutS() : settings().timeOutS();
|
||||||
if (outputCodec.isValid())
|
if (encoding.isValid())
|
||||||
process.setCodec(outputCodec);
|
process.setEncoding(encoding);
|
||||||
if (flags & OverrideDiffEnvironment)
|
if (flags & OverrideDiffEnvironment)
|
||||||
process.setEnvironment(overrideDiffEnvironmentVariable());
|
process.setEnvironment(overrideDiffEnvironmentVariable());
|
||||||
if (!workingDir.isEmpty())
|
if (!workingDir.isEmpty())
|
||||||
@@ -1209,7 +1209,7 @@ PerforceResponse PerforcePluginPrivate::runP4Cmd(const FilePath &workingDir,
|
|||||||
unsigned flags,
|
unsigned flags,
|
||||||
const QStringList &extraArgs,
|
const QStringList &extraArgs,
|
||||||
const QByteArray &stdInput,
|
const QByteArray &stdInput,
|
||||||
const TextCodec &outputCodec) const
|
const TextEncoding &encoding) const
|
||||||
{
|
{
|
||||||
if (!settings().isValid()) {
|
if (!settings().isValid()) {
|
||||||
VcsOutputWindow::appendError(Tr::tr("Perforce is not correctly configured."));
|
VcsOutputWindow::appendError(Tr::tr("Perforce is not correctly configured."));
|
||||||
@@ -1232,7 +1232,7 @@ PerforceResponse PerforcePluginPrivate::runP4Cmd(const FilePath &workingDir,
|
|||||||
QGuiApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
|
QGuiApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
|
||||||
|
|
||||||
const PerforceResponse response
|
const PerforceResponse response
|
||||||
= synchronousProcess(workingDir, actualArgs, flags, stdInput, outputCodec);
|
= synchronousProcess(workingDir, actualArgs, flags, stdInput, encoding);
|
||||||
|
|
||||||
if (flags & ShowBusyCursor)
|
if (flags & ShowBusyCursor)
|
||||||
QGuiApplication::restoreOverrideCursor();
|
QGuiApplication::restoreOverrideCursor();
|
||||||
@@ -1243,7 +1243,7 @@ IEditor *PerforcePluginPrivate::showOutputInEditor(const QString &title,
|
|||||||
const QString &output,
|
const QString &output,
|
||||||
Id id,
|
Id id,
|
||||||
const FilePath &source,
|
const FilePath &source,
|
||||||
const TextCodec &codec)
|
const TextEncoding &encoding)
|
||||||
{
|
{
|
||||||
QString s = title;
|
QString s = title;
|
||||||
QString content = output;
|
QString content = output;
|
||||||
@@ -1263,8 +1263,8 @@ IEditor *PerforcePluginPrivate::showOutputInEditor(const QString &title,
|
|||||||
e->setSource(source);
|
e->setSource(source);
|
||||||
s.replace(QLatin1Char(' '), QLatin1Char('_'));
|
s.replace(QLatin1Char(' '), QLatin1Char('_'));
|
||||||
e->textDocument()->setFallbackSaveAsFileName(s);
|
e->textDocument()->setFallbackSaveAsFileName(s);
|
||||||
if (codec.isValid())
|
if (encoding.isValid())
|
||||||
e->setCodec(codec);
|
e->setEncoding(encoding);
|
||||||
return editor;
|
return editor;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1337,7 +1337,7 @@ void PerforcePluginPrivate::p4Diff(const FilePath &workingDir, const QStringList
|
|||||||
|
|
||||||
void PerforcePluginPrivate::p4Diff(const PerforceDiffParameters &p)
|
void PerforcePluginPrivate::p4Diff(const PerforceDiffParameters &p)
|
||||||
{
|
{
|
||||||
const TextCodec codec = VcsBaseEditor::getCodec(p.workingDir, p.files);
|
const TextEncoding encoding = VcsBaseEditor::getEncoding(p.workingDir, p.files);
|
||||||
const QString id = VcsBaseEditor::getTitleId(p.workingDir, p.files);
|
const QString id = VcsBaseEditor::getTitleId(p.workingDir, p.files);
|
||||||
// Reuse existing editors for that id
|
// Reuse existing editors for that id
|
||||||
const QString tag = VcsBaseEditor::editorTag(DiffOutput, p.workingDir, p.files);
|
const QString tag = VcsBaseEditor::editorTag(DiffOutput, p.workingDir, p.files);
|
||||||
@@ -1353,7 +1353,7 @@ void PerforcePluginPrivate::p4Diff(const PerforceDiffParameters &p)
|
|||||||
else
|
else
|
||||||
args.append(p.files);
|
args.append(p.files);
|
||||||
const unsigned flags = CommandToWindow|StdErrToWindow|ErrorToWindow|OverrideDiffEnvironment;
|
const unsigned flags = CommandToWindow|StdErrToWindow|ErrorToWindow|OverrideDiffEnvironment;
|
||||||
const PerforceResponse result = runP4Cmd(p.workingDir, args, flags, extraArgs, {}, codec);
|
const PerforceResponse result = runP4Cmd(p.workingDir, args, flags, extraArgs, {}, encoding);
|
||||||
if (result.error)
|
if (result.error)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -1366,7 +1366,7 @@ void PerforcePluginPrivate::p4Diff(const PerforceDiffParameters &p)
|
|||||||
IEditor *editor = showOutputInEditor(Tr::tr("p4 diff %1").arg(id), result.stdOut,
|
IEditor *editor = showOutputInEditor(Tr::tr("p4 diff %1").arg(id), result.stdOut,
|
||||||
PERFORCE_DIFF_EDITOR_ID,
|
PERFORCE_DIFF_EDITOR_ID,
|
||||||
VcsBaseEditor::getSource(p.workingDir, p.files),
|
VcsBaseEditor::getSource(p.workingDir, p.files),
|
||||||
codec);
|
encoding);
|
||||||
VcsBaseEditor::tagEditor(editor, tag);
|
VcsBaseEditor::tagEditor(editor, tag);
|
||||||
auto diffEditorWidget = qobject_cast<VcsBaseEditorWidget *>(editor->widget());
|
auto diffEditorWidget = qobject_cast<VcsBaseEditorWidget *>(editor->widget());
|
||||||
// Wire up the parameter widget to trigger a re-run on
|
// Wire up the parameter widget to trigger a re-run on
|
||||||
@@ -1381,13 +1381,13 @@ void PerforcePluginPrivate::p4Diff(const PerforceDiffParameters &p)
|
|||||||
|
|
||||||
void PerforcePluginPrivate::vcsDescribe(const FilePath &source, const QString &n)
|
void PerforcePluginPrivate::vcsDescribe(const FilePath &source, const QString &n)
|
||||||
{
|
{
|
||||||
const TextCodec codec = source.isEmpty() ? TextCodec() : VcsBaseEditor::getCodec(source);
|
const TextEncoding encoding = source.isEmpty() ? TextEncoding() : VcsBaseEditor::getEncoding(source);
|
||||||
QStringList args;
|
QStringList args;
|
||||||
args << QLatin1String("describe") << QLatin1String("-du") << n;
|
args << QLatin1String("describe") << QLatin1String("-du") << n;
|
||||||
const PerforceResponse result = runP4Cmd(settings().topLevel(), args, CommandToWindow|StdErrToWindow|ErrorToWindow,
|
const PerforceResponse result = runP4Cmd(settings().topLevel(), args, CommandToWindow|StdErrToWindow|ErrorToWindow,
|
||||||
{}, {}, codec);
|
{}, {}, encoding);
|
||||||
if (!result.error)
|
if (!result.error)
|
||||||
showOutputInEditor(Tr::tr("p4 describe %1").arg(n), result.stdOut, PERFORCE_DIFF_EDITOR_ID, source, codec);
|
showOutputInEditor(Tr::tr("p4 describe %1").arg(n), result.stdOut, PERFORCE_DIFF_EDITOR_ID, source, encoding);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PerforcePluginPrivate::cleanCommitMessageFile()
|
void PerforcePluginPrivate::cleanCommitMessageFile()
|
||||||
|
@@ -165,7 +165,7 @@ public:
|
|||||||
QString monitorFile(const FilePath &repository) const;
|
QString monitorFile(const FilePath &repository) const;
|
||||||
QString synchronousTopic(const FilePath &repository) const;
|
QString synchronousTopic(const FilePath &repository) const;
|
||||||
CommandResult runSvn(const FilePath &workingDir, const CommandLine &command,
|
CommandResult runSvn(const FilePath &workingDir, const CommandLine &command,
|
||||||
RunFlags flags = RunFlags::None, const TextCodec &outputCodec = {},
|
RunFlags flags = RunFlags::None, const TextEncoding &encoding = {},
|
||||||
int timeoutMutiplier = 1) const;
|
int timeoutMutiplier = 1) const;
|
||||||
void vcsAnnotateHelper(const FilePath &workingDir, const QString &file,
|
void vcsAnnotateHelper(const FilePath &workingDir, const QString &file,
|
||||||
const QString &revision = {}, int lineNumber = -1);
|
const QString &revision = {}, int lineNumber = -1);
|
||||||
@@ -200,7 +200,7 @@ private:
|
|||||||
inline bool isCommitEditorOpen() const;
|
inline bool isCommitEditorOpen() const;
|
||||||
Core::IEditor *showOutputInEditor(const QString &title, const QString &output,
|
Core::IEditor *showOutputInEditor(const QString &title, const QString &output,
|
||||||
Id id, const FilePath &source,
|
Id id, const FilePath &source,
|
||||||
const TextCodec &codec);
|
const TextEncoding &encoding);
|
||||||
|
|
||||||
void filelog(const FilePath &workingDir,
|
void filelog(const FilePath &workingDir,
|
||||||
const QString &file = {},
|
const QString &file = {},
|
||||||
@@ -813,7 +813,7 @@ void SubversionPluginPrivate::vcsAnnotateHelper(const FilePath &workingDir, cons
|
|||||||
int lineNumber /* = -1 */)
|
int lineNumber /* = -1 */)
|
||||||
{
|
{
|
||||||
const FilePath source = VcsBaseEditor::getSource(workingDir, file);
|
const FilePath source = VcsBaseEditor::getSource(workingDir, file);
|
||||||
const TextCodec codec = VcsBaseEditor::getCodec(source);
|
const TextEncoding encoding = VcsBaseEditor::getEncoding(source);
|
||||||
|
|
||||||
CommandLine args{settings().binaryPath(), {"annotate"}};
|
CommandLine args{settings().binaryPath(), {"annotate"}};
|
||||||
args << SubversionClient::AddAuthOptions();
|
args << SubversionClient::AddAuthOptions();
|
||||||
@@ -823,7 +823,7 @@ void SubversionPluginPrivate::vcsAnnotateHelper(const FilePath &workingDir, cons
|
|||||||
args << "-r" << revision;
|
args << "-r" << revision;
|
||||||
args << "-v" << QDir::toNativeSeparators(SubversionClient::escapeFile(file));
|
args << "-v" << QDir::toNativeSeparators(SubversionClient::escapeFile(file));
|
||||||
|
|
||||||
const auto response = runSvn(workingDir, args, RunFlags::ForceCLocale, codec);
|
const auto response = runSvn(workingDir, args, RunFlags::ForceCLocale, encoding);
|
||||||
if (response.result() != ProcessResult::FinishedWithSuccess)
|
if (response.result() != ProcessResult::FinishedWithSuccess)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -842,7 +842,7 @@ void SubversionPluginPrivate::vcsAnnotateHelper(const FilePath &workingDir, cons
|
|||||||
} else {
|
} else {
|
||||||
const QString title = QString::fromLatin1("svn annotate %1").arg(id);
|
const QString title = QString::fromLatin1("svn annotate %1").arg(id);
|
||||||
IEditor *newEditor = showOutputInEditor(title, response.cleanedStdOut(),
|
IEditor *newEditor = showOutputInEditor(title, response.cleanedStdOut(),
|
||||||
Constants::SUBVERSION_BLAME_EDITOR_ID, source, codec);
|
Constants::SUBVERSION_BLAME_EDITOR_ID, source, encoding);
|
||||||
VcsBaseEditor::tagEditor(newEditor, tag);
|
VcsBaseEditor::tagEditor(newEditor, tag);
|
||||||
VcsBaseEditor::gotoLineOfEditor(newEditor, lineNumber);
|
VcsBaseEditor::gotoLineOfEditor(newEditor, lineNumber);
|
||||||
}
|
}
|
||||||
@@ -897,22 +897,22 @@ void SubversionPluginPrivate::slotDescribe()
|
|||||||
|
|
||||||
CommandResult SubversionPluginPrivate::runSvn(const FilePath &workingDir,
|
CommandResult SubversionPluginPrivate::runSvn(const FilePath &workingDir,
|
||||||
const CommandLine &command, RunFlags flags,
|
const CommandLine &command, RunFlags flags,
|
||||||
const TextCodec &outputCodec, int timeoutMutiplier) const
|
const TextEncoding &encoding, int timeoutMutiplier) const
|
||||||
{
|
{
|
||||||
if (settings().binaryPath().isEmpty())
|
if (settings().binaryPath().isEmpty())
|
||||||
return CommandResult(ProcessResult::StartFailed, Tr::tr("No subversion executable specified."));
|
return CommandResult(ProcessResult::StartFailed, Tr::tr("No subversion executable specified."));
|
||||||
|
|
||||||
const int timeoutS = settings().timeout() * timeoutMutiplier;
|
const int timeoutS = settings().timeout() * timeoutMutiplier;
|
||||||
return subversionClient().vcsSynchronousExec(workingDir, command, flags, timeoutS, outputCodec);
|
return subversionClient().vcsSynchronousExec(workingDir, command, flags, timeoutS, encoding);
|
||||||
}
|
}
|
||||||
|
|
||||||
IEditor *SubversionPluginPrivate::showOutputInEditor(const QString &title, const QString &output,
|
IEditor *SubversionPluginPrivate::showOutputInEditor(const QString &title, const QString &output,
|
||||||
Id id, const FilePath &source,
|
Id id, const FilePath &source,
|
||||||
const TextCodec &codec)
|
const TextEncoding &encoding)
|
||||||
{
|
{
|
||||||
if (Subversion::Constants::debug)
|
if (Subversion::Constants::debug)
|
||||||
qDebug() << "SubversionPlugin::showOutputInEditor" << title << id.toString()
|
qDebug() << "SubversionPlugin::showOutputInEditor" << title << id.toString()
|
||||||
<< "Size= " << output.size() << " Type=" << id << codec.displayName();
|
<< "Size= " << output.size() << " Type=" << id << encoding.name();
|
||||||
QString s = title;
|
QString s = title;
|
||||||
IEditor *editor = EditorManager::openEditorWithContents(id, &s, output.toUtf8());
|
IEditor *editor = EditorManager::openEditorWithContents(id, &s, output.toUtf8());
|
||||||
auto e = qobject_cast<SubversionEditorWidget*>(editor->widget());
|
auto e = qobject_cast<SubversionEditorWidget*>(editor->widget());
|
||||||
@@ -925,8 +925,8 @@ IEditor *SubversionPluginPrivate::showOutputInEditor(const QString &title, const
|
|||||||
e->textDocument()->setFallbackSaveAsFileName(s);
|
e->textDocument()->setFallbackSaveAsFileName(s);
|
||||||
if (!source.isEmpty())
|
if (!source.isEmpty())
|
||||||
e->setSource(source);
|
e->setSource(source);
|
||||||
if (codec.isValid())
|
if (encoding.isValid())
|
||||||
e->setCodec(codec);
|
e->setEncoding(encoding);
|
||||||
return editor;
|
return editor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -130,23 +130,23 @@ QString VcsBaseClientImpl::stripLastNewline(const QString &in)
|
|||||||
|
|
||||||
CommandResult VcsBaseClientImpl::vcsSynchronousExec(const FilePath &workingDir,
|
CommandResult VcsBaseClientImpl::vcsSynchronousExec(const FilePath &workingDir,
|
||||||
const QStringList &args, RunFlags flags,
|
const QStringList &args, RunFlags flags,
|
||||||
int timeoutS, const TextCodec &codec) const
|
int timeoutS, const TextEncoding &encoding) const
|
||||||
{
|
{
|
||||||
return vcsSynchronousExec(workingDir, {vcsBinary(workingDir), args}, flags, timeoutS, codec);
|
return vcsSynchronousExec(workingDir, {vcsBinary(workingDir), args}, flags, timeoutS, encoding);
|
||||||
}
|
}
|
||||||
|
|
||||||
CommandResult VcsBaseClientImpl::vcsSynchronousExec(const FilePath &workingDir,
|
CommandResult VcsBaseClientImpl::vcsSynchronousExec(const FilePath &workingDir,
|
||||||
const CommandLine &cmdLine,
|
const CommandLine &cmdLine,
|
||||||
RunFlags flags,
|
RunFlags flags,
|
||||||
int timeoutS,
|
int timeoutS,
|
||||||
const TextCodec &codec) const
|
const TextEncoding &encoding) const
|
||||||
{
|
{
|
||||||
return VcsCommand::runBlocking(workingDir,
|
return VcsCommand::runBlocking(workingDir,
|
||||||
processEnvironment(workingDir),
|
processEnvironment(workingDir),
|
||||||
cmdLine,
|
cmdLine,
|
||||||
flags,
|
flags,
|
||||||
timeoutS > 0 ? timeoutS : vcsTimeoutS(),
|
timeoutS > 0 ? timeoutS : vcsTimeoutS(),
|
||||||
codec);
|
encoding);
|
||||||
}
|
}
|
||||||
|
|
||||||
void VcsBaseClientImpl::resetCachedVcsInfo(const FilePath &workingDir)
|
void VcsBaseClientImpl::resetCachedVcsInfo(const FilePath &workingDir)
|
||||||
@@ -171,11 +171,11 @@ void VcsBaseClientImpl::vcsExecWithHandler(const FilePath &workingDirectory,
|
|||||||
const QStringList &arguments,
|
const QStringList &arguments,
|
||||||
const QObject *context,
|
const QObject *context,
|
||||||
const CommandHandler &handler,
|
const CommandHandler &handler,
|
||||||
RunFlags additionalFlags, const TextCodec codec) const
|
RunFlags additionalFlags, const TextEncoding &encoding) const
|
||||||
{
|
{
|
||||||
VcsCommand *command = createCommand(workingDirectory);
|
VcsCommand *command = createCommand(workingDirectory);
|
||||||
command->addFlags(additionalFlags);
|
command->addFlags(additionalFlags);
|
||||||
command->setCodec(codec);
|
command->setEncoding(encoding);
|
||||||
command->addJob({vcsBinary(workingDirectory), arguments}, vcsTimeoutS());
|
command->addJob({vcsBinary(workingDirectory), arguments}, vcsTimeoutS());
|
||||||
if (handler) {
|
if (handler) {
|
||||||
const QObject *actualContext = context ? context : this;
|
const QObject *actualContext = context ? context : this;
|
||||||
@@ -201,7 +201,7 @@ void VcsBaseClientImpl::vcsExecWithEditor(const Utils::FilePath &workingDirector
|
|||||||
VcsBaseEditorWidget *editor) const
|
VcsBaseEditorWidget *editor) const
|
||||||
{
|
{
|
||||||
VcsCommand *command = createCommand(workingDirectory, editor);
|
VcsCommand *command = createCommand(workingDirectory, editor);
|
||||||
command->setCodec(editor->codec());
|
command->setEncoding(editor->encoding().name());
|
||||||
command->addJob({vcsBinary(workingDirectory), arguments}, vcsTimeoutS());
|
command->addJob({vcsBinary(workingDirectory), arguments}, vcsTimeoutS());
|
||||||
command->start();
|
command->start();
|
||||||
}
|
}
|
||||||
@@ -221,7 +221,7 @@ VcsCommand *VcsBaseClientImpl::createVcsCommand(const FilePath &defaultWorkingDi
|
|||||||
|
|
||||||
VcsBaseEditorWidget *VcsBaseClientImpl::createVcsEditor(Id kind, QString title,
|
VcsBaseEditorWidget *VcsBaseClientImpl::createVcsEditor(Id kind, QString title,
|
||||||
const FilePath &source,
|
const FilePath &source,
|
||||||
const TextCodec &codec,
|
const TextEncoding &encoding,
|
||||||
const char *registerDynamicProperty,
|
const char *registerDynamicProperty,
|
||||||
const QString &dynamicPropertyValue) const
|
const QString &dynamicPropertyValue) const
|
||||||
{
|
{
|
||||||
@@ -243,8 +243,8 @@ VcsBaseEditorWidget *VcsBaseClientImpl::createVcsEditor(Id kind, QString title,
|
|||||||
this, &VcsBaseClientImpl::annotateRevisionRequested);
|
this, &VcsBaseClientImpl::annotateRevisionRequested);
|
||||||
baseEditor->setSource(source);
|
baseEditor->setSource(source);
|
||||||
baseEditor->setDefaultLineNumber(1);
|
baseEditor->setDefaultLineNumber(1);
|
||||||
if (codec.isValid())
|
if (encoding.isValid())
|
||||||
baseEditor->setCodec(codec);
|
baseEditor->setEncoding(encoding);
|
||||||
}
|
}
|
||||||
|
|
||||||
baseEditor->setForceReadOnly(true);
|
baseEditor->setForceReadOnly(true);
|
||||||
@@ -344,7 +344,7 @@ void VcsBaseClient::annotate(const Utils::FilePath &workingDir, const QString &f
|
|||||||
const FilePath source = VcsBaseEditor::getSource(workingDir, file);
|
const FilePath source = VcsBaseEditor::getSource(workingDir, file);
|
||||||
|
|
||||||
VcsBaseEditorWidget *editor = createVcsEditor(kind, title, source,
|
VcsBaseEditorWidget *editor = createVcsEditor(kind, title, source,
|
||||||
VcsBaseEditor::getCodec(source),
|
VcsBaseEditor::getEncoding(source),
|
||||||
vcsCmdString.toLatin1().constData(), id);
|
vcsCmdString.toLatin1().constData(), id);
|
||||||
|
|
||||||
VcsCommand *cmd = createCommand(workingDir, editor);
|
VcsCommand *cmd = createCommand(workingDir, editor);
|
||||||
@@ -360,7 +360,7 @@ void VcsBaseClient::diff(const FilePath &workingDir, const QStringList &files)
|
|||||||
const QString title = vcsEditorTitle(vcsCmdString, id);
|
const QString title = vcsEditorTitle(vcsCmdString, id);
|
||||||
const FilePath source = VcsBaseEditor::getSource(workingDir, files);
|
const FilePath source = VcsBaseEditor::getSource(workingDir, files);
|
||||||
VcsBaseEditorWidget *editor = createVcsEditor(kind, title, source,
|
VcsBaseEditorWidget *editor = createVcsEditor(kind, title, source,
|
||||||
VcsBaseEditor::getCodec(source),
|
VcsBaseEditor::getEncoding(source),
|
||||||
vcsCmdString.toLatin1().constData(), id);
|
vcsCmdString.toLatin1().constData(), id);
|
||||||
editor->setWorkingDirectory(workingDir);
|
editor->setWorkingDirectory(workingDir);
|
||||||
|
|
||||||
@@ -383,7 +383,7 @@ void VcsBaseClient::diff(const FilePath &workingDir, const QStringList &files)
|
|||||||
args << editorConfig->arguments();
|
args << editorConfig->arguments();
|
||||||
args << files;
|
args << files;
|
||||||
VcsCommand *command = createCommand(workingDir, editor);
|
VcsCommand *command = createCommand(workingDir, editor);
|
||||||
command->setCodec(source.isEmpty() ? TextCodec() : VcsBaseEditor::getCodec(source));
|
command->setEncoding(source.isEmpty() ? TextEncoding() : VcsBaseEditor::getEncoding(source));
|
||||||
enqueueJob(command, args, workingDir, exitCodeInterpreter(DiffCommand));
|
enqueueJob(command, args, workingDir, exitCodeInterpreter(DiffCommand));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -399,7 +399,7 @@ void VcsBaseClient::log(const FilePath &workingDir,
|
|||||||
const QString title = vcsEditorTitle(vcsCmdString, id);
|
const QString title = vcsEditorTitle(vcsCmdString, id);
|
||||||
const FilePath source = VcsBaseEditor::getSource(workingDir, files);
|
const FilePath source = VcsBaseEditor::getSource(workingDir, files);
|
||||||
VcsBaseEditorWidget *editor = createVcsEditor(kind, title, source,
|
VcsBaseEditorWidget *editor = createVcsEditor(kind, title, source,
|
||||||
VcsBaseEditor::getCodec(source),
|
VcsBaseEditor::getEncoding(source),
|
||||||
vcsCmdString.toLatin1().constData(), id);
|
vcsCmdString.toLatin1().constData(), id);
|
||||||
editor->setFileLogAnnotateEnabled(enableAnnotationContextMenu);
|
editor->setFileLogAnnotateEnabled(enableAnnotationContextMenu);
|
||||||
|
|
||||||
@@ -535,7 +535,7 @@ void VcsBaseClient::view(const FilePath &source,
|
|||||||
const QString title = vcsEditorTitle(vcsCommandString(LogCommand), id);
|
const QString title = vcsEditorTitle(vcsCommandString(LogCommand), id);
|
||||||
|
|
||||||
VcsBaseEditorWidget *editor = createVcsEditor(kind, title, source,
|
VcsBaseEditorWidget *editor = createVcsEditor(kind, title, source,
|
||||||
VcsBaseEditor::getCodec(source), "view", id);
|
VcsBaseEditor::getEncoding(source), "view", id);
|
||||||
|
|
||||||
const FilePath workingDirPath = source.isFile() ? source.absolutePath() : source;
|
const FilePath workingDirPath = source.isFile() ? source.absolutePath() : source;
|
||||||
enqueueJob(createCommand(workingDirPath, editor), args, source);
|
enqueueJob(createCommand(workingDirPath, editor), args, source);
|
||||||
|
@@ -47,7 +47,7 @@ public:
|
|||||||
|
|
||||||
VcsBaseEditorWidget *createVcsEditor(Utils::Id kind, QString title,
|
VcsBaseEditorWidget *createVcsEditor(Utils::Id kind, QString title,
|
||||||
const Utils::FilePath &source,
|
const Utils::FilePath &source,
|
||||||
const Utils::TextCodec &codec,
|
const Utils::TextEncoding &encoding,
|
||||||
const char *registerDynamicProperty,
|
const char *registerDynamicProperty,
|
||||||
const QString &dynamicPropertyValue) const;
|
const QString &dynamicPropertyValue) const;
|
||||||
|
|
||||||
@@ -77,18 +77,18 @@ public:
|
|||||||
// Fully synchronous VCS execution (QProcess-based)
|
// Fully synchronous VCS execution (QProcess-based)
|
||||||
CommandResult vcsSynchronousExec(const Utils::FilePath &workingDir,
|
CommandResult vcsSynchronousExec(const Utils::FilePath &workingDir,
|
||||||
const QStringList &args, RunFlags flags = RunFlags::None,
|
const QStringList &args, RunFlags flags = RunFlags::None,
|
||||||
int timeoutS = -1, const Utils::TextCodec &codec = {}) const;
|
int timeoutS = -1, const Utils::TextEncoding &encoding = {}) const;
|
||||||
CommandResult vcsSynchronousExec(const Utils::FilePath &workingDir,
|
CommandResult vcsSynchronousExec(const Utils::FilePath &workingDir,
|
||||||
const Utils::CommandLine &cmdLine,
|
const Utils::CommandLine &cmdLine,
|
||||||
RunFlags flags = RunFlags::None,
|
RunFlags flags = RunFlags::None,
|
||||||
int timeoutS = -1, const Utils::TextCodec &codec = {}) const;
|
int timeoutS = -1, const Utils::TextEncoding &encoding = {}) const;
|
||||||
|
|
||||||
void vcsExecWithHandler(const Utils::FilePath &workingDirectory,
|
void vcsExecWithHandler(const Utils::FilePath &workingDirectory,
|
||||||
const QStringList &arguments,
|
const QStringList &arguments,
|
||||||
const QObject *context,
|
const QObject *context,
|
||||||
const CommandHandler &handler,
|
const CommandHandler &handler,
|
||||||
RunFlags additionalFlags = RunFlags::None,
|
RunFlags additionalFlags = RunFlags::None,
|
||||||
const Utils::TextCodec codec = {}) const;
|
const Utils::TextEncoding &encoding = {}) const;
|
||||||
void vcsExec(const Utils::FilePath &workingDirectory,
|
void vcsExec(const Utils::FilePath &workingDirectory,
|
||||||
const QStringList &arguments,
|
const QStringList &arguments,
|
||||||
RunFlags additionalFlags = RunFlags::None) const;
|
RunFlags additionalFlags = RunFlags::None) const;
|
||||||
|
@@ -832,17 +832,17 @@ void VcsBaseEditorWidget::setWorkingDirectory(const FilePath &wd)
|
|||||||
d->m_workingDirectory = wd;
|
d->m_workingDirectory = wd;
|
||||||
}
|
}
|
||||||
|
|
||||||
TextCodec VcsBaseEditorWidget::codec() const
|
TextEncoding VcsBaseEditorWidget::encoding() const
|
||||||
{
|
{
|
||||||
return textDocument()->codec();
|
return textDocument()->encoding();
|
||||||
}
|
}
|
||||||
|
|
||||||
void VcsBaseEditorWidget::setCodec(const TextCodec &codec)
|
void VcsBaseEditorWidget::setEncoding(const TextEncoding &encoding)
|
||||||
{
|
{
|
||||||
if (codec.isValid())
|
if (encoding.isValid())
|
||||||
textDocument()->setCodec(codec);
|
textDocument()->setEncoding(encoding);
|
||||||
else
|
else
|
||||||
qWarning("%s: Attempt to set no codec.", Q_FUNC_INFO);
|
qWarning("%s: Attempt to set invalid encoding.", Q_FUNC_INFO);
|
||||||
}
|
}
|
||||||
|
|
||||||
EditorContentType VcsBaseEditorWidget::contentType() const
|
EditorContentType VcsBaseEditorWidget::contentType() const
|
||||||
@@ -1229,43 +1229,43 @@ DiffChunk VcsBaseEditorWidget::diffChunk(QTextCursor cursor) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Find the codec used for a file querying the editor.
|
// Find the codec used for a file querying the editor.
|
||||||
static TextCodec findFileCodec(const FilePath &source)
|
static TextEncoding findFileCodec(const FilePath &source)
|
||||||
{
|
{
|
||||||
IDocument *document = DocumentModel::documentForFilePath(source);
|
IDocument *document = DocumentModel::documentForFilePath(source);
|
||||||
if (auto textDocument = qobject_cast<BaseTextDocument *>(document))
|
if (auto textDocument = qobject_cast<BaseTextDocument *>(document))
|
||||||
return textDocument->codec();
|
return textDocument->codec().name();
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
// Find the codec by checking the projects (root dir of project file)
|
// Find the codec by checking the projects (root dir of project file)
|
||||||
static TextCodec findProjectCodec(const FilePath &dirPath)
|
static TextEncoding findProjectCodec(const FilePath &dirPath)
|
||||||
{
|
{
|
||||||
// Try to find a project under which file tree the file is.
|
// Try to find a project under which file tree the file is.
|
||||||
const auto projects = ProjectExplorer::ProjectManager::projects();
|
const auto projects = ProjectExplorer::ProjectManager::projects();
|
||||||
const auto *p
|
const auto *p
|
||||||
= findOrDefault(projects, equal(&ProjectExplorer::Project::projectDirectory, dirPath));
|
= findOrDefault(projects, equal(&ProjectExplorer::Project::projectDirectory, dirPath));
|
||||||
return p ? p->editorConfiguration()->textCodec() : TextCodec();
|
return p ? TextEncoding(p->editorConfiguration()->textCodec().name()) : TextEncoding();
|
||||||
}
|
}
|
||||||
|
|
||||||
TextCodec VcsBaseEditor::getCodec(const FilePath &source)
|
TextEncoding VcsBaseEditor::getEncoding(const FilePath &source)
|
||||||
{
|
{
|
||||||
if (!source.isEmpty()) {
|
if (!source.isEmpty()) {
|
||||||
// Check file
|
// Check file
|
||||||
if (source.isFile())
|
if (source.isFile())
|
||||||
if (TextCodec fc = findFileCodec(source); fc.isValid())
|
if (TextEncoding fc = findFileCodec(source); fc.isValid())
|
||||||
return fc;
|
return fc;
|
||||||
// Find by project via directory
|
// Find by project via directory
|
||||||
if (TextCodec pc = findProjectCodec(source.isFile() ? source.absolutePath() : source); pc.isValid())
|
if (TextEncoding pc = findProjectCodec(source.isFile() ? source.absolutePath() : source); pc.isValid())
|
||||||
return pc;
|
return pc;
|
||||||
}
|
}
|
||||||
return TextCodec::codecForLocale();
|
return QStringConverter::System;
|
||||||
}
|
}
|
||||||
|
|
||||||
TextCodec VcsBaseEditor::getCodec(const FilePath &workingDirectory, const QStringList &files)
|
TextEncoding VcsBaseEditor::getEncoding(const FilePath &workingDirectory, const QStringList &files)
|
||||||
{
|
{
|
||||||
if (files.empty())
|
if (files.empty())
|
||||||
return getCodec(workingDirectory);
|
return getEncoding(workingDirectory);
|
||||||
return getCodec(workingDirectory / files.front());
|
return getEncoding(workingDirectory / files.front());
|
||||||
}
|
}
|
||||||
|
|
||||||
VcsBaseEditorWidget *VcsBaseEditor::getVcsBaseEditor(const IEditor *editor)
|
VcsBaseEditorWidget *VcsBaseEditor::getVcsBaseEditor(const IEditor *editor)
|
||||||
|
@@ -70,8 +70,8 @@ public:
|
|||||||
// the editor manager and the project managers (defaults to system codec).
|
// the editor manager and the project managers (defaults to system codec).
|
||||||
// The codec should be set on editors displaying diff or annotation
|
// The codec should be set on editors displaying diff or annotation
|
||||||
// output.
|
// output.
|
||||||
static Utils::TextCodec getCodec(const Utils::FilePath &source);
|
static Utils::TextEncoding getEncoding(const Utils::FilePath &source);
|
||||||
static Utils::TextCodec getCodec(const Utils::FilePath &workingDirectory, const QStringList &files);
|
static Utils::TextEncoding getEncoding(const Utils::FilePath &workingDirectory, const QStringList &files);
|
||||||
|
|
||||||
// Utility to return the widget from the IEditor returned by the editor
|
// Utility to return the widget from the IEditor returned by the editor
|
||||||
// manager which is a BaseTextEditor.
|
// manager which is a BaseTextEditor.
|
||||||
@@ -173,8 +173,8 @@ public:
|
|||||||
|
|
||||||
void setHighlightingEnabled(bool e);
|
void setHighlightingEnabled(bool e);
|
||||||
|
|
||||||
Utils::TextCodec codec() const;
|
Utils::TextEncoding encoding() const;
|
||||||
void setCodec(const Utils::TextCodec &codec);
|
void setEncoding(const Utils::TextEncoding &encoding);
|
||||||
|
|
||||||
// Base directory for diff views
|
// Base directory for diff views
|
||||||
Utils::FilePath workingDirectory() const;
|
Utils::FilePath workingDirectory() const;
|
||||||
|
@@ -67,7 +67,7 @@ public:
|
|||||||
QString m_displayName;
|
QString m_displayName;
|
||||||
const FilePath m_defaultWorkingDirectory;
|
const FilePath m_defaultWorkingDirectory;
|
||||||
Environment m_environment;
|
Environment m_environment;
|
||||||
TextCodec m_codec;
|
TextEncoding m_encoding;
|
||||||
ProgressParser m_progressParser = {};
|
ProgressParser m_progressParser = {};
|
||||||
QList<Job> m_jobs;
|
QList<Job> m_jobs;
|
||||||
|
|
||||||
@@ -105,8 +105,8 @@ void VcsCommandPrivate::setupProcess(Process *process, const Job &job)
|
|||||||
process->setEnvironment(environment());
|
process->setEnvironment(environment());
|
||||||
if (m_flags & RunFlags::MergeOutputChannels)
|
if (m_flags & RunFlags::MergeOutputChannels)
|
||||||
process->setProcessChannelMode(QProcess::MergedChannels);
|
process->setProcessChannelMode(QProcess::MergedChannels);
|
||||||
if (m_codec.isValid())
|
if (m_encoding.isValid())
|
||||||
process->setCodec(m_codec);
|
process->setEncoding(m_encoding);
|
||||||
process->setUseCtrlCStub(true);
|
process->setUseCtrlCStub(true);
|
||||||
|
|
||||||
installStdCallbacks(process);
|
installStdCallbacks(process);
|
||||||
@@ -290,11 +290,11 @@ ProcessResult VcsCommand::result() const
|
|||||||
CommandResult VcsCommand::runBlocking(const FilePath &workingDirectory,
|
CommandResult VcsCommand::runBlocking(const FilePath &workingDirectory,
|
||||||
const Environment &environment,
|
const Environment &environment,
|
||||||
const CommandLine &command, RunFlags flags,
|
const CommandLine &command, RunFlags flags,
|
||||||
int timeoutS, const TextCodec &codec)
|
int timeoutS, const TextEncoding &codec)
|
||||||
{
|
{
|
||||||
VcsCommand vcsCommand(workingDirectory, environment);
|
VcsCommand vcsCommand(workingDirectory, environment);
|
||||||
vcsCommand.addFlags(flags);
|
vcsCommand.addFlags(flags);
|
||||||
vcsCommand.setCodec(codec);
|
vcsCommand.setEncoding(codec);
|
||||||
return vcsCommand.runBlockingHelper(command, timeoutS);
|
return vcsCommand.runBlockingHelper(command, timeoutS);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -317,9 +317,9 @@ CommandResult VcsCommand::runBlockingHelper(const CommandLine &command, int time
|
|||||||
return CommandResult(process);
|
return CommandResult(process);
|
||||||
}
|
}
|
||||||
|
|
||||||
void VcsCommand::setCodec(const TextCodec &codec)
|
void VcsCommand::setEncoding(const TextEncoding &codec)
|
||||||
{
|
{
|
||||||
d->m_codec = codec;
|
d->m_encoding = codec;
|
||||||
}
|
}
|
||||||
|
|
||||||
void VcsCommand::setProgressParser(const ProgressParser &parser)
|
void VcsCommand::setProgressParser(const ProgressParser &parser)
|
||||||
|
@@ -17,6 +17,7 @@ namespace Utils {
|
|||||||
class CommandLine;
|
class CommandLine;
|
||||||
class Environment;
|
class Environment;
|
||||||
class Process;
|
class Process;
|
||||||
|
class TextEncoding;
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace VcsBase {
|
namespace VcsBase {
|
||||||
@@ -74,7 +75,7 @@ public:
|
|||||||
|
|
||||||
void addFlags(RunFlags f);
|
void addFlags(RunFlags f);
|
||||||
|
|
||||||
void setCodec(const Utils::TextCodec &codec);
|
void setEncoding(const Utils::TextEncoding &codec);
|
||||||
|
|
||||||
void setProgressParser(const Core::ProgressParser &parser);
|
void setProgressParser(const Core::ProgressParser &parser);
|
||||||
|
|
||||||
@@ -83,7 +84,7 @@ public:
|
|||||||
const Utils::CommandLine &command,
|
const Utils::CommandLine &command,
|
||||||
RunFlags flags,
|
RunFlags flags,
|
||||||
int timeoutS,
|
int timeoutS,
|
||||||
const Utils::TextCodec &codec);
|
const Utils::TextEncoding &codec);
|
||||||
void cancel();
|
void cancel();
|
||||||
|
|
||||||
QString cleanedStdOut() const;
|
QString cleanedStdOut() const;
|
||||||
|
Reference in New Issue
Block a user