Skip to content

Commit

Permalink
Add basic copy Markdown link action (#271)
Browse files Browse the repository at this point in the history
  • Loading branch information
ben-gibson committed Dec 11, 2022
1 parent 7addcd5 commit d61872d
Show file tree
Hide file tree
Showing 23 changed files with 162 additions and 87 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ jobs:
uses: actions/setup-java@v2
with:
distribution: zulu
java-version: 11
java-version: 17
cache: gradle

# Set environment variables
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ jobs:
uses: actions/setup-java@v2
with:
distribution: zulu
java-version: 11
java-version: 17
cache: gradle

# Set environment variables
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/run-ui-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ jobs:
uses: actions/setup-java@v2
with:
distribution: zulu
java-version: 11
java-version: 17
cache: gradle

# Run IDEA prepared for UI testing
Expand Down
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
# GitLink Changelog

## [Unreleased]
- Add basic copy Markdown action
- Fix incorrect {remote:url:host} example

## [4.2.5]
- Fix exceptions when using unqualified host
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

<!-- Plugin description -->

A Jetbrains plugin providing shortcuts to open or copy a file, directory or commit in `GitHub`, `Bitbucket`,
A Jetbrains [plugin](https://plugins.jetbrains.com/plugin/8183-gitlink) providing shortcuts to open or copy a file, directory or commit in `GitHub`, `Bitbucket`,
`GitLab`, `Gitee` `Gitea`, `Gogs`, `Azure` or `Gerrit`. Custom hosts can also be configured using the URL template syntax.

<!-- Plugin description end -->
Expand Down
6 changes: 3 additions & 3 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,11 @@ plugins {
// Java support
id("java")
// Kotlin support
id("org.jetbrains.kotlin.jvm") version "1.7.0"
id("org.jetbrains.kotlin.jvm") version "1.7.21"
// Gradle IntelliJ Plugin
id("org.jetbrains.intellij") version "1.9.0"
id("org.jetbrains.intellij") version "1.10.1"
// Gradle Changelog Plugin
id("org.jetbrains.changelog") version "1.3.1"
id("org.jetbrains.changelog") version "2.0.0"
// Gradle Qodana Plugin
id("org.jetbrains.qodana") version "0.1.13"
}
Expand Down
15 changes: 9 additions & 6 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -4,28 +4,31 @@
pluginGroup = uk.co.ben_gibson.git.link
pluginName = GitLink
# SemVer format -> https://semver.org
pluginVersion = 4.2.5
pluginVersion = 4.3.0

# See https://plugins.jetbrains.com/docs/intellij/build-number-ranges.html
# for insight into build numbers and IntelliJ Platform versions.
pluginSinceBuild = 213
pluginSinceBuild = 223
#pluginUntilBuild = 222.*

# IntelliJ Platform Properties -> https://github.com/JetBrains/gradle-intellij-plugin#intellij-platform-properties
platformType = IC
platformVersion = 2022.1.1
platformVersion = 2022.3

# Plugin Dependencies -> https://plugins.jetbrains.com/docs/intellij/plugin-dependencies.html
# Example: platformPlugins = com.intellij.java, com.jetbrains.php:203.4449.22
platformPlugins = git4idea
platformPlugins = Git4Idea

# Java language level used to compile sources and to generate the files for - Java 11 is required since 2020.3
javaVersion = 11
javaVersion = 17

# Gradle Releases -> https://github.com/gradle/gradle/releases
gradleVersion = 7.4

# Opt-out flag for bundling Kotlin standard library.
# See https://plugins.jetbrains.com/docs/intellij/kotlin.html#kotlin-standard-library for details.
# suppress inspection "UnusedProperty"
kotlin.stdlib.default.dependency = false
kotlin.stdlib.default.dependency = false

# Enable Gradle Configuration Cache -> https://docs.gradle.org/current/userguide/configuration_cache.html
org.gradle.unsafe.configuration-cache = true
17 changes: 15 additions & 2 deletions src/main/kotlin/uk/co/ben_gibson/git/link/GitLinkRunner.kt
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,25 @@ fun openInBrowser(project: Project, context: Context) {
processGitLink(project, context) { BrowserUtil.browse(it.toString()) }
}

fun copyToClipBoard(project: Project, context: Context) {
fun copyToClipBoard(project: Project, context: Context, asMarkdown: Boolean = false) {
processGitLink(project, context) {
val url = if (asMarkdown) {
val label = when(context) {
is ContextCommit -> context.commit.shortHash
is ContextCurrentFile -> context.file.name
is ContextFileAtCommit -> context.file.name
}

"[${label}](${it})"
} else {
it.toString()
}

Toolkit.getDefaultToolkit().systemClipboard.setContents(
StringSelection(it.toString()),
StringSelection(url),
null
)

sendNotification(Notification.linkCopied(it), project)
}
}
Expand Down
14 changes: 12 additions & 2 deletions src/main/kotlin/uk/co/ben_gibson/git/link/ui/actions/Action.kt
Original file line number Diff line number Diff line change
@@ -1,17 +1,22 @@
package uk.co.ben_gibson.git.link.ui.actions

import com.intellij.openapi.actionSystem.ActionUpdateThread
import com.intellij.openapi.actionSystem.AnActionEvent
import com.intellij.openapi.components.service
import com.intellij.openapi.project.DumbAwareAction
import com.intellij.openapi.project.Project
import uk.co.ben_gibson.git.link.*
import uk.co.ben_gibson.git.link.Context
import uk.co.ben_gibson.git.link.GitLinkBundle
import uk.co.ben_gibson.git.link.copyToClipBoard
import uk.co.ben_gibson.git.link.openInBrowser
import uk.co.ben_gibson.git.link.platform.PlatformLocator

abstract class Action(private val type: Type): DumbAwareAction() {

enum class Type(val key: String) {
BROWSER("browser"),
COPY("copy")
COPY("copy"),
COPY_MARKDOWN("copy-markdown")
}

abstract fun buildContext(project: Project, event: AnActionEvent) : Context?
Expand All @@ -24,6 +29,7 @@ abstract class Action(private val type: Type): DumbAwareAction() {
when(type) {
Type.BROWSER -> openInBrowser(project, context)
Type.COPY -> copyToClipBoard(project, context)
Type.COPY_MARKDOWN -> copyToClipBoard(project, context, true)
}
}

Expand All @@ -45,4 +51,8 @@ abstract class Action(private val type: Type): DumbAwareAction() {
event.presentation.text = GitLinkBundle.message("actions.${type.key}.title", it.name)
}
}

override fun getActionUpdateThread(): ActionUpdateThread {
return ActionUpdateThread.BGT
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,26 +2,20 @@ package uk.co.ben_gibson.git.link.ui.actions.annotation

import com.intellij.openapi.actionSystem.AnActionEvent
import com.intellij.openapi.project.Project
import com.intellij.openapi.vcs.actions.ShowAnnotateOperationsPopup
import git4idea.annotate.GitFileAnnotation
import uk.co.ben_gibson.git.link.ui.actions.Action
import com.intellij.openapi.vcs.annotate.UpToDateLineNumberListener;
import uk.co.ben_gibson.git.link.Context
import uk.co.ben_gibson.git.link.ContextCommit
import uk.co.ben_gibson.git.link.git.Commit

class CommitBrowserAction(private val annotation: GitFileAnnotation):
Action(Type.BROWSER),
UpToDateLineNumberListener
{
private var lineNumber = -1
class CommitBrowserAction(private val annotation: GitFileAnnotation): Action(Type.BROWSER) {

override fun buildContext(project: Project, event: AnActionEvent): Context? {
val lineNumber = ShowAnnotateOperationsPopup.getAnnotationLineNumber(event.dataContext)

val revision = annotation.getLineRevisionNumber(lineNumber) ?: return null

return ContextCommit(annotation.file, Commit(revision.toString()))
}

override fun consume(number: Int) {
lineNumber = number
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,26 +2,20 @@ package uk.co.ben_gibson.git.link.ui.actions.annotation

import com.intellij.openapi.actionSystem.AnActionEvent
import com.intellij.openapi.project.Project
import com.intellij.openapi.vcs.annotate.UpToDateLineNumberListener
import com.intellij.openapi.vcs.actions.ShowAnnotateOperationsPopup
import git4idea.annotate.GitFileAnnotation
import uk.co.ben_gibson.git.link.Context
import uk.co.ben_gibson.git.link.ContextCommit
import uk.co.ben_gibson.git.link.git.Commit
import uk.co.ben_gibson.git.link.ui.actions.Action

class CommitCopyAction(private val annotation: GitFileAnnotation):
Action(Type.COPY),
UpToDateLineNumberListener
{
private var lineNumber = -1
class CommitCopyAction(private val annotation: GitFileAnnotation): Action(Type.COPY) {

override fun buildContext(project: Project, event: AnActionEvent): Context? {
val lineNumber = ShowAnnotateOperationsPopup.getAnnotationLineNumber(event.dataContext)

val revision = annotation.getLineRevisionNumber(lineNumber) ?: return null

return ContextCommit(annotation.file, Commit(revision.toString()))
}

override fun consume(number: Int) {
lineNumber = number
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package uk.co.ben_gibson.git.link.ui.actions.annotation

import com.intellij.openapi.actionSystem.AnActionEvent
import com.intellij.openapi.project.Project
import com.intellij.openapi.vcs.actions.ShowAnnotateOperationsPopup
import git4idea.annotate.GitFileAnnotation
import uk.co.ben_gibson.git.link.Context
import uk.co.ben_gibson.git.link.ContextCommit
import uk.co.ben_gibson.git.link.git.Commit
import uk.co.ben_gibson.git.link.ui.actions.Action

class CommitMarkdownAction(private val annotation: GitFileAnnotation): Action(Type.COPY_MARKDOWN) {
override fun buildContext(project: Project, event: AnActionEvent): Context? {
val lineNumber = ShowAnnotateOperationsPopup.getAnnotationLineNumber(event.dataContext)

val revision = annotation.getLineRevisionNumber(lineNumber) ?: return null

return ContextCommit(annotation.file, Commit(revision.toString()))
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,26 +2,20 @@ package uk.co.ben_gibson.git.link.ui.actions.annotation

import com.intellij.openapi.actionSystem.AnActionEvent
import com.intellij.openapi.project.Project
import com.intellij.openapi.vcs.annotate.UpToDateLineNumberListener
import com.intellij.openapi.vcs.actions.ShowAnnotateOperationsPopup
import git4idea.annotate.GitFileAnnotation
import uk.co.ben_gibson.git.link.Context
import uk.co.ben_gibson.git.link.ContextFileAtCommit
import uk.co.ben_gibson.git.link.git.Commit
import uk.co.ben_gibson.git.link.ui.actions.Action

class FileBrowserAction(private val annotation: GitFileAnnotation):
Action(Type.BROWSER),
UpToDateLineNumberListener
{
private var lineNumber = -1
class FileBrowserAction(private val annotation: GitFileAnnotation): Action(Type.BROWSER) {

override fun buildContext(project: Project, event: AnActionEvent): Context? {
val lineNumber = ShowAnnotateOperationsPopup.getAnnotationLineNumber(event.dataContext)

val revision = annotation.getLineRevisionNumber(lineNumber) ?: return null

return ContextFileAtCommit(annotation.file, Commit(revision.toString()))
}

override fun consume(integer: Int) {
lineNumber = integer
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,26 +2,20 @@ package uk.co.ben_gibson.git.link.ui.actions.annotation

import com.intellij.openapi.actionSystem.AnActionEvent
import com.intellij.openapi.project.Project
import com.intellij.openapi.vcs.annotate.UpToDateLineNumberListener
import com.intellij.openapi.vcs.actions.ShowAnnotateOperationsPopup
import git4idea.annotate.GitFileAnnotation
import uk.co.ben_gibson.git.link.Context
import uk.co.ben_gibson.git.link.ContextFileAtCommit
import uk.co.ben_gibson.git.link.git.Commit
import uk.co.ben_gibson.git.link.ui.actions.Action

class FileCopyAction(private val annotation: GitFileAnnotation):
Action(Type.COPY),
UpToDateLineNumberListener
{
private var lineNumber = -1
class FileCopyAction(private val annotation: GitFileAnnotation): Action(Type.COPY) {

override fun buildContext(project: Project, event: AnActionEvent): Context? {
val lineNumber = ShowAnnotateOperationsPopup.getAnnotationLineNumber(event.dataContext)

val revision = annotation.getLineRevisionNumber(lineNumber) ?: return null

return ContextFileAtCommit(annotation.file, Commit(revision.toString()))
}

override fun consume(integer: Int) {
lineNumber = integer
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package uk.co.ben_gibson.git.link.ui.actions.annotation

import com.intellij.openapi.actionSystem.AnActionEvent
import com.intellij.openapi.project.Project
import com.intellij.openapi.vcs.actions.ShowAnnotateOperationsPopup
import git4idea.annotate.GitFileAnnotation
import uk.co.ben_gibson.git.link.Context
import uk.co.ben_gibson.git.link.ContextFileAtCommit
import uk.co.ben_gibson.git.link.git.Commit
import uk.co.ben_gibson.git.link.ui.actions.Action

class FileMarkdownAction(private val annotation: GitFileAnnotation): Action(Type.COPY_MARKDOWN) {

override fun buildContext(project: Project, event: AnActionEvent): Context? {
val lineNumber = ShowAnnotateOperationsPopup.getAnnotationLineNumber(event.dataContext)

val revision = annotation.getLineRevisionNumber(lineNumber) ?: return null

return ContextFileAtCommit(annotation.file, Commit(revision.toString()))
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package uk.co.ben_gibson.git.link.ui.actions.gutter

class MarkdownAction : GutterAction(Type.COPY_MARKDOWN)
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package uk.co.ben_gibson.git.link.ui.actions.menu

class MarkdownAction : MenuAction(Type.COPY_MARKDOWN)
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package uk.co.ben_gibson.git.link.ui.actions.vcslog

import com.intellij.openapi.actionSystem.AnActionEvent
import com.intellij.openapi.project.Project
import com.intellij.vcs.log.VcsLogDataKeys
import uk.co.ben_gibson.git.link.Context
import uk.co.ben_gibson.git.link.ContextCommit
import uk.co.ben_gibson.git.link.git.Commit
import uk.co.ben_gibson.git.link.ui.actions.Action

class MarkdownAction: Action(Type.COPY_MARKDOWN) {
override fun buildContext(project: Project, event: AnActionEvent): Context? {
val vcsLog = event.getData(VcsLogDataKeys.VCS_LOG) ?: return null
val vcsCommit = vcsLog.selectedDetails[0]

return ContextCommit(vcsCommit.root, Commit(vcsCommit.id.toShortString()))
}

override fun shouldBeEnabled(event: AnActionEvent): Boolean {
val log = event.getData(VcsLogDataKeys.VCS_LOG) ?: return false

return log.selectedDetails.size == 1
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ private val references = listOf(
SubstitutionReference(
"{remote:url:host}",
"The remote url host.",
"https://example.com"
"example.com"
),
SubstitutionReference(
"{remote:url:path}",
Expand Down
Loading

0 comments on commit d61872d

Please sign in to comment.