diff options
author | Max Hohenegger | 2016-01-25 18:59:11 +0000 |
---|---|---|
committer | Max Hohenegger | 2016-02-08 18:46:17 +0000 |
commit | 450d57a48486d1011e4a0d0ee42fb52d89dcc4b4 (patch) | |
tree | 0b351caf8087be272e0b87b87980b521b011d7cb | |
parent | 28ece38ace78f4bc8461c16b78f7138aabe8e4fe (diff) | |
download | egit-450d57a48486d1011e4a0d0ee42fb52d89dcc4b4.tar.gz egit-450d57a48486d1011e4a0d0ee42fb52d89dcc4b4.tar.xz egit-450d57a48486d1011e4a0d0ee42fb52d89dcc4b4.zip |
Fixed enablement of Gitflow command for creating release from commit
Enable the "Start release from...", available in the History views
Gitflow submenu, only if the currently selected commit is on the develop
branch.
http://nvie.com/posts/a-successful-git-branching-model/#release-branches
Change-Id: I6f0213b2b57f11b9833be979cbf0b3ca98c93f11
Signed-off-by: Max Hohenegger <eclipse@hohenegger.eu>
4 files changed, 66 insertions, 6 deletions
diff --git a/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/GitFlowRepositoryTest.java b/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/GitFlowRepositoryTest.java index aacd37c104..c4afd6e0be 100644 --- a/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/GitFlowRepositoryTest.java +++ b/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/GitFlowRepositoryTest.java @@ -30,6 +30,7 @@ import org.eclipse.egit.gitflow.op.ReleaseFinishOperation; import org.eclipse.egit.gitflow.op.ReleaseStartOperation; import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.revwalk.RevCommit; import org.junit.Test; public class GitFlowRepositoryTest extends AbstractDualRepositoryTestCase { @@ -139,4 +140,29 @@ public class GitFlowRepositoryTest extends AbstractDualRepositoryTestCase { assertEquals(MY_FEATURE, gfRepo.getFeatureBranchName(actualFeatureRef)); } + + @Test + public void testIsOnDevelop() throws Exception { + Repository repository = repository1.getRepository(); + GitFlowRepository gfRepo = new GitFlowRepository(repository); + + InitParameters initParameters = new InitParameters(); + initParameters.setDevelop(DEVELOP); + initParameters.setMaster(GitFlowDefaults.MASTER); + initParameters.setFeature(FEATURE_PREFIX); + initParameters.setRelease(RELEASE_PREFIX); + initParameters.setHotfix(HOTFIX_PREFIX); + initParameters.setVersionTag(VERSION_TAG); + repository1.checkoutBranch(gfRepo.getConfig().getDevelop()); + + RevCommit developBranchCommit = repository1.commit("develop branch commit"); + assertTrue(gfRepo.isOnDevelop(developBranchCommit)); + + new FeatureStartOperation(gfRepo, MY_FEATURE).execute(null); + RevCommit featureBranchCommit = repository1.commit("feature branch commit"); + assertFalse(gfRepo.isOnDevelop(featureBranchCommit)); + + // the initial commit was made on master, but is also on develop + assertTrue(gfRepo.isOnDevelop(initialCommit)); + } } diff --git a/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/op/AbstractDualRepositoryTestCase.java b/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/op/AbstractDualRepositoryTestCase.java index 438189c92a..ded616e8a8 100644 --- a/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/op/AbstractDualRepositoryTestCase.java +++ b/org.eclipse.egit.gitflow.test/src/org/eclipse/egit/gitflow/op/AbstractDualRepositoryTestCase.java @@ -50,6 +50,8 @@ public class AbstractDualRepositoryTestCase extends DualRepositoryTestCase { String projectName = "FeaturePublishTest"; + protected RevCommit initialCommit; + @Override @Before public void beforeTestCase() throws Exception { @@ -58,7 +60,7 @@ public class AbstractDualRepositoryTestCase extends DualRepositoryTestCase { repository1 = new TestRepository(new File(workdir, DOT_GIT)); - repository1.createInitialCommit("setUp"); + initialCommit = repository1.createInitialCommit("setUp"); Repository repository = repository1.getRepository(); new InitOperation(repository).execute(null); diff --git a/org.eclipse.egit.gitflow.ui/src/org/eclipse/egit/gitflow/ui/internal/menu/DynamicHistoryMenu.java b/org.eclipse.egit.gitflow.ui/src/org/eclipse/egit/gitflow/ui/internal/menu/DynamicHistoryMenu.java index 0d8fe69576..6e366135fd 100644 --- a/org.eclipse.egit.gitflow.ui/src/org/eclipse/egit/gitflow/ui/internal/menu/DynamicHistoryMenu.java +++ b/org.eclipse.egit.gitflow.ui/src/org/eclipse/egit/gitflow/ui/internal/menu/DynamicHistoryMenu.java @@ -8,11 +8,13 @@ *******************************************************************************/ package org.eclipse.egit.gitflow.ui.internal.menu; +import static org.eclipse.egit.gitflow.ui.Activator.error; + import java.io.IOException; import org.eclipse.egit.core.internal.Utils; +import org.eclipse.egit.gitflow.Activator; import org.eclipse.egit.gitflow.GitFlowRepository; -import org.eclipse.egit.gitflow.ui.Activator; import org.eclipse.egit.gitflow.ui.internal.UIText; import org.eclipse.egit.gitflow.ui.internal.actions.ReleaseStartFromCommitHandler; import org.eclipse.jface.action.ContributionItem; @@ -54,13 +56,13 @@ public class DynamicHistoryMenu extends ContributionItem { abbreviate(selectedCommit))); menuItem.addSelectionListener(listener); + boolean isEnabled = false; try { - menuItem.setEnabled(gfRepo.isDevelop()); + isEnabled = gfRepo.isOnDevelop(selectedCommit); } catch (IOException e) { - Activator.getDefault().getLog() - .log(Activator.error(e.getMessage())); - return; + Activator.getDefault().getLog().log(error(e.getMessage(), e)); } + menuItem.setEnabled(isEnabled); } private String abbreviate(RevCommit selectedCommit) { diff --git a/org.eclipse.egit.gitflow/src/org/eclipse/egit/gitflow/GitFlowRepository.java b/org.eclipse.egit.gitflow/src/org/eclipse/egit/gitflow/GitFlowRepository.java index 1f0edffebd..d37a7e4cd0 100644 --- a/org.eclipse.egit.gitflow/src/org/eclipse/egit/gitflow/GitFlowRepository.java +++ b/org.eclipse.egit.gitflow/src/org/eclipse/egit/gitflow/GitFlowRepository.java @@ -297,4 +297,34 @@ public class GitFlowRepository { public GitFlowConfig getConfig() { return this.config; } + + /** + * Check if the given commit is an ancestor of the current HEAD on the + * develop branch. + * + * @param selectedCommit + * @return Whether or not the selected commit is on the develop branch. + * @throws IOException + * @since 4.3 + */ + public boolean isOnDevelop(@NonNull RevCommit selectedCommit) throws IOException { + String develop = config.getDevelopFull(); + return isOnBranch(selectedCommit, develop); + } + + private boolean isOnBranch(RevCommit commit, String fullBranch) + throws IOException { + Ref branchRef = repository.exactRef(fullBranch); + if (branchRef == null) { + return false; + } + try { + List<Ref> list = Git.wrap(repository).branchList().setContains(commit.name()).call(); + + return list.contains(branchRef); + } catch (GitAPIException e) { + // ListBranchCommand can only throw a wrapped IOException + throw new IOException(e); + } + } } |