From 58d90422e9b95433ca72646faa9ac452d89fc417 Mon Sep 17 00:00:00 2001 From: Nadya Zabrodina Date: Thu, 27 Feb 2014 18:35:09 +0400 Subject: [PATCH] IDEA-121096 The ability to delete Mercurial bookmark --- .../hg4idea/action/HgBranchPopupActions.java | 208 ++++++++++-------- .../hg4idea/command/HgBookmarkCommand.java | 65 ++++++ .../command/HgBookmarkCreateCommand.java | 45 ---- 3 files changed, 187 insertions(+), 131 deletions(-) create mode 100644 plugins/hg4idea/src/org/zmlx/hg4idea/command/HgBookmarkCommand.java delete mode 100644 plugins/hg4idea/src/org/zmlx/hg4idea/command/HgBookmarkCreateCommand.java diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/action/HgBranchPopupActions.java b/plugins/hg4idea/src/org/zmlx/hg4idea/action/HgBranchPopupActions.java index 36f1ec05c77f..5d107d1d3320 100644 --- a/plugins/hg4idea/src/org/zmlx/hg4idea/action/HgBranchPopupActions.java +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/action/HgBranchPopupActions.java @@ -82,7 +82,7 @@ public class HgBranchPopupActions { String currentBookmark = myRepository.getCurrentBookmark(); Collections.sort(bookmarkNames); for (String bookmark : bookmarkNames) { - AnAction bookmarkAction = new BranchActions(myProject, bookmark, myRepository); + AnAction bookmarkAction = new BookmarkActions(myProject, myRepository, bookmark); if (bookmark.equals(currentBookmark)) { bookmarkAction.getTemplatePresentation().setIcon(PlatformIcons.CHECK_ICON); } @@ -94,7 +94,7 @@ public class HgBranchPopupActions { Collections.sort(branchNamesList); for (String branch : branchNamesList) { if (!branch.equals(myRepository.getCurrentBranch())) { // don't show current branch in the list - popupGroup.add(new BranchActions(myProject, branch, myRepository)); + popupGroup.add(new BranchActions(myProject, myRepository, branch)); } } return popupGroup; @@ -160,17 +160,7 @@ public class HgBranchPopupActions { if (bookmarkDialog.isOK()) { try { final String name = bookmarkDialog.getName(); - new HgBookmarkCreateCommand(myProject, myPreselectedRepo, name, - bookmarkDialog.isActive()).execute(new HgCommandResultHandler() { - @Override - public void process(@Nullable HgCommandResult result) { - getRepositoryManager(myProject).updateRepository(myPreselectedRepo); - if (HgErrorUtil.hasErrorsInCommandExecution(result)) { - new HgCommandResultNotifier(myProject) - .notifyError(result, "Creation failed", "Bookmark creation [" + name + "] failed"); - } - } - }); + new HgBookmarkCommand(myProject, myPreselectedRepo, name).createBookmark(bookmarkDialog.isActive()); } catch (HgCommandException exception) { HgAbstractGlobalAction.handleException(myProject, exception); @@ -229,7 +219,7 @@ public class HgBranchPopupActions { public AnAction[] getChildren(@Nullable AnActionEvent e) { List branchHeadActions = new ArrayList(); for (Hash hash : myHeads) { - branchHeadActions.add(new BranchActions(myProject, hash.toShortString(), myRepository)); + branchHeadActions.add(new BranchActions(myProject, myRepository, hash.toShortString())); } return ContainerUtil.toArray(branchHeadActions, new AnAction[branchHeadActions.size()]); } @@ -256,18 +246,12 @@ public class HgBranchPopupActions { private String myBranchName; @NotNull private final HgRepository mySelectedRepository; - BranchActions(@NotNull Project project, @NotNull String branchName, - @NotNull HgRepository selectedRepository) { + BranchActions(@NotNull Project project, @NotNull HgRepository selectedRepository, @NotNull String branchName) { super("", true); myProject = project; myBranchName = branchName; mySelectedRepository = selectedRepository; - getTemplatePresentation().setText(calcBranchText(), false); // no mnemonics - } - - @NotNull - private String calcBranchText() { - return myBranchName; + getTemplatePresentation().setText(myBranchName, false); // no mnemonics } @NotNull @@ -278,86 +262,138 @@ public class HgBranchPopupActions { new MergeAction(myProject, mySelectedRepository, myBranchName) }; } + } - private static class MergeAction extends DumbAwareAction { + /** + * Actions available for bookmarks. + */ + static class BookmarkActions extends ActionGroup { - private final Project myProject; - private final HgRepository mySelectedRepository; - private final String myBranchName; + @NotNull private final Project myProject; + @NotNull private String myBookmarkName; + @NotNull private final HgRepository mySelectedRepository; - public MergeAction(@NotNull Project project, - @NotNull HgRepository selectedRepository, - @NotNull String branchName) { - super("Merge"); - myProject = project; - mySelectedRepository = selectedRepository; - myBranchName = branchName; - } - - @Override - public void actionPerformed(AnActionEvent e) { - final UpdatedFiles updatedFiles = UpdatedFiles.create(); - final HgMergeCommand hgMergeCommand = new HgMergeCommand(myProject, mySelectedRepository.getRoot()); - hgMergeCommand.setRevision(myBranchName); - final HgCommandResultNotifier notifier = new HgCommandResultNotifier(myProject); - new Task.Backgroundable(myProject, "Merging changes...") { - @Override - public void run(@NotNull ProgressIndicator indicator) { - try { - new HgHeadMerger(myProject, hgMergeCommand) - .merge(mySelectedRepository.getRoot()); - new HgConflictResolver(myProject, updatedFiles).resolve(mySelectedRepository.getRoot()); - } - - catch (VcsException exception) { - if (exception.isWarning()) { - notifier.notifyWarning("Warning during merge", exception.getMessage()); - } - else { - notifier.notifyError(null, "Exception during merge", exception.getMessage()); - } - } - catch (Exception e1) { - HgAbstractGlobalAction.handleException(myProject, e1); - } - } - }.queue(); - } + BookmarkActions(@NotNull Project project, + @NotNull HgRepository selectedRepository, @NotNull String bookmarkName) { + super("", true); + myProject = project; + myBookmarkName = bookmarkName; + mySelectedRepository = selectedRepository; + getTemplatePresentation().setText(myBookmarkName, false); // no mnemonics } - private static class UpdateToAction extends DumbAwareAction { + @NotNull + @Override + public AnAction[] getChildren(@Nullable AnActionEvent e) { + return new AnAction[]{ + new UpdateToAction(myProject, mySelectedRepository, myBookmarkName), + new MergeAction(myProject, mySelectedRepository, myBookmarkName), + new DeleteBookmarkAction(myProject, mySelectedRepository, myBookmarkName) + }; + } + private static class DeleteBookmarkAction extends DumbAwareAction { @NotNull private final Project myProject; @NotNull private final HgRepository mySelectedRepository; - @NotNull private final String myBranch; + @NotNull private final String myBookmarkName; - public UpdateToAction(@NotNull Project project, - @NotNull HgRepository selectedRepository, - @NotNull String branch) { - super("Update To"); + DeleteBookmarkAction(@NotNull Project project, @NotNull HgRepository selectedRepository, @NotNull String bookmarkName) { + super("Delete"); myProject = project; mySelectedRepository = selectedRepository; - myBranch = branch; + myBookmarkName = bookmarkName; } @Override public void actionPerformed(AnActionEvent e) { - final VirtualFile repository = mySelectedRepository.getRoot(); - final HgUpdateCommand hgUpdateCommand = new HgUpdateCommand(myProject, repository); - hgUpdateCommand.setBranch(myBranch); - new Task.Backgroundable(myProject, HgVcsMessages.message("action.hg4idea.updateTo.description", myBranch)) { - @Override - public void run(@NotNull ProgressIndicator indicator) { - HgCommandResult result = hgUpdateCommand.execute(); - assert myProject != null; // myProject couldn't be null, see annotation for updateTo action - if (HgErrorUtil.hasErrorsInCommandExecution(result)) { - new HgCommandResultNotifier(myProject).notifyError(result, "", "Update failed"); - new HgConflictResolver(myProject).resolve(repository); - } - myProject.getMessageBus().syncPublisher(HgVcs.BRANCH_TOPIC).update(myProject, null); - } - }.queue(); + try { + new HgBookmarkCommand(myProject, mySelectedRepository.getRoot(), myBookmarkName).deleteBookmark(); + } + catch (HgCommandException exception) { + HgAbstractGlobalAction.handleException(myProject, exception); + } } } } + + private static class MergeAction extends DumbAwareAction { + + @NotNull private final Project myProject; + @NotNull private final HgRepository mySelectedRepository; + @NotNull private final String myBranchName; + + public MergeAction(@NotNull Project project, + @NotNull HgRepository selectedRepository, + @NotNull String branchName) { + super("Merge"); + myProject = project; + mySelectedRepository = selectedRepository; + myBranchName = branchName; + } + + @Override + public void actionPerformed(AnActionEvent e) { + final UpdatedFiles updatedFiles = UpdatedFiles.create(); + final HgMergeCommand hgMergeCommand = new HgMergeCommand(myProject, mySelectedRepository.getRoot()); + hgMergeCommand.setRevision(myBranchName); + final HgCommandResultNotifier notifier = new HgCommandResultNotifier(myProject); + new Task.Backgroundable(myProject, "Merging changes...") { + @Override + public void run(@NotNull ProgressIndicator indicator) { + try { + new HgHeadMerger(myProject, hgMergeCommand) + .merge(mySelectedRepository.getRoot()); + new HgConflictResolver(myProject, updatedFiles).resolve(mySelectedRepository.getRoot()); + } + + catch (VcsException exception) { + if (exception.isWarning()) { + notifier.notifyWarning("Warning during merge", exception.getMessage()); + } + else { + notifier.notifyError(null, "Exception during merge", exception.getMessage()); + } + } + catch (Exception e1) { + HgAbstractGlobalAction.handleException(myProject, e1); + } + } + }.queue(); + } + } + + private static class UpdateToAction extends DumbAwareAction { + + @NotNull private final Project myProject; + @NotNull private final HgRepository mySelectedRepository; + @NotNull private final String myBranch; + + public UpdateToAction(@NotNull Project project, + @NotNull HgRepository selectedRepository, + @NotNull String branch) { + super("Update To"); + myProject = project; + mySelectedRepository = selectedRepository; + myBranch = branch; + } + + @Override + public void actionPerformed(AnActionEvent e) { + final VirtualFile repository = mySelectedRepository.getRoot(); + final HgUpdateCommand hgUpdateCommand = new HgUpdateCommand(myProject, repository); + hgUpdateCommand.setBranch(myBranch); + new Task.Backgroundable(myProject, HgVcsMessages.message("action.hg4idea.updateTo.description", myBranch)) { + @Override + public void run(@NotNull ProgressIndicator indicator) { + HgCommandResult result = hgUpdateCommand.execute(); + assert myProject != null; // myProject couldn't be null, see annotation for updateTo action + if (HgErrorUtil.hasErrorsInCommandExecution(result)) { + new HgCommandResultNotifier(myProject).notifyError(result, "", "Update failed"); + new HgConflictResolver(myProject).resolve(repository); + } + myProject.getMessageBus().syncPublisher(HgVcs.BRANCH_TOPIC).update(myProject, null); + } + }.queue(); + } + } } diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/command/HgBookmarkCommand.java b/plugins/hg4idea/src/org/zmlx/hg4idea/command/HgBookmarkCommand.java new file mode 100644 index 000000000000..21b4edd2d7cb --- /dev/null +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/command/HgBookmarkCommand.java @@ -0,0 +1,65 @@ +package org.zmlx.hg4idea.command; + +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.text.StringUtil; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.util.containers.ContainerUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.zmlx.hg4idea.action.HgCommandResultNotifier; +import org.zmlx.hg4idea.execution.HgCommandException; +import org.zmlx.hg4idea.execution.HgCommandExecutor; +import org.zmlx.hg4idea.execution.HgCommandResult; +import org.zmlx.hg4idea.execution.HgCommandResultHandler; +import org.zmlx.hg4idea.util.HgErrorUtil; + +import java.util.List; + +import static org.zmlx.hg4idea.util.HgUtil.getRepositoryManager; + +public class HgBookmarkCommand { + @NotNull private final Project myProject; + @NotNull private final VirtualFile myRepo; + @Nullable private final String myBookmarkName; + @NotNull private final HgCommandResultHandler myBookmarkResultHandler; + + public HgBookmarkCommand(@NotNull Project project, + @NotNull VirtualFile repo, + @Nullable String bookmarkName) { + myProject = project; + myRepo = repo; + myBookmarkName = bookmarkName; + myBookmarkResultHandler = new HgCommandResultHandler() { + @Override + public void process(@Nullable HgCommandResult result) { + getRepositoryManager(myProject).updateRepository(myRepo); + if (HgErrorUtil.hasErrorsInCommandExecution(result)) { + new HgCommandResultNotifier(myProject) + .notifyError(result, "Hg Error", "Hg bookmark command failed for " + myBookmarkName); + } + } + }; + } + + public void createBookmark(boolean isActive) throws HgCommandException { + if (isActive) { + executeBookmarkCommand(); + } + else { + executeBookmarkCommand("--inactive"); + } + } + + public void deleteBookmark() throws HgCommandException { + executeBookmarkCommand("-d"); //delete + } + + private void executeBookmarkCommand(@NotNull String... args) throws HgCommandException { + if (StringUtil.isEmptyOrSpaces(myBookmarkName)) { + throw new HgCommandException("bookmark name is empty"); + } + List arguments = ContainerUtil.newArrayList(args); + arguments.add(myBookmarkName); + new HgCommandExecutor(myProject).execute(myRepo, "bookmark", arguments, myBookmarkResultHandler); + } +} diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/command/HgBookmarkCreateCommand.java b/plugins/hg4idea/src/org/zmlx/hg4idea/command/HgBookmarkCreateCommand.java deleted file mode 100644 index 89442efbc35e..000000000000 --- a/plugins/hg4idea/src/org/zmlx/hg4idea/command/HgBookmarkCreateCommand.java +++ /dev/null @@ -1,45 +0,0 @@ -package org.zmlx.hg4idea.command; - -import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.text.StringUtil; -import com.intellij.openapi.vfs.VirtualFile; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.zmlx.hg4idea.execution.HgCommandException; -import org.zmlx.hg4idea.execution.HgCommandExecutor; -import org.zmlx.hg4idea.execution.HgCommandResultHandler; - -import java.util.ArrayList; -import java.util.List; - -/** - * @author Nadya Zabrodina - */ -public class HgBookmarkCreateCommand { - @NotNull private final Project myProject; - @NotNull private final VirtualFile myRepo; - @Nullable private final String myBookmarkName; - private final boolean isActive; - - public HgBookmarkCreateCommand(@NotNull Project project, - @NotNull VirtualFile repo, - @Nullable String bookmarkName, - boolean active) { - myProject = project; - myRepo = repo; - myBookmarkName = bookmarkName; - isActive = active; - } - - public void execute(@Nullable HgCommandResultHandler resultHandler) throws HgCommandException { - if (StringUtil.isEmptyOrSpaces(myBookmarkName)) { - throw new HgCommandException("bookmark name is empty"); - } - List arguments = new ArrayList(); - arguments.add(myBookmarkName); - if (!isActive) { - arguments.add("--inactive"); - } - new HgCommandExecutor(myProject).execute(myRepo, "bookmark", arguments, resultHandler); - } -}