forked from qt-creator/qt-creator
Vcs: Merge IVersionControl and VcsBasePlugin hierarchies
They were 1:1 in parallel, with quite a bit of function call ping-pong inbetween, for code-sharing-by-inheritance. Merge them by making VcsBasePlugin inherit IVersionControl and merge the derived classes below. Size of this patch is hard to avoid as all seven systems have to move simultaneously. Non-necessary potential follow-up cleanup have been left out on purpose. Change-Id: Icb71e4182af3db21069cc637e7ae87ffa3829791 Reviewed-by: Orgad Shaneh <orgads@gmail.com>
This commit is contained in:
@@ -10,7 +10,6 @@ add_qtc_plugin(Perforce
|
||||
perforcesettings.cpp perforcesettings.h
|
||||
perforcesubmiteditor.cpp perforcesubmiteditor.h
|
||||
perforcesubmiteditorwidget.cpp perforcesubmiteditorwidget.h
|
||||
perforceversioncontrol.cpp perforceversioncontrol.h
|
||||
promptdialog.ui
|
||||
settingspage.cpp settingspage.h settingspage.ui
|
||||
submitpanel.ui
|
||||
|
||||
@@ -8,7 +8,6 @@ HEADERS += \
|
||||
changenumberdialog.h \
|
||||
perforcesubmiteditor.h \
|
||||
pendingchangesdialog.h \
|
||||
perforceversioncontrol.h \
|
||||
perforcesettings.h \
|
||||
annotationhighlighter.h \
|
||||
perforcesubmiteditorwidget.h
|
||||
@@ -20,7 +19,6 @@ SOURCES += perforceplugin.cpp \
|
||||
changenumberdialog.cpp \
|
||||
perforcesubmiteditor.cpp \
|
||||
pendingchangesdialog.cpp \
|
||||
perforceversioncontrol.cpp \
|
||||
perforcesettings.cpp \
|
||||
annotationhighlighter.cpp \
|
||||
perforcesubmiteditorwidget.cpp
|
||||
|
||||
@@ -31,8 +31,6 @@ QtcPlugin {
|
||||
"perforcesubmiteditor.h",
|
||||
"perforcesubmiteditorwidget.cpp",
|
||||
"perforcesubmiteditorwidget.h",
|
||||
"perforceversioncontrol.cpp",
|
||||
"perforceversioncontrol.h",
|
||||
"settingspage.cpp",
|
||||
"settingspage.h",
|
||||
"settingspage.ui",
|
||||
|
||||
@@ -29,9 +29,9 @@
|
||||
#include "pendingchangesdialog.h"
|
||||
#include "perforceeditor.h"
|
||||
#include "perforcesubmiteditor.h"
|
||||
#include "perforceversioncontrol.h"
|
||||
#include "perforcechecker.h"
|
||||
#include "settingspage.h"
|
||||
#include "perforcesettings.h"
|
||||
|
||||
#include <coreplugin/actionmanager/actionmanager.h>
|
||||
#include <coreplugin/actionmanager/actioncontainer.h>
|
||||
@@ -49,6 +49,7 @@
|
||||
#include <utils/qtcassert.h>
|
||||
#include <utils/synchronousprocess.h>
|
||||
#include <utils/temporarydirectory.h>
|
||||
|
||||
#include <vcsbase/basevcseditorfactory.h>
|
||||
#include <vcsbase/basevcssubmiteditorfactory.h>
|
||||
#include <vcsbase/vcsbaseeditor.h>
|
||||
@@ -191,12 +192,10 @@ bool PerforcePlugin::initialize(const QStringList & /* arguments */, QString *er
|
||||
}
|
||||
|
||||
PerforcePluginPrivate::PerforcePluginPrivate()
|
||||
: VcsBase::VcsBasePluginPrivate(Context(PERFORCE_CONTEXT))
|
||||
{
|
||||
Context context(PERFORCE_CONTEXT);
|
||||
|
||||
auto vcsCtrl = new PerforceVersionControl(this);
|
||||
initializeVcs(vcsCtrl, context);
|
||||
|
||||
dd = this;
|
||||
|
||||
m_settings.fromSettings(ICore::settings());
|
||||
@@ -442,7 +441,7 @@ void PerforcePluginPrivate::revertCurrentFile()
|
||||
PerforceResponse result2 = runP4Cmd(state.currentFileTopLevel(), args,
|
||||
CommandToWindow|StdOutToWindow|StdErrToWindow|ErrorToWindow);
|
||||
if (!result2.error)
|
||||
perforceVersionControl()->emitFilesChanged(QStringList(state.currentFile()));
|
||||
emit filesChanged(QStringList(state.currentFile()));
|
||||
}
|
||||
|
||||
void PerforcePluginPrivate::diffCurrentFile()
|
||||
@@ -514,11 +513,11 @@ void PerforcePluginPrivate::updateCheckout(const QString &workingDir, const QStr
|
||||
CommandToWindow|StdOutToWindow|StdErrToWindow|ErrorToWindow);
|
||||
if (dirs.empty()) {
|
||||
if (!workingDir.isEmpty())
|
||||
perforceVersionControl()->emitRepositoryChanged(workingDir);
|
||||
emit repositoryChanged(workingDir);
|
||||
} else {
|
||||
const QChar slash = QLatin1Char('/');
|
||||
foreach (const QString &dir, dirs)
|
||||
perforceVersionControl()->emitRepositoryChanged(workingDir + slash + dir);
|
||||
emit repositoryChanged(workingDir + slash + dir);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -794,9 +793,9 @@ void PerforcePluginPrivate::updateActions(VcsBasePluginPrivate::ActionState as)
|
||||
m_revertUnchangedAction->setParameter(projectName);
|
||||
}
|
||||
|
||||
bool PerforcePluginPrivate::managesDirectory(const QString &directory, QString *topLevel /* = 0 */)
|
||||
bool PerforcePluginPrivate::managesDirectory(const QString &directory, QString *topLevel /* = 0 */) const
|
||||
{
|
||||
const bool rc = managesDirectoryFstat(directory);
|
||||
const bool rc = const_cast<PerforcePluginPrivate *>(this)->managesDirectoryFstat(directory);
|
||||
if (topLevel) {
|
||||
if (rc)
|
||||
*topLevel = m_settings.topLevelSymLinkTarget();
|
||||
@@ -942,6 +941,99 @@ PerforcePluginPrivate::createTemporaryArgumentFile(const QStringList &extraArgs,
|
||||
return rc;
|
||||
}
|
||||
|
||||
bool PerforcePluginPrivate::isVcsFileOrDirectory(const Utils::FilePath &fileName) const
|
||||
{
|
||||
Q_UNUSED(fileName)
|
||||
return false; // Perforce does not seem to litter its files into the source tree.
|
||||
}
|
||||
|
||||
bool PerforcePluginPrivate::isConfigured() const
|
||||
{
|
||||
const QString binary = settings().p4BinaryPath();
|
||||
if (binary.isEmpty())
|
||||
return false;
|
||||
QFileInfo fi(binary);
|
||||
return fi.exists() && fi.isFile() && fi.isExecutable();
|
||||
}
|
||||
|
||||
bool PerforcePluginPrivate::supportsOperation(Operation operation) const
|
||||
{
|
||||
bool supported = isConfigured();
|
||||
switch (operation) {
|
||||
case AddOperation:
|
||||
case DeleteOperation:
|
||||
case MoveOperation:
|
||||
case AnnotateOperation:
|
||||
return supported;
|
||||
case CreateRepositoryOperation:
|
||||
case SnapshotOperations:
|
||||
case InitialCheckoutOperation:
|
||||
break;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
Core::IVersionControl::OpenSupportMode PerforcePluginPrivate::openSupportMode(const QString &fileName) const
|
||||
{
|
||||
Q_UNUSED(fileName)
|
||||
return OpenOptional;
|
||||
}
|
||||
|
||||
bool PerforcePluginPrivate::vcsOpen(const QString &fileName)
|
||||
{
|
||||
const QFileInfo fi(fileName);
|
||||
return vcsOpen(fi.absolutePath(), fi.fileName(), true);
|
||||
}
|
||||
|
||||
Core::IVersionControl::SettingsFlags PerforcePluginPrivate::settingsFlags() const
|
||||
{
|
||||
SettingsFlags rc;
|
||||
if (m_settings.autoOpen())
|
||||
rc|= AutoOpen;
|
||||
return rc;
|
||||
}
|
||||
|
||||
bool PerforcePluginPrivate::vcsAdd(const QString &fileName)
|
||||
{
|
||||
const QFileInfo fi(fileName);
|
||||
return vcsAdd(fi.absolutePath(), fi.fileName());
|
||||
}
|
||||
|
||||
bool PerforcePluginPrivate::vcsDelete(const QString &fileName)
|
||||
{
|
||||
const QFileInfo fi(fileName);
|
||||
return vcsDelete(fi.absolutePath(), fi.fileName());
|
||||
}
|
||||
|
||||
bool PerforcePluginPrivate::vcsMove(const QString &from, const QString &to)
|
||||
{
|
||||
const QFileInfo fromInfo(from);
|
||||
const QFileInfo toInfo(to);
|
||||
return vcsMove(fromInfo.absolutePath(), fromInfo.absoluteFilePath(), toInfo.absoluteFilePath());
|
||||
}
|
||||
|
||||
bool PerforcePluginPrivate::vcsCreateRepository(const QString &)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool PerforcePluginPrivate::vcsAnnotate(const QString &file, int line)
|
||||
{
|
||||
const QFileInfo fi(file);
|
||||
vcsAnnotate(fi.absolutePath(), fi.fileName(), QString(), line);
|
||||
return true;
|
||||
}
|
||||
|
||||
QString PerforcePluginPrivate::vcsOpenText() const
|
||||
{
|
||||
return tr("&Edit");
|
||||
}
|
||||
|
||||
QString PerforcePluginPrivate::vcsMakeWritableText() const
|
||||
{
|
||||
return tr("&Hijack");
|
||||
}
|
||||
|
||||
// Run messages
|
||||
|
||||
static inline QString msgNotStarted(const QString &cmd)
|
||||
@@ -1415,7 +1507,7 @@ void PerforcePluginPrivate::setSettings(const Settings &newSettings)
|
||||
dd->m_managedDirectoryCache.clear();
|
||||
dd->m_settings.toSettings(ICore::settings());
|
||||
getTopLevel();
|
||||
perforceVersionControl()->emitConfigurationChanged();
|
||||
emit dd->configurationChanged();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1462,11 +1554,6 @@ QString PerforcePluginPrivate::fileNameFromPerforceName(const QString& perforceN
|
||||
return dd->m_settings.mapToFileSystem(p4fileSpec);
|
||||
}
|
||||
|
||||
PerforceVersionControl *PerforcePluginPrivate::perforceVersionControl()
|
||||
{
|
||||
return static_cast<PerforceVersionControl *>(dd->versionControl());
|
||||
}
|
||||
|
||||
void PerforcePluginPrivate::setTopLevel(const QString &topLevel)
|
||||
{
|
||||
if (m_settings.topLevel() == topLevel)
|
||||
|
||||
@@ -29,6 +29,8 @@
|
||||
|
||||
#include <coreplugin/editormanager/ieditorfactory.h>
|
||||
#include <coreplugin/iversioncontrol.h>
|
||||
|
||||
#include <vcsbase/vcsbaseconstants.h>
|
||||
#include <vcsbase/vcsbaseplugin.h>
|
||||
|
||||
#include <QObject>
|
||||
@@ -76,8 +78,28 @@ class PerforcePluginPrivate final : public VcsBase::VcsBasePluginPrivate
|
||||
public:
|
||||
PerforcePluginPrivate();
|
||||
|
||||
bool managesDirectory(const QString &directory, QString *topLevel = nullptr);
|
||||
bool managesFile(const QString &workingDirectory, const QString &fileName) const;
|
||||
// IVersionControl
|
||||
QString displayName() const final { return {"perforce"}; }
|
||||
Core::Id id() const final { return Core::Id(VcsBase::Constants::VCS_ID_PERFORCE); }
|
||||
|
||||
bool isVcsFileOrDirectory(const Utils::FilePath &fileName) const final;
|
||||
bool managesDirectory(const QString &directory, QString *topLevel = nullptr) const final;
|
||||
bool managesFile(const QString &workingDirectory, const QString &fileName) const final;
|
||||
|
||||
bool isConfigured() const final;
|
||||
bool supportsOperation(Operation operation) const final;
|
||||
OpenSupportMode openSupportMode(const QString &fileName) const final;
|
||||
bool vcsOpen(const QString &fileName) final;
|
||||
SettingsFlags settingsFlags() const final;
|
||||
bool vcsAdd(const QString &fileName) final;
|
||||
bool vcsDelete(const QString &filename) final;
|
||||
bool vcsMove(const QString &from, const QString &to) final;
|
||||
bool vcsCreateRepository(const QString &directory) final;
|
||||
bool vcsAnnotate(const QString &file, int line) final;
|
||||
QString vcsOpenText() const final;
|
||||
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);
|
||||
@@ -203,8 +225,6 @@ private:
|
||||
bool revertProject(const QString &workingDir, const QStringList &args, bool unchangedOnly);
|
||||
bool managesDirectoryFstat(const QString &directory);
|
||||
|
||||
static PerforceVersionControl *perforceVersionControl();
|
||||
|
||||
Core::CommandLocator *m_commandLocator = nullptr;
|
||||
Utils::ParameterAction *m_editAction = nullptr;
|
||||
Utils::ParameterAction *m_addAction = nullptr;
|
||||
|
||||
@@ -1,171 +0,0 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2016 The Qt Company Ltd.
|
||||
** Contact: https://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of Qt Creator.
|
||||
**
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see https://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at https://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
|
||||
** included in the packaging of this file. Please review the following
|
||||
** information to ensure the GNU General Public License requirements will
|
||||
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "perforceversioncontrol.h"
|
||||
#include "perforceplugin.h"
|
||||
#include "perforcesettings.h"
|
||||
|
||||
#include <vcsbase/vcsbaseconstants.h>
|
||||
|
||||
#include <QFileInfo>
|
||||
#include <QDebug>
|
||||
|
||||
namespace Perforce {
|
||||
namespace Internal {
|
||||
|
||||
PerforceVersionControl::PerforceVersionControl(PerforcePluginPrivate *plugin) :
|
||||
m_plugin(plugin)
|
||||
{ }
|
||||
|
||||
QString PerforceVersionControl::displayName() const
|
||||
{
|
||||
return QLatin1String("perforce");
|
||||
}
|
||||
|
||||
Core::Id PerforceVersionControl::id() const
|
||||
{
|
||||
return Core::Id(VcsBase::Constants::VCS_ID_PERFORCE);
|
||||
}
|
||||
|
||||
bool PerforceVersionControl::isVcsFileOrDirectory(const Utils::FilePath &fileName) const
|
||||
{
|
||||
Q_UNUSED(fileName)
|
||||
return false; // Perforce does not seem to litter its files into the source tree.
|
||||
}
|
||||
|
||||
bool PerforceVersionControl::isConfigured() const
|
||||
{
|
||||
const QString binary = m_plugin->settings().p4BinaryPath();
|
||||
if (binary.isEmpty())
|
||||
return false;
|
||||
QFileInfo fi(binary);
|
||||
return fi.exists() && fi.isFile() && fi.isExecutable();
|
||||
}
|
||||
|
||||
bool PerforceVersionControl::supportsOperation(Operation operation) const
|
||||
{
|
||||
bool supported = isConfigured();
|
||||
switch (operation) {
|
||||
case AddOperation:
|
||||
case DeleteOperation:
|
||||
case MoveOperation:
|
||||
case AnnotateOperation:
|
||||
return supported;
|
||||
case CreateRepositoryOperation:
|
||||
case SnapshotOperations:
|
||||
case InitialCheckoutOperation:
|
||||
break;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
Core::IVersionControl::OpenSupportMode PerforceVersionControl::openSupportMode(const QString &fileName) const
|
||||
{
|
||||
Q_UNUSED(fileName)
|
||||
return OpenOptional;
|
||||
}
|
||||
|
||||
bool PerforceVersionControl::vcsOpen(const QString &fileName)
|
||||
{
|
||||
const QFileInfo fi(fileName);
|
||||
return m_plugin->vcsOpen(fi.absolutePath(), fi.fileName(), true);
|
||||
}
|
||||
|
||||
Core::IVersionControl::SettingsFlags PerforceVersionControl::settingsFlags() const
|
||||
{
|
||||
SettingsFlags rc;
|
||||
if (m_plugin->settings().autoOpen())
|
||||
rc|= AutoOpen;
|
||||
return rc;
|
||||
}
|
||||
|
||||
bool PerforceVersionControl::vcsAdd(const QString &fileName)
|
||||
{
|
||||
const QFileInfo fi(fileName);
|
||||
return m_plugin->vcsAdd(fi.absolutePath(), fi.fileName());
|
||||
}
|
||||
|
||||
bool PerforceVersionControl::vcsDelete(const QString &fileName)
|
||||
{
|
||||
const QFileInfo fi(fileName);
|
||||
return m_plugin->vcsDelete(fi.absolutePath(), fi.fileName());
|
||||
}
|
||||
|
||||
bool PerforceVersionControl::vcsMove(const QString &from, const QString &to)
|
||||
{
|
||||
const QFileInfo fromInfo(from);
|
||||
const QFileInfo toInfo(to);
|
||||
return m_plugin->vcsMove(fromInfo.absolutePath(), fromInfo.absoluteFilePath(), toInfo.absoluteFilePath());
|
||||
}
|
||||
|
||||
bool PerforceVersionControl::vcsCreateRepository(const QString &)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool PerforceVersionControl::vcsAnnotate(const QString &file, int line)
|
||||
{
|
||||
const QFileInfo fi(file);
|
||||
m_plugin->vcsAnnotate(fi.absolutePath(), fi.fileName(), QString(), line);
|
||||
return true;
|
||||
}
|
||||
|
||||
QString PerforceVersionControl::vcsOpenText() const
|
||||
{
|
||||
return tr("&Edit");
|
||||
}
|
||||
|
||||
QString PerforceVersionControl::vcsMakeWritableText() const
|
||||
{
|
||||
return tr("&Hijack");
|
||||
}
|
||||
|
||||
bool PerforceVersionControl::managesDirectory(const QString &directory, QString *topLevel) const
|
||||
{
|
||||
return m_plugin->managesDirectory(directory, topLevel);
|
||||
}
|
||||
|
||||
bool PerforceVersionControl::managesFile(const QString &workingDirectory, const QString &fileName) const
|
||||
{
|
||||
return m_plugin->managesFile(workingDirectory, fileName);
|
||||
}
|
||||
|
||||
void PerforceVersionControl::emitRepositoryChanged(const QString &s)
|
||||
{
|
||||
emit repositoryChanged(s);
|
||||
}
|
||||
|
||||
void PerforceVersionControl::emitFilesChanged(const QStringList &l)
|
||||
{
|
||||
emit filesChanged(l);
|
||||
}
|
||||
|
||||
void PerforceVersionControl::emitConfigurationChanged()
|
||||
{
|
||||
emit configurationChanged();
|
||||
}
|
||||
|
||||
} // Internal
|
||||
} // Perforce
|
||||
@@ -1,70 +0,0 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2016 The Qt Company Ltd.
|
||||
** Contact: https://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of Qt Creator.
|
||||
**
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see https://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at https://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
|
||||
** included in the packaging of this file. Please review the following
|
||||
** information to ensure the GNU General Public License requirements will
|
||||
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <coreplugin/iversioncontrol.h>
|
||||
|
||||
namespace Perforce {
|
||||
namespace Internal {
|
||||
class PerforcePluginPrivate;
|
||||
|
||||
// Just a proxy for PerforcePlugin
|
||||
class PerforceVersionControl : public Core::IVersionControl
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit PerforceVersionControl(PerforcePluginPrivate *plugin);
|
||||
|
||||
QString displayName() const final;
|
||||
Core::Id id() const final;
|
||||
|
||||
bool isVcsFileOrDirectory(const Utils::FilePath &fileName) const final;
|
||||
bool managesDirectory(const QString &directory, QString *topLevel = nullptr) const final;
|
||||
bool managesFile(const QString &workingDirectory, const QString &fileName) const final;
|
||||
|
||||
bool isConfigured() const final;
|
||||
bool supportsOperation(Operation operation) const final;
|
||||
OpenSupportMode openSupportMode(const QString &fileName) const final;
|
||||
bool vcsOpen(const QString &fileName) final;
|
||||
SettingsFlags settingsFlags() const final;
|
||||
bool vcsAdd(const QString &fileName) final;
|
||||
bool vcsDelete(const QString &filename) final;
|
||||
bool vcsMove(const QString &from, const QString &to) final;
|
||||
bool vcsCreateRepository(const QString &directory) final;
|
||||
bool vcsAnnotate(const QString &file, int line) final;
|
||||
QString vcsOpenText() const final;
|
||||
QString vcsMakeWritableText() const final;
|
||||
|
||||
void emitRepositoryChanged(const QString &s);
|
||||
void emitFilesChanged(const QStringList &l);
|
||||
void emitConfigurationChanged();
|
||||
|
||||
private:
|
||||
PerforcePluginPrivate *m_plugin;
|
||||
};
|
||||
|
||||
} // namespace Internal
|
||||
} // namespace Perforce
|
||||
Reference in New Issue
Block a user