diff options
88 files changed, 1205 insertions, 1160 deletions
diff --git a/src/plugins/bazaar/bazaarclient.cpp b/src/plugins/bazaar/bazaarclient.cpp index d8c2a43704c..c0804930b7e 100644 --- a/src/plugins/bazaar/bazaarclient.cpp +++ b/src/plugins/bazaar/bazaarclient.cpp @@ -109,9 +109,9 @@ BazaarClient::BazaarClient(BazaarSettings *settings) : VcsBaseClient(settings) }); } -BranchInfo BazaarClient::synchronousBranchQuery(const QString &repositoryRoot) const +BranchInfo BazaarClient::synchronousBranchQuery(const FilePath &repositoryRoot) const { - QFile branchConfFile(repositoryRoot + QLatin1Char('/') + + QFile branchConfFile(repositoryRoot.toString() + QLatin1Char('/') + QLatin1String(Constants::BAZAARREPO) + QLatin1String("/branch/branch.conf")); if (!branchConfFile.open(QIODevice::ReadOnly)) @@ -135,11 +135,11 @@ BranchInfo BazaarClient::synchronousBranchQuery(const QString &repositoryRoot) c } if (isBranchBound.simplified().toLower() == QLatin1String("true")) return BranchInfo(branchLocation, true); - return BranchInfo(repositoryRoot, false); + return BranchInfo(repositoryRoot.toString(), false); } //! Removes the last committed revision(s) -bool BazaarClient::synchronousUncommit(const QString &workingDir, +bool BazaarClient::synchronousUncommit(const FilePath &workingDir, const QString &revision, const QStringList &extraOptions) { @@ -156,7 +156,7 @@ bool BazaarClient::synchronousUncommit(const QString &workingDir, return proc.result() == QtcProcess::FinishedWithSuccess; } -void BazaarClient::commit(const QString &repositoryRoot, const QStringList &files, +void BazaarClient::commit(const FilePath &repositoryRoot, const QStringList &files, const QString &commitMessageFile, const QStringList &extraOptions) { VcsBaseClient::commit(repositoryRoot, files, commitMessageFile, @@ -164,17 +164,17 @@ void BazaarClient::commit(const QString &repositoryRoot, const QStringList &file } VcsBaseEditorWidget *BazaarClient::annotate( - const QString &workingDir, const QString &file, const QString &revision, + const FilePath &workingDir, const QString &file, const QString &revision, int lineNumber, const QStringList &extraOptions) { return VcsBaseClient::annotate(workingDir, file, revision, lineNumber, QStringList(extraOptions) << QLatin1String("--long")); } -bool BazaarClient::isVcsDirectory(const FilePath &fileName) const +bool BazaarClient::isVcsDirectory(const FilePath &filePath) const { - return fileName.isDir() - && !fileName.fileName().compare(Constants::BAZAARREPO, HostOsInfo::fileNameCaseSensitivity()); + return filePath.isDir() + && !filePath.fileName().compare(Constants::BAZAARREPO, HostOsInfo::fileNameCaseSensitivity()); } FilePath BazaarClient::findTopLevelForFile(const FilePath &file) const @@ -184,7 +184,7 @@ FilePath BazaarClient::findTopLevelForFile(const FilePath &file) const return VcsBase::findRepositoryForFile(file, repositoryCheckFile); } -bool BazaarClient::managesFile(const QString &workingDirectory, const QString &fileName) const +bool BazaarClient::managesFile(const FilePath &workingDirectory, const QString &fileName) const { QStringList args(QLatin1String("status")); args << fileName; diff --git a/src/plugins/bazaar/bazaarclient.h b/src/plugins/bazaar/bazaarclient.h index 15c801482d5..5014a4a3395 100644 --- a/src/plugins/bazaar/bazaarclient.h +++ b/src/plugins/bazaar/bazaarclient.h @@ -41,20 +41,20 @@ class BazaarClient : public VcsBase::VcsBaseClient public: explicit BazaarClient(BazaarSettings *settings); - BranchInfo synchronousBranchQuery(const QString &repositoryRoot) const; - bool synchronousUncommit(const QString &workingDir, - const QString& revision = QString(), - const QStringList &extraOptions = QStringList()); - void commit(const QString &repositoryRoot, const QStringList &files, - const QString &commitMessageFile, const QStringList &extraOptions = QStringList()) override; + BranchInfo synchronousBranchQuery(const Utils::FilePath &repositoryRoot) const; + bool synchronousUncommit(const Utils::FilePath &workingDir, + const QString &revision = {}, + const QStringList &extraOptions = {}); + void commit(const Utils::FilePath &repositoryRoot, const QStringList &files, + const QString &commitMessageFile, const QStringList &extraOptions = {}) override; VcsBase::VcsBaseEditorWidget *annotate( - const QString &workingDir, const QString &file, const QString &revision = QString(), - int lineNumber = -1, const QStringList &extraOptions = QStringList()) override; - bool isVcsDirectory(const Utils::FilePath &fileName) const; + const Utils::FilePath &workingDir, const QString &file, const QString &revision = {}, + int lineNumber = -1, const QStringList &extraOptions ={}) override; + bool isVcsDirectory(const Utils::FilePath &filePath) const; Utils::FilePath findTopLevelForFile(const Utils::FilePath &file) const override; - bool managesFile(const QString &workingDirectory, const QString &fileName) const; + bool managesFile(const Utils::FilePath &workingDirectory, const QString &fileName) const; void view(const QString &source, const QString &id, - const QStringList &extraOptions = QStringList()) override; + const QStringList &extraOptions = {}) override; Utils::Id vcsEditorKind(VcsCommandTag cmd) const override; QString vcsCommandString(VcsCommandTag cmd) const override; diff --git a/src/plugins/bazaar/bazaarplugin.cpp b/src/plugins/bazaar/bazaarplugin.cpp index 098fdea7287..ef2ed798825 100644 --- a/src/plugins/bazaar/bazaarplugin.cpp +++ b/src/plugins/bazaar/bazaarplugin.cpp @@ -147,13 +147,13 @@ public: QString displayName() const final; Utils::Id id() const final; - bool isVcsFileOrDirectory(const Utils::FilePath &fileName) const final; + bool isVcsFileOrDirectory(const Utils::FilePath &filePath) const final; bool managesDirectory(const Utils::FilePath &filePath, Utils::FilePath *topLevel) const final; bool managesFile(const Utils::FilePath &workingDirectory, const QString &fileName) const final; bool isConfigured() const final; bool supportsOperation(Operation operation) const final; - bool vcsOpen(const Utils::FilePath &fileName) final; + bool vcsOpen(const Utils::FilePath &filePath) final; bool vcsAdd(const Utils::FilePath &filePath) final; bool vcsDelete(const Utils::FilePath &filePath) final; bool vcsMove(const Utils::FilePath &from, const Utils::FilePath &to) final; @@ -228,7 +228,7 @@ public: QAction *m_menuAction = nullptr; - QString m_submitRepository; + FilePath m_submitRepository; bool m_submitActionTriggered = false; VcsEditorFactory logEditorFactory { @@ -672,12 +672,11 @@ void BazaarPluginPrivate::showCommitWidget(const QList<VcsBaseClient::StatusItem this, &BazaarPluginPrivate::diffFromEditorSelected); commitEditor->setCheckScriptWorkingDirectory(m_submitRepository); - const QString msg = tr("Commit changes for \"%1\"."). - arg(QDir::toNativeSeparators(m_submitRepository)); + const QString msg = tr("Commit changes for \"%1\".").arg(m_submitRepository.toUserOutput()); commitEditor->document()->setPreferredDisplayName(msg); const BranchInfo branch = m_client.synchronousBranchQuery(m_submitRepository); - commitEditor->setFields(m_submitRepository, branch, + commitEditor->setFields(m_submitRepository.toString(), branch, m_settings.userName.value(), m_settings.userEmail.value(), status); } @@ -860,7 +859,7 @@ bool BazaarPluginPrivate::managesDirectory(const FilePath &directory, FilePath * bool BazaarPluginPrivate::managesFile(const FilePath &workingDirectory, const QString &fileName) const { - return m_client.managesFile(workingDirectory.toString(), fileName); + return m_client.managesFile(workingDirectory, fileName); } bool BazaarPluginPrivate::isConfigured() const @@ -899,23 +898,21 @@ bool BazaarPluginPrivate::vcsOpen(const FilePath &filePath) bool BazaarPluginPrivate::vcsAdd(const FilePath &filePath) { - const QFileInfo fi = filePath.toFileInfo(); - return m_client.synchronousAdd(fi.absolutePath(), fi.fileName()); + return m_client.synchronousAdd(filePath.parentDir(), filePath.fileName()); } bool BazaarPluginPrivate::vcsDelete(const FilePath &filePath) { - const QFileInfo fi = filePath.toFileInfo(); - return m_client.synchronousRemove(fi.absolutePath(), fi.fileName()); + return m_client.synchronousRemove(filePath.parentDir(), filePath.fileName()); } bool BazaarPluginPrivate::vcsMove(const FilePath &from, const FilePath &to) { const QFileInfo fromInfo = from.toFileInfo(); const QFileInfo toInfo = to.toFileInfo(); - return m_client.synchronousMove(fromInfo.absolutePath(), - fromInfo.absoluteFilePath(), - toInfo.absoluteFilePath()); + return m_client.synchronousMove(from.parentDir().absoluteFilePath(), + fromInfo.absoluteFilePath(), + toInfo.absoluteFilePath()); } bool BazaarPluginPrivate::vcsCreateRepository(const FilePath &directory) @@ -925,14 +922,14 @@ bool BazaarPluginPrivate::vcsCreateRepository(const FilePath &directory) void BazaarPluginPrivate::vcsAnnotate(const FilePath &file, int line) { - const QFileInfo fi = file.toFileInfo(); - m_client.annotate(fi.absolutePath(), fi.fileName(), QString(), line); + m_client.annotate(file.parentDir(), file.fileName(), QString(), line); } -Core::ShellCommand *BazaarPluginPrivate::createInitialCheckoutCommand(const QString &url, - const Utils::FilePath &baseDirectory, - const QString &localName, - const QStringList &extraArgs) +Core::ShellCommand *BazaarPluginPrivate::createInitialCheckoutCommand( + const QString &url, + const FilePath &baseDirectory, + const QString &localName, + const QStringList &extraArgs) { QStringList args; args << m_client.vcsCommandString(BazaarClient::CloneCommand) @@ -940,7 +937,7 @@ Core::ShellCommand *BazaarPluginPrivate::createInitialCheckoutCommand(const QStr Environment env = m_client.processEnvironment(); env.set("BZR_PROGRESS_BAR", "text"); - auto command = new VcsBase::VcsCommand(baseDirectory.toString(), env); + auto command = new VcsBase::VcsCommand(baseDirectory, env); command->addJob({m_client.vcsBinary(), args}, -1); return command; } @@ -949,7 +946,7 @@ void BazaarPluginPrivate::changed(const QVariant &v) { switch (v.type()) { case QVariant::String: - emit repositoryChanged(v.toString()); + emit repositoryChanged(FilePath::fromVariant(v)); break; case QVariant::StringList: emit filesChanged(v.toStringList()); diff --git a/src/plugins/clearcase/clearcaseplugin.cpp b/src/plugins/clearcase/clearcaseplugin.cpp index 565eebe6c41..e17c7ac1848 100644 --- a/src/plugins/clearcase/clearcaseplugin.cpp +++ b/src/plugins/clearcase/clearcaseplugin.cpp @@ -207,21 +207,21 @@ public: QString vcsTopic(const FilePath &directory) final; /// - ClearCaseSubmitEditor *openClearCaseSubmitEditor(const QString &fileName, bool isUcm); + ClearCaseSubmitEditor *openClearCaseSubmitEditor(const FilePath &filePath, bool isUcm); const ClearCaseSettings &settings() const; void setSettings(const ClearCaseSettings &s); // IVersionControl - bool vcsOpen(const QString &workingDir, const QString &fileName); - bool vcsAdd(const QString &workingDir, const QString &fileName); - bool vcsDelete(const QString &workingDir, const QString &fileName); - bool vcsCheckIn(const QString &workingDir, const QStringList &files, const QString &activity, + bool vcsOpen(const FilePath &workingDir, const QString &fileName); + bool vcsAdd(const FilePath &workingDir, const QString &fileName); + bool vcsDelete(const FilePath &workingDir, const QString &fileName); + bool vcsCheckIn(const FilePath &workingDir, const QStringList &files, const QString &activity, bool isIdentical, bool isPreserve, bool replaceActivity); - bool vcsUndoCheckOut(const QString &workingDir, const QString &fileName, bool keep); - bool vcsUndoHijack(const QString &workingDir, const QString &fileName, bool keep); - bool vcsMove(const QString &workingDir, const QString &from, const QString &to); - bool vcsSetActivity(const QString &workingDir, const QString &title, const QString &activity); + bool vcsUndoCheckOut(const FilePath &workingDir, const QString &fileName, bool keep); + bool vcsUndoHijack(const FilePath &workingDir, const QString &fileName, bool keep); + bool vcsMove(const FilePath &workingDir, const QString &from, const QString &to); + bool vcsSetActivity(const FilePath &workingDir, const QString &title, const QString &activity); static ClearCasePluginPrivate *instance(); @@ -229,10 +229,10 @@ public: QList<QStringPair> activities(int *current = nullptr); QString ccGetPredecessor(const QString &version) const; QStringList ccGetActiveVobs() const; - ViewData ccGetView(const QString &workingDir) const; - QString ccGetComment(const QString &workingDir, const QString &fileName) const; - bool ccFileOp(const QString &workingDir, const QString &title, const QStringList &args, - const QString &fileName, const QString &file2 = QString()); + ViewData ccGetView(const FilePath &workingDir) const; + QString ccGetComment(const FilePath &workingDir, const QString &fileName) const; + bool ccFileOp(const FilePath &workingDir, const QString &title, const QStringList &args, + const QString &fileName, const QString &file2 = {}); FileStatus vcsStatus(const QString &file) const; void checkAndReIndexUnknownFile(const QString &file); QString currentView() const { return m_viewData.name; } @@ -242,20 +242,20 @@ public: inline bool isDynamic() const { return m_viewData.isDynamic; } void setStatus(const QString &file, FileStatus::Status status, bool update = true); - bool ccCheckUcm(const QString &viewname, const QString &workingDir) const; + bool ccCheckUcm(const QString &viewname, const FilePath &workingDir) const; #ifdef WITH_TESTS inline void setFakeCleartool(const bool b = true) { m_fakeClearTool = b; } #endif - void vcsAnnotateHelper(const QString &workingDir, const QString &file, - const QString &revision = QString(), int lineNumber = -1) const; + void vcsAnnotateHelper(const FilePath &workingDir, const QString &file, + const QString &revision = {}, int lineNumber = -1) const; bool newActivity(); void updateStreamAndView(); protected: void updateActions(VcsBase::VcsBasePluginPrivate::ActionState) override; bool submitEditorAboutToClose() override; - QString ccGet(const QString &workingDir, const QString &file, const QString &prefix = QString()); + QString ccGet(const FilePath &workingDir, const QString &file, const QString &prefix = {}); QList<QStringPair> ccGetActivities() const; private: @@ -280,38 +280,38 @@ private: void updateIndex(); void updateView(); void projectChanged(ProjectExplorer::Project *project); - void tasksFinished(Utils::Id type); + void tasksFinished(Id type); void closing(); inline bool isCheckInEditorOpen() const; QStringList getVobList() const; - QString ccManagesDirectory(const QString &directory) const; - QString ccViewRoot(const QString &directory) const; - QString findTopLevel(const QString &directory) const; + QString ccManagesDirectory(const FilePath &directory) const; + QString ccViewRoot(const FilePath &directory) const; + QString findTopLevel(const FilePath &directory) const; Core::IEditor *showOutputInEditor(const QString& title, const QString &output, Id id, const QString &source, QTextCodec *codec) const; - QString runCleartoolSync(const QString &workingDir, const QStringList &arguments) const; - ClearCaseResponse runCleartool(const QString &workingDir, const QStringList &arguments, + QString runCleartoolSync(const FilePath &workingDir, const QStringList &arguments) const; + ClearCaseResponse runCleartool(const FilePath &workingDir, const QStringList &arguments, int timeOutS, unsigned flags, QTextCodec *outputCodec = nullptr) const; static void sync(QFutureInterface<void> &future, QStringList files); - void history(const QString &workingDir, - const QStringList &file = QStringList(), + void history(const FilePath &workingDir, + const QStringList &file = {}, bool enableAnnotationContextMenu = false); - QString ccGetFileVersion(const QString &workingDir, const QString &file) const; - void ccUpdate(const QString &workingDir, const QStringList &relativePaths = QStringList()); - void ccDiffWithPred(const QString &workingDir, const QStringList &files); - void startCheckIn(const QString &workingDir, const QStringList &files = QStringList()); + QString ccGetFileVersion(const FilePath &workingDir, const QString &file) const; + void ccUpdate(const FilePath &workingDir, const QStringList &relativePaths = {}); + void ccDiffWithPred(const FilePath &workingDir, const QStringList &files); + void startCheckIn(const FilePath &workingDir, const QStringList &files = {}); void cleanCheckInMessageFile(); - QString ccGetFileActivity(const QString &workingDir, const QString &file); - QStringList ccGetActivityVersions(const QString &workingDir, const QString &activity); + QString ccGetFileActivity(const FilePath &workingDir, const QString &file); + QStringList ccGetActivityVersions(const FilePath &workingDir, const QString &activity); void diffGraphical(const QString &file1, const QString &file2 = QString()); QString diffExternal(QString file1, QString file2 = QString(), bool keep = false); QString getFile(const QString &nativeFile, const QString &prefix); static void rmdir(const QString &path); - QString runExtDiff(const QString &workingDir, const QStringList &arguments, int timeOutS, + QString runExtDiff(const FilePath &workingDir, const QStringList &arguments, int timeOutS, QTextCodec *outputCodec = nullptr); static QString getDriveLetterOfPath(const QString &directory); @@ -321,9 +321,9 @@ private: ClearCaseSettings m_settings; - QString m_checkInMessageFileName; - QString m_checkInView; - QString m_topLevel; + FilePath m_checkInMessageFilePath; + FilePath m_checkInView; + FilePath m_topLevel; QString m_stream; ViewData m_viewData; QString m_intStream; @@ -397,16 +397,16 @@ ClearCasePluginPrivate::~ClearCasePluginPrivate() void ClearCasePluginPrivate::cleanCheckInMessageFile() { - if (!m_checkInMessageFileName.isEmpty()) { - QFile::remove(m_checkInMessageFileName); - m_checkInMessageFileName.clear(); + if (!m_checkInMessageFilePath.isEmpty()) { + m_checkInMessageFilePath.removeFile(); + m_checkInMessageFilePath.clear(); m_checkInView.clear(); } } bool ClearCasePluginPrivate::isCheckInEditorOpen() const { - return !m_checkInMessageFileName.isEmpty(); + return !m_checkInMessageFilePath.isEmpty(); } /// Files in this directories are under ClearCase control @@ -471,7 +471,7 @@ FileStatus::Status ClearCasePluginPrivate::getFileStatus(const QString &fileName QStringList args(QLatin1String("ls")); args << fileName; - QString buffer = runCleartoolSync(viewRoot, args); + QString buffer = runCleartoolSync(FilePath::fromString(viewRoot), args); const int atatpos = buffer.indexOf(QLatin1String("@@")); if (atatpos != -1) { // probably a managed file @@ -535,7 +535,7 @@ FileStatus::Status ClearCasePluginPrivate::getFileStatus(const QString &fileName /// snapshot views. /// /// \returns The ClearCase topLevel/VOB directory for this directory -QString ClearCasePluginPrivate::ccManagesDirectory(const QString &directory) const +QString ClearCasePluginPrivate::ccManagesDirectory(const FilePath &directory) const { QStringList args(QLatin1String("pwv")); const ClearCaseResponse response = @@ -572,8 +572,8 @@ QString ClearCasePluginPrivate::ccManagesDirectory(const QString &directory) con foreach (const QString &relativeVobDir, vobs) { const QString vobPath = QDir::cleanPath(rootDir + QDir::fromNativeSeparators(relativeVobDir)); - const bool isManaged = (vobPath == directory) - || FilePath::fromString(directory).isChildOf(FilePath::fromString(vobPath)); + const bool isManaged = (vobPath == directory.toString()) + || directory.isChildOf(FilePath::fromString(vobPath)); if (isManaged) return vobPath; } @@ -582,7 +582,7 @@ QString ClearCasePluginPrivate::ccManagesDirectory(const QString &directory) con } /// Find the root path of a clearcase view. Precondition: This is a clearcase managed dir -QString ClearCasePluginPrivate::ccViewRoot(const QString &directory) const +QString ClearCasePluginPrivate::ccViewRoot(const FilePath &directory) const { QStringList args(QLatin1String("pwv")); args << QLatin1String("-root"); @@ -593,7 +593,7 @@ QString ClearCasePluginPrivate::ccViewRoot(const QString &directory) const if (root.isEmpty()) { if (HostOsInfo::isWindowsHost()) - root = getDriveLetterOfPath(directory); + root = getDriveLetterOfPath(directory.toString()); else root = QLatin1Char('/'); } @@ -605,13 +605,12 @@ QString ClearCasePluginPrivate::ccViewRoot(const QString &directory) const * * Handles both dynamic views and snapshot views. */ -QString ClearCasePluginPrivate::findTopLevel(const QString &directory) const +QString ClearCasePluginPrivate::findTopLevel(const FilePath &directory) const { // Do not check again if we've already tested that the dir is managed, // or if it is a child of a managed dir (top level). - if ((directory == m_topLevel) || - FilePath::fromString(directory).isChildOf(FilePath::fromString(m_topLevel))) - return m_topLevel; + if (directory == m_topLevel || directory.isChildOf(m_topLevel)) + return m_topLevel.toString(); return ccManagesDirectory(directory); } @@ -801,8 +800,8 @@ bool ClearCasePluginPrivate::submitEditorAboutToClose() // Submit editor closing. Make it write out the check in message // and retrieve files - const QFileInfo editorFile = editorDocument->filePath().toFileInfo(); - const QFileInfo changeFile(m_checkInMessageFileName); + const FilePath editorFile = editorDocument->filePath(); + const FilePath changeFile = m_checkInMessageFilePath; if (editorFile.absoluteFilePath() != changeFile.absoluteFilePath()) return true; // Oops?! @@ -834,7 +833,7 @@ bool ClearCasePluginPrivate::submitEditorAboutToClose() closeEditor = DocumentManager::saveDocument(editorDocument); if (closeEditor) { ClearCaseSubmitEditorWidget *widget = editor->submitEditorWidget(); - closeEditor = vcsCheckIn(m_checkInMessageFileName, fileList, widget->activity(), + closeEditor = vcsCheckIn(m_checkInMessageFilePath, fileList, widget->activity(), widget->isIdentical(), widget->isPreserve(), widget->activityChanged()); } @@ -853,7 +852,7 @@ void ClearCasePluginPrivate::diffCheckInFiles(const QStringList &files) ccDiffWithPred(m_checkInView, files); } -static void setWorkingDirectory(IEditor *editor, const QString &wd) +static void setWorkingDirectory(IEditor *editor, const FilePath &wd) { if (auto ve = qobject_cast<VcsBaseEditorWidget*>(editor->widget())) ve->setWorkingDirectory(wd); @@ -881,7 +880,7 @@ QStringList ClearCasePluginPrivate::ccGetActiveVobs() const const QString theViewRoot = viewRoot(); const ClearCaseResponse response = - runCleartool(theViewRoot, args, m_settings.timeOutS, SilentRun); + runCleartool(FilePath::fromString(theViewRoot), args, m_settings.timeOutS, SilentRun); if (response.error) return res; @@ -927,7 +926,7 @@ FileStatus ClearCasePluginPrivate::vcsStatus(const QString &file) const return m_statusMap->value(file, FileStatus(FileStatus::Unknown)); } -QString ClearCasePluginPrivate::ccGetFileActivity(const QString &workingDir, const QString &file) +QString ClearCasePluginPrivate::ccGetFileActivity(const FilePath &workingDir, const QString &file) { QStringList args(QLatin1String("lscheckout")); args << QLatin1String("-fmt") << QLatin1String("%[activity]p"); @@ -937,10 +936,10 @@ QString ClearCasePluginPrivate::ccGetFileActivity(const QString &workingDir, con return response.stdOut; } -ClearCaseSubmitEditor *ClearCasePluginPrivate::openClearCaseSubmitEditor(const QString &fileName, bool isUcm) +ClearCaseSubmitEditor *ClearCasePluginPrivate::openClearCaseSubmitEditor(const FilePath &filePath, bool isUcm) { IEditor *editor = - EditorManager::openEditor(fileName, Constants::CLEARCASECHECKINEDITOR_ID); + EditorManager::openEditor(filePath, Constants::CLEARCASECHECKINEDITOR_ID); auto submitEditor = qobject_cast<ClearCaseSubmitEditor*>(editor); QTC_ASSERT(submitEditor, return nullptr); connect(submitEditor, &VcsBaseSubmitEditor::diffSelectedFiles, @@ -1010,7 +1009,7 @@ void ClearCasePluginPrivate::updateActions(VcsBasePluginPrivate::ActionState as) const bool hasTopLevel = state.hasTopLevel(); m_commandLocator->setEnabled(hasTopLevel); if (hasTopLevel) { - const QString topLevel = state.topLevel(); + const FilePath topLevel = state.topLevel(); if (m_topLevel != topLevel) { m_topLevel = topLevel; m_viewData = ccGetView(topLevel); @@ -1095,7 +1094,7 @@ void ClearCasePluginPrivate::undoCheckOutCurrent() vcsUndoCheckOut(state.topLevel(), file, keep); } -bool ClearCasePluginPrivate::vcsUndoCheckOut(const QString &workingDir, const QString &fileName, bool keep) +bool ClearCasePluginPrivate::vcsUndoCheckOut(const FilePath &workingDir, const QString &fileName, bool keep) { if (Constants::debug) qDebug() << Q_FUNC_INFO << workingDir << fileName << keep; @@ -1112,7 +1111,7 @@ bool ClearCasePluginPrivate::vcsUndoCheckOut(const QString &workingDir, const QS VcsCommand::ShowStdOut | VcsCommand::FullySynchronously); if (!response.error) { - const QString absPath = workingDir + QLatin1Char('/') + fileName; + const QString absPath = workingDir.pathAppended(fileName).toString(); if (!m_settings.disableIndexer) setStatus(absPath, FileStatus::CheckedIn); @@ -1127,7 +1126,7 @@ bool ClearCasePluginPrivate::vcsUndoCheckOut(const QString &workingDir, const QS * Runs cleartool update -overwrite \a fileName in \a workingDir * if \a keep is true, renames hijacked files to <filename>.keep. Otherwise it is overwritten */ -bool ClearCasePluginPrivate::vcsUndoHijack(const QString &workingDir, const QString &fileName, bool keep) +bool ClearCasePluginPrivate::vcsUndoHijack(const FilePath &workingDir, const QString &fileName, bool keep) { if (Constants::debug) qDebug() << Q_FUNC_INFO << workingDir << fileName << keep; @@ -1144,7 +1143,7 @@ bool ClearCasePluginPrivate::vcsUndoHijack(const QString &workingDir, const QStr runCleartool(workingDir, args, m_settings.timeOutS, VcsCommand::ShowStdOut | VcsCommand::FullySynchronously); if (!response.error && !m_settings.disableIndexer) { - const QString absPath = workingDir + QLatin1Char('/') + fileName; + const QString absPath = workingDir.pathAppended(fileName).toString(); setStatus(absPath, FileStatus::CheckedIn); } return !response.error; @@ -1182,14 +1181,14 @@ void ClearCasePluginPrivate::undoHijackCurrent() emit filesChanged(QStringList(state.currentFile())); } -QString ClearCasePluginPrivate::ccGetFileVersion(const QString &workingDir, const QString &file) const +QString ClearCasePluginPrivate::ccGetFileVersion(const FilePath &workingDir, const QString &file) const { QStringList args(QLatin1String("ls")); args << QLatin1String("-short") << file; return runCleartoolSync(workingDir, args).trimmed(); } -void ClearCasePluginPrivate::ccDiffWithPred(const QString &workingDir, const QStringList &files) +void ClearCasePluginPrivate::ccDiffWithPred(const FilePath &workingDir, const QStringList &files) { if (Constants::debug) qDebug() << Q_FUNC_INFO << files; @@ -1199,7 +1198,7 @@ void ClearCasePluginPrivate::ccDiffWithPred(const QString &workingDir, const QSt if ((m_settings.diffType == GraphicalDiff) && (files.count() == 1)) { const QString file = files.first(); - const QString absFilePath = workingDir + QLatin1Char('/') + file; + const QString absFilePath = workingDir.pathAppended(file).toString(); if (vcsStatus(absFilePath).status == FileStatus::Hijacked) diffGraphical(ccGetFileVersion(workingDir, file), file); else @@ -1212,7 +1211,7 @@ void ClearCasePluginPrivate::ccDiffWithPred(const QString &workingDir, const QSt } QString result; foreach (const QString &file, files) { - const QString absFilePath = workingDir + QLatin1Char('/') + file; + const QString absFilePath = workingDir.pathAppended(file).toString(); if (vcsStatus(QDir::fromNativeSeparators(absFilePath)).status == FileStatus::Hijacked) result += diffExternal(ccGetFileVersion(workingDir, file), file); else @@ -1223,7 +1222,7 @@ void ClearCasePluginPrivate::ccDiffWithPred(const QString &workingDir, const QSt // diff of a single file? re-use an existing view if possible to support // the common usage pattern of continuously changing and diffing a file - const QString tag = VcsBaseEditor::editorTag(DiffOutput, workingDir, files); + const QString tag = VcsBaseEditor::editorTag(DiffOutput, workingDir.toString(), files); if (files.count() == 1) { // Show in the same editor if diff has been executed before if (IEditor *existingEditor = VcsBaseEditor::locateEditorByTag(tag)) { @@ -1244,7 +1243,7 @@ void ClearCasePluginPrivate::ccDiffWithPred(const QString &workingDir, const QSt editor->setProperty("originalFileName", diffname); } -QStringList ClearCasePluginPrivate::ccGetActivityVersions(const QString &workingDir, const QString &activity) +QStringList ClearCasePluginPrivate::ccGetActivityVersions(const FilePath &workingDir, const QString &activity) { QStringList args(QLatin1String("lsactivity")); args << QLatin1String("-fmt") << QLatin1String("%[versions]Cp") << activity; @@ -1282,7 +1281,7 @@ void ClearCasePluginPrivate::diffActivity() VcsOutputWindow::appendError(tr("External diff is required to compare multiple files.")); return; } - QString topLevel = state.topLevel(); + FilePath topLevel = state.topLevel(); QString activity = QInputDialog::getText(ICore::dialogParent(), tr("Enter Activity"), tr("Activity Name"), QLineEdit::Normal, m_activity); if (activity.isEmpty()) @@ -1292,7 +1291,7 @@ void ClearCasePluginPrivate::diffActivity() QString result; // map from fileName to (first, latest) pair QMap<QString, QStringPair> filever; - int topLevelLen = topLevel.length(); + int topLevelLen = topLevel.toString().length(); foreach (const QString &version, versions) { QString shortver = version.mid(topLevelLen + 1); int atatpos = shortver.indexOf(QLatin1String("@@")); @@ -1354,7 +1353,7 @@ void ClearCasePluginPrivate::startCheckInAll() { const VcsBasePluginState state = currentState(); QTC_ASSERT(state.hasTopLevel(), return); - QString topLevel = state.topLevel(); + FilePath topLevel = state.topLevel(); QStringList files; for (StatusMap::ConstIterator iterator = m_statusMap->constBegin(); iterator != m_statusMap->constEnd(); @@ -1386,8 +1385,8 @@ void ClearCasePluginPrivate::startCheckInActivity() if (!dlg.exec()) return; - QString topLevel = state.topLevel(); - int topLevelLen = topLevel.length(); + FilePath topLevel = state.topLevel(); + int topLevelLen = topLevel.toString().length(); QStringList versions = ccGetActivityVersions(topLevel, actSelector->activity()); QStringList files; QString last; @@ -1407,7 +1406,7 @@ void ClearCasePluginPrivate::startCheckInActivity() /* Start check in of files of a single repository by displaying * template and files in a submit editor. On closing, the real * check in will start. */ -void ClearCasePluginPrivate::startCheckIn(const QString &workingDir, const QStringList &files) +void ClearCasePluginPrivate::startCheckIn(const FilePath &workingDir, const QStringList &files) { if (!promptBeforeCommit()) return; @@ -1437,10 +1436,10 @@ void ClearCasePluginPrivate::startCheckIn(const QString &workingDir, const QStri VcsOutputWindow::appendError(saver.errorString()); return; } - m_checkInMessageFileName = saver.filePath().toString(); + m_checkInMessageFilePath = saver.filePath(); m_checkInView = workingDir; // Create a submit editor and set file list - ClearCaseSubmitEditor *editor = openClearCaseSubmitEditor(m_checkInMessageFileName, m_viewData.isUcm); + ClearCaseSubmitEditor *editor = openClearCaseSubmitEditor(m_checkInMessageFilePath, m_viewData.isUcm); setSubmitEditor(editor); editor->setStatusList(files); @@ -1464,9 +1463,9 @@ void ClearCasePluginPrivate::updateView() ccUpdate(state.topLevel()); } -void ClearCasePluginPrivate::history(const QString &workingDir, - const QStringList &files, - bool enableAnnotationContextMenu) +void ClearCasePluginPrivate::history(const FilePath &workingDir, + const QStringList &files, + bool enableAnnotationContextMenu) { QTextCodec *codec = VcsBaseEditor::getCodec(workingDir, files); // no need for temp file @@ -1487,7 +1486,7 @@ void ClearCasePluginPrivate::history(const QString &workingDir, // the common usage pattern of continuously changing and diffing a file const QString id = VcsBaseEditor::getTitleId(workingDir, files); - const QString tag = VcsBaseEditor::editorTag(LogOutput, workingDir, files); + const QString tag = VcsBaseEditor::editorTag(LogOutput, workingDir.toString(), files); if (IEditor *editor = VcsBaseEditor::locateEditorByTag(tag)) { editor->document()->setContents(response.stdOut.toUtf8()); EditorManager::activateEditor(editor); @@ -1532,7 +1531,7 @@ void ClearCasePluginPrivate::viewStatus() VcsOutputWindow::appendWarning(QLatin1String("No modified files found.")); } -void ClearCasePluginPrivate::ccUpdate(const QString &workingDir, const QStringList &relativePaths) +void ClearCasePluginPrivate::ccUpdate(const FilePath &workingDir, const QStringList &relativePaths) { QStringList args(QLatin1String("update")); args << QLatin1String("-noverwrite"); @@ -1551,7 +1550,7 @@ void ClearCasePluginPrivate::annotateCurrentFile() vcsAnnotateHelper(state.currentFileTopLevel(), state.relativeCurrentFile()); } -void ClearCasePluginPrivate::vcsAnnotateHelper(const QString &workingDir, const QString &file, +void ClearCasePluginPrivate::vcsAnnotateHelper(const FilePath &workingDir, const QString &file, const QString &revision /* = QString() */, int lineNumber /* = -1 */) const { @@ -1578,7 +1577,7 @@ void ClearCasePluginPrivate::vcsAnnotateHelper(const QString &workingDir, const // Re-use an existing view if possible to support // the common usage pattern of continuously changing and diffing a file - const QString source = workingDir + QLatin1Char('/') + file; + const QString source = workingDir.pathAppended(file).toString(); if (lineNumber <= 0) lineNumber = VcsBaseEditor::lineNumberOfCurrentEditor(source); @@ -1592,7 +1591,7 @@ void ClearCasePluginPrivate::vcsAnnotateHelper(const QString &workingDir, const stream << response.stdOut.mid(dataStart) << headerSep << QLatin1Char('\n') << headerSep << QLatin1Char('\n') << response.stdOut.left(pos); const QStringList files = QStringList(file); - const QString tag = VcsBaseEditor::editorTag(AnnotateOutput, workingDir, files); + const QString tag = VcsBaseEditor::editorTag(AnnotateOutput, workingDir.toString(), files); if (IEditor *editor = VcsBaseEditor::locateEditorByTag(tag)) { editor->document()->setContents(res.toUtf8()); VcsBaseEditor::gotoLineOfEditor(editor, lineNumber); @@ -1621,7 +1620,7 @@ void ClearCasePluginPrivate::vcsDescribe(const FilePath &source, const QString & QStringList args(QLatin1String("describe")); args.push_back(id); QTextCodec *codec = VcsBaseEditor::getCodec(source.toString()); - const ClearCaseResponse response = runCleartool(topLevel.toString(), args, m_settings.timeOutS, 0, codec); + const ClearCaseResponse response = runCleartool(topLevel, args, m_settings.timeOutS, 0, codec); description = response.stdOut; if (m_settings.extDiffAvailable) description += diffExternal(id); @@ -1646,18 +1645,18 @@ void ClearCasePluginPrivate::commitFromEditor() EditorManager::closeDocuments({submitEditor()->document()}); } -QString ClearCasePluginPrivate::runCleartoolSync(const QString &workingDir, - const QStringList &arguments) const +QString ClearCasePluginPrivate::runCleartoolSync(const FilePath &workingDir, + const QStringList &arguments) const { return runCleartool(workingDir, arguments, m_settings.timeOutS, SilentRun).stdOut; } ClearCaseResponse -ClearCasePluginPrivate::runCleartool(const QString &workingDir, - const QStringList &arguments, - int timeOutS, - unsigned flags, - QTextCodec *outputCodec) const +ClearCasePluginPrivate::runCleartool(const FilePath &workingDir, + const QStringList &arguments, + int timeOutS, + unsigned flags, + QTextCodec *outputCodec) const { const QString executable = m_settings.ccBinaryPath; ClearCaseResponse response; @@ -1727,15 +1726,15 @@ ClearCasePluginPrivate *ClearCasePluginPrivate::instance() return dd; } -bool ClearCasePluginPrivate::vcsOpen(const QString &workingDir, const QString &fileName) +bool ClearCasePluginPrivate::vcsOpen(const FilePath &workingDir, const QString &fileName) { QTC_ASSERT(currentState().hasTopLevel(), return false); if (Constants::debug) qDebug() << Q_FUNC_INFO << workingDir << fileName; - QFileInfo fi(workingDir, fileName); - QString topLevel = currentState().topLevel(); + QFileInfo fi(workingDir.toString(), fileName); + FilePath topLevel = currentState().topLevel(); QString absPath = fi.absoluteFilePath(); if (!m_settings.disableIndexer && @@ -1747,7 +1746,7 @@ bool ClearCasePluginPrivate::vcsOpen(const QString &workingDir, const QString &f return true; } - const QString relFile = QDir(topLevel).relativeFilePath(absPath); + const QString relFile = QDir(topLevel.toString()).relativeFilePath(absPath); const QString file = QDir::toNativeSeparators(relFile); const QString title = QString::fromLatin1("Checkout %1").arg(file); CheckOutDialog coDialog(title, m_viewData.isUcm, !m_settings.noComment); @@ -1839,7 +1838,7 @@ bool ClearCasePluginPrivate::vcsOpen(const QString &workingDir, const QString &f return true; } -bool ClearCasePluginPrivate::vcsSetActivity(const QString &workingDir, const QString &title, const QString &activity) +bool ClearCasePluginPrivate::vcsSetActivity(const FilePath &workingDir, const QString &title, const QString &activity) { QStringList args; args << QLatin1String("setactivity") << activity; @@ -1855,7 +1854,7 @@ bool ClearCasePluginPrivate::vcsSetActivity(const QString &workingDir, const QSt } // files are received using native separators -bool ClearCasePluginPrivate::vcsCheckIn(const QString &messageFile, const QStringList &files, const QString &activity, +bool ClearCasePluginPrivate::vcsCheckIn(const FilePath &messageFile, const QStringList &files, const QString &activity, bool isIdentical, bool isPreserve, bool replaceActivity) { if (Constants::debug) @@ -1868,7 +1867,7 @@ bool ClearCasePluginPrivate::vcsCheckIn(const QString &messageFile, const QStrin if (replaceActivity && !vcsSetActivity(m_checkInView, title, activity)) return false; QString message; - QFile msgFile(messageFile); + QFile msgFile(messageFile.toString()); if (msgFile.open(QFile::ReadOnly | QFile::Text)) { message = QString::fromLocal8Bit(msgFile.readAll().trimmed()); msgFile.close(); @@ -1878,7 +1877,7 @@ bool ClearCasePluginPrivate::vcsCheckIn(const QString &messageFile, const QStrin if (message.isEmpty()) args << QLatin1String("-nc"); else - args << QLatin1String("-cfile") << messageFile; + args << QLatin1String("-cfile") << messageFile.toString(); if (isIdentical) args << QLatin1String("-identical"); if (isPreserve) @@ -1887,7 +1886,7 @@ bool ClearCasePluginPrivate::vcsCheckIn(const QString &messageFile, const QStrin QList<FCBPointer> blockers; foreach (const QString &fileName, files) { FCBPointer fcb(new FileChangeBlocker( - FilePath::fromString(QFileInfo(m_checkInView, fileName).canonicalFilePath()))); + FilePath::fromString(QFileInfo(m_checkInView.toString(), fileName).canonicalFilePath()))); blockers.append(fcb); } const ClearCaseResponse response = @@ -1899,7 +1898,7 @@ bool ClearCasePluginPrivate::vcsCheckIn(const QString &messageFile, const QStrin int offset = match.capturedStart(); while (match.hasMatch()) { QString file = match.captured(1); - QFileInfo fi(m_checkInView, file); + QFileInfo fi(m_checkInView.toString(), file); QString absPath = fi.absoluteFilePath(); if (!m_settings.disableIndexer) @@ -1912,7 +1911,7 @@ bool ClearCasePluginPrivate::vcsCheckIn(const QString &messageFile, const QStrin return anySucceeded; } -bool ClearCasePluginPrivate::ccFileOp(const QString &workingDir, const QString &title, const QStringList &opArgs, +bool ClearCasePluginPrivate::ccFileOp(const FilePath &workingDir, const QString &title, const QStringList &opArgs, const QString &fileName, const QString &file2) { const QString file = QDir::toNativeSeparators(fileName); @@ -1949,7 +1948,7 @@ bool ClearCasePluginPrivate::ccFileOp(const QString &workingDir, const QString & if (m_viewData.isUcm && actSelector->changed()) vcsSetActivity(workingDir, fileOpDlg.windowTitle(), actSelector->activity()); - QString dirName = QDir::toNativeSeparators(QFileInfo(workingDir, fileName).absolutePath()); + QString dirName = QDir::toNativeSeparators(QFileInfo(workingDir.toString(), fileName).absolutePath()); QStringList commentArg; if (comment.isEmpty()) commentArg << QLatin1String("-nc"); @@ -2001,13 +2000,13 @@ static QString baseName(const QString &fileName) return fileName.mid(fileName.lastIndexOf(QLatin1Char('/')) + 1); } -bool ClearCasePluginPrivate::vcsAdd(const QString &workingDir, const QString &fileName) +bool ClearCasePluginPrivate::vcsAdd(const FilePath &workingDir, const QString &fileName) { return ccFileOp(workingDir, tr("ClearCase Add File %1").arg(baseName(fileName)), QStringList({"mkelem", "-ci"}), fileName); } -bool ClearCasePluginPrivate::vcsDelete(const QString &workingDir, const QString &fileName) +bool ClearCasePluginPrivate::vcsDelete(const FilePath &workingDir, const QString &fileName) { const QString title(tr("ClearCase Remove Element %1").arg(baseName(fileName))); if (QMessageBox::warning(ICore::dialogParent(), title, tr("This operation is irreversible. Are you sure?"), @@ -2018,7 +2017,7 @@ bool ClearCasePluginPrivate::vcsDelete(const QString &workingDir, const QString QStringList({"rmname", "-force"}), fileName); } -bool ClearCasePluginPrivate::vcsMove(const QString &workingDir, const QString &from, const QString &to) +bool ClearCasePluginPrivate::vcsMove(const FilePath &workingDir, const QString &from, const QString &to) { return ccFileOp(workingDir, tr("ClearCase Rename File %1 -> %2") .arg(baseName(from)).arg(baseName(to)), @@ -2032,9 +2031,9 @@ bool ClearCasePluginPrivate::managesDirectory(const FilePath &directory, FilePat { #ifdef WITH_TESTS // If running with tests and fake ClearTool is enabled, then pretend we manage every directory - QString topLevelFound = m_fakeClearTool ? directory.toString() : findTopLevel(directory.toString()); + QString topLevelFound = m_fakeClearTool ? directory.toString() : findTopLevel(directory); #else - QString topLevelFound = findTopLevel(directory.toString()); + QString topLevelFound = findTopLevel(directory); #endif if (topLevel) @@ -2117,7 +2116,7 @@ QList<QStringPair> ClearCasePluginPrivate::activities(int *current) bool ClearCasePluginPrivate::newActivity() { - QString workingDir = currentState().topLevel(); + FilePath workingDir = currentState().topLevel(); QStringList args; args << QLatin1String("mkactivity") << QLatin1String("-f"); if (!m_settings.autoAssignActivityName) { @@ -2137,7 +2136,7 @@ bool ClearCasePluginPrivate::newActivity() } // check if the view is UCM -bool ClearCasePluginPrivate::ccCheckUcm(const QString &viewname, const QString &workingDir) const +bool ClearCasePluginPrivate::ccCheckUcm(const QString &viewname, const FilePath &workingDir) const { QStringList catcsArgs(QLatin1String("catcs")); catcsArgs << QLatin1String("-tag") << viewname; @@ -2154,9 +2153,9 @@ bool ClearCasePluginPrivate::managesFile(const FilePath &workingDirectory, const return status != FileStatus::NotManaged && status != FileStatus::Derived; } -ViewData ClearCasePluginPrivate::ccGetView(const QString &workingDir) const +ViewData ClearCasePluginPrivate::ccGetView(const FilePath &workingDir) const { - static QHash<QString, ViewData> viewCache; + static QHash<FilePath, ViewData> viewCache; bool inCache = viewCache.contains(workingDir); ViewData &res = viewCache[workingDir]; @@ -2173,7 +2172,7 @@ ViewData ClearCasePluginPrivate::ccGetView(const QString &workingDir) const return res; } -QString ClearCasePluginPrivate::ccGetComment(const QString &workingDir, const QString &fileName) const +QString ClearCasePluginPrivate::ccGetComment(const FilePath &workingDir, const QString &fileName) const { QStringList args(QLatin1String("describe")); args << QLatin1String("-fmt") << QLatin1String("%c") << fileName; @@ -2204,9 +2203,9 @@ void ClearCasePluginPrivate::projectChanged(Project *project) m_intStream.clear(); ProgressManager::cancelTasks(ClearCase::Constants::TASK_INDEX); if (project) { - QString projDir = project->projectDirectory().toString(); + FilePath projDir = project->projectDirectory(); QString topLevel = findTopLevel(projDir); - m_topLevel = topLevel; + m_topLevel = FilePath::fromString(topLevel); if (topLevel.isEmpty()) return; connect(qApp, &QApplication::applicationStateChanged, @@ -2267,7 +2266,7 @@ QString ClearCasePluginPrivate::getFile(const QString &nativeFile, const QString if (Constants::debug) qDebug() << Q_FUNC_INFO << nativeFile; if ((atatpos != -1) && (nativeFile.indexOf(QLatin1String("CHECKEDOUT"), atatpos) != -1)) { - bool res = QFile::copy(QDir(m_topLevel).absoluteFilePath(file), tempFile); + bool res = QFile::copy(QDir(m_topLevel.toString()).absoluteFilePath(file), tempFile); return res ? tempFile : QString(); } QStringList args(QLatin1String("get")); @@ -2345,11 +2344,11 @@ void ClearCasePluginPrivate::diffGraphical(const QString &file1, const QString & args << file1; if (!pred) args << file2; - QProcess::startDetached(m_settings.ccBinaryPath, args, m_topLevel); + QProcess::startDetached(m_settings.ccBinaryPath, args, m_topLevel.toString()); } -QString ClearCasePluginPrivate::runExtDiff(const QString &workingDir, const QStringList &arguments, - int timeOutS, QTextCodec *outputCodec) +QString ClearCasePluginPrivate::runExtDiff(const FilePath &workingDir, const QStringList &arguments, + int timeOutS, QTextCodec *outputCodec) { CommandLine diff("diff"); diff.addArgs(m_settings.diffArgs.split(' ', Qt::SkipEmptyParts)); @@ -2372,7 +2371,7 @@ void ClearCasePluginPrivate::syncSlot() VcsBasePluginState state = currentState(); if (!state.hasProject() || !state.hasTopLevel()) return; - QString topLevel = state.topLevel(); + FilePath topLevel = state.topLevel(); if (topLevel != state.currentProjectTopLevel()) return; Utils::runAsync(sync, QStringList()); @@ -2461,8 +2460,7 @@ Core::IVersionControl::OpenSupportMode ClearCasePluginPrivate::openSupportMode(c bool ClearCasePluginPrivate::vcsOpen(const FilePath &filePath) { - const QFileInfo fi = filePath.toFileInfo(); - return vcsOpen(fi.absolutePath(), fi.fileName()); + return vcsOpen(filePath.parentDir().absolutePath(), filePath.fileName()); } Core::IVersionControl::SettingsFlags ClearCasePluginPrivate::settingsFlags() const @@ -2475,27 +2473,24 @@ Core::IVersionControl::SettingsFlags ClearCasePluginPrivate::settingsFlags() con bool ClearCasePluginPrivate::vcsAdd(const FilePath &filePath) { - const QFileInfo fi = filePath.toFileInfo(); - return vcsAdd(fi.absolutePath(), fi.fileName()); + return vcsAdd(filePath.parentDir().absolutePath(), filePath.fileName()); } bool ClearCasePluginPrivate::vcsDelete(const FilePath &filePath) { - const QFileInfo fi = filePath.toFileInfo(); - return vcsDelete(fi.absolutePath(), fi.fileName()); + return vcsDelete(filePath.parentDir().absoluteFilePath(), filePath.fileName()); } bool ClearCasePluginPrivate::vcsMove(const FilePath &from, const FilePath &to) { const QFileInfo ifrom = from.toFileInfo(); const QFileInfo ito = from.toFileInfo(); - return vcsMove(ifrom.absolutePath(), from.fileName(), to.fileName()); + return vcsMove(from.parentDir().absolutePath(), from.fileName(), to.fileName()); } void ClearCasePluginPrivate::vcsAnnotate(const FilePath &filePath, int line) { - const QFileInfo fi = filePath.toFileInfo(); - vcsAnnotateHelper(fi.absolutePath(), fi.fileName(), QString(), line); + vcsAnnotateHelper(filePath.parentDir().absolutePath(), filePath.fileName(), QString(), line); } QString ClearCasePluginPrivate::vcsOpenText() const @@ -2512,7 +2507,7 @@ QString ClearCasePluginPrivate::vcsMakeWritableText() const QString ClearCasePluginPrivate::vcsTopic(const FilePath &directory) { - return ccGetView(directory.toString()).name; + return ccGetView(directory).name; } bool ClearCasePluginPrivate::vcsCreateRepository(const FilePath &) diff --git a/src/plugins/coreplugin/dialogs/readonlyfilesdialog.cpp b/src/plugins/coreplugin/dialogs/readonlyfilesdialog.cpp index ccb55260fa5..8f59478003e 100644 --- a/src/plugins/coreplugin/dialogs/readonlyfilesdialog.cpp +++ b/src/plugins/coreplugin/dialogs/readonlyfilesdialog.cpp @@ -427,7 +427,7 @@ void ReadOnlyFilesDialogPrivate::initDialog(const FilePaths &filePaths) // Add a button for opening the file with a version control system // if the file is managed by an version control system which allows opening files. IVersionControl *versionControlForFile = - VcsManager::findVersionControlForDirectory(directory.toString()); + VcsManager::findVersionControlForDirectory(directory); const bool fileManagedByVCS = versionControlForFile && versionControlForFile->openSupportMode(filePath) != IVersionControl::NoOpen; if (fileManagedByVCS) { diff --git a/src/plugins/coreplugin/editormanager/editormanager.cpp b/src/plugins/coreplugin/editormanager/editormanager.cpp index 5c3f6502371..4a81bdc0619 100644 --- a/src/plugins/coreplugin/editormanager/editormanager.cpp +++ b/src/plugins/coreplugin/editormanager/editormanager.cpp @@ -1996,7 +1996,7 @@ void EditorManagerPrivate::updateMakeWritableWarning() // Do this after setWriteWarning so we don't re-evaluate this part even // if we do not really show a warning. bool promptVCS = false; - const QString directory = document->filePath().toFileInfo().absolutePath(); + const FilePath directory = document->filePath().parentDir(); IVersionControl *versionControl = VcsManager::findVersionControlForDirectory(directory); if (versionControl && versionControl->openSupportMode(document->filePath()) != IVersionControl::NoOpen) { if (versionControl->settingsFlags() & IVersionControl::AutoOpen) { @@ -2248,7 +2248,7 @@ void EditorManagerPrivate::vcsOpenCurrentEditor() if (!document) return; - const QString directory = document->filePath().toFileInfo().absolutePath(); + const FilePath directory = document->filePath().parentDir(); IVersionControl *versionControl = VcsManager::findVersionControlForDirectory(directory); if (!versionControl || versionControl->openSupportMode(document->filePath()) == IVersionControl::NoOpen) return; diff --git a/src/plugins/coreplugin/fileutils.cpp b/src/plugins/coreplugin/fileutils.cpp index 5f632a5fec3..04c0ffd93b4 100644 --- a/src/plugins/coreplugin/fileutils.cpp +++ b/src/plugins/coreplugin/fileutils.cpp @@ -201,7 +201,7 @@ bool FileUtils::renameFile(const FilePath &orgFilePath, const FilePath &newFileP return false; FilePath dir = orgFilePath.absolutePath(); - IVersionControl *vc = VcsManager::findVersionControlForDirectory(dir.toString()); + IVersionControl *vc = VcsManager::findVersionControlForDirectory(dir); bool result = false; if (vc && vc->supportsOperation(IVersionControl::MoveOperation)) diff --git a/src/plugins/coreplugin/iversioncontrol.h b/src/plugins/coreplugin/iversioncontrol.h index 84484975801..98ec38f0583 100644 --- a/src/plugins/coreplugin/iversioncontrol.h +++ b/src/plugins/coreplugin/iversioncontrol.h @@ -256,7 +256,7 @@ public: void setTopicCache(TopicCache *topicCache); signals: - void repositoryChanged(const QString &repository); + void repositoryChanged(const Utils::FilePath &repository); void filesChanged(const QStringList &files); void configurationChanged(); diff --git a/src/plugins/coreplugin/vcsmanager.cpp b/src/plugins/coreplugin/vcsmanager.cpp index 4c23d65a97e..80d4889f3a3 100644 --- a/src/plugins/coreplugin/vcsmanager.cpp +++ b/src/plugins/coreplugin/vcsmanager.cpp @@ -210,10 +210,10 @@ void VcsManager::resetVersionControlForDirectory(const FilePath &inputDirectory) const QString directory = absoluteWithNoTrailingSlash(inputDirectory.toString()); d->resetCache(directory); - emit m_instance->repositoryChanged(directory); + emit m_instance->repositoryChanged(FilePath::fromString(directory)); } -IVersionControl* VcsManager::findVersionControlForDirectory(const QString &inputDirectory, +IVersionControl* VcsManager::findVersionControlForDirectory(const FilePath &inputDirectory, QString *topLevelDirectory) { using StringVersionControlPair = QPair<QString, IVersionControl *>; @@ -225,7 +225,7 @@ IVersionControl* VcsManager::findVersionControlForDirectory(const QString &input } // Make sure we an absolute path: - QString directory = absoluteWithNoTrailingSlash(inputDirectory); + QString directory = absoluteWithNoTrailingSlash(inputDirectory.toString()); #ifdef WITH_TESTS if (directory[0].isLetter() && directory.indexOf(QLatin1Char(':') + QLatin1String(TEST_PREFIX)) == 1) directory = directory.mid(2); @@ -321,11 +321,11 @@ IVersionControl* VcsManager::findVersionControlForDirectory(const QString &input return versionControl; } -QString VcsManager::findTopLevelForDirectory(const QString &directory) +FilePath VcsManager::findTopLevelForDirectory(const FilePath &directory) { QString result; findVersionControlForDirectory(directory, &result); - return result; + return FilePath::fromString(result); } QStringList VcsManager::repositories(const IVersionControl *vc) @@ -354,7 +354,7 @@ FilePaths VcsManager::promptToDelete(const FilePaths &filePaths) // Categorize by version control system. QHash<IVersionControl *, FilePaths> filesByVersionControl; for (auto it = filesByParentDir.cbegin(); it != filesByParentDir.cend(); ++it) { - IVersionControl * const vc = findVersionControlForDirectory(it.key().toString()); + IVersionControl * const vc = findVersionControlForDirectory(it.key()); if (vc) filesByVersionControl[vc] << it.value(); } @@ -433,7 +433,7 @@ QStringList VcsManager::additionalToolsPath() void VcsManager::promptToAdd(const QString &directory, const QStringList &fileNames) { - IVersionControl *vc = findVersionControlForDirectory(directory); + IVersionControl *vc = findVersionControlForDirectory(FilePath::fromString(directory)); if (!vc || !vc->supportsOperation(IVersionControl::AddOperation)) return; @@ -460,7 +460,7 @@ void VcsManager::promptToAdd(const QString &directory, const QStringList &fileNa void VcsManager::emitRepositoryChanged(const QString &repository) { - emit m_instance->repositoryChanged(repository); + emit m_instance->repositoryChanged(FilePath::fromString(repository)); } void VcsManager::clearVersionControlCache() @@ -468,7 +468,7 @@ void VcsManager::clearVersionControlCache() QStringList repoList = d->m_cachedMatches.keys(); d->clearCache(); foreach (const QString &repo, repoList) - emit m_instance->repositoryChanged(repo); + emit m_instance->repositoryChanged(FilePath::fromString(repo)); } void VcsManager::handleConfigurationChanges() @@ -606,7 +606,8 @@ void CorePlugin::testVcsManager() ++expectedCount; IVersionControl *vcs; - vcs = VcsManager::findVersionControlForDirectory(makeString(directory), &realTopLevel); + vcs = VcsManager::findVersionControlForDirectory( + FilePath::fromString(makeString(directory)), &realTopLevel); QCOMPARE(realTopLevel, makeString(topLevel)); if (vcs) QCOMPARE(vcs->id().toString(), vcsId); diff --git a/src/plugins/coreplugin/vcsmanager.h b/src/plugins/coreplugin/vcsmanager.h index 6a8cfc351fa..6cb5241e916 100644 --- a/src/plugins/coreplugin/vcsmanager.h +++ b/src/plugins/coreplugin/vcsmanager.h @@ -64,9 +64,9 @@ public: static IVersionControl *versionControl(Utils::Id id); static void resetVersionControlForDirectory(const Utils::FilePath &inputDirectory); - static IVersionControl *findVersionControlForDirectory(const QString &directory, + static IVersionControl *findVersionControlForDirectory(const Utils::FilePath &directory, QString *topLevelDirectory = nullptr); - static QString findTopLevelForDirectory(const QString &directory); + static Utils::FilePath findTopLevelForDirectory(const Utils::FilePath &directory); static QStringList repositories(const IVersionControl *); @@ -99,7 +99,7 @@ public: static void clearVersionControlCache(); signals: - void repositoryChanged(const QString &repository); + void repositoryChanged(const Utils::FilePath &repository); void configurationChanged(const IVersionControl *vcs); private: diff --git a/src/plugins/cvs/cvsplugin.cpp b/src/plugins/cvs/cvsplugin.cpp index f816bc06fa2..dab1e530d5d 100644 --- a/src/plugins/cvs/cvsplugin.cpp +++ b/src/plugins/cvs/cvsplugin.cpp @@ -234,7 +234,7 @@ public: QString displayName() const final { return QLatin1String("cvs"); } Utils::Id id() const final; - bool isVcsFileOrDirectory(const Utils::FilePath &fileName) const final; + bool isVcsFileOrDirectory(const Utils::FilePath &filePath) const final; bool managesDirectory(const Utils::FilePath &directory, Utils::FilePath *topLevel) const final; bool managesFile(const Utils::FilePath &workingDirectory, const QString &fileName) const final; @@ -261,12 +261,12 @@ public: CvsSubmitEditor *openCVSSubmitEditor(const QString &fileName); // IVersionControl - bool vcsAdd(const QString &workingDir, const QString &fileName); - bool vcsDelete(const QString &workingDir, const QString &fileName); + bool vcsAdd(const FilePath &workingDir, const QString &fileName); + bool vcsDelete(const FilePath &workingDir, const QString &fileName); // cvs 'edit' is used to implement 'open' (cvsnt). - bool edit(const QString &topLevel, const QStringList &files); + bool edit(const FilePath &topLevel, const QStringList &files); - void vcsAnnotate(const QString &workingDirectory, const QString &file, + void vcsAnnotate(const FilePath &workingDirectory, const QString &file, const QString &revision, int lineNumber); void vcsDescribe(const Utils::FilePath &source, const QString &changeNr) final; @@ -305,28 +305,28 @@ private: Utils::Id id, const QString &source, QTextCodec *codec); - CvsResponse runCvs(const QString &workingDirectory, + CvsResponse runCvs(const FilePath &workingDirectory, const QStringList &arguments, int timeOutS, unsigned flags, QTextCodec *outputCodec = nullptr) const; - void annotate(const QString &workingDir, const QString &file, + void annotate(const FilePath &workingDir, const QString &file, const QString &revision = QString(), int lineNumber= -1); bool describe(const QString &source, const QString &changeNr, QString *errorMessage); - bool describe(const QString &toplevel, const QString &source, const QString &changeNr, QString *errorMessage); - bool describe(const QString &repository, QList<CvsLogEntry> entries, QString *errorMessage); - void filelog(const QString &workingDir, - const QString &file = QString(), + bool describe(const Utils::FilePath &toplevel, const QString &source, const QString &changeNr, QString *errorMessage); + bool describe(const Utils::FilePath &repository, QList<CvsLogEntry> entries, QString *errorMessage); + void filelog(const Utils::FilePath &workingDir, + const QString &file = {}, bool enableAnnotationContextMenu = false); - bool unedit(const QString &topLevel, const QStringList &files); - bool status(const QString &topLevel, const QString &file, const QString &title); - bool update(const QString &topLevel, const QString &file); + bool unedit(const Utils::FilePath &topLevel, const QStringList &files); + bool status(const Utils::FilePath &topLevel, const QString &file, const QString &title); + bool update(const Utils::FilePath &topLevel, const QString &file); bool checkCVSDirectory(const QDir &directory) const; // Quick check if files are modified - bool diffCheckModified(const QString &topLevel, const QStringList &files, bool *modified); + bool diffCheckModified(const Utils::FilePath &topLevel, const QStringList &files, bool *modified); QString findTopLevelForDirectoryI(const QString &directory) const; - void startCommit(const QString &workingDir, const QString &file = QString()); + void startCommit(const Utils::FilePath &workingDir, const QString &file = {}); bool commit(const QString &messageFile, const QStringList &subVersionFileList); void cleanCommitMessageFile(); @@ -334,7 +334,7 @@ private: CvsClient *m_client = nullptr; QString m_commitMessageFileName; - QString m_commitRepository; + FilePath m_commitRepository; Core::CommandLocator *m_commandLocator = nullptr; Utils::ParameterAction *m_addAction = nullptr; @@ -403,10 +403,10 @@ Utils::Id CvsPluginPrivate::id() const return Utils::Id(VcsBase::Constants::VCS_ID_CVS); } -bool CvsPluginPrivate::isVcsFileOrDirectory(const Utils::FilePath &fileName) const +bool CvsPluginPrivate::isVcsFileOrDirectory(const Utils::FilePath &filePath) const { - return fileName.isDir() - && !fileName.fileName().compare("CVS", Utils::HostOsInfo::fileNameCaseSensitivity()); + return filePath.isDir() + && !filePath.fileName().compare("CVS", Utils::HostOsInfo::fileNameCaseSensitivity()); } bool CvsPluginPrivate::isConfigured() const @@ -444,20 +444,17 @@ Core::IVersionControl::OpenSupportMode CvsPluginPrivate::openSupportMode(const F bool CvsPluginPrivate::vcsOpen(const FilePath &filePath) { - const QFileInfo fi = filePath.toFileInfo(); - return edit(fi.absolutePath(), QStringList(fi.fileName())); + return edit(filePath.parentDir(), QStringList(filePath.fileName())); } bool CvsPluginPrivate::vcsAdd(const FilePath &filePath) { - const QFileInfo fi = filePath.toFileInfo(); - return vcsAdd(fi.absolutePath(), fi.fileName()); + return vcsAdd(filePath.parentDir(), filePath.fileName()); } bool CvsPluginPrivate::vcsDelete(const FilePath &filePath) { - const QFileInfo fi = filePath.toFileInfo(); - return vcsDelete(fi.absolutePath(), fi.fileName()); + return vcsDelete(filePath.parentDir(), filePath.fileName()); } bool CvsPluginPrivate::vcsCreateRepository(const FilePath &) @@ -467,8 +464,7 @@ bool CvsPluginPrivate::vcsCreateRepository(const FilePath &) void CvsPluginPrivate::vcsAnnotate(const FilePath &filePath, int line) { - const QFileInfo fi = filePath.toFileInfo(); - vcsAnnotate(fi.absolutePath(), fi.fileName(), QString(), line); + vcsAnnotate(filePath.parentDir(), filePath.fileName(), QString(), line); } QString CvsPluginPrivate::vcsOpenText() const @@ -486,8 +482,7 @@ Core::ShellCommand *CvsPluginPrivate::createInitialCheckoutCommand(const QString QStringList args; args << QLatin1String("checkout") << url << extraArgs; - auto command = new VcsBase::VcsCommand(baseDirectory.toString(), - Environment::systemEnvironment()); + auto command = new VcsBase::VcsCommand(baseDirectory, Environment::systemEnvironment()); command->setDisplayName(tr("CVS Checkout")); command->addJob({m_settings.binaryPath.filePath(), m_settings.addOptions(args)}, -1); return command; @@ -799,7 +794,7 @@ void CvsPluginPrivate::diffCommitFiles(const QStringList &files) m_client->diff(m_commitRepository, files); } -static void setDiffBaseDirectory(IEditor *editor, const QString &db) +static void setDiffBaseDirectory(IEditor *editor, const FilePath &db) { if (auto ve = qobject_cast<VcsBaseEditorWidget*>(editor->widget())) ve->setWorkingDirectory(db); @@ -845,7 +840,7 @@ void CvsPluginPrivate::updateActions(VcsBasePluginPrivate::ActionState as) m_commitProjectAction->setParameter(currentProjectName); // TODO: Find a more elegant way to shorten the path - QString currentDirectoryName = QDir::toNativeSeparators(currentState().currentFileDirectory()); + QString currentDirectoryName = currentState().currentFileDirectory().toUserOutput(); if (currentDirectoryName.size() > 15) currentDirectoryName.replace(0, currentDirectoryName.size() - 15, QLatin1String("...")); m_updateDirectoryAction->setParameter(currentDirectoryName); @@ -874,7 +869,7 @@ void CvsPluginPrivate::revertAll() if (!messageBoxQuestion(title, tr("Revert all pending changes to the repository?"))) return; QStringList args; - args << QLatin1String("update") << QLatin1String("-C") << state.topLevel(); + args << QLatin1String("update") << QLatin1String("-C") << state.topLevel().toString(); const CvsResponse revertResponse = runCvs(state.topLevel(), args, m_settings.timeout.value(), VcsCommand::SshPasswordPrompt | VcsCommand::ShowStdOut); @@ -963,7 +958,7 @@ void CvsPluginPrivate::startCommitAll() /* Start commit of files of a single repository by displaying * template and files in a submit editor. On closing, the real * commit will start. */ -void CvsPluginPrivate::startCommit(const QString &workingDir, const QString &file) +void CvsPluginPrivate::startCommit(const FilePath &workingDir, const QString &file) { if (!promptBeforeCommit()) return; @@ -1051,9 +1046,9 @@ void CvsPluginPrivate::logRepository() filelog(state.topLevel()); } -void CvsPluginPrivate::filelog(const QString &workingDir, - const QString &file, - bool enableAnnotationContextMenu) +void CvsPluginPrivate::filelog(const FilePath &workingDir, + const QString &file, + bool enableAnnotationContextMenu) { QTextCodec *codec = VcsBaseEditor::getCodec(workingDir, QStringList(file)); // no need for temp file @@ -1070,7 +1065,7 @@ void CvsPluginPrivate::filelog(const QString &workingDir, // Re-use an existing view if possible to support // the common usage pattern of continuously changing and diffing a file - const QString tag = VcsBaseEditor::editorTag(LogOutput, workingDir, QStringList(file)); + const QString tag = VcsBaseEditor::editorTag(LogOutput, workingDir.toString(), QStringList(file)); if (IEditor *editor = VcsBaseEditor::locateEditorByTag(tag)) { editor->document()->setContents(response.stdOut.toUtf8()); EditorManager::activateEditor(editor); @@ -1097,7 +1092,7 @@ void CvsPluginPrivate::updateProject() update(state.currentProjectTopLevel(), state.relativeCurrentProject()); } -bool CvsPluginPrivate::update(const QString &topLevel, const QString &file) +bool CvsPluginPrivate::update(const FilePath &topLevel, const QString &file) { QStringList args(QLatin1String("update")); args.push_back(QLatin1String("-dR")); @@ -1140,13 +1135,13 @@ void CvsPluginPrivate::annotateCurrentFile() annotate(state.currentFileTopLevel(), state.relativeCurrentFile()); } -void CvsPluginPrivate::vcsAnnotate(const QString &workingDirectory, const QString &file, - const QString &revision, int lineNumber) +void CvsPluginPrivate::vcsAnnotate(const FilePath &workingDirectory, const QString &file, + const QString &revision, int lineNumber) { annotate(workingDirectory, file, revision, lineNumber); } -bool CvsPluginPrivate::edit(const QString &topLevel, const QStringList &files) +bool CvsPluginPrivate::edit(const FilePath &topLevel, const QStringList &files) { QStringList args(QLatin1String("edit")); args.append(files); @@ -1156,7 +1151,7 @@ bool CvsPluginPrivate::edit(const QString &topLevel, const QStringList &files) return response.result == CvsResponse::Ok; } -bool CvsPluginPrivate::diffCheckModified(const QString &topLevel, const QStringList &files, bool *modified) +bool CvsPluginPrivate::diffCheckModified(const FilePath &topLevel, const QStringList &files, bool *modified) { // Quick check for modified files using diff *modified = false; @@ -1170,7 +1165,7 @@ bool CvsPluginPrivate::diffCheckModified(const QString &topLevel, const QStringL return true; } -bool CvsPluginPrivate::unedit(const QString &topLevel, const QStringList &files) +bool CvsPluginPrivate::unedit(const FilePath &topLevel, const QStringList &files) { bool modified; // Prompt and use force flag if modified @@ -1178,8 +1173,8 @@ bool CvsPluginPrivate::unedit(const QString &topLevel, const QStringList &files) return false; if (modified) { const QString question = files.isEmpty() ? - tr("Would you like to discard your changes to the repository \"%1\"?").arg(topLevel) : - tr("Would you like to discard your changes to the file \"%1\"?").arg(files.front()); + tr("Would you like to discard your changes to the repository \"%1\"?").arg(topLevel.toUserOutput()) : + tr("Would you like to discard your changes to the file \"%1\"?").arg(files.front()); if (!messageBoxQuestion(tr("Unedit"), question)) return false; } @@ -1196,9 +1191,9 @@ bool CvsPluginPrivate::unedit(const QString &topLevel, const QStringList &files) return response.result == CvsResponse::Ok; } -void CvsPluginPrivate::annotate(const QString &workingDir, const QString &file, - const QString &revision /* = QString() */, - int lineNumber /* = -1 */) +void CvsPluginPrivate::annotate(const FilePath &workingDir, const QString &file, + const QString &revision /* = QString() */, + int lineNumber /* = -1 */) { const QStringList files(file); QTextCodec *codec = VcsBaseEditor::getCodec(workingDir, files); @@ -1220,7 +1215,7 @@ void CvsPluginPrivate::annotate(const QString &workingDir, const QString &file, if (lineNumber < 1) lineNumber = VcsBaseEditor::lineNumberOfCurrentEditor(file); - const QString tag = VcsBaseEditor::editorTag(AnnotateOutput, workingDir, QStringList(file), revision); + const QString tag = VcsBaseEditor::editorTag(AnnotateOutput, workingDir.toString(), QStringList(file), revision); if (IEditor *editor = VcsBaseEditor::locateEditorByTag(tag)) { editor->document()->setContents(response.stdOut.toUtf8()); VcsBaseEditor::gotoLineOfEditor(editor, lineNumber); @@ -1233,7 +1228,7 @@ void CvsPluginPrivate::annotate(const QString &workingDir, const QString &file, } } -bool CvsPluginPrivate::status(const QString &topLevel, const QString &file, const QString &title) +bool CvsPluginPrivate::status(const FilePath &topLevel, const QString &file, const QString &title) { QStringList args(QLatin1String("status")); if (!file.isEmpty()) @@ -1242,7 +1237,7 @@ bool CvsPluginPrivate::status(const QString &topLevel, const QString &file, cons runCvs(topLevel, args, m_settings.timeout.value(), 0); const bool ok = response.result == CvsResponse::Ok; if (ok) - showOutputInEditor(title, response.stdOut, commandLogEditorParameters.id, topLevel, nullptr); + showOutputInEditor(title, response.stdOut, commandLogEditorParameters.id, topLevel.toString(), nullptr); return ok; } @@ -1291,10 +1286,10 @@ bool CvsPluginPrivate::describe(const QString &file, const QString &changeNr, QS .arg(QDir::toNativeSeparators(file)); return false; } - return describe(toplevel.toString(), QDir(toplevel.toString()).relativeFilePath(file), changeNr, errorMessage); + return describe(toplevel, QDir(toplevel.toString()).relativeFilePath(file), changeNr, errorMessage); } -bool CvsPluginPrivate::describe(const QString &toplevel, const QString &file, const +bool CvsPluginPrivate::describe(const FilePath &toplevel, const QString &file, const QString &changeNr, QString *errorMessage) { @@ -1356,9 +1351,9 @@ bool CvsPluginPrivate::describe(const QString &toplevel, const QString &file, co // Describe a set of files and revisions by // concatenating log and diffs to previous revisions -bool CvsPluginPrivate::describe(const QString &repositoryPath, - QList<CvsLogEntry> entries, - QString *errorMessage) +bool CvsPluginPrivate::describe(const FilePath &repositoryPath, + QList<CvsLogEntry> entries, + QString *errorMessage) { // Collect logs QString output; @@ -1431,11 +1426,11 @@ void CvsPluginPrivate::commitFromEditor() // Run CVS. At this point, file arguments must be relative to // the working directory (see above). -CvsResponse CvsPluginPrivate::runCvs(const QString &workingDirectory, - const QStringList &arguments, - int timeOutS, - unsigned flags, - QTextCodec *outputCodec) const +CvsResponse CvsPluginPrivate::runCvs(const FilePath &workingDirectory, + const QStringList &arguments, + int timeOutS, + unsigned flags, + QTextCodec *outputCodec) const { const FilePath executable = m_settings.binaryPath.filePath(); CvsResponse response; @@ -1495,7 +1490,7 @@ IEditor *CvsPluginPrivate::showOutputInEditor(const QString& title, const QStrin return editor; } -bool CvsPluginPrivate::vcsAdd(const QString &workingDir, const QString &rawFileName) +bool CvsPluginPrivate::vcsAdd(const FilePath &workingDir, const QString &rawFileName) { QStringList args; args << QLatin1String("add") << rawFileName; @@ -1505,7 +1500,7 @@ bool CvsPluginPrivate::vcsAdd(const QString &workingDir, const QString &rawFileN return response.result == CvsResponse::Ok; } -bool CvsPluginPrivate::vcsDelete(const QString &workingDir, const QString &rawFileName) +bool CvsPluginPrivate::vcsDelete(const FilePath &workingDir, const QString &rawFileName) { QStringList args; args << QLatin1String("remove") << QLatin1String("-f") << rawFileName; @@ -1551,7 +1546,7 @@ bool CvsPluginPrivate::managesFile(const FilePath &workingDirectory, const QStri QStringList args; args << QLatin1String("status") << fileName; const CvsResponse response = - runCvs(workingDirectory.toString(), args, m_settings.timeout.value(), VcsCommand::SshPasswordPrompt); + runCvs(workingDirectory, args, m_settings.timeout.value(), VcsCommand::SshPasswordPrompt); if (response.result != CvsResponse::Ok) return false; return !response.stdOut.contains(QLatin1String("Status: Unknown")); diff --git a/src/plugins/git/branchmodel.cpp b/src/plugins/git/branchmodel.cpp index 146c051ea2e..0256c30a415 100644 --- a/src/plugins/git/branchmodel.cpp +++ b/src/plugins/git/branchmodel.cpp @@ -39,6 +39,7 @@ #include <set> +using namespace Utils; using namespace VcsBase; namespace Git { @@ -240,7 +241,7 @@ public: BranchModel *q; GitClient *client; - QString workingDirectory; + FilePath workingDirectory; BranchNode *rootNode; BranchNode *currentBranch = nullptr; BranchNode *headNode = nullptr; @@ -422,7 +423,7 @@ void BranchModel::clear() d->obsoleteLocalBranches.clear(); } -bool BranchModel::refresh(const QString &workingDirectory, QString *errorMessage) +bool BranchModel::refresh(const FilePath &workingDirectory, QString *errorMessage) { beginResetModel(); clear(); @@ -510,7 +511,7 @@ void BranchModel::renameTag(const QString &oldName, const QString &newName) } } -QString BranchModel::workingDirectory() const +FilePath BranchModel::workingDirectory() const { return d->workingDirectory; } diff --git a/src/plugins/git/branchmodel.h b/src/plugins/git/branchmodel.h index ba0c2997359..267e911e914 100644 --- a/src/plugins/git/branchmodel.h +++ b/src/plugins/git/branchmodel.h @@ -25,6 +25,7 @@ #pragma once +#include <utils/filepath.h> #include <utils/optional.h> #include <QAbstractListModel> @@ -60,12 +61,12 @@ public: Qt::ItemFlags flags(const QModelIndex &index) const override; void clear(); - bool refresh(const QString &workingDirectory, QString *errorMessage); + bool refresh(const Utils::FilePath &workingDirectory, QString *errorMessage); void renameBranch(const QString &oldName, const QString &newName); void renameTag(const QString &oldName, const QString &newName); - QString workingDirectory() const; + Utils::FilePath workingDirectory() const; QModelIndex currentBranch() const; QString fullName(const QModelIndex &idx, bool includePrefix = false) const; diff --git a/src/plugins/git/branchview.cpp b/src/plugins/git/branchview.cpp index 04fe69ebed6..ffc346d71ca 100644 --- a/src/plugins/git/branchview.cpp +++ b/src/plugins/git/branchview.cpp @@ -56,6 +56,7 @@ #include <QVBoxLayout> using namespace Core; +using namespace Utils; namespace Git { namespace Internal { @@ -139,13 +140,13 @@ BranchView::BranchView() refreshCurrentRepository(); } -void BranchView::refreshIfSame(const QString &repository) +void BranchView::refreshIfSame(const FilePath &repository) { if (m_repository == repository) refreshCurrentRepository(); } -void BranchView::refresh(const QString &repository, bool force) +void BranchView::refresh(const FilePath &repository, bool force) { if (m_repository == repository && !force) return; @@ -156,7 +157,7 @@ void BranchView::refresh(const QString &repository, bool force) m_addAction->setToolTip(tr("Create Git Repository...")); m_branchView->setEnabled(false); } else { - m_repositoryLabel->setText(QDir::toNativeSeparators(m_repository)); + m_repositoryLabel->setText(m_repository.toUserOutput()); m_repositoryLabel->setToolTip(GitPlugin::msgRepositoryLabel(m_repository)); m_addAction->setToolTip(tr("Add Branch...")); m_branchView->setEnabled(true); diff --git a/src/plugins/git/branchview.h b/src/plugins/git/branchview.h index 85dc700bd99..9d46f52e6e1 100644 --- a/src/plugins/git/branchview.h +++ b/src/plugins/git/branchview.h @@ -27,6 +27,8 @@ #include <coreplugin/inavigationwidgetfactory.h> +#include <utils/filepath.h> + #include <QPointer> #include <QWidget> @@ -55,8 +57,8 @@ class BranchView : public QWidget public: explicit BranchView(); - void refreshIfSame(const QString &repository); - void refresh(const QString &repository, bool force); + void refreshIfSame(const Utils::FilePath &repository); + void refresh(const Utils::FilePath &repository, bool force); void refreshCurrentBranch(); QList<QToolButton *> createToolButtons(); @@ -94,7 +96,7 @@ private: Utils::NavigationTreeView *m_branchView = nullptr; BranchModel *m_model = nullptr; BranchFilterModel *m_filterModel = nullptr; - QString m_repository; + Utils::FilePath m_repository; }; class BranchViewFactory : public Core::INavigationWidgetFactory diff --git a/src/plugins/git/changeselectiondialog.cpp b/src/plugins/git/changeselectiondialog.cpp index a5bc3f6a47b..847b08759d0 100644 --- a/src/plugins/git/changeselectiondialog.cpp +++ b/src/plugins/git/changeselectiondialog.cpp @@ -52,7 +52,7 @@ using namespace Utils; namespace Git { namespace Internal { -ChangeSelectionDialog::ChangeSelectionDialog(const QString &workingDirectory, Utils::Id id, +ChangeSelectionDialog::ChangeSelectionDialog(const FilePath &workingDirectory, Id id, QWidget *parent) : QDialog(parent), m_ui(new Ui::ChangeSelectionDialog) { @@ -60,7 +60,7 @@ ChangeSelectionDialog::ChangeSelectionDialog(const QString &workingDirectory, Ut m_ui->setupUi(this); m_ui->workingDirectoryChooser->setExpectedKind(PathChooser::ExistingDirectory); m_ui->workingDirectoryChooser->setPromptDialogTitle(tr("Select Git Directory")); - m_ui->workingDirectoryChooser->setPath(workingDirectory); + m_ui->workingDirectoryChooser->setFilePath(workingDirectory); m_gitEnvironment = GitClient::instance()->processEnvironment(); m_ui->changeNumberEdit->setFocus(); m_ui->changeNumberEdit->selectAll(); @@ -116,7 +116,7 @@ QString ChangeSelectionDialog::change() const void ChangeSelectionDialog::selectCommitFromRecentHistory() { - QString workingDir = workingDirectory(); + FilePath workingDir = workingDirectory(); if (workingDir.isEmpty()) return; @@ -135,11 +135,11 @@ void ChangeSelectionDialog::selectCommitFromRecentHistory() m_ui->changeNumberEdit->setText(dialog.commit()); } -QString ChangeSelectionDialog::workingDirectory() const +FilePath ChangeSelectionDialog::workingDirectory() const { - const QString workingDir = m_ui->workingDirectoryChooser->filePath().toString(); - if (workingDir.isEmpty() || !QDir(workingDir).exists()) - return QString(); + const FilePath workingDir = m_ui->workingDirectoryChooser->filePath(); + if (workingDir.isEmpty() || !workingDir.exists()) + return {}; return Core::VcsManager::findTopLevelForDirectory(workingDir); } @@ -193,7 +193,7 @@ void ChangeSelectionDialog::terminateProcess() void ChangeSelectionDialog::recalculateCompletion() { - const QString workingDir = workingDirectory(); + const FilePath workingDir = workingDirectory(); if (workingDir == m_oldWorkingDir) return; m_oldWorkingDir = workingDir; @@ -216,7 +216,7 @@ void ChangeSelectionDialog::recalculateDetails() terminateProcess(); enableButtons(true); - const QString workingDir = workingDirectory(); + const FilePath workingDir = workingDirectory(); if (workingDir.isEmpty()) { m_ui->detailsText->setPlainText(tr("Error: Bad working directory.")); return; @@ -229,7 +229,7 @@ void ChangeSelectionDialog::recalculateDetails() } m_process = new QProcess(this); - m_process->setWorkingDirectory(workingDir); + m_process->setWorkingDirectory(workingDir.toString()); m_process->setProcessEnvironment(m_gitEnvironment.toProcessEnvironment()); connect(m_process, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), diff --git a/src/plugins/git/changeselectiondialog.h b/src/plugins/git/changeselectiondialog.h index 32fd47590f6..edaaf61c630 100644 --- a/src/plugins/git/changeselectiondialog.h +++ b/src/plugins/git/changeselectiondialog.h @@ -54,12 +54,12 @@ class ChangeSelectionDialog : public QDialog { Q_OBJECT public: - ChangeSelectionDialog(const QString &workingDirectory, Utils::Id id, QWidget *parent); + ChangeSelectionDialog(const Utils::FilePath &workingDirectory, Utils::Id id, QWidget *parent); ~ChangeSelectionDialog() override; QString change() const; - QString workingDirectory() const; + Utils::FilePath workingDirectory() const; ChangeCommand command() const; private: @@ -80,7 +80,7 @@ private: Utils::Environment m_gitEnvironment; ChangeCommand m_command = NoCommand; QStringListModel *m_changeModel = nullptr; - QString m_oldWorkingDir; + Utils::FilePath m_oldWorkingDir; }; } // namespace Internal diff --git a/src/plugins/git/commitdata.h b/src/plugins/git/commitdata.h index 28c1029d95b..efa94f633c1 100644 --- a/src/plugins/git/commitdata.h +++ b/src/plugins/git/commitdata.h @@ -27,6 +27,8 @@ #include "gitsettings.h" // CommitType +#include <utils/filepath.h> + #include <QCoreApplication> #include <QStringList> #include <QPair> @@ -43,7 +45,7 @@ class GitSubmitEditorPanelInfo { public: void clear(); - QString repository; + Utils::FilePath repository; QString branch; }; diff --git a/src/plugins/git/gerrit/branchcombobox.cpp b/src/plugins/git/gerrit/branchcombobox.cpp index bc7aa282df2..b72c4b6b1c3 100644 --- a/src/plugins/git/gerrit/branchcombobox.cpp +++ b/src/plugins/git/gerrit/branchcombobox.cpp @@ -28,11 +28,12 @@ using namespace Git::Internal; using namespace Gerrit::Internal; +using namespace Utils; BranchComboBox::BranchComboBox(QWidget *parent) : QComboBox(parent) { } -void BranchComboBox::init(const QString &repository) +void BranchComboBox::init(const FilePath &repository) { m_repository = repository; QString currentBranch = GitClient::instance()->synchronousCurrentLocalBranch(repository); diff --git a/src/plugins/git/gerrit/branchcombobox.h b/src/plugins/git/gerrit/branchcombobox.h index fcc97693a6f..ee65bce3a55 100644 --- a/src/plugins/git/gerrit/branchcombobox.h +++ b/src/plugins/git/gerrit/branchcombobox.h @@ -25,6 +25,8 @@ #pragma once +#include <utils/filepath.h> + #include <QComboBox> namespace Git { @@ -38,10 +40,10 @@ class BranchComboBox : public QComboBox { public: explicit BranchComboBox(QWidget *parent = nullptr); - void init(const QString &repository); + void init(const Utils::FilePath &repository); private: - QString m_repository; + Utils::FilePath m_repository; bool m_detached = false; }; diff --git a/src/plugins/git/gerrit/gerritdialog.cpp b/src/plugins/git/gerrit/gerritdialog.cpp index 875ca8b44fe..9ffe8bd5ba3 100644 --- a/src/plugins/git/gerrit/gerritdialog.cpp +++ b/src/plugins/git/gerrit/gerritdialog.cpp @@ -46,6 +46,8 @@ #include <QStringListModel> #include <QUrl> +using namespace Utils; + namespace Gerrit { namespace Internal { @@ -53,7 +55,7 @@ static const int maxTitleWidth = 350; GerritDialog::GerritDialog(const QSharedPointer<GerritParameters> &p, const QSharedPointer<GerritServer> &s, - const QString &repository, + const FilePath &repository, QWidget *parent) : QDialog(parent) , m_parameters(p) @@ -127,12 +129,12 @@ GerritDialog::GerritDialog(const QSharedPointer<GerritParameters> &p, m_refreshButton->setDefault(true); } -QString GerritDialog::repositoryPath() const +FilePath GerritDialog::repositoryPath() const { return m_repository; } -void GerritDialog::setCurrentPath(const QString &path) +void GerritDialog::setCurrentPath(const FilePath &path) { if (path == m_repository) return; @@ -244,7 +246,7 @@ void GerritDialog::remoteChanged() void GerritDialog::updateRemotes(bool forceReload) { m_ui->remoteComboBox->setRepository(m_repository); - if (m_repository.isEmpty() || !QFileInfo(m_repository).isDir()) + if (m_repository.isEmpty() || !m_repository.isDir()) return; *m_server = m_parameters->server; m_ui->remoteComboBox->updateRemotes(forceReload); diff --git a/src/plugins/git/gerrit/gerritdialog.h b/src/plugins/git/gerrit/gerritdialog.h index 98d3015d254..5d41798c275 100644 --- a/src/plugins/git/gerrit/gerritdialog.h +++ b/src/plugins/git/gerrit/gerritdialog.h @@ -25,6 +25,8 @@ #pragma once +#include <utils/filepath.h> + #include <QDialog> #include <QSharedPointer> #include <QTimer> @@ -54,11 +56,11 @@ class GerritDialog : public QDialog public: explicit GerritDialog(const QSharedPointer<GerritParameters> &p, const QSharedPointer<GerritServer> &s, - const QString &repository, + const Utils::FilePath &repository, QWidget *parent = nullptr); ~GerritDialog() override; - QString repositoryPath() const; - void setCurrentPath(const QString &path); + Utils::FilePath repositoryPath() const; + void setCurrentPath(const Utils::FilePath &path); void fetchStarted(const QSharedPointer<Gerrit::Internal::GerritChange> &change); void fetchFinished(); void refresh(); @@ -100,7 +102,7 @@ private: QPushButton *m_refreshButton; Utils::ProgressIndicator *m_progressIndicator; QTimer m_progressIndicatorTimer; - QString m_repository; + Utils::FilePath m_repository; bool m_fetchRunning = false; bool m_updatingRemotes = false; bool m_shouldUpdateRemotes = false; diff --git a/src/plugins/git/gerrit/gerritplugin.cpp b/src/plugins/git/gerrit/gerritplugin.cpp index 0d3401c6d1a..8a4b2b03673 100644 --- a/src/plugins/git/gerrit/gerritplugin.cpp +++ b/src/plugins/git/gerrit/gerritplugin.cpp @@ -92,7 +92,7 @@ class FetchContext : public QObject Q_OBJECT public: FetchContext(const QSharedPointer<GerritChange> &change, - const QString &repository, const Utils::FilePath &git, + const FilePath &repository, const FilePath &git, const GerritServer &server, FetchMode fm, QObject *parent = nullptr); ~FetchContext() override; @@ -118,7 +118,7 @@ private: void terminate(); const QSharedPointer<GerritChange> m_change; - const QString m_repository; + const FilePath m_repository; const FetchMode m_fetchMode; const Utils::FilePath m_git; const GerritServer m_server; @@ -129,7 +129,7 @@ private: }; FetchContext::FetchContext(const QSharedPointer<GerritChange> &change, - const QString &repository, const Utils::FilePath &git, + const FilePath &repository, const FilePath &git, const GerritServer &server, FetchMode fm, QObject *parent) : QObject(parent) @@ -170,7 +170,7 @@ void FetchContext::start() m_progress.reportStarted(); // Order: initialize future before starting the process in case error handling is invoked. const QStringList args = m_change->gitFetchArguments(m_server); - VcsBase::VcsOutputWindow::appendCommand(m_repository, {m_git, args}); + VcsBase::VcsOutputWindow::appendCommand(m_repository.toString(), {m_git, args}); m_process.setCommand({m_git, args}); m_process.start(); m_process.closeWriteChannel(); @@ -242,7 +242,7 @@ void FetchContext::show() { const QString title = QString::number(m_change->number) + '/' + QString::number(m_change->currentPatchSet.patchSetNumber); - GitClient::instance()->show(m_repository, "FETCH_HEAD", title); + GitClient::instance()->show(m_repository.toString(), "FETCH_HEAD", title); } void FetchContext::cherryPick() @@ -314,7 +314,7 @@ void GerritPlugin::addToLocator(CommandLocator *locator) locator->appendCommand(m_pushToGerritCommand); } -void GerritPlugin::push(const QString &topLevel) +void GerritPlugin::push(const FilePath &topLevel) { // QScopedPointer is required to delete the dialog when leaving the function GerritPushDialog dialog(topLevel, m_reviewers, m_parameters, ICore::dialogParent()); @@ -333,7 +333,7 @@ void GerritPlugin::push(const QString &topLevel) GitClient::instance()->push(topLevel, {dialog.selectedRemoteName(), dialog.pushTarget()}); } -static QString currentRepository() +static FilePath currentRepository() { return GitPlugin::currentState().topLevel(); } @@ -381,7 +381,7 @@ Utils::FilePath GerritPlugin::gitBinDirectory() } // Find the branch of a repository. -QString GerritPlugin::branch(const QString &repository) +QString GerritPlugin::branch(const FilePath &repository) { return GitClient::instance()->synchronousCurrentLocalBranch(repository); } @@ -395,9 +395,9 @@ void GerritPlugin::fetch(const QSharedPointer<GerritChange> &change, int mode) return; } - QString repository; + FilePath repository; bool verifiedRepository = false; - if (!m_dialog.isNull() && !m_parameters.isNull() && QFile::exists(m_dialog->repositoryPath())) + if (!m_dialog.isNull() && !m_parameters.isNull() && m_dialog->repositoryPath().exists()) repository = m_dialog->repositoryPath(); if (!repository.isEmpty()) { @@ -421,8 +421,8 @@ void GerritPlugin::fetch(const QSharedPointer<GerritChange> &change, int mode) if (remote.endsWith(".git")) remote.chop(4); if (remote.contains(m_server->host) && remote.endsWith(change->project) - && QFile::exists(repository + '/' + submoduleData.dir)) { - repository = QDir::cleanPath(repository + '/' + submoduleData.dir); + && repository.pathAppended(submoduleData.dir).exists()) { + repository = repository.pathAppended(submoduleData.dir).cleanPath(); verifiedRepository = true; break; } @@ -436,7 +436,7 @@ void GerritPlugin::fetch(const QSharedPointer<GerritChange> &change, int mode) " in %3. Select different folder?") .arg(m_server->host, change->project, - QDir::toNativeSeparators(repository)), + repository.toUserOutput()), QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel, QMessageBox::Yes); switch (answer) { @@ -458,8 +458,8 @@ void GerritPlugin::fetch(const QSharedPointer<GerritChange> &change, int mode) tr("Enter Local Repository for \"%1\" (%2)").arg(change->project, change->branch); const QString suggestedRespository = findLocalRepository(change->project, change->branch); - repository = QFileDialog::getExistingDirectory(m_dialog.data(), - title, suggestedRespository); + repository = FilePath::fromString(QFileDialog::getExistingDirectory(m_dialog.data(), + title, suggestedRespository)); } if (repository.isEmpty()) @@ -500,7 +500,7 @@ QString GerritPlugin::findLocalRepository(QString project, const QString &branch if (branch.isEmpty()) { return repository; } else { - const QString repositoryBranch = GerritPlugin::branch(repository); + const QString repositoryBranch = GerritPlugin::branch(FilePath::fromString(repository)); if (repositoryBranch.isEmpty() || repositoryBranch == branch) return repository; } // !branch.isEmpty() diff --git a/src/plugins/git/gerrit/gerritplugin.h b/src/plugins/git/gerrit/gerritplugin.h index 356d23e632f..9bf3ffcc294 100644 --- a/src/plugins/git/gerrit/gerritplugin.h +++ b/src/plugins/git/gerrit/gerritplugin.h @@ -58,9 +58,9 @@ public: void initialize(Core::ActionContainer *ac); static Utils::FilePath gitBinDirectory(); - static QString branch(const QString &repository); + static QString branch(const Utils::FilePath &repository); void addToLocator(Core::CommandLocator *locator); - void push(const QString &topLevel); + void push(const Utils::FilePath &topLevel); void updateActions(const VcsBase::VcsBasePluginState &state); diff --git a/src/plugins/git/gerrit/gerritpushdialog.cpp b/src/plugins/git/gerrit/gerritpushdialog.cpp index 8c56dbcae67..1a929cbf8fc 100644 --- a/src/plugins/git/gerrit/gerritpushdialog.cpp +++ b/src/plugins/git/gerrit/gerritpushdialog.cpp @@ -124,14 +124,14 @@ void GerritPushDialog::initRemoteBranches() m_ui->remoteComboBox->updateRemotes(false); } -GerritPushDialog::GerritPushDialog(const QString &workingDir, const QString &reviewerList, +GerritPushDialog::GerritPushDialog(const Utils::FilePath &workingDir, const QString &reviewerList, QSharedPointer<GerritParameters> parameters, QWidget *parent) : QDialog(parent), m_workingDir(workingDir), m_ui(new Ui::GerritPushDialog) { m_ui->setupUi(this); - m_ui->repositoryLabel->setText(QDir::toNativeSeparators(workingDir)); + m_ui->repositoryLabel->setText(workingDir.toUserOutput()); m_ui->remoteComboBox->setRepository(workingDir); m_ui->remoteComboBox->setParameters(parameters); m_ui->remoteComboBox->setAllowDups(true); diff --git a/src/plugins/git/gerrit/gerritpushdialog.h b/src/plugins/git/gerrit/gerritpushdialog.h index 652cab479e2..153f0b03ee7 100644 --- a/src/plugins/git/gerrit/gerritpushdialog.h +++ b/src/plugins/git/gerrit/gerritpushdialog.h @@ -25,6 +25,8 @@ #pragma once +#include <utils/filepath.h> + #include <QDialog> #include <QMultiMap> #include <QDate> @@ -46,7 +48,7 @@ class GerritPushDialog : public QDialog Q_OBJECT public: - GerritPushDialog(const QString &workingDir, const QString &reviewerList, + GerritPushDialog(const Utils::FilePath &workingDir, const QString &reviewerList, QSharedPointer<GerritParameters> parameters, QWidget *parent); ~GerritPushDialog() override; @@ -72,7 +74,7 @@ private: QString determineRemoteBranch(const QString &localBranch); void initRemoteBranches(); QString calculateChangeRange(const QString &branch); - QString m_workingDir; + Utils::FilePath m_workingDir; QString m_suggestedRemoteBranch; QString m_initErrorMessage; Ui::GerritPushDialog *m_ui; diff --git a/src/plugins/git/gerrit/gerritremotechooser.cpp b/src/plugins/git/gerrit/gerritremotechooser.cpp index 6b94bcd238f..0eada6f155c 100644 --- a/src/plugins/git/gerrit/gerritremotechooser.cpp +++ b/src/plugins/git/gerrit/gerritremotechooser.cpp @@ -28,12 +28,15 @@ #include "gerritserver.h" #include "../gitclient.h" +#include <utils/filepath.h> #include <utils/qtcassert.h> #include <utils/utilsicons.h> #include <QFileInfo> #include <QHBoxLayout> +using namespace Utils; + namespace Gerrit { namespace Internal { @@ -64,7 +67,7 @@ GerritRemoteChooser::GerritRemoteChooser(QWidget *parent) : this, [this] { updateRemotes(true); }); } -void GerritRemoteChooser::setRepository(const QString &repository) +void GerritRemoteChooser::setRepository(const FilePath &repository) { m_repository = repository; } diff --git a/src/plugins/git/gerrit/gerritremotechooser.h b/src/plugins/git/gerrit/gerritremotechooser.h index c2dacf84cfa..3ecd1338600 100644 --- a/src/plugins/git/gerrit/gerritremotechooser.h +++ b/src/plugins/git/gerrit/gerritremotechooser.h @@ -27,6 +27,8 @@ #include "gerritserver.h" +#include <utils/filepath.h> + #include <QComboBox> #include <QSharedPointer> #include <QToolButton> @@ -45,7 +47,7 @@ class GerritRemoteChooser : public QWidget public: GerritRemoteChooser(QWidget *parent = nullptr); - void setRepository(const QString &repository); + void setRepository(const Utils::FilePath &repository); void setParameters(QSharedPointer<GerritParameters> parameters); void setFallbackEnabled(bool value); void setAllowDups(bool value); @@ -63,7 +65,7 @@ private: void addRemote(const GerritServer &server, const QString &name); void handleRemoteChanged(); - QString m_repository; + Utils::FilePath m_repository; QSharedPointer<GerritParameters> m_parameters; QComboBox *m_remoteComboBox = nullptr; QToolButton *m_resetRemoteButton = nullptr; diff --git a/src/plugins/git/gerrit/gerritserver.cpp b/src/plugins/git/gerrit/gerritserver.cpp index f0091a0d94c..b678bde9aef 100644 --- a/src/plugins/git/gerrit/gerritserver.cpp +++ b/src/plugins/git/gerrit/gerritserver.cpp @@ -245,7 +245,7 @@ int GerritServer::testConnection() static GitClient *const client = GitClient::instance(); const QStringList arguments = curlArguments() << (url(RestUrl) + accountUrlC); QtcProcess proc; - client->vcsFullySynchronousExec(proc, QString(), {curlBinary, arguments}, + client->vcsFullySynchronousExec(proc, {}, {curlBinary, arguments}, Core::ShellCommand::NoOutput); if (proc.result() == QtcProcess::FinishedWithSuccess) { QString output = proc.stdOut(); @@ -346,7 +346,7 @@ void GerritServer::resolveVersion(const GerritParameters &p, bool forceReload) if (port) arguments << p.portFlag << QString::number(port); arguments << hostArgument() << "gerrit" << "version"; - client->vcsFullySynchronousExec(proc, QString(), {p.ssh, arguments}, + client->vcsFullySynchronousExec(proc, {}, {p.ssh, arguments}, Core::ShellCommand::NoOutput); QString stdOut = proc.stdOut().trimmed(); stdOut.remove("gerrit version "); @@ -354,7 +354,7 @@ void GerritServer::resolveVersion(const GerritParameters &p, bool forceReload) } else { const QStringList arguments = curlArguments() << (url(RestUrl) + versionUrlC); QtcProcess proc; - client->vcsFullySynchronousExec(proc, QString(), {curlBinary, arguments}, + client->vcsFullySynchronousExec(proc, {}, {curlBinary, arguments}, Core::ShellCommand::NoOutput); // REST endpoint for version is only available from 2.8 and up. Do not consider invalid // if it fails. diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp index b4be20eadc8..1afbffc273d 100644 --- a/src/plugins/git/gitclient.cpp +++ b/src/plugins/git/gitclient.cpp @@ -328,7 +328,8 @@ void GitBaseDiffEditorController::initialize() // This is workaround for lack of support for merge commits and resolving conflicts, // we compare the current state of working tree to the HEAD of current branch // instead of showing unsupported combined diff format. - GitClient::CommandInProgress commandInProgress = m_instance->checkCommandInProgress(workingDirectory()); + GitClient::CommandInProgress commandInProgress = + m_instance->checkCommandInProgress(FilePath::fromString(workingDirectory())); if (commandInProgress != GitClient::NoCommand) m_rightCommit = HEAD; } @@ -342,7 +343,8 @@ void GitBaseDiffEditorController::updateBranchList() const QString workingDirectory = baseDirectory(); VcsCommand *command = m_instance->vcsExec( - workingDirectory, {"branch", noColorOption, "-a", "--contains", revision}, nullptr, + FilePath::fromString(workingDirectory), + {"branch", noColorOption, "-a", "--contains", revision}, nullptr, false, 0, workingDirectory); connect(command, &VcsCommand::stdOutText, this, [this](const QString &text) { const QString remotePrefix = "remotes/"; @@ -457,7 +459,7 @@ public: setReloader([this] { m_state = GettingDescription; const QStringList args = {"show", "-s", noColorOption, showFormatC, m_id}; - runCommand({args}, m_instance->encoding(workingDirectory(), "i18n.commitEncoding")); + runCommand({args}, m_instance->encoding(FilePath::fromString(workingDirectory()), "i18n.commitEncoding")); setStartupFile(VcsBase::source(this->document())); }); } @@ -474,7 +476,7 @@ void ShowController::processCommandOutput(const QString &output) { QTC_ASSERT(m_state != Idle, return); if (m_state == GettingDescription) { - setDescription(m_instance->extendedShowDescription(workingDirectory(), output)); + setDescription(m_instance->extendedShowDescription(FilePath::fromString(workingDirectory()), output)); // stage 2 m_state = GettingDiff; const QStringList args = {"show", "--format=format:", // omit header, already generated @@ -661,7 +663,7 @@ class ConflictHandler final : public QObject Q_OBJECT public: static void attachToCommand(VcsCommand *command, const QString &abortCommand = QString()) { - auto handler = new ConflictHandler(command->defaultWorkingDirectory(), abortCommand); + auto handler = new ConflictHandler(FilePath::fromString(command->defaultWorkingDirectory()), abortCommand); handler->setParent(command); // delete when command goes out of scope command->addFlags(VcsCommand::ExpectRepoChanges); @@ -670,7 +672,7 @@ public: } static void handleResponse(const Utils::QtcProcess &proc, - const QString &workingDirectory, + const FilePath &workingDirectory, const QString &abortCommand = QString()) { ConflictHandler handler(workingDirectory, abortCommand); @@ -682,7 +684,7 @@ public: } private: - ConflictHandler(const QString &workingDirectory, const QString &abortCommand) : + ConflictHandler(const FilePath &workingDirectory, const QString &abortCommand) : m_workingDirectory(workingDirectory), m_abortCommand(abortCommand) { } @@ -719,7 +721,7 @@ private: m_commit = match.captured(1); } private: - QString m_workingDirectory; + FilePath m_workingDirectory; QString m_abortCommand; QString m_commit; QStringList m_files; @@ -747,9 +749,9 @@ private: const QRegularExpression m_progressExp; }; -static inline QString msgRepositoryNotFound(const QString &dir) +static inline QString msgRepositoryNotFound(const FilePath &dir) { - return GitClient::tr("Cannot determine the repository for \"%1\".").arg(dir); + return GitClient::tr("Cannot determine the repository for \"%1\".").arg(dir.toUserOutput()); } static inline QString msgParseFilesFailed() @@ -770,12 +772,12 @@ static inline void msgCannotRun(const QString &message, QString *errorMessage) VcsOutputWindow::appendError(message); } -static inline void msgCannotRun(const QStringList &args, const QString &workingDirectory, +static inline void msgCannotRun(const QStringList &args, const FilePath &workingDirectory, const QString &error, QString *errorMessage) { const QString message = GitClient::tr("Cannot run \"%1\" in \"%2\": %3") .arg("git " + args.join(' '), - QDir::toNativeSeparators(workingDirectory), + workingDirectory.toUserOutput(), error); msgCannotRun(message, errorMessage); @@ -822,9 +824,9 @@ QString GitClient::findRepositoryForDirectory(const QString &directory) const return QString(); } -QString GitClient::findGitDirForRepository(const QString &repositoryDir) const +QString GitClient::findGitDirForRepository(const FilePath &repositoryDir) const { - static QHash<QString, QString> repoDirCache; + static QHash<FilePath, QString> repoDirCache; QString &res = repoDirCache[repositoryDir]; if (!res.isEmpty()) return res; @@ -832,11 +834,11 @@ QString GitClient::findGitDirForRepository(const QString &repositoryDir) const synchronousRevParseCmd(repositoryDir, "--git-dir", &res); if (!QDir(res).isAbsolute()) - res.prepend(repositoryDir + '/'); + res.prepend(repositoryDir.toString() + '/'); return res; } -bool GitClient::managesFile(const QString &workingDirectory, const QString &fileName) const +bool GitClient::managesFile(const FilePath &workingDirectory, const QString &fileName) const { QtcProcess proc; vcsFullySynchronousExec(proc, workingDirectory, {"ls-files", "--error-unmatch", fileName}, @@ -846,14 +848,14 @@ bool GitClient::managesFile(const QString &workingDirectory, const QString &file FilePaths GitClient::unmanagedFiles(const FilePaths &filePaths) const { - QMap<QString, QStringList> filesForDir; + QMap<FilePath, QStringList> filesForDir; for (const FilePath &fp : filePaths) { - filesForDir[fp.parentDir().toString()] << fp.fileName(); + filesForDir[fp.parentDir()] << fp.fileName(); } FilePaths res; for (auto it = filesForDir.begin(), end = filesForDir.end(); it != end; ++it) { QStringList args({"ls-files", "-z"}); - const QDir wd(it.key()); + const QDir wd(it.key().toString()); args << transform(it.value(), [&wd](const QString &fp) { return wd.relativeFilePath(fp); }); QtcProcess proc; vcsFullySynchronousExec(proc, it.key(), args, Core::ShellCommand::NoOutput); @@ -870,11 +872,11 @@ FilePaths GitClient::unmanagedFiles(const FilePaths &filePaths) const return res; } -QTextCodec *GitClient::codecFor(GitClient::CodecType codecType, const QString &source) const +QTextCodec *GitClient::codecFor(GitClient::CodecType codecType, const FilePath &source) const { if (codecType == CodecSource) { - return QFileInfo(source).isFile() ? VcsBaseEditor::getCodec(source) - : encoding(source, "gui.encoding"); + return source.isFile() ? VcsBaseEditor::getCodec(source.toString()) + : encoding(source, "gui.encoding"); } if (codecType == CodecLogOutput) return encoding(source, "i18n.logOutputEncoding"); @@ -943,7 +945,7 @@ void GitClient::stage(DiffEditor::DiffEditorController *diffController, if (!patchFile.open()) return; - const QString baseDir = diffController->baseDirectory(); + const FilePath baseDir = FilePath::fromString(diffController->baseDirectory()); QTextCodec *codec = EditorManager::defaultTextCodec(); const QByteArray patchData = codec ? codec->fromUnicode(patch) : patch.toLocal8Bit(); @@ -971,7 +973,7 @@ void GitClient::stage(DiffEditor::DiffEditorController *diffController, } void GitClient::requestReload(const QString &documentId, const QString &source, - const QString &title, const QString &workingDirectory, + const QString &title, const FilePath &workingDirectory, std::function<GitBaseDiffEditorController *(IDocument *)> factory) const { // Creating document might change the referenced source. Store a copy and use it. @@ -984,7 +986,7 @@ void GitClient::requestReload(const QString &documentId, const QString &source, controller->setVcsBinary(settings().binaryPath.filePath()); controller->setVcsTimeoutS(settings().timeout.value()); controller->setProcessEnvironment(processEnvironment()); - controller->setWorkingDirectory(workingDirectory); + controller->setWorkingDirectory(workingDirectory.toString()); controller->initialize(); connect(controller, &DiffEditorController::chunkActionsRequested, @@ -995,43 +997,43 @@ void GitClient::requestReload(const QString &documentId, const QString &source, controller->requestReload(); } -void GitClient::diffFiles(const QString &workingDirectory, +void GitClient::diffFiles(const FilePath &workingDirectory, const QStringList &unstagedFileNames, const QStringList &stagedFileNames) const { const QString documentId = QLatin1String(Constants::GIT_PLUGIN) - + QLatin1String(".DiffFiles.") + workingDirectory; + + QLatin1String(".DiffFiles.") + workingDirectory.toString(); requestReload(documentId, - workingDirectory, tr("Git Diff Files"), workingDirectory, + workingDirectory.toString(), tr("Git Diff Files"), workingDirectory, [stagedFileNames, unstagedFileNames](IDocument *doc) { return new FileListDiffController(doc, stagedFileNames, unstagedFileNames); }); } -void GitClient::diffProject(const QString &workingDirectory, const QString &projectDirectory) const +void GitClient::diffProject(const FilePath &workingDirectory, const QString &projectDirectory) const { const QString documentId = QLatin1String(Constants::GIT_PLUGIN) - + QLatin1String(".DiffProject.") + workingDirectory; + + QLatin1String(".DiffProject.") + workingDirectory.toString(); requestReload(documentId, - workingDirectory, tr("Git Diff Project"), workingDirectory, + workingDirectory.toString(), tr("Git Diff Project"), workingDirectory, [projectDirectory](IDocument *doc){ return new GitDiffEditorController(doc, {}, {}, {"--", projectDirectory}); }); } -void GitClient::diffRepository(const QString &workingDirectory, +void GitClient::diffRepository(const FilePath &workingDirectory, const QString &leftCommit, const QString &rightCommit) const { const QString documentId = QLatin1String(Constants::GIT_PLUGIN) - + QLatin1String(".DiffRepository.") + workingDirectory; - requestReload(documentId, workingDirectory, tr("Git Diff Repository"), workingDirectory, + + QLatin1String(".DiffRepository.") + workingDirectory.toString(); + requestReload(documentId, workingDirectory.toString(), tr("Git Diff Repository"), workingDirectory, [&leftCommit, &rightCommit](IDocument *doc) { return new GitDiffEditorController(doc, leftCommit, rightCommit, {}); }); } -void GitClient::diffFile(const QString &workingDirectory, const QString &fileName) const +void GitClient::diffFile(const FilePath &workingDirectory, const QString &fileName) const { const QString title = tr("Git Diff \"%1\"").arg(fileName); const QString sourceFile = VcsBaseEditor::getSource(workingDirectory, fileName); @@ -1043,28 +1045,27 @@ void GitClient::diffFile(const QString &workingDirectory, const QString &fileNam }); } -void GitClient::diffBranch(const QString &workingDirectory, const QString &branchName) const +void GitClient::diffBranch(const FilePath &workingDirectory, const QString &branchName) const { const QString title = tr("Git Diff Branch \"%1\"").arg(branchName); const QString documentId = QLatin1String(Constants::GIT_PLUGIN) + QLatin1String(".DiffBranch.") + branchName; - requestReload(documentId, workingDirectory, title, workingDirectory, + requestReload(documentId, workingDirectory.toString(), title, workingDirectory, [branchName](IDocument *doc) { return new GitDiffEditorController(doc, branchName, {}, {}); }); } -void GitClient::merge(const QString &workingDirectory, - const QStringList &unmergedFileNames) +void GitClient::merge(const FilePath &workingDirectory, const QStringList &unmergedFileNames) { auto mergeTool = new MergeTool(this); - if (!mergeTool->start(workingDirectory, unmergedFileNames)) + if (!mergeTool->start(workingDirectory.toString(), unmergedFileNames)) delete mergeTool; } -void GitClient::status(const QString &workingDirectory) const +void GitClient::status(const FilePath &workingDirectory) const { - VcsOutputWindow::setRepository(workingDirectory); + VcsOutputWindow::setRepository(workingDirectory.toString()); VcsCommand *command = vcsExec(workingDirectory, {"status", "-u"}, nullptr, true); connect(command, &VcsCommand::finished, VcsOutputWindow::instance(), &VcsOutputWindow::clearRepository, Qt::QueuedConnection); @@ -1092,7 +1093,7 @@ static QStringList normalLogArguments() return {logArgs}; } -void GitClient::log(const QString &workingDirectory, const QString &fileName, +void GitClient::log(const FilePath &workingDirectory, const QString &fileName, bool enableAnnotationContextMenu, const QStringList &args) { QString msgArg; @@ -1101,9 +1102,9 @@ void GitClient::log(const QString &workingDirectory, const QString &fileName, else if (!args.isEmpty() && !args.first().startsWith('-')) msgArg = args.first(); else - msgArg = workingDirectory; + msgArg = workingDirectory.toString(); // Creating document might change the referenced workingDirectory. Store a copy and use it. - const QString workingDir = workingDirectory; + const FilePath workingDir = workingDirectory; const QString title = tr("Git Log \"%1\"").arg(msgArg); const Id editorId = Git::Constants::GIT_LOG_EDITOR_ID; const QString sourceFile = VcsBaseEditor::getSource(workingDir, fileName); @@ -1153,15 +1154,15 @@ void GitClient::log(const QString &workingDirectory, const QString &fileName, vcsExec(workingDir, arguments, editor); } -void GitClient::reflog(const QString &workingDirectory, const QString &ref) +void GitClient::reflog(const FilePath &workingDirectory, const QString &ref) { - const QString title = tr("Git Reflog \"%1\"").arg(workingDirectory); + const QString title = tr("Git Reflog \"%1\"").arg(workingDirectory.toUserOutput()); const Id editorId = Git::Constants::GIT_REFLOG_EDITOR_ID; // Creating document might change the referenced workingDirectory. Store a copy and use it. - const QString workingDir = workingDirectory; + const FilePath workingDir = workingDirectory; GitEditorWidget *editor = static_cast<GitEditorWidget *>( - createVcsEditor(editorId, title, workingDir, codecFor(CodecLogOutput), - "reflogRepository", workingDir)); + createVcsEditor(editorId, title, workingDir.toString(), codecFor(CodecLogOutput), + "reflogRepository", workingDir.toString())); VcsBaseEditorConfig *argWidget = editor->editorConfig(); if (!argWidget) { argWidget = new GitRefLogArgumentsWidget(settings(), editor); @@ -1202,9 +1203,9 @@ void GitClient::show(const QString &source, const QString &id, const QString &na const QString title = tr("Git Show \"%1\"").arg(name.isEmpty() ? id : name); const QFileInfo sourceFi(source); - QString workingDirectory = sourceFi.isDir() - ? sourceFi.absoluteFilePath() : sourceFi.absolutePath(); - const QString repoDirectory = VcsManager::findTopLevelForDirectory(workingDirectory); + FilePath workingDirectory = FilePath::fromString( + sourceFi.isDir() ? sourceFi.absoluteFilePath() : sourceFi.absolutePath()); + const FilePath repoDirectory = VcsManager::findTopLevelForDirectory(workingDirectory); if (!repoDirectory.isEmpty()) workingDirectory = repoDirectory; const QString documentId = QLatin1String(Constants::GIT_PLUGIN) @@ -1213,12 +1214,12 @@ void GitClient::show(const QString &source, const QString &id, const QString &na [id](IDocument *doc) { return new ShowController(doc, id); }); } -void GitClient::archive(const QString &workingDirectory, QString commit) +void GitClient::archive(const FilePath &workingDirectory, QString commit) { - QString repoDirectory = VcsManager::findTopLevelForDirectory(workingDirectory); + FilePath repoDirectory = VcsManager::findTopLevelForDirectory(workingDirectory); if (repoDirectory.isEmpty()) repoDirectory = workingDirectory; - QString repoName = QFileInfo(repoDirectory).fileName(); + QString repoName = repoDirectory.fileName(); QHash<QString, QString> filters; QString selectedFilter; @@ -1241,7 +1242,7 @@ void GitClient::archive(const QString &workingDirectory, QString commit) QString archiveName = QFileDialog::getSaveFileName( ICore::dialogParent(), tr("Generate %1 archive").arg(repoName), - repoDirectory + QString("/../%1-%2").arg(repoName).arg(commit.left(8)), + repoDirectory.toString() + QString("/../%1-%2").arg(repoName).arg(commit.left(8)), filters.keys().join(";;"), &selectedFilter); if (archiveName.isEmpty()) @@ -1265,7 +1266,7 @@ void GitClient::archive(const QString &workingDirectory, QString commit) } VcsBaseEditorWidget *GitClient::annotate( - const QString &workingDir, const QString &file, const QString &revision, + const FilePath &workingDir, const QString &file, const QString &revision, int lineNumber, const QStringList &extraOptions) { const Id editorId = Git::Constants::GIT_BLAME_EDITOR_ID; @@ -1274,7 +1275,7 @@ VcsBaseEditorWidget *GitClient::annotate( const QString sourceFile = VcsBaseEditor::getSource(workingDir, file); VcsBaseEditorWidget *editor - = createVcsEditor(editorId, title, sourceFile, codecFor(CodecSource, sourceFile), + = createVcsEditor(editorId, title, sourceFile, codecFor(CodecSource, FilePath::fromString(sourceFile)), "blameFileName", id); VcsBaseEditorConfig *argWidget = editor->editorConfig(); if (!argWidget) { @@ -1297,7 +1298,7 @@ VcsBaseEditorWidget *GitClient::annotate( return editor; } -VcsCommand *GitClient::checkout(const QString &workingDirectory, const QString &ref, +VcsCommand *GitClient::checkout(const FilePath &workingDirectory, const QString &ref, StashMode stashMode) { if (stashMode == StashMode::TryStash && !beginStashScope(workingDirectory, "Checkout")) @@ -1317,12 +1318,12 @@ VcsCommand *GitClient::checkout(const QString &workingDirectory, const QString & } /* method used to setup arguments for checkout, in case user wants to create local branch */ -QStringList GitClient::setupCheckoutArguments(const QString &workingDirectory, +QStringList GitClient::setupCheckoutArguments(const FilePath &workingDirectory, const QString &ref) { QStringList arguments = {"checkout", ref}; - QStringList localBranches = synchronousRepositoryBranches(workingDirectory); + QStringList localBranches = synchronousRepositoryBranches(workingDirectory.toString()); if (localBranches.contains(ref)) return arguments; @@ -1389,7 +1390,7 @@ QStringList GitClient::setupCheckoutArguments(const QString &workingDirectory, return arguments; } -void GitClient::reset(const QString &workingDirectory, const QString &argument, const QString &commit) +void GitClient::reset(const FilePath &workingDirectory, const QString &argument, const QString &commit) { QStringList arguments = {"reset", argument}; if (!commit.isEmpty()) @@ -1411,7 +1412,7 @@ void GitClient::reset(const QString &workingDirectory, const QString &argument, vcsExec(workingDirectory, arguments, nullptr, true, flags); } -void GitClient::removeStaleRemoteBranches(const QString &workingDirectory, const QString &remote) +void GitClient::removeStaleRemoteBranches(const FilePath &workingDirectory, const QString &remote) { const QStringList arguments = {"remote", "prune", remote}; @@ -1422,7 +1423,7 @@ void GitClient::removeStaleRemoteBranches(const QString &workingDirectory, const this, [workingDirectory]() { GitPlugin::updateBranches(workingDirectory); }); } -void GitClient::recoverDeletedFiles(const QString &workingDirectory) +void GitClient::recoverDeletedFiles(const FilePath &workingDirectory) { QtcProcess proc; vcsFullySynchronousExec(proc, workingDirectory, {"ls-files", "--deleted"}, @@ -1439,12 +1440,12 @@ void GitClient::recoverDeletedFiles(const QString &workingDirectory) } } -void GitClient::addFile(const QString &workingDirectory, const QString &fileName) +void GitClient::addFile(const FilePath &workingDirectory, const QString &fileName) { vcsExec(workingDirectory, {"add", fileName}); } -bool GitClient::synchronousLog(const QString &workingDirectory, const QStringList &arguments, +bool GitClient::synchronousLog(const FilePath &workingDirectory, const QStringList &arguments, QString *output, QString *errorMessageIn, unsigned flags) { QStringList allArguments = {"log", noColorOption}; @@ -1459,12 +1460,12 @@ bool GitClient::synchronousLog(const QString &workingDirectory, const QStringLis return true; } else { msgCannotRun(tr("Cannot obtain log of \"%1\": %2") - .arg(QDir::toNativeSeparators(workingDirectory), proc.stdErr()), errorMessageIn); + .arg(workingDirectory.toUserOutput(), proc.stdErr()), errorMessageIn); return false; } } -bool GitClient::synchronousAdd(const QString &workingDirectory, +bool GitClient::synchronousAdd(const FilePath &workingDirectory, const QStringList &files, const QStringList &extraOptions) { @@ -1475,7 +1476,7 @@ bool GitClient::synchronousAdd(const QString &workingDirectory, return proc.result() == QtcProcess::FinishedWithSuccess; } -bool GitClient::synchronousDelete(const QString &workingDirectory, +bool GitClient::synchronousDelete(const FilePath &workingDirectory, bool force, const QStringList &files) { @@ -1488,7 +1489,7 @@ bool GitClient::synchronousDelete(const QString &workingDirectory, return proc.result() == QtcProcess::FinishedWithSuccess; } -bool GitClient::synchronousMove(const QString &workingDirectory, +bool GitClient::synchronousMove(const FilePath &workingDirectory, const QString &from, const QString &to) { @@ -1497,7 +1498,7 @@ bool GitClient::synchronousMove(const QString &workingDirectory, return proc.result() == QtcProcess::FinishedWithSuccess; } -bool GitClient::synchronousReset(const QString &workingDirectory, +bool GitClient::synchronousReset(const FilePath &workingDirectory, const QStringList &files, QString *errorMessage) { @@ -1520,7 +1521,7 @@ bool GitClient::synchronousReset(const QString &workingDirectory, msgCannotRun(arguments, workingDirectory, proc.stdErr(), errorMessage); } else { msgCannotRun(tr("Cannot reset %n files in \"%1\": %2", nullptr, files.size()) - .arg(QDir::toNativeSeparators(workingDirectory), proc.stdErr()), + .arg(workingDirectory.toUserOutput(), proc.stdErr()), errorMessage); } return false; @@ -1547,7 +1548,7 @@ bool GitClient::synchronousInit(const FilePath &workingDirectory) * git checkout -- <files> * git checkout revision -- <files> * git checkout revision -- . */ -bool GitClient::synchronousCheckoutFiles(const QString &workingDirectory, QStringList files, +bool GitClient::synchronousCheckoutFiles(const FilePath &workingDirectory, QStringList files, QString revision, QString *errorMessage, bool revertStaging) { @@ -1566,19 +1567,20 @@ bool GitClient::synchronousCheckoutFiles(const QString &workingDirectory, QStrin //: Meaning of the arguments: %1: revision, %2: files, %3: repository, //: %4: Error message msgCannotRun(tr("Cannot checkout \"%1\" of %2 in \"%3\": %4") - .arg(revision, fileArg, workingDirectory, proc.stdErr()), + .arg(revision, fileArg, workingDirectory.toUserOutput(), proc.stdErr()), errorMessage); return false; } return true; } -static inline QString msgParentRevisionFailed(const QString &workingDirectory, +static inline QString msgParentRevisionFailed(const FilePath &workingDirectory, const QString &revision, const QString &why) { //: Failed to find parent revisions of a SHA1 for "annotate previous" - return GitClient::tr("Cannot find parent revisions of \"%1\" in \"%2\": %3").arg(revision, workingDirectory, why); + return GitClient::tr("Cannot find parent revisions of \"%1\" in \"%2\": %3") + .arg(revision, workingDirectory.toUserOutput(), why); } static inline QString msgInvalidRevision() @@ -1606,7 +1608,7 @@ static inline bool splitCommitParents(const QString &line, return true; } -bool GitClient::synchronousRevListCmd(const QString &workingDirectory, const QStringList &extraArguments, +bool GitClient::synchronousRevListCmd(const FilePath &workingDirectory, const QStringList &extraArguments, QString *output, QString *errorMessage) const { const QStringList arguments = QStringList({"rev-list", noColorOption}) + extraArguments; @@ -1622,7 +1624,7 @@ bool GitClient::synchronousRevListCmd(const QString &workingDirectory, const QSt // Find out the immediate parent revisions of a revision of the repository. // Might be several in case of merges. -bool GitClient::synchronousParentRevisions(const QString &workingDirectory, +bool GitClient::synchronousParentRevisions(const FilePath &workingDirectory, const QString &revision, QStringList *parents, QString *errorMessage) const @@ -1648,7 +1650,7 @@ bool GitClient::synchronousParentRevisions(const QString &workingDirectory, return true; } -QString GitClient::synchronousShortDescription(const QString &workingDirectory, const QString &revision) const +QString GitClient::synchronousShortDescription(const FilePath &workingDirectory, const QString &revision) const { // HACK: The hopefully rare "_-_" will be replaced by quotes in the output, // leaving it in breaks command line quoting on Windows, see QTCREATORBUG-23208. @@ -1671,7 +1673,7 @@ QString GitClient::synchronousShortDescription(const QString &workingDirectory, return output; } -QString GitClient::synchronousCurrentLocalBranch(const QString &workingDirectory) const +QString GitClient::synchronousCurrentLocalBranch(const FilePath &workingDirectory) const { QString branch; QtcProcess proc; @@ -1695,7 +1697,7 @@ QString GitClient::synchronousCurrentLocalBranch(const QString &workingDirectory return QString(); } -bool GitClient::synchronousHeadRefs(const QString &workingDirectory, QStringList *output, +bool GitClient::synchronousHeadRefs(const FilePath &workingDirectory, QStringList *output, QString *errorMessage) const { const QStringList arguments = {"show-ref", "--head", "--abbrev=10", "--dereference"}; @@ -1718,7 +1720,7 @@ bool GitClient::synchronousHeadRefs(const QString &workingDirectory, QStringList } // Retrieve topic (branch, tag or HEAD hash) -QString GitClient::synchronousTopic(const QString &workingDirectory) const +QString GitClient::synchronousTopic(const FilePath &workingDirectory) const { // First try to find branch QString branch = synchronousCurrentLocalBranch(workingDirectory); @@ -1758,7 +1760,7 @@ QString GitClient::synchronousTopic(const QString &workingDirectory) const return tr("Detached HEAD"); } -bool GitClient::synchronousRevParseCmd(const QString &workingDirectory, const QString &ref, +bool GitClient::synchronousRevParseCmd(const FilePath &workingDirectory, const QString &ref, QString *output, QString *errorMessage) const { const QStringList arguments = {"rev-parse", ref}; @@ -1774,7 +1776,7 @@ bool GitClient::synchronousRevParseCmd(const QString &workingDirectory, const QS } // Retrieve head revision -QString GitClient::synchronousTopRevision(const QString &workingDirectory, QDateTime *dateTime) +QString GitClient::synchronousTopRevision(const FilePath &workingDirectory, QDateTime *dateTime) { const QStringList arguments = {"show", "-s", "--pretty=format:%H:%ct", HEAD}; QtcProcess proc; @@ -1790,7 +1792,7 @@ QString GitClient::synchronousTopRevision(const QString &workingDirectory, QDate return output.first(); } -void GitClient::synchronousTagsForCommit(const QString &workingDirectory, const QString &revision, +void GitClient::synchronousTagsForCommit(const FilePath &workingDirectory, const QString &revision, QString &precedes, QString &follows) const { QtcProcess proc1; @@ -1819,14 +1821,14 @@ void GitClient::synchronousTagsForCommit(const QString &workingDirectory, const } } -bool GitClient::isRemoteCommit(const QString &workingDirectory, const QString &commit) +bool GitClient::isRemoteCommit(const FilePath &workingDirectory, const QString &commit) { QtcProcess proc; vcsFullySynchronousExec(proc, workingDirectory, {"branch", "-r", "--contains", commit}, silentFlags); return !proc.rawStdOut().isEmpty(); } -bool GitClient::isFastForwardMerge(const QString &workingDirectory, const QString &branch) +bool GitClient::isFastForwardMerge(const FilePath &workingDirectory, const QString &branch) { QtcProcess proc; vcsFullySynchronousExec(proc, workingDirectory, {"merge-base", HEAD, branch}, silentFlags); @@ -1834,7 +1836,7 @@ bool GitClient::isFastForwardMerge(const QString &workingDirectory, const QStrin } // Format an entry in a one-liner for selection list using git log. -QString GitClient::synchronousShortDescription(const QString &workingDirectory, const QString &revision, +QString GitClient::synchronousShortDescription(const FilePath &workingDirectory, const QString &revision, const QString &format) const { const QStringList arguments = {"log", noColorOption, ("--pretty=format:" + format), @@ -1843,7 +1845,7 @@ QString GitClient::synchronousShortDescription(const QString &workingDirectory, vcsFullySynchronousExec(proc, workingDirectory, arguments, silentFlags); if (proc.result() != QtcProcess::FinishedWithSuccess) { VcsOutputWindow::appendSilently(tr("Cannot describe revision \"%1\" in \"%2\": %3") - .arg(revision, workingDirectory, proc.stdErr())); + .arg(revision, workingDirectory.toUserOutput(), proc.stdErr())); return revision; } return stripLastNewline(proc.stdOut()); @@ -1865,7 +1867,7 @@ static inline QString creatorStashMessage(const QString &keyword = QString()) * StashImmediateRestore: Immediately re-apply this stash (used for snapshots), user keeps on working * StashIgnoreUnchanged: Be quiet about unchanged repositories (used for IVersionControl's snapshots). */ -QString GitClient::synchronousStash(const QString &workingDirectory, const QString &messageKeyword, +QString GitClient::synchronousStash(const FilePath &workingDirectory, const QString &messageKeyword, unsigned flags, bool *unchanged) const { if (unchanged) @@ -1907,7 +1909,7 @@ QString GitClient::synchronousStash(const QString &workingDirectory, const QStri return message; } -bool GitClient::executeSynchronousStash(const QString &workingDirectory, +bool GitClient::executeSynchronousStash(const FilePath &workingDirectory, const QString &message, bool unstagedOnly, QString *errorMessage) const @@ -1931,7 +1933,7 @@ bool GitClient::executeSynchronousStash(const QString &workingDirectory, } // Resolve a stash name from message -bool GitClient::stashNameFromMessage(const QString &workingDirectory, +bool GitClient::stashNameFromMessage(const FilePath &workingDirectory, const QString &message, QString *name, QString *errorMessage) const { @@ -1952,11 +1954,11 @@ bool GitClient::stashNameFromMessage(const QString &workingDirectory, } //: Look-up of a stash via its descriptive message failed. msgCannotRun(tr("Cannot resolve stash message \"%1\" in \"%2\".") - .arg(message, workingDirectory), errorMessage); + .arg(message, workingDirectory.toUserOutput()), errorMessage); return false; } -bool GitClient::synchronousBranchCmd(const QString &workingDirectory, QStringList branchArgs, +bool GitClient::synchronousBranchCmd(const FilePath &workingDirectory, QStringList branchArgs, QString *output, QString *errorMessage) const { branchArgs.push_front("branch"); @@ -1970,7 +1972,7 @@ bool GitClient::synchronousBranchCmd(const QString &workingDirectory, QStringLis return true; } -bool GitClient::synchronousTagCmd(const QString &workingDirectory, QStringList tagArgs, +bool GitClient::synchronousTagCmd(const FilePath &workingDirectory, QStringList tagArgs, QString *output, QString *errorMessage) const { tagArgs.push_front("tag"); @@ -1984,7 +1986,7 @@ bool GitClient::synchronousTagCmd(const QString &workingDirectory, QStringList t return true; } -bool GitClient::synchronousForEachRefCmd(const QString &workingDirectory, QStringList args, +bool GitClient::synchronousForEachRefCmd(const FilePath &workingDirectory, QStringList args, QString *output, QString *errorMessage) const { args.push_front("for-each-ref"); @@ -1998,13 +2000,13 @@ bool GitClient::synchronousForEachRefCmd(const QString &workingDirectory, QStrin return true; } -VcsCommand *GitClient::asyncForEachRefCmd(const QString &workingDirectory, QStringList args) const +VcsCommand *GitClient::asyncForEachRefCmd(const FilePath &workingDirectory, QStringList args) const { args.push_front("for-each-ref"); return vcsExec(workingDirectory, args, nullptr, false, silentFlags); } -bool GitClient::synchronousRemoteCmd(const QString &workingDirectory, QStringList remoteArgs, +bool GitClient::synchronousRemoteCmd(const FilePath &workingDirectory, QStringList remoteArgs, QString *output, QString *errorMessage, bool silent) const { remoteArgs.push_front("remote"); @@ -2022,7 +2024,7 @@ bool GitClient::synchronousRemoteCmd(const QString &workingDirectory, QStringLis return true; } -QMap<QString,QString> GitClient::synchronousRemotesList(const QString &workingDirectory, +QMap<QString,QString> GitClient::synchronousRemotesList(const FilePath &workingDirectory, QString *errorMessage) const { QMap<QString,QString> result; @@ -2048,7 +2050,7 @@ QMap<QString,QString> GitClient::synchronousRemotesList(const QString &workingDi return result; } -QStringList GitClient::synchronousSubmoduleStatus(const QString &workingDirectory, +QStringList GitClient::synchronousSubmoduleStatus(const FilePath &workingDirectory, QString *errorMessage) const { // get submodule status @@ -2057,20 +2059,20 @@ QStringList GitClient::synchronousSubmoduleStatus(const QString &workingDirector if (proc.result() != QtcProcess::FinishedWithSuccess) { msgCannotRun(tr("Cannot retrieve submodule status of \"%1\": %2") - .arg(QDir::toNativeSeparators(workingDirectory), proc.stdErr()), errorMessage); + .arg(workingDirectory.toUserOutput(), proc.stdErr()), errorMessage); return QStringList(); } return splitLines(proc.stdOut()); } -SubmoduleDataMap GitClient::submoduleList(const QString &workingDirectory) const +SubmoduleDataMap GitClient::submoduleList(const FilePath &workingDirectory) const { SubmoduleDataMap result; - QString gitmodulesFileName = workingDirectory + "/.gitmodules"; - if (!QFile::exists(gitmodulesFileName)) + FilePath gitmodulesFileName = workingDirectory.pathAppended(".gitmodules"); + if (!gitmodulesFileName.exists()) return result; - static QMap<QString, SubmoduleDataMap> cachedSubmoduleData; + static QMap<FilePath, SubmoduleDataMap> cachedSubmoduleData; if (cachedSubmoduleData.contains(workingDirectory)) return cachedSubmoduleData.value(workingDirectory); @@ -2102,7 +2104,7 @@ SubmoduleDataMap GitClient::submoduleList(const QString &workingDirectory) const // if config found submodules if (!result.isEmpty()) { - QSettings gitmodulesFile(gitmodulesFileName, QSettings::IniFormat); + QSettings gitmodulesFile(gitmodulesFileName.toString(), QSettings::IniFormat); const QList<QString> submodules = result.keys(); for (const QString &submoduleName : submodules) { @@ -2125,7 +2127,7 @@ SubmoduleDataMap GitClient::submoduleList(const QString &workingDirectory) const return result; } -QByteArray GitClient::synchronousShow(const QString &workingDirectory, const QString &id, +QByteArray GitClient::synchronousShow(const FilePath &workingDirectory, const QString &id, unsigned flags) const { if (!canShow(id)) { @@ -2143,10 +2145,10 @@ QByteArray GitClient::synchronousShow(const QString &workingDirectory, const QSt } // Retrieve list of files to be cleaned -bool GitClient::cleanList(const QString &workingDirectory, const QString &modulePath, +bool GitClient::cleanList(const FilePath &workingDirectory, const QString &modulePath, const QString &flag, QStringList *files, QString *errorMessage) { - const QString directory = workingDirectory + '/' + modulePath; + const FilePath directory = workingDirectory.pathAppended(modulePath); const QStringList arguments = {"clean", "--dry-run", flag}; QtcProcess proc; @@ -2169,14 +2171,14 @@ bool GitClient::cleanList(const QString &workingDirectory, const QString &module return true; } -bool GitClient::synchronousCleanList(const QString &workingDirectory, const QString &modulePath, +bool GitClient::synchronousCleanList(const FilePath &workingDirectory, const QString &modulePath, QStringList *files, QStringList *ignoredFiles, QString *errorMessage) { bool res = cleanList(workingDirectory, modulePath, "-df", files, errorMessage); res &= cleanList(workingDirectory, modulePath, "-dXf", ignoredFiles, errorMessage); - const SubmoduleDataMap submodules = submoduleList(workingDirectory + '/' + modulePath); + const SubmoduleDataMap submodules = submoduleList(workingDirectory.pathAppended(modulePath)); for (const SubmoduleData &submodule : submodules) { if (submodule.ignore != "all" && submodule.ignore != "dirty") { @@ -2189,7 +2191,7 @@ bool GitClient::synchronousCleanList(const QString &workingDirectory, const QStr return res; } -bool GitClient::synchronousApplyPatch(const QString &workingDirectory, +bool GitClient::synchronousApplyPatch(const FilePath &workingDirectory, const QString &file, QString *errorMessage, const QStringList &extraArguments) { @@ -2202,11 +2204,11 @@ bool GitClient::synchronousApplyPatch(const QString &workingDirectory, if (proc.result() == QtcProcess::FinishedWithSuccess) { if (!stdErr.isEmpty()) *errorMessage = tr("There were warnings while applying \"%1\" to \"%2\":\n%3") - .arg(file, workingDirectory, stdErr); + .arg(file, workingDirectory.toUserOutput(), stdErr); return true; } else { *errorMessage = tr("Cannot apply patch \"%1\" to \"%2\": %3") - .arg(QDir::toNativeSeparators(file), workingDirectory, stdErr); + .arg(QDir::toNativeSeparators(file), workingDirectory.toUserOutput(), stdErr); return false; } } @@ -2222,25 +2224,25 @@ Environment GitClient::processEnvironment() const return environment; } -bool GitClient::beginStashScope(const QString &workingDirectory, const QString &command, +bool GitClient::beginStashScope(const FilePath &workingDirectory, const QString &command, StashFlag flag, PushAction pushAction) { - const QString repoDirectory = VcsManager::findTopLevelForDirectory(workingDirectory); + const FilePath repoDirectory = VcsManager::findTopLevelForDirectory(workingDirectory); QTC_ASSERT(!repoDirectory.isEmpty(), return false); StashInfo &stashInfo = m_stashInfo[repoDirectory]; return stashInfo.init(repoDirectory, command, flag, pushAction); } -GitClient::StashInfo &GitClient::stashInfo(const QString &workingDirectory) +GitClient::StashInfo &GitClient::stashInfo(const FilePath &workingDirectory) { - const QString repoDirectory = VcsManager::findTopLevelForDirectory(workingDirectory); + const FilePath repoDirectory = VcsManager::findTopLevelForDirectory(workingDirectory); QTC_CHECK(m_stashInfo.contains(repoDirectory)); return m_stashInfo[repoDirectory]; } -void GitClient::endStashScope(const QString &workingDirectory) +void GitClient::endStashScope(const FilePath &workingDirectory) { - const QString repoDirectory = VcsManager::findTopLevelForDirectory(workingDirectory); + const FilePath repoDirectory = VcsManager::findTopLevelForDirectory(workingDirectory); if (!m_stashInfo.contains(repoDirectory)) return; m_stashInfo[repoDirectory].end(); @@ -2256,7 +2258,7 @@ bool GitClient::isValidRevision(const QString &revision) const return false; } -void GitClient::updateSubmodulesIfNeeded(const QString &workingDirectory, bool prompt) +void GitClient::updateSubmodulesIfNeeded(const FilePath &workingDirectory, bool prompt) { if (!m_updatedSubmodules.isEmpty() || submoduleList(workingDirectory).isEmpty()) return; @@ -2290,7 +2292,7 @@ void GitClient::updateSubmodulesIfNeeded(const QString &workingDirectory, bool p // get submodule name const int nameStart = statusLine.indexOf(' ', 2) + 1; const int nameLength = statusLine.indexOf(' ', nameStart) - nameStart; - const QString submoduleDir = workingDirectory + '/' + statusLine.mid(nameStart, nameLength); + const FilePath submoduleDir = workingDirectory.pathAppended(statusLine.mid(nameStart, nameLength)); if (beginStashScope(submoduleDir, "SubmoduleUpdate")) { m_updatedSubmodules.append(submoduleDir); @@ -2307,12 +2309,12 @@ void GitClient::updateSubmodulesIfNeeded(const QString &workingDirectory, bool p void GitClient::finishSubmoduleUpdate() { - for (const QString &submoduleDir : qAsConst(m_updatedSubmodules)) + for (const FilePath &submoduleDir : qAsConst(m_updatedSubmodules)) endStashScope(submoduleDir); m_updatedSubmodules.clear(); } -GitClient::StatusResult GitClient::gitStatus(const QString &workingDirectory, StatusMode mode, +GitClient::StatusResult GitClient::gitStatus(const FilePath &workingDirectory, StatusMode mode, QString *output, QString *errorMessage) const { // Run 'status'. Note that git returns exitcode 1 if there are no added files. @@ -2348,7 +2350,7 @@ GitClient::StatusResult GitClient::gitStatus(const QString &workingDirectory, St return hasChanges ? StatusChanged : StatusUnchanged; } -QString GitClient::commandInProgressDescription(const QString &workingDirectory) const +QString GitClient::commandInProgressDescription(const FilePath &workingDirectory) const { switch (checkCommandInProgress(workingDirectory)) { case NoCommand: @@ -2366,7 +2368,7 @@ QString GitClient::commandInProgressDescription(const QString &workingDirectory) return QString(); } -GitClient::CommandInProgress GitClient::checkCommandInProgress(const QString &workingDirectory) const +GitClient::CommandInProgress GitClient::checkCommandInProgress(const FilePath &workingDirectory) const { const QString gitDir = findGitDirForRepository(workingDirectory); if (QFile::exists(gitDir + "/MERGE_HEAD")) @@ -2383,7 +2385,7 @@ GitClient::CommandInProgress GitClient::checkCommandInProgress(const QString &wo return NoCommand; } -void GitClient::continueCommandIfNeeded(const QString &workingDirectory, bool allowContinue) +void GitClient::continueCommandIfNeeded(const FilePath &workingDirectory, bool allowContinue) { if (GitPlugin::isCommitEditorOpen()) return; @@ -2420,7 +2422,7 @@ void GitClient::continueCommandIfNeeded(const QString &workingDirectory, bool al } } -void GitClient::continuePreviousGitCommand(const QString &workingDirectory, +void GitClient::continuePreviousGitCommand(const FilePath &workingDirectory, const QString &msgBoxTitle, QString msgBoxText, const QString &buttonName, const QString &gitCommand, ContinueCommandMode continueMode) @@ -2462,7 +2464,7 @@ void GitClient::continuePreviousGitCommand(const QString &workingDirectory, } } -QString GitClient::extendedShowDescription(const QString &workingDirectory, const QString &text) const +QString GitClient::extendedShowDescription(const FilePath &workingDirectory, const QString &text) const { if (!text.startsWith("commit ")) return text; @@ -2488,7 +2490,7 @@ QString GitClient::extendedShowDescription(const QString &workingDirectory, cons // // The branch HEAD is pointing to is always returned first. QStringList GitClient::synchronousRepositoryBranches(const QString &repositoryURL, - const QString &workingDirectory) const + const FilePath &workingDirectory) const { const unsigned flags = VcsCommand::SshPasswordPrompt | VcsCommand::SuppressStdErr @@ -2528,7 +2530,7 @@ QStringList GitClient::synchronousRepositoryBranches(const QString &repositoryUR return branches; } -void GitClient::launchGitK(const QString &workingDirectory, const QString &fileName) const +void GitClient::launchGitK(const FilePath &workingDirectory, const QString &fileName) const { const QFileInfo binaryInfo = vcsBinary().toFileInfo(); QDir foundBinDir(binaryInfo.dir()); @@ -2564,15 +2566,15 @@ void GitClient::launchGitK(const QString &workingDirectory, const QString &fileN VcsOutputWindow::appendError(msgCannotLaunch("gitk")); } -void GitClient::launchRepositoryBrowser(const QString &workingDirectory) const +void GitClient::launchRepositoryBrowser(const FilePath &workingDirectory) const { const QString repBrowserBinary = settings().repositoryBrowserCmd.value(); if (!repBrowserBinary.isEmpty()) - QProcess::startDetached(repBrowserBinary, {workingDirectory}, workingDirectory); + QProcess::startDetached(repBrowserBinary, {workingDirectory.toString()}, workingDirectory.toString()); } bool GitClient::tryLauchingGitK(const Environment &env, - const QString &workingDirectory, + const FilePath &workingDirectory, const QString &fileName, const QString &gitBinDirectory) const { @@ -2591,13 +2593,13 @@ bool GitClient::tryLauchingGitK(const Environment &env, arguments.append(ProcessArgs::splitArgs(gitkOpts, HostOsInfo::hostOs())); if (!fileName.isEmpty()) arguments << "--" << fileName; - VcsOutputWindow::appendCommand(workingDirectory, {binary, arguments}); + VcsOutputWindow::appendCommand(workingDirectory.toString(), {binary, arguments}); // This should always use QProcess::startDetached (as not to kill // the child), but that does not have an environment parameter. bool success = false; if (!settings().path.value().isEmpty()) { auto process = new QProcess; - process->setWorkingDirectory(workingDirectory); + process->setWorkingDirectory(workingDirectory.toString()); process->setProcessEnvironment(env.toProcessEnvironment()); process->start(binary, arguments); success = process->waitForStarted(); @@ -2607,20 +2609,20 @@ bool GitClient::tryLauchingGitK(const Environment &env, else delete process; } else { - success = QProcess::startDetached(binary, arguments, workingDirectory); + success = QProcess::startDetached(binary, arguments, workingDirectory.toString()); } return success; } -bool GitClient::launchGitGui(const QString &workingDirectory) { +bool GitClient::launchGitGui(const FilePath &workingDirectory) { bool success = true; FilePath gitBinary = vcsBinary(); if (gitBinary.isEmpty()) { success = false; } else { success = QProcess::startDetached(gitBinary.toString(), {"gui"}, - workingDirectory); + workingDirectory.toString()); } if (!success) @@ -2656,7 +2658,7 @@ FilePath GitClient::gitBinDirectory() const return FilePath::fromString(path); } -bool GitClient::launchGitBash(const QString &workingDirectory) +bool GitClient::launchGitBash(const FilePath &workingDirectory) { bool success = true; const QString git = vcsBinary().toString(); @@ -2665,7 +2667,7 @@ bool GitClient::launchGitBash(const QString &workingDirectory) success = false; } else { const QString gitBash = QFileInfo(git).absolutePath() + "/../git-bash.exe"; - success = QProcess::startDetached(gitBash, {}, workingDirectory); + success = QProcess::startDetached(gitBash, {}, workingDirectory.toString()); } if (!success) @@ -2683,7 +2685,7 @@ FilePath GitClient::vcsBinary() const return binary; } -QTextCodec *GitClient::encoding(const QString &workingDirectory, const QString &configVar) const +QTextCodec *GitClient::encoding(const FilePath &workingDirectory, const QString &configVar) const { QString codecName = readConfigValue(workingDirectory, configVar).trimmed(); // Set default commit encoding to 'UTF-8', when it's not set, @@ -2702,7 +2704,7 @@ static QByteArray shiftLogLine(QByteArray &logText) return res; } -bool GitClient::readDataFromCommit(const QString &repoDirectory, const QString &commit, +bool GitClient::readDataFromCommit(const FilePath &repoDirectory, const QString &commit, CommitData &commitData, QString *errorMessage, QString *commitTemplate) { @@ -2714,7 +2716,7 @@ bool GitClient::readDataFromCommit(const QString &repoDirectory, const QString & if (proc.result() != QtcProcess::FinishedWithSuccess) { if (errorMessage) { *errorMessage = tr("Cannot retrieve last commit data of repository \"%1\".") - .arg(QDir::toNativeSeparators(repoDirectory)); + .arg(repoDirectory.toUserOutput()); } return false; } @@ -2731,7 +2733,7 @@ bool GitClient::readDataFromCommit(const QString &repoDirectory, const QString & return true; } -bool GitClient::getCommitData(const QString &workingDirectory, +bool GitClient::getCommitData(const FilePath &workingDirectory, QString *commitTemplate, CommitData &commitData, QString *errorMessage) @@ -2739,7 +2741,7 @@ bool GitClient::getCommitData(const QString &workingDirectory, commitData.clear(); // Find repo - const QString repoDirectory = VcsManager::findTopLevelForDirectory(workingDirectory); + const FilePath repoDirectory = VcsManager::findTopLevelForDirectory(workingDirectory); if (repoDirectory.isEmpty()) { *errorMessage = msgRepositoryNotFound(workingDirectory); return false; @@ -2749,7 +2751,7 @@ bool GitClient::getCommitData(const QString &workingDirectory, QString gitDir = findGitDirForRepository(repoDirectory); if (gitDir.isEmpty()) { - *errorMessage = tr("The repository \"%1\" is not initialized.").arg(repoDirectory); + *errorMessage = tr("The repository \"%1\" is not initialized.").arg(repoDirectory.toString()); return false; } @@ -2792,7 +2794,7 @@ bool GitClient::getCommitData(const QString &workingDirectory, // Filter out untracked files that are not part of the project QStringList untrackedFiles = commitData.filterFiles(UntrackedFile); - VcsBaseSubmitEditor::filterUntrackedFilesOfProject(repoDirectory, &untrackedFiles); + VcsBaseSubmitEditor::filterUntrackedFilesOfProject(repoDirectory.toString(), &untrackedFiles); QList<CommitData::StateFilePair> filteredFiles; QList<CommitData::StateFilePair>::const_iterator it = commitData.files.constBegin(); for ( ; it != commitData.files.constEnd(); ++it) { @@ -2853,7 +2855,7 @@ bool GitClient::getCommitData(const QString &workingDirectory, // Make relative to repository const QFileInfo templateFileInfo(templateFilename); if (templateFileInfo.isRelative()) - templateFilename = repoDirectory + '/' + templateFilename; + templateFilename = repoDirectory.toString() + '/' + templateFilename; FileReader reader; if (!reader.fetch(Utils::FilePath::fromString(templateFilename), QIODevice::Text, errorMessage)) return false; @@ -2885,7 +2887,7 @@ static inline QString msgCommitted(const QString &amendSHA1, int fileCount) return GitClient::tr("Amended \"%1\".").arg(amendSHA1); } -bool GitClient::addAndCommit(const QString &repositoryDirectory, +bool GitClient::addAndCommit(const FilePath &repositoryDirectory, const GitSubmitEditorPanelData &data, CommitType commitType, const QString &amendSHA1, @@ -2995,9 +2997,10 @@ GitClient::RevertResult GitClient::revertI(QStringList files, const bool isDirectory = firstFile.isDir(); if (ptrToIsDirectory) *ptrToIsDirectory = isDirectory; - const QString workingDirectory = isDirectory ? firstFile.absoluteFilePath() : firstFile.absolutePath(); + const FilePath workingDirectory = + FilePath::fromString(isDirectory ? firstFile.absoluteFilePath() : firstFile.absolutePath()); - const QString repoDirectory = VcsManager::findTopLevelForDirectory(workingDirectory); + const FilePath repoDirectory = VcsManager::findTopLevelForDirectory(workingDirectory); if (repoDirectory.isEmpty()) { *errorMessage = msgRepositoryNotFound(workingDirectory); return RevertFailed; @@ -3022,7 +3025,7 @@ GitClient::RevertResult GitClient::revertI(QStringList files, // If we are looking at files, make them relative to the repository // directory to match them in the status output list. if (!isDirectory) { - const QDir repoDir(repoDirectory); + const QDir repoDir(repoDirectory.toString()); const QStringList::iterator cend = files.end(); for (QStringList::iterator it = files.begin(); it != cend; ++it) *it = repoDir.relativeFilePath(*it); @@ -3086,7 +3089,7 @@ void GitClient::revert(const QStringList &files, bool revertStaging) } } -void GitClient::fetch(const QString &workingDirectory, const QString &remote) +void GitClient::fetch(const FilePath &workingDirectory, const QString &remote) { QStringList const arguments = {"fetch", (remote.isEmpty() ? "--all" : remote)}; VcsCommand *command = vcsExec(workingDirectory, arguments, nullptr, true, @@ -3095,7 +3098,7 @@ void GitClient::fetch(const QString &workingDirectory, const QString &remote) this, [workingDirectory] { GitPlugin::updateBranches(workingDirectory); }); } -bool GitClient::executeAndHandleConflicts(const QString &workingDirectory, +bool GitClient::executeAndHandleConflicts(const FilePath &workingDirectory, const QStringList &arguments, const QString &abortCommand) const { @@ -3111,7 +3114,7 @@ bool GitClient::executeAndHandleConflicts(const QString &workingDirectory, return proc.result() == QtcProcess::FinishedWithSuccess; } -void GitClient::pull(const QString &workingDirectory, bool rebase) +void GitClient::pull(const FilePath &workingDirectory, bool rebase) { QString abortCommand; QStringList arguments = {"pull"}; @@ -3128,7 +3131,7 @@ void GitClient::pull(const QString &workingDirectory, bool rebase) Qt::QueuedConnection); } -void GitClient::synchronousAbortCommand(const QString &workingDir, const QString &abortCommand) +void GitClient::synchronousAbortCommand(const FilePath &workingDir, const QString &abortCommand) { // Abort to clean if something goes wrong if (abortCommand.isEmpty()) { @@ -3144,7 +3147,7 @@ void GitClient::synchronousAbortCommand(const QString &workingDir, const QString VcsOutputWindow::append(proc.stdOut()); } -QString GitClient::synchronousTrackingBranch(const QString &workingDirectory, const QString &branch) +QString GitClient::synchronousTrackingBranch(const FilePath &workingDirectory, const QString &branch) { QString remote; QString localBranch = branch.isEmpty() ? synchronousCurrentLocalBranch(workingDirectory) : branch; @@ -3161,7 +3164,7 @@ QString GitClient::synchronousTrackingBranch(const QString &workingDirectory, co return remote + '/' + rBranch; } -bool GitClient::synchronousSetTrackingBranch(const QString &workingDirectory, +bool GitClient::synchronousSetTrackingBranch(const FilePath &workingDirectory, const QString &branch, const QString &tracking) { QtcProcess proc; @@ -3170,7 +3173,7 @@ bool GitClient::synchronousSetTrackingBranch(const QString &workingDirectory, return proc.result() == QtcProcess::FinishedWithSuccess; } -VcsBase::VcsCommand *GitClient::asyncUpstreamStatus(const QString &workingDirectory, +VcsBase::VcsCommand *GitClient::asyncUpstreamStatus(const FilePath &workingDirectory, const QString &branch, const QString &upstream) { @@ -3179,7 +3182,7 @@ VcsBase::VcsCommand *GitClient::asyncUpstreamStatus(const QString &workingDirect return vcsExec(workingDirectory, args, nullptr, false, silentFlags); } -void GitClient::handleMergeConflicts(const QString &workingDir, const QString &commit, +void GitClient::handleMergeConflicts(const FilePath &workingDir, const QString &commit, const QStringList &files, const QString &abortCommand) { QString message; @@ -3232,7 +3235,7 @@ void GitClient::addFuture(const QFuture<void> &future) } // Subversion: git svn -void GitClient::synchronousSubversionFetch(const QString &workingDirectory) const +void GitClient::synchronousSubversionFetch(const FilePath &workingDirectory) const { // Disable UNIX terminals to suppress SSH prompting. const unsigned flags = VcsCommand::SshPasswordPrompt @@ -3242,7 +3245,7 @@ void GitClient::synchronousSubversionFetch(const QString &workingDirectory) cons vcsSynchronousExec(proc, workingDirectory, {"svn", "fetch"}, flags); } -void GitClient::subversionLog(const QString &workingDirectory) const +void GitClient::subversionLog(const FilePath &workingDirectory) const { QStringList arguments = {"svn", "log"}; int logCount = settings().logCount.value(); @@ -3259,13 +3262,13 @@ void GitClient::subversionLog(const QString &workingDirectory) const vcsExec(workingDirectory, arguments, editor); } -void GitClient::subversionDeltaCommit(const QString &workingDirectory) const +void GitClient::subversionDeltaCommit(const FilePath &workingDirectory) const { vcsExec(workingDirectory, {"svn", "dcommit"}, nullptr, true, VcsCommand::ShowSuccessMessage); } -void GitClient::push(const QString &workingDirectory, const QStringList &pushArgs) +void GitClient::push(const FilePath &workingDirectory, const QStringList &pushArgs) { VcsCommand *command = vcsExec( workingDirectory, QStringList({"push"}) + pushArgs, nullptr, true, @@ -3343,7 +3346,7 @@ void GitClient::push(const QString &workingDirectory, const QStringList &pushArg }); } -bool GitClient::synchronousMerge(const QString &workingDirectory, const QString &branch, +bool GitClient::synchronousMerge(const FilePath &workingDirectory, const QString &branch, bool allowFastForward) { QString command = "merge"; @@ -3354,7 +3357,7 @@ bool GitClient::synchronousMerge(const QString &workingDirectory, const QString return executeAndHandleConflicts(workingDirectory, arguments, command); } -bool GitClient::canRebase(const QString &workingDirectory) const +bool GitClient::canRebase(const FilePath &workingDirectory) const { const QString gitDir = findGitDirForRepository(workingDirectory); if (QFileInfo::exists(gitDir + "/rebase-apply") @@ -3367,24 +3370,24 @@ bool GitClient::canRebase(const QString &workingDirectory) const return true; } -void GitClient::rebase(const QString &workingDirectory, const QString &argument) +void GitClient::rebase(const FilePath &workingDirectory, const QString &argument) { vcsExecAbortable(workingDirectory, {"rebase", argument}, true); } -void GitClient::cherryPick(const QString &workingDirectory, const QString &argument) +void GitClient::cherryPick(const FilePath &workingDirectory, const QString &argument) { vcsExecAbortable(workingDirectory, {"cherry-pick", argument}); } -void GitClient::revert(const QString &workingDirectory, const QString &argument) +void GitClient::revert(const FilePath &workingDirectory, const QString &argument) { vcsExecAbortable(workingDirectory, {"revert", argument}); } // Executes a command asynchronously. Work tree is expected to be clean. // Stashing is handled prior to this call. -VcsCommand *GitClient::vcsExecAbortable(const QString &workingDirectory, +VcsCommand *GitClient::vcsExecAbortable(const FilePath &workingDirectory, const QStringList &arguments, bool isRebase, QString abortCommand) @@ -3394,7 +3397,7 @@ VcsCommand *GitClient::vcsExecAbortable(const QString &workingDirectory, if (abortCommand.isEmpty()) abortCommand = arguments.at(0); VcsCommand *command = createCommand(workingDirectory, nullptr, VcsWindowOutputBind); - command->setCookie(workingDirectory); + command->setCookie(workingDirectory.toString()); command->addFlags(VcsCommand::SshPasswordPrompt | VcsCommand::ShowStdOut | VcsCommand::ShowSuccessMessage); @@ -3409,7 +3412,7 @@ VcsCommand *GitClient::vcsExecAbortable(const QString &workingDirectory, return command; } -bool GitClient::synchronousRevert(const QString &workingDirectory, const QString &commit) +bool GitClient::synchronousRevert(const FilePath &workingDirectory, const QString &commit) { const QString command = "revert"; // Do not stash if --continue or --abort is given as the commit @@ -3418,7 +3421,7 @@ bool GitClient::synchronousRevert(const QString &workingDirectory, const QString return executeAndHandleConflicts(workingDirectory, {command, "--no-edit", commit}, command); } -bool GitClient::synchronousCherryPick(const QString &workingDirectory, const QString &commit) +bool GitClient::synchronousCherryPick(const FilePath &workingDirectory, const QString &commit) { const QString command = "cherry-pick"; // "commit" might be --continue or --abort @@ -3434,7 +3437,7 @@ bool GitClient::synchronousCherryPick(const QString &workingDirectory, const QSt return executeAndHandleConflicts(workingDirectory, arguments, command); } -void GitClient::interactiveRebase(const QString &workingDirectory, const QString &commit, bool fixup) +void GitClient::interactiveRebase(const FilePath &workingDirectory, const QString &commit, bool fixup) { QStringList arguments = {"rebase", "-i"}; if (fixup) @@ -3457,7 +3460,7 @@ QString GitClient::msgNoCommits(bool includeRemote) return includeRemote ? tr("No commits were found") : tr("No local commits were found"); } -void GitClient::stashPop(const QString &workingDirectory, const QString &stash) +void GitClient::stashPop(const FilePath &workingDirectory, const QString &stash) { QStringList arguments = {"stash", "pop"}; if (!stash.isEmpty()) @@ -3466,7 +3469,7 @@ void GitClient::stashPop(const QString &workingDirectory, const QString &stash) ConflictHandler::attachToCommand(cmd); } -bool GitClient::synchronousStashRestore(const QString &workingDirectory, +bool GitClient::synchronousStashRestore(const FilePath &workingDirectory, const QString &stash, bool pop, const QString &branch /* = QString()*/) const @@ -3479,7 +3482,7 @@ bool GitClient::synchronousStashRestore(const QString &workingDirectory, return executeAndHandleConflicts(workingDirectory, arguments); } -bool GitClient::synchronousStashRemove(const QString &workingDirectory, const QString &stash, +bool GitClient::synchronousStashRemove(const FilePath &workingDirectory, const QString &stash, QString *errorMessage) const { QStringList arguments = {"stash"}; @@ -3501,7 +3504,7 @@ bool GitClient::synchronousStashRemove(const QString &workingDirectory, const QS } } -bool GitClient::synchronousStashList(const QString &workingDirectory, QList<Stash> *stashes, +bool GitClient::synchronousStashList(const FilePath &workingDirectory, QList<Stash> *stashes, QString *errorMessage) const { stashes->clear(); @@ -3523,23 +3526,23 @@ bool GitClient::synchronousStashList(const QString &workingDirectory, QList<Stas } // Read a single-line config value, return trimmed -QString GitClient::readConfigValue(const QString &workingDirectory, const QString &configVar) const +QString GitClient::readConfigValue(const FilePath &workingDirectory, const QString &configVar) const { return readOneLine(workingDirectory, {"config", configVar}); } -void GitClient::setConfigValue(const QString &workingDirectory, const QString &configVar, +void GitClient::setConfigValue(const FilePath &workingDirectory, const QString &configVar, const QString &value) const { readOneLine(workingDirectory, {"config", configVar, value}); } -QString GitClient::readGitVar(const QString &workingDirectory, const QString &configVar) const +QString GitClient::readGitVar(const FilePath &workingDirectory, const QString &configVar) const { return readOneLine(workingDirectory, {"var", configVar}); } -QString GitClient::readOneLine(const QString &workingDirectory, const QStringList &arguments) const +QString GitClient::readOneLine(const FilePath &workingDirectory, const QStringList &arguments) const { // Git for Windows always uses UTF-8 for configuration: // https://github.com/msysgit/msysgit/wiki/Git-for-Windows-Unicode-Support#convert-config-files @@ -3575,7 +3578,7 @@ unsigned GitClient::synchronousGitVersion(QString *errorMessage) const // run git --version QtcProcess proc; - vcsSynchronousExec(proc, QString(), {"--version"}, silentFlags); + vcsSynchronousExec(proc, {}, {"--version"}, silentFlags); if (proc.result() != QtcProcess::FinishedWithSuccess) { msgCannotRun(tr("Cannot determine Git version: %1").arg(proc.stdErr()), errorMessage); return 0; @@ -3594,7 +3597,7 @@ unsigned GitClient::synchronousGitVersion(QString *errorMessage) const return version(majorV, minorV, patchV); } -bool GitClient::StashInfo::init(const QString &workingDirectory, const QString &command, +bool GitClient::StashInfo::init(const FilePath &workingDirectory, const QString &command, StashFlag flag, PushAction pushAction) { m_workingDir = workingDirectory; @@ -3628,7 +3631,7 @@ void GitClient::StashInfo::stashPrompt(const QString &command, const QString &st { QMessageBox msgBox(QMessageBox::Question, tr("Uncommitted Changes Found"), tr("What would you like to do with local changes in:") + "\n\n\"" - + QDir::toNativeSeparators(m_workingDir) + '\"', + + m_workingDir.toUserOutput() + '\"', QMessageBox::NoButton, ICore::dialogParent()); msgBox.setDetailedText(statusOutput); @@ -3716,7 +3719,7 @@ GitRemote::GitRemote(const QString &location) : Core::IVersionControl::RepoUrl(l } QString GitClient::suggestedLocalBranchName( - const QString &workingDirectory, + const FilePath &workingDirectory, const QStringList &localNames, const QString &target, BranchTargetType targetType) @@ -3743,7 +3746,7 @@ QString GitClient::suggestedLocalBranchName( void GitClient::addChangeActions(QMenu *menu, const QString &source, const QString &change) { QTC_ASSERT(!change.isEmpty(), return); - const QString &workingDir = fileWorkingDirectory(source); + const FilePath &workingDir = fileWorkingDirectory(source); menu->addAction(tr("Cherr&y-Pick Change %1").arg(change), [workingDir, change] { m_instance->synchronousCherryPick(workingDir, change); }); @@ -3815,23 +3818,23 @@ void GitClient::addChangeActions(QMenu *menu, const QString &source, const QStri }); } -QString GitClient::fileWorkingDirectory(const QString &file) +FilePath GitClient::fileWorkingDirectory(const QString &file) { Utils::FilePath path = Utils::FilePath::fromString(file); if (!path.isEmpty() && !path.isDir()) path = path.parentDir(); while (!path.isEmpty() && !path.exists()) path = path.parentDir(); - return path.toString(); + return path; } -IEditor *GitClient::openShowEditor(const QString &workingDirectory, const QString &ref, +IEditor *GitClient::openShowEditor(const FilePath &workingDirectory, const QString &ref, const QString &path, ShowEditor showSetting) { QString topLevel; VcsManager::findVersionControlForDirectory(workingDirectory, &topLevel); const QString relativePath = QDir(topLevel).relativeFilePath(path); - const QByteArray content = synchronousShow(topLevel, ref + ":" + relativePath); + const QByteArray content = synchronousShow(FilePath::fromString(topLevel), ref + ":" + relativePath); if (showSetting == ShowEditor::OnlyIfDifferent) { if (content.isEmpty()) return nullptr; diff --git a/src/plugins/git/gitclient.h b/src/plugins/git/gitclient.h index 1f1b164cdff..53db664f6d9 100644 --- a/src/plugins/git/gitclient.h +++ b/src/plugins/git/gitclient.h @@ -120,7 +120,7 @@ public: enum StashResult { StashUnchanged, StashCanceled, StashFailed, Stashed, NotStashed /* User did not want it */ }; - bool init(const QString &workingDirectory, const QString &command, + bool init(const Utils::FilePath &workingDirectory, const QString &command, StashFlag flag = Default, PushAction pushAction = NoPush); bool stashingFailed() const; void end(); @@ -133,7 +133,7 @@ public: StashResult m_stashResult = NotStashed; QString m_message; - QString m_workingDir; + Utils::FilePath m_workingDir; StashFlag m_flags = Default; PushAction m_pushAction = NoPush; }; @@ -145,178 +145,178 @@ public: Utils::FilePath vcsBinary() const override; unsigned gitVersion(QString *errorMessage = nullptr) const; - VcsBase::VcsCommand *vcsExecAbortable(const QString &workingDirectory, + VcsBase::VcsCommand *vcsExecAbortable(const Utils::FilePath &workingDirectory, const QStringList &arguments, bool isRebase = false, - QString abortCommand = QString()); + QString abortCommand = {}); QString findRepositoryForDirectory(const QString &directory) const; - QString findGitDirForRepository(const QString &repositoryDir) const; - bool managesFile(const QString &workingDirectory, const QString &fileName) const; + QString findGitDirForRepository(const Utils::FilePath &repositoryDir) const; + bool managesFile(const Utils::FilePath &workingDirectory, const QString &fileName) const; Utils::FilePaths unmanagedFiles(const Utils::FilePaths &filePaths) const; - void diffFile(const QString &workingDirectory, const QString &fileName) const; - void diffFiles(const QString &workingDirectory, + void diffFile(const Utils::FilePath &workingDirectory, const QString &fileName) const; + void diffFiles(const Utils::FilePath &workingDirectory, const QStringList &unstagedFileNames, const QStringList &stagedFileNames) const; - void diffProject(const QString &workingDirectory, + void diffProject(const Utils::FilePath &workingDirectory, const QString &projectDirectory) const; - void diffRepository(const QString &workingDirectory) const + void diffRepository(const Utils::FilePath &workingDirectory) const { return diffRepository(workingDirectory, {}, {}); } - void diffRepository(const QString &workingDirectory, + void diffRepository(const Utils::FilePath &workingDirectory, const QString &leftCommit, const QString &rightCommit) const; - void diffBranch(const QString &workingDirectory, + void diffBranch(const Utils::FilePath &workingDirectory, const QString &branchName) const; - void merge(const QString &workingDirectory, const QStringList &unmergedFileNames = QStringList()); - - void status(const QString &workingDirectory) const; - void log(const QString &workingDirectory, const QString &fileName = QString(), - bool enableAnnotationContextMenu = false, const QStringList &args = QStringList()); - void reflog(const QString &workingDirectory, const QString &branch = {}); - VcsBase::VcsBaseEditorWidget *annotate( - const QString &workingDir, const QString &file, const QString &revision = QString(), - int lineNumber = -1, const QStringList &extraOptions = QStringList()) override; - void reset(const QString &workingDirectory, const QString &argument, const QString &commit = QString()); - void removeStaleRemoteBranches(const QString &workingDirectory, const QString &remote); - void recoverDeletedFiles(const QString &workingDirectory); - void addFile(const QString &workingDirectory, const QString &fileName); - bool synchronousLog(const QString &workingDirectory, const QStringList &arguments, + void merge(const Utils::FilePath &workingDirectory, const QStringList &unmergedFileNames = {}); + + void status(const Utils::FilePath &workingDirectory) const; + void log(const Utils::FilePath &workingDirectory, const QString &fileName = {}, + bool enableAnnotationContextMenu = false, const QStringList &args = {}); + void reflog(const Utils::FilePath &workingDirectory, const QString &branch = {}); + VcsBase::VcsBaseEditorWidget *annotate(const Utils::FilePath &workingDir, const QString &file, + const QString &revision = {}, int lineNumber = -1, + const QStringList &extraOptions = {}) override; + void reset(const Utils::FilePath &workingDirectory, const QString &argument, const QString &commit = {}); + void removeStaleRemoteBranches(const Utils::FilePath &workingDirectory, const QString &remote); + void recoverDeletedFiles(const Utils::FilePath &workingDirectory); + void addFile(const Utils::FilePath &workingDirectory, const QString &fileName); + bool synchronousLog(const Utils::FilePath &workingDirectory, const QStringList &arguments, QString *output, QString *errorMessage = nullptr, unsigned flags = 0); - bool synchronousAdd(const QString &workingDirectory, const QStringList &files, + bool synchronousAdd(const Utils::FilePath &workingDirectory, const QStringList &files, const QStringList &extraOptions = {}); - bool synchronousDelete(const QString &workingDirectory, + bool synchronousDelete(const Utils::FilePath &workingDirectory, bool force, const QStringList &files); - bool synchronousMove(const QString &workingDirectory, + bool synchronousMove(const Utils::FilePath &workingDirectory, const QString &from, const QString &to); - bool synchronousReset(const QString &workingDirectory, const QStringList &files = QStringList(), + bool synchronousReset(const Utils::FilePath &workingDirectory, const QStringList &files = {}, QString *errorMessage = nullptr); - bool synchronousCleanList(const QString &workingDirectory, const QString &modulePath, + bool synchronousCleanList(const Utils::FilePath &workingDirectory, const QString &modulePath, QStringList *files, QStringList *ignoredFiles, QString *errorMessage); - bool synchronousApplyPatch(const QString &workingDirectory, const QString &file, - QString *errorMessage, const QStringList &extraArguments = QStringList()); + bool synchronousApplyPatch(const Utils::FilePath &workingDirectory, const QString &file, + QString *errorMessage, const QStringList &extraArguments = {}); bool synchronousInit(const Utils::FilePath &workingDirectory); - bool synchronousCheckoutFiles(const QString &workingDirectory, QStringList files = QStringList(), - QString revision = QString(), QString *errorMessage = nullptr, + bool synchronousCheckoutFiles(const Utils::FilePath &workingDirectory, QStringList files = {}, + QString revision = {}, QString *errorMessage = nullptr, bool revertStaging = true); enum class StashMode { NoStash, TryStash }; - VcsBase::VcsCommand *checkout(const QString &workingDirectory, const QString &ref, + VcsBase::VcsCommand *checkout(const Utils::FilePath &workingDirectory, const QString &ref, StashMode stashMode = StashMode::TryStash); - QStringList setupCheckoutArguments(const QString &workingDirectory, const QString &ref); - void updateSubmodulesIfNeeded(const QString &workingDirectory, bool prompt); + QStringList setupCheckoutArguments(const Utils::FilePath &workingDirectory, const QString &ref); + void updateSubmodulesIfNeeded(const Utils::FilePath &workingDirectory, bool prompt); // Do a stash and return identier. enum { StashPromptDescription = 0x1, StashImmediateRestore = 0x2, StashIgnoreUnchanged = 0x4 }; - QString synchronousStash(const QString &workingDirectory, - const QString &messageKeyword = QString(), + QString synchronousStash(const Utils::FilePath &workingDirectory, + const QString &messageKeyword = {}, unsigned flags = 0, bool *unchanged = nullptr) const; - bool executeSynchronousStash(const QString &workingDirectory, - const QString &message = QString(), + bool executeSynchronousStash(const Utils::FilePath &workingDirectory, + const QString &message = {}, bool unstagedOnly = false, QString *errorMessage = nullptr) const; - bool synchronousStashRestore(const QString &workingDirectory, + bool synchronousStashRestore(const Utils::FilePath &workingDirectory, const QString &stash, bool pop = false, - const QString &branch = QString()) const; - bool synchronousStashRemove(const QString &workingDirectory, - const QString &stash = QString(), + const QString &branch = {}) const; + bool synchronousStashRemove(const Utils::FilePath &workingDirectory, + const QString &stash = {}, QString *errorMessage = nullptr) const; - bool synchronousBranchCmd(const QString &workingDirectory, QStringList branchArgs, + bool synchronousBranchCmd(const Utils::FilePath &workingDirectory, QStringList branchArgs, QString *output, QString *errorMessage) const; - bool synchronousTagCmd(const QString &workingDirectory, QStringList tagArgs, + bool synchronousTagCmd(const Utils::FilePath &workingDirectory, QStringList tagArgs, QString *output, QString *errorMessage) const; - bool synchronousForEachRefCmd(const QString &workingDirectory, QStringList args, + bool synchronousForEachRefCmd(const Utils::FilePath &workingDirectory, QStringList args, QString *output, QString *errorMessage = nullptr) const; - VcsBase::VcsCommand *asyncForEachRefCmd(const QString &workingDirectory, QStringList args) const; - bool synchronousRemoteCmd(const QString &workingDirectory, QStringList remoteArgs, + VcsBase::VcsCommand *asyncForEachRefCmd(const Utils::FilePath &workingDirectory, QStringList args) const; + bool synchronousRemoteCmd(const Utils::FilePath &workingDirectory, QStringList remoteArgs, QString *output = nullptr, QString *errorMessage = nullptr, bool silent = false) const; - QMap<QString,QString> synchronousRemotesList(const QString &workingDirectory, + QMap<QString,QString> synchronousRemotesList(const Utils::FilePath &workingDirectory, QString *errorMessage = nullptr) const; - QStringList synchronousSubmoduleStatus(const QString &workingDirectory, + QStringList synchronousSubmoduleStatus(const Utils::FilePath &workingDirectory, QString *errorMessage = nullptr) const; - SubmoduleDataMap submoduleList(const QString &workingDirectory) const; - QByteArray synchronousShow(const QString &workingDirectory, const QString &id, + SubmoduleDataMap submoduleList(const Utils::FilePath &workingDirectory) const; + QByteArray synchronousShow(const Utils::FilePath &workingDirectory, const QString &id, unsigned flags = 0) const; - bool synchronousRevListCmd(const QString &workingDirectory, const QStringList &extraArguments, + bool synchronousRevListCmd(const Utils::FilePath &workingDirectory, const QStringList &extraArguments, QString *output, QString *errorMessage = nullptr) const; - bool synchronousParentRevisions(const QString &workingDirectory, + bool synchronousParentRevisions(const Utils::FilePath &workingDirectory, const QString &revision, QStringList *parents, QString *errorMessage) const; - QString synchronousShortDescription(const QString &workingDirectory, const QString &revision) const; - QString synchronousShortDescription(const QString &workingDirectory, const QString &revision, + QString synchronousShortDescription(const Utils::FilePath &workingDirectory, const QString &revision) const; + QString synchronousShortDescription(const Utils::FilePath &workingDirectory, const QString &revision, const QString &format) const; - QString synchronousCurrentLocalBranch(const QString &workingDirectory) const; + QString synchronousCurrentLocalBranch(const Utils::FilePath &workingDirectory) const; - bool synchronousHeadRefs(const QString &workingDirectory, QStringList *output, + bool synchronousHeadRefs(const Utils::FilePath &workingDirectory, QStringList *output, QString *errorMessage = nullptr) const; - QString synchronousTopic(const QString &workingDirectory) const; - bool synchronousRevParseCmd(const QString &workingDirectory, const QString &ref, + QString synchronousTopic(const Utils::FilePath &workingDirectory) const; + bool synchronousRevParseCmd(const Utils::FilePath &workingDirectory, const QString &ref, QString *output, QString *errorMessage = nullptr) const; - QString synchronousTopRevision(const QString &workingDirectory, QDateTime *dateTime = nullptr); - void synchronousTagsForCommit(const QString &workingDirectory, const QString &revision, + QString synchronousTopRevision(const Utils::FilePath &workingDirectory, QDateTime *dateTime = nullptr); + void synchronousTagsForCommit(const Utils::FilePath &workingDirectory, const QString &revision, QString &precedes, QString &follows) const; - bool isRemoteCommit(const QString &workingDirectory, const QString &commit); - bool isFastForwardMerge(const QString &workingDirectory, const QString &branch); + bool isRemoteCommit(const Utils::FilePath &workingDirectory, const QString &commit); + bool isFastForwardMerge(const Utils::FilePath &workingDirectory, const QString &branch); - void fetch(const QString &workingDirectory, const QString &remote); - void pull(const QString &workingDirectory, bool rebase); - void push(const QString &workingDirectory, const QStringList &pushArgs = QStringList()); - bool synchronousMerge(const QString &workingDirectory, const QString &branch, + void fetch(const Utils::FilePath &workingDirectory, const QString &remote); + void pull(const Utils::FilePath &workingDirectory, bool rebase); + void push(const Utils::FilePath &workingDirectory, const QStringList &pushArgs = {}); + bool synchronousMerge(const Utils::FilePath &workingDirectory, const QString &branch, bool allowFastForward = true); - bool canRebase(const QString &workingDirectory) const; - void rebase(const QString &workingDirectory, const QString &argument); - void cherryPick(const QString &workingDirectory, const QString &argument); - void revert(const QString &workingDirectory, const QString &argument); - - bool synchronousRevert(const QString &workingDirectory, const QString &commit); - bool synchronousCherryPick(const QString &workingDirectory, const QString &commit); - void interactiveRebase(const QString &workingDirectory, const QString &commit, bool fixup); - void synchronousAbortCommand(const QString &workingDir, const QString &abortCommand); - QString synchronousTrackingBranch(const QString &workingDirectory, - const QString &branch = QString()); - bool synchronousSetTrackingBranch(const QString &workingDirectory, + bool canRebase(const Utils::FilePath &workingDirectory) const; + void rebase(const Utils::FilePath &workingDirectory, const QString &argument); + void cherryPick(const Utils::FilePath &workingDirectory, const QString &argument); + void revert(const Utils::FilePath &workingDirectory, const QString &argument); + + bool synchronousRevert(const Utils::FilePath &workingDirectory, const QString &commit); + bool synchronousCherryPick(const Utils::FilePath &workingDirectory, const QString &commit); + void interactiveRebase(const Utils::FilePath &workingDirectory, const QString &commit, bool fixup); + void synchronousAbortCommand(const Utils::FilePath &workingDir, const QString &abortCommand); + QString synchronousTrackingBranch(const Utils::FilePath &workingDirectory, + const QString &branch = {}); + bool synchronousSetTrackingBranch(const Utils::FilePath &workingDirectory, const QString &branch, const QString &tracking); // git svn support (asynchronous). - void synchronousSubversionFetch(const QString &workingDirectory) const; - void subversionLog(const QString &workingDirectory) const; - void subversionDeltaCommit(const QString &workingDirectory) const; + void synchronousSubversionFetch(const Utils::FilePath &workingDirectory) const; + void subversionLog(const Utils::FilePath &workingDirectory) const; + void subversionDeltaCommit(const Utils::FilePath &workingDirectory) const; - void stashPop(const QString &workingDirectory, const QString &stash = QString()); + void stashPop(const Utils::FilePath &workingDirectory, const QString &stash = {}); void revert(const QStringList &files, bool revertStaging); - bool synchronousStashList(const QString &workingDirectory, QList<Stash> *stashes, + bool synchronousStashList(const Utils::FilePath &workingDirectory, QList<Stash> *stashes, QString *errorMessage = nullptr) const; // Resolve a stash name from message (for IVersionControl's names). - bool stashNameFromMessage(const QString &workingDirectory, const QString &messge, QString *name, + bool stashNameFromMessage(const Utils::FilePath &workingDirectory, const QString &messge, QString *name, QString *errorMessage = nullptr) const; - QString readGitVar(const QString &workingDirectory, const QString &configVar) const; - QString readConfigValue(const QString &workingDirectory, const QString &configVar) const; - void setConfigValue(const QString &workingDirectory, const QString &configVar, + QString readGitVar(const Utils::FilePath &workingDirectory, const QString &configVar) const; + QString readConfigValue(const Utils::FilePath &workingDirectory, const QString &configVar) const; + void setConfigValue(const Utils::FilePath &workingDirectory, const QString &configVar, const QString &value) const; - QTextCodec *encoding(const QString &workingDirectory, const QString &configVar) const; - bool readDataFromCommit(const QString &repoDirectory, const QString &commit, + QTextCodec *encoding(const Utils::FilePath &workingDirectory, const QString &configVar) const; + bool readDataFromCommit(const Utils::FilePath &repoDirectory, const QString &commit, CommitData &commitData, QString *errorMessage = nullptr, QString *commitTemplate = nullptr); - bool getCommitData(const QString &workingDirectory, QString *commitTemplate, + bool getCommitData(const Utils::FilePath &workingDirectory, QString *commitTemplate, CommitData &commitData, QString *errorMessage); - bool addAndCommit(const QString &workingDirectory, + bool addAndCommit(const Utils::FilePath &workingDirectory, const GitSubmitEditorPanelData &data, CommitType commitType, const QString &amendSHA1, @@ -324,53 +324,54 @@ public: VcsBase::SubmitFileModel *model); enum StatusResult { StatusChanged, StatusUnchanged, StatusFailed }; - StatusResult gitStatus(const QString &workingDirectory, StatusMode mode, + StatusResult gitStatus(const Utils::FilePath &workingDirectory, StatusMode mode, QString *output = nullptr, QString *errorMessage = nullptr) const; - CommandInProgress checkCommandInProgress(const QString &workingDirectory) const; - QString commandInProgressDescription(const QString &workingDirectory) const; + CommandInProgress checkCommandInProgress(const Utils::FilePath &workingDirectory) const; + QString commandInProgressDescription(const Utils::FilePath &workingDirectory) const; - void continueCommandIfNeeded(const QString &workingDirectory, bool allowContinue = true); + void continueCommandIfNeeded(const Utils::FilePath &workingDirectory, bool allowContinue = true); - QString extendedShowDescription(const QString &workingDirectory, const QString &text) const; + QString extendedShowDescription(const Utils::FilePath &workingDirectory, const QString &text) const; - void launchGitK(const QString &workingDirectory, const QString &fileName) const; - void launchGitK(const QString &workingDirectory) const { launchGitK(workingDirectory, QString()); } - bool launchGitGui(const QString &workingDirectory); + void launchGitK(const Utils::FilePath &workingDirectory, const QString &fileName) const; + void launchGitK(const Utils::FilePath &workingDirectory) const { launchGitK(workingDirectory, QString()); } + bool launchGitGui(const Utils::FilePath &workingDirectory); Utils::FilePath gitBinDirectory() const; - bool launchGitBash(const QString &workingDirectory); + bool launchGitBash(const Utils::FilePath &workingDirectory); - void launchRepositoryBrowser(const QString &workingDirectory) const; + void launchRepositoryBrowser(const Utils::FilePath &workingDirectory) const; QStringList synchronousRepositoryBranches(const QString &repositoryURL, - const QString &workingDirectory = QString()) const; + const Utils::FilePath &workingDirectory = {}) const; Utils::Environment processEnvironment() const override; - bool beginStashScope(const QString &workingDirectory, const QString &command, + bool beginStashScope(const Utils::FilePath &workingDirectory, const QString &command, StashFlag flag = Default, PushAction pushAction = NoPush); - StashInfo &stashInfo(const QString &workingDirectory); - void endStashScope(const QString &workingDirectory); + StashInfo &stashInfo(const Utils::FilePath &workingDirectory); + void endStashScope(const Utils::FilePath &workingDirectory); bool isValidRevision(const QString &revision) const; - void handleMergeConflicts(const QString &workingDir, const QString &commit, const QStringList &files, const QString &abortCommand); + void handleMergeConflicts(const Utils::FilePath &workingDir, const QString &commit, + const QStringList &files, const QString &abortCommand); void addFuture(const QFuture<void> &future); static QString msgNoChangedFiles(); static QString msgNoCommits(bool includeRemote); - void show(const QString &source, const QString &id, const QString &name = QString()); - void archive(const QString &workingDirectory, QString commit); + void show(const QString &source, const QString &id, const QString &name = {}); + void archive(const Utils::FilePath &workingDirectory, QString commit); - VcsBase::VcsCommand *asyncUpstreamStatus(const QString &workingDirectory, + VcsBase::VcsCommand *asyncUpstreamStatus(const Utils::FilePath &workingDirectory, const QString &branch, const QString &upstream); enum class BranchTargetType { Remote, Commit }; static QString suggestedLocalBranchName( - const QString &workingDirectory, const QStringList &existingLocalNames, + const Utils::FilePath &workingDirectory, const QStringList &existingLocalNames, const QString &target, BranchTargetType targetType); static void addChangeActions(QMenu *menu, const QString &source, const QString &change); - static QString fileWorkingDirectory(const QString &file); + static Utils::FilePath fileWorkingDirectory(const QString &file); enum class ShowEditor { OnlyIfDifferent, Always }; - Core::IEditor *openShowEditor(const QString &workingDirectory, const QString &ref, + Core::IEditor *openShowEditor(const Utils::FilePath &workingDirectory, const QString &ref, const QString &path, ShowEditor showSetting = ShowEditor::Always); private: @@ -382,15 +383,16 @@ private: const QString &patch, bool revert); enum CodecType { CodecSource, CodecLogOutput, CodecNone }; - QTextCodec *codecFor(CodecType codecType, const QString &source = QString()) const; + QTextCodec *codecFor(CodecType codecType, const Utils::FilePath &source = {}) const; - void requestReload(const QString &documentId, const QString &source, const QString &title, const QString &workingDirectory, - std::function<GitBaseDiffEditorController *(Core::IDocument *)> factory) const; + void requestReload(const QString &documentId, const QString &source, const QString &title, + const Utils::FilePath &workingDirectory, + std::function<GitBaseDiffEditorController *(Core::IDocument *)> factory) const; // determine version as '(major << 16) + (minor << 8) + patch' or 0. unsigned synchronousGitVersion(QString *errorMessage = nullptr) const; - QString readOneLine(const QString &workingDirectory, const QStringList &arguments) const; + QString readOneLine(const Utils::FilePath &workingDirectory, const QStringList &arguments) const; enum RevertResult { RevertOk, RevertUnchanged, RevertCanceled, RevertFailed }; RevertResult revertI(QStringList files, @@ -398,13 +400,14 @@ private: QString *errorMessage, bool revertStaging); void connectRepositoryChanged(const QString & repository, VcsBase::VcsCommand *cmd); - bool executeAndHandleConflicts(const QString &workingDirectory, const QStringList &arguments, - const QString &abortCommand = QString()) const; + bool executeAndHandleConflicts(const Utils::FilePath &workingDirectory, const QStringList &arguments, + const QString &abortCommand = {}) const; bool tryLauchingGitK(const Utils::Environment &env, - const QString &workingDirectory, + const Utils::FilePath &workingDirectory, const QString &fileName, const QString &gitBinDirectory) const; - bool cleanList(const QString &workingDirectory, const QString &modulePath, const QString &flag, QStringList *files, QString *errorMessage); + bool cleanList(const Utils::FilePath &workingDirectory, const QString &modulePath, + const QString &flag, QStringList *files, QString *errorMessage); enum ContinueCommandMode { ContinueOnly, @@ -412,7 +415,7 @@ private: SkipIfNoChanges }; - void continuePreviousGitCommand(const QString &workingDirectory, const QString &msgBoxTitle, + void continuePreviousGitCommand(const Utils::FilePath &workingDirectory, const QString &msgBoxTitle, QString msgBoxText, const QString &buttonName, const QString &gitCommand, ContinueCommandMode continueMode); @@ -420,10 +423,10 @@ private: mutable unsigned m_cachedGitVersion = 0; QString m_gitQtcEditor; - QMap<QString, StashInfo> m_stashInfo; + QMap<Utils::FilePath, StashInfo> m_stashInfo; QString m_pushFallbackCommand; QString m_diffCommit; - QStringList m_updatedSubmodules; + Utils::FilePaths m_updatedSubmodules; bool m_disableEditor = false; Utils::FutureSynchronizer m_synchronizer; // for commit updates }; diff --git a/src/plugins/git/giteditor.cpp b/src/plugins/git/giteditor.cpp index 476f0d2cd55..86823707762 100644 --- a/src/plugins/git/giteditor.cpp +++ b/src/plugins/git/giteditor.cpp @@ -54,6 +54,7 @@ #define CHANGE_PATTERN "[a-f0-9]{7,40}" +using namespace Utils; using namespace VcsBase; namespace Git { @@ -235,7 +236,7 @@ void GitEditorWidget::applyDiffChunk(const DiffChunk& chunk, bool revert) if (!patchFile.open()) return; - const QString baseDir = workingDirectory(); + const FilePath baseDir = workingDirectory(); patchFile.write(chunk.header); patchFile.write(chunk.chunk); patchFile.close(); @@ -290,8 +291,8 @@ void GitEditorWidget::aboutToOpen(const Utils::FilePath &filePath, Utils::Id editorId = textDocument()->id(); if (editorId == Git::Constants::GIT_COMMIT_TEXT_EDITOR_ID || editorId == Git::Constants::GIT_REBASE_EDITOR_ID) { - const QString gitPath = filePath.absolutePath().toString(); - setSource(gitPath); + const FilePath gitPath = filePath.absolutePath(); + setSource(gitPath.toString()); textDocument()->setCodec( GitClient::instance()->encoding(gitPath, "i18n.commitEncoding")); } @@ -361,7 +362,7 @@ QString GitEditorWidget::fileNameForLine(int line) const return source(); } -QString GitEditorWidget::sourceWorkingDirectory() const +FilePath GitEditorWidget::sourceWorkingDirectory() const { return GitClient::fileWorkingDirectory(source()); } diff --git a/src/plugins/git/giteditor.h b/src/plugins/git/giteditor.h index 6eaf454a356..4f07d459f56 100644 --- a/src/plugins/git/giteditor.h +++ b/src/plugins/git/giteditor.h @@ -29,7 +29,10 @@ #include <QRegularExpression> -namespace Utils { class FancyLineEdit; } +namespace Utils { +class FancyLineEdit; +class FilePath; +} // Utils namespace Git { namespace Internal { @@ -69,7 +72,7 @@ private: QString revisionSubject(const QTextBlock &inBlock) const override; bool supportChangeLinks() const override; QString fileNameForLine(int line) const override; - QString sourceWorkingDirectory() const; + Utils::FilePath sourceWorkingDirectory() const; const QRegularExpression m_changeNumberPattern; GitLogFilterWidget *m_logFilterWidget = nullptr; diff --git a/src/plugins/git/gitgrep.cpp b/src/plugins/git/gitgrep.cpp index aef8cd720c9..0be7bc0dbbb 100644 --- a/src/plugins/git/gitgrep.cpp +++ b/src/plugins/git/gitgrep.cpp @@ -79,7 +79,7 @@ public: GitGrepRunner(const TextEditor::FileFindParameters ¶meters) : m_parameters(parameters) { - m_directory = parameters.additionalParameters.toString(); + m_directory = FilePath::fromString(parameters.additionalParameters.toString()); m_command.reset(GitClient::instance()->createCommand(m_directory)); m_vcsBinary = GitClient::instance()->vcsBinary(); } @@ -106,7 +106,7 @@ public: QString filePath = line.left(lineSeparator); if (!m_ref.isEmpty() && filePath.startsWith(m_ref)) filePath.remove(0, m_ref.length()); - single.fileName = m_directory + '/' + filePath; + single.fileName = m_directory.pathAppended(filePath).toString(); const int textSeparator = line.indexOf(QChar::Null, lineSeparator + 1); single.lineNumber = line.mid(lineSeparator + 1, textSeparator - lineSeparator - 1).toInt(); QString text = line.mid(textSeparator + 1); @@ -217,7 +217,7 @@ public: private: FilePath m_vcsBinary; - QString m_directory; + FilePath m_directory; QString m_ref; TextEditor::FileFindParameters m_parameters; std::unique_ptr<VcsCommand> m_command; @@ -225,7 +225,7 @@ private: } // namespace -static bool isGitDirectory(const QString &path) +static bool isGitDirectory(const FilePath &path) { static IVersionControl *gitVc = VcsManager::versionControl(VcsBase::Constants::VCS_ID_GIT); QTC_ASSERT(gitVc, return false); @@ -253,7 +253,7 @@ GitGrep::GitGrep(GitClient *client) QTC_ASSERT(findInFiles, return); connect(findInFiles, &TextEditor::FindInFiles::pathChanged, m_widget, [this](const QString &path) { - setEnabled(isGitDirectory(path)); + setEnabled(isGitDirectory(FilePath::fromString(path))); }); connect(this, &SearchEngine::enabledChanged, m_widget, &QWidget::setEnabled); findInFiles->addSearchEngine(this); @@ -314,7 +314,7 @@ IEditor *GitGrep::openEditor(const SearchResultItem &item, if (params.ref.isEmpty() || item.path().isEmpty()) return nullptr; const QString path = QDir::fromNativeSeparators(item.path().first()); - const QString topLevel = parameters.additionalParameters.toString(); + const FilePath topLevel = FilePath::fromString(parameters.additionalParameters.toString()); IEditor *editor = m_client->openShowEditor( topLevel, params.ref, path, GitClient::ShowEditor::OnlyIfDifferent); if (editor) diff --git a/src/plugins/git/gitplugin.cpp b/src/plugins/git/gitplugin.cpp index 46188534e0c..a9f6d312bbe 100644 --- a/src/plugins/git/gitplugin.cpp +++ b/src/plugins/git/gitplugin.cpp @@ -104,7 +104,7 @@ using namespace std::placeholders; namespace Git { namespace Internal { -using GitClientMemberFunc = void (GitClient::*)(const QString &) const; +using GitClientMemberFunc = void (GitClient::*)(const FilePath &) const; class GitTopicCache : public Core::IVersionControl::TopicCache { @@ -116,13 +116,13 @@ public: protected: FilePath trackFile(const FilePath &repository) override { - const QString gitDir = m_client->findGitDirForRepository(repository.toString()); + const QString gitDir = m_client->findGitDirForRepository(repository); return gitDir.isEmpty() ? FilePath() : FilePath::fromString(gitDir + "/HEAD"); } QString refreshTopic(const FilePath &repository) override { - return m_client->synchronousTopic(repository.toString()); + return m_client->synchronousTopic(repository); } private: @@ -244,13 +244,13 @@ public: bool isConfigured() const final; bool supportsOperation(Operation operation) const final; - bool vcsOpen(const FilePath &fileName) final; - bool vcsAdd(const FilePath &fileName) final; - bool vcsDelete(const FilePath &filename) final; + bool vcsOpen(const FilePath &filePath) final; + bool vcsAdd(const FilePath &filePath) final; + bool vcsDelete(const FilePath &filePath) final; bool vcsMove(const FilePath &from, const FilePath &to) final; bool vcsCreateRepository(const FilePath &directory) final; - void vcsAnnotate(const FilePath &file, int line) final; + void vcsAnnotate(const FilePath &filePath, int line) final; void vcsDescribe(const FilePath &source, const QString &id) final { m_gitClient.show(source.toString(), id); }; QString vcsTopic(const FilePath &directory) final; @@ -274,7 +274,7 @@ public: bool handleLink(const FilePath &workingDirectory, const QString &reference) final { if (reference.contains("..")) - GitClient::instance()->log(workingDirectory.toString(), {}, false, {reference}); + GitClient::instance()->log(workingDirectory, {}, false, {reference}); else GitClient::instance()->show(workingDirectory.toString(), reference); return true; @@ -286,12 +286,12 @@ public: bool isCommitEditorOpen() const; void startCommit(CommitType commitType = SimpleCommit); - void updateBranches(const QString &repository); + void updateBranches(const FilePath &repository); void updateCurrentBranch(); void manageRemotes(); void initRepository(); - void startRebaseFromCommit(const QString &workingDirectory, QString commit); + void startRebaseFromCommit(const FilePath &workingDirectory, QString commit); void updateActions(VcsBase::VcsBasePluginPrivate::ActionState) override; bool submitEditorAboutToClose() override; @@ -371,8 +371,8 @@ public: void updateRepositoryBrowserAction(); Core::IEditor *openSubmitEditor(const QString &fileName, const CommitData &cd); void cleanCommitMessageFile(); - void cleanRepository(const QString &directory); - void applyPatch(const QString &workingDirectory, QString file = QString()); + void cleanRepository(const FilePath &directory); + void applyPatch(const FilePath &workingDirectory, QString file = QString()); void updateVersionWarning(); @@ -406,7 +406,7 @@ public: QPointer<StashDialog> m_stashDialog; BranchViewFactory m_branchViewFactory; QPointer<RemoteDialog> m_remoteDialog; - QString m_submitRepository; + FilePath m_submitRepository; QString m_commitMessageFileName; bool m_submitActionTriggered = false; @@ -514,11 +514,11 @@ const VcsBasePluginState &GitPlugin::currentState() return dd->currentState(); } -QString GitPlugin::msgRepositoryLabel(const QString &repository) +QString GitPlugin::msgRepositoryLabel(const FilePath &repository) { return repository.isEmpty() ? tr("<No repository>") : - tr("Repository: %1").arg(QDir::toNativeSeparators(repository)); + tr("Repository: %1").arg(repository.toUserOutput()); } // Returns a regular expression pattern with characters not allowed @@ -1157,11 +1157,11 @@ void GitPluginPrivate::resetRepository() return; const VcsBasePluginState state = currentState(); QTC_ASSERT(state.hasTopLevel(), return); - QString topLevel = state.topLevel(); + FilePath topLevel = state.topLevel(); LogChangeDialog dialog(true, ICore::dialogParent()); ResetItemDelegate delegate(dialog.widget()); - dialog.setWindowTitle(tr("Undo Changes to %1").arg(QDir::toNativeSeparators(topLevel))); + dialog.setWindowTitle(tr("Undo Changes to %1").arg(topLevel.toUserOutput())); if (dialog.runDialog(topLevel, QString(), LogChangeWidget::IncludeRemotes)) m_gitClient.reset(topLevel, dialog.resetFlag(), dialog.commit()); } @@ -1179,12 +1179,12 @@ void GitPluginPrivate::startRebase() { const VcsBasePluginState state = currentState(); QTC_ASSERT(state.hasTopLevel(), return); - const QString topLevel = state.topLevel(); + const FilePath topLevel = state.topLevel(); startRebaseFromCommit(topLevel, QString()); } -void GitPluginPrivate::startRebaseFromCommit(const QString &workingDirectory, QString commit) +void GitPluginPrivate::startRebaseFromCommit(const FilePath &workingDirectory, QString commit) { if (!DocumentManager::saveAllModifiedDocuments()) return; @@ -1208,7 +1208,8 @@ void GitPluginPrivate::startChangeRelatedAction(const Id &id) { const VcsBasePluginState state = currentState(); - ChangeSelectionDialog dialog(state.hasTopLevel() ? state.topLevel() : PathChooser::homePath(), + ChangeSelectionDialog dialog(state.hasTopLevel() + ? state.topLevel() : FilePath::fromString(PathChooser::homePath()), id, ICore::dialogParent()); int result = dialog.exec(); @@ -1216,7 +1217,7 @@ void GitPluginPrivate::startChangeRelatedAction(const Id &id) if (result == QDialog::Rejected) return; - const QString workingDirectory = dialog.workingDirectory(); + const FilePath workingDirectory = dialog.workingDirectory(); const QString change = dialog.change(); if (workingDirectory.isEmpty() || change.isEmpty()) @@ -1225,10 +1226,10 @@ void GitPluginPrivate::startChangeRelatedAction(const Id &id) if (dialog.command() == Show) { const int colon = change.indexOf(':'); if (colon > 0) { - const QString path = QDir(workingDirectory).absoluteFilePath(change.mid(colon + 1)); + const QString path = QDir(workingDirectory.toString()).absoluteFilePath(change.mid(colon + 1)); m_gitClient.openShowEditor(workingDirectory, change.left(colon), path); } else { - m_gitClient.show(workingDirectory, change); + m_gitClient.show(workingDirectory.toString(), change); } return; } @@ -1296,14 +1297,14 @@ void GitPluginPrivate::gitkForCurrentFolder() * one line command mentioned above. * */ - QDir dir(state.currentFileDirectory()); + QDir dir(state.currentFileDirectory().toString()); if (QFileInfo(dir,".git").exists() || dir.cd(".git")) { m_gitClient.launchGitK(state.currentFileDirectory()); } else { QString folderName = dir.absolutePath(); dir.cdUp(); folderName = folderName.remove(0, dir.absolutePath().length() + 1); - m_gitClient.launchGitK(dir.absolutePath(), folderName); + m_gitClient.launchGitK(FilePath::fromString(dir.absolutePath()), folderName); } } @@ -1399,7 +1400,7 @@ IEditor *GitPluginPrivate::openSubmitEditor(const QString &fileName, const Commi } IDocument *document = submitEditor->document(); document->setPreferredDisplayName(title); - VcsBase::setSource(document, m_submitRepository); + VcsBase::setSource(document, m_submitRepository.toString()); return editor; } @@ -1488,7 +1489,7 @@ void GitPluginPrivate::pull() return; const VcsBasePluginState state = currentState(); QTC_ASSERT(state.hasTopLevel(), return); - QString topLevel = state.topLevel(); + FilePath topLevel = state.topLevel(); bool rebase = m_settings.pullRebase.value(); if (!rebase) { @@ -1561,7 +1562,7 @@ void GitPluginPrivate::cleanRepository() cleanRepository(state.topLevel()); } -void GitPluginPrivate::cleanRepository(const QString &directory) +void GitPluginPrivate::cleanRepository(const FilePath &directory) { // Find files to be deleted QString errorMessage; @@ -1583,7 +1584,7 @@ void GitPluginPrivate::cleanRepository(const QString &directory) // Show in dialog CleanDialog dialog(ICore::dialogParent()); - dialog.setFileList(directory, files, ignoredFiles); + dialog.setFileList(directory.toString(), files, ignoredFiles); dialog.exec(); } @@ -1618,7 +1619,7 @@ void GitPluginPrivate::promptApplyPatch() applyPatch(state.topLevel(), QString()); } -void GitPluginPrivate::applyPatch(const QString &workingDirectory, QString file) +void GitPluginPrivate::applyPatch(const FilePath &workingDirectory, QString file) { // Ensure user has been notified about pending changes if (!m_gitClient.beginStashScope(workingDirectory, "Apply-Patch", AllowUnstashed)) @@ -1636,7 +1637,8 @@ void GitPluginPrivate::applyPatch(const QString &workingDirectory, QString file) QString errorMessage; if (m_gitClient.synchronousApplyPatch(workingDirectory, file, &errorMessage)) { if (errorMessage.isEmpty()) - VcsOutputWindow::appendMessage(tr("Patch %1 successfully applied to %2").arg(file, workingDirectory)); + VcsOutputWindow::appendMessage(tr("Patch %1 successfully applied to %2") + .arg(file, workingDirectory.toUserOutput())); else VcsOutputWindow::appendError(errorMessage); } else { @@ -1653,7 +1655,7 @@ void GitPluginPrivate::stash(bool unstagedOnly) const VcsBasePluginState state = currentState(); QTC_ASSERT(state.hasTopLevel(), return); - const QString topLevel = state.topLevel(); + const FilePath topLevel = state.topLevel(); m_gitClient.executeSynchronousStash(topLevel, QString(), unstagedOnly); if (m_stashDialog) m_stashDialog->refresh(topLevel, true); @@ -1679,7 +1681,7 @@ void GitPluginPrivate::stashPop() { if (!DocumentManager::saveAllModifiedDocuments()) return; - const QString repository = currentState().topLevel(); + const FilePath repository = currentState().topLevel(); m_gitClient.stashPop(repository); if (m_stashDialog) m_stashDialog->refresh(repository, true); @@ -1687,7 +1689,7 @@ void GitPluginPrivate::stashPop() // Create a non-modal dialog with refresh function or raise if it exists template <class NonModalDialog> - inline void showNonModalDialog(const QString &topLevel, + inline void showNonModalDialog(const FilePath &topLevel, QPointer<NonModalDialog> &dialog) { if (dialog) { @@ -1798,7 +1800,7 @@ void GitPluginPrivate::delayedPushToGerrit() m_gerritPlugin->push(m_submitRepository); } -void GitPluginPrivate::updateBranches(const QString &repository) +void GitPluginPrivate::updateBranches(const FilePath &repository) { if (m_branchViewFactory.view()) m_branchViewFactory.view()->refreshIfSame(repository); @@ -1880,21 +1882,19 @@ bool GitPluginPrivate::vcsOpen(const FilePath & /*filePath*/) bool GitPluginPrivate::vcsAdd(const FilePath &filePath) { - const QFileInfo fi = filePath.toFileInfo(); - return m_gitClient.synchronousAdd(fi.absolutePath(), {fi.fileName()}, {"--intent-to-add"}); + return m_gitClient.synchronousAdd(filePath.parentDir(), {filePath.fileName()}, {"--intent-to-add"}); } bool GitPluginPrivate::vcsDelete(const FilePath &filePath) { - const QFileInfo fi = filePath.toFileInfo(); - return m_gitClient.synchronousDelete(fi.absolutePath(), true, {fi.fileName()}); + return m_gitClient.synchronousDelete(filePath.parentDir().absolutePath(), true, {filePath.fileName()}); } bool GitPluginPrivate::vcsMove(const FilePath &from, const FilePath &to) { const QFileInfo fromInfo = from.toFileInfo(); const QFileInfo toInfo = to.toFileInfo(); - return m_gitClient.synchronousMove(fromInfo.absolutePath(), fromInfo.absoluteFilePath(), toInfo.absoluteFilePath()); + return m_gitClient.synchronousMove(from.parentDir().absolutePath(), fromInfo.absoluteFilePath(), toInfo.absoluteFilePath()); } bool GitPluginPrivate::vcsCreateRepository(const FilePath &directory) @@ -1905,7 +1905,7 @@ bool GitPluginPrivate::vcsCreateRepository(const FilePath &directory) QString GitPluginPrivate::vcsTopic(const FilePath &directory) { QString topic = Core::IVersionControl::vcsTopic(directory); - const QString commandInProgress = m_gitClient.commandInProgressDescription(directory.toString()); + const QString commandInProgress = m_gitClient.commandInProgressDescription(directory); if (!commandInProgress.isEmpty()) topic += " (" + commandInProgress + ')'; return topic; @@ -1919,7 +1919,7 @@ Core::ShellCommand *GitPluginPrivate::createInitialCheckoutCommand(const QString QStringList args = {"clone", "--progress"}; args << extraArgs << url << localName; - auto command = new VcsBase::VcsCommand(baseDirectory.toString(), m_gitClient.processEnvironment()); + auto command = new VcsBase::VcsCommand(baseDirectory, m_gitClient.processEnvironment()); command->addFlags(VcsBase::VcsCommand::SuppressStdErr); command->addJob({m_gitClient.vcsBinary(), args}, -1); return command; @@ -1949,7 +1949,7 @@ bool GitPluginPrivate::managesDirectory(const FilePath &directory, FilePath *top bool GitPluginPrivate::managesFile(const FilePath &workingDirectory, const QString &fileName) const { - return m_gitClient.managesFile(workingDirectory.toString(), fileName); + return m_gitClient.managesFile(workingDirectory, fileName); } FilePaths GitPluginPrivate::unmanagedFiles(const FilePaths &filePaths) const @@ -1959,8 +1959,7 @@ FilePaths GitPluginPrivate::unmanagedFiles(const FilePaths &filePaths) const void GitPluginPrivate::vcsAnnotate(const FilePath &filePath, int line) { - const QFileInfo fi = filePath.toFileInfo(); - m_gitClient.annotate(fi.absolutePath(), fi.fileName(), QString(), line); + m_gitClient.annotate(filePath.absolutePath(), filePath.fileName(), QString(), line); } void GitPlugin::emitFilesChanged(const QStringList &l) @@ -1970,10 +1969,10 @@ void GitPlugin::emitFilesChanged(const QStringList &l) void GitPlugin::emitRepositoryChanged(const QString &r) { - emit dd->repositoryChanged(r); + emit dd->repositoryChanged(FilePath::fromString(r)); } -void GitPlugin::startRebaseFromCommit(const QString &workingDirectory, const QString &commit) +void GitPlugin::startRebaseFromCommit(const FilePath &workingDirectory, const QString &commit) { dd->startRebaseFromCommit(workingDirectory, commit); } @@ -1998,12 +1997,12 @@ void GitPlugin::updateCurrentBranch() dd->updateCurrentBranch(); } -void GitPlugin::updateBranches(const QString &repository) +void GitPlugin::updateBranches(const FilePath &repository) { dd->updateBranches(repository); } -void GitPlugin::gerritPush(const QString &topLevel) +void GitPlugin::gerritPush(const FilePath &topLevel) { dd->m_gerritPlugin->push(topLevel); } diff --git a/src/plugins/git/gitplugin.h b/src/plugins/git/gitplugin.h index 8275006787d..577e636dc9a 100644 --- a/src/plugins/git/gitplugin.h +++ b/src/plugins/git/gitplugin.h @@ -61,19 +61,19 @@ public: static const GitSettings &settings(); static const VcsBase::VcsBasePluginState ¤tState(); - static QString msgRepositoryLabel(const QString &repository); + static QString msgRepositoryLabel(const Utils::FilePath &repository); static QString invalidBranchAndRemoteNamePattern(); static bool isCommitEditorOpen(); static void emitFilesChanged(const QStringList &); static void emitRepositoryChanged(const QString &); - static void startRebaseFromCommit(const QString &workingDirectory, const QString &commit); + static void startRebaseFromCommit(const Utils::FilePath &workingDirectory, const QString &commit); static void manageRemotes(); static void initRepository(); static void startCommit(); static void updateCurrentBranch(); - static void updateBranches(const QString &repository); - static void gerritPush(const QString &topLevel); + static void updateBranches(const Utils::FilePath &repository); + static void gerritPush(const Utils::FilePath &topLevel); #ifdef WITH_TESTS private slots: diff --git a/src/plugins/git/gitsubmiteditor.cpp b/src/plugins/git/gitsubmiteditor.cpp index ba5c0eead88..cd418bdecd5 100644 --- a/src/plugins/git/gitsubmiteditor.cpp +++ b/src/plugins/git/gitsubmiteditor.cpp @@ -43,6 +43,7 @@ static const char TASK_UPDATE_COMMIT[] = "Git.UpdateCommit"; +using namespace Utils; using namespace VcsBase; namespace Git { @@ -83,7 +84,7 @@ private: } }; -CommitDataFetchResult CommitDataFetchResult::fetch(CommitType commitType, const QString &workingDirectory) +CommitDataFetchResult CommitDataFetchResult::fetch(CommitType commitType, const FilePath &workingDirectory) { CommitDataFetchResult result; result.commitData.commitType = commitType; @@ -135,7 +136,7 @@ void GitSubmitEditor::setCommitData(const CommitData &d) setEmptyFileListEnabled(m_commitType == AmendCommit); // Allow for just correcting the message m_model = new GitSubmitFileModel(this); - m_model->setRepositoryRoot(d.panelInfo.repository); + m_model->setRepositoryRoot(d.panelInfo.repository.toString()); m_model->setFileStatusQualifier([](const QString &, const QVariant &extraData) -> SubmitFileModel::FileStatusHint { @@ -196,7 +197,7 @@ void GitSubmitEditor::slotDiffSelected(const QList<int> &rows) } stagedFiles.push_back(fileName); } else if (state == UntrackedFile) { - Core::EditorManager::openEditor(m_workingDirectory + '/' + fileName); + Core::EditorManager::openEditor(m_workingDirectory.pathAppended(fileName)); } else { unstagedFiles.push_back(fileName); } @@ -210,7 +211,7 @@ void GitSubmitEditor::slotDiffSelected(const QList<int> &rows) void GitSubmitEditor::showCommit(const QString &commit) { if (!m_workingDirectory.isEmpty()) - GitClient::instance()->show(m_workingDirectory, commit); + GitClient::instance()->show(m_workingDirectory.toString(), commit); } void GitSubmitEditor::updateFileModel() diff --git a/src/plugins/git/gitsubmiteditor.h b/src/plugins/git/gitsubmiteditor.h index 99c6ea81e97..f7d790dceb4 100644 --- a/src/plugins/git/gitsubmiteditor.h +++ b/src/plugins/git/gitsubmiteditor.h @@ -27,6 +27,8 @@ #include "commitdata.h" +#include <utils/filepath.h> + #include <vcsbase/vcsbasesubmiteditor.h> #include <QFutureWatcher> @@ -43,7 +45,7 @@ class GitSubmitEditorPanelData; class CommitDataFetchResult { public: - static CommitDataFetchResult fetch(CommitType commitType, const QString &workingDirectory); + static CommitDataFetchResult fetch(CommitType commitType, const Utils::FilePath &workingDirectory); QString errorMessage; CommitData commitData; @@ -80,7 +82,7 @@ private: QTextCodec *m_commitEncoding = nullptr; CommitType m_commitType = SimpleCommit; QString m_amendSHA1; - QString m_workingDirectory; + Utils::FilePath m_workingDirectory; bool m_firstUpdate = true; QFutureWatcher<CommitDataFetchResult> m_fetchWatcher; }; diff --git a/src/plugins/git/gitsubmiteditorwidget.cpp b/src/plugins/git/gitsubmiteditorwidget.cpp index 68507b68910..02328d28980 100644 --- a/src/plugins/git/gitsubmiteditorwidget.cpp +++ b/src/plugins/git/gitsubmiteditorwidget.cpp @@ -29,7 +29,9 @@ #include "logchangedialog.h" #include <coreplugin/coreconstants.h> + #include <utils/completingtextedit.h> +#include <utils/filepath.h> #include <utils/theme/theme.h> #include <utils/utilsicons.h> @@ -41,6 +43,8 @@ #include <QVBoxLayout> #include <QMenu> +using namespace Utils; + namespace Git { namespace Internal { @@ -65,7 +69,7 @@ GitSubmitEditorWidget::GitSubmitEditorWidget() : void GitSubmitEditorWidget::setPanelInfo(const GitSubmitEditorPanelInfo &info) { - m_gitSubmitPanelUi.repositoryLabel->setText(QDir::toNativeSeparators(info.repository)); + m_gitSubmitPanelUi.repositoryLabel->setText(info.repository.toUserOutput()); if (info.branch.contains("(no branch)")) { const QString errorColor = Utils::creatorTheme()->color(Utils::Theme::TextColorError).name(); @@ -87,7 +91,7 @@ void GitSubmitEditorWidget::setHasUnmerged(bool e) } void GitSubmitEditorWidget::initialize(CommitType commitType, - const QString &repository, + const FilePath &repository, const GitSubmitEditorPanelData &data, const GitSubmitEditorPanelInfo &info, bool enablePush) @@ -123,7 +127,7 @@ void GitSubmitEditorWidget::initialize(CommitType commitType, } } -void GitSubmitEditorWidget::refreshLog(const QString &repository) +void GitSubmitEditorWidget::refreshLog(const FilePath &repository) { if (m_logChangeWidget) m_logChangeWidget->init(repository); diff --git a/src/plugins/git/gitsubmiteditorwidget.h b/src/plugins/git/gitsubmiteditorwidget.h index 8d925a21a87..137895450be 100644 --- a/src/plugins/git/gitsubmiteditorwidget.h +++ b/src/plugins/git/gitsubmiteditorwidget.h @@ -31,6 +31,7 @@ #include <texteditor/syntaxhighlighter.h> #include <vcsbase/submiteditorwidget.h> +#include <utils/filepath.h> #include <QSyntaxHighlighter> @@ -64,11 +65,11 @@ public: QString amendSHA1() const; void setHasUnmerged(bool e); void initialize(CommitType commitType, - const QString &repository, + const Utils::FilePath &repository, const GitSubmitEditorPanelData &data, const GitSubmitEditorPanelInfo &info, bool enablePush); - void refreshLog(const QString &repository); + void refreshLog(const Utils::FilePath &repository); protected: bool canSubmit(QString *whyNot) const override; diff --git a/src/plugins/git/logchangedialog.cpp b/src/plugins/git/logchangedialog.cpp index bb923ced9df..9b4bc9312be 100644 --- a/src/plugins/git/logchangedialog.cpp +++ b/src/plugins/git/logchangedialog.cpp @@ -42,6 +42,7 @@ #include <QTreeView> #include <QVBoxLayout> +using namespace Utils; using namespace VcsBase; namespace Git { @@ -75,9 +76,9 @@ public: return QStandardItemModel::data(index, role); } - void setWorkingDirectory(const QString &workingDir) { m_workingDirectory = workingDir; } + void setWorkingDirectory(const FilePath &workingDir) { m_workingDirectory = workingDir; } private: - QString m_workingDirectory; + FilePath m_workingDirectory; mutable QHash<QString, QString> m_descriptions; }; @@ -99,7 +100,7 @@ LogChangeWidget::LogChangeWidget(QWidget *parent) setFocus(); } -bool LogChangeWidget::init(const QString &repository, const QString &commit, LogFlags flags) +bool LogChangeWidget::init(const FilePath &repository, const QString &commit, LogFlags flags) { m_model->setWorkingDirectory(repository); if (!populateLog(repository, commit, flags)) @@ -171,7 +172,7 @@ void LogChangeWidget::selectionChanged(const QItemSelection &selected, } } -bool LogChangeWidget::populateLog(const QString &repository, const QString &commit, LogFlags flags) +bool LogChangeWidget::populateLog(const FilePath &repository, const QString &commit, LogFlags flags) { const QString currentCommit = this->commit(); int selected = currentCommit.isEmpty() ? 0 : -1; @@ -232,6 +233,7 @@ const QStandardItem *LogChangeWidget::currentItem(int column) const LogChangeDialog::LogChangeDialog(bool isReset, QWidget *parent) : QDialog(parent) , m_widget(new LogChangeWidget) + , m_dialogButtonBox(new QDialogButtonBox(this)) { auto layout = new QVBoxLayout(this); @@ -262,7 +264,7 @@ LogChangeDialog::LogChangeDialog(bool isReset, QWidget *parent) : resize(600, 400); } -bool LogChangeDialog::runDialog(const QString &repository, +bool LogChangeDialog::runDialog(const FilePath &repository, const QString &commit, LogChangeWidget::LogFlags flags) { diff --git a/src/plugins/git/logchangedialog.h b/src/plugins/git/logchangedialog.h index ebc54371057..263e9d74770 100644 --- a/src/plugins/git/logchangedialog.h +++ b/src/plugins/git/logchangedialog.h @@ -25,6 +25,7 @@ #pragma once +#include <utils/filepath.h> #include <utils/icon.h> #include <utils/itemviews.h> @@ -62,7 +63,7 @@ public: Q_DECLARE_FLAGS(LogFlags, LogFlag) explicit LogChangeWidget(QWidget *parent = nullptr); - bool init(const QString &repository, const QString &commit = QString(), LogFlags flags = None); + bool init(const Utils::FilePath &repository, const QString &commit = {}, LogFlags flags = None); QString commit() const; int commitIndex() const; QString earliestCommit() const; @@ -76,7 +77,7 @@ private: void emitCommitActivated(const QModelIndex &index); void selectionChanged(const QItemSelection &selected, const QItemSelection &deselected) override; - bool populateLog(const QString &repository, const QString &commit, LogFlags flags); + bool populateLog(const Utils::FilePath &repository, const QString &commit, LogFlags flags); const QStandardItem *currentItem(int column = 0) const; LogChangeModel *m_model; @@ -91,7 +92,7 @@ class LogChangeDialog : public QDialog public: LogChangeDialog(bool isReset, QWidget *parent); - bool runDialog(const QString &repository, const QString &commit = QString(), + bool runDialog(const Utils::FilePath &repository, const QString &commit = QString(), LogChangeWidget::LogFlags flags = LogChangeWidget::None); QString commit() const; diff --git a/src/plugins/git/mergetool.cpp b/src/plugins/git/mergetool.cpp index adc5d1ce7b4..8441231b4a1 100644 --- a/src/plugins/git/mergetool.cpp +++ b/src/plugins/git/mergetool.cpp @@ -36,6 +36,7 @@ #include <QProcess> #include <QPushButton> +using namespace Utils; using namespace VcsBase; namespace Git { @@ -263,7 +264,7 @@ void MergeTool::done() VcsOutputWindow::appendError(tr("Merge tool process terminated with exit code %1") .arg(exitCode)); } - GitClient::instance()->continueCommandIfNeeded(workingDirectory, exitCode == 0); + GitClient::instance()->continueCommandIfNeeded(FilePath::fromString(workingDirectory), exitCode == 0); GitPlugin::emitRepositoryChanged(workingDirectory); deleteLater(); } diff --git a/src/plugins/git/remotedialog.cpp b/src/plugins/git/remotedialog.cpp index 6d211e0c7ca..6463433f377 100644 --- a/src/plugins/git/remotedialog.cpp +++ b/src/plugins/git/remotedialog.cpp @@ -38,6 +38,8 @@ #include <QMessageBox> #include <QRegularExpression> +using namespace Utils; + namespace Git { namespace Internal { @@ -152,7 +154,7 @@ RemoteDialog::~RemoteDialog() delete m_ui; } -void RemoteDialog::refresh(const QString &repository, bool force) +void RemoteDialog::refresh(const FilePath &repository, bool force) { if (m_remoteModel->workingDirectory() == repository && !force) return; diff --git a/src/plugins/git/remotedialog.h b/src/plugins/git/remotedialog.h index 1026c2e721f..d8ecab63121 100644 --- a/src/plugins/git/remotedialog.h +++ b/src/plugins/git/remotedialog.h @@ -27,6 +27,8 @@ #include <QDialog> +namespace Utils { class FilePath; } + namespace Git { namespace Internal { @@ -42,7 +44,7 @@ public: explicit RemoteDialog(QWidget *parent = nullptr); ~RemoteDialog() override; - void refresh(const QString &repository, bool force); + void refresh(const Utils::FilePath &repository, bool force); private: void refreshRemotes(); diff --git a/src/plugins/git/remotemodel.cpp b/src/plugins/git/remotemodel.cpp index da2e2fe2d71..71d49397ac3 100644 --- a/src/plugins/git/remotemodel.cpp +++ b/src/plugins/git/remotemodel.cpp @@ -28,6 +28,8 @@ #include <utils/algorithm.h> +using namespace Utils; + namespace Git { namespace Internal { @@ -97,7 +99,7 @@ bool RemoteModel::updateUrl(const QString &name, const QString &newUrl) return success; } -QString RemoteModel::workingDirectory() const +FilePath RemoteModel::workingDirectory() const { return m_workingDirectory; } @@ -179,7 +181,7 @@ void RemoteModel::clear() endResetModel(); } -bool RemoteModel::refresh(const QString &workingDirectory, QString *errorMessage) +bool RemoteModel::refresh(const FilePath &workingDirectory, QString *errorMessage) { m_workingDirectory = workingDirectory; diff --git a/src/plugins/git/remotemodel.h b/src/plugins/git/remotemodel.h index a76c5510042..1ef6b7ffc64 100644 --- a/src/plugins/git/remotemodel.h +++ b/src/plugins/git/remotemodel.h @@ -25,6 +25,8 @@ #pragma once +#include <utils/filepath.h> + #include <QAbstractTableModel> #include <QList> #include <QVariant> @@ -38,7 +40,7 @@ public: explicit RemoteModel(QObject *parent = nullptr); void clear(); - bool refresh(const QString &workingDirectory, QString *errorMessage); + bool refresh(const Utils::FilePath &workingDirectory, QString *errorMessage); QStringList allRemoteNames() const; QString remoteName(int row) const; @@ -60,7 +62,7 @@ public: int remoteCount() const; - QString workingDirectory() const; + Utils::FilePath workingDirectory() const; int findRemoteByName(const QString &name) const; protected: @@ -74,7 +76,7 @@ protected: private: const Qt::ItemFlags m_flags = Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable; - QString m_workingDirectory; + Utils::FilePath m_workingDirectory; RemoteList m_remotes; }; diff --git a/src/plugins/git/stashdialog.cpp b/src/plugins/git/stashdialog.cpp index fcef1a945b0..2763a03618e 100644 --- a/src/plugins/git/stashdialog.cpp +++ b/src/plugins/git/stashdialog.cpp @@ -41,6 +41,8 @@ #include <QMessageBox> #include <QPushButton> +using namespace Utils; + enum { NameColumn, BranchColumn, MessageColumn, ColumnCount }; namespace Git { @@ -150,7 +152,7 @@ StashDialog::~StashDialog() delete ui; } -void StashDialog::refresh(const QString &repository, bool force) +void StashDialog::refresh(const FilePath &repository, bool force) { if (m_repository == repository && !force) return; @@ -205,7 +207,7 @@ void StashDialog::showCurrent() { const int index = currentRow(); QTC_ASSERT(index >= 0, return); - GitClient::instance()->show(m_repository, QString(m_model->at(index).name)); + GitClient::instance()->show(m_repository.toString(), QString(m_model->at(index).name)); } // Suggest Branch name to restore 'stash@{0}' -> 'stash0-date' diff --git a/src/plugins/git/stashdialog.h b/src/plugins/git/stashdialog.h index 5aa8c52213f..96d5a0a8a86 100644 --- a/src/plugins/git/stashdialog.h +++ b/src/plugins/git/stashdialog.h @@ -25,6 +25,8 @@ #pragma once +#include <utils/filepath.h> + #include <QDialog> QT_BEGIN_NAMESPACE @@ -51,7 +53,7 @@ public: explicit StashDialog(QWidget *parent = nullptr); ~StashDialog() override; - void refresh(const QString &repository, bool force); + void refresh(const Utils::FilePath &repository, bool force); private: // Prompt dialog for modified repositories. Ask to undo or stash away. @@ -85,7 +87,7 @@ private: QPushButton *m_restoreCurrentButton; QPushButton *m_restoreCurrentInBranchButton; QPushButton *m_refreshButton; - QString m_repository; + Utils::FilePath m_repository; }; } // namespace Internal diff --git a/src/plugins/mercurial/mercurialclient.cpp b/src/plugins/mercurial/mercurialclient.cpp index cefe23292c3..8fa54da42f6 100644 --- a/src/plugins/mercurial/mercurialclient.cpp +++ b/src/plugins/mercurial/mercurialclient.cpp @@ -91,7 +91,7 @@ MercurialClient::MercurialClient(MercurialSettings *settings) : VcsBaseClient(se { } -bool MercurialClient::manifestSync(const QString &repository, const QString &relativeFilename) +bool MercurialClient::manifestSync(const FilePath &repository, const QString &relativeFilename) { // This only works when called from the repo and outputs paths relative to it. const QStringList args(QLatin1String("manifest")); @@ -99,7 +99,7 @@ bool MercurialClient::manifestSync(const QString &repository, const QString &rel QtcProcess proc; vcsFullySynchronousExec(proc, repository, args); - const QDir repositoryDir(repository); + const QDir repositoryDir(repository.toString()); const QFileInfo needle = QFileInfo(repositoryDir, relativeFilename); const QStringList files = proc.stdOut().split(QLatin1Char('\n')); @@ -112,14 +112,12 @@ bool MercurialClient::manifestSync(const QString &repository, const QString &rel } //bool MercurialClient::clone(const QString &directory, const QString &url) -bool MercurialClient::synchronousClone(const FilePath &workingDir, +bool MercurialClient::synchronousClone(const FilePath &workingDirectory, const QString &srcLocation, const QString &dstLocation, const QStringList &extraOptions) { - Q_UNUSED(workingDir) Q_UNUSED(extraOptions) - QDir workingDirectory(srcLocation); const unsigned flags = VcsCommand::SshPasswordPrompt | VcsCommand::ShowStdOut | VcsCommand::ShowSuccessMessage; @@ -128,7 +126,7 @@ bool MercurialClient::synchronousClone(const FilePath &workingDir, // Let's make first init QStringList arguments(QLatin1String("init")); QtcProcess proc; - vcsFullySynchronousExec(proc, workingDirectory.path(), arguments); + vcsFullySynchronousExec(proc, workingDirectory, arguments); if (proc.result() != QtcProcess::FinishedWithSuccess) return false; @@ -136,12 +134,12 @@ bool MercurialClient::synchronousClone(const FilePath &workingDir, arguments.clear(); arguments << QLatin1String("pull") << dstLocation; QtcProcess proc1; - vcsSynchronousExec(proc1, workingDirectory.path(), arguments, flags); + vcsSynchronousExec(proc1, workingDirectory, arguments, flags); if (proc1.result() != QtcProcess::FinishedWithSuccess) return false; // By now, there is no hgrc file -> create it - FileSaver saver(Utils::FilePath::fromString(workingDirectory.path() + "/.hg/hgrc")); + FileSaver saver(workingDirectory.pathAppended(".hg/hgrc")); const QString hgrc = QLatin1String("[paths]\ndefault = ") + dstLocation + QLatin1Char('\n'); saver.write(hgrc.toUtf8()); if (!saver.finalize()) { @@ -153,19 +151,18 @@ bool MercurialClient::synchronousClone(const FilePath &workingDir, arguments.clear(); arguments << QLatin1String("update"); QtcProcess proc2; - vcsSynchronousExec(proc2, workingDirectory.path(), arguments, flags); + vcsSynchronousExec(proc2, workingDirectory, arguments, flags); return proc2.result() == QtcProcess::FinishedWithSuccess; } else { QStringList arguments(QLatin1String("clone")); - arguments << dstLocation << workingDirectory.dirName(); - workingDirectory.cdUp(); + arguments << dstLocation << workingDirectory.parentDir().toString(); QtcProcess proc; - vcsSynchronousExec(proc, workingDirectory.path(), arguments, flags); + vcsSynchronousExec(proc, workingDirectory.parentDir(), arguments, flags); return proc.result() == QtcProcess::FinishedWithSuccess; } } -bool MercurialClient::synchronousPull(const QString &workingDir, const QString &srcLocation, const QStringList &extraOptions) +bool MercurialClient::synchronousPull(const FilePath &workingDir, const QString &srcLocation, const QStringList &extraOptions) { QStringList args; args << vcsCommandString(PullCommand) << extraOptions << srcLocation; @@ -202,12 +199,12 @@ QString MercurialClient::branchQuerySync(const QString &repositoryRoot) return QLatin1String("Unknown Branch"); } -static inline QString msgParentRevisionFailed(const QString &workingDirectory, - const QString &revision, - const QString &why) +static QString msgParentRevisionFailed(const FilePath &workingDirectory, + const QString &revision, + const QString &why) { return MercurialClient::tr("Unable to find parent revisions of %1 in %2: %3"). - arg(revision, QDir::toNativeSeparators(workingDirectory), why); + arg(revision, workingDirectory.toUserOutput(), why); } static inline QString msgParseParentsOutputFailed(const QString &output) @@ -215,9 +212,9 @@ static inline QString msgParseParentsOutputFailed(const QString &output) return MercurialClient::tr("Cannot parse output: %1").arg(output); } -QStringList MercurialClient::parentRevisionsSync(const QString &workingDirectory, - const QString &file /* = QString() */, - const QString &revision) +QStringList MercurialClient::parentRevisionsSync(const FilePath &workingDirectory, + const QString &file /* = QString() */, + const QString &revision) { QStringList parents; QStringList args; @@ -258,9 +255,9 @@ user: ... } // Describe a change using an optional format -QString MercurialClient::shortDescriptionSync(const QString &workingDirectory, - const QString &revision, - const QString &format) +QString MercurialClient::shortDescriptionSync(const FilePath &workingDirectory, + const QString &revision, + const QString &format) { QStringList args; args << QLatin1String("log") << QLatin1String("-r") <<revision; @@ -277,13 +274,13 @@ QString MercurialClient::shortDescriptionSync(const QString &workingDirectory, // Default format: "SHA1 (author summmary)" static const char defaultFormatC[] = "{node} ({author|person} {desc|firstline})"; -QString MercurialClient::shortDescriptionSync(const QString &workingDirectory, - const QString &revision) +QString MercurialClient::shortDescriptionSync(const FilePath &workingDirectory, + const QString &revision) { return shortDescriptionSync(workingDirectory, revision, QLatin1String(defaultFormatC)); } -bool MercurialClient::managesFile(const QString &workingDirectory, const QString &fileName) const +bool MercurialClient::managesFile(const FilePath &workingDirectory, const QString &fileName) const { QStringList args; args << QLatin1String("status") << QLatin1String("--unknown") << fileName; @@ -292,44 +289,43 @@ bool MercurialClient::managesFile(const QString &workingDirectory, const QString return proc.stdOut().isEmpty(); } -void MercurialClient::incoming(const QString &repositoryRoot, const QString &repository) +void MercurialClient::incoming(const FilePath &repositoryRoot, const QString &repository) { QStringList args; args << QLatin1String("incoming") << QLatin1String("-g") << QLatin1String("-p"); if (!repository.isEmpty()) args.append(repository); - QString id = repositoryRoot; + QString id = repositoryRoot.toString(); if (!repository.isEmpty()) id += QLatin1Char('/') + repository; const QString title = tr("Hg incoming %1").arg(id); - VcsBaseEditorWidget *editor = createVcsEditor(Constants::DIFFLOG_ID, title, repositoryRoot, - VcsBaseEditor::getCodec(repositoryRoot), + VcsBaseEditorWidget *editor = createVcsEditor(Constants::DIFFLOG_ID, title, repositoryRoot.toString(), + VcsBaseEditor::getCodec(repositoryRoot.toString()), "incoming", id); - VcsCommand *cmd = createCommand(repository, editor); + VcsCommand *cmd = createCommand(FilePath::fromString(repository), editor); enqueueJob(cmd, args); } -void MercurialClient::outgoing(const QString &repositoryRoot) +void MercurialClient::outgoing(const FilePath &repositoryRoot) { QStringList args; args << QLatin1String("outgoing") << QLatin1String("-g") << QLatin1String("-p"); - const QString title = tr("Hg outgoing %1"). - arg(QDir::toNativeSeparators(repositoryRoot)); + const QString title = tr("Hg outgoing %1").arg(repositoryRoot.toUserOutput()); - VcsBaseEditorWidget *editor = createVcsEditor(Constants::DIFFLOG_ID, title, repositoryRoot, - VcsBaseEditor::getCodec(repositoryRoot), - "outgoing", repositoryRoot); + VcsBaseEditorWidget *editor = createVcsEditor(Constants::DIFFLOG_ID, title, repositoryRoot.toString(), + VcsBaseEditor::getCodec(repositoryRoot.toString()), + "outgoing", repositoryRoot.toString()); VcsCommand *cmd = createCommand(repositoryRoot, editor); enqueueJob(cmd, args); } VcsBaseEditorWidget *MercurialClient::annotate( - const QString &workingDir, const QString &file, const QString &revision, + const FilePath &workingDir, const QString &file, const QString &revision, int lineNumber, const QStringList &extraOptions) { QStringList args(extraOptions); @@ -337,7 +333,7 @@ VcsBaseEditorWidget *MercurialClient::annotate( return VcsBaseClient::annotate(workingDir, file, revision, lineNumber, args); } -void MercurialClient::commit(const QString &repositoryRoot, const QStringList &files, +void MercurialClient::commit(const FilePath &repositoryRoot, const QStringList &files, const QString &commitMessageFile, const QStringList &extraOptions) { @@ -346,7 +342,7 @@ void MercurialClient::commit(const QString &repositoryRoot, const QStringList &f VcsBaseClient::commit(repositoryRoot, files, commitMessageFile, args); } -void MercurialClient::diff(const QString &workingDir, const QStringList &files, +void MercurialClient::diff(const FilePath &workingDir, const QStringList &files, const QStringList &extraOptions) { Q_UNUSED(extraOptions) @@ -358,41 +354,41 @@ void MercurialClient::diff(const QString &workingDir, const QStringList &files, const QString sourceFile = VcsBaseEditor::getSource(workingDir, fileName); const QString documentId = QString(Constants::MERCURIAL_PLUGIN) + ".DiffRepo." + sourceFile; - requestReload(documentId, sourceFile, title, workingDir, {"diff"}); + requestReload(documentId, sourceFile, title, workingDir.toString(), {"diff"}); } else if (files.size() == 1) { fileName = files.at(0); const QString title = tr("Mercurial Diff \"%1\"").arg(fileName); const QString sourceFile = VcsBaseEditor::getSource(workingDir, fileName); const QString documentId = QString(Constants::MERCURIAL_PLUGIN) + ".DiffFile." + sourceFile; - requestReload(documentId, sourceFile, title, workingDir, {"diff", fileName}); + requestReload(documentId, sourceFile, title, workingDir.toString(), {"diff", fileName}); } else { - const QString title = tr("Mercurial Diff \"%1\"").arg(workingDir); + const QString title = tr("Mercurial Diff \"%1\"").arg(workingDir.toString()); const QString sourceFile = VcsBaseEditor::getSource(workingDir, fileName); const QString documentId = QString(Constants::MERCURIAL_PLUGIN) - + ".DiffFile." + workingDir; - requestReload(documentId, sourceFile, title, workingDir, QStringList{"diff"} + files); + + ".DiffFile." + workingDir.toString(); + requestReload(documentId, sourceFile, title, workingDir.toString(), QStringList{"diff"} + files); } } -void MercurialClient::import(const QString &repositoryRoot, const QStringList &files, +void MercurialClient::import(const FilePath &repositoryRoot, const QStringList &files, const QStringList &extraOptions) { VcsBaseClient::import(repositoryRoot, files, QStringList(extraOptions) << QLatin1String("--no-commit")); } -void MercurialClient::revertAll(const QString &workingDir, const QString &revision, +void MercurialClient::revertAll(const FilePath &workingDir, const QString &revision, const QStringList &extraOptions) { VcsBaseClient::revertAll(workingDir, revision, QStringList(extraOptions) << QLatin1String("--all")); } -bool MercurialClient::isVcsDirectory(const FilePath &fileName) const +bool MercurialClient::isVcsDirectory(const FilePath &filePath) const { - return fileName.isDir() - && !fileName.fileName().compare(Constants::MERCURIALREPO, HostOsInfo::fileNameCaseSensitivity()); + return filePath.isDir() + && !filePath.fileName().compare(Constants::MERCURIALREPO, HostOsInfo::fileNameCaseSensitivity()); } void MercurialClient::view(const QString &source, const QString &id, diff --git a/src/plugins/mercurial/mercurialclient.h b/src/plugins/mercurial/mercurialclient.h index e67853c24ed..7a9bd3dabd0 100644 --- a/src/plugins/mercurial/mercurialclient.h +++ b/src/plugins/mercurial/mercurialclient.h @@ -45,36 +45,36 @@ public: bool synchronousClone(const Utils::FilePath &workingDir, const QString &srcLocation, const QString &dstLocation, - const QStringList &extraOptions = QStringList()) override; - bool synchronousPull(const QString &workingDir, + const QStringList &extraOptions = {}) override; + bool synchronousPull(const Utils::FilePath &workingDir, const QString &srcLocation, - const QStringList &extraOptions = QStringList()) override; - bool manifestSync(const QString &repository, const QString &filename); + const QStringList &extraOptions = {}) override; + bool manifestSync(const Utils::FilePath &repository, const QString &filename); QString branchQuerySync(const QString &repositoryRoot); - QStringList parentRevisionsSync(const QString &workingDirectory, + QStringList parentRevisionsSync(const Utils::FilePath &workingDirectory, const QString &file /* = QString() */, const QString &revision); - QString shortDescriptionSync(const QString &workingDirectory, const QString &revision, + QString shortDescriptionSync(const Utils::FilePath &workingDirectory, const QString &revision, const QString &format /* = QString() */); - QString shortDescriptionSync(const QString &workingDirectory, const QString &revision); - void incoming(const QString &repositoryRoot, const QString &repository = QString()); - void outgoing(const QString &repositoryRoot); - bool managesFile(const QString &workingDirectory, const QString &fileName) const; + QString shortDescriptionSync(const Utils::FilePath &workingDirectory, const QString &revision); + void incoming(const Utils::FilePath &repositoryRoot, const QString &repository = {}); + void outgoing(const Utils::FilePath &repositoryRoot); + bool managesFile(const Utils::FilePath &workingDirectory, const QString &fileName) const; VcsBase::VcsBaseEditorWidget *annotate( - const QString &workingDir, const QString &file, const QString &revision = QString(), - int lineNumber = -1, const QStringList &extraOptions = QStringList()) override; - void commit(const QString &repositoryRoot, const QStringList &files, + const Utils::FilePath &workingDir, const QString &file, const QString &revision = {}, + int lineNumber = -1, const QStringList &extraOptions = {}) override; + void commit(const Utils::FilePath &repositoryRoot, const QStringList &files, const QString &commitMessageFile, const QStringList &extraOptions = QStringList()) override; - void diff(const QString &workingDir, const QStringList &files = QStringList(), - const QStringList &extraOptions = QStringList()) override; - void import(const QString &repositoryRoot, const QStringList &files, - const QStringList &extraOptions = QStringList()) override; - void revertAll(const QString &workingDir, const QString &revision = QString(), - const QStringList &extraOptions = QStringList()) override; + void diff(const Utils::FilePath &workingDir, const QStringList &files = {}, + const QStringList &extraOptions = {}) override; + void import(const Utils::FilePath &repositoryRoot, const QStringList &files, + const QStringList &extraOptions = {}) override; + void revertAll(const Utils::FilePath &workingDir, const QString &revision = {}, + const QStringList &extraOptions = {}) override; - bool isVcsDirectory(const Utils::FilePath &fileName) const; + bool isVcsDirectory(const Utils::FilePath &filePath) const; Utils::FilePath findTopLevelForFile(const Utils::FilePath &file) const override; void view(const QString &source, const QString &id, diff --git a/src/plugins/mercurial/mercurialeditor.cpp b/src/plugins/mercurial/mercurialeditor.cpp index 3523d72efc1..83caff8f74c 100644 --- a/src/plugins/mercurial/mercurialeditor.cpp +++ b/src/plugins/mercurial/mercurialeditor.cpp @@ -39,6 +39,8 @@ #include <QFileInfo> #include <QDebug> +using namespace Utils; + namespace Mercurial { namespace Internal { @@ -80,7 +82,7 @@ QString MercurialEditorWidget::decorateVersion(const QString &revision) const const QFileInfo fi(source()); const QString workingDirectory = fi.absolutePath(); // Format with short summary - return m_client->shortDescriptionSync(workingDirectory, revision); + return m_client->shortDescriptionSync(FilePath::fromString(workingDirectory), revision); } QStringList MercurialEditorWidget::annotationPreviousVersions(const QString &revision) const @@ -88,7 +90,7 @@ QStringList MercurialEditorWidget::annotationPreviousVersions(const QString &rev const QFileInfo fi(source()); const QString workingDirectory = fi.absolutePath(); // Retrieve parent revisions - return m_client->parentRevisionsSync(workingDirectory, fi.fileName(), revision); + return m_client->parentRevisionsSync(FilePath::fromString(workingDirectory), fi.fileName(), revision); } } // namespace Internal diff --git a/src/plugins/mercurial/mercurialplugin.cpp b/src/plugins/mercurial/mercurialplugin.cpp index f1ca7dfb64e..12b8cb6a186 100644 --- a/src/plugins/mercurial/mercurialplugin.cpp +++ b/src/plugins/mercurial/mercurialplugin.cpp @@ -215,7 +215,7 @@ private: QAction *m_createRepositoryAction = nullptr; QAction *m_menuAction = nullptr; - QString m_submitRepository; + FilePath m_submitRepository; bool m_submitActionTriggered = false; @@ -657,12 +657,11 @@ void MercurialPluginPrivate::showCommitWidget(const QList<VcsBaseClient::StatusI this, &MercurialPluginPrivate::diffFromEditorSelected); commitEditor->setCheckScriptWorkingDirectory(m_submitRepository); - const QString msg = tr("Commit changes for \"%1\"."). - arg(QDir::toNativeSeparators(m_submitRepository)); + const QString msg = tr("Commit changes for \"%1\".").arg(m_submitRepository.toUserOutput()); commitEditor->document()->setPreferredDisplayName(msg); - const QString branch = vcsTopic(FilePath::fromString(m_submitRepository)); - commitEditor->setFields(QFileInfo(m_submitRepository), branch, + const QString branch = vcsTopic(m_submitRepository); + commitEditor->setFields(QFileInfo(m_submitRepository.toString()), branch, m_settings.userName.value(), m_settings.userEmail.value(), status); } @@ -762,7 +761,7 @@ bool MercurialPluginPrivate::managesDirectory(const FilePath &filePath, FilePath bool MercurialPluginPrivate::managesFile(const FilePath &workingDirectory, const QString &fileName) const { - return m_client.managesFile(workingDirectory.toString(), fileName); + return m_client.managesFile(workingDirectory, fileName); } bool MercurialPluginPrivate::isConfigured() const @@ -800,23 +799,21 @@ bool MercurialPluginPrivate::vcsOpen(const FilePath &filePath) bool MercurialPluginPrivate::vcsAdd(const FilePath &filePath) { - const QFileInfo fi = filePath.toFileInfo(); - return m_client.synchronousAdd(fi.absolutePath(), fi.fileName()); + return m_client.synchronousAdd(filePath.parentDir(), filePath.fileName()); } bool MercurialPluginPrivate::vcsDelete(const FilePath &filePath) { - const QFileInfo fi = filePath.toFileInfo(); - return m_client.synchronousRemove(fi.absolutePath(), fi.fileName()); + return m_client.synchronousRemove(filePath.parentDir(), filePath.fileName()); } bool MercurialPluginPrivate::vcsMove(const FilePath &from, const FilePath &to) { const QFileInfo fromInfo = from.toFileInfo(); const QFileInfo toInfo = to.toFileInfo(); - return m_client.synchronousMove(fromInfo.absolutePath(), - fromInfo.absoluteFilePath(), - toInfo.absoluteFilePath()); + return m_client.synchronousMove(from.parentDir(), + fromInfo.absoluteFilePath(), + toInfo.absoluteFilePath()); } bool MercurialPluginPrivate::vcsCreateRepository(const FilePath &directory) @@ -826,8 +823,7 @@ bool MercurialPluginPrivate::vcsCreateRepository(const FilePath &directory) void MercurialPluginPrivate::vcsAnnotate(const FilePath &filePath, int line) { - const QFileInfo fi = filePath.toFileInfo(); - m_client.annotate(fi.absolutePath(), fi.fileName(), QString(), line); + m_client.annotate(filePath.parentDir(), filePath.fileName(), QString(), line); } Core::ShellCommand *MercurialPluginPrivate::createInitialCheckoutCommand(const QString &url, @@ -837,8 +833,7 @@ Core::ShellCommand *MercurialPluginPrivate::createInitialCheckoutCommand(const Q { QStringList args; args << QLatin1String("clone") << extraArgs << url << localName; - auto command = new VcsBase::VcsCommand(baseDirectory.toString(), - m_client.processEnvironment()); + auto command = new VcsBase::VcsCommand(baseDirectory, m_client.processEnvironment()); command->addJob({m_settings.binaryPath.filePath(), args}, -1); return command; } @@ -851,14 +846,14 @@ bool MercurialPluginPrivate::sccManaged(const QString &filename) if (!managed || topLevel.isEmpty()) return false; const QDir topLevelDir(topLevel.toString()); - return m_client.manifestSync(topLevel.toString(), topLevelDir.relativeFilePath(filename)); + return m_client.manifestSync(topLevel, topLevelDir.relativeFilePath(filename)); } void MercurialPluginPrivate::changed(const QVariant &v) { switch (v.type()) { case QVariant::String: - emit repositoryChanged(v.toString()); + emit repositoryChanged(FilePath::fromVariant(v)); break; case QVariant::StringList: emit filesChanged(v.toStringList()); diff --git a/src/plugins/mercurial/srcdestdialog.cpp b/src/plugins/mercurial/srcdestdialog.cpp index 34d93391104..5d2352f0911 100644 --- a/src/plugins/mercurial/srcdestdialog.cpp +++ b/src/plugins/mercurial/srcdestdialog.cpp @@ -90,16 +90,16 @@ QString SrcDestDialog::getRepositoryString() const return m_ui->urlLineEdit->text(); } -QString SrcDestDialog::workingDir() const +Utils::FilePath SrcDestDialog::workingDir() const { - return m_workingdir; + return Utils::FilePath::fromString(m_workingdir); } QUrl SrcDestDialog::getRepoUrl() const { // Repo to use: Default to the project repo, but use the current - const QString projectLoc = m_state.currentProjectPath(); - const QString fileLoc = m_state.currentFileTopLevel(); + const QString projectLoc = m_state.currentProjectPath().toString(); + const QString fileLoc = m_state.currentFileTopLevel().toString(); m_workingdir = projectLoc; if (!fileLoc.isEmpty()) m_workingdir = fileLoc; diff --git a/src/plugins/mercurial/srcdestdialog.h b/src/plugins/mercurial/srcdestdialog.h index 05506f2783c..84a2a898b6b 100644 --- a/src/plugins/mercurial/srcdestdialog.h +++ b/src/plugins/mercurial/srcdestdialog.h @@ -45,7 +45,7 @@ public: void setPathChooserKind(Utils::PathChooser::Kind kind); QString getRepositoryString() const; - QString workingDir() const; + Utils::FilePath workingDir() const; private: QUrl getRepoUrl() const; diff --git a/src/plugins/perforce/perforcechecker.cpp b/src/plugins/perforce/perforcechecker.cpp index 5cd3c57ca98..796b8152ac9 100644 --- a/src/plugins/perforce/perforcechecker.cpp +++ b/src/plugins/perforce/perforcechecker.cpp @@ -222,7 +222,7 @@ void PerforceChecker::emitFailed(const QString &m) void PerforceChecker::emitSucceeded(const QString &m) { resetOverrideCursor(); - emit succeeded(m); + emit succeeded(FilePath::fromString(m)); } bool PerforceChecker::useOverideCursor() const diff --git a/src/plugins/perforce/perforcechecker.h b/src/plugins/perforce/perforcechecker.h index 3232979390a..6c78e1ee84c 100644 --- a/src/plugins/perforce/perforcechecker.h +++ b/src/plugins/perforce/perforcechecker.h @@ -54,7 +54,7 @@ public: void setUseOverideCursor(bool v); signals: - void succeeded(const QString &repositoryRoot); + void succeeded(const Utils::FilePath &repositoryRoot); void failed(const QString &errorMessage); private: diff --git a/src/plugins/perforce/perforceplugin.cpp b/src/plugins/perforce/perforceplugin.cpp index 8657e22b95c..04c05515c9a 100644 --- a/src/plugins/perforce/perforceplugin.cpp +++ b/src/plugins/perforce/perforceplugin.cpp @@ -195,7 +195,7 @@ enum RunFlags struct PerforceDiffParameters { - QString workingDir; + FilePath workingDir; QStringList diffArguments; QStringList files; }; @@ -211,7 +211,7 @@ public: QString displayName() const final { return {"perforce"}; } Id id() const final { return VcsBase::Constants::VCS_ID_PERFORCE; } - bool isVcsFileOrDirectory(const FilePath &fileName) const final; + bool isVcsFileOrDirectory(const FilePath &filePath) const final; bool managesDirectory(const Utils::FilePath &directory, Utils::FilePath *topLevel = nullptr) const final; bool managesFile(const Utils::FilePath &workingDirectory, const QString &fileName) const final; @@ -230,12 +230,12 @@ public: QString vcsMakeWritableText() const final; /// - bool vcsOpen(const QString &workingDir, const QString &fileName, bool silently = false); - bool vcsAdd(const QString &workingDir, const QString &fileName); - bool vcsDelete(const QString &workingDir, const QString &filename); - bool vcsMove(const QString &workingDir, const QString &from, const QString &to); + bool vcsOpen(const FilePath &workingDir, const QString &fileName, bool silently = false); + bool vcsAdd(const FilePath &workingDir, const QString &fileName); + bool vcsDelete(const FilePath &workingDir, const QString &filename); + bool vcsMove(const FilePath &workingDir, const QString &from, const QString &to); - void p4Diff(const QString &workingDir, const QStringList &files); + void p4Diff(const FilePath &workingDir, const QStringList &files); IEditor *openPerforceSubmitEditor(const QString &fileName, const QStringList &depotFileNames); @@ -270,18 +270,18 @@ public: void commitFromEditor() override; void printPendingChanges(); void slotSubmitDiff(const QStringList &files); - void setTopLevel(const QString &); + void setTopLevel(const Utils::FilePath &); void slotTopLevelFailed(const QString &); class DirectoryCacheEntry { public: - DirectoryCacheEntry(bool isManaged, const QString &topLevel): + DirectoryCacheEntry(bool isManaged, const FilePath &topLevel): m_isManaged(isManaged), m_topLevel(topLevel) { } bool m_isManaged; - QString m_topLevel; + FilePath m_topLevel; }; typedef QHash<QString, DirectoryCacheEntry> ManagedDirectoryCache; @@ -292,7 +292,7 @@ public: // args are passed as command line arguments // extra args via a tempfile and the option -x "temp-filename" - PerforceResponse runP4Cmd(const QString &workingDir, + PerforceResponse runP4Cmd(const FilePath &workingDir, const QStringList &args, unsigned flags = CommandToWindow|StdErrToWindow|ErrorToWindow, const QStringList &extraArgs = {}, @@ -312,11 +312,11 @@ public: QTextCodec *outputCodec) const; QString clientFilePath(const QString &serverFilePath); - void annotate(const QString &workingDir, const QString &fileName, + void annotate(const FilePath &workingDir, const QString &fileName, const QString &changeList = QString(), int lineNumber = -1); - void filelog(const QString &workingDir, const QString &fileName = QString(), + void filelog(const FilePath &workingDir, const QString &fileName = QString(), bool enableAnnotationContextMenu = false); - void changelists(const QString &workingDir, const QString &fileName = QString()); + void changelists(const FilePath &workingDir, const QString &fileName = QString()); void cleanCommitMessageFile(); bool isCommitEditorOpen() const; static QSharedPointer<TempFileSaver> createTemporaryArgumentFile(const QStringList &extraArgs, @@ -324,9 +324,8 @@ public: QString pendingChangesData(); - void updateCheckout(const QString &workingDir = QString(), - const QStringList &dirs = QStringList()); - bool revertProject(const QString &workingDir, const QStringList &args, bool unchangedOnly); + void updateCheckout(const FilePath &workingDir = {}, const QStringList &dirs = {}); + bool revertProject(const FilePath &workingDir, const QStringList &args, bool unchangedOnly); bool managesDirectoryFstat(const QString &directory); void applySettings(); @@ -685,7 +684,7 @@ void PerforcePluginPrivate::revertUnchangedCurrentProject() revertProject(state.currentProjectTopLevel(), perforceRelativeProjectDirectory(state), true); } -bool PerforcePluginPrivate::revertProject(const QString &workingDir, const QStringList &pathArgs, bool unchangedOnly) +bool PerforcePluginPrivate::revertProject(const FilePath &workingDir, const QStringList &pathArgs, bool unchangedOnly) { QStringList args(QLatin1String("revert")); if (unchangedOnly) @@ -696,7 +695,7 @@ bool PerforcePluginPrivate::revertProject(const QString &workingDir, const QStri return !resp.error; } -void PerforcePluginPrivate::updateCheckout(const QString &workingDir, const QStringList &dirs) +void PerforcePluginPrivate::updateCheckout(const FilePath &workingDir, const QStringList &dirs) { QStringList args(QLatin1String("sync")); args.append(dirs); @@ -706,9 +705,8 @@ void PerforcePluginPrivate::updateCheckout(const QString &workingDir, const QStr if (!workingDir.isEmpty()) emit repositoryChanged(workingDir); } else { - const QChar slash = QLatin1Char('/'); - foreach (const QString &dir, dirs) - emit repositoryChanged(workingDir + slash + dir); + for (const QString &dir : dirs) + emit repositoryChanged(workingDir.pathAppended(dir)); } } @@ -846,14 +844,14 @@ void PerforcePluginPrivate::annotateFile() const QString file = QFileDialog::getOpenFileName(ICore::dialogParent(), tr("p4 annotate")); if (!file.isEmpty()) { const QFileInfo fi(file); - annotate(fi.absolutePath(), fi.fileName()); + annotate(FilePath::fromString(fi.absolutePath()), fi.fileName()); } } -void PerforcePluginPrivate::annotate(const QString &workingDir, - const QString &fileName, - const QString &changeList /* = QString() */, - int lineNumber /* = -1 */) +void PerforcePluginPrivate::annotate(const FilePath &workingDir, + const QString &fileName, + const QString &changeList /* = QString() */, + int lineNumber /* = -1 */) { const QStringList files = QStringList(fileName); QTextCodec *codec = VcsBaseEditor::getCodec(workingDir, files); @@ -887,11 +885,9 @@ void PerforcePluginPrivate::filelogCurrentFile() void PerforcePluginPrivate::filelogFile() { - const QString file = QFileDialog::getOpenFileName(ICore::dialogParent(), tr("p4 filelog")); - if (!file.isEmpty()) { - const QFileInfo fi(file); - filelog(fi.absolutePath(), fi.fileName()); - } + const FilePath file = FileUtils::getOpenFilePath(tr("p4 filelog")); + if (!file.isEmpty()) + filelog(file.parentDir(), file.fileName()); } void PerforcePluginPrivate::logProject() @@ -908,8 +904,8 @@ void PerforcePluginPrivate::logRepository() changelists(state.topLevel(), perforceRelativeFileArguments(QString())); } -void PerforcePluginPrivate::filelog(const QString &workingDir, const QString &fileName, - bool enableAnnotationContextMenu) +void PerforcePluginPrivate::filelog(const FilePath &workingDir, const QString &fileName, + bool enableAnnotationContextMenu) { const QString id = VcsBaseEditor::getTitleId(workingDir, QStringList(fileName)); QTextCodec *codec = VcsBaseEditor::getCodec(workingDir, QStringList(fileName)); @@ -931,7 +927,7 @@ void PerforcePluginPrivate::filelog(const QString &workingDir, const QString &fi } } -void PerforcePluginPrivate::changelists(const QString &workingDir, const QString &fileName) +void PerforcePluginPrivate::changelists(const FilePath &workingDir, const QString &fileName) { const QString id = VcsBaseEditor::getTitleId(workingDir, QStringList(fileName)); QTextCodec *codec = VcsBaseEditor::getCodec(workingDir, QStringList(fileName)); @@ -983,7 +979,7 @@ bool PerforcePluginPrivate::managesDirectory(const FilePath &directory, FilePath const bool rc = const_cast<PerforcePluginPrivate *>(this)->managesDirectoryFstat(directory.toString()); if (topLevel) { if (rc) - *topLevel = FilePath::fromString(m_settings.topLevelSymLinkTarget()); + *topLevel = m_settings.topLevelSymLinkTarget(); else topLevel->clear(); } @@ -994,7 +990,7 @@ bool PerforcePluginPrivate::managesFile(const FilePath &workingDirectory, const { QStringList args; args << QLatin1String("fstat") << QLatin1String("-m1") << fileName; - const PerforceResponse result = runP4Cmd(workingDirectory.toString(), args, RunFullySynchronous); + const PerforceResponse result = runP4Cmd(workingDirectory, args, RunFullySynchronous); return result.stdOut.contains(QLatin1String("depotFile")); } @@ -1039,7 +1035,7 @@ bool PerforcePluginPrivate::managesDirectoryFstat(const QString &directory) return managed; } -bool PerforcePluginPrivate::vcsOpen(const QString &workingDir, const QString &fileName, bool silently) +bool PerforcePluginPrivate::vcsOpen(const FilePath &workingDir, const QString &fileName, bool silently) { QStringList args; args << QLatin1String("edit") << QDir::toNativeSeparators(fileName); @@ -1052,7 +1048,7 @@ bool PerforcePluginPrivate::vcsOpen(const QString &workingDir, const QString &fi return !result.error; } -bool PerforcePluginPrivate::vcsAdd(const QString &workingDir, const QString &fileName) +bool PerforcePluginPrivate::vcsAdd(const FilePath &workingDir, const QString &fileName) { QStringList args; args << QLatin1String("add") << fileName; @@ -1061,7 +1057,7 @@ bool PerforcePluginPrivate::vcsAdd(const QString &workingDir, const QString &fil return !result.error; } -bool PerforcePluginPrivate::vcsDelete(const QString &workingDir, const QString &fileName) +bool PerforcePluginPrivate::vcsDelete(const FilePath &workingDir, const QString &fileName) { QStringList args; @@ -1084,7 +1080,7 @@ bool PerforcePluginPrivate::vcsDelete(const QString &workingDir, const QString & return !deleteResult.error; } -bool PerforcePluginPrivate::vcsMove(const QString &workingDir, const QString &from, const QString &to) +bool PerforcePluginPrivate::vcsMove(const FilePath &workingDir, const QString &from, const QString &to) { // TODO verify this works QStringList args; @@ -1126,9 +1122,9 @@ PerforcePluginPrivate::createTemporaryArgumentFile(const QStringList &extraArgs, return rc; } -bool PerforcePluginPrivate::isVcsFileOrDirectory(const FilePath &FilePath) const +bool PerforcePluginPrivate::isVcsFileOrDirectory(const FilePath &filePath) const { - Q_UNUSED(FilePath) + Q_UNUSED(filePath) return false; // Perforce does not seem to litter its files into the source tree. } @@ -1166,8 +1162,7 @@ IVersionControl::OpenSupportMode PerforcePluginPrivate::openSupportMode(const Fi bool PerforcePluginPrivate::vcsOpen(const FilePath &filePath) { - const QFileInfo fi = filePath.toFileInfo(); - return vcsOpen(fi.absolutePath(), fi.fileName(), true); + return vcsOpen(filePath.parentDir(), filePath.fileName(), true); } IVersionControl::SettingsFlags PerforcePluginPrivate::settingsFlags() const @@ -1180,21 +1175,19 @@ IVersionControl::SettingsFlags PerforcePluginPrivate::settingsFlags() const bool PerforcePluginPrivate::vcsAdd(const FilePath &filePath) { - const QFileInfo fi = filePath.toFileInfo(); - return vcsAdd(fi.absolutePath(), fi.fileName()); + return vcsAdd(filePath.parentDir(), filePath.fileName()); } bool PerforcePluginPrivate::vcsDelete(const FilePath &filePath) { - const QFileInfo fi = filePath.toFileInfo(); - return vcsDelete(fi.absolutePath(), fi.fileName()); + return vcsDelete(filePath.parentDir(), filePath.fileName()); } bool PerforcePluginPrivate::vcsMove(const FilePath &from, const FilePath &to) { const QFileInfo fromInfo = from.toFileInfo(); const QFileInfo toInfo = to.toFileInfo(); - return vcsMove(fromInfo.absolutePath(), fromInfo.absoluteFilePath(), toInfo.absoluteFilePath()); + return vcsMove(from.parentDir().absolutePath(), fromInfo.absoluteFilePath(), toInfo.absoluteFilePath()); } bool PerforcePluginPrivate::vcsCreateRepository(const FilePath &) @@ -1204,8 +1197,7 @@ bool PerforcePluginPrivate::vcsCreateRepository(const FilePath &) void PerforcePluginPrivate::vcsAnnotate(const FilePath &filePath, int line) { - const QFileInfo fi = filePath.toFileInfo(); - annotate(fi.absolutePath(), fi.fileName(), QString(), line); + annotate(filePath.parentDir(), filePath.fileName(), QString(), line); } QString PerforcePluginPrivate::vcsOpenText() const @@ -1369,7 +1361,7 @@ PerforceResponse PerforcePluginPrivate::fullySynchronousProcess(const QString &w return response; } -PerforceResponse PerforcePluginPrivate::runP4Cmd(const QString &workingDir, +PerforceResponse PerforcePluginPrivate::runP4Cmd(const FilePath &workingDir, const QStringList &args, unsigned flags, const QStringList &extraArgs, @@ -1383,7 +1375,7 @@ PerforceResponse PerforcePluginPrivate::runP4Cmd(const QString &workingDir, VcsOutputWindow::appendError(invalidConfigResponse.message); return invalidConfigResponse; } - QStringList actualArgs = m_settings.commonP4Arguments(workingDir); + QStringList actualArgs = m_settings.commonP4Arguments(workingDir.toString()); QString errorMessage; QSharedPointer<TempFileSaver> tempFile = createTemporaryArgumentFile(extraArgs, &errorMessage); if (!tempFile.isNull()) { @@ -1397,14 +1389,14 @@ PerforceResponse PerforcePluginPrivate::runP4Cmd(const QString &workingDir, actualArgs.append(args); if (flags & CommandToWindow) - VcsOutputWindow::appendCommand(workingDir, {m_settings.p4BinaryPath.value(), actualArgs}); + VcsOutputWindow::appendCommand(workingDir.toString(), {m_settings.p4BinaryPath.value(), actualArgs}); if (flags & ShowBusyCursor) QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); const PerforceResponse response = (flags & RunFullySynchronous) ? - fullySynchronousProcess(workingDir, actualArgs, flags, stdInput, outputCodec) : - synchronousProcess(workingDir, actualArgs, flags, stdInput, outputCodec); + fullySynchronousProcess(workingDir.toString(), actualArgs, flags, stdInput, outputCodec) : + synchronousProcess(workingDir.toString(), actualArgs, flags, stdInput, outputCodec); if (flags & ShowBusyCursor) QApplication::restoreOverrideCursor(); @@ -1483,7 +1475,7 @@ QString PerforcePluginPrivate::commitDisplayName() const return tr("Submit"); } -void PerforcePluginPrivate::p4Diff(const QString &workingDir, const QStringList &files) +void PerforcePluginPrivate::p4Diff(const FilePath &workingDir, const QStringList &files) { PerforceDiffParameters p; p.workingDir = workingDir; @@ -1497,7 +1489,7 @@ void PerforcePluginPrivate::p4Diff(const PerforceDiffParameters &p) QTextCodec *codec = VcsBaseEditor::getCodec(p.workingDir, p.files); const QString id = VcsBaseEditor::getTitleId(p.workingDir, p.files); // Reuse existing editors for that id - const QString tag = VcsBaseEditor::editorTag(DiffOutput, p.workingDir, p.files); + const QString tag = VcsBaseEditor::editorTag(DiffOutput, p.workingDir.toString(), p.files); IEditor *existingEditor = VcsBaseEditor::locateEditorByTag(tag); // Split arguments according to size QStringList args; @@ -1704,14 +1696,14 @@ QString PerforcePlugin::fileNameFromPerforceName(const QString& perforceName, return dd->m_settings.mapToFileSystem(p4fileSpec); } -void PerforcePluginPrivate::setTopLevel(const QString &topLevel) +void PerforcePluginPrivate::setTopLevel(const FilePath &topLevel) { if (m_settings.topLevel() == topLevel) return; - m_settings.setTopLevel(topLevel); + m_settings.setTopLevel(topLevel.toString()); - const QString msg = tr("Perforce repository: %1").arg(QDir::toNativeSeparators(topLevel)); + const QString msg = tr("Perforce repository: %1").arg(topLevel.toUserOutput()); VcsOutputWindow::appendSilently(msg); } diff --git a/src/plugins/perforce/perforcesettings.cpp b/src/plugins/perforce/perforcesettings.cpp index 224bbadd818..a8a94899b9d 100644 --- a/src/plugins/perforce/perforcesettings.cpp +++ b/src/plugins/perforce/perforcesettings.cpp @@ -144,14 +144,14 @@ bool PerforceSettings::defaultEnv() const return !customEnv.value(); // Note: negated } -QString PerforceSettings::topLevel() const +FilePath PerforceSettings::topLevel() const { - return m_topLevel; + return FilePath::fromString(m_topLevel); } -QString PerforceSettings::topLevelSymLinkTarget() const +FilePath PerforceSettings::topLevelSymLinkTarget() const { - return m_topLevelSymLinkTarget; + return FilePath::fromString(m_topLevelSymLinkTarget); } void PerforceSettings::setTopLevel(const QString &t) @@ -252,10 +252,10 @@ PerforceSettingsPage::PerforceSettingsPage(PerforceSettings *settings) checker->deleteLater(); }); connect(checker, &PerforceChecker::succeeded, errorLabel, - [errorLabel, testButton, checker](const QString &repo) { + [errorLabel, testButton, checker](const FilePath &repo) { errorLabel->setStyleSheet({}); errorLabel->setText(PerforceSettings::tr("Test succeeded (%1).") - .arg(QDir::toNativeSeparators(repo))); + .arg(repo.toUserOutput())); testButton->setEnabled(true); checker->deleteLater(); }); diff --git a/src/plugins/perforce/perforcesettings.h b/src/plugins/perforce/perforcesettings.h index 802d0c3fd7a..5c38b16ac60 100644 --- a/src/plugins/perforce/perforcesettings.h +++ b/src/plugins/perforce/perforcesettings.h @@ -69,8 +69,8 @@ public: int longTimeOutS() const { return timeOutS.value() * 10; } int timeOutMS() const { return timeOutS.value() * 1000; } - QString topLevel() const; - QString topLevelSymLinkTarget() const; + Utils::FilePath topLevel() const; + Utils::FilePath topLevelSymLinkTarget() const; void setTopLevel(const QString &); diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index c418b0640f9..d916ec4efc2 100644 --- a/src/plugins/projectexplorer/projectexplorer.cpp +++ b/src/plugins/projectexplorer/projectexplorer.cpp @@ -3867,10 +3867,9 @@ void ProjectExplorerPluginPrivate::deleteFile() folderNode->deleteFiles({filePath}); FileChangeBlocker changeGuard(currentNode->filePath()); - if (IVersionControl *vc = - VcsManager::findVersionControlForDirectory(filePath.absolutePath().toString())) { + if (IVersionControl *vc = VcsManager::findVersionControlForDirectory(filePath.absolutePath())) vc->vcsDelete(filePath); - } + if (filePath.exists()) { if (!filePath.removeFile()) QMessageBox::warning(ICore::dialogParent(), tr("Deleting File Failed"), diff --git a/src/plugins/projectexplorer/projectmodels.cpp b/src/plugins/projectexplorer/projectmodels.cpp index b410e41a674..f4471d99a12 100644 --- a/src/plugins/projectexplorer/projectmodels.cpp +++ b/src/plugins/projectexplorer/projectmodels.cpp @@ -65,6 +65,7 @@ #include <tuple> #include <vector> +using namespace Core; using namespace Utils; namespace ProjectExplorer { @@ -735,7 +736,7 @@ bool FlatModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int r if (it != vcsHash.constEnd()) return it.value(); VcsInfo vcsInfo; - vcsInfo.vcs = Core::VcsManager::findVersionControlForDirectory(dir, &vcsInfo.repoDir); + vcsInfo.vcs = VcsManager::findVersionControlForDirectory(FilePath::fromString(dir), &vcsInfo.repoDir); vcsHash.insert(dir, vcsInfo); return vcsInfo; }; @@ -750,8 +751,7 @@ bool FlatModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int r switch (dlg.dropAction()) { case DropAction::CopyWithFiles: { FilePaths filesToAdd; - Core::IVersionControl * const vcs = Core::VcsManager::findVersionControlForDirectory( - targetDir.toString()); + IVersionControl * const vcs = VcsManager::findVersionControlForDirectory(targetDir); const bool addToVcs = vcs && vcs->supportsOperation(Core::IVersionControl::AddOperation); for (const FilePath &sourceFile : sourceFiles) { const FilePath targetFile = targetFilePath(sourceFile); diff --git a/src/plugins/projectexplorer/projectnodes.cpp b/src/plugins/projectexplorer/projectnodes.cpp index 3c8ec137641..2e09d587fd0 100644 --- a/src/plugins/projectexplorer/projectnodes.cpp +++ b/src/plugins/projectexplorer/projectnodes.cpp @@ -1000,10 +1000,10 @@ QString ContainerNode::displayName() const { QString name = m_project->displayName(); - const QFileInfo fi = m_project->projectFilePath().toFileInfo(); - const QString dir = fi.isDir() ? fi.absoluteFilePath() : fi.absolutePath(); + const FilePath fp = m_project->projectFilePath(); + const FilePath dir = fp.isDir() ? fp.absoluteFilePath() : fp.absolutePath(); if (Core::IVersionControl *vc = Core::VcsManager::findVersionControlForDirectory(dir)) { - QString vcsTopic = vc->vcsTopic(FilePath::fromString(dir)); + QString vcsTopic = vc->vcsTopic(dir); if (!vcsTopic.isEmpty()) name += " [" + vcsTopic + ']'; } diff --git a/src/plugins/projectexplorer/projecttree.cpp b/src/plugins/projectexplorer/projecttree.cpp index 22e0ee88d0c..e8e54804954 100644 --- a/src/plugins/projectexplorer/projecttree.cpp +++ b/src/plugins/projectexplorer/projecttree.cpp @@ -329,7 +329,7 @@ void ProjectTree::updateExternalFileWarning() return; // External file. Test if it under the same VCS QString topLevel; - if (Core::VcsManager::findVersionControlForDirectory(projectDir.toString(), &topLevel) + if (Core::VcsManager::findVersionControlForDirectory(projectDir, &topLevel) && fileName.isChildOf(FilePath::fromString(topLevel))) { return; } diff --git a/src/plugins/projectexplorer/projectwizardpage.cpp b/src/plugins/projectexplorer/projectwizardpage.cpp index 5b169076587..84a3664895c 100644 --- a/src/plugins/projectexplorer/projectwizardpage.cpp +++ b/src/plugins/projectexplorer/projectwizardpage.cpp @@ -376,7 +376,8 @@ void ProjectWizardPage::initializeVersionControls() QStringList versionControlChoices = QStringList(tr("<None>")); if (!m_commonDirectory.isEmpty()) { - IVersionControl *managingControl = VcsManager::findVersionControlForDirectory(m_commonDirectory); + IVersionControl *managingControl = + VcsManager::findVersionControlForDirectory(FilePath::fromString(m_commonDirectory)); if (managingControl) { // Under VCS if (managingControl->supportsOperation(IVersionControl::AddOperation)) { diff --git a/src/plugins/projectexplorer/vcsannotatetaskhandler.cpp b/src/plugins/projectexplorer/vcsannotatetaskhandler.cpp index 0765777b1f7..daaf5970b47 100644 --- a/src/plugins/projectexplorer/vcsannotatetaskhandler.cpp +++ b/src/plugins/projectexplorer/vcsannotatetaskhandler.cpp @@ -45,7 +45,7 @@ bool VcsAnnotateTaskHandler::canHandle(const Task &task) const QFileInfo fi(task.file.toFileInfo()); if (!fi.exists() || !fi.isFile() || !fi.isReadable()) return false; - IVersionControl *vc = VcsManager::findVersionControlForDirectory(fi.absolutePath()); + IVersionControl *vc = VcsManager::findVersionControlForDirectory(task.file.absolutePath()); if (!vc) return false; return vc->supportsOperation(IVersionControl::AnnotateOperation); @@ -53,11 +53,10 @@ bool VcsAnnotateTaskHandler::canHandle(const Task &task) const void VcsAnnotateTaskHandler::handle(const Task &task) { - QFileInfo fi(task.file.toFileInfo()); - IVersionControl *vc = VcsManager::findVersionControlForDirectory(fi.absolutePath()); + IVersionControl *vc = VcsManager::findVersionControlForDirectory(task.file.absolutePath()); QTC_ASSERT(vc, return); QTC_ASSERT(vc->supportsOperation(IVersionControl::AnnotateOperation), return); - vc->vcsAnnotate(FilePath::fromString(fi.absoluteFilePath()), task.movedLine); + vc->vcsAnnotate(task.file.absoluteFilePath(), task.movedLine); } QAction *VcsAnnotateTaskHandler::createAction(QObject *parent) const diff --git a/src/plugins/qbsprojectmanager/qbsproject.cpp b/src/plugins/qbsprojectmanager/qbsproject.cpp index 23aae15d30b..123e2b2ca0c 100644 --- a/src/plugins/qbsprojectmanager/qbsproject.cpp +++ b/src/plugins/qbsprojectmanager/qbsproject.cpp @@ -352,7 +352,7 @@ bool QbsBuildSystem::ensureWriteableQbsFile(const QString &file) if (!fi.isWritable()) { // Try via vcs manager IVersionControl *versionControl = - VcsManager::findVersionControlForDirectory(fi.absolutePath()); + VcsManager::findVersionControlForDirectory(FilePath::fromString(fi.absolutePath())); if (!versionControl || !versionControl->vcsOpen(FilePath::fromString(file))) { bool makeWritable = QFile::setPermissions(file, fi.permissions() | QFile::WriteUser); if (!makeWritable) { diff --git a/src/plugins/qmakeprojectmanager/qmakeparsernodes.cpp b/src/plugins/qmakeprojectmanager/qmakeparsernodes.cpp index e3be0ad59db..9276345d224 100644 --- a/src/plugins/qmakeprojectmanager/qmakeparsernodes.cpp +++ b/src/plugins/qmakeprojectmanager/qmakeparsernodes.cpp @@ -745,7 +745,8 @@ bool QmakePriFile::ensureWriteableProFile(const QString &file) QFileInfo fi(file); if (!fi.isWritable()) { // Try via vcs manager - Core::IVersionControl *versionControl = Core::VcsManager::findVersionControlForDirectory(fi.absolutePath()); + Core::IVersionControl *versionControl = + Core::VcsManager::findVersionControlForDirectory(FilePath::fromString(fi.absolutePath())); if (!versionControl || !versionControl->vcsOpen(FilePath::fromString(file))) { bool makeWritable = QFile::setPermissions(file, fi.permissions() | QFile::WriteUser); if (!makeWritable) { diff --git a/src/plugins/qmldesigner/documentmanager.cpp b/src/plugins/qmldesigner/documentmanager.cpp index 8b6b1b93857..84e1416eb04 100644 --- a/src/plugins/qmldesigner/documentmanager.cpp +++ b/src/plugins/qmldesigner/documentmanager.cpp @@ -309,7 +309,8 @@ bool DocumentManager::createFile(const QString &filePath, const QString &content void DocumentManager::addFileToVersionControl(const QString &directoryPath, const QString &newFilePath) { - Core::IVersionControl *versionControl = Core::VcsManager::findVersionControlForDirectory(directoryPath); + Core::IVersionControl *versionControl = + Core::VcsManager::findVersionControlForDirectory(FilePath::fromString(directoryPath)); if (versionControl && versionControl->supportsOperation(Core::IVersionControl::AddOperation)) { const QMessageBox::StandardButton button = QMessageBox::question(Core::ICore::dialogParent(), diff --git a/src/plugins/qmljseditor/qmljscomponentfromobjectdef.cpp b/src/plugins/qmljseditor/qmljscomponentfromobjectdef.cpp index 66b23afa7d3..fb736ab2b21 100644 --- a/src/plugins/qmljseditor/qmljscomponentfromobjectdef.cpp +++ b/src/plugins/qmljseditor/qmljscomponentfromobjectdef.cpp @@ -216,7 +216,8 @@ public: currentFile->appendIndentRange(Range(start, end + 1)); currentFile->apply(); - Core::IVersionControl *versionControl = Core::VcsManager::findVersionControlForDirectory(path); + Core::IVersionControl *versionControl = + Core::VcsManager::findVersionControlForDirectory(FilePath::fromString(path)); if (versionControl && versionControl->supportsOperation(Core::IVersionControl::AddOperation)) { const QMessageBox::StandardButton button = QMessageBox::question( diff --git a/src/plugins/subversion/subversionclient.cpp b/src/plugins/subversion/subversionclient.cpp index b0277bef023..8ddef09d0a2 100644 --- a/src/plugins/subversion/subversionclient.cpp +++ b/src/plugins/subversion/subversionclient.cpp @@ -78,7 +78,7 @@ SubversionClient::SubversionClient(SubversionSettings *settings) : VcsBaseClient }); } -bool SubversionClient::doCommit(const QString &repositoryRoot, +bool SubversionClient::doCommit(const FilePath &repositoryRoot, const QStringList &files, const QString &commitMessageFile, const QStringList &extraOptions) const @@ -97,7 +97,7 @@ bool SubversionClient::doCommit(const QString &repositoryRoot, return proc.result() == QtcProcess::FinishedWithSuccess; } -void SubversionClient::commit(const QString &repositoryRoot, +void SubversionClient::commit(const FilePath &repositoryRoot, const QStringList &files, const QString &commitMessageFile, const QStringList &extraOptions) @@ -140,7 +140,7 @@ QStringList SubversionClient::addAuthenticationOptions(const SubversionSettings return rc; } -QString SubversionClient::synchronousTopic(const QString &repository) const +QString SubversionClient::synchronousTopic(const FilePath &repository) const { QStringList args; @@ -278,7 +278,7 @@ SubversionDiffEditorController *SubversionClient::findOrCreateDiffEditor(const Q return controller; } -void SubversionClient::diff(const QString &workingDirectory, const QStringList &files, const QStringList &extraOptions) +void SubversionClient::diff(const FilePath &workingDirectory, const QStringList &files, const QStringList &extraOptions) { Q_UNUSED(extraOptions) @@ -287,13 +287,13 @@ void SubversionClient::diff(const QString &workingDirectory, const QStringList & + QLatin1String(".Diff.") + VcsBaseEditor::getTitleId(workingDirectory, files); const QString title = vcsEditorTitle(vcsCmdString, documentId); - SubversionDiffEditorController *controller = findOrCreateDiffEditor(documentId, workingDirectory, title, - workingDirectory); + SubversionDiffEditorController *controller = + findOrCreateDiffEditor(documentId, workingDirectory.toString(), title, workingDirectory.toString()); controller->setFilesList(files); controller->requestReload(); } -void SubversionClient::log(const QString &workingDir, +void SubversionClient::log(const FilePath &workingDir, const QStringList &files, const QStringList &extraOptions, bool enableAnnotationContextMenu) @@ -310,15 +310,16 @@ void SubversionClient::log(const QString &workingDir, VcsBaseClient::log(workingDir, escapeFiles(files), svnExtraOptions, enableAnnotationContextMenu); } -void SubversionClient::describe(const QString &workingDirectory, int changeNumber, const QString &title) +void SubversionClient::describe(const FilePath &workingDirectory, int changeNumber, const QString &title) { const QString documentId = QLatin1String(Constants::SUBVERSION_PLUGIN) + QLatin1String(".Describe.") + VcsBaseEditor::editorTag(DiffOutput, - workingDirectory, + workingDirectory.toString(), QStringList(), QString::number(changeNumber)); - SubversionDiffEditorController *controller = findOrCreateDiffEditor(documentId, workingDirectory, title, workingDirectory); + SubversionDiffEditorController *controller = + findOrCreateDiffEditor(documentId, workingDirectory.toString(), title, workingDirectory.toString()); controller->setChangeNumber(changeNumber); controller->requestReload(); } diff --git a/src/plugins/subversion/subversionclient.h b/src/plugins/subversion/subversionclient.h index 7d7ec85b366..036f314b152 100644 --- a/src/plugins/subversion/subversionclient.h +++ b/src/plugins/subversion/subversionclient.h @@ -44,29 +44,30 @@ class SubversionClient : public VcsBase::VcsBaseClient public: SubversionClient(SubversionSettings *settings); - bool doCommit(const QString &repositoryRoot, + bool doCommit(const Utils::FilePath &repositoryRoot, const QStringList &files, const QString &commitMessageFile, - const QStringList &extraOptions = QStringList()) const; - void commit(const QString &repositoryRoot, + const QStringList &extraOptions = {}) const; + void commit(const Utils::FilePath &repositoryRoot, const QStringList &files, const QString &commitMessageFile, - const QStringList &extraOptions = QStringList()) override; + const QStringList &extraOptions = {}) override; - void diff(const QString &workingDirectory, const QStringList &files, + void diff(const Utils::FilePath &workingDirectory, + const QStringList &files, const QStringList &extraOptions) override; - void log(const QString &workingDir, - const QStringList &files = QStringList(), - const QStringList &extraOptions = QStringList(), + void log(const Utils::FilePath &workingDir, + const QStringList &files = {}, + const QStringList &extraOptions = {}, bool enableAnnotationContextMenu = false) override; - void describe(const QString &workingDirectory, int changeNumber, const QString &title); + void describe(const Utils::FilePath &workingDirectory, int changeNumber, const QString &title); // Add authorization options to the command line arguments. static QStringList addAuthenticationOptions(const SubversionSettings &settings); - QString synchronousTopic(const QString &repository) const; + QString synchronousTopic(const Utils::FilePath &repository) const; static QString escapeFile(const QString &file); static QStringList escapeFiles(const QStringList &files); diff --git a/src/plugins/subversion/subversionplugin.cpp b/src/plugins/subversion/subversionplugin.cpp index 915e2cc89e8..7519d3defe6 100644 --- a/src/plugins/subversion/subversionplugin.cpp +++ b/src/plugins/subversion/subversionplugin.cpp @@ -235,20 +235,20 @@ public: SubversionSubmitEditor *openSubversionSubmitEditor(const QString &fileName); // IVersionControl - bool vcsAdd(const QString &workingDir, const QString &fileName); - bool vcsDelete(const QString &workingDir, const QString &fileName); - bool vcsMove(const QString &workingDir, const QString &from, const QString &to); - bool vcsCheckout(const QString &directory, const QByteArray &url); + bool vcsAdd(const FilePath &workingDir, const QString &fileName); + bool vcsDelete(const FilePath &workingDir, const QString &fileName); + bool vcsMove(const FilePath &workingDir, const QString &from, const QString &to); + bool vcsCheckout(const FilePath &directory, const QByteArray &url); static SubversionPluginPrivate *instance(); - QString monitorFile(const QString &repository) const; - QString synchronousTopic(const QString &repository) const; - SubversionResponse runSvn(const QString &workingDir, + QString monitorFile(const FilePath &repository) const; + QString synchronousTopic(const FilePath &repository) const; + SubversionResponse runSvn(const FilePath &workingDir, const QStringList &arguments, int timeOutS, unsigned flags, QTextCodec *outputCodec = nullptr) const; - void vcsAnnotateHelper(const QString &workingDir, const QString &file, - const QString &revision = QString(), int lineNumber = -1); + void vcsAnnotateHelper(const FilePath &workingDir, const QString &file, + const QString &revision = {}, int lineNumber = -1); protected: void updateActions(VcsBase::VcsBasePluginPrivate::ActionState) override; @@ -282,20 +282,20 @@ private: Utils::Id id, const QString &source, QTextCodec *codec); - void filelog(const QString &workingDir, - const QString &file = QString(), + void filelog(const FilePath &workingDir, + const QString &file = {}, bool enableAnnotationContextMenu = false); - void svnStatus(const QString &workingDir, const QString &relativePath = QString()); - void svnUpdate(const QString &workingDir, const QString &relativePath = QString()); + void svnStatus(const FilePath &workingDir, const QString &relativePath = {}); + void svnUpdate(const FilePath &workingDir, const QString &relativePath = {}); bool checkSVNSubDir(const QDir &directory) const; - void startCommit(const QString &workingDir, const QStringList &files = QStringList()); + void startCommit(const FilePath &workingDir, const QStringList &files = {}); const QStringList m_svnDirectories; SubversionSettings m_settings; SubversionClient *m_client = nullptr; QString m_commitMessageFileName; - QString m_commitRepository; + FilePath m_commitRepository; Core::CommandLocator *m_commandLocator = nullptr; Utils::ParameterAction *m_addAction = nullptr; @@ -690,7 +690,7 @@ void SubversionPluginPrivate::revertAll() QStringList args; args << QLatin1String("revert"); args << SubversionClient::addAuthenticationOptions(m_settings); - args << QLatin1String("--recursive") << state.topLevel(); + args << QLatin1String("--recursive") << state.topLevel().toString(); const SubversionResponse revertResponse = runSvn(state.topLevel(), args, m_settings.timeout.value(), VcsCommand::SshPasswordPrompt | VcsCommand::ShowStdOut); @@ -781,7 +781,7 @@ void SubversionPluginPrivate::startCommitProject() /* Start commit of files of a single repository by displaying * template and files in a submit editor. On closing, the real * commit will start. */ -void SubversionPluginPrivate::startCommit(const QString &workingDir, const QStringList &files) +void SubversionPluginPrivate::startCommit(const FilePath &workingDir, const QStringList &files) { if (!promptBeforeCommit()) return; @@ -869,7 +869,7 @@ void SubversionPluginPrivate::updateRepository() svnUpdate(state.topLevel()); } -void SubversionPluginPrivate::svnStatus(const QString &workingDir, const QString &relativePath) +void SubversionPluginPrivate::svnStatus(const FilePath &workingDir, const QString &relativePath) { const VcsBasePluginState state = currentState(); QTC_ASSERT(state.hasTopLevel(), return); @@ -877,15 +877,15 @@ void SubversionPluginPrivate::svnStatus(const QString &workingDir, const QString args << SubversionClient::addAuthenticationOptions(m_settings); if (!relativePath.isEmpty()) args.append(SubversionClient::escapeFile(relativePath)); - VcsOutputWindow::setRepository(workingDir); + VcsOutputWindow::setRepository(workingDir.toString()); runSvn(workingDir, args, m_settings.timeout.value(), VcsCommand::ShowStdOut | VcsCommand::ShowSuccessMessage); VcsOutputWindow::clearRepository(); } -void SubversionPluginPrivate::filelog(const QString &workingDir, - const QString &file, - bool enableAnnotationContextMenu) +void SubversionPluginPrivate::filelog(const FilePath &workingDir, + const QString &file, + bool enableAnnotationContextMenu) { m_client->log(workingDir, QStringList(file), QStringList(), enableAnnotationContextMenu); } @@ -897,7 +897,7 @@ void SubversionPluginPrivate::updateProject() svnUpdate(state.currentProjectTopLevel(), state.relativeCurrentProject()); } -void SubversionPluginPrivate::svnUpdate(const QString &workingDir, const QString &relativePath) +void SubversionPluginPrivate::svnUpdate(const FilePath &workingDir, const QString &relativePath) { QStringList args(QLatin1String("update")); args << SubversionClient::addAuthenticationOptions(m_settings); @@ -918,7 +918,7 @@ void SubversionPluginPrivate::annotateCurrentFile() vcsAnnotateHelper(state.currentFileTopLevel(), state.relativeCurrentFile()); } -void SubversionPluginPrivate::vcsAnnotateHelper(const QString &workingDir, const QString &file, +void SubversionPluginPrivate::vcsAnnotateHelper(const FilePath &workingDir, const QString &file, const QString &revision /* = QString() */, int lineNumber /* = -1 */) { @@ -947,7 +947,7 @@ void SubversionPluginPrivate::vcsAnnotateHelper(const QString &workingDir, const // Determine id const QStringList files = QStringList(file); const QString id = VcsBaseEditor::getTitleId(workingDir, files, revision); - const QString tag = VcsBaseEditor::editorTag(AnnotateOutput, workingDir, files); + const QString tag = VcsBaseEditor::editorTag(AnnotateOutput, workingDir.toString(), files); if (IEditor *editor = VcsBaseEditor::locateEditorByTag(tag)) { editor->document()->setContents(response.stdOut.toUtf8()); VcsBaseEditor::gotoLineOfEditor(editor, lineNumber); @@ -987,7 +987,7 @@ void SubversionPluginPrivate::vcsDescribe(const FilePath &source, const QString const QString title = QString::fromLatin1("svn describe %1#%2").arg(fi.fileName(), changeNr); - m_client->describe(topLevel.toString(), number, title); + m_client->describe(topLevel, number, title); } void SubversionPluginPrivate::slotDescribe() @@ -1004,7 +1004,7 @@ void SubversionPluginPrivate::slotDescribe() return; const int revision = inputDialog.intValue(); - vcsDescribe(FilePath::fromString(state.topLevel()), QString::number(revision)); + vcsDescribe(state.topLevel(), QString::number(revision)); } void SubversionPluginPrivate::commitFromEditor() @@ -1014,10 +1014,10 @@ void SubversionPluginPrivate::commitFromEditor() EditorManager::closeDocuments({submitEditor()->document()}); } -SubversionResponse SubversionPluginPrivate::runSvn(const QString &workingDir, - const QStringList &arguments, - int timeOutS, unsigned flags, - QTextCodec *outputCodec) const +SubversionResponse SubversionPluginPrivate::runSvn(const FilePath &workingDir, + const QStringList &arguments, + int timeOutS, unsigned flags, + QTextCodec *outputCodec) const { SubversionResponse response; if (m_settings.binaryPath.value().isEmpty()) { @@ -1067,10 +1067,10 @@ SubversionPluginPrivate *SubversionPluginPrivate::instance() return dd; } -QString SubversionPluginPrivate::monitorFile(const QString &repository) const +QString SubversionPluginPrivate::monitorFile(const FilePath &repository) const { QTC_ASSERT(!repository.isEmpty(), return QString()); - QDir repoDir(repository); + QDir repoDir(repository.toString()); foreach (const QString &svnDir, m_svnDirectories) { if (repoDir.exists(svnDir)) { QFileInfo fi(repoDir.absoluteFilePath(svnDir + QLatin1String("/wc.db"))); @@ -1081,12 +1081,12 @@ QString SubversionPluginPrivate::monitorFile(const QString &repository) const return QString(); } -QString SubversionPluginPrivate::synchronousTopic(const QString &repository) const +QString SubversionPluginPrivate::synchronousTopic(const FilePath &repository) const { return m_client->synchronousTopic(repository); } -bool SubversionPluginPrivate::vcsAdd(const QString &workingDir, const QString &rawFileName) +bool SubversionPluginPrivate::vcsAdd(const FilePath &workingDir, const QString &rawFileName) { const QString file = QDir::toNativeSeparators(SubversionClient::escapeFile(rawFileName)); QStringList args; @@ -1099,7 +1099,7 @@ bool SubversionPluginPrivate::vcsAdd(const QString &workingDir, const QString &r return !response.error; } -bool SubversionPluginPrivate::vcsDelete(const QString &workingDir, const QString &rawFileName) +bool SubversionPluginPrivate::vcsDelete(const FilePath &workingDir, const QString &rawFileName) { const QString file = QDir::toNativeSeparators(SubversionClient::escapeFile(rawFileName)); @@ -1114,7 +1114,7 @@ bool SubversionPluginPrivate::vcsDelete(const QString &workingDir, const QString return !response.error; } -bool SubversionPluginPrivate::vcsMove(const QString &workingDir, const QString &from, const QString &to) +bool SubversionPluginPrivate::vcsMove(const FilePath &workingDir, const QString &from, const QString &to) { QStringList args(QLatin1String("move")); args << SubversionClient::addAuthenticationOptions(m_settings); @@ -1127,7 +1127,7 @@ bool SubversionPluginPrivate::vcsMove(const QString &workingDir, const QString & return !response.error; } -bool SubversionPluginPrivate::vcsCheckout(const QString &directory, const QByteArray &url) +bool SubversionPluginPrivate::vcsCheckout(const FilePath &directory, const QByteArray &url) { QUrl tempUrl = QUrl::fromEncoded(url); QString username = tempUrl.userName(); @@ -1147,7 +1147,7 @@ bool SubversionPluginPrivate::vcsCheckout(const QString &directory, const QByteA args << QLatin1String("--password") << password; } - args << QLatin1String(tempUrl.toEncoded()) << directory; + args << QLatin1String(tempUrl.toEncoded()) << directory.toString(); const SubversionResponse response = runSvn(directory, args, 10 * m_settings.timeout.value(), VcsCommand::SshPasswordPrompt); @@ -1184,8 +1184,7 @@ bool SubversionPluginPrivate::managesFile(const FilePath &workingDirectory, cons args << QLatin1String("status"); args << SubversionClient::addAuthenticationOptions(m_settings) << QDir::toNativeSeparators(SubversionClient::escapeFile(fileName)); - SubversionResponse response - = runSvn(workingDirectory.toString(), args, m_settings.timeout.value(), 0); + SubversionResponse response = runSvn(workingDirectory, args, m_settings.timeout.value(), 0); return response.stdOut.isEmpty() || response.stdOut.at(0) != QLatin1Char('?'); } @@ -1254,21 +1253,19 @@ bool SubversionPluginPrivate::vcsOpen(const FilePath & /* filePath */) bool SubversionPluginPrivate::vcsAdd(const FilePath &filePath) { - const QFileInfo fi = filePath.toFileInfo(); - return vcsAdd(fi.absolutePath(), fi.fileName()); + return vcsAdd(filePath.parentDir(), filePath.fileName()); } bool SubversionPluginPrivate::vcsDelete(const FilePath &filePath) { - const QFileInfo fi = filePath.toFileInfo(); - return vcsDelete(fi.absolutePath(), fi.fileName()); + return vcsDelete(filePath.parentDir(), filePath.fileName()); } bool SubversionPluginPrivate::vcsMove(const FilePath &from, const FilePath &to) { const QFileInfo fromInfo = from.toFileInfo(); const QFileInfo toInfo = to.toFileInfo(); - return vcsMove(fromInfo.absolutePath(), fromInfo.absoluteFilePath(), toInfo.absoluteFilePath()); + return vcsMove(from.parentDir(), fromInfo.absoluteFilePath(), toInfo.absoluteFilePath()); } bool SubversionPluginPrivate::vcsCreateRepository(const FilePath &) @@ -1278,8 +1275,7 @@ bool SubversionPluginPrivate::vcsCreateRepository(const FilePath &) void SubversionPluginPrivate::vcsAnnotate(const FilePath &filePath, int line) { - const QFileInfo fi = filePath.toFileInfo(); - vcsAnnotateHelper(fi.absolutePath(), fi.fileName(), QString(), line); + vcsAnnotateHelper(filePath.parentDir(), filePath.fileName(), QString(), line); } Core::ShellCommand *SubversionPluginPrivate::createInitialCheckoutCommand(const QString &url, @@ -1293,19 +1289,19 @@ Core::ShellCommand *SubversionPluginPrivate::createInitialCheckoutCommand(const args << QLatin1String(Subversion::Constants::NON_INTERACTIVE_OPTION); args << extraArgs << url << localName; - auto command = new VcsBase::VcsCommand(baseDirectory.toString(), m_client->processEnvironment()); + auto command = new VcsBase::VcsCommand(baseDirectory, m_client->processEnvironment()); command->addJob({m_settings.binaryPath.filePath(), args}, -1); return command; } FilePath SubversionTopicCache::trackFile(const FilePath &repository) { - return FilePath::fromString(m_plugin->monitorFile(repository.toString())); + return FilePath::fromString(m_plugin->monitorFile(repository)); } QString SubversionTopicCache::refreshTopic(const FilePath &repository) { - return m_plugin->synchronousTopic(repository.toString()); + return m_plugin->synchronousTopic(repository); } diff --git a/src/plugins/vcsbase/vcsbaseclient.cpp b/src/plugins/vcsbase/vcsbaseclient.cpp index 75dd748dcd4..8b74bee3958 100644 --- a/src/plugins/vcsbase/vcsbaseclient.cpp +++ b/src/plugins/vcsbase/vcsbaseclient.cpp @@ -92,7 +92,7 @@ FilePath VcsBaseClientImpl::vcsBinary() const return m_baseSettings->binaryPath.filePath(); } -VcsCommand *VcsBaseClientImpl::createCommand(const QString &workingDirectory, +VcsCommand *VcsBaseClientImpl::createCommand(const FilePath &workingDirectory, VcsBaseEditorWidget *editor, JobOutputBindMode mode) const { @@ -145,21 +145,14 @@ QString VcsBaseClientImpl::stripLastNewline(const QString &in) } void VcsBaseClientImpl::vcsFullySynchronousExec(QtcProcess &proc, - const QString &workingDir, const QStringList &args, - unsigned flags, int timeoutS, QTextCodec *codec) const -{ - vcsFullySynchronousExec(proc, workingDir, {vcsBinary(), args}, flags, timeoutS, codec); -} - -void VcsBaseClientImpl::vcsFullySynchronousExec(QtcProcess &proc, const FilePath &workingDir, const QStringList &args, unsigned flags, int timeoutS, QTextCodec *codec) const { - vcsFullySynchronousExec(proc, workingDir.toString(), {vcsBinary(), args}, flags, timeoutS, codec); + vcsFullySynchronousExec(proc, workingDir, {vcsBinary(), args}, flags, timeoutS, codec); } void VcsBaseClientImpl::vcsFullySynchronousExec(QtcProcess &proc, - const QString &workingDir, const CommandLine &cmdLine, + const FilePath &workingDir, const CommandLine &cmdLine, unsigned flags, int timeoutS, QTextCodec *codec) const { VcsCommand command(workingDir, processEnvironment()); @@ -175,7 +168,7 @@ void VcsBaseClientImpl::resetCachedVcsInfo(const FilePath &workingDir) Core::VcsManager::resetVersionControlForDirectory(workingDir); } -void VcsBaseClientImpl::annotateRevisionRequested(const QString &workingDirectory, +void VcsBaseClientImpl::annotateRevisionRequested(const FilePath &workingDirectory, const QString &file, const QString &change, int line) { @@ -188,7 +181,7 @@ void VcsBaseClientImpl::annotateRevisionRequested(const QString &workingDirector annotate(workingDirectory, file, changeCopy, line); } -VcsCommand *VcsBaseClientImpl::vcsExec(const QString &workingDirectory, const QStringList &arguments, +VcsCommand *VcsBaseClientImpl::vcsExec(const FilePath &workingDirectory, const QStringList &arguments, VcsBaseEditorWidget *editor, bool useOutputToWindow, unsigned additionalFlags, const QVariant &cookie) const { @@ -202,7 +195,8 @@ VcsCommand *VcsBaseClientImpl::vcsExec(const QString &workingDirectory, const QS return command; } -void VcsBaseClientImpl::vcsSynchronousExec(QtcProcess &proc, const QString &workingDir, +void VcsBaseClientImpl::vcsSynchronousExec(QtcProcess &proc, + const FilePath &workingDir, const QStringList &args, unsigned flags, QTextCodec *outputCodec) const @@ -292,17 +286,19 @@ bool VcsBaseClient::synchronousClone(const FilePath &workingDir, return proc.result() == QtcProcess::FinishedWithSuccess; } -bool VcsBaseClient::synchronousAdd(const QString &workingDir, const QString &filename, +bool VcsBaseClient::synchronousAdd(const FilePath &workingDir, + const QString &relFileName, const QStringList &extraOptions) { QStringList args; - args << vcsCommandString(AddCommand) << extraOptions << filename; + args << vcsCommandString(AddCommand) << extraOptions << relFileName; QtcProcess proc; vcsFullySynchronousExec(proc, workingDir, args); return proc.result() == QtcProcess::FinishedWithSuccess; } -bool VcsBaseClient::synchronousRemove(const QString &workingDir, const QString &filename, +bool VcsBaseClient::synchronousRemove(const FilePath &workingDir, + const QString &filename, const QStringList &extraOptions) { QStringList args; @@ -312,8 +308,9 @@ bool VcsBaseClient::synchronousRemove(const QString &workingDir, const QString & return proc.result() == QtcProcess::FinishedWithSuccess; } -bool VcsBaseClient::synchronousMove(const QString &workingDir, - const QString &from, const QString &to, +bool VcsBaseClient::synchronousMove(const FilePath &workingDir, + const QString &from, + const QString &to, const QStringList &extraOptions) { QStringList args; @@ -323,7 +320,7 @@ bool VcsBaseClient::synchronousMove(const QString &workingDir, return proc.result() == QtcProcess::FinishedWithSuccess; } -bool VcsBaseClient::synchronousPull(const QString &workingDir, +bool VcsBaseClient::synchronousPull(const FilePath &workingDir, const QString &srcLocation, const QStringList &extraOptions) { @@ -338,11 +335,11 @@ bool VcsBaseClient::synchronousPull(const QString &workingDir, vcsSynchronousExec(proc, workingDir, args, flags); const bool ok = proc.result() == QtcProcess::FinishedWithSuccess; if (ok) - emit changed(QVariant(workingDir)); + emit changed(QVariant(workingDir.toString())); return ok; } -bool VcsBaseClient::synchronousPush(const QString &workingDir, +bool VcsBaseClient::synchronousPush(const FilePath &workingDir, const QString &dstLocation, const QStringList &extraOptions) { @@ -359,7 +356,7 @@ bool VcsBaseClient::synchronousPush(const QString &workingDir, } VcsBaseEditorWidget *VcsBaseClient::annotate( - const QString &workingDir, const QString &file, const QString &revision /* = QString() */, + const FilePath &workingDir, const QString &file, const QString &revision /* = QString() */, int lineNumber /* = -1 */, const QStringList &extraOptions) { const QString vcsCmdString = vcsCommandString(AnnotateCommand); @@ -380,7 +377,7 @@ VcsBaseEditorWidget *VcsBaseClient::annotate( return editor; } -void VcsBaseClient::diff(const QString &workingDir, const QStringList &files, +void VcsBaseClient::diff(const FilePath &workingDir, const QStringList &files, const QStringList &extraOptions) { const QString vcsCmdString = vcsCommandString(DiffCommand); @@ -418,10 +415,11 @@ void VcsBaseClient::diff(const QString &workingDir, const QStringList &files, : VcsBaseEditor::getCodec(source); VcsCommand *command = createCommand(workingDir, editor); command->setCodec(codec); - enqueueJob(command, args, workingDir, exitCodeInterpreter(DiffCommand)); + enqueueJob(command, args, workingDir.toString(), exitCodeInterpreter(DiffCommand)); } -void VcsBaseClient::log(const QString &workingDir, const QStringList &files, +void VcsBaseClient::log(const FilePath &workingDir, + const QStringList &files, const QStringList &extraOptions, bool enableAnnotationContextMenu) { @@ -457,7 +455,7 @@ void VcsBaseClient::log(const QString &workingDir, const QStringList &files, enqueueJob(createCommand(workingDir, editor), args); } -void VcsBaseClient::revertFile(const QString &workingDir, +void VcsBaseClient::revertFile(const FilePath &workingDir, const QString &file, const QString &revision, const QStringList &extraOptions) @@ -466,29 +464,31 @@ void VcsBaseClient::revertFile(const QString &workingDir, args << revisionSpec(revision) << extraOptions << file; // Indicate repository change or file list VcsCommand *cmd = createCommand(workingDir); - cmd->setCookie(QStringList(workingDir + QLatin1Char('/') + file)); + cmd->setCookie(QStringList(workingDir.pathAppended(file).toString())); connect(cmd, &VcsCommand::success, this, &VcsBaseClient::changed, Qt::QueuedConnection); enqueueJob(cmd, args); } -void VcsBaseClient::revertAll(const QString &workingDir, const QString &revision, +void VcsBaseClient::revertAll(const FilePath &workingDir, + const QString &revision, const QStringList &extraOptions) { QStringList args(vcsCommandString(RevertCommand)); args << revisionSpec(revision) << extraOptions; // Indicate repository change or file list VcsCommand *cmd = createCommand(workingDir); - cmd->setCookie(QStringList(workingDir)); + cmd->setCookie(QStringList(workingDir.toString())); connect(cmd, &VcsCommand::success, this, &VcsBaseClient::changed, Qt::QueuedConnection); enqueueJob(createCommand(workingDir), args); } -void VcsBaseClient::status(const QString &workingDir, const QString &file, +void VcsBaseClient::status(const FilePath &workingDir, + const QString &file, const QStringList &extraOptions) { QStringList args(vcsCommandString(StatusCommand)); args << extraOptions << file; - VcsOutputWindow::setRepository(workingDir); + VcsOutputWindow::setRepository(workingDir.toString()); VcsCommand *cmd = createCommand(workingDir, nullptr, VcsWindowOutputBind); connect(cmd, &VcsCommand::finished, VcsOutputWindow::instance(), &VcsOutputWindow::clearRepository, @@ -496,7 +496,7 @@ void VcsBaseClient::status(const QString &workingDir, const QString &file, enqueueJob(cmd, args); } -void VcsBaseClient::emitParsedStatus(const QString &repository, const QStringList &extraOptions) +void VcsBaseClient::emitParsedStatus(const FilePath &repository, const QStringList &extraOptions) { QStringList args(vcsCommandString(StatusCommand)); args << extraOptions; @@ -543,7 +543,8 @@ void VcsBaseClient::setLogConfigCreator(ConfigCreator creator) m_logConfigCreator = std::move(creator); } -void VcsBaseClient::import(const QString &repositoryRoot, const QStringList &files, +void VcsBaseClient::import(const FilePath &repositoryRoot, + const QStringList &files, const QStringList &extraOptions) { QStringList args(vcsCommandString(ImportCommand)); @@ -551,7 +552,8 @@ void VcsBaseClient::import(const QString &repositoryRoot, const QStringList &fil enqueueJob(createCommand(repositoryRoot), args); } -void VcsBaseClient::view(const QString &source, const QString &id, +void VcsBaseClient::view(const QString &source, + const QString &id, const QStringList &extraOptions) { QStringList args; @@ -563,22 +565,22 @@ void VcsBaseClient::view(const QString &source, const QString &id, VcsBaseEditor::getCodec(source), "view", id); const QFileInfo fi(source); - const QString workingDirPath = fi.isFile() ? fi.absolutePath() : source; + const FilePath workingDirPath = FilePath::fromString(fi.isFile() ? fi.absolutePath() : source); enqueueJob(createCommand(workingDirPath, editor), args); } -void VcsBaseClient::update(const QString &repositoryRoot, const QString &revision, +void VcsBaseClient::update(const FilePath &repositoryRoot, const QString &revision, const QStringList &extraOptions) { QStringList args(vcsCommandString(UpdateCommand)); args << revisionSpec(revision) << extraOptions; VcsCommand *cmd = createCommand(repositoryRoot); - cmd->setCookie(repositoryRoot); + cmd->setCookie(repositoryRoot.toString()); connect(cmd, &VcsCommand::success, this, &VcsBaseClient::changed, Qt::QueuedConnection); enqueueJob(cmd, args); } -void VcsBaseClient::commit(const QString &repositoryRoot, +void VcsBaseClient::commit(const FilePath &repositoryRoot, const QStringList &files, const QString &commitMessageFile, const QStringList &extraOptions) diff --git a/src/plugins/vcsbase/vcsbaseclient.h b/src/plugins/vcsbase/vcsbaseclient.h index 01d9ce72173..77666748aa7 100644 --- a/src/plugins/vcsbase/vcsbaseclient.h +++ b/src/plugins/vcsbase/vcsbaseclient.h @@ -75,7 +75,7 @@ public: const char *registerDynamicProperty, const QString &dynamicPropertyValue) const; - VcsCommand *createCommand(const QString &workingDirectory, + VcsCommand *createCommand(const Utils::FilePath &workingDirectory, VcsBaseEditorWidget *editor = nullptr, JobOutputBindMode mode = NoOutputBind) const; @@ -86,9 +86,11 @@ public: virtual Utils::Environment processEnvironment() const; // VCS functionality: - virtual VcsBaseEditorWidget *annotate( - const QString &workingDir, const QString &file, const QString &revision = QString(), - int lineNumber = -1, const QStringList &extraOptions = QStringList()) = 0; + virtual VcsBaseEditorWidget *annotate(const Utils::FilePath &workingDir, + const QString &file, + const QString &revision = {}, + int lineNumber = -1, + const QStringList &extraOptions = {}) = 0; static QStringList splitLines(const QString &s); @@ -96,30 +98,26 @@ public: // Fully synchronous VCS execution (QProcess-based) void vcsFullySynchronousExec(Utils::QtcProcess &process, - const QString &workingDir, const QStringList &args, - unsigned flags = 0, int timeoutS = -1, QTextCodec *codec = nullptr) const; - void vcsFullySynchronousExec(Utils::QtcProcess &process, - const QString &workingDir, const Utils::CommandLine &cmdLine, + const Utils::FilePath &workingDir, const QStringList &args, unsigned flags = 0, int timeoutS = -1, QTextCodec *codec = nullptr) const; void vcsFullySynchronousExec(Utils::QtcProcess &process, - const Utils::FilePath &workingDir, const QStringList &args, + const Utils::FilePath &workingDir, const Utils::CommandLine &cmdLine, unsigned flags = 0, int timeoutS = -1, QTextCodec *codec = nullptr) const; - // Simple helper to execute a single command using createCommand and enqueueJob. - VcsCommand *vcsExec(const QString &workingDirectory, const QStringList &arguments, + VcsCommand *vcsExec(const Utils::FilePath &workingDirectory, const QStringList &arguments, VcsBaseEditorWidget *editor = nullptr, bool useOutputToWindow = false, - unsigned additionalFlags = 0, const QVariant &cookie = QVariant()) const; + unsigned additionalFlags = 0, const QVariant &cookie = {}) const; protected: void resetCachedVcsInfo(const Utils::FilePath &workingDir); - virtual void annotateRevisionRequested(const QString &workingDirectory, const QString &file, + virtual void annotateRevisionRequested(const Utils::FilePath &workingDirectory, const QString &file, const QString &change, int line); // Synchronous VCS execution using Utils::SynchronousProcess, with // log windows updating (using VcsBasePlugin::runVcs with flags) void vcsSynchronousExec(Utils::QtcProcess &proc, - const QString &workingDir, + const Utils::FilePath &workingDir, const QStringList &args, unsigned flags = 0, QTextCodec *outputCodec = nullptr) const; @@ -151,43 +149,55 @@ public: const QString &srcLocation, const QString &dstLocation, const QStringList &extraOptions = {}); - virtual bool synchronousAdd(const QString &workingDir, const QString &fileName, - const QStringList &extraOptions = QStringList()); - virtual bool synchronousRemove(const QString &workingDir, const QString &fileName, - const QStringList &extraOptions = QStringList()); - virtual bool synchronousMove(const QString &workingDir, + virtual bool synchronousAdd(const Utils::FilePath &workingDir, + const QString &relFileName, + const QStringList &extraOptions = {}); + virtual bool synchronousRemove(const Utils::FilePath &workingDir, + const QString &fileName, + const QStringList &extraOptions = {}); + virtual bool synchronousMove(const Utils::FilePath &workingDir, const QString &from, const QString &to, - const QStringList &extraOptions = QStringList()); - virtual bool synchronousPull(const QString &workingDir, + const QStringList &extraOptions = {}); + virtual bool synchronousPull(const Utils::FilePath &workingDir, const QString &srcLocation, - const QStringList &extraOptions = QStringList()); - virtual bool synchronousPush(const QString &workingDir, + const QStringList &extraOptions = {}); + virtual bool synchronousPush(const Utils::FilePath &workingDir, const QString &dstLocation, - const QStringList &extraOptions = QStringList()); - VcsBaseEditorWidget *annotate( - const QString &workingDir, const QString &file, const QString &revision = QString(), - int lineNumber = -1, const QStringList &extraOptions = QStringList()) override; - virtual void diff(const QString &workingDir, const QStringList &files = QStringList(), - const QStringList &extraOptions = QStringList()); - virtual void log(const QString &workingDir, const QStringList &files = QStringList(), - const QStringList &extraOptions = QStringList(), + const QStringList &extraOptions = {}); + VcsBaseEditorWidget *annotate(const Utils::FilePath &workingDir, + const QString &file, + const QString &revision = {}, + int lineNumber = -1, + const QStringList &extraOptions = {}) override; + virtual void diff(const Utils::FilePath &workingDir, + const QStringList &files = {}, + const QStringList &extraOptions = {}); + virtual void log(const Utils::FilePath &workingDir, + const QStringList &files = {}, + const QStringList &extraOptions = {}, bool enableAnnotationContextMenu = false); - virtual void status(const QString &workingDir, const QString &file = QString(), - const QStringList &extraOptions = QStringList()); - virtual void emitParsedStatus(const QString &repository, - const QStringList &extraOptions = QStringList()); - virtual void revertFile(const QString &workingDir, const QString &file, - const QString &revision = QString(), - const QStringList &extraOptions = QStringList()); - virtual void revertAll(const QString &workingDir, const QString &revision = QString(), - const QStringList &extraOptions = QStringList()); - virtual void import(const QString &repositoryRoot, const QStringList &files, - const QStringList &extraOptions = QStringList()); - virtual void update(const QString &repositoryRoot, const QString &revision = QString(), - const QStringList &extraOptions = QStringList()); - virtual void commit(const QString &repositoryRoot, const QStringList &files, + virtual void status(const Utils::FilePath &workingDir, + const QString &file = {}, + const QStringList &extraOptions = {}); + virtual void emitParsedStatus(const Utils::FilePath &repository, + const QStringList &extraOptions = {}); + virtual void revertFile(const Utils::FilePath &workingDir, + const QString &file, + const QString &revision = {}, + const QStringList &extraOptions = {}); + virtual void revertAll(const Utils::FilePath &workingDir, + const QString &revision = {}, + const QStringList &extraOptions = {}); + virtual void import(const Utils::FilePath &repositoryRoot, + const QStringList &files, + const QStringList &extraOptions = {}); + virtual void update(const Utils::FilePath &repositoryRoot, + const QString &revision = {}, + const QStringList &extraOptions = {}); + virtual void commit(const Utils::FilePath &repositoryRoot, + const QStringList &files, const QString &commitMessageFile, - const QStringList &extraOptions = QStringList()); + const QStringList &extraOptions = {}); virtual Utils::FilePath findTopLevelForFile(const Utils::FilePath &/*file*/) const { return {}; } diff --git a/src/plugins/vcsbase/vcsbasediffeditorcontroller.cpp b/src/plugins/vcsbase/vcsbasediffeditorcontroller.cpp index aad270f5690..81c9234b3ea 100644 --- a/src/plugins/vcsbase/vcsbasediffeditorcontroller.cpp +++ b/src/plugins/vcsbase/vcsbasediffeditorcontroller.cpp @@ -241,7 +241,7 @@ void VcsBaseDiffEditorController::runCommand(const QList<QStringList> &args, uns // and "Waiting for data..." will be shown. d->cancelReload(); - d->m_command = new VcsCommand(workingDirectory(), d->m_processEnvironment); + d->m_command = new VcsCommand(FilePath::fromString(workingDirectory()), d->m_processEnvironment); d->m_command->setDisplayName(d->m_displayName); d->m_command->setCodec(codec ? codec : EditorManager::defaultTextCodec()); d->m_commandResultProxy = new VcsCommandResultProxy(d->m_command.data(), d); diff --git a/src/plugins/vcsbase/vcsbaseeditor.cpp b/src/plugins/vcsbase/vcsbaseeditor.cpp index 4eea9365b69..1bfe550bc46 100644 --- a/src/plugins/vcsbase/vcsbaseeditor.cpp +++ b/src/plugins/vcsbase/vcsbaseeditor.cpp @@ -91,6 +91,7 @@ \sa VcsBase::VcsBaseEditorWidget */ +using namespace Core; using namespace TextEditor; using namespace Utils; @@ -836,14 +837,14 @@ void VcsBaseEditorWidget::setHighlightingEnabled(bool e) dh->setEnabled(e); } -QString VcsBaseEditorWidget::workingDirectory() const +FilePath VcsBaseEditorWidget::workingDirectory() const { - return d->m_workingDirectory; + return FilePath::fromString(d->m_workingDirectory); } -void VcsBaseEditorWidget::setWorkingDirectory(const QString &wd) +void VcsBaseEditorWidget::setWorkingDirectory(const FilePath &wd) { - d->m_workingDirectory = wd; + d->m_workingDirectory = wd.toString(); } QTextCodec *VcsBaseEditorWidget::codec() const @@ -1297,6 +1298,11 @@ QTextCodec *VcsBaseEditor::getCodec(const QString &source) return sys; } +QTextCodec *VcsBaseEditor::getCodec(const FilePath &workingDirectory, const QStringList &files) +{ + return getCodec(workingDirectory.toString(), files); +} + QTextCodec *VcsBaseEditor::getCodec(const QString &workingDirectory, const QStringList &files) { if (files.empty()) @@ -1349,13 +1355,12 @@ bool VcsBaseEditor::gotoLineOfEditor(Core::IEditor *e, int lineNumber) // Return source file or directory string depending on parameters // ('git diff XX' -> 'XX' , 'git diff XX file' -> 'XX/file'). -QString VcsBaseEditor::getSource(const QString &workingDirectory, - const QString &fileName) +QString VcsBaseEditor::getSource(const FilePath &workingDirectory, const QString &fileName) { if (fileName.isEmpty()) - return workingDirectory; + return workingDirectory.toString(); - QString rc = workingDirectory; + QString rc = workingDirectory.toString(); const QChar slash = QLatin1Char('/'); if (!rc.isEmpty() && !(rc.endsWith(slash) || rc.endsWith(QLatin1Char('\\')))) rc += slash; @@ -1363,15 +1368,14 @@ QString VcsBaseEditor::getSource(const QString &workingDirectory, return rc; } -QString VcsBaseEditor::getSource(const QString &workingDirectory, - const QStringList &fileNames) +QString VcsBaseEditor::getSource(const FilePath &workingDirectory, const QStringList &fileNames) { - return fileNames.size() == 1 ? - getSource(workingDirectory, fileNames.front()) : - workingDirectory; + return fileNames.size() == 1 + ? getSource(workingDirectory, fileNames.front()) + : workingDirectory.toString(); } -QString VcsBaseEditor::getTitleId(const QString &workingDirectory, +QString VcsBaseEditor::getTitleId(const FilePath &workingDirectory, const QStringList &fileNames, const QString &revision) { @@ -1384,7 +1388,7 @@ QString VcsBaseEditor::getTitleId(const QString &workingDirectory, QString rc; switch (nonEmptyFileNames.size()) { case 0: - rc = workingDirectory; + rc = workingDirectory.toString(); break; case 1: rc = nonEmptyFileNames.front(); @@ -1454,13 +1458,14 @@ QString VcsBaseEditorWidget::findDiffFile(const QString &f) const if (sourceFileInfo.isFile()) return sourceFileInfo.absoluteFilePath(); - const QString topLevel = Core::VcsManager::findTopLevelForDirectory(sourceDir); + const FilePath topLevel = + VcsManager::findTopLevelForDirectory(FilePath::fromString(sourceDir)); if (topLevel.isEmpty()) return QString(); - const QFileInfo topLevelFileInfo(topLevel + slash + f); - if (topLevelFileInfo.isFile()) - return topLevelFileInfo.absoluteFilePath(); + const FilePath topLevelFile = topLevel.pathAppended(f); + if (topLevelFile.isFile()) + return topLevelFile.absoluteFilePath().toString(); } // 3) Try working directory @@ -1488,7 +1493,7 @@ void VcsBaseEditorWidget::slotAnnotateRevision() QString workingDirectory = d->m_workingDirectory; if (workingDirectory.isEmpty()) workingDirectory = QFileInfo(fileName).absolutePath(); - emit annotateRevisionRequested(workingDirectory, + emit annotateRevisionRequested(FilePath::fromString(workingDirectory), QDir(workingDirectory).relativeFilePath(fileName), a->data().toString(), currentLine); } diff --git a/src/plugins/vcsbase/vcsbaseeditor.h b/src/plugins/vcsbase/vcsbaseeditor.h index 9b21e1da3d3..e6bc50119ef 100644 --- a/src/plugins/vcsbase/vcsbaseeditor.h +++ b/src/plugins/vcsbase/vcsbaseeditor.h @@ -93,7 +93,8 @@ public: // The codec should be set on editors displaying diff or annotation // output. static QTextCodec *getCodec(const QString &source); - static QTextCodec *getCodec(const QString &workingDirectory, const QStringList &files); + static QTextCodec *getCodec(const Utils::FilePath &workingDirectory, const QStringList &files); + static QTextCodec *getCodec(const QString &workingDirectory, const QStringList &files); // FIXME: Remove // Utility to return the widget from the IEditor returned by the editor // manager which is a BaseTextEditor. @@ -111,13 +112,13 @@ public: // Convenience functions to determine the source to pass on to a diff // editor if one has a call consisting of working directory and file arguments. // ('git diff XX' -> 'XX' , 'git diff XX file' -> 'XX/file'). - static QString getSource(const QString &workingDirectory, const QString &fileName); - static QString getSource(const QString &workingDirectory, const QStringList &fileNames); + static QString getSource(const Utils::FilePath &workingDirectory, const QString &fileName); + static QString getSource(const Utils::FilePath &workingDirectory, const QStringList &fileNames); // Convenience functions to determine an title/id to identify the editor // from the arguments (','-joined arguments or directory) + revision. - static QString getTitleId(const QString &workingDirectory, + static QString getTitleId(const Utils::FilePath &workingDirectory, const QStringList &fileNames, - const QString &revision = QString()); + const QString &revision = {}); /* Tagging editors: Sometimes, an editor should be re-used, for example, when showing * a diff of the same file with different diff-options. In order to be able to find @@ -132,7 +133,7 @@ public: class VCSBASE_EXPORT VcsBaseEditorWidget : public TextEditor::TextEditorWidget { Q_PROPERTY(QString source READ source WRITE setSource) - Q_PROPERTY(QString workingDirectory READ workingDirectory WRITE setWorkingDirectory) + Q_PROPERTY(Utils::FilePath workingDirectory READ workingDirectory WRITE setWorkingDirectory) Q_PROPERTY(QTextCodec *codec READ codec WRITE setCodec) Q_PROPERTY(QString annotateRevisionTextFormat READ annotateRevisionTextFormat WRITE setAnnotateRevisionTextFormat) Q_PROPERTY(bool isFileLogAnnotateEnabled READ isFileLogAnnotateEnabled WRITE setFileLogAnnotateEnabled) @@ -198,8 +199,8 @@ public: void setCodec(QTextCodec *); // Base directory for diff views - QString workingDirectory() const; - void setWorkingDirectory(const QString &wd); + Utils::FilePath workingDirectory() const; + void setWorkingDirectory(const Utils::FilePath &wd); int firstLineNumber() const; void setFirstLineNumber(int firstLineNumber); @@ -220,7 +221,7 @@ signals: // handled by the editor manager for convenience. They are emitted // for LogOutput/AnnotateOutput content types. void describeRequested(const Utils::FilePath &source, const QString &change); - void annotateRevisionRequested(const QString &workingDirectory, const QString &file, + void annotateRevisionRequested(const Utils::FilePath &workingDirectory, const QString &file, const QString &change, int lineNumber); void diffChunkApplied(const VcsBase::DiffChunk &dc); void diffChunkReverted(const VcsBase::DiffChunk &dc); diff --git a/src/plugins/vcsbase/vcsbaseplugin.cpp b/src/plugins/vcsbase/vcsbaseplugin.cpp index 16e7a2da608..961b64caeae 100644 --- a/src/plugins/vcsbase/vcsbaseplugin.cpp +++ b/src/plugins/vcsbase/vcsbaseplugin.cpp @@ -227,14 +227,14 @@ StateListener::StateListener(QObject *parent) : QObject(parent) QString StateListener::windowTitleVcsTopic(const QString &filePath) { - QString searchPath; + FilePath searchPath; if (!filePath.isEmpty()) { - searchPath = QFileInfo(filePath).absolutePath(); + searchPath = FilePath::fromString(filePath).absolutePath(); } else { // use single project's information if there is only one loaded. const QList<Project *> projects = SessionManager::projects(); if (projects.size() == 1) - searchPath = projects.first()->projectDirectory().toString(); + searchPath = projects.first()->projectDirectory(); } if (searchPath.isEmpty()) return QString(); @@ -291,8 +291,8 @@ void StateListener::slotStateChanged() state.currentFileDirectory = currentFi.absolutePath(); state.currentFileName = currentFi.fileName(); } - fileControl = VcsManager::findVersionControlForDirectory(state.currentFileDirectory, - &state.currentFileTopLevel); + fileControl = VcsManager::findVersionControlForDirectory( + FilePath::fromString(state.currentFileDirectory), &state.currentFileTopLevel); } if (!fileControl) @@ -308,8 +308,8 @@ void StateListener::slotStateChanged() if (currentProject) { state.currentProjectPath = currentProject->projectDirectory().toString(); state.currentProjectName = currentProject->displayName(); - projectControl = VcsManager::findVersionControlForDirectory(state.currentProjectPath, - &state.currentProjectTopLevel); + projectControl = VcsManager::findVersionControlForDirectory( + FilePath::fromString(state.currentProjectPath), &state.currentProjectTopLevel); if (projectControl) { // If we have both, let the file's one take preference if (fileControl && projectControl != fileControl) @@ -381,14 +381,14 @@ QString VcsBasePluginState::currentFileName() const return data->m_state.currentFileName; } -QString VcsBasePluginState::currentFileTopLevel() const +FilePath VcsBasePluginState::currentFileTopLevel() const { - return data->m_state.currentFileTopLevel; + return FilePath::fromString(data->m_state.currentFileTopLevel); } -QString VcsBasePluginState::currentFileDirectory() const +FilePath VcsBasePluginState::currentFileDirectory() const { - return data->m_state.currentFileDirectory; + return FilePath::fromString(data->m_state.currentFileDirectory); } QString VcsBasePluginState::relativeCurrentFile() const @@ -407,9 +407,9 @@ QString VcsBasePluginState::currentPatchFileDisplayName() const return data->m_state.currentPatchFileDisplayName; } -QString VcsBasePluginState::currentProjectPath() const +FilePath VcsBasePluginState::currentProjectPath() const { - return data->m_state.currentProjectPath; + return FilePath::fromString(data->m_state.currentProjectPath); } QString VcsBasePluginState::currentProjectName() const @@ -417,9 +417,9 @@ QString VcsBasePluginState::currentProjectName() const return data->m_state.currentProjectName; } -QString VcsBasePluginState::currentProjectTopLevel() const +FilePath VcsBasePluginState::currentProjectTopLevel() const { - return data->m_state.currentProjectTopLevel; + return FilePath::fromString(data->m_state.currentProjectTopLevel); } QString VcsBasePluginState::relativeCurrentProject() const @@ -435,9 +435,9 @@ bool VcsBasePluginState::hasTopLevel() const return data->m_state.hasFile() || data->m_state.hasProject(); } -QString VcsBasePluginState::topLevel() const +FilePath VcsBasePluginState::topLevel() const { - return hasFile() ? data->m_state.currentFileTopLevel : data->m_state.currentProjectTopLevel; + return FilePath::fromString(hasFile() ? data->m_state.currentFileTopLevel : data->m_state.currentProjectTopLevel); } bool VcsBasePluginState::equals(const Internal::State &rhs) const @@ -638,27 +638,28 @@ void VcsBasePluginPrivate::createRepository() { QTC_ASSERT(supportsOperation(IVersionControl::CreateRepositoryOperation), return); // Find current starting directory - QString directory; + FilePath directory; if (const Project *currentProject = ProjectTree::currentProject()) - directory = currentProject->projectFilePath().absolutePath().toString(); + directory = currentProject->projectFilePath().absolutePath(); // Prompt for a directory that is not under version control yet QWidget *mw = ICore::dialogParent(); do { - directory = QFileDialog::getExistingDirectory(mw, tr("Choose Repository Directory"), directory); + directory = FileUtils::getExistingDirectory(tr("Choose Repository Directory"), directory); if (directory.isEmpty()) return; const IVersionControl *managingControl = VcsManager::findVersionControlForDirectory(directory); if (managingControl == nullptr) break; const QString question = tr("The directory \"%1\" is already managed by a version control system (%2)." - " Would you like to specify another directory?").arg(directory, managingControl->displayName()); + " Would you like to specify another directory?") + .arg(directory.toUserOutput(), managingControl->displayName()); if (!ask(mw, tr("Repository already under version control"), question)) return; } while (true); // Create - const bool rc = vcsCreateRepository(FilePath::fromString(directory)); - const QString nativeDir = QDir::toNativeSeparators(directory); + const bool rc = vcsCreateRepository(directory); + const QString nativeDir = directory.toUserOutput(); if (rc) { QMessageBox::information(mw, tr("Repository Created"), tr("A version control repository has been created in %1."). diff --git a/src/plugins/vcsbase/vcsbaseplugin.h b/src/plugins/vcsbase/vcsbaseplugin.h index d109c5901aa..461b902c122 100644 --- a/src/plugins/vcsbase/vcsbaseplugin.h +++ b/src/plugins/vcsbase/vcsbaseplugin.h @@ -79,8 +79,8 @@ public: // Current file. QString currentFile() const; QString currentFileName() const; - QString currentFileDirectory() const; - QString currentFileTopLevel() const; + Utils::FilePath currentFileDirectory() const; + Utils::FilePath currentFileTopLevel() const; // Convenience: Returns file relative to top level. QString relativeCurrentFile() const; @@ -90,9 +90,9 @@ public: QString currentPatchFileDisplayName() const; // Current project. - QString currentProjectPath() const; + Utils::FilePath currentProjectPath() const; QString currentProjectName() const; - QString currentProjectTopLevel() const; + Utils::FilePath currentProjectTopLevel() const; /* Convenience: Returns project path relative to top level if it * differs from top level (else empty string) as an argument list to do * eg a 'vcs diff <args>' */ @@ -100,7 +100,7 @@ public: // Top level directory for actions on the top level. Preferably // the file one. - QString topLevel() const; + Utils::FilePath topLevel() const; bool equals(const VcsBasePluginState &rhs) const; diff --git a/src/plugins/vcsbase/vcsbasesubmiteditor.cpp b/src/plugins/vcsbase/vcsbasesubmiteditor.cpp index 229a18b4b22..b18d11183c4 100644 --- a/src/plugins/vcsbase/vcsbasesubmiteditor.cpp +++ b/src/plugins/vcsbase/vcsbasesubmiteditor.cpp @@ -141,7 +141,7 @@ public: QToolBar *m_toolWidget = nullptr; VcsBaseSubmitEditorParameters m_parameters; QString m_displayName; - QString m_checkScriptWorkingDirectory; + FilePath m_checkScriptWorkingDirectory; SubmitEditorFile m_file; QPointer<QAction> m_diffAction; @@ -352,10 +352,10 @@ Core::IDocument *VcsBaseSubmitEditor::document() const QString VcsBaseSubmitEditor::checkScriptWorkingDirectory() const { - return d->m_checkScriptWorkingDirectory; + return d->m_checkScriptWorkingDirectory.toString(); } -void VcsBaseSubmitEditor::setCheckScriptWorkingDirectory(const QString &s) +void VcsBaseSubmitEditor::setCheckScriptWorkingDirectory(const FilePath &s) { d->m_checkScriptWorkingDirectory = s; } @@ -638,13 +638,13 @@ bool VcsBaseSubmitEditor::checkSubmitMessage(QString *errorMessage) const return rc; } -static inline QString msgCheckScript(const QString &workingDir, const QString &cmd) +static QString msgCheckScript(const FilePath &workingDir, const QString &cmd) { const QString nativeCmd = QDir::toNativeSeparators(cmd); return workingDir.isEmpty() ? VcsBaseSubmitEditor::tr("Executing %1").arg(nativeCmd) : VcsBaseSubmitEditor::tr("Executing [%1] %2"). - arg(QDir::toNativeSeparators(workingDir), nativeCmd); + arg(workingDir.toUserOutput(), nativeCmd); } bool VcsBaseSubmitEditor::runSubmitMessageCheckScript(const QString &checkScript, QString *errorMessage) const diff --git a/src/plugins/vcsbase/vcsbasesubmiteditor.h b/src/plugins/vcsbase/vcsbasesubmiteditor.h index 73b4209b6e0..ef317981688 100644 --- a/src/plugins/vcsbase/vcsbasesubmiteditor.h +++ b/src/plugins/vcsbase/vcsbasesubmiteditor.h @@ -66,7 +66,6 @@ class VCSBASE_EXPORT VcsBaseSubmitEditor : public Core::IEditor Q_PROPERTY(QAbstractItemView::SelectionMode fileListSelectionMode READ fileListSelectionMode WRITE setFileListSelectionMode DESIGNABLE true) Q_PROPERTY(bool lineWrap READ lineWrap WRITE setLineWrap DESIGNABLE true) Q_PROPERTY(int lineWrapWidth READ lineWrapWidth WRITE setLineWrapWidth DESIGNABLE true) - Q_PROPERTY(QString checkScriptWorkingDirectory READ checkScriptWorkingDirectory WRITE setCheckScriptWorkingDirectory DESIGNABLE true) Q_PROPERTY(bool emptyFileListEnabled READ isEmptyFileListEnabled WRITE setEmptyFileListEnabled DESIGNABLE true) protected: @@ -106,7 +105,7 @@ public: void setLineWrapWidth(int); QString checkScriptWorkingDirectory() const; - void setCheckScriptWorkingDirectory(const QString &); + void setCheckScriptWorkingDirectory(const Utils::FilePath &); Core::IDocument *document() const override; diff --git a/src/plugins/vcsbase/vcscommand.cpp b/src/plugins/vcsbase/vcscommand.cpp index 700943ce5c1..dad00d79075 100644 --- a/src/plugins/vcsbase/vcscommand.cpp +++ b/src/plugins/vcsbase/vcscommand.cpp @@ -37,11 +37,11 @@ using namespace Utils; namespace VcsBase { -VcsCommand::VcsCommand(const QString &workingDirectory, const Environment &environment) : - Core::ShellCommand(workingDirectory, environment), +VcsCommand::VcsCommand(const FilePath &workingDirectory, const Environment &environment) : + Core::ShellCommand(workingDirectory.toString(), environment), m_preventRepositoryChanged(false) { - VcsOutputWindow::setRepository(workingDirectory); + VcsOutputWindow::setRepository(workingDirectory.toString()); setDisableUnixTerminal(); m_sshPrompt = VcsBase::sshPrompt(); diff --git a/src/plugins/vcsbase/vcscommand.h b/src/plugins/vcsbase/vcscommand.h index d30f501543d..541da9822fe 100644 --- a/src/plugins/vcsbase/vcscommand.h +++ b/src/plugins/vcsbase/vcscommand.h @@ -43,7 +43,7 @@ public: ExpectRepoChanges = 0x2000, // Expect changes in repository by the command }; - VcsCommand(const QString &defaultWorkingDirectory, const Utils::Environment &environment); + VcsCommand(const Utils::FilePath &defaultWorkingDirectory, const Utils::Environment &environment); const Utils::Environment processEnvironment() const override; diff --git a/src/plugins/vcsbase/vcsoutputformatter.cpp b/src/plugins/vcsbase/vcsoutputformatter.cpp index dd79f5d8914..60d929e50a0 100644 --- a/src/plugins/vcsbase/vcsoutputformatter.cpp +++ b/src/plugins/vcsbase/vcsoutputformatter.cpp @@ -66,7 +66,7 @@ Utils::OutputLineParser::Result VcsOutputLineParser::handleLine(const QString &t return {Status::Done, linkSpecs}; } -bool VcsOutputLineParser::handleVcsLink(const QString &workingDirectory, const QString &href) +bool VcsOutputLineParser::handleVcsLink(const FilePath &workingDirectory, const QString &href) { using namespace Core; QTC_ASSERT(!href.isEmpty(), return false); @@ -75,12 +75,12 @@ bool VcsOutputLineParser::handleVcsLink(const QString &workingDirectory, const Q return true; } if (IVersionControl *vcs = VcsManager::findVersionControlForDirectory(workingDirectory)) - return vcs->handleLink(FilePath::fromString(workingDirectory), href); + return vcs->handleLink(workingDirectory, href); return false; } void VcsOutputLineParser::fillLinkContextMenu( - QMenu *menu, const QString &workingDirectory, const QString &href) + QMenu *menu, const FilePath &workingDirectory, const QString &href) { QTC_ASSERT(!href.isEmpty(), return); if (href.startsWith("https://") || href.startsWith("https://")) { @@ -91,7 +91,7 @@ void VcsOutputLineParser::fillLinkContextMenu( return; } if (Core::IVersionControl *vcs = Core::VcsManager::findVersionControlForDirectory(workingDirectory)) - vcs->fillLinkContextMenu(menu, FilePath::fromString(workingDirectory), href); + vcs->fillLinkContextMenu(menu, workingDirectory, href); } } diff --git a/src/plugins/vcsbase/vcsoutputformatter.h b/src/plugins/vcsbase/vcsoutputformatter.h index 7c8306811bc..bdc18cce544 100644 --- a/src/plugins/vcsbase/vcsoutputformatter.h +++ b/src/plugins/vcsbase/vcsoutputformatter.h @@ -36,8 +36,8 @@ class VcsOutputLineParser : public Utils::OutputLineParser Q_OBJECT public: VcsOutputLineParser(); - void fillLinkContextMenu(QMenu *menu, const QString &workingDirectory, const QString &href); - bool handleVcsLink(const QString &workingDirectory, const QString &href); + void fillLinkContextMenu(QMenu *menu, const Utils::FilePath &workingDirectory, const QString &href); + bool handleVcsLink(const Utils::FilePath &workingDirectory, const QString &href); private: Result handleLine(const QString &text, Utils::OutputFormat format) override; diff --git a/src/plugins/vcsbase/vcsoutputwindow.cpp b/src/plugins/vcsbase/vcsoutputwindow.cpp index 1069a3fa7dc..07d029ea6df 100644 --- a/src/plugins/vcsbase/vcsoutputwindow.cpp +++ b/src/plugins/vcsbase/vcsoutputwindow.cpp @@ -177,7 +177,7 @@ void OutputWindowPlainTextEdit::contextMenuEvent(QContextMenuEvent *event) if (!repository.isEmpty()) { if (VcsOutputLineParser * const p = parser()) { if (!href.isEmpty()) - p->fillLinkContextMenu(menu, repository, href); + p->fillLinkContextMenu(menu, FilePath::fromString(repository), href); } } QAction *openAction = nullptr; @@ -229,7 +229,7 @@ void OutputWindowPlainTextEdit::handleLink(const QPoint &pos) if (outputFormatter()->handleFileLink(href)) return; if (VcsOutputLineParser * const p = parser()) - p->handleVcsLink(repository, href); + p->handleVcsLink(FilePath::fromString(repository), href); } void OutputWindowPlainTextEdit::appendLines(const QString &s, const QString &repository) diff --git a/src/plugins/vcsbase/vcsplugin.cpp b/src/plugins/vcsbase/vcsplugin.cpp index 52ff7034e25..4e553a0d422 100644 --- a/src/plugins/vcsbase/vcsplugin.cpp +++ b/src/plugins/vcsbase/vcsplugin.cpp @@ -112,7 +112,7 @@ bool VcsPlugin::initialize(const QStringList &arguments, QString *errorMessage) []() -> QString { IVersionControl *vc = nullptr; if (Project *project = ProjectTree::currentProject()) - vc = VcsManager::findVersionControlForDirectory(project->projectDirectory().toString()); + vc = VcsManager::findVersionControlForDirectory(project->projectDirectory()); return vc ? vc->displayName() : QString(); }); @@ -122,7 +122,7 @@ bool VcsPlugin::initialize(const QStringList &arguments, QString *errorMessage) IVersionControl *vc = nullptr; QString topLevel; if (Project *project = ProjectTree::currentProject()) - vc = VcsManager::findVersionControlForDirectory(project->projectDirectory().toString(), &topLevel); + vc = VcsManager::findVersionControlForDirectory(project->projectDirectory(), &topLevel); return vc ? vc->vcsTopic(FilePath::fromString(topLevel)) : QString(); }); @@ -130,7 +130,7 @@ bool VcsPlugin::initialize(const QStringList &arguments, QString *errorMessage) tr("The top level path to the repository the current project is in."), []() -> QString { if (Project *project = ProjectTree::currentProject()) - return VcsManager::findTopLevelForDirectory(project->projectDirectory().toString()); + return VcsManager::findTopLevelForDirectory(project->projectDirectory()).toString(); return QString(); }); |
