diff options
-rw-r--r-- | src/plugins/clearcase/activityselector.cpp | 2 | ||||
-rw-r--r-- | src/plugins/clearcase/checkoutdialog.cpp | 20 | ||||
-rw-r--r-- | src/plugins/clearcase/checkoutdialog.h | 5 | ||||
-rw-r--r-- | src/plugins/clearcase/checkoutdialog.ui | 18 | ||||
-rw-r--r-- | src/plugins/clearcase/clearcaseplugin.cpp | 78 | ||||
-rw-r--r-- | src/plugins/clearcase/clearcaseplugin.h | 8 | ||||
-rw-r--r-- | src/plugins/clearcase/clearcasesubmiteditor.cpp | 5 | ||||
-rw-r--r-- | src/plugins/clearcase/clearcasesubmiteditor.h | 3 | ||||
-rw-r--r-- | src/plugins/clearcase/clearcasesubmiteditorwidget.cpp | 41 | ||||
-rw-r--r-- | src/plugins/clearcase/clearcasesubmiteditorwidget.h | 3 | ||||
-rw-r--r-- | src/plugins/clearcase/clearcasesync.cpp | 6 |
11 files changed, 131 insertions, 58 deletions
diff --git a/src/plugins/clearcase/activityselector.cpp b/src/plugins/clearcase/activityselector.cpp index 2c42f6a1bc..d677881edc 100644 --- a/src/plugins/clearcase/activityselector.cpp +++ b/src/plugins/clearcase/activityselector.cpp @@ -49,6 +49,8 @@ ActivitySelector::ActivitySelector(QWidget *parent) : m_plugin(ClearCasePlugin::instance()), m_changed(false) { + QTC_ASSERT(m_plugin->isUcm(), return); + QHBoxLayout *hboxLayout = new QHBoxLayout(this); hboxLayout->setContentsMargins(0, 0, 0, 0); diff --git a/src/plugins/clearcase/checkoutdialog.cpp b/src/plugins/clearcase/checkoutdialog.cpp index 3e7aba22f8..455aba30dc 100644 --- a/src/plugins/clearcase/checkoutdialog.cpp +++ b/src/plugins/clearcase/checkoutdialog.cpp @@ -31,8 +31,8 @@ **************************************************************************/ #include "checkoutdialog.h" -#include "clearcaseplugin.h" #include "ui_checkoutdialog.h" +#include "activityselector.h" #include <QList> #include <QPair> @@ -41,11 +41,23 @@ namespace ClearCase { namespace Internal { -CheckOutDialog::CheckOutDialog(const QString &fileName, QWidget *parent) : - QDialog(parent), ui(new Ui::CheckOutDialog) +CheckOutDialog::CheckOutDialog(const QString &fileName, bool isUcm, QWidget *parent) : + QDialog(parent), ui(new Ui::CheckOutDialog), m_actSelector(0) { ui->setupUi(this); ui->lblFileName->setText(fileName); + + if (isUcm) { + m_actSelector = new ActivitySelector(this); + + ui->verticalLayout->insertWidget(0, m_actSelector); + + QFrame *line = new QFrame(this); + line->setFrameShape(QFrame::HLine); + line->setFrameShadow(QFrame::Sunken); + + ui->verticalLayout->insertWidget(1, line); + } } CheckOutDialog::~CheckOutDialog() @@ -55,7 +67,7 @@ CheckOutDialog::~CheckOutDialog() QString CheckOutDialog::activity() const { - return ui->actSelector->activity(); + return m_actSelector ? m_actSelector->activity() : QString(); } QString CheckOutDialog::comment() const diff --git a/src/plugins/clearcase/checkoutdialog.h b/src/plugins/clearcase/checkoutdialog.h index b04bb71d0b..4eb60668ad 100644 --- a/src/plugins/clearcase/checkoutdialog.h +++ b/src/plugins/clearcase/checkoutdialog.h @@ -42,12 +42,14 @@ namespace Ui { class CheckOutDialog; } +class ActivitySelector; + class CheckOutDialog : public QDialog { Q_OBJECT public: - explicit CheckOutDialog(const QString &fileName, QWidget *parent = 0); + explicit CheckOutDialog(const QString &fileName, bool isUcm, QWidget *parent = 0); ~CheckOutDialog(); QString activity() const; QString comment() const; @@ -62,6 +64,7 @@ private slots: private: Ui::CheckOutDialog *ui; + ActivitySelector *m_actSelector; }; } // namespace Internal diff --git a/src/plugins/clearcase/checkoutdialog.ui b/src/plugins/clearcase/checkoutdialog.ui index 41a5fdef46..73f6a398c5 100644 --- a/src/plugins/clearcase/checkoutdialog.ui +++ b/src/plugins/clearcase/checkoutdialog.ui @@ -22,16 +22,6 @@ </widget> </item> <item> - <widget class="ActivitySelector" name="actSelector" native="true"/> - </item> - <item> - <widget class="Line" name="line"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - </widget> - </item> - <item> <widget class="QLabel" name="lblComment"> <property name="text"> <string>&Checkout Comment:</string> @@ -110,14 +100,6 @@ </item> </layout> </widget> - <customwidgets> - <customwidget> - <class>ActivitySelector</class> - <extends>QWidget</extends> - <header>activityselector.h</header> - <container>1</container> - </customwidget> - </customwidgets> <resources/> <connections> <connection> diff --git a/src/plugins/clearcase/clearcaseplugin.cpp b/src/plugins/clearcase/clearcaseplugin.cpp index 3cabdcf7da..62fb59c6aa 100644 --- a/src/plugins/clearcase/clearcaseplugin.cpp +++ b/src/plugins/clearcase/clearcaseplugin.cpp @@ -84,18 +84,20 @@ #include <QMenu> #include <QMessageBox> #include <QMutex> -#include <QTemporaryFile> -#include <QTextCodec> #include <QProcess> +#include <QRegExp> #include <QSharedPointer> +#include <QtConcurrentRun> +#include <QTemporaryFile> +#include <QTextCodec> #include <QTimer> +#include <QtPlugin> #include <QUrl> #include <QUuid> #include <QVariant> #include <QVBoxLayout> #include <QXmlStreamReader> -#include <QtConcurrentRun> -#include <QtPlugin> + namespace ClearCase { namespace Internal { @@ -161,6 +163,7 @@ ClearCasePlugin *ClearCasePlugin::m_clearcasePluginInstance = 0; ClearCasePlugin::ClearCasePlugin() : VcsBase::VcsBasePlugin(QLatin1String(ClearCase::Constants::CLEARCASECHECKINEDITOR_ID)), m_isDynamic(false), + m_isUcm(false), m_commandLocator(0), m_checkOutAction(0), m_checkInCurrentAction(0), @@ -226,6 +229,7 @@ QString ClearCasePlugin::findTopLevel(const QString &directory) const findRepositoryForDirectory(directory, QLatin1String(ClearCase::Constants::CLEARCASE_ROOT_FILE)); if (!topLevel.isEmpty() || !clearCaseControl()->isConfigured()) return topLevel; + // Dynamic view if (directory.startsWith(m_topLevel) && directory.at(m_topLevel.size()) == QLatin1Char('/')) return m_topLevel; @@ -562,7 +566,7 @@ QString ClearCasePlugin::ccGetFileActivity(const QString &workingDir, const QStr return response.stdOut; } -ClearCaseSubmitEditor *ClearCasePlugin::openClearCaseSubmitEditor(const QString &fileName) +ClearCaseSubmitEditor *ClearCasePlugin::openClearCaseSubmitEditor(const QString &fileName, bool isUcm) { Core::IEditor *editor = Core::EditorManager::openEditor(fileName, @@ -573,18 +577,28 @@ ClearCaseSubmitEditor *ClearCasePlugin::openClearCaseSubmitEditor(const QString submitEditor->registerActions(m_submitUndoAction, m_submitRedoAction, m_checkInSelectedAction, m_checkInDiffAction); connect(submitEditor, SIGNAL(diffSelectedFiles(QStringList)), this, SLOT(diffCheckInFiles(QStringList))); submitEditor->setCheckScriptWorkingDirectory(m_checkInView); + submitEditor->setIsUcm(isUcm); return submitEditor; } void ClearCasePlugin::updateStatusActions() { bool hasFile = currentState().hasFile(); - FileStatus fileStatus = m_statusMap->value(currentState().relativeCurrentFile(), FileStatus(FileStatus::Unknown)); + QString fileName = currentState().relativeCurrentFile(); + + FileStatus fileStatus = m_statusMap->value(fileName, FileStatus(FileStatus::Unknown)); + + if (ClearCase::Constants::debug) + qDebug() << Q_FUNC_INFO << fileName << ", status = " << fileStatus.status; + m_checkOutAction->setEnabled(hasFile && (fileStatus.status & (FileStatus::CheckedIn | FileStatus::Hijacked))); m_undoCheckOutAction->setEnabled(hasFile && (fileStatus.status & FileStatus::CheckedOut)); m_undoHijackAction->setEnabled(!m_isDynamic && hasFile && (fileStatus.status & FileStatus::Hijacked)); m_checkInCurrentAction->setEnabled(hasFile && (fileStatus.status & FileStatus::CheckedOut)); m_addFileAction->setEnabled(hasFile && (fileStatus.status & FileStatus::NotManaged)); + + m_checkInActivityAction->setEnabled(m_isUcm); + m_diffActivityAction->setEnabled(m_isUcm); } void ClearCasePlugin::updateActions(VcsBase::VcsBasePlugin::ActionState as) @@ -928,8 +942,11 @@ void ClearCasePlugin::startCheckInAll() void ClearCasePlugin::startCheckInActivity() { + QTC_ASSERT(isUcm(), return); + const VcsBase::VcsBasePluginState state = currentState(); QTC_ASSERT(state.hasProject(), return); + QDialog dlg; QVBoxLayout *layout = new QVBoxLayout(&dlg); ActivitySelector *actSelector = new ActivitySelector(&dlg); @@ -941,6 +958,7 @@ void ClearCasePlugin::startCheckInActivity() dlg.setWindowTitle(tr("Check In Activity")); if (!dlg.exec()) return; + QString topLevel = state.topLevel(); int topLevelLen = topLevel.length(); QStringList versions = ccGetActivityVersions(topLevel, actSelector->activity()); @@ -991,9 +1009,10 @@ void ClearCasePlugin::startCheckIn(const QString &workingDir, const QStringList m_checkInMessageFileName = saver.fileName(); m_checkInView = workingDir; // Create a submit editor and set file list - ClearCaseSubmitEditor *editor = openClearCaseSubmitEditor(m_checkInMessageFileName); + ClearCaseSubmitEditor *editor = openClearCaseSubmitEditor(m_checkInMessageFileName, m_isUcm); editor->setStatusList(files); - if (files.size() == 1) { + + if (m_isUcm && (files.size() == 1)) { QString activity = ccGetFileActivity(workingDir, files.first()); editor->submitEditorWidget()->setActivity(activity); } @@ -1053,6 +1072,8 @@ void ClearCasePlugin::history(const QString &workingDir, void ClearCasePlugin::viewStatus() { + if (m_view.isEmpty()) + m_view = ccGetView(m_topLevel); QTC_ASSERT(!m_view.isEmpty() && !m_settings.disableIndexer, return); VcsBase::VcsBaseOutputWindow *outputwindow = VcsBase::VcsBaseOutputWindow::instance(); outputwindow->appendCommand(QLatin1String("Indexed files status (C=Checked Out, H=Hijacked, ?=Missing)")); @@ -1297,7 +1318,8 @@ bool ClearCasePlugin::vcsOpen(const QString &workingDir, const QString &fileName const QString file = QDir::toNativeSeparators(relFile); const QString title = QString::fromLatin1("Checkout %1").arg(file); - CheckOutDialog coDialog(title); + CheckOutDialog coDialog(title, m_isUcm); + if (!m_settings.disableIndexer && (fi.isWritable() || m_statusMap->value(relFile).status == FileStatus::Unknown)) QtConcurrent::run(&sync, topLevel, QStringList(relFile)).waitForFinished(); @@ -1310,8 +1332,9 @@ bool ClearCasePlugin::vcsOpen(const QString &workingDir, const QString &fileName if (!isHijacked) coDialog.hideHijack(); if (coDialog.exec() == QDialog::Accepted) { - if (!vcsSetActivity(topLevel, title, coDialog.activity())) + if (m_isUcm && !vcsSetActivity(topLevel, title, coDialog.activity())) return false; + Core::FileChangeBlocker fcb(absPath); QStringList args(QLatin1String("checkout")); QString comment = coDialog.comment(); @@ -1444,7 +1467,7 @@ bool ClearCasePlugin::ccFileOp(const QString &workingDir, const QString &title, const QString file = QDir::toNativeSeparators(fileName); bool noCheckout = false; QVBoxLayout *verticalLayout; - ActivitySelector *actSelector; + ActivitySelector *actSelector = 0; QLabel *commentLabel; QTextEdit *commentEdit; QDialogButtonBox *buttonBox; @@ -1452,8 +1475,10 @@ bool ClearCasePlugin::ccFileOp(const QString &workingDir, const QString &title, fileOpDlg.setWindowTitle(title); verticalLayout = new QVBoxLayout(&fileOpDlg); - actSelector = new ActivitySelector; - verticalLayout->addWidget(actSelector); + if (m_isUcm) { + actSelector = new ActivitySelector; + verticalLayout->addWidget(actSelector); + } commentLabel = new QLabel(tr("Enter &comment:")); verticalLayout->addWidget(commentLabel); @@ -1474,9 +1499,11 @@ bool ClearCasePlugin::ccFileOp(const QString &workingDir, const QString &title, if (!fileOpDlg.exec()) return true; + QString comment = commentEdit->toPlainText(); - if (actSelector->changed()) + if (m_isUcm && actSelector->changed()) vcsSetActivity(workingDir, fileOpDlg.windowTitle(), actSelector->activity()); + QString dirName = QDir::toNativeSeparators(QFileInfo(workingDir, fileName).absolutePath()); QStringList commentArg; if (comment.isEmpty()) @@ -1670,7 +1697,18 @@ bool ClearCasePlugin::newActivity() return (!response.error); } -QString ClearCasePlugin::ccGetView(const QString &workingDir, bool *isDynamic) const +// check if the view is UCM +bool ClearCasePlugin::ccCheckUcm(const QString &viewname, const QString &workingDir) const +{ + QStringList catcsArgs(QLatin1String("catcs")); + catcsArgs << QLatin1String("-tag") << viewname; + QString catcsData = runCleartoolSync(workingDir, catcsArgs); + + // check output for the word "ucm" + return QRegExp(QLatin1String("(^|\\n)ucm\\n")).indexIn(catcsData) != -1; +} + +QString ClearCasePlugin::ccGetView(const QString &workingDir, bool *isDynamic, bool *isUcm) const { QStringList args(QLatin1String("lsview")); args << QLatin1String("-cview"); @@ -1682,7 +1720,13 @@ QString ClearCasePlugin::ccGetView(const QString &workingDir, bool *isDynamic) c } if (isDynamic) *isDynamic = !data.isEmpty() && (data.at(0) == QLatin1Char('*')); - return data.mid(2, data.indexOf(QLatin1Char(' '), 2) - 2); + + QString viewname = data.mid(2, data.indexOf(QLatin1Char(' '), 2) - 2); + if (isUcm) + *isUcm = ccCheckUcm(viewname, workingDir); + + return viewname; + } void ClearCasePlugin::updateStreamAndView() @@ -1695,7 +1739,7 @@ void ClearCasePlugin::updateStreamAndView() QRegExp intStreamExp(QLatin1String("stream:([^@]*)")); if (intStreamExp.indexIn(sresponse.mid(tabPos + 1)) != -1) m_intStream = intStreamExp.cap(1); - m_view = ccGetView(m_topLevel, &m_isDynamic); + m_view = ccGetView(m_topLevel, &m_isDynamic, &m_isUcm); m_updateViewAction->setParameter(m_isDynamic ? QString() : m_view); } diff --git a/src/plugins/clearcase/clearcaseplugin.h b/src/plugins/clearcase/clearcaseplugin.h index 31b19c7484..47213fe3cc 100644 --- a/src/plugins/clearcase/clearcaseplugin.h +++ b/src/plugins/clearcase/clearcaseplugin.h @@ -118,7 +118,7 @@ public: bool initialize(const QStringList &arguments, QString *error_message); - ClearCaseSubmitEditor *openClearCaseSubmitEditor(const QString &fileName); + ClearCaseSubmitEditor *openClearCaseSubmitEditor(const QString &fileName, bool isUcm); const ClearCaseSettings &settings() const; void setSettings(const ClearCaseSettings &s); @@ -148,6 +148,9 @@ public: FileStatus vcsStatus(const QString &file) const; QString currentView() const { return m_view; } void refreshActivities(); + inline bool isUcm() const { return m_isUcm; } + + bool ccCheckUcm(const QString &viewname, const QString &workingDir) const; public slots: void vcsAnnotate(const QString &workingDir, const QString &file, @@ -216,7 +219,7 @@ private: static void rmdir(const QString &path); QString runExtDiff(const QString &workingDir, const QStringList &arguments, int timeOut, QTextCodec *outputCodec = 0); - QString ccGetView(const QString &workingDir, bool *isDynamic = 0) const; + QString ccGetView(const QString &workingDir, bool *isDynamic = 0, bool *isUcm = 0) const; ClearCaseSettings m_settings; @@ -226,6 +229,7 @@ private: QString m_stream; QString m_view; bool m_isDynamic; + bool m_isUcm; QString m_intStream; QString m_activity; QString m_diffPrefix; diff --git a/src/plugins/clearcase/clearcasesubmiteditor.cpp b/src/plugins/clearcase/clearcasesubmiteditor.cpp index 00357a2a39..3a2dd04791 100644 --- a/src/plugins/clearcase/clearcasesubmiteditor.cpp +++ b/src/plugins/clearcase/clearcasesubmiteditor.cpp @@ -50,6 +50,11 @@ ClearCaseSubmitEditorWidget *ClearCaseSubmitEditor::submitEditorWidget() return static_cast<ClearCaseSubmitEditorWidget *>(widget()); } +void ClearCaseSubmitEditor::setIsUcm(bool isUcm) +{ + submitEditorWidget()->addActivitySelector(isUcm); +} + void ClearCaseSubmitEditor::setStatusList(const QStringList &statusOutput) { typedef QStringList::const_iterator ConstIterator; diff --git a/src/plugins/clearcase/clearcasesubmiteditor.h b/src/plugins/clearcase/clearcasesubmiteditor.h index df1a9434b4..d19cdfbe23 100644 --- a/src/plugins/clearcase/clearcasesubmiteditor.h +++ b/src/plugins/clearcase/clearcasesubmiteditor.h @@ -54,8 +54,11 @@ public: void setStatusList(const QStringList &statusOutput); ClearCaseSubmitEditorWidget *submitEditorWidget(); + void setIsUcm(bool isUcm); + protected: virtual QByteArray fileContents() const; + }; } // namespace Internal diff --git a/src/plugins/clearcase/clearcasesubmiteditorwidget.cpp b/src/plugins/clearcase/clearcasesubmiteditorwidget.cpp index b55e20f5fc..8860b530f0 100644 --- a/src/plugins/clearcase/clearcasesubmiteditorwidget.cpp +++ b/src/plugins/clearcase/clearcasesubmiteditorwidget.cpp @@ -42,32 +42,26 @@ using namespace ClearCase::Internal; ClearCaseSubmitEditorWidget::ClearCaseSubmitEditorWidget(QWidget *parent) : - Utils::SubmitEditorWidget(parent) + Utils::SubmitEditorWidget(parent), + m_actSelector(0) { setDescriptionMandatory(false); QWidget *checkInWidget = new QWidget(this); - QVBoxLayout *verticalLayout = new QVBoxLayout(checkInWidget); - m_actSelector = new ActivitySelector; - verticalLayout->addWidget(m_actSelector); - - QFrame *line = new QFrame; - line->setFrameShape(QFrame::HLine); - line->setFrameShadow(QFrame::Sunken); - verticalLayout->addWidget(line); + m_verticalLayout = new QVBoxLayout(checkInWidget); m_chkIdentical = new QCheckBox(tr("Chec&k in even if identical to previous version")); - verticalLayout->addWidget(m_chkIdentical); + m_verticalLayout->addWidget(m_chkIdentical); m_chkPTime = new QCheckBox(tr("&Preserve file modification time")); - verticalLayout->addWidget(m_chkPTime); + m_verticalLayout->addWidget(m_chkPTime); insertTopWidget(checkInWidget); } QString ClearCaseSubmitEditorWidget::activity() const { - return m_actSelector->activity(); + return m_actSelector ? m_actSelector->activity() : QString(); } bool ClearCaseSubmitEditorWidget::isIdentical() const @@ -82,17 +76,34 @@ bool ClearCaseSubmitEditorWidget::isPreserve() const void ClearCaseSubmitEditorWidget::setActivity(const QString &act) { - m_actSelector->setActivity(act); + if (m_actSelector) + m_actSelector->setActivity(act); } bool ClearCaseSubmitEditorWidget::activityChanged() const { - return m_actSelector->changed(); + return m_actSelector ? m_actSelector->changed() : false; } void ClearCaseSubmitEditorWidget::addKeep() { - m_actSelector->addKeep(); + if (m_actSelector) + m_actSelector->addKeep(); +} + +//! Add the ActivitySelector if \a isUcm is set +void ClearCaseSubmitEditorWidget::addActivitySelector(bool isUcm) +{ + if (!isUcm || m_actSelector) + return; + + m_actSelector = new ActivitySelector; + m_verticalLayout->insertWidget(0, m_actSelector); + + QFrame* line = new QFrame; + line->setFrameShape(QFrame::HLine); + line->setFrameShadow(QFrame::Sunken); + m_verticalLayout->insertWidget(1, line); } QString ClearCaseSubmitEditorWidget::commitName() const diff --git a/src/plugins/clearcase/clearcasesubmiteditorwidget.h b/src/plugins/clearcase/clearcasesubmiteditorwidget.h index bf411e17d4..22c0657573 100644 --- a/src/plugins/clearcase/clearcasesubmiteditorwidget.h +++ b/src/plugins/clearcase/clearcasesubmiteditorwidget.h @@ -37,6 +37,7 @@ QT_BEGIN_NAMESPACE class QCheckBox; +class QVBoxLayout; QT_END_NAMESPACE namespace ClearCase { @@ -56,6 +57,7 @@ public: void setActivity(const QString &act); bool activityChanged() const; void addKeep(); + void addActivitySelector(bool isUcm); protected: QString commitName() const; @@ -64,6 +66,7 @@ private: ActivitySelector *m_actSelector; QCheckBox *m_chkIdentical; QCheckBox *m_chkPTime; + QVBoxLayout *m_verticalLayout; }; } // namespace Internal diff --git a/src/plugins/clearcase/clearcasesync.cpp b/src/plugins/clearcase/clearcasesync.cpp index 3877e62596..aa9aaa8d33 100644 --- a/src/plugins/clearcase/clearcasesync.cpp +++ b/src/plugins/clearcase/clearcasesync.cpp @@ -1,4 +1,5 @@ #include "clearcasesync.h" +#include "clearcaseconstants.h" #include <QDir> #include <QFutureInterface> @@ -30,7 +31,8 @@ void ClearCaseSync::run(QFutureInterface<void> &future, const QString &topLevel, total = settings.totalFiles.value(view, total); // refresh activities list - m_plugin->refreshActivities(); + if (m_plugin->isUcm()) + m_plugin->refreshActivities(); if (settings.disableIndexer) return; @@ -66,6 +68,7 @@ void ClearCaseSync::run(QFutureInterface<void> &future, const QString &topLevel, future.setProgressRange(0, total + 1); QProcess process; process.setWorkingDirectory(topLevel); + process.start(program, args); if (!process.waitForStarted()) return; @@ -75,6 +78,7 @@ void ClearCaseSync::run(QFutureInterface<void> &future, const QString &topLevel, process.bytesAvailable() && !future.isCanceled()) { QString line = QString::fromLocal8Bit(process.readLine().constData()); + buffer += line; if (buffer.endsWith(QLatin1Char('\n')) || process.atEnd()) { int atatpos = buffer.indexOf(QLatin1String("@@")); |