aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/clearcase/clearcaseplugin.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/clearcase/clearcaseplugin.cpp')
-rw-r--r--src/plugins/clearcase/clearcaseplugin.cpp275
1 files changed, 262 insertions, 13 deletions
diff --git a/src/plugins/clearcase/clearcaseplugin.cpp b/src/plugins/clearcase/clearcaseplugin.cpp
index a2225c01c54..d572b2a7fec 100644
--- a/src/plugins/clearcase/clearcaseplugin.cpp
+++ b/src/plugins/clearcase/clearcaseplugin.cpp
@@ -60,11 +60,14 @@
#include <utils/hostosinfo.h>
#include <utils/qtcassert.h>
#include <utils/runextensions.h>
+
#include <vcsbase/basevcseditorfactory.h>
#include <vcsbase/basevcssubmiteditorfactory.h>
#include <vcsbase/vcsbaseeditor.h>
+#include <vcsbase/vcscommand.h>
#include <vcsbase/vcsoutputwindow.h>
#include <vcsbase/vcsbasesubmiteditor.h>
+#include <vcsbase/vcsbaseplugin.h>
#include <QAction>
#include <QDebug>
@@ -85,7 +88,6 @@
#include <QRegExp>
#include <QSharedPointer>
#include <QTextCodec>
-#include <QtPlugin>
#include <QUrl>
#include <QUuid>
#include <QVariant>
@@ -121,6 +123,15 @@ static const char CMD_ID_UPDATE_VIEW[] = "ClearCase.UpdateView";
static const char CMD_ID_CHECKIN_ALL[] = "ClearCase.CheckInAll";
static const char CMD_ID_STATUS[] = "ClearCase.Status";
+class ClearCaseResponse
+{
+public:
+ bool error = false;
+ QString stdOut;
+ QString stdErr;
+ QString message;
+};
+
static const VcsBaseEditorParameters editorParameters[] = {
{
LogOutput,
@@ -150,6 +161,195 @@ static QString debugCodec(const QTextCodec *c)
return c ? QString::fromLatin1(c->name()) : QString::fromLatin1("Null codec");
}
+class ClearCasePluginPrivate final : public VcsBase::VcsBasePluginPrivate
+{
+ Q_OBJECT
+ enum { SilentRun = VcsBase::VcsCommand::NoOutput | VcsBase::VcsCommand::FullySynchronously };
+
+public:
+ ClearCasePluginPrivate();
+ ~ClearCasePluginPrivate() final;
+
+ // IVersionControl
+ QString displayName() const final;
+ Core::Id id() const final;
+
+ bool isVcsFileOrDirectory(const Utils::FilePath &fileName) const final;
+
+ bool managesDirectory(const QString &directory, QString *topLevel) 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;
+ QString vcsTopic(const QString &directory) final;
+
+ ///
+ ClearCaseSubmitEditor *openClearCaseSubmitEditor(const QString &fileName, 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 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);
+
+ static ClearCasePluginPrivate *instance();
+
+ QString ccGetCurrentActivity() const;
+ QList<QStringPair> activities(int *current = nullptr) const;
+ 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());
+ FileStatus vcsStatus(const QString &file) const;
+ void checkAndReIndexUnknownFile(const QString &file);
+ QString currentView() const { return m_viewData.name; }
+ QString viewRoot() const { return m_viewData.root; }
+ void refreshActivities();
+ inline bool isUcm() const { return m_viewData.isUcm; }
+ 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;
+#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;
+ bool newActivity();
+ void updateStreamAndView();
+ void describe(const QString &source, const QString &changeNr);
+
+protected:
+ void updateActions(VcsBase::VcsBasePluginPrivate::ActionState) override;
+ bool submitEditorAboutToClose() override;
+ QString ccGet(const QString &workingDir, const QString &file, const QString &prefix = QString());
+ QList<QStringPair> ccGetActivities() const;
+
+private:
+ void syncSlot();
+ Q_INVOKABLE void updateStatusActions();
+
+ QString commitDisplayName() const final;
+ void checkOutCurrentFile();
+ void addCurrentFile();
+ void undoCheckOutCurrent();
+ void undoHijackCurrent();
+ void diffActivity();
+ void diffCurrentFile();
+ void startCheckInAll();
+ void startCheckInActivity();
+ void startCheckInCurrentFile();
+ void historyCurrentFile();
+ void annotateCurrentFile();
+ void viewStatus();
+ void commitFromEditor() override;
+ void diffCheckInFiles(const QStringList &);
+ void updateIndex();
+ void updateView();
+ void projectChanged(ProjectExplorer::Project *project);
+ void tasksFinished(Core::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;
+ Core::IEditor *showOutputInEditor(const QString& title, const QString &output,
+ int editorType, const QString &source,
+ QTextCodec *codec) const;
+ QString runCleartoolSync(const QString &workingDir, const QStringList &arguments) const;
+ ClearCaseResponse runCleartool(const QString &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(),
+ 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());
+ void cleanCheckInMessageFile();
+ QString ccGetFileActivity(const QString &workingDir, const QString &file);
+ QStringList ccGetActivityVersions(const QString &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,
+ QTextCodec *outputCodec = nullptr);
+ static QString getDriveLetterOfPath(const QString &directory);
+
+ FileStatus::Status getFileStatus(const QString &fileName) const;
+ void updateStatusForFile(const QString &absFile);
+ void updateEditDerivedObjectWarning(const QString &fileName, const FileStatus::Status status);
+
+ ClearCaseSettings m_settings;
+
+ QString m_checkInMessageFileName;
+ QString m_checkInView;
+ QString m_topLevel;
+ QString m_stream;
+ ViewData m_viewData;
+ QString m_intStream;
+ QString m_activity;
+ QString m_diffPrefix;
+
+ Core::CommandLocator *m_commandLocator = nullptr;
+ Utils::ParameterAction *m_checkOutAction = nullptr;
+ Utils::ParameterAction *m_checkInCurrentAction = nullptr;
+ Utils::ParameterAction *m_undoCheckOutAction = nullptr;
+ Utils::ParameterAction *m_undoHijackAction = nullptr;
+ Utils::ParameterAction *m_diffCurrentAction = nullptr;
+ Utils::ParameterAction *m_historyCurrentAction = nullptr;
+ Utils::ParameterAction *m_annotateCurrentAction = nullptr;
+ Utils::ParameterAction *m_addFileAction = nullptr;
+ QAction *m_diffActivityAction = nullptr;
+ QAction *m_updateIndexAction = nullptr;
+ Utils::ParameterAction *m_updateViewAction = nullptr;
+ Utils::ParameterAction *m_checkInActivityAction = nullptr;
+ QAction *m_checkInAllAction = nullptr;
+ QAction *m_statusAction = nullptr;
+
+ QAction *m_menuAction = nullptr;
+ bool m_submitActionTriggered = false;
+ QMutex *m_activityMutex;
+ QList<QStringPair> m_activities;
+ QSharedPointer<StatusMap> m_statusMap;
+
+ friend class ClearCasePlugin;
+#ifdef WITH_TESTS
+ bool m_fakeClearTool = false;
+ QString m_tempFile;
+#endif
+};
+
// ------------- ClearCasePlugin
static ClearCasePluginPrivate *dd = nullptr;
@@ -162,12 +362,6 @@ ClearCasePluginPrivate::~ClearCasePluginPrivate()
delete m_activityMutex;
}
-ClearCasePlugin::~ClearCasePlugin()
-{
- delete dd;
- dd = nullptr;
-}
-
void ClearCasePluginPrivate::cleanCheckInMessageFile()
{
if (!m_checkInMessageFileName.isEmpty()) {
@@ -2176,7 +2370,7 @@ void ClearCasePluginPrivate::closing()
void ClearCasePluginPrivate::sync(QFutureInterface<void> &future, QStringList files)
{
ClearCasePluginPrivate *plugin = ClearCasePluginPrivate::instance();
- ClearCaseSync ccSync(plugin, plugin->m_statusMap);
+ ClearCaseSync ccSync(plugin->m_statusMap);
connect(&ccSync, &ClearCaseSync::updateStreamAndView, plugin, &ClearCasePluginPrivate::updateStreamAndView);
ccSync.run(future, files);
}
@@ -2309,6 +2503,59 @@ bool ClearCasePluginPrivate::vcsCreateRepository(const QString &)
return false;
}
+// ClearCasePlugin
+
+ClearCasePlugin::~ClearCasePlugin()
+{
+ delete dd;
+ dd = nullptr;
+}
+
+bool ClearCasePlugin::newActivity()
+{
+ return dd->newActivity();
+}
+
+const QList<QStringPair> ClearCasePlugin::activities(int *current)
+{
+ return dd->activities(current);
+}
+
+QStringList ClearCasePlugin::ccGetActiveVobs()
+{
+ return dd->ccGetActiveVobs();
+}
+
+void ClearCasePlugin::refreshActivities()
+{
+ dd->refreshActivities();
+}
+
+const ViewData ClearCasePlugin::viewData()
+{
+ return dd->m_viewData;
+}
+
+void ClearCasePlugin::setStatus(const QString &file, FileStatus::Status status, bool update)
+{
+ dd->setStatus(file, status, update);
+}
+
+const ClearCaseSettings &ClearCasePlugin::settings()
+{
+ return dd->m_settings;
+}
+
+void ClearCasePlugin::setSettings(const ClearCaseSettings &s)
+{
+ dd->setSettings(s);
+}
+
+QSharedPointer<StatusMap> ClearCasePlugin::statusMap()
+{
+ return dd->m_statusMap;
+}
+
#ifdef WITH_TESTS
void ClearCasePlugin::testDiffFileResolving_data()
@@ -2388,14 +2635,14 @@ void ClearCasePlugin::testFileStatusParsing()
QFETCH(QString, cleartoolLsLine);
QFETCH(int, status);
- ClearCaseSync ccSync(dd, dd->m_statusMap);
+ ClearCaseSync ccSync(dd->m_statusMap);
ccSync.verifyParseStatus(filename, cleartoolLsLine, static_cast<FileStatus::Status>(status));
}
void ClearCasePlugin::testFileNotManaged()
{
dd->m_statusMap = QSharedPointer<StatusMap>(new StatusMap);
- ClearCaseSync ccSync(dd, dd->m_statusMap);
+ ClearCaseSync ccSync(dd->m_statusMap);
ccSync.verifyFileNotManaged();
}
@@ -2403,21 +2650,21 @@ void ClearCasePlugin::testFileCheckedOutDynamicView()
{
dd->m_statusMap = QSharedPointer<StatusMap>(new StatusMap);
- ClearCaseSync ccSync(dd, dd->m_statusMap);
+ ClearCaseSync ccSync(dd->m_statusMap);
ccSync.verifyFileCheckedOutDynamicView();
}
void ClearCasePlugin::testFileCheckedInDynamicView()
{
dd->m_statusMap = QSharedPointer<StatusMap>(new StatusMap);
- ClearCaseSync ccSync(dd, dd->m_statusMap);
+ ClearCaseSync ccSync(dd->m_statusMap);
ccSync.verifyFileCheckedInDynamicView();
}
void ClearCasePlugin::testFileNotManagedDynamicView()
{
dd->m_statusMap = QSharedPointer<StatusMap>(new StatusMap);
- ClearCaseSync ccSync(dd, dd->m_statusMap);
+ ClearCaseSync ccSync(dd->m_statusMap);
ccSync.verifyFileNotManagedDynamicView();
}
@@ -2564,3 +2811,5 @@ void ClearCasePlugin::testVcsStatusDynamicNotManaged()
} // namespace Internal
} // namespace ClearCase
+
+#include "clearcaseplugin.moc"