From 856b7f15aba496860ebd53c4c855d18a7bdf995f Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Sun, 2 Sep 2012 11:26:26 +0300 Subject: [PATCH] ClearCase: Support systems without external diff CC's internal diff is worthless, just disable multiple files actions Change-Id: Ia8541e6edc6582777fc141da849819a5a11543b6 Reviewed-by: Tobias Hunger Reviewed-by: Leena Miettinen --- src/plugins/clearcase/clearcaseplugin.cpp | 22 ++++++-- src/plugins/clearcase/clearcasesettings.cpp | 1 + src/plugins/clearcase/clearcasesettings.h | 1 + src/plugins/clearcase/settingspage.cpp | 27 ++++++---- src/plugins/clearcase/settingspage.ui | 58 ++++++++++++++++++++- 5 files changed, 96 insertions(+), 13 deletions(-) diff --git a/src/plugins/clearcase/clearcaseplugin.cpp b/src/plugins/clearcase/clearcaseplugin.cpp index b2ce7101699..007526027c0 100644 --- a/src/plugins/clearcase/clearcaseplugin.cpp +++ b/src/plugins/clearcase/clearcaseplugin.cpp @@ -706,8 +706,13 @@ void ClearCasePlugin::undoHijackCurrent() const QString fileName = state.relativeCurrentFile(); bool keep = false; - QString diffres = diffExternal(ccGetFileVersion(state.topLevel(), fileName), fileName); - if (diffres.at(0) != QLatin1Char('F')) { // Files are identical + bool askKeep = true; + if (m_settings.extDiffAvailable) { + QString diffres = diffExternal(ccGetFileVersion(state.topLevel(), fileName), fileName); + if (diffres.at(0) == QLatin1Char('F')) // Files are identical + askKeep = false; + } + if (askKeep) { Ui::UndoCheckOut unhijackUi; QDialog unhijackDlg; unhijackUi.setupUi(&unhijackDlg); @@ -749,6 +754,11 @@ void ClearCasePlugin::ccDiffWithPred(const QStringList &files) diffGraphical(file); return; // done here, diff is opened in a new window } + if (!m_settings.extDiffAvailable) { + VcsBase::VcsBaseOutputWindow::instance()->appendError( + tr("External diff is required to compare multiple files.")); + return; + } QString result; foreach (const QString &file, files) { if (m_statusMap->value(QDir::fromNativeSeparators(file)).status == FileStatus::Hijacked) @@ -814,6 +824,11 @@ void ClearCasePlugin::diffActivity() QTC_ASSERT(state.hasTopLevel(), return); if (ClearCase::Constants::debug) qDebug() << Q_FUNC_INFO; + if (!m_settings.extDiffAvailable) { + VcsBase::VcsBaseOutputWindow::instance()->appendError( + tr("External diff is required to compare multiple files.")); + return; + } QString topLevel = state.topLevel(); QString activity = QInputDialog::getText(0, tr("Enter Activity"), tr("Activity Name"), QLineEdit::Normal, m_activity); if (activity.isEmpty()) @@ -1148,7 +1163,8 @@ void ClearCasePlugin::describe(const QString &source, const QString &changeNr) const ClearCaseResponse response = runCleartool(topLevel, args, m_settings.timeOutMS(), 0, codec); description = response.stdOut; - description += diffExternal(id); + if (m_settings.extDiffAvailable) + description += diffExternal(id); // Re-use an existing view if possible to support // the common usage pattern of continuously changing and diffing a file diff --git a/src/plugins/clearcase/clearcasesettings.cpp b/src/plugins/clearcase/clearcasesettings.cpp index 313d081fe4b..63f5f09b47a 100644 --- a/src/plugins/clearcase/clearcasesettings.cpp +++ b/src/plugins/clearcase/clearcasesettings.cpp @@ -98,6 +98,7 @@ void ClearCaseSettings::fromSettings(QSettings *settings) promptToCheckIn = settings->value(QLatin1String(promptToCheckInKeyC), false).toBool(); disableIndexer = settings->value(QLatin1String(disableIndexerKeyC), false).toBool(); indexOnlyVOBs = settings->value(QLatin1String(indexOnlyVOBsC), QString()).toString(); + extDiffAvailable = !Utils::Environment::systemEnvironment().searchInPath(QLatin1String("diff")).isEmpty(); settings->beginGroup(QLatin1String(totalFilesKeyC)); foreach (const QString &view, settings->childKeys()) totalFiles[view] = settings->value(view).toInt(); diff --git a/src/plugins/clearcase/clearcasesettings.h b/src/plugins/clearcase/clearcasesettings.h index a7b7be46a30..0c10d07cd25 100644 --- a/src/plugins/clearcase/clearcasesettings.h +++ b/src/plugins/clearcase/clearcasesettings.h @@ -73,6 +73,7 @@ public: bool promptToCheckIn; bool disableIndexer; QString indexOnlyVOBs; + bool extDiffAvailable; QHash totalFiles; }; diff --git a/src/plugins/clearcase/settingspage.cpp b/src/plugins/clearcase/settingspage.cpp index ff5f8f21d44..08ab9507b8f 100644 --- a/src/plugins/clearcase/settingspage.cpp +++ b/src/plugins/clearcase/settingspage.cpp @@ -37,6 +37,7 @@ #include #include +#include #include #include @@ -71,6 +72,7 @@ ClearCaseSettings SettingsPageWidget::settings() const rc.disableIndexer = m_ui.disableIndexerCheckBox->isChecked(); rc.diffArgs = m_ui.diffArgsEdit->text(); rc.indexOnlyVOBs = m_ui.indexOnlyVOBsEdit->text(); + rc.extDiffAvailable = m_ui.externalDiffRadioButton->isEnabled(); return rc; } @@ -79,16 +81,23 @@ void SettingsPageWidget::setSettings(const ClearCaseSettings &s) m_ui.commandPathChooser->setPath(s.ccCommand); m_ui.timeOutSpinBox->setValue(s.timeOutS); m_ui.autoCheckOutCheckBox->setChecked(s.autoCheckOut); - switch (s.diffType) { - case GraphicalDiff: - m_ui.graphicalDiffRadioButton->setChecked(true); - m_ui.diffWidget->setEnabled(false); - break; - case ExternalDiff: - m_ui.externalDiffRadioButton->setChecked(true); - m_ui.diffWidget->setEnabled(true); - break; + bool extDiffAvailable = !Utils::Environment::systemEnvironment().searchInPath(QLatin1String("diff")).isEmpty(); + if (extDiffAvailable) { + m_ui.diffWarningLabel->setVisible(false); + } else { + QString diffWarning = tr("In order to use External diff, 'diff' command needs to be accessible."); +#ifdef Q_OS_WIN + diffWarning.append(tr(" DiffUtils is available for free download " + "here. " + "Please extract it to a directory in your PATH.")); +#endif + m_ui.diffWarningLabel->setText(diffWarning); + m_ui.externalDiffRadioButton->setEnabled(false); } + if (extDiffAvailable && s.diffType == ExternalDiff) + m_ui.externalDiffRadioButton->setChecked(true); + else + m_ui.graphicalDiffRadioButton->setChecked(true); m_ui.autoAssignActivityCheckBox->setChecked(s.autoAssignActivityName); m_ui.historyCountSpinBox->setValue(s.historyCount); m_ui.promptCheckBox->setChecked(s.promptToCheckIn); diff --git a/src/plugins/clearcase/settingspage.ui b/src/plugins/clearcase/settingspage.ui index 7f4c3247089..9d80e2b4eff 100644 --- a/src/plugins/clearcase/settingspage.ui +++ b/src/plugins/clearcase/settingspage.ui @@ -7,7 +7,7 @@ 0 0 363 - 384 + 403 @@ -39,11 +39,17 @@ Diff + + QFormLayout::AllNonFixedFieldsGrow + &Graphical (Single file only) + + true + @@ -55,6 +61,9 @@ + + false + 0 @@ -75,6 +84,53 @@ + + + + + + + + + 255 + 0 + 0 + + + + + + + + + 255 + 0 + 0 + + + + + + + + + 68 + 96 + 92 + + + + + + + + + + + true + + +