summaryrefslogtreecommitdiff
path: root/src/plugins/git/branchdialog.cpp
diff options
context:
space:
mode:
authorAndre Hartmann <aha_1980@gmx.de>2018-02-18 17:12:55 +0100
committerAndré Hartmann <aha_1980@gmx.de>2018-03-01 21:20:42 +0000
commita2edfda1ca1e2beaba29398793fbae638e5df7d8 (patch)
tree42b21f3e606788e29c5e627c272872a49889960f /src/plugins/git/branchdialog.cpp
parent205c930592ce32d5fe98eb68f1100052dbe96b92 (diff)
downloadqt-creator-a2edfda1ca1e2beaba29398793fbae638e5df7d8.tar.gz
Git: Extract BranchUtils for re-use in Branches Side Panel
Done-with: Orgad Shaneh <orgad.shaneh@audiocodes.com> Change-Id: I1f48ffb3d9bb9b8d743ab6891c472fcfab778cf6 Reviewed-by: Orgad Shaneh <orgads@gmail.com> Reviewed-by: André Hartmann <aha_1980@gmx.de>
Diffstat (limited to 'src/plugins/git/branchdialog.cpp')
-rw-r--r--src/plugins/git/branchdialog.cpp237
1 files changed, 13 insertions, 224 deletions
diff --git a/src/plugins/git/branchdialog.cpp b/src/plugins/git/branchdialog.cpp
index 8935a4ce9f..86d11751d9 100644
--- a/src/plugins/git/branchdialog.cpp
+++ b/src/plugins/git/branchdialog.cpp
@@ -27,6 +27,7 @@
#include "branchadddialog.h"
#include "branchcheckoutdialog.h"
#include "branchmodel.h"
+#include "branchutils.h"
#include "gitclient.h"
#include "gitplugin.h"
#include "gitutils.h"
@@ -55,14 +56,15 @@ namespace Internal {
BranchDialog::BranchDialog(QWidget *parent) :
QDialog(parent),
- m_ui(new Ui::BranchDialog),
- m_model(new BranchModel(GitPlugin::client(), this))
+ BranchUtils(this),
+ m_ui(new Ui::BranchDialog)
{
setModal(false);
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
setAttribute(Qt::WA_DeleteOnClose, true); // Do not update unnecessarily
m_ui->setupUi(this);
+ setBranchView(m_ui->branchView);
m_ui->includeOldCheckBox->setToolTip(
tr("Include branches and tags that have not been active for %n days.", 0,
Constants::OBSOLETE_COMMIT_AGE_IN_DAYS));
@@ -70,16 +72,16 @@ BranchDialog::BranchDialog(QWidget *parent) :
GitSettings::showTagsKey));
connect(m_ui->refreshButton, &QAbstractButton::clicked, this, &BranchDialog::refreshCurrentRepository);
- connect(m_ui->addButton, &QAbstractButton::clicked, this, &BranchDialog::add);
- connect(m_ui->checkoutButton, &QAbstractButton::clicked, this, &BranchDialog::checkout);
- connect(m_ui->removeButton, &QAbstractButton::clicked, this, &BranchDialog::remove);
+ connect(m_ui->addButton, &QAbstractButton::clicked, this, [this] { add(); });
+ connect(m_ui->checkoutButton, &QAbstractButton::clicked, this, [this] { checkout(); });
+ connect(m_ui->removeButton, &QAbstractButton::clicked, this, [this] { remove(); });
connect(m_ui->renameButton, &QAbstractButton::clicked, this, &BranchDialog::rename);
connect(m_ui->diffButton, &QAbstractButton::clicked, this, &BranchDialog::diff);
connect(m_ui->logButton, &QAbstractButton::clicked, this, &BranchDialog::log);
- connect(m_ui->resetButton, &QAbstractButton::clicked, this, &BranchDialog::reset);
+ connect(m_ui->resetButton, &QAbstractButton::clicked, this, [this] { reset(); });
connect(m_ui->mergeButton, &QAbstractButton::clicked, this, &BranchDialog::merge);
- connect(m_ui->rebaseButton, &QAbstractButton::clicked, this, &BranchDialog::rebase);
- connect(m_ui->cherryPickButton, &QAbstractButton::clicked, this, &BranchDialog::cherryPick);
+ connect(m_ui->rebaseButton, &QAbstractButton::clicked, this, [this] { rebase(); });
+ connect(m_ui->cherryPickButton, &QAbstractButton::clicked, this, [this] { cherryPick(); });
connect(m_ui->trackButton, &QAbstractButton::clicked, this, &BranchDialog::setRemoteTracking);
connect(m_ui->includeOldCheckBox, &QCheckBox::toggled, this, [this](bool value) {
m_model->setOldBranchesIncluded(value);
@@ -168,170 +170,10 @@ void BranchDialog::refreshCurrentRepository()
refresh(m_repository, true);
}
-void BranchDialog::add()
-{
- QModelIndex trackedIndex = selectedIndex();
- QString trackedBranch = m_model->fullName(trackedIndex);
- if (trackedBranch.isEmpty()) {
- trackedIndex = m_model->currentBranch();
- trackedBranch = m_model->fullName(trackedIndex);
- }
- const bool isLocal = m_model->isLocal(trackedIndex);
- const bool isTag = m_model->isTag(trackedIndex);
-
- QStringList localNames = m_model->localBranchNames();
-
- QString suggestedName;
- if (!isTag) {
- const QString suggestedNameBase = trackedBranch.mid(trackedBranch.lastIndexOf('/') + 1);
- suggestedName = suggestedNameBase;
- int i = 2;
- while (localNames.contains(suggestedName)) {
- suggestedName = suggestedNameBase + QString::number(i);
- ++i;
- }
- }
-
- BranchAddDialog branchAddDialog(localNames, true, this);
- branchAddDialog.setBranchName(suggestedName);
- branchAddDialog.setTrackedBranchName(isTag ? QString() : trackedBranch, !isLocal);
-
- if (branchAddDialog.exec() == QDialog::Accepted) {
- QModelIndex idx = m_model->addBranch(branchAddDialog.branchName(), branchAddDialog.track(), trackedIndex);
- if (!idx.isValid())
- return;
- m_ui->branchView->selectionModel()->select(idx, QItemSelectionModel::Clear
- | QItemSelectionModel::Select
- | QItemSelectionModel::Current);
- m_ui->branchView->scrollTo(idx);
- if (QMessageBox::question(this, tr("Checkout"), tr("Checkout branch?"),
- QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes)
- checkout();
- }
-}
-
-void BranchDialog::checkout()
-{
- if (!Core::DocumentManager::saveAllModifiedDocuments())
- return;
- QModelIndex idx = selectedIndex();
-
- const QString currentBranch = m_model->fullName(m_model->currentBranch());
- const QString nextBranch = m_model->fullName(idx);
- const QString popMessageStart = QCoreApplication::applicationName() +
- ' ' + nextBranch + "-AutoStash ";
-
- BranchCheckoutDialog branchCheckoutDialog(this, currentBranch, nextBranch);
- GitClient *client = GitPlugin::client();
-
- if (client->gitStatus(m_repository, StatusMode(NoUntracked | NoSubmodules)) != GitClient::StatusChanged)
- branchCheckoutDialog.foundNoLocalChanges();
-
- QList<Stash> stashes;
- client->synchronousStashList(m_repository, &stashes);
- for (const Stash &stash : Utils::asConst(stashes)) {
- if (stash.message.startsWith(popMessageStart)) {
- branchCheckoutDialog.foundStashForNextBranch();
- break;
- }
- }
-
- if (!branchCheckoutDialog.hasLocalChanges() &&
- !branchCheckoutDialog.hasStashForNextBranch()) {
- // No local changes and no Auto Stash - no need to open dialog
- m_model->checkoutBranch(idx);
- } else if (branchCheckoutDialog.exec() == QDialog::Accepted) {
-
- if (branchCheckoutDialog.makeStashOfCurrentBranch()) {
- if (client->synchronousStash(m_repository, currentBranch + "-AutoStash").isEmpty())
- return;
- } else if (branchCheckoutDialog.moveLocalChangesToNextBranch()) {
- if (!client->beginStashScope(m_repository, "Checkout", NoPrompt))
- return;
- } else if (branchCheckoutDialog.discardLocalChanges()) {
- if (!client->synchronousReset(m_repository))
- return;
- }
-
- m_model->checkoutBranch(idx);
-
- QString stashName;
- client->synchronousStashList(m_repository, &stashes);
- for (const Stash &stash : Utils::asConst(stashes)) {
- if (stash.message.startsWith(popMessageStart)) {
- stashName = stash.name;
- break;
- }
- }
-
- if (branchCheckoutDialog.moveLocalChangesToNextBranch())
- client->endStashScope(m_repository);
- else if (branchCheckoutDialog.popStashOfNextBranch())
- client->synchronousStashRestore(m_repository, stashName, true);
- }
- m_ui->branchView->selectionModel()->clear();
-}
-
-/* Prompt to delete a local branch and do so. */
-void BranchDialog::remove()
-{
- QModelIndex selected = selectedIndex();
- QTC_CHECK(selected != m_model->currentBranch()); // otherwise the button would not be enabled!
-
- QString branchName = m_model->fullName(selected);
- if (branchName.isEmpty())
- return;
-
- const bool isTag = m_model->isTag(selected);
- const bool wasMerged = isTag ? true : m_model->branchIsMerged(selected);
- QString message;
- if (isTag)
- message = tr("Would you like to delete the tag \"%1\"?").arg(branchName);
- else if (wasMerged)
- message = tr("Would you like to delete the branch \"%1\"?").arg(branchName);
- else
- message = tr("Would you like to delete the <b>unmerged</b> branch \"%1\"?").arg(branchName);
-
- if (QMessageBox::question(this, isTag ? tr("Delete Tag") : tr("Delete Branch"),
- message, QMessageBox::Yes | QMessageBox::No,
- wasMerged ? QMessageBox::Yes : QMessageBox::No) == QMessageBox::Yes) {
- if (isTag)
- m_model->removeTag(selected);
- else
- m_model->removeBranch(selected);
- }
-}
-
void BranchDialog::rename()
{
- QModelIndex selected = selectedIndex();
- QTC_CHECK(selected != m_model->currentBranch()); // otherwise the button would not be enabled!
- const bool isTag = m_model->isTag(selected);
- QTC_CHECK(m_model->isLocal(selected) || isTag);
-
- QString oldName = m_model->fullName(selected);
- QStringList localNames;
- if (!isTag)
- localNames = m_model->localBranchNames();
-
- BranchAddDialog branchAddDialog(localNames, false, this);
- if (isTag)
- branchAddDialog.setWindowTitle(tr("Rename Tag"));
- branchAddDialog.setBranchName(oldName);
- branchAddDialog.setTrackedBranchName(QString(), false);
-
- branchAddDialog.exec();
-
- if (branchAddDialog.result() == QDialog::Accepted) {
- if (branchAddDialog.branchName() == oldName)
- return;
- if (isTag)
- m_model->renameTag(oldName, branchAddDialog.branchName());
- else
- m_model->renameBranch(oldName, branchAddDialog.branchName());
+ if (BranchUtils::rename())
refreshCurrentRepository();
- }
- m_ui->branchView->selectionModel()->clear();
}
void BranchDialog::diff()
@@ -350,31 +192,10 @@ void BranchDialog::log()
GitPlugin::client()->log(m_repository, QString(), false, {branchName});
}
-void BranchDialog::reset()
-{
- QString currentName = m_model->fullName(m_model->currentBranch());
- QString branchName = m_model->fullName(selectedIndex());
- if (currentName.isEmpty() || branchName.isEmpty())
- return;
-
- if (QMessageBox::question(this, tr("Git Reset"), tr("Hard reset branch \"%1\" to \"%2\"?")
- .arg(currentName).arg(branchName),
- QMessageBox::Yes, QMessageBox::No) == QMessageBox::Yes) {
- GitPlugin::client()->reset(m_repository, "--hard", branchName);
- }
-}
-
void BranchDialog::merge()
{
- if (!Core::DocumentManager::saveAllModifiedDocuments())
- return;
- QModelIndex idx = selectedIndex();
- QTC_CHECK(idx != m_model->currentBranch()); // otherwise the button would not be enabled!
-
- const QString branch = m_model->fullName(idx, true);
- GitClient *client = GitPlugin::client();
bool allowFastForward = true;
- if (client->isFastForwardMerge(m_repository, branch)) {
+ if (isFastForwardMerge()) {
QMenu popup;
QAction *fastForward = popup.addAction(tr("Fast-Forward"));
popup.addAction(tr("No Fast-Forward"));
@@ -383,32 +204,8 @@ void BranchDialog::merge()
return;
allowFastForward = (chosen == fastForward);
}
- if (client->beginStashScope(m_repository, "merge", AllowUnstashed))
- client->synchronousMerge(m_repository, branch, allowFastForward);
-}
-
-void BranchDialog::rebase()
-{
- if (!Core::DocumentManager::saveAllModifiedDocuments())
- return;
- QModelIndex idx = selectedIndex();
- QTC_CHECK(idx != m_model->currentBranch()); // otherwise the button would not be enabled!
-
- const QString baseBranch = m_model->fullName(idx, true);
- GitClient *client = GitPlugin::client();
- if (client->beginStashScope(m_repository, "rebase"))
- client->rebase(m_repository, baseBranch);
-}
-
-void BranchDialog::cherryPick()
-{
- if (!Core::DocumentManager::saveAllModifiedDocuments())
- return;
- QModelIndex idx = selectedIndex();
- QTC_CHECK(idx != m_model->currentBranch()); // otherwise the button would not be enabled!
- const QString branch = m_model->fullName(idx, true);
- GitPlugin::client()->synchronousCherryPick(m_repository, branch);
+ BranchUtils::merge(allowFastForward);
}
void BranchDialog::setRemoteTracking()
@@ -416,13 +213,5 @@ void BranchDialog::setRemoteTracking()
m_model->setRemoteTracking(selectedIndex());
}
-QModelIndex BranchDialog::selectedIndex()
-{
- QModelIndexList selected = m_ui->branchView->selectionModel()->selectedIndexes();
- if (selected.isEmpty())
- return QModelIndex();
- return selected.at(0);
-}
-
} // namespace Internal
} // namespace Git