From cdba8c05f6cdd693215e652f0fed8fb9336e36fb Mon Sep 17 00:00:00 2001 From: kostas Date: Sun, 3 May 2015 11:44:04 +0000 Subject: [PATCH] Added merge support FossilOrigin-Name: ac65fbf8d33a9e64fb97bd8652a43b4d11c8e538 --- manifest | 26 +++++++-------- manifest.uuid | 2 +- src/Fossil.cpp | 37 +++++++++++++++++++++ src/Fossil.h | 2 ++ src/MainWindow.cpp | 79 ++++++++++++++++++++++++++++++++++++++++---- src/MainWindow.h | 9 ++--- src/UpdateDialog.cpp | 33 +++++++++++++++++- src/UpdateDialog.h | 1 + src/Workspace.cpp | 2 +- ui/UpdateDialog.ui | 26 +++++++++++++-- 10 files changed, 186 insertions(+), 31 deletions(-) diff --git a/manifest b/manifest index af91f79..35a016b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fixed\sup-to-date\sworkspace\scheck\nAdded\sicons\sfor\stag\soperations -D 2015-05-03T10:26:29.811 +C Added\smerge\ssupport +D 2015-05-03T11:44:04.852 F .travis.yml 77966888a81c4ceee1fcc79bce842c9667ad8a35 F debian/changelog eb4304dfcb6bb66850ec740838090eb50ce1249b F debian/compat b6abd567fa79cbe0196d093a067271361dc6ca8b @@ -196,19 +196,19 @@ F src/FileActionDialog.cpp fcaebf9986f789b3440d5390b3458ad5f86fe0c8 F src/FileActionDialog.h 15db1650b3a13d70bc338371e4c033c66e3b79ce F src/FileTableView.cpp 5ddf8c391c9a3ac449ec61fb1db837b577afeec2 F src/FileTableView.h 03e56d87c2d46411b9762b87f4d301619aaf18df -F src/Fossil.cpp 46edbf48a7f09c0673136c726f62cf3e95e92f1e -F src/Fossil.h 7e45c12f80c06af78bf7a13cce75e0b105e0b99a +F src/Fossil.cpp 57363e0f487f325ba2eae6fdcf29756c9b1ae4a9 +F src/Fossil.h fb34964797dc10cea02bdf2e3f2c97a74fddafc5 F src/LoggedProcess.cpp 2a1e5c94bc1e57c8984563e66c210e43a14dc60c F src/LoggedProcess.h 85df7c635c807a5a0e8c4763f17a0752aaff7261 -F src/MainWindow.cpp 032fec25b6f679d2863839095c9039ff4bf4b41d -F src/MainWindow.h dffe67ceb1d7a51b858ce8a0fb688bfa7e90c5be +F src/MainWindow.cpp 7ae75136eb3a2f867de4281cbe428a176c3d11c8 +F src/MainWindow.h a4f3c753debe65d6231721c9948c4e8dee699021 F src/SettingsDialog.cpp a46cff5e5dd425e3dbdd15632abfd5829f5562b4 F src/SettingsDialog.h 4e2790f581e991c744ae9f86580f1972b8c7ff43 -F src/UpdateDialog.cpp 5f9ff02aeed08ab3a69d0a9a3b3efeefbc38f3d4 -F src/UpdateDialog.h 93c6ad9bd814f23e431c67bcd01928f33e10a80b +F src/UpdateDialog.cpp 08b0261de45babd947a0fbbd5af6bf8b58b74735 +F src/UpdateDialog.h bf04816f3cc5425beaaca72ca05bcc793d4ca204 F src/Utils.cpp 748a58f19187aff7f3b867894129291cbe091678 F src/Utils.h 9cc125f59b8d46ff47bbde4c2cf9bc77f8e2553b -F src/Workspace.cpp 329b9ecd8363089b5fb230c0fd3606f2e9dab73a +F src/Workspace.cpp 12edd94656a0aaef20798f883b59af3074466cec F src/Workspace.h 890fdb5f6b768809bc962374d22422dbfb6e89a1 F src/main.cpp 2ac8badc2a63fa123ceae53382ce24cfe1b5a54b F tools/git-push.sh 62cc58434cae5b7bcd6bd9d4cce8b08739f31cd7 x @@ -219,8 +219,8 @@ F ui/CommitDialog.ui 6200f6cabdcf40a20812e811be28e0793f82516f F ui/FileActionDialog.ui 89bb4dc2d0b8adcd41adcb11ec65f2028a09a12d F ui/MainWindow.ui d4fc7971a0717677adb1be0bb88502dfcb92f5c4 F ui/SettingsDialog.ui 2b7c2870e0054b0f4106f495d85d02c0b814df8b -F ui/UpdateDialog.ui 636fd495d481ade1f20a65f79b538b9a49bbf1fa -P 72ac541c4c28f83c94c371f2d81e116b8f3cf261 -R fd6aaebd153d8868db1e625f9440db3c +F ui/UpdateDialog.ui cd909f40c16e439181664e53bc3e86c2df647e3f +P 87468705beaaef842877ab8459e287a61edf4bc3 +R 5791f89a3c32b1103d6b1aa0c81d25f4 U kostas -Z 43ffc6ff0a38aa6f520fbb26747d7238 +Z 6e82b9757fd44eb9f7e8cfc7e84094f4 diff --git a/manifest.uuid b/manifest.uuid index 050962e..803c95d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -87468705beaaef842877ab8459e287a61edf4bc3 \ No newline at end of file +ac65fbf8d33a9e64fb97bd8652a43b4d11c8e538 \ No newline at end of file diff --git a/src/Fossil.cpp b/src/Fossil.cpp index 609d08f..b00f79e 100644 --- a/src/Fossil.cpp +++ b/src/Fossil.cpp @@ -531,6 +531,43 @@ bool Fossil::branchList(QStringList& branches, QStringList& activeBranches) return true; } +//------------------------------------------------------------------------------ +bool Fossil::branchNew(const QString& name, const QString& revisionBasis, bool isPrivate) +{ + QStringList params; + + params <<"branch" << "new" << name << revisionBasis; + + if(isPrivate) + params << "--private"; + + QStringList res; + + if(!runFossil(params, &res)) + return false; + return true; +} + +//------------------------------------------------------------------------------ +bool Fossil::branchMerge(QStringList &res, const QString& revision, bool integrate, bool testOnly) +{ + QStringList params; + + params <<"merge"; + + if(integrate) + params << "--integrate"; + + if(testOnly) + params << "--dry-run"; + + params << revision; + + if(!runFossil(params, &res)) + return false; + return true; +} + //------------------------------------------------------------------------------ static QString ParseFossilQuery(QString line) { diff --git a/src/Fossil.h b/src/Fossil.h index bbcb37c..ca6d5c9 100644 --- a/src/Fossil.h +++ b/src/Fossil.h @@ -116,6 +116,8 @@ public: bool tagDelete(const QString& name, const QString& revision); bool branchList(QStringList& branches, QStringList& activeBranches); + bool branchNew(const QString& name, const QString& revisionBasis, bool isPrivate=false); + bool branchMerge(QStringList& res, const QString& revision, bool integrate, bool testOnly); const QString &getCurrentRevision() const { return currentRevision; } const QStringList &getCurrentTags() const { return currentTags; } diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index 3fb97c9..c02fceb 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -18,7 +18,8 @@ #include "UpdateDialog.h" #include "Utils.h" -#define LATEST_VERSION "Latest" +#define LATEST_VERSION "Latest Revision" +#define CURRENT_VERSION "Current Revision" //----------------------------------------------------------------------------- enum @@ -147,6 +148,8 @@ MainWindow::MainWindow(Settings &_settings, QWidget *parent, QString *workspaceP // StashMenu menuStashes = new QMenu(this); + menuStashes->addAction(ui->actionNewStash); + menuStashes->addAction(separator); menuStashes->addAction(ui->actionApplyStash); menuStashes->addAction(ui->actionDiffStash); menuStashes->addAction(ui->actionDeleteStash); @@ -154,9 +157,16 @@ MainWindow::MainWindow(Settings &_settings, QWidget *parent, QString *workspaceP // TagsMenu menuTags = new QMenu(this); menuTags->addAction(ui->actionNewTag); + menuTags->addAction(separator); menuTags->addAction(ui->actionDeleteTag); menuTags->addAction(ui->actionUpdateRevision); + // BranchesMenu + menuBranches = new QMenu(this); + menuBranches->addAction(ui->actionNewBranch); + menuBranches->addAction(separator); + menuBranches->addAction(ui->actionMergeBranch); + menuBranches->addAction(ui->actionUpdateRevision); // Recent Workspaces // Locate a sequence of two separator actions in file menu @@ -586,10 +596,7 @@ void MainWindow::scanWorkspace() updateFileView(); // Build default versions list - const QString latest = tr(LATEST_VERSION); - versionList.clear(); - versionList.append(latest); versionList += getWorkspace().getBranches(); versionList += getWorkspace().getTags().keys(); @@ -1474,7 +1481,13 @@ void MainWindow::on_actionUpdate_triggered() //------------------------------------------------------------------------------ void MainWindow::on_actionUpdateRevision_triggered() { - updateRevision(""); + QStringList selected = selectedBranches + selectedTags; + + QString revision; + if(!selected.isEmpty()) + revision = selected.first(); + + updateRevision(revision); } //------------------------------------------------------------------------------ @@ -1610,6 +1623,8 @@ void MainWindow::onWorkspaceTreeViewSelectionChanged(const QItemSelection &/*sel return; stringset_t new_dirs; + selectedTags.clear(); + selectedBranches.clear(); foreach(const QModelIndex &id, indices) { @@ -2039,6 +2054,8 @@ void MainWindow::on_workspaceTreeView_customContextMenuRequested(const QPoint &) menu = menuStashes; else if (tv.Type == TreeViewItem::TYPE_TAG || tv.Type == TreeViewItem::TYPE_TAGS) menu = menuTags; + else if (tv.Type == TreeViewItem::TYPE_BRANCH || tv.Type == TreeViewItem::TYPE_BRANCHES) + menu = menuBranches; if(menu) { @@ -2221,11 +2238,14 @@ void MainWindow::on_actionNewTag_triggered() QString revision = fossil().getCurrentRevision(); QString name; - if(!UpdateDialog::runNewTag(this, tr("New tag"), versionList, revision, revision, name)) + if(!UpdateDialog::runNewTag(this, tr("New Tag"), versionList, revision, revision, name)) return; if(name.isEmpty() || getWorkspace().getTags().contains(name) || getWorkspace().getBranches().contains(name)) + { + QMessageBox::critical(this, tr("Error"), tr("Invalid name."), QMessageBox::Ok ); return; + } fossil().tagNew(name, revision); refresh(); @@ -2253,11 +2273,58 @@ void MainWindow::on_actionDeleteTag_triggered() //------------------------------------------------------------------------------ void MainWindow::on_actionNewBranch_triggered() { + // Default to current revision + QString revision = fossil().getCurrentRevision(); + QString branch_name; + if(!UpdateDialog::runNewTag(this, tr("New Branch"), versionList, revision, revision, branch_name)) + return; + + if(branch_name.isEmpty() || getWorkspace().getTags().contains(branch_name) || getWorkspace().getBranches().contains(branch_name)) + { + QMessageBox::critical(this, tr("Error"), tr("Invalid name."), QMessageBox::Ok ); + return; + } + + if(!fossil().branchNew(branch_name, revision, false)) + return; + + if(QMessageBox::Yes == DialogQuery(this, tr("New Branch"), tr("Would you like to check-out the branch '%0' ?").arg(branch_name))) + updateRevision(branch_name); + else + refresh(); +} +//------------------------------------------------------------------------------ +void MainWindow::MergeRevision(const QString &defaultRevision) +{ + QStringList res; + QString revision = defaultRevision; + + bool integrate = false; + revision = UpdateDialog::runMerge(this, tr("Merge"), versionList, revision, integrate); + + if(revision.isEmpty()) + return; + + // Do test merge + if(!fossil().branchMerge(res, revision, integrate, true)) + return; + + if(!FileActionDialog::run(this, tr("Merge"), tr("The following changesd will be made.")+"\n"+tr("Are you sure?"), res)) + return; + + // Do update + fossil().branchMerge(res, revision, integrate, false); + + refresh(); } //------------------------------------------------------------------------------ void MainWindow::on_actionMergeBranch_triggered() { + QString revision; + if(!selectedBranches.isEmpty()) + revision = selectedBranches.first(); + MergeRevision(revision); } diff --git a/src/MainWindow.h b/src/MainWindow.h index 07f6afb..96389d0 100644 --- a/src/MainWindow.h +++ b/src/MainWindow.h @@ -51,6 +51,8 @@ private: void updateWorkspaceView(); void updateFileView(); void selectRootDir(); + void MergeRevision(const QString& defaultRevision); + void fossilBrowse(const QString &fossilUrl); void dragEnterEvent(class QDragEnterEvent *event); void dropEvent(class QDropEvent *event); @@ -112,15 +114,10 @@ private slots: void on_textBrowser_customContextMenuRequested(const QPoint &pos); void on_fileTableView_customContextMenuRequested(const QPoint &pos); void on_workspaceTreeView_customContextMenuRequested(const QPoint &pos); - void on_actionUpdateRevision_triggered(); - void on_actionNewTag_triggered(); - void on_actionDeleteTag_triggered(); - void on_actionNewBranch_triggered(); - void on_actionMergeBranch_triggered(); private: @@ -160,7 +157,7 @@ private: QMenu *menuWorkspace; QMenu *menuStashes; QMenu *menuTags; - //QMenu *menuBranches; + QMenu *menuBranches; bool operationAborted; stringset_t selectedDirs; // The directory selected in the tree diff --git a/src/UpdateDialog.cpp b/src/UpdateDialog.cpp index b6a3708..9fdae32 100644 --- a/src/UpdateDialog.cpp +++ b/src/UpdateDialog.cpp @@ -28,20 +28,51 @@ QString UpdateDialog::runUpdate(QWidget *parent, const QString &title, const QSt { UpdateDialog dlg(parent, completions, defaultValue); dlg.setWindowTitle(title); - dlg.ui->label_3->setVisible(false); + dlg.ui->lblName->setVisible(false); dlg.ui->lineName->setVisible(false); + dlg.ui->lblIntegrate->setVisible(false); + dlg.ui->chkIntegrate->setVisible(false); + + dlg.adjustSize(); if(dlg.exec() != QDialog::Accepted) return QString(""); return dlg.ui->cmbRevision->currentText().trimmed(); } +//----------------------------------------------------------------------------- +QString UpdateDialog::runMerge(QWidget *parent, const QString &title, const QStringList &completions, const QString &defaultValue, bool &integrate) +{ + UpdateDialog dlg(parent, completions, defaultValue); + dlg.setWindowTitle(title); + dlg.ui->lblName->setVisible(false); + dlg.ui->lineName->setVisible(false); + dlg.ui->lblIntegrate->setVisible(true); + dlg.ui->chkIntegrate->setVisible(true); + dlg.ui->chkIntegrate->setChecked(integrate); + dlg.adjustSize(); + + if(dlg.exec() != QDialog::Accepted) + return QString(""); + + integrate = dlg.ui->chkIntegrate->checkState() == Qt::Checked; + + return dlg.ui->cmbRevision->currentText().trimmed(); +} + + //----------------------------------------------------------------------------- bool UpdateDialog::runNewTag(QWidget *parent, const QString &title, const QStringList &completions, const QString &defaultValue, QString &revision, QString &name) { UpdateDialog dlg(parent, completions, defaultValue); dlg.setWindowTitle(title); + dlg.ui->lblName->setVisible(true); + dlg.ui->lineName->setVisible(true); + dlg.ui->lblIntegrate->setVisible(false); + dlg.ui->chkIntegrate->setVisible(false); + dlg.adjustSize(); + if(dlg.exec() != QDialog::Accepted) return false; diff --git a/src/UpdateDialog.h b/src/UpdateDialog.h index fc4498e..466bf30 100644 --- a/src/UpdateDialog.h +++ b/src/UpdateDialog.h @@ -17,6 +17,7 @@ public: ~UpdateDialog(); static QString runUpdate(QWidget *parent, const QString &title, const QStringList &completions, const QString &defaultValue); + static QString runMerge(QWidget* parent, const QString& title, const QStringList& completions, const QString& defaultValue, bool& integrate); static bool runNewTag(QWidget *parent, const QString &title, const QStringList &completions, const QString &defaultValue, QString &revision, QString &name); private: diff --git a/src/Workspace.cpp b/src/Workspace.cpp index 761e29d..2cf1baf 100644 --- a/src/Workspace.cpp +++ b/src/Workspace.cpp @@ -148,7 +148,7 @@ void Workspace::scanWorkspace(bool scanLocal, bool scanIgnored, bool scanModifie type = WorkspaceFile::TYPE_UNCHANGED; else if(status_text=="CONFLICT") type = WorkspaceFile::TYPE_CONFLICTED; - else if(status_text=="UPDATED_BY_MERGE") + else if(status_text=="UPDATED_BY_MERGE" || status_text=="ADDED_BY_MERGE" || status_text=="ADDED_BY_INTEGRATE" || status_text=="UPDATED_BY_INTEGRATE") type = WorkspaceFile::TYPE_MERGED; // Filter unwanted file types diff --git a/ui/UpdateDialog.ui b/ui/UpdateDialog.ui index 7f2275e..5a17f54 100644 --- a/ui/UpdateDialog.ui +++ b/ui/UpdateDialog.ui @@ -10,9 +10,15 @@ 0 0 478 - 113 + 146 + + + 400 + 0 + + true @@ -20,7 +26,7 @@ - + Revision @@ -34,7 +40,7 @@ - + Name @@ -43,6 +49,20 @@ + + + + Integrate + + + + + + + + + +