From 6821976fb8066e1964d01807e7d0f3dfd155f55c Mon Sep 17 00:00:00 2001 From: Olivier Notteghem Date: Wed, 8 Apr 2020 21:42:18 -0700 Subject: [PATCH] - Disable search menu entry when no text is selected. - Fix handling of local branch - Move menu entries into sub-menu - Implement copy link functionality - Use Project storage API to load config from --- README.md | 8 ++++ resources/META-INF/plugin.xml | 17 +++++--- resources/icons/icon.png | Bin 0 -> 369 bytes resources/icons/icon@2x.png | Bin 0 -> 880 bytes sourcegraph.jar | Bin 8461 -> 13330 bytes src/Config.java | 34 +++++++++++++++ src/Copy.java | 20 +++++++++ src/FileAction.java | 80 ++++++++++++++++++++++++++++++++++ src/Open.java | 72 +++--------------------------- src/Search.java | 32 +++++++++++++- src/Util.java | 32 +++++++++----- 11 files changed, 212 insertions(+), 83 deletions(-) create mode 100644 resources/icons/icon.png create mode 100644 resources/icons/icon@2x.png create mode 100644 src/Config.java create mode 100644 src/Copy.java create mode 100644 src/FileAction.java diff --git a/README.md b/README.md index 84a3af2..709a2c9 100644 --- a/README.md +++ b/README.md @@ -74,6 +74,14 @@ Please file an issue: https://github.com/sourcegraph/sourcegraph-jetbrains/issue ## Version History +#### v1.2 + +- Disable search menu entry when no text is selected. +- Fix handling of local branch +- Move menu entries into sub-menu +- Implement copy link functionality +- Use Project storage API to load config from + #### v1.1.2 - Fixed an error that occurred when trying to search with no selection. diff --git a/resources/META-INF/plugin.xml b/resources/META-INF/plugin.xml index 85b8128..32524e4 100644 --- a/resources/META-INF/plugin.xml +++ b/resources/META-INF/plugin.xml @@ -45,18 +45,25 @@ com.intellij.modules.lang - + - - + - - + + + + + + + + + + diff --git a/resources/icons/icon.png b/resources/icons/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..7248dc42a04e6f0fd898b212b84f641759270460 GIT binary patch literal 369 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 { + + String url; + + public String getUrl() { + return url; + } + + @Nullable + @Override + public Config getState() { + return this; + } + + @Override + public void loadState(@NotNull Config config) { + this.url = config.url; + } + + @Nullable static Config getInstance(Project project) { + return ServiceManager.getService(project, Config.class); + } +} diff --git a/src/Copy.java b/src/Copy.java new file mode 100644 index 0000000..5882602 --- /dev/null +++ b/src/Copy.java @@ -0,0 +1,20 @@ +import com.intellij.notification.Notification; +import com.intellij.notification.NotificationType; +import com.intellij.notification.Notifications; +import com.intellij.openapi.ide.CopyPasteManager; + +import java.awt.datatransfer.StringSelection; + +public class Copy extends FileAction { + + @Override + void handleFileUri(String uri) { + // Copy file uri to clipboard + CopyPasteManager.getInstance().setContents(new StringSelection(uri)); + + // Display bubble + Notification notification = new Notification("SourceGraph", "SourceGraph", + "File url has been copied to clipboard.", NotificationType.INFORMATION); + Notifications.Bus.notify(notification); + } +} \ No newline at end of file diff --git a/src/FileAction.java b/src/FileAction.java new file mode 100644 index 0000000..4ad8d88 --- /dev/null +++ b/src/FileAction.java @@ -0,0 +1,80 @@ +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.application.ApplicationInfo; +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.editor.Document; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.editor.LogicalPosition; +import com.intellij.openapi.editor.SelectionModel; +import com.intellij.openapi.fileEditor.FileDocumentManager; +import com.intellij.openapi.fileEditor.FileEditorManager; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.vfs.VirtualFile; + +import java.awt.*; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URI; +import java.net.URLEncoder; + +public abstract class FileAction extends AnAction { + + abstract void handleFileUri(String uri); + + @Override + public void actionPerformed(AnActionEvent e) { + Logger logger = Logger.getInstance(this.getClass()); + + // Get project, editor, document, file, and position information. + final Project project = e.getProject(); + if (project == null) { + return; + } + Editor editor = FileEditorManager.getInstance(project).getSelectedTextEditor(); + if (editor == null) { + return; + } + Document currentDoc = editor.getDocument(); + if (currentDoc == null) { + return; + } + VirtualFile currentFile = FileDocumentManager.getInstance().getFile(currentDoc); + if (currentFile == null) { + return; + } + SelectionModel sel = editor.getSelectionModel(); + + // Get repo information. + RepoInfo repoInfo = Util.repoInfo(currentFile.getPath()); + if (repoInfo.remoteURL == "") { + return; + } + + // Build the URL that we will open. + String productName = ApplicationInfo.getInstance().getVersionName(); + String productVersion = ApplicationInfo.getInstance().getFullVersion(); + String uri; + try { + LogicalPosition start = editor.visualToLogicalPosition(sel.getSelectionStartPosition()); + LogicalPosition end = editor.visualToLogicalPosition(sel.getSelectionEndPosition()); + uri = Util.sourcegraphURL(project)+"-/editor" + + "?remote_url=" + URLEncoder.encode(repoInfo.remoteURL, "UTF-8") + + "&branch=" + URLEncoder.encode(repoInfo.branch, "UTF-8") + + "&file=" + URLEncoder.encode(repoInfo.fileRel, "UTF-8") + + "&editor=" + URLEncoder.encode("JetBrains", "UTF-8") + + "&version=" + URLEncoder.encode(Util.VERSION, "UTF-8") + + "&utm_product_name=" + URLEncoder.encode(productName, "UTF-8") + + "&utm_product_version=" + URLEncoder.encode(productVersion, "UTF-8") + + "&start_row=" + URLEncoder.encode(Integer.toString(start.line), "UTF-8") + + "&start_col=" + URLEncoder.encode(Integer.toString(start.column), "UTF-8") + + "&end_row=" + URLEncoder.encode(Integer.toString(end.line), "UTF-8") + + "&end_col=" + URLEncoder.encode(Integer.toString(end.column), "UTF-8"); + } catch (UnsupportedEncodingException err) { + logger.debug("failed to build URL"); + err.printStackTrace(); + return; + } + + handleFileUri(uri); + } +} \ No newline at end of file diff --git a/src/Open.java b/src/Open.java index 4842c73..2c22aac 100644 --- a/src/Open.java +++ b/src/Open.java @@ -1,76 +1,14 @@ -import com.intellij.openapi.actionSystem.AnAction; -import com.intellij.openapi.actionSystem.AnActionEvent; -import com.intellij.openapi.editor.Document; -import com.intellij.openapi.editor.Editor; -import com.intellij.openapi.editor.SelectionModel; -import com.intellij.openapi.fileEditor.FileDocumentManager; -import com.intellij.openapi.fileEditor.FileEditorManager; -import com.intellij.openapi.editor.LogicalPosition; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.application.ApplicationInfo; -import java.io.*; -import java.awt.Desktop; +import java.awt.*; +import java.io.IOException; import java.net.URI; -import java.net.URLEncoder; -public class Open extends AnAction { +public class Open extends FileAction { + @Override - public void actionPerformed(AnActionEvent e) { + void handleFileUri(String uri) { Logger logger = Logger.getInstance(this.getClass()); - - // Get project, editor, document, file, and position information. - final Project project = e.getProject(); - if (project == null) { - return; - } - Editor editor = FileEditorManager.getInstance(project).getSelectedTextEditor(); - if (editor == null) { - return; - } - Document currentDoc = editor.getDocument(); - if (currentDoc == null) { - return; - } - VirtualFile currentFile = FileDocumentManager.getInstance().getFile(currentDoc); - if (currentFile == null) { - return; - } - SelectionModel sel = editor.getSelectionModel(); - - // Get repo information. - RepoInfo repoInfo = Util.repoInfo(currentFile.getPath()); - if (repoInfo.remoteURL == "") { - return; - } - - // Build the URL that we will open. - String productName = ApplicationInfo.getInstance().getVersionName(); - String productVersion = ApplicationInfo.getInstance().getFullVersion(); - String uri; - try { - LogicalPosition start = editor.visualToLogicalPosition(sel.getSelectionStartPosition()); - LogicalPosition end = editor.visualToLogicalPosition(sel.getSelectionEndPosition()); - uri = Util.sourcegraphURL()+"-/editor" - + "?remote_url=" + URLEncoder.encode(repoInfo.remoteURL, "UTF-8") - + "&branch=" + URLEncoder.encode(repoInfo.branch, "UTF-8") - + "&file=" + URLEncoder.encode(repoInfo.fileRel, "UTF-8") - + "&editor=" + URLEncoder.encode("JetBrains", "UTF-8") - + "&version=" + URLEncoder.encode(Util.VERSION, "UTF-8") - + "&utm_product_name=" + URLEncoder.encode(productName, "UTF-8") - + "&utm_product_version=" + URLEncoder.encode(productVersion, "UTF-8") - + "&start_row=" + URLEncoder.encode(Integer.toString(start.line), "UTF-8") - + "&start_col=" + URLEncoder.encode(Integer.toString(start.column), "UTF-8") - + "&end_row=" + URLEncoder.encode(Integer.toString(end.line), "UTF-8") - + "&end_col=" + URLEncoder.encode(Integer.toString(end.column), "UTF-8"); - } catch (UnsupportedEncodingException err) { - logger.debug("failed to build URL"); - err.printStackTrace(); - return; - } - // Open the URL in the browser. try { Desktop.getDesktop().browse(URI.create(uri)); diff --git a/src/Search.java b/src/Search.java index 1f69f51..f7251fe 100644 --- a/src/Search.java +++ b/src/Search.java @@ -10,6 +10,7 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.application.ApplicationInfo; +import javax.annotation.Nullable; import java.io.*; import java.awt.Desktop; import java.net.URI; @@ -52,7 +53,7 @@ public void actionPerformed(AnActionEvent e) { String productName = ApplicationInfo.getInstance().getVersionName(); String productVersion = ApplicationInfo.getInstance().getFullVersion(); try { - uri = Util.sourcegraphURL()+"-/editor" + uri = Util.sourcegraphURL(project)+"-/editor" + "?remote_url=" + URLEncoder.encode(repoInfo.remoteURL, "UTF-8") + "&branch=" + URLEncoder.encode(repoInfo.branch, "UTF-8") + "&file=" + URLEncoder.encode(repoInfo.fileRel, "UTF-8") @@ -76,4 +77,33 @@ public void actionPerformed(AnActionEvent e) { } return; } + + @Override + public void update(AnActionEvent e) { + final Project project = e.getProject(); + if (project == null) { + return; + } + String selectedText = getSelectedText(project); + e.getPresentation().setEnabled(selectedText != null && selectedText.length() > 0); + } + + @Nullable + private String getSelectedText(Project project) { + Editor editor = FileEditorManager.getInstance(project).getSelectedTextEditor(); + if (editor == null) { + return null; + } + Document currentDoc = editor.getDocument(); + if (currentDoc == null) { + return null; + } + VirtualFile currentFile = FileDocumentManager.getInstance().getFile(currentDoc); + if (currentFile == null) { + return null; + } + SelectionModel sel = editor.getSelectionModel(); + + return sel.getSelectedText(); + } } \ No newline at end of file diff --git a/src/Util.java b/src/Util.java index 802ea58..1a93db2 100644 --- a/src/Util.java +++ b/src/Util.java @@ -1,10 +1,11 @@ import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.project.Project; import java.io.*; import java.util.Properties; public class Util { - public static String VERSION = "v1.1.2"; + public static String VERSION = "v1.2"; // gitRemoteURL returns the remote URL for the given remote name. // e.g. "origin" -> "git@github.com:foo/bar" @@ -43,7 +44,22 @@ public static String gitBranch(String repoDir) throws IOException { return exec("git rev-parse --abbrev-ref HEAD", repoDir).trim(); } + // verify that provided branch exists on remote + public static boolean isRemoteBranch(String branch, String repoDir) throws IOException { + return exec("git show-branch remotes/origin/" + branch, repoDir).length() > 0; + } + + public static String sourcegraphURL(Project project) { + String url = Config.getInstance(project).getUrl(); + if (url == null || url.length() == 0) { + Properties props = readProps(); + url = props.getProperty("url", "https://sourcegraph.com/"); + } + return url.endsWith("/") ? url : url + "/"; + } + // readProps tries to read the $HOME/sourcegraph-jetbrains.properties file. + @Deprecated private static Properties readProps() { Properties props = new Properties(); InputStream input = null; @@ -66,15 +82,6 @@ private static Properties readProps() { return props; } - public static String sourcegraphURL() { - Properties props = readProps(); - String url = props.getProperty("url", "https://sourcegraph.com"); - if (!url.endsWith("/")) { - return url + "/"; - } - return url; - } - // repoInfo returns the Sourcegraph repository URI, and the file path // relative to the repository root. If the repository URI cannot be // determined, a RepoInfo with empty strings is returned. @@ -91,6 +98,11 @@ public static RepoInfo repoInfo(String fileName) { fileRel = fileName.substring(repoRoot.length()+1); remoteURL = configuredGitRemoteURL(repoRoot); branch = gitBranch(repoRoot); + + // If user is on a local, use "master" instead + if (!isRemoteBranch(branch, repoRoot)) { + branch = "master"; + } } catch (Exception err) { Logger.getInstance(Util.class).info(err); err.printStackTrace();