SVN: Escape files containing '@' characters

Append a '@' to files with a '@' in their name. The last '@' (and
everything following it) is cut off by SVN and treated as a revision.

Task-number: QTCREATORBUG-17229
Change-Id: Icab62345c18277c0327b1e548a45feda0906b3c3
Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
This commit is contained in:
Tobias Hunger
2016-11-07 09:12:42 +01:00
parent 0dc87382e9
commit bc14dc223f
3 changed files with 28 additions and 16 deletions

View File

@@ -39,6 +39,7 @@
#include <diffeditor/diffutils.h>
#include <coreplugin/editormanager/editormanager.h>
#include <utils/algorithm.h>
#include <utils/hostosinfo.h>
#include <QDir>
@@ -87,7 +88,7 @@ VcsCommand *SubversionClient::createCommitCmd(const QString &repositoryRoot,
VcsCommand *cmd = createCommand(repositoryRoot);
cmd->addFlags(VcsCommand::ShowStdOut);
QStringList args(vcsCommandString(CommitCommand));
cmd->addJob(vcsBinary(), args << svnExtraOptions << files);
cmd->addJob(vcsBinary(), args << svnExtraOptions << escapeFiles(files));
return cmd;
}
@@ -154,6 +155,16 @@ QString SubversionClient::synchronousTopic(const QString &repository)
return result.stdOut().trimmed();
}
QString SubversionClient::escapeFile(const QString &file)
{
return (file.contains('@') && !file.endsWith('@')) ? file + '@' : file;
}
QStringList SubversionClient::escapeFiles(const QStringList &files)
{
return Utils::transform(files, &SubversionClient::escapeFile);
}
class DiffController : public DiffEditorController
{
Q_OBJECT
@@ -198,7 +209,7 @@ void DiffController::setFilesList(const QStringList &filesList)
if (isReloading())
return;
m_filesList = filesList;
m_filesList = SubversionClient::escapeFiles(filesList);
}
void DiffController::setChangeNumber(int changeNumber)
@@ -308,13 +319,9 @@ void SubversionClient::log(const QString &workingDir,
if (logCount > 0)
svnExtraOptions << QLatin1String("-l") << QString::number(logCount);
QStringList nativeFiles;
foreach (const QString& file, files)
nativeFiles.append(QDir::toNativeSeparators(file));
// subversion stores log in UTF-8 and returns it back in user system locale.
// So we do not need to encode it.
VcsBaseClient::log(workingDir, files, svnExtraOptions, enableAnnotationContextMenu);
VcsBaseClient::log(workingDir, escapeFiles(files), svnExtraOptions, enableAnnotationContextMenu);
}
void SubversionClient::describe(const QString &workingDirectory, int changeNumber, const QString &title)