From 5c5db8071593186ff51433b4cb7ff2b0d002ba9d Mon Sep 17 00:00:00 2001 From: Aleksey Pivovarov Date: Tue, 26 Jul 2016 18:23:36 +0300 Subject: [PATCH] IDEA-157902 github: merge actions into one --- plugins/github/src/META-INF/plugin.xml | 2 - ...penCommitInBrowserFromAnnotateAction.java} | 4 +- .../github/GithubOpenInBrowserAction.java | 234 ++++++++++++------ .../GithubShowCommitInBrowserAction.java | 132 ---------- .../GithubAnnotationGutterActionProvider.java | 4 +- 5 files changed, 164 insertions(+), 212 deletions(-) rename plugins/github/src/org/jetbrains/plugins/github/{GithubShowCommitInBrowserFromAnnotateAction.java => GithubOpenCommitInBrowserFromAnnotateAction.java} (92%) delete mode 100644 plugins/github/src/org/jetbrains/plugins/github/GithubShowCommitInBrowserAction.java diff --git a/plugins/github/src/META-INF/plugin.xml b/plugins/github/src/META-INF/plugin.xml index eee908182364..acafb311cc1a 100644 --- a/plugins/github/src/META-INF/plugin.xml +++ b/plugins/github/src/META-INF/plugin.xml @@ -46,8 +46,6 @@ - - diff --git a/plugins/github/src/org/jetbrains/plugins/github/GithubShowCommitInBrowserFromAnnotateAction.java b/plugins/github/src/org/jetbrains/plugins/github/GithubOpenCommitInBrowserFromAnnotateAction.java similarity index 92% rename from plugins/github/src/org/jetbrains/plugins/github/GithubShowCommitInBrowserFromAnnotateAction.java rename to plugins/github/src/org/jetbrains/plugins/github/GithubOpenCommitInBrowserFromAnnotateAction.java index a1219e362da7..a364b4adb7db 100644 --- a/plugins/github/src/org/jetbrains/plugins/github/GithubShowCommitInBrowserFromAnnotateAction.java +++ b/plugins/github/src/org/jetbrains/plugins/github/GithubOpenCommitInBrowserFromAnnotateAction.java @@ -29,11 +29,11 @@ import git4idea.repo.GitRepository; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.github.util.GithubUtil; -public class GithubShowCommitInBrowserFromAnnotateAction extends GithubShowCommitInBrowserAction implements UpToDateLineNumberListener { +public class GithubOpenCommitInBrowserFromAnnotateAction extends GithubOpenInBrowserAction implements UpToDateLineNumberListener { private final FileAnnotation myAnnotation; private int myLineNumber = -1; - public GithubShowCommitInBrowserFromAnnotateAction(FileAnnotation annotation) { + public GithubOpenCommitInBrowserFromAnnotateAction(FileAnnotation annotation) { myAnnotation = annotation; } diff --git a/plugins/github/src/org/jetbrains/plugins/github/GithubOpenInBrowserAction.java b/plugins/github/src/org/jetbrains/plugins/github/GithubOpenInBrowserAction.java index 15250412e308..49dc9d8cbd31 100644 --- a/plugins/github/src/org/jetbrains/plugins/github/GithubOpenInBrowserAction.java +++ b/plugins/github/src/org/jetbrains/plugins/github/GithubOpenInBrowserAction.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2010 JetBrains s.r.o. + * Copyright 2000-2012 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,12 +28,20 @@ import com.intellij.openapi.project.DumbAwareAction; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.openapi.vcs.FilePath; +import com.intellij.openapi.vcs.VcsDataKeys; import com.intellij.openapi.vcs.VcsException; import com.intellij.openapi.vcs.changes.Change; import com.intellij.openapi.vcs.changes.ChangeListManager; +import com.intellij.openapi.vcs.history.VcsFileRevision; import com.intellij.openapi.vfs.VfsUtilCore; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.util.containers.ContainerUtil; +import com.intellij.vcs.log.CommitId; +import com.intellij.vcs.log.VcsLog; +import com.intellij.vcs.log.VcsLogDataKeys; import com.intellij.vcsUtil.VcsUtil; +import git4idea.GitFileRevision; import git4idea.GitRevisionNumber; import git4idea.GitUtil; import git4idea.history.GitHistoryUtils; @@ -41,77 +49,77 @@ import git4idea.repo.GitRepository; import icons.GithubIcons; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.plugins.github.api.GithubFullPath; import org.jetbrains.plugins.github.util.GithubNotifications; import org.jetbrains.plugins.github.util.GithubUrlUtil; import org.jetbrains.plugins.github.util.GithubUtil; +import java.util.List; + import static org.jetbrains.plugins.github.util.GithubUtil.LOG; -/** - * Created by IntelliJ IDEA. - * - * @author oleg - * @date 12/10/10 - */ public class GithubOpenInBrowserAction extends DumbAwareAction { public static final String CANNOT_OPEN_IN_BROWSER = "Can't open in browser"; - protected GithubOpenInBrowserAction() { - super("Open on GitHub", "Open selected file in browser", GithubIcons.Github_icon); + public GithubOpenInBrowserAction() { + super("Open on GitHub", "Open corresponding link in browser", GithubIcons.Github_icon); } @Override public void update(AnActionEvent e) { - Project project = e.getData(CommonDataKeys.PROJECT); - VirtualFile virtualFile = e.getData(CommonDataKeys.VIRTUAL_FILE); - if (project == null || project.isDefault() || virtualFile == null) { - e.getPresentation().setEnabledAndVisible(false); - return; - } - - GitRepository gitRepository = GitUtil.getRepositoryManager(project).getRepositoryForFile(virtualFile); - if (gitRepository == null) { - e.getPresentation().setEnabledAndVisible(false); - return; - } - - if (!GithubUtil.isRepositoryOnGitHub(gitRepository)) { - e.getPresentation().setEnabledAndVisible(false); - return; - } - - ChangeListManager changeListManager = ChangeListManager.getInstance(project); - if (changeListManager.isUnversioned(virtualFile)) { - e.getPresentation().setVisible(true); - e.getPresentation().setEnabled(false); - return; - } - - Change change = changeListManager.getChange(virtualFile); - if (change != null && change.getType() == Change.Type.NEW) { - e.getPresentation().setVisible(true); - e.getPresentation().setEnabled(false); - return; - } - - e.getPresentation().setEnabledAndVisible(true); + CommitData data = getData(e); + e.getPresentation().setEnabled(data != null && + (data.revisionHash != null || data.virtualFile != null)); + e.getPresentation().setVisible(data != null); } @Override public void actionPerformed(AnActionEvent e) { - Project project = e.getData(CommonDataKeys.PROJECT); - VirtualFile virtualFile = e.getData(CommonDataKeys.VIRTUAL_FILE); - Editor editor = e.getData(CommonDataKeys.EDITOR); - if (virtualFile == null || project == null || project.isDisposed()) { + CommitData data = getData(e); + assert data != null; + assert data.revisionHash != null || data.virtualFile != null; + + if (data.revisionHash != null) { + openCommitInBrowser(data.project, data.repository, data.revisionHash); + } + else { + Editor editor = e.getData(CommonDataKeys.EDITOR); + openFileInBrowser(data.project, data.repository, data.virtualFile, editor); + } + } + + @Nullable + protected CommitData getData(AnActionEvent e) { + CommitData data = getDataFromHistory(e); + if (data == null) data = getDataFromLog(e); + if (data == null) data = getDataFromVirtualFile(e); + return data; + } + + protected static void openCommitInBrowser(@NotNull Project project, @NotNull GitRepository repository, @NotNull String revisionHash) { + String url = GithubUtil.findGithubRemoteUrl(repository); + if (url == null) { + LOG.info(String.format("Repository is not under GitHub. Root: %s, Remotes: %s", repository.getRoot(), + GitUtil.getPrintableRemotes(repository.getRemotes()))); + return; + } + GithubFullPath userAndRepository = GithubUrlUtil.getUserAndRepositoryFromRemoteUrl(url); + if (userAndRepository == null) { + GithubNotifications.showError(project, CANNOT_OPEN_IN_BROWSER, "Can't extract info about repository: " + url); return; } - GitRepository repository = GitUtil.getRepositoryManager(project).getRepositoryForFile(virtualFile); - assert repository != null; + String githubUrl = GithubUrlUtil.getGithubHost() + '/' + userAndRepository.getUser() + '/' + + userAndRepository.getRepository() + "/commit/" + revisionHash; + BrowserUtil.browse(githubUrl); + } + private static void openFileInBrowser(@NotNull Project project, @NotNull GitRepository repository, @NotNull VirtualFile virtualFile, + @Nullable Editor editor) { String githubRemoteUrl = GithubUtil.findGithubRemoteUrl(repository); if (githubRemoteUrl == null) { - GithubNotifications.showError(project, CANNOT_OPEN_IN_BROWSER, "Can't find github remote"); + LOG.info(String.format("Repository is not under GitHub. Root: %s, Remotes: %s", repository.getRoot(), + GitUtil.getPrintableRemotes(repository.getRemotes()))); return; } @@ -128,10 +136,82 @@ public class GithubOpenInBrowserAction extends DumbAwareAction { return; } - String url = makeUrlToOpen(editor, relativePath, hash, githubRemoteUrl); - if (url != null) { - BrowserUtil.browse(url); - } + String githubUrl = makeUrlToOpen(editor, relativePath, hash, githubRemoteUrl); + if (githubUrl != null) BrowserUtil.browse(githubUrl); + } + + @Nullable + private static CommitData getDataFromHistory(AnActionEvent e) { + Project project = e.getData(CommonDataKeys.PROJECT); + FilePath filePath = e.getData(VcsDataKeys.FILE_PATH); + VcsFileRevision fileRevision = e.getData(VcsDataKeys.VCS_FILE_REVISION); + if (project == null || filePath == null || fileRevision == null) return null; + + if (!(fileRevision instanceof GitFileRevision)) return null; + + GitRepository repository = GitUtil.getRepositoryManager(project).getRepositoryForFile(filePath); + if (repository == null || !GithubUtil.isRepositoryOnGitHub(repository)) return null; + + return new CommitData(project, repository, fileRevision.getRevisionNumber().asString()); + } + + @Nullable + private static CommitData getDataFromLog(AnActionEvent e) { + Project project = e.getData(CommonDataKeys.PROJECT); + VcsLog log = e.getData(VcsLogDataKeys.VCS_LOG); + if (project == null || log == null) return null; + + List selectedCommits = log.getSelectedCommits(); + if (selectedCommits.size() != 1) return null; + + CommitId commit = ContainerUtil.getFirstItem(selectedCommits); + if (commit == null) return null; + + GitRepository repository = GitUtil.getRepositoryManager(project).getRepositoryForRoot(commit.getRoot()); + if (repository == null || !GithubUtil.isRepositoryOnGitHub(repository)) return null; + + return new CommitData(project, repository, commit.getHash().asString()); + } + + @Nullable + private static CommitData getDataFromVirtualFile(AnActionEvent e) { + Project project = e.getData(CommonDataKeys.PROJECT); + VirtualFile virtualFile = e.getData(CommonDataKeys.VIRTUAL_FILE); + if (project == null || virtualFile == null) return null; + + GitRepository gitRepository = GitUtil.getRepositoryManager(project).getRepositoryForFile(virtualFile); + if (gitRepository == null || !GithubUtil.isRepositoryOnGitHub(gitRepository)) return null; + + ChangeListManager changeListManager = ChangeListManager.getInstance(project); + if (changeListManager.isUnversioned(virtualFile)) return new CommitData(project, gitRepository); + + Change change = changeListManager.getChange(virtualFile); + if (change != null && change.getType() == Change.Type.NEW) return new CommitData(project, gitRepository); + + return new CommitData(project, gitRepository, virtualFile); + } + + @Nullable + private static String getCurrentFileRevisionHash(@NotNull final Project project, @NotNull final VirtualFile file) { + final Ref ref = new Ref<>(); + ProgressManager.getInstance().run(new Task.Modal(project, "Getting Last Revision", true) { + @Override + public void run(@NotNull ProgressIndicator indicator) { + try { + ref.set((GitRevisionNumber)GitHistoryUtils.getCurrentRevision(project, VcsUtil.getFilePath(file), "HEAD")); + } + catch (VcsException e) { + LOG.warn(e); + } + } + + @Override + public void onCancel() { + throw new ProcessCanceledException(); + } + }); + if (ref.isNull()) return null; + return ref.get().getRev(); } @Nullable @@ -165,26 +245,32 @@ public class GithubOpenInBrowserAction extends DumbAwareAction { return builder.toString(); } - @Nullable - private static String getCurrentFileRevisionHash(@NotNull final Project project, @NotNull final VirtualFile file) { - final Ref ref = new Ref<>(); - ProgressManager.getInstance().run(new Task.Modal(project, "Getting Last Revision", true) { - @Override - public void run(@NotNull ProgressIndicator indicator) { - try { - ref.set((GitRevisionNumber)GitHistoryUtils.getCurrentRevision(project, VcsUtil.getFilePath(file), "HEAD")); - } - catch (VcsException e) { - LOG.warn(e); - } - } + protected static class CommitData { + @NotNull private final Project project; + @NotNull private final GitRepository repository; + @Nullable private final String revisionHash; + @Nullable private final VirtualFile virtualFile; - @Override - public void onCancel() { - throw new ProcessCanceledException(); - } - }); - if (ref.isNull()) return null; - return ref.get().getRev(); + public CommitData(@NotNull Project project, @NotNull GitRepository repository) { + this.project = project; + this.repository = repository; + this.revisionHash = null; + this.virtualFile = null; + } + + + public CommitData(@NotNull Project project, @NotNull GitRepository repository, @Nullable String revisionHash) { + this.project = project; + this.repository = repository; + this.revisionHash = revisionHash; + this.virtualFile = null; + } + + public CommitData(@NotNull Project project, @NotNull GitRepository repository, @Nullable VirtualFile virtualFile) { + this.project = project; + this.repository = repository; + this.revisionHash = null; + this.virtualFile = virtualFile; + } } -} \ No newline at end of file +} diff --git a/plugins/github/src/org/jetbrains/plugins/github/GithubShowCommitInBrowserAction.java b/plugins/github/src/org/jetbrains/plugins/github/GithubShowCommitInBrowserAction.java deleted file mode 100644 index 117d53336832..000000000000 --- a/plugins/github/src/org/jetbrains/plugins/github/GithubShowCommitInBrowserAction.java +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright 2000-2012 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.jetbrains.plugins.github; - -import com.intellij.ide.BrowserUtil; -import com.intellij.openapi.actionSystem.AnActionEvent; -import com.intellij.openapi.actionSystem.CommonDataKeys; -import com.intellij.openapi.project.DumbAwareAction; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.vcs.FilePath; -import com.intellij.openapi.vcs.VcsDataKeys; -import com.intellij.openapi.vcs.history.VcsFileRevision; -import com.intellij.util.containers.ContainerUtil; -import com.intellij.vcs.log.CommitId; -import com.intellij.vcs.log.VcsLog; -import com.intellij.vcs.log.VcsLogDataKeys; -import git4idea.GitFileRevision; -import git4idea.GitUtil; -import git4idea.repo.GitRepository; -import icons.GithubIcons; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.plugins.github.api.GithubFullPath; -import org.jetbrains.plugins.github.util.GithubNotifications; -import org.jetbrains.plugins.github.util.GithubUrlUtil; -import org.jetbrains.plugins.github.util.GithubUtil; - -import java.util.List; - -public class GithubShowCommitInBrowserAction extends DumbAwareAction { - public GithubShowCommitInBrowserAction() { - super("Open on GitHub", "Open selected commit in browser", GithubIcons.Github_icon); - } - - @Override - public void update(AnActionEvent e) { - CommitData data = getData(e); - e.getPresentation().setEnabled(data != null && data.revisionHash != null); - e.getPresentation().setVisible(data != null); - } - - @Override - public void actionPerformed(AnActionEvent e) { - CommitData data = getData(e); - assert data != null && data.revisionHash != null; - openInBrowser(data.project, data.repository, data.revisionHash); - } - - protected static void openInBrowser(@NotNull Project project, @NotNull GitRepository repository, @NotNull String revisionHash) { - String url = GithubUtil.findGithubRemoteUrl(repository); - if (url == null) { - GithubUtil.LOG.info(String.format("Repository is not under GitHub. Root: %s, Remotes: %s", repository.getRoot(), - GitUtil.getPrintableRemotes(repository.getRemotes()))); - return; - } - GithubFullPath userAndRepository = GithubUrlUtil.getUserAndRepositoryFromRemoteUrl(url); - if (userAndRepository == null) { - GithubNotifications - .showError(project, GithubOpenInBrowserAction.CANNOT_OPEN_IN_BROWSER, "Can't extract info about repository: " + url); - return; - } - - String githubUrl = GithubUrlUtil.getGithubHost() + '/' + userAndRepository.getUser() + '/' - + userAndRepository.getRepository() + "/commit/" + revisionHash; - BrowserUtil.browse(githubUrl); - } - - @Nullable - protected CommitData getData(AnActionEvent e) { - CommitData data = getDataFromHistory(e); - if (data == null) data = getDataFromLog(e); - return data; - } - - @Nullable - private static CommitData getDataFromHistory(AnActionEvent e) { - Project project = e.getData(CommonDataKeys.PROJECT); - FilePath filePath = e.getData(VcsDataKeys.FILE_PATH); - VcsFileRevision fileRevision = e.getData(VcsDataKeys.VCS_FILE_REVISION); - if (project == null || filePath == null || fileRevision == null) return null; - - if (!(fileRevision instanceof GitFileRevision)) return null; - - GitRepository repository = GitUtil.getRepositoryManager(project).getRepositoryForFile(filePath); - if (repository == null || !GithubUtil.isRepositoryOnGitHub(repository)) return null; - - return new CommitData(project, repository, fileRevision.getRevisionNumber().asString()); - } - - @Nullable - private static CommitData getDataFromLog(AnActionEvent e) { - Project project = e.getData(CommonDataKeys.PROJECT); - VcsLog log = e.getData(VcsLogDataKeys.VCS_LOG); - if (project == null || log == null) return null; - - List selectedCommits = log.getSelectedCommits(); - if (selectedCommits.size() != 1) return null; - - CommitId commit = ContainerUtil.getFirstItem(selectedCommits); - if (commit == null) return null; - - GitRepository repository = GitUtil.getRepositoryManager(project).getRepositoryForRoot(commit.getRoot()); - if (repository == null || !GithubUtil.isRepositoryOnGitHub(repository)) return null; - - return new CommitData(project, repository, commit.getHash().asString()); - } - - protected static class CommitData { - @NotNull private final Project project; - @NotNull private final GitRepository repository; - @Nullable private final String revisionHash; - - public CommitData(@NotNull Project project, @NotNull GitRepository repository, @Nullable String revisionHash) { - this.project = project; - this.repository = repository; - this.revisionHash = revisionHash; - } - } -} diff --git a/plugins/github/src/org/jetbrains/plugins/github/extensions/GithubAnnotationGutterActionProvider.java b/plugins/github/src/org/jetbrains/plugins/github/extensions/GithubAnnotationGutterActionProvider.java index 06a3e8bbf752..d43531846252 100644 --- a/plugins/github/src/org/jetbrains/plugins/github/extensions/GithubAnnotationGutterActionProvider.java +++ b/plugins/github/src/org/jetbrains/plugins/github/extensions/GithubAnnotationGutterActionProvider.java @@ -19,7 +19,7 @@ import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.vcs.annotate.AnnotationGutterActionProvider; import com.intellij.openapi.vcs.annotate.FileAnnotation; import org.jetbrains.annotations.NotNull; -import org.jetbrains.plugins.github.GithubShowCommitInBrowserFromAnnotateAction; +import org.jetbrains.plugins.github.GithubOpenCommitInBrowserFromAnnotateAction; /** * @author Kirill Likhodedov @@ -29,7 +29,7 @@ public class GithubAnnotationGutterActionProvider implements AnnotationGutterAct @NotNull @Override public AnAction createAction(@NotNull FileAnnotation annotation) { - return new GithubShowCommitInBrowserFromAnnotateAction(annotation); + return new GithubOpenCommitInBrowserFromAnnotateAction(annotation); } }