Gerrit: Support Private/Work-In-Progress push on Gerrit >= 2.15

A private change[1] is only visible to the uploader and reviewers (like
draft in older Gerrit).

A WIP change[2] does not generate notifications until it becomes ready.

[1] https://gerrit-review.googlesource.com/Documentation/intro-user.html#private-changes
[2] https://gerrit-review.googlesource.com/Documentation/user-upload.html#wip

Change-Id: I4905461c529e93e86be934c60eab218ff7474fcd
Reviewed-by: André Hartmann <aha_1980@gmx.de>
Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
This commit is contained in:
Orgad Shaneh
2017-10-15 00:15:07 +03:00
committed by Orgad Shaneh
parent 95bd5b0d68
commit 2310ec5891
3 changed files with 76 additions and 7 deletions

View File

@@ -37,6 +37,7 @@
#include <QDir>
#include <QPushButton>
#include <QRegExpValidator>
#include <QVersionNumber>
using namespace Git::Internal;
@@ -151,15 +152,16 @@ GerritPushDialog::GerritPushDialog(const QString &workingDir, const QString &rev
this, &GerritPushDialog::validate);
updateCommits(m_ui->localBranchComboBox->currentIndex());
setRemoteBranches();
onRemoteChanged(true);
QRegExpValidator *noSpaceValidator = new QRegExpValidator(QRegExp("^\\S+$"), this);
m_ui->reviewersLineEdit->setText(reviewerList);
m_ui->reviewersLineEdit->setValidator(noSpaceValidator);
m_ui->topicLineEdit->setValidator(noSpaceValidator);
m_ui->wipCheckBox->setCheckState(Qt::PartiallyChecked);
connect(m_ui->remoteComboBox, &GerritRemoteChooser::remoteChanged,
this, [this] { setRemoteBranches(); });
this, [this] { onRemoteChanged(); });
}
GerritPushDialog::~GerritPushDialog()
@@ -209,6 +211,40 @@ void GerritPushDialog::setChangeRange()
tr("Number of commits between %1 and %2: %3").arg(branch, remote, range));
}
static bool versionSupportsWip(const QString &version)
{
return QVersionNumber::fromString(version) >= QVersionNumber(2, 15);
}
void GerritPushDialog::onRemoteChanged(bool force)
{
setRemoteBranches();
const QString version = m_ui->remoteComboBox->currentServer().version;
const bool supportsWip = versionSupportsWip(version);
if (!force && supportsWip == m_currentSupportsWip)
return;
m_currentSupportsWip = supportsWip;
m_ui->wipCheckBox->setEnabled(supportsWip);
if (supportsWip) {
m_ui->wipCheckBox->setToolTip(tr("Checked - Mark change as WIP\n"
"Unchecked - Mark change as ready\n"
"Partially checked - Do not change current state"));
m_ui->draftCheckBox->setTristate(true);
if (m_ui->draftCheckBox->checkState() != Qt::Checked)
m_ui->draftCheckBox->setCheckState(Qt::PartiallyChecked);
m_ui->draftCheckBox->setToolTip(tr("Checked - Mark change as private\n"
"Unchecked - Unmark change as private\n"
"Partially checked - Do not change current state"));
} else {
m_ui->wipCheckBox->setToolTip(tr("Supported on Gerrit 2.15 and up"));
m_ui->draftCheckBox->setTristate(false);
if (m_ui->draftCheckBox->checkState() != Qt::Checked)
m_ui->draftCheckBox->setCheckState(Qt::Unchecked);
m_ui->draftCheckBox->setToolTip(tr("Checked - Mark change as draft\n"
"Unchecked - Unmark change as draft"));
}
}
QString GerritPushDialog::initErrorMessage() const
{
return m_initErrorMessage;
@@ -216,16 +252,32 @@ QString GerritPushDialog::initErrorMessage() const
QString GerritPushDialog::pushTarget() const
{
QStringList options;
QString target = selectedCommit();
if (target.isEmpty())
target = "HEAD";
target += ":refs/" + QLatin1String(m_ui->draftCheckBox->isChecked() ? "drafts" : "for") +
'/' + selectedRemoteBranchName();
target += ":refs/";
if (versionSupportsWip(m_ui->remoteComboBox->currentServer().version)) {
target += "for";
const Qt::CheckState draftState = m_ui->draftCheckBox->checkState();
const Qt::CheckState wipState = m_ui->wipCheckBox->checkState();
if (draftState == Qt::Checked)
options << "private";
else if (draftState == Qt::Unchecked)
options << "remove-private";
if (wipState == Qt::Checked)
options << "wip";
else if (wipState == Qt::Unchecked)
options << "ready";
} else {
target += QLatin1String(m_ui->draftCheckBox->isChecked() ? "for" : "drafts");
}
target += '/' + selectedRemoteBranchName();
const QString topic = selectedTopic();
if (!topic.isEmpty())
target += '/' + topic;
QStringList options;
const QStringList reviewersInput = reviewers().split(',', QString::SkipEmptyParts);
for (const QString &reviewer : reviewersInput)
options << "r=" + reviewer;
@@ -302,7 +354,7 @@ void GerritPushDialog::updateCommits(int index)
const QString remote = remoteBranch.left(slash);
if (!m_ui->remoteComboBox->setCurrentRemote(remote))
setRemoteBranches();
onRemoteChanged();
}
validate();
}