diff --git a/src/plugins/git/gerrit/gerrit.pri b/src/plugins/git/gerrit/gerrit.pri index 8d49ad8d9239d2cf52407d9dde1f1834601ffb8a..b06518ec5b2734aea93e447146129bb8f8fe4ec4 100644 --- a/src/plugins/git/gerrit/gerrit.pri +++ b/src/plugins/git/gerrit/gerrit.pri @@ -4,10 +4,14 @@ SOURCES += $$PWD/gerritdialog.cpp \ $$PWD/gerritmodel.cpp \ $$PWD/gerritparameters.cpp \ $$PWD/gerritplugin.cpp \ - $$PWD/gerritoptionspage.cpp + $$PWD/gerritoptionspage.cpp \ + $$PWD/gerritpushdialog.cpp HEADERS += $$PWD/gerritdialog.h \ $$PWD/gerritmodel.h \ $$PWD/gerritparameters.h \ $$PWD/gerritplugin.h \ - $$PWD/gerritoptionspage.h + $$PWD/gerritoptionspage.h \ + $$PWD/gerritpushdialog.h + +FORMS += $$PWD/gerritpushdialog.ui diff --git a/src/plugins/git/gerrit/gerritplugin.cpp b/src/plugins/git/gerrit/gerritplugin.cpp index 4023723079849debaef696258e66f3f9e0755898..2337781d64fd8140c4131eb16b74d460467b12ea 100644 --- a/src/plugins/git/gerrit/gerritplugin.cpp +++ b/src/plugins/git/gerrit/gerritplugin.cpp @@ -32,6 +32,7 @@ #include "gerritdialog.h" #include "gerritmodel.h" #include "gerritoptionspage.h" +#include "gerritpushdialog.h" #include "../gitplugin.h" #include "../gitclient.h" @@ -50,6 +51,7 @@ #include <coreplugin/actionmanager/actioncontainer.h> #include <coreplugin/actionmanager/command.h> #include <coreplugin/editormanager/editormanager.h> +#include <locator/commandlocator.h> #include <vcsbase/vcsbaseoutputwindow.h> @@ -70,6 +72,7 @@ enum { debug = 0 }; namespace Gerrit { namespace Constants { const char GERRIT_OPEN_VIEW[] = "Gerrit.OpenView"; +const char GERRIT_PUSH[] = "Gerrit.Push"; } namespace Internal { @@ -332,10 +335,59 @@ bool GerritPlugin::initialize(Core::ActionContainer *ac) connect(openViewAction, SIGNAL(triggered()), this, SLOT(openView())); ac->addAction(command); + QAction *pushAction = new QAction(tr("Push to Gerrit..."), this); + + Core::Command *pushCommand = + Core::ActionManager::registerAction(pushAction, Constants::GERRIT_PUSH, + Core::Context(Core::Constants::C_GLOBAL)); + connect(pushAction, SIGNAL(triggered()), this, SLOT(push())); + ac->addAction(pushCommand); + + m_pushToGerritPair = ActionCommandPair(pushAction, pushCommand); + Git::Internal::GitPlugin::instance()->addAutoReleasedObject(new GerritOptionsPage(m_parameters)); return true; } +void GerritPlugin::updateActions(bool hasTopLevel) +{ + m_pushToGerritPair.first->setEnabled(hasTopLevel); +} + +void GerritPlugin::addToLocator(Locator::CommandLocator *locator) +{ + locator->appendCommand(m_pushToGerritPair.second); +} + +void GerritPlugin::push() +{ + const QString topLevel = Git::Internal::GitPlugin::instance()->currentState().topLevel(); + + QPointer<GerritPushDialog> dialog = new GerritPushDialog(topLevel, Core::ICore::mainWindow()); + + if (!dialog->localChangesFound()) { + QMessageBox::critical(Core::ICore::mainWindow(), tr("No Local Changes"), + tr("Change from HEAD appears to be in remote branch already! Aborting.")); + return; + } + + if (dialog->exec() == QDialog::Rejected) + return; + + if (dialog.isNull()) + return; + + QStringList args; + + args << dialog->selectedRemoteName(); + args << QLatin1String("HEAD:refs/") + dialog->selectedPushType() + + QLatin1Char('/') + dialog->selectedRemoteBranchName(); + + Git::Internal::GitPlugin::instance()->gitClient()->synchronousPush(topLevel, args); + + delete dialog; +} + // Open or raise the Gerrit dialog window. void GerritPlugin::openView() { diff --git a/src/plugins/git/gerrit/gerritplugin.h b/src/plugins/git/gerrit/gerritplugin.h index 0e0109b1f605faeadfe842162d74feb08ece65d6..98478a8b25f42aa37a983a25f58f7f5f0891a5b7 100644 --- a/src/plugins/git/gerrit/gerritplugin.h +++ b/src/plugins/git/gerrit/gerritplugin.h @@ -33,9 +33,19 @@ #include <QObject> #include <QPointer> #include <QSharedPointer> +#include <QPair> + +QT_BEGIN_NAMESPACE +class QAction; +QT_END_NAMESPACE namespace Core { class ActionContainer; +class Command; +} + +namespace Locator { + class CommandLocator; } namespace Gerrit { @@ -45,6 +55,8 @@ class GerritChange; class GerritParameters; class GerritDialog; +typedef QPair<QAction *, Core::Command* > ActionCommandPair; + class GerritPlugin : public QObject { Q_OBJECT @@ -56,11 +68,13 @@ public: static QString gitBinary(); static QString branch(const QString &repository); + void addToLocator(Locator::CommandLocator *locator); public slots: void fetchDisplay(const QSharedPointer<Gerrit::Internal::GerritChange> &change); void fetchApply(const QSharedPointer<Gerrit::Internal::GerritChange> &change); void fetchCheckout(const QSharedPointer<Gerrit::Internal::GerritChange> &change); + void updateActions(bool hasTopLevel); signals: void fetchStarted(const QSharedPointer<Gerrit::Internal::GerritChange> &change); @@ -68,6 +82,7 @@ signals: private slots: void openView(); + void push(); private: QString findLocalRepository(QString project, const QString &branch) const; @@ -75,6 +90,7 @@ private: QSharedPointer<GerritParameters> m_parameters; QPointer<GerritDialog> m_dialog; + ActionCommandPair m_pushToGerritPair; }; } // namespace Internal diff --git a/src/plugins/git/gerrit/gerritpushdialog.cpp b/src/plugins/git/gerrit/gerritpushdialog.cpp new file mode 100644 index 0000000000000000000000000000000000000000..6f595c743c007c452a08eaad900994137839746e --- /dev/null +++ b/src/plugins/git/gerrit/gerritpushdialog.cpp @@ -0,0 +1,203 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Petar Perisin. +** Contact: petar.perisin@gmail.com +** +** 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 Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +****************************************************************************/ + +#include "gerritpushdialog.h" +#include "ui_gerritpushdialog.h" + +#include "../gitplugin.h" +#include "../gitclient.h" +#include <coreplugin/icore.h> + +#include <QDir> +#include <QMessageBox> + +namespace Gerrit { +namespace Internal { + +GerritPushDialog::GerritPushDialog(const QString &workingDir, QWidget *parent) : + QDialog(parent), + m_workingDir(workingDir), + m_ui(new Ui::GerritPushDialog), + m_remoteBranches(new QMap<QString,QString>()), + m_localChangesFound(true) +{ + setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); + m_ui->setupUi(this); + m_ui->repositoryLabel->setText(tr("Local Repository: %1").arg( + QDir::toNativeSeparators(workingDir))); + + Git::Internal::GitClient *gitClient = Git::Internal::GitPlugin::instance()->gitClient(); + QString output; + QString error; + QStringList args; + + args << QLatin1String("--no-color") << QLatin1String("--format=%P") + << QLatin1String("HEAD") << QLatin1String("--not")<< QLatin1String("--remotes"); + + if (!gitClient->synchronousLog(m_workingDir, args, &output) || output.isEmpty()) + reject(); + + output.chop(1); + if (output.isEmpty()) { + output = QLatin1String("HEAD"); + m_localChangesFound = false; + } else { + output = output.mid(output.lastIndexOf(QLatin1Char('\n')) + 1); + } + + args.clear(); + args << QLatin1String("--remotes") << QLatin1String("--contains") << output; + + if (!gitClient->synchronousBranchCmd(m_workingDir, args, &output, &error)) + reject(); + + QString head = QLatin1String("/HEAD"); + QStringList refs = output.split(QLatin1Char('\n')); + foreach (const QString &reference, refs) { + if (reference.contains(head) || reference.isEmpty()) + continue; + + m_suggestedRemoteName = reference.left(reference.indexOf(QLatin1Char('/'))).trimmed(); + m_suggestedRemoteBranch = reference.mid(reference.indexOf(QLatin1Char('/')) + 1).trimmed(); + break; + } + + output.clear(); + error.clear(); + args.clear(); + + args << QLatin1String("--remotes"); + + if (!gitClient->synchronousBranchCmd(m_workingDir, args, &output, &error)) + reject(); + + refs.clear(); + refs = output.split(QLatin1String("\n")); + foreach (const QString &reference, refs) { + if (reference.contains(head) || reference.isEmpty()) + continue; + + int refBranchIndex = reference.indexOf(QLatin1Char('/')); + m_remoteBranches->insertMulti(reference.left(refBranchIndex).trimmed(), + reference.mid(refBranchIndex + 1).trimmed()); + } + + int currIndex = 0; + QStringList remotes = m_remoteBranches->keys(); + remotes.removeDuplicates(); + foreach (const QString &remote, remotes) { + m_ui->remoteComboBox->addItem(remote); + if (remote == m_suggestedRemoteName) + m_ui->remoteComboBox->setCurrentIndex(currIndex); + ++currIndex; + } + if (m_ui->remoteComboBox->count() < 1) + reject(); + + m_ui->remoteComboBox->setEnabled(m_ui->remoteComboBox->count() != 1); + + connect(m_ui->remoteComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(setRemoteBranches())); + connect(m_ui->branchComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(setChangeRange())); + setRemoteBranches(); +} + +GerritPushDialog::~GerritPushDialog() +{ + delete m_ui; + delete m_remoteBranches; +} + + +QString GerritPushDialog::calculateChangeRange() +{ + QString remote = selectedRemoteName(); + remote += QLatin1Char('/'); + remote += selectedRemoteBranchName(); + + QStringList args(remote + QLatin1String("..HEAD")); + args << QLatin1String("--count"); + + QString number; + + if (!Git::Internal::GitPlugin::instance()->gitClient()-> + synchronousRevListCmd(m_workingDir, args, &number)) + reject(); + + number.chop(1); + return number; +} + +void GerritPushDialog::setChangeRange() +{ + QString remote = selectedRemoteName(); + remote += QLatin1Char('/'); + remote += selectedRemoteBranchName(); + m_ui->infoLabel->setText(tr("Number of commits between HEAD and %1: %2").arg( + remote, calculateChangeRange())); +} + +bool GerritPushDialog::localChangesFound() const +{ + return m_localChangesFound; +} + +void GerritPushDialog::setRemoteBranches() +{ + m_ui->branchComboBox->clear(); + + QMap<QString, QString>::const_iterator it; + int i = 0; + for (it = m_remoteBranches->constBegin(); it != m_remoteBranches->constEnd(); ++it) { + if (it.key() == selectedRemoteName()) { + m_ui->branchComboBox->addItem(it.value()); + if (it.value() == m_suggestedRemoteBranch) + m_ui->branchComboBox->setCurrentIndex(i); + ++i; + } + } + setChangeRange(); +} + +QString GerritPushDialog::selectedRemoteName() const +{ + return m_ui->remoteComboBox->currentText(); +} + +QString GerritPushDialog::selectedRemoteBranchName() const +{ + return m_ui->branchComboBox->currentText(); +} + +QString GerritPushDialog::selectedPushType() const +{ + return m_ui->publicRadioButton->isChecked() ? QLatin1String("for") : QLatin1String("draft"); +} + +} // namespace Internal +} // namespace Gerrit diff --git a/src/plugins/git/gerrit/gerritpushdialog.h b/src/plugins/git/gerrit/gerritpushdialog.h new file mode 100644 index 0000000000000000000000000000000000000000..6de9aff5c1edad94531f1db2a753be7325728674 --- /dev/null +++ b/src/plugins/git/gerrit/gerritpushdialog.h @@ -0,0 +1,72 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Petar Perisin. +** Contact: petar.perisin@gmail.com +** +** 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 Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +****************************************************************************/ + +#ifndef GERRITPUSHDIALOG_H +#define GERRITPUSHDIALOG_H + +#include <QDialog> + +namespace Gerrit { +namespace Internal { + +namespace Ui { + class GerritPushDialog; +} + +class GerritPushDialog : public QDialog +{ + Q_OBJECT + +public: + GerritPushDialog(const QString &workingDir, QWidget *parent = 0); + ~GerritPushDialog(); + + QString selectedRemoteName() const; + QString selectedRemoteBranchName() const; + QString selectedPushType() const; + bool localChangesFound() const; + +private slots: + void setChangeRange(); + void setRemoteBranches(); + +private: + QString calculateChangeRange(); + QString m_workingDir; + QString m_suggestedRemoteName; + QString m_suggestedRemoteBranch; + Ui::GerritPushDialog *m_ui; + QMap<QString,QString> *m_remoteBranches; + bool m_localChangesFound; +}; + + +} // namespace Internal +} // namespace Gerrit +#endif // GERRITPUSHDIALOG_H diff --git a/src/plugins/git/gerrit/gerritpushdialog.ui b/src/plugins/git/gerrit/gerritpushdialog.ui new file mode 100644 index 0000000000000000000000000000000000000000..2a358ecd7ee41d58f7eca3c06559fe4dd90fa610 --- /dev/null +++ b/src/plugins/git/gerrit/gerritpushdialog.ui @@ -0,0 +1,162 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>Gerrit::Internal::GerritPushDialog</class> + <widget class="QDialog" name="Gerrit::Internal::GerritPushDialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>306</width> + <height>304</height> + </rect> + </property> + <property name="windowTitle"> + <string>Push to Gerrit</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <layout class="QHBoxLayout" name="horizontalLayout"> + <property name="leftMargin"> + <number>10</number> + </property> + <property name="topMargin"> + <number>3</number> + </property> + <property name="rightMargin"> + <number>3</number> + </property> + <property name="bottomMargin"> + <number>3</number> + </property> + <item> + <widget class="QLabel" name="repositoryLabel"> + <property name="text"> + <string>Local Repository:</string> + </property> + </widget> + </item> + </layout> + </item> + <item> + <widget class="QGroupBox" name="pushTypeGroupBox"> + <property name="title"> + <string>Push Type:</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout_2"> + <item> + <widget class="QRadioButton" name="publicRadioButton"> + <property name="text"> + <string>Public</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="QRadioButton" name="draftRadioButton"> + <property name="text"> + <string>Draft</string> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QGroupBox" name="remoteGroupBox"> + <property name="title"> + <string>Remote Branch:</string> + </property> + <layout class="QFormLayout" name="formLayout"> + <item row="1" column="1"> + <widget class="QComboBox" name="remoteComboBox"/> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="remoteLabel"> + <property name="text"> + <string>Remote Name:</string> + </property> + </widget> + </item> + <item row="2" column="0"> + <widget class="QLabel" name="branchLabel"> + <property name="text"> + <string>Branch Name:</string> + </property> + </widget> + </item> + <item row="2" column="1"> + <widget class="QComboBox" name="branchComboBox"/> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QLabel" name="infoLabel"> + <property name="text"> + <string>Number of commits</string> + </property> + </widget> + </item> + <item> + <spacer name="verticalSpacer"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> + </property> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections> + <connection> + <sender>buttonBox</sender> + <signal>accepted()</signal> + <receiver>Gerrit::Internal::GerritPushDialog</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel"> + <x>227</x> + <y>330</y> + </hint> + <hint type="destinationlabel"> + <x>157</x> + <y>274</y> + </hint> + </hints> + </connection> + <connection> + <sender>buttonBox</sender> + <signal>rejected()</signal> + <receiver>Gerrit::Internal::GerritPushDialog</receiver> + <slot>reject()</slot> + <hints> + <hint type="sourcelabel"> + <x>295</x> + <y>336</y> + </hint> + <hint type="destinationlabel"> + <x>286</x> + <y>274</y> + </hint> + </hints> + </connection> + </connections> +</ui> diff --git a/src/plugins/git/git.qbs b/src/plugins/git/git.qbs index 2f92f3154bac044f8e9eaaf695834c601af73eb2..95fa416ea2ea1f557bd92a787bb43947fe32e21f 100644 --- a/src/plugins/git/git.qbs +++ b/src/plugins/git/git.qbs @@ -107,6 +107,9 @@ QtcPlugin { "gerritparameters.h", "gerritplugin.cpp", "gerritplugin.h", + "gerritpushdialog.cpp", + "gerritpushdialog.h", + "gerritpushdialog.ui", ] } } diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp index cf17d2db0325d9f04e0c7bddba51f783678b6e64..c33282cda13453ef3977a56fb9ba7e41c44aeee4 100644 --- a/src/plugins/git/gitclient.cpp +++ b/src/plugins/git/gitclient.cpp @@ -1121,6 +1121,29 @@ static inline bool splitCommitParents(const QString &line, return true; } +bool GitClient::synchronousRevListCmd(const QString &workingDirectory, const QStringList &arguments, + QString *output, QString *errorMessage) +{ + QByteArray outputTextData; + QByteArray errorText; + + QStringList args(QLatin1String("rev-list")); + args += arguments; + + const bool rc = fullySynchronousGit(workingDirectory, args, &outputTextData, &errorText); + if (!rc) { + if (errorMessage) + *errorMessage = commandOutputFromLocal8Bit(errorText); + else + outputWindow()->append(tr("Cannot execute \"git %1\" in \"%2\": %3").arg( + args.join(QLatin1String(" ")), workingDirectory, + commandOutputFromLocal8Bit(errorText))); + return false; + } + *output = commandOutputFromLocal8Bit(outputTextData); + return true; +} + // 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, @@ -1129,8 +1152,8 @@ bool GitClient::synchronousParentRevisions(const QString &workingDirectory, QStringList *parents, QString *errorMessage) { - QByteArray outputTextData; - QByteArray errorText; + QString outputText; + QString errorText; QStringList arguments; if (parents && !isValidRevision(revision)) { // Not Committed Yet *parents = QStringList(QLatin1String("HEAD")); @@ -1142,14 +1165,13 @@ bool GitClient::synchronousParentRevisions(const QString &workingDirectory, arguments.append(QLatin1String("--")); arguments.append(files); } - const bool rc = fullySynchronousGit(workingDirectory, arguments, &outputTextData, &errorText); - if (!rc) { - *errorMessage = msgParentRevisionFailed(workingDirectory, revision, commandOutputFromLocal8Bit(errorText)); + + if (!synchronousRevListCmd(workingDirectory, arguments, &outputText, &errorText)) { + *errorMessage = msgParentRevisionFailed(workingDirectory, revision, errorText); return false; } // Should result in one line of blank-delimited revisions, specifying current first // unless it is top. - QString outputText = commandOutputFromLocal8Bit(outputTextData); outputText.remove(QLatin1Char('\n')); if (!splitCommitParents(outputText, 0, parents)) { *errorMessage = msgParentRevisionFailed(workingDirectory, revision, msgInvalidRevision()); @@ -2487,14 +2509,14 @@ void GitClient::subversionLog(const QString &workingDirectory) executeGit(workingDirectory, arguments, editor); } -bool GitClient::synchronousPush(const QString &workingDirectory, const QString &remote) +bool GitClient::synchronousPush(const QString &workingDirectory, const QStringList &pushArgs) { // Disable UNIX terminals to suppress SSH prompting. const unsigned flags = VcsBase::VcsBasePlugin::SshPasswordPrompt|VcsBase::VcsBasePlugin::ShowStdOutInLogWindow |VcsBase::VcsBasePlugin::ShowSuccessMessage; QStringList arguments(QLatin1String("push")); - if (!remote.isEmpty()) - arguments << remote; + if (!pushArgs.isEmpty()) + arguments += pushArgs; const Utils::SynchronousProcessResponse resp = synchronousGit(workingDirectory, arguments, flags); return resp.result == Utils::SynchronousProcessResponse::Finished; diff --git a/src/plugins/git/gitclient.h b/src/plugins/git/gitclient.h index ef8cd3d0ff9789d953056bf4a02370bd3af2a6f9..04292fca76ba864ff2444f24a0f994be04dd7fa2 100644 --- a/src/plugins/git/gitclient.h +++ b/src/plugins/git/gitclient.h @@ -189,6 +189,10 @@ public: QString *errorMessage = 0); bool synchronousShow(const QString &workingDirectory, const QString &id, QString *output, QString *errorMessage); + + bool synchronousRevListCmd(const QString &workingDirectory, const QStringList &arguments, + QString *output, QString *errorMessage = 0); + bool synchronousParentRevisions(const QString &workingDirectory, const QStringList &files /* = QStringList() */, const QString &revision, @@ -208,7 +212,8 @@ public: QString vcsGetRepositoryURL(const QString &directory); bool synchronousFetch(const QString &workingDirectory, const QString &remote); bool synchronousPull(const QString &workingDirectory, bool rebase); - bool synchronousPush(const QString &workingDirectory, const QString &remote = QString()); + bool synchronousPush(const QString &workingDirectory, + const QStringList &pushArgs = QStringList()); bool synchronousMerge(const QString &workingDirectory, const QString &branch); bool canRebase(const QString &workingDirectory) const; bool synchronousRebase(const QString &workingDirectory, diff --git a/src/plugins/git/gitplugin.cpp b/src/plugins/git/gitplugin.cpp index 223707a500edc09d3fdd880e6b6bfb61793c4acf..e02081db6c4f758d71b6db4326ec21c5c7512a82 100644 --- a/src/plugins/git/gitplugin.cpp +++ b/src/plugins/git/gitplugin.cpp @@ -623,8 +623,12 @@ bool GitPlugin::initialize(const QStringList &arguments, QString *errorMessage) /* "Gerrit" */ - Gerrit::Internal::GerritPlugin *gp = new Gerrit::Internal::GerritPlugin(this); - return gp->initialize(remoteRepositoryMenu); + m_gerritPlugin = new Gerrit::Internal::GerritPlugin(this); + const bool ok = m_gerritPlugin->initialize(remoteRepositoryMenu); + m_gerritPlugin->updateActions(currentState().hasTopLevel()); + m_gerritPlugin->addToLocator(m_commandLocator); + + return ok; } GitVersionControl *GitPlugin::gitVersionControl() const @@ -1245,6 +1249,8 @@ void GitPlugin::updateActions(VcsBase::VcsBasePlugin::ActionState as) m_submoduleUpdateAction->setVisible(repositoryEnabled && QFile::exists(currentState().topLevel() + QLatin1String("/.gitmodules"))); updateRepositoryBrowserAction(); + + m_gerritPlugin->updateActions(repositoryEnabled); } void GitPlugin::updateRepositoryBrowserAction() diff --git a/src/plugins/git/gitplugin.h b/src/plugins/git/gitplugin.h index 02b8f7903b8c541854a6d84bf23a339d70a01597..00a032603a403925f363b8b2a2e07cebf0d94a9d 100644 --- a/src/plugins/git/gitplugin.h +++ b/src/plugins/git/gitplugin.h @@ -63,6 +63,11 @@ class ParameterAction; namespace Locator { class CommandLocator; } +namespace Gerrit { +namespace Internal { +class GerritPlugin; +} +} namespace Git { namespace Internal { @@ -211,6 +216,7 @@ private: QVector<Utils::ParameterAction *> m_projectActions; QVector<QAction *> m_repositoryActions; Utils::ParameterAction *m_applyCurrentFilePatchAction; + Gerrit::Internal::GerritPlugin *m_gerritPlugin; GitClient *m_gitClient; QPointer<StashDialog> m_stashDialog; diff --git a/src/plugins/git/remotedialog.cpp b/src/plugins/git/remotedialog.cpp index 780995d86d62e9781d4c43b94fab2dcf6fe4c018..05006dbb1539c1f29bb537e002200c68bf4a45c4 100644 --- a/src/plugins/git/remotedialog.cpp +++ b/src/plugins/git/remotedialog.cpp @@ -174,7 +174,8 @@ void RemoteDialog::pushToRemote() const int row = indexList.at(0).row(); const QString remoteName = m_remoteModel->remoteName(row); - m_remoteModel->client()->synchronousPush(m_remoteModel->workingDirectory(), remoteName); + m_remoteModel->client()->synchronousPush(m_remoteModel->workingDirectory(), + QStringList() << remoteName); } void RemoteDialog::fetchFromRemote()