From 662578ad08bc0e9e1311da906ed8c9d11c961ff5 Mon Sep 17 00:00:00 2001 From: Ben Gibson Date: Sun, 24 Jul 2022 12:02:46 +0100 Subject: [PATCH] Rename Host to Platform (#230) --- CHANGELOG.md | 1 + build.gradle.kts | 2 +- gradle.properties | 2 +- .../co/ben_gibson/git/link/GitLinkBundle.kt | 2 +- .../ListExtensions.kt | 2 +- .../co/ben_gibson/git/link/git/HostLocator.kt | 16 -- .../uk/co/ben_gibson/git/link/git/Hosts.kt | 16 -- .../listener/ApplicationStartupListener.kt | 49 ++++++ .../listeners/ApplicationStartupListener.kt | 60 ------- .../co/ben_gibson/git/link/pipeline/Pass.kt | 6 +- .../ben_gibson/git/link/pipeline/Pipeline.kt | 18 +- .../ForceHttps.kt} | 5 +- .../GenerateUrl.kt} | 11 +- .../pipeline/{ => middleware}/Middleware.kt | 3 +- .../RecordHit.kt} | 5 +- .../ResolveContext.kt} | 19 ++- .../SendPollNotification.kt} | 7 +- .../SendSupportNotification.kt} | 7 +- .../Timer.kt} | 5 +- .../{git/Host.kt => platform/Platform.kt} | 57 ++++--- .../git/link/platform/PlatformDetector.kt | 31 ++++ .../git/link/platform/PlatformLocator.kt | 19 +++ .../PlatformRepository.kt} | 19 ++- .../git/link/settings/ApplicationSettings.kt | 2 +- .../ben_gibson/git/link/ui/actions/Action.kt | 6 +- .../link/ui/components/HostCellRenderer.kt | 12 -- .../components/HostComboBoxModelProvider.kt | 12 -- .../ui/components/PlatformCellRenderer.kt | 12 ++ .../git/link/ui/extensions/SelectInTarget.kt | 8 +- .../git/link/ui/notification/Notification.kt | 29 ++-- .../CustomHostsSettingsConfigurable.kt | 154 ------------------ .../CustomPlatformSettingsConfigurable.kt | 154 ++++++++++++++++++ .../ui/settings/DomainRegistrySettings.kt | 87 ++++++---- .../settings/ProjectSettingsConfigurable.kt | 40 ++--- .../factory/TemplatedUrlFactoryProvider.kt | 14 +- .../git/link/url/factory/UrlFactoryLocator.kt | 9 +- src/main/resources/META-INF/plugin.xml | 4 +- .../resources/messages/MyBundle.properties | 59 +++---- 38 files changed, 502 insertions(+), 462 deletions(-) rename src/main/kotlin/uk/co/ben_gibson/git/link/{extensions => extension}/ListExtensions.kt (77%) delete mode 100644 src/main/kotlin/uk/co/ben_gibson/git/link/git/HostLocator.kt delete mode 100644 src/main/kotlin/uk/co/ben_gibson/git/link/git/Hosts.kt create mode 100644 src/main/kotlin/uk/co/ben_gibson/git/link/listener/ApplicationStartupListener.kt delete mode 100644 src/main/kotlin/uk/co/ben_gibson/git/link/listeners/ApplicationStartupListener.kt rename src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/{ForceHttpsMiddleware.kt => middleware/ForceHttps.kt} (80%) rename src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/{GenerateUrlMiddleware.kt => middleware/GenerateUrl.kt} (87%) rename src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/{ => middleware}/Middleware.kt (71%) rename src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/{RecordHitMiddleware.kt => middleware/RecordHit.kt} (75%) rename src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/{ResolveContextMiddleware.kt => middleware/ResolveContext.kt} (73%) rename src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/{HostPollMiddleware.kt => middleware/SendPollNotification.kt} (74%) rename src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/{RatePluginMiddleware.kt => middleware/SendSupportNotification.kt} (76%) rename src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/{TimerMiddleware.kt => middleware/Timer.kt} (87%) rename src/main/kotlin/uk/co/ben_gibson/git/link/{git/Host.kt => platform/Platform.kt} (50%) create mode 100644 src/main/kotlin/uk/co/ben_gibson/git/link/platform/PlatformDetector.kt create mode 100644 src/main/kotlin/uk/co/ben_gibson/git/link/platform/PlatformLocator.kt rename src/main/kotlin/uk/co/ben_gibson/git/link/{git/HostsProvider.kt => platform/PlatformRepository.kt} (53%) delete mode 100644 src/main/kotlin/uk/co/ben_gibson/git/link/ui/components/HostCellRenderer.kt delete mode 100644 src/main/kotlin/uk/co/ben_gibson/git/link/ui/components/HostComboBoxModelProvider.kt create mode 100644 src/main/kotlin/uk/co/ben_gibson/git/link/ui/components/PlatformCellRenderer.kt delete mode 100644 src/main/kotlin/uk/co/ben_gibson/git/link/ui/settings/CustomHostsSettingsConfigurable.kt create mode 100644 src/main/kotlin/uk/co/ben_gibson/git/link/ui/settings/CustomPlatformSettingsConfigurable.kt diff --git a/CHANGELOG.md b/CHANGELOG.md index af9e33b..1942cc9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ # GitLink Changelog ## [Unreleased] +- Rename 'Host' option to 'Platform' ## [4.1.7] - Do not disable actions during project indexing diff --git a/build.gradle.kts b/build.gradle.kts index dea88cc..fd5777f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -9,7 +9,7 @@ plugins { // Kotlin support id("org.jetbrains.kotlin.jvm") version "1.6.10" // Gradle IntelliJ Plugin - id("org.jetbrains.intellij") version "1.6.0" + id("org.jetbrains.intellij") version "1.7.0" // Gradle Changelog Plugin id("org.jetbrains.changelog") version "1.3.1" // Gradle Qodana Plugin diff --git a/gradle.properties b/gradle.properties index db7a580..dba42e7 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,7 @@ pluginGroup = uk.co.ben_gibson.git.link pluginName = GitLink # SemVer format -> https://semver.org -pluginVersion = 4.1.7 +pluginVersion = 4.1.8 # See https://plugins.jetbrains.com/docs/intellij/build-number-ranges.html # for insight into build numbers and IntelliJ Platform versions. diff --git a/src/main/kotlin/uk/co/ben_gibson/git/link/GitLinkBundle.kt b/src/main/kotlin/uk/co/ben_gibson/git/link/GitLinkBundle.kt index 746841f..d8a2e57 100644 --- a/src/main/kotlin/uk/co/ben_gibson/git/link/GitLinkBundle.kt +++ b/src/main/kotlin/uk/co/ben_gibson/git/link/GitLinkBundle.kt @@ -34,7 +34,7 @@ object GitLinkBundle : DynamicBundle(BUNDLE) { BrowserLauncher.instance.open("https://github.com/ben-gibson/GitLink"); } - fun openHostPoll() { + fun openPlatformPoll() { BrowserLauncher.instance.open("https://github.com/ben-gibson/GitLink/discussions/172"); } diff --git a/src/main/kotlin/uk/co/ben_gibson/git/link/extensions/ListExtensions.kt b/src/main/kotlin/uk/co/ben_gibson/git/link/extension/ListExtensions.kt similarity index 77% rename from src/main/kotlin/uk/co/ben_gibson/git/link/extensions/ListExtensions.kt rename to src/main/kotlin/uk/co/ben_gibson/git/link/extension/ListExtensions.kt index 96b5396..d843c08 100644 --- a/src/main/kotlin/uk/co/ben_gibson/git/link/extensions/ListExtensions.kt +++ b/src/main/kotlin/uk/co/ben_gibson/git/link/extension/ListExtensions.kt @@ -1,4 +1,4 @@ -package uk.co.ben_gibson.git.link.extensions +package uk.co.ben_gibson.git.link.extension fun List.replaceAt(index: Int, value: T): List { val mutable = this.toMutableList() diff --git a/src/main/kotlin/uk/co/ben_gibson/git/link/git/HostLocator.kt b/src/main/kotlin/uk/co/ben_gibson/git/link/git/HostLocator.kt deleted file mode 100644 index b03ca8c..0000000 --- a/src/main/kotlin/uk/co/ben_gibson/git/link/git/HostLocator.kt +++ /dev/null @@ -1,16 +0,0 @@ -package uk.co.ben_gibson.git.link.git - -import com.intellij.openapi.components.Service -import com.intellij.openapi.components.service -import com.intellij.openapi.project.Project -import uk.co.ben_gibson.git.link.settings.ProjectSettings - -@Service -class HostLocator(val project: Project) { - fun locate() : Host? { - val settings = project.service() - val hostsProvider = service() - - return settings.host?.let { hostsProvider.provide().getById(it) } - } -} \ No newline at end of file diff --git a/src/main/kotlin/uk/co/ben_gibson/git/link/git/Hosts.kt b/src/main/kotlin/uk/co/ben_gibson/git/link/git/Hosts.kt deleted file mode 100644 index b6db331..0000000 --- a/src/main/kotlin/uk/co/ben_gibson/git/link/git/Hosts.kt +++ /dev/null @@ -1,16 +0,0 @@ -package uk.co.ben_gibson.git.link.git - -import java.net.URI -import java.util.UUID - -class Hosts(private val hosts: Set) { - - fun getById(id: String) = getById(UUID.fromString(id)) - fun getById(id: UUID) = hosts.firstOrNull() { it.id == id } - - fun getByHostDomain(domain: URI) = hosts.firstOrNull { host -> host.domains.contains(domain) } - - fun toSet() = hosts.toSet() - fun toList() = hosts.toList() - fun toArray() = hosts.toTypedArray() -} \ No newline at end of file diff --git a/src/main/kotlin/uk/co/ben_gibson/git/link/listener/ApplicationStartupListener.kt b/src/main/kotlin/uk/co/ben_gibson/git/link/listener/ApplicationStartupListener.kt new file mode 100644 index 0000000..49efec3 --- /dev/null +++ b/src/main/kotlin/uk/co/ben_gibson/git/link/listener/ApplicationStartupListener.kt @@ -0,0 +1,49 @@ +package uk.co.ben_gibson.git.link.listener + +import com.intellij.openapi.components.service +import com.intellij.openapi.project.Project +import com.intellij.openapi.startup.StartupActivity +import uk.co.ben_gibson.git.link.GitLinkBundle +import uk.co.ben_gibson.git.link.platform.PlatformDetector +import uk.co.ben_gibson.git.link.settings.ApplicationSettings +import uk.co.ben_gibson.git.link.settings.ProjectSettings +import uk.co.ben_gibson.git.link.ui.notification.Notification +import uk.co.ben_gibson.git.link.ui.notification.sendNotification + +class ApplicationStartupListener : StartupActivity.DumbAware { + override fun runActivity(project: Project) { + showVersionNotification(project) + detectPlatform(project) + } + + private fun showVersionNotification(project: Project) { + val settings = service() + val version = GitLinkBundle.plugin()?.version + + if (version == settings.lastVersion) { + return + } + + settings.lastVersion = version + sendNotification(Notification.welcome(version ?: "Unknown"), project) + } + + private fun detectPlatform(project: Project) { + val projectSettings = project.service() + + if (projectSettings.host != null) { + return + } + + val platform = project.service().detect() + + if (platform == null) { + sendNotification(Notification.couldNotDetectPlatform(project), project) + return + } + + sendNotification(Notification.platformAutoDetected(platform, project), project) + + projectSettings.host = platform.id.toString() + } +} \ No newline at end of file diff --git a/src/main/kotlin/uk/co/ben_gibson/git/link/listeners/ApplicationStartupListener.kt b/src/main/kotlin/uk/co/ben_gibson/git/link/listeners/ApplicationStartupListener.kt deleted file mode 100644 index a7d07fd..0000000 --- a/src/main/kotlin/uk/co/ben_gibson/git/link/listeners/ApplicationStartupListener.kt +++ /dev/null @@ -1,60 +0,0 @@ -package uk.co.ben_gibson.git.link.listeners - -import com.intellij.openapi.components.service -import com.intellij.openapi.project.Project -import com.intellij.openapi.project.guessProjectDir -import com.intellij.openapi.startup.StartupActivity -import git4idea.repo.GitRepositoryManager -import uk.co.ben_gibson.git.link.GitLinkBundle -import uk.co.ben_gibson.git.link.git.HostsProvider -import uk.co.ben_gibson.git.link.git.domain -import uk.co.ben_gibson.git.link.git.locateRemote -import uk.co.ben_gibson.git.link.settings.ApplicationSettings -import uk.co.ben_gibson.git.link.settings.ProjectSettings -import uk.co.ben_gibson.git.link.ui.notification.Notification -import uk.co.ben_gibson.git.link.ui.notification.sendNotification - -class ApplicationStartupListener : StartupActivity.DumbAware { - override fun runActivity(project: Project) { - val settings = service() - val version = GitLinkBundle.plugin()?.version - - if (version != settings.lastVersion) { - settings.lastVersion = version - sendNotification(Notification.welcome(version ?: "Unknown"), project) - } - - runInitialSetup(project) - } - - private fun runInitialSetup(project: Project) { - val projectSettings = project.service() - val applicationSettings = service() - - if (projectSettings.host != null) { - return - } - - val hosts = project.service().provide() - - val projectDirectory = project.guessProjectDir() ?: return - - val repository = GitRepositoryManager.getInstance(project) - .getRepositoryForFile(projectDirectory) ?: return - - val remote = repository.locateRemote(projectSettings.remote) ?: return - - val host = remote.domain?.let { - hosts.getByHostDomain(it) ?: applicationSettings.findHostIdByCustomDomain(it)?.let { id -> hosts.getById(id) } - } - - if (host == null) { - sendNotification(Notification.couldNotDetectGitHost(project), project) - return - } - - sendNotification(Notification.remoteHostAutoDetected(host, project), project) - - projectSettings.host = host.id.toString() - } -} \ No newline at end of file diff --git a/src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/Pass.kt b/src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/Pass.kt index 38dfbff..826c615 100644 --- a/src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/Pass.kt +++ b/src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/Pass.kt @@ -4,14 +4,14 @@ import com.intellij.openapi.project.Project import git4idea.repo.GitRemote import git4idea.repo.GitRepository import uk.co.ben_gibson.git.link.Context -import uk.co.ben_gibson.git.link.git.Host +import uk.co.ben_gibson.git.link.platform.Platform class Pass(val project: Project, val context: Context) { - var host: Host? = null + var platform: Platform? = null var repository: GitRepository? = null var remote: GitRemote? = null - fun hostOrThrow() = host ?: throw IllegalStateException("Host not set") + fun platformOrThrow() = platform ?: throw IllegalStateException("Platform not set") fun repositoryOrThrow() = repository ?: throw IllegalStateException("Repository not set") fun remoteOrThrow() = remote ?: throw IllegalStateException("Remote not set") } \ No newline at end of file diff --git a/src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/Pipeline.kt b/src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/Pipeline.kt index 2ed345a..91a4259 100644 --- a/src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/Pipeline.kt +++ b/src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/Pipeline.kt @@ -4,6 +4,8 @@ import com.intellij.openapi.components.Service import com.intellij.openapi.components.service import com.intellij.openapi.project.Project import uk.co.ben_gibson.git.link.Context +import uk.co.ben_gibson.git.link.pipeline.middleware.* +import uk.co.ben_gibson.git.link.pipeline.middleware.Timer import java.net.URI import java.util.* import kotlin.collections.Set @@ -11,13 +13,13 @@ import kotlin.collections.Set @Service class Pipeline(private val project: Project) { private val middlewares: Set = setOf( - project.service(), - project.service(), - project.service(), - project.service(), - project.service(), - project.service(), - project.service(), + project.service(), + project.service(), + project.service(), + project.service(), + project.service(), + project.service(), + project.service(), ) fun accept(context: Context) : URI? { @@ -25,7 +27,7 @@ class Pipeline(private val project: Project) { throw IllegalStateException("No middleware registered") } - val queue = PriorityQueue(middlewares) + val queue = PriorityQueue(middlewares) return next(queue, Pass(project, context)) } diff --git a/src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/ForceHttpsMiddleware.kt b/src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/middleware/ForceHttps.kt similarity index 80% rename from src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/ForceHttpsMiddleware.kt rename to src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/middleware/ForceHttps.kt index 5b5f926..9525946 100644 --- a/src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/ForceHttpsMiddleware.kt +++ b/src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/middleware/ForceHttps.kt @@ -1,13 +1,14 @@ -package uk.co.ben_gibson.git.link.pipeline +package uk.co.ben_gibson.git.link.pipeline.middleware import com.intellij.openapi.components.Service import com.intellij.openapi.components.service +import uk.co.ben_gibson.git.link.pipeline.Pass import uk.co.ben_gibson.git.link.settings.ProjectSettings import uk.co.ben_gibson.git.link.url.toHttps import java.net.URI @Service -class ForceHttpsMiddleware : Middleware { +class ForceHttps : Middleware { override val priority = 30 override fun invoke(pass: Pass, next: () -> URI?) : URI? { diff --git a/src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/GenerateUrlMiddleware.kt b/src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/middleware/GenerateUrl.kt similarity index 87% rename from src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/GenerateUrlMiddleware.kt rename to src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/middleware/GenerateUrl.kt index a24a709..d6c9182 100644 --- a/src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/GenerateUrlMiddleware.kt +++ b/src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/middleware/GenerateUrl.kt @@ -1,4 +1,4 @@ -package uk.co.ben_gibson.git.link.pipeline +package uk.co.ben_gibson.git.link.pipeline.middleware import com.intellij.openapi.components.Service import com.intellij.openapi.components.service @@ -6,6 +6,7 @@ import git4idea.repo.GitRemote import git4idea.repo.GitRepository import uk.co.ben_gibson.git.link.* import uk.co.ben_gibson.git.link.git.* +import uk.co.ben_gibson.git.link.pipeline.Pass import uk.co.ben_gibson.git.link.settings.ProjectSettings import uk.co.ben_gibson.git.link.url.UrlOptions import uk.co.ben_gibson.git.link.url.UrlOptionsCommit @@ -16,18 +17,18 @@ import java.net.URI // Must be the last middleware in the pipeline! @Service -class GenerateUrlMiddleware : Middleware { +class GenerateUrl : Middleware { override val priority = 50 override fun invoke(pass: Pass, next: () -> URI?) : URI? { - // We can't reach this point unless the host, repository, and remote have been resolved + // We can't reach this point unless the platform, repository, and remote have been resolved val baseUrl = pass.remoteOrThrow().httpUrl ?: return null - val host = pass.hostOrThrow() + val platform = pass.platformOrThrow() val urlOptions = createUrlOptions(pass, baseUrl) - return service().locate(host).createUrl(urlOptions) + return service().locate(platform).createUrl(urlOptions) } private fun createUrlOptions(pass: Pass, baseUrl: URI): UrlOptions { diff --git a/src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/Middleware.kt b/src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/middleware/Middleware.kt similarity index 71% rename from src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/Middleware.kt rename to src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/middleware/Middleware.kt index 1c7df75..d52d42f 100644 --- a/src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/Middleware.kt +++ b/src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/middleware/Middleware.kt @@ -1,5 +1,6 @@ -package uk.co.ben_gibson.git.link.pipeline +package uk.co.ben_gibson.git.link.pipeline.middleware +import uk.co.ben_gibson.git.link.pipeline.Pass import java.net.URI interface Middleware : Comparable { diff --git a/src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/RecordHitMiddleware.kt b/src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/middleware/RecordHit.kt similarity index 75% rename from src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/RecordHitMiddleware.kt rename to src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/middleware/RecordHit.kt index 9e41e99..65ba311 100644 --- a/src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/RecordHitMiddleware.kt +++ b/src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/middleware/RecordHit.kt @@ -1,12 +1,13 @@ -package uk.co.ben_gibson.git.link.pipeline +package uk.co.ben_gibson.git.link.pipeline.middleware import com.intellij.openapi.components.Service import com.intellij.openapi.components.service +import uk.co.ben_gibson.git.link.pipeline.Pass import uk.co.ben_gibson.git.link.settings.ApplicationSettings import java.net.URI @Service -class RecordHitMiddleware : Middleware { +class RecordHit : Middleware { override val priority = 20 override fun invoke(pass: Pass, next: () -> URI?) : URI? { diff --git a/src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/ResolveContextMiddleware.kt b/src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/middleware/ResolveContext.kt similarity index 73% rename from src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/ResolveContextMiddleware.kt rename to src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/middleware/ResolveContext.kt index 518f339..a6da322 100644 --- a/src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/ResolveContextMiddleware.kt +++ b/src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/middleware/ResolveContext.kt @@ -1,4 +1,4 @@ -package uk.co.ben_gibson.git.link.pipeline +package uk.co.ben_gibson.git.link.pipeline.middleware import com.intellij.openapi.components.Service import com.intellij.openapi.components.service @@ -6,35 +6,38 @@ import git4idea.repo.GitRemote import git4idea.repo.GitRepository import git4idea.repo.GitRepositoryManager import uk.co.ben_gibson.git.link.git.* +import uk.co.ben_gibson.git.link.pipeline.Pass +import uk.co.ben_gibson.git.link.platform.Platform +import uk.co.ben_gibson.git.link.platform.PlatformLocator import uk.co.ben_gibson.git.link.settings.ProjectSettings import uk.co.ben_gibson.git.link.ui.notification.Notification import uk.co.ben_gibson.git.link.ui.notification.sendNotification import java.net.URI @Service -class ResolveContextMiddleware : Middleware { +class ResolveContext : Middleware { override val priority = 5 override fun invoke(pass: Pass, next: () -> URI?): URI? { val repository = locateRepository(pass) ?: return null val remote = locateRemote(pass, repository) ?: return null - val host = localeHost(pass) ?: return null + val platform = localePlatform(pass) ?: return null - pass.host = host + pass.platform = platform pass.repository = repository pass.remote = remote return next() } - private fun localeHost(pass: Pass): Host? { - val host = pass.project.service().locate() + private fun localePlatform(pass: Pass): Platform? { + val platform = pass.project.service().locate() - if (host == null) { + if (platform == null) { sendNotification(Notification.hostNotSet(pass.project), pass.project) } - return host + return platform } private fun locateRepository(pass: Pass): GitRepository? { diff --git a/src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/HostPollMiddleware.kt b/src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/middleware/SendPollNotification.kt similarity index 74% rename from src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/HostPollMiddleware.kt rename to src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/middleware/SendPollNotification.kt index af1cbaa..e50c41f 100644 --- a/src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/HostPollMiddleware.kt +++ b/src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/middleware/SendPollNotification.kt @@ -1,14 +1,15 @@ -package uk.co.ben_gibson.git.link.pipeline +package uk.co.ben_gibson.git.link.pipeline.middleware import com.intellij.openapi.components.Service import com.intellij.openapi.components.service +import uk.co.ben_gibson.git.link.pipeline.Pass import uk.co.ben_gibson.git.link.settings.ApplicationSettings import uk.co.ben_gibson.git.link.ui.notification.Notification import uk.co.ben_gibson.git.link.ui.notification.sendNotification import java.net.URI @Service -class HostPollMiddleware : Middleware { +class SendPollNotification : Middleware { override val priority = 10 override fun invoke(pass: Pass, next: () -> URI?) : URI? { @@ -17,7 +18,7 @@ class HostPollMiddleware : Middleware { val settings = service() if (settings.showHostPoll && settings.hits % 10 == 0) { - sendNotification(Notification.hostPoll()) + sendNotification(Notification.platformPoll()) } return url; diff --git a/src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/RatePluginMiddleware.kt b/src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/middleware/SendSupportNotification.kt similarity index 76% rename from src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/RatePluginMiddleware.kt rename to src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/middleware/SendSupportNotification.kt index 2b0c497..362f732 100644 --- a/src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/RatePluginMiddleware.kt +++ b/src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/middleware/SendSupportNotification.kt @@ -1,14 +1,15 @@ -package uk.co.ben_gibson.git.link.pipeline +package uk.co.ben_gibson.git.link.pipeline.middleware import com.intellij.openapi.components.Service import com.intellij.openapi.components.service +import uk.co.ben_gibson.git.link.pipeline.Pass import uk.co.ben_gibson.git.link.settings.ApplicationSettings import uk.co.ben_gibson.git.link.ui.notification.Notification import uk.co.ben_gibson.git.link.ui.notification.sendNotification import java.net.URI @Service -class RatePluginMiddleware : Middleware { +class SendSupportNotification : Middleware { override val priority = 10 override fun invoke(pass: Pass, next: () -> URI?) : URI? { @@ -17,7 +18,7 @@ class RatePluginMiddleware : Middleware { val settings = service() if (settings.requestSupport && (settings.hits == 5 || settings.hits % 50 == 0)) { - sendNotification(Notification.review()) + sendNotification(Notification.star()) } return url; diff --git a/src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/TimerMiddleware.kt b/src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/middleware/Timer.kt similarity index 87% rename from src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/TimerMiddleware.kt rename to src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/middleware/Timer.kt index 8cc8058..29c8db2 100644 --- a/src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/TimerMiddleware.kt +++ b/src/main/kotlin/uk/co/ben_gibson/git/link/pipeline/middleware/Timer.kt @@ -1,14 +1,15 @@ -package uk.co.ben_gibson.git.link.pipeline +package uk.co.ben_gibson.git.link.pipeline.middleware import com.intellij.openapi.components.Service import com.intellij.openapi.components.service +import uk.co.ben_gibson.git.link.pipeline.Pass import uk.co.ben_gibson.git.link.settings.ProjectSettings import uk.co.ben_gibson.git.link.ui.notification.Notification import uk.co.ben_gibson.git.link.ui.notification.sendNotification import java.net.URI @Service -class TimerMiddleware : Middleware { +class Timer : Middleware { override val priority = 40 override fun invoke(pass: Pass, next: () -> URI?) : URI? { diff --git a/src/main/kotlin/uk/co/ben_gibson/git/link/git/Host.kt b/src/main/kotlin/uk/co/ben_gibson/git/link/platform/Platform.kt similarity index 50% rename from src/main/kotlin/uk/co/ben_gibson/git/link/git/Host.kt rename to src/main/kotlin/uk/co/ben_gibson/git/link/platform/Platform.kt index 8c19d11..fbc75a7 100644 --- a/src/main/kotlin/uk/co/ben_gibson/git/link/git/Host.kt +++ b/src/main/kotlin/uk/co/ben_gibson/git/link/platform/Platform.kt @@ -1,4 +1,4 @@ -package uk.co.ben_gibson.git.link.git +package uk.co.ben_gibson.git.link.platform import com.intellij.icons.AllIcons import uk.co.ben_gibson.git.link.GitLinkBundle.message @@ -7,68 +7,83 @@ import java.net.URI import java.util.UUID import javax.swing.Icon -sealed class Host(val id: UUID, val displayName: String, val icon: Icon, val domains: Set = setOf()) +sealed class Platform(val id: UUID, val name: String, val icon: Icon, val domains: Set = setOf()) { + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (javaClass != other?.javaClass) return false -class GitHub() : Host( + other as Platform + + if (id != other.id) return false + + return true + } + + override fun hashCode(): Int { + return id.hashCode() + } +} + +class GitHub() : Platform( UUID.fromString("72037fcc-cb9c-4c22-960a-ffe73fd5e229"), - message("hosts.github.name"), + message("platform.github.name"), AllIcons.Vcs.Vendors.Github, setOf(URI("github.com")) ) -class GitLab() : Host( +class GitLab() : Platform( UUID.fromString("16abfb4c-4717-4d04-a8f1-7a40fcac9b07"), - message("hosts.gitlab.name"), + message("platform.gitlab.name"), Icons.GITLAB, setOf(URI("gitlab.com")) ) -class BitbucketCloud() : Host( +class BitbucketCloud() : Platform( UUID.fromString("00c4b661-b32a-4d36-90d7-88db786edadd"), - message("hosts.bitbucket.cloud.name"), + message("platform.bitbucket.cloud.name"), Icons.BITBUCKET, setOf(URI("bitbucket.org")) ) -class BitbucketServer() : Host( +class BitbucketServer() : Platform( UUID.fromString("dba5941d-821c-49b3-83b0-75deb9462acb"), - message("hosts.bitbucket.server.name"), + message("platform.bitbucket.server.name"), Icons.BITBUCKET ) -class Gogs() : Host( +class Gogs() : Platform( UUID.fromString("fd2d9cfc-1eef-4b1b-80bd-b02def58576c"), - message("hosts.gogs.name"), + message("platform.gogs.name"), Icons.GOGS, setOf(URI("gogs.io")) ) -class Gitea() : Host( +class Gitea() : Platform( UUID.fromString("e0f86390-1091-4871-8aeb-f534fbc99cf0"), - message("hosts.gitea.name"), + message("platform.gitea.name"), Icons.GITEA, setOf(URI("gitea.io")), ) -class Gitee() : Host( +class Gitee() : Platform( UUID.fromString("5c2d3009-7e3e-4c9f-9c0f-d76bc7e926bf"), - message("hosts.gitee.name"), + message("platform.gitee.name"), Icons.GITEE, setOf(URI("gitee.com")) ) -class Azure() : Host( +class Azure() : Platform( UUID.fromString("83008277-73fa-4faa-b9b2-0a60fecb030e"), - message("hosts.azure.name"), + message("platform.azure.name"), Icons.AZURE, setOf(URI("dev.azure.com")) ) -class Chromium() : Host( +class Chromium() : Platform( UUID.fromString("97bf87bc-99ef-4e1f-8d37-7948a2082df4"), - message("hosts.chromium.name"), + message("platform.chromium.name"), Icons.CHROMIUM, setOf(URI("googlesource.com")) ) -class Custom(id: UUID, displayName: String, icon: Icon, domains: Set = setOf()) : Host(id, displayName, icon, domains) \ No newline at end of file +class Custom(id: UUID, name: String, icon: Icon, domains: Set = setOf()) : Platform(id, name, icon, domains) \ No newline at end of file diff --git a/src/main/kotlin/uk/co/ben_gibson/git/link/platform/PlatformDetector.kt b/src/main/kotlin/uk/co/ben_gibson/git/link/platform/PlatformDetector.kt new file mode 100644 index 0000000..57370ca --- /dev/null +++ b/src/main/kotlin/uk/co/ben_gibson/git/link/platform/PlatformDetector.kt @@ -0,0 +1,31 @@ +package uk.co.ben_gibson.git.link.platform + +import com.intellij.openapi.components.Service +import com.intellij.openapi.components.service +import com.intellij.openapi.project.Project +import com.intellij.openapi.project.guessProjectDir +import git4idea.repo.GitRepositoryManager +import uk.co.ben_gibson.git.link.git.domain +import uk.co.ben_gibson.git.link.git.locateRemote +import uk.co.ben_gibson.git.link.settings.ApplicationSettings +import uk.co.ben_gibson.git.link.settings.ProjectSettings + +@Service +class PlatformDetector(val project: Project) { + fun detect() : Platform? { + val applicationSettings = service() + val settings = project.service() + + val platforms = project.service() + + val projectDirectory = project.guessProjectDir() ?: return null + + val repository = GitRepositoryManager.getInstance(project).getRepositoryForFile(projectDirectory) ?: return null + + val remote = repository.locateRemote(settings.remote) ?: return null + + return remote.domain?.let { + platforms.getByDomain(it) ?: applicationSettings.findPlatformIdByCustomDomain(it)?.let { id -> platforms.getById(id) } + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/uk/co/ben_gibson/git/link/platform/PlatformLocator.kt b/src/main/kotlin/uk/co/ben_gibson/git/link/platform/PlatformLocator.kt new file mode 100644 index 0000000..1f95d19 --- /dev/null +++ b/src/main/kotlin/uk/co/ben_gibson/git/link/platform/PlatformLocator.kt @@ -0,0 +1,19 @@ +package uk.co.ben_gibson.git.link.platform + +import com.intellij.openapi.components.Service +import com.intellij.openapi.components.service +import com.intellij.openapi.project.Project +import uk.co.ben_gibson.git.link.settings.ProjectSettings + +@Service +class PlatformLocator(val project: Project) { + fun locate() : Platform? { + val settings = project.service() + + val platformId = settings.host?: return null + + val platforms = service() + + return platforms.getById(platformId) + } +} \ No newline at end of file diff --git a/src/main/kotlin/uk/co/ben_gibson/git/link/git/HostsProvider.kt b/src/main/kotlin/uk/co/ben_gibson/git/link/platform/PlatformRepository.kt similarity index 53% rename from src/main/kotlin/uk/co/ben_gibson/git/link/git/HostsProvider.kt rename to src/main/kotlin/uk/co/ben_gibson/git/link/platform/PlatformRepository.kt index ce4f043..bce44c3 100644 --- a/src/main/kotlin/uk/co/ben_gibson/git/link/git/HostsProvider.kt +++ b/src/main/kotlin/uk/co/ben_gibson/git/link/platform/PlatformRepository.kt @@ -1,13 +1,13 @@ -package uk.co.ben_gibson.git.link.git +package uk.co.ben_gibson.git.link.platform import com.intellij.openapi.components.Service import com.intellij.openapi.components.service import uk.co.ben_gibson.git.link.settings.ApplicationSettings import uk.co.ben_gibson.git.link.ui.Icons import java.net.URI -import java.util.* +import java.util.UUID -private val HOSTS = setOf( +private val EXISTING_PLATFORMS = setOf( GitHub(), GitLab(), BitbucketCloud(), @@ -20,11 +20,16 @@ private val HOSTS = setOf( ) @Service -class HostsProvider { - fun provide(): Hosts { +class PlatformRepository { + fun getById(id: String) = getById(UUID.fromString(id)) + fun getById(id: UUID) = load().firstOrNull() { it.id == id } + fun getByDomain(domain: URI) = load().firstOrNull { it.domains.contains(domain) } + fun getAll() = load() + + private fun load(): Set { val settings = service() - val customHosts: List = settings.customHosts.map { + val customPlatforms: List = settings.customHosts.map { Custom( UUID.fromString(it.id), it.displayName, @@ -33,6 +38,6 @@ class HostsProvider { ) } - return Hosts(HOSTS.plus(customHosts)) + return EXISTING_PLATFORMS.plus(customPlatforms) } } \ No newline at end of file diff --git a/src/main/kotlin/uk/co/ben_gibson/git/link/settings/ApplicationSettings.kt b/src/main/kotlin/uk/co/ben_gibson/git/link/settings/ApplicationSettings.kt index 34bb3c5..323b737 100644 --- a/src/main/kotlin/uk/co/ben_gibson/git/link/settings/ApplicationSettings.kt +++ b/src/main/kotlin/uk/co/ben_gibson/git/link/settings/ApplicationSettings.kt @@ -46,7 +46,7 @@ class ApplicationSettings : PersistentStateComponent { var commitTemplate: String = "" ) - fun findHostIdByCustomDomain(domain: URI) = customHostDomains + fun findPlatformIdByCustomDomain(domain: URI) = customHostDomains .entries .firstOrNull { entry -> entry.value.contains(domain.toString()) } ?.key diff --git a/src/main/kotlin/uk/co/ben_gibson/git/link/ui/actions/Action.kt b/src/main/kotlin/uk/co/ben_gibson/git/link/ui/actions/Action.kt index c44b14a..5795c0e 100644 --- a/src/main/kotlin/uk/co/ben_gibson/git/link/ui/actions/Action.kt +++ b/src/main/kotlin/uk/co/ben_gibson/git/link/ui/actions/Action.kt @@ -5,7 +5,7 @@ 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.git.HostLocator +import uk.co.ben_gibson.git.link.platform.PlatformLocator abstract class Action(private val type: Type): DumbAwareAction() { @@ -36,13 +36,13 @@ abstract class Action(private val type: Type): DumbAwareAction() { val project = event.project ?: return - val host = project.service().locate() + val host = project.service().locate() event.presentation.isEnabled = shouldBeEnabled(event) host?.let { event.presentation.icon = it.icon - event.presentation.text = GitLinkBundle.message("actions.${type.key}.title", it.displayName) + event.presentation.text = GitLinkBundle.message("actions.${type.key}.title", it.name) } } } \ No newline at end of file diff --git a/src/main/kotlin/uk/co/ben_gibson/git/link/ui/components/HostCellRenderer.kt b/src/main/kotlin/uk/co/ben_gibson/git/link/ui/components/HostCellRenderer.kt deleted file mode 100644 index dad9367..0000000 --- a/src/main/kotlin/uk/co/ben_gibson/git/link/ui/components/HostCellRenderer.kt +++ /dev/null @@ -1,12 +0,0 @@ -package uk.co.ben_gibson.git.link.ui.components - -import com.intellij.ui.SimpleListCellRenderer -import uk.co.ben_gibson.git.link.git.Host -import javax.swing.JList - -class HostCellRenderer : SimpleListCellRenderer() { - override fun customize(list: JList, value: Host?, index: Int, selected: Boolean, hasFocus: Boolean) { - text = value?.displayName ?: "" - icon = value?.icon - } -} \ No newline at end of file diff --git a/src/main/kotlin/uk/co/ben_gibson/git/link/ui/components/HostComboBoxModelProvider.kt b/src/main/kotlin/uk/co/ben_gibson/git/link/ui/components/HostComboBoxModelProvider.kt deleted file mode 100644 index 76ea200..0000000 --- a/src/main/kotlin/uk/co/ben_gibson/git/link/ui/components/HostComboBoxModelProvider.kt +++ /dev/null @@ -1,12 +0,0 @@ -package uk.co.ben_gibson.git.link.ui.components - -import com.intellij.openapi.components.service -import com.intellij.ui.CollectionComboBoxModel -import uk.co.ben_gibson.git.link.git.Host -import uk.co.ben_gibson.git.link.git.HostsProvider - -object HostComboBoxModelProvider { - fun provide() : CollectionComboBoxModel { - return CollectionComboBoxModel(service().provide().toList()); - } -} \ No newline at end of file diff --git a/src/main/kotlin/uk/co/ben_gibson/git/link/ui/components/PlatformCellRenderer.kt b/src/main/kotlin/uk/co/ben_gibson/git/link/ui/components/PlatformCellRenderer.kt new file mode 100644 index 0000000..9b2cc63 --- /dev/null +++ b/src/main/kotlin/uk/co/ben_gibson/git/link/ui/components/PlatformCellRenderer.kt @@ -0,0 +1,12 @@ +package uk.co.ben_gibson.git.link.ui.components + +import com.intellij.ui.SimpleListCellRenderer +import uk.co.ben_gibson.git.link.platform.Platform +import javax.swing.JList + +class PlatformCellRenderer : SimpleListCellRenderer() { + override fun customize(list: JList, value: Platform?, index: Int, selected: Boolean, hasFocus: Boolean) { + text = value?.name ?: "" + icon = value?.icon + } +} \ No newline at end of file diff --git a/src/main/kotlin/uk/co/ben_gibson/git/link/ui/extensions/SelectInTarget.kt b/src/main/kotlin/uk/co/ben_gibson/git/link/ui/extensions/SelectInTarget.kt index 0a29f35..f825bb5 100644 --- a/src/main/kotlin/uk/co/ben_gibson/git/link/ui/extensions/SelectInTarget.kt +++ b/src/main/kotlin/uk/co/ben_gibson/git/link/ui/extensions/SelectInTarget.kt @@ -4,20 +4,20 @@ import com.intellij.ide.SelectInContext import com.intellij.openapi.components.service import com.intellij.openapi.project.Project import uk.co.ben_gibson.git.link.ContextCurrentFile -import uk.co.ben_gibson.git.link.git.HostLocator +import uk.co.ben_gibson.git.link.platform.PlatformLocator import uk.co.ben_gibson.git.link.openInBrowser import com.intellij.ide.SelectInTarget as IntellijSelectInTarget class SelectInTarget(private val project: Project) : IntellijSelectInTarget { - override fun canSelect(context: SelectInContext) = project.service().locate() != null + override fun canSelect(context: SelectInContext) = project.service().locate() != null override fun selectIn(context: SelectInContext, requestFocus: Boolean) { openInBrowser(context.project, ContextCurrentFile(context.virtualFile)) } override fun toString(): String { - val host = project.service().locate() + val platform = project.service().locate() - return host?.displayName ?: "Gitlink" + return platform?.name ?: "Gitlink" } } \ No newline at end of file diff --git a/src/main/kotlin/uk/co/ben_gibson/git/link/ui/notification/Notification.kt b/src/main/kotlin/uk/co/ben_gibson/git/link/ui/notification/Notification.kt index 2d93666..f591a28 100644 --- a/src/main/kotlin/uk/co/ben_gibson/git/link/ui/notification/Notification.kt +++ b/src/main/kotlin/uk/co/ben_gibson/git/link/ui/notification/Notification.kt @@ -6,7 +6,7 @@ import com.intellij.openapi.project.Project import uk.co.ben_gibson.git.link.GitLinkBundle import uk.co.ben_gibson.git.link.GitLinkBundle.openPluginSettings import uk.co.ben_gibson.git.link.GitLinkBundle.message -import uk.co.ben_gibson.git.link.git.Host +import uk.co.ben_gibson.git.link.platform.Platform import uk.co.ben_gibson.git.link.settings.ApplicationSettings import uk.co.ben_gibson.git.link.settings.ProjectSettings import java.net.URI @@ -17,7 +17,6 @@ data class Notification( val actions: Set = setOf(), val type: Type = Type.PERSISTENT ) { - enum class Type { PERSISTENT, TRANSIENT @@ -28,7 +27,7 @@ data class Notification( fun hostNotSet(project: Project) = Notification( DEFAULT_TITLE, - message("notifications.host-not-set"), + message("notifications.platform-not-set"), actions = setOf(NotificationAction.settings(project)) ) @@ -38,9 +37,9 @@ data class Notification( fun welcome(version: String) = Notification(message = message("notifications.welcome", version)) - fun review() = Notification( + fun star() = Notification( message = """ - Finding GitLink useful? Show your support 💖, drop a review and ⭐ the repo 🙏. + Finding GitLink useful? Show your support 💖 and ⭐ the repository 🙏. """.trimIndent(), actions = setOf( NotificationAction.openRepository() { @@ -52,12 +51,12 @@ data class Notification( ) ) - fun hostPoll() = Notification( + fun platformPoll() = Notification( message = """ - Help improve GitLink by telling us which host you use 🗳️. + Help improve GitLink by telling us which platform you use 🗳️. """.trimIndent(), actions = setOf( - NotificationAction.openHostPoll() { + NotificationAction.openPlatformPoll() { service().showHostPoll = false; }, NotificationAction.doNotAskAgain() { @@ -74,14 +73,14 @@ data class Notification( ) ) - fun couldNotDetectGitHost(project: Project) = Notification( - message = message("notifications.could-not-detect-host"), + fun couldNotDetectPlatform(project: Project) = Notification( + message = message("notifications.could-not-detect-platform"), actions = setOf(NotificationAction.settings(project, message("actions.configure-manually"))) ) - fun remoteHostAutoDetected(remoteHost: Host, project: Project) = Notification( - message = message("notifications.host-detected", remoteHost.displayName), - actions = setOf(NotificationAction.settings(project, message("actions.configure-manually"))) + fun platformAutoDetected(remotePlatform: Platform, project: Project) = Notification( + message = message("notifications.platform-detected.message", remotePlatform.name), + actions = setOf(NotificationAction.settings(project, message("notifications.platform-detected.action"))) ) fun linkCopied(link: URI) = Notification( @@ -108,8 +107,8 @@ data class NotificationAction(val title: String, val run: (dismiss: () -> Unit) dismiss() onComplete() } - fun openHostPoll(onComplete: () -> Unit) = NotificationAction(message("actions.sure-take-me-there")) { dismiss -> - GitLinkBundle.openHostPoll() + fun openPlatformPoll(onComplete: () -> Unit) = NotificationAction(message("actions.sure-take-me-there")) { dismiss -> + GitLinkBundle.openPlatformPoll() dismiss() onComplete() } diff --git a/src/main/kotlin/uk/co/ben_gibson/git/link/ui/settings/CustomHostsSettingsConfigurable.kt b/src/main/kotlin/uk/co/ben_gibson/git/link/ui/settings/CustomHostsSettingsConfigurable.kt deleted file mode 100644 index f593912..0000000 --- a/src/main/kotlin/uk/co/ben_gibson/git/link/ui/settings/CustomHostsSettingsConfigurable.kt +++ /dev/null @@ -1,154 +0,0 @@ -package uk.co.ben_gibson.git.link.ui.settings - -import com.intellij.openapi.components.service -import com.intellij.openapi.options.BoundConfigurable -import com.intellij.openapi.ui.DialogWrapper -import com.intellij.ui.ToolbarDecorator -import com.intellij.ui.layout.CCFlags -import com.intellij.ui.layout.panel -import com.intellij.ui.table.TableView -import com.intellij.util.ui.ColumnInfo -import com.intellij.util.ui.ListTableModel -import uk.co.ben_gibson.git.link.settings.ApplicationSettings -import uk.co.ben_gibson.git.link.settings.ApplicationSettings.CustomHostSettings -import javax.swing.ListSelectionModel.SINGLE_SELECTION -import uk.co.ben_gibson.git.link.GitLinkBundle.message -import uk.co.ben_gibson.git.link.extensions.replaceAt -import uk.co.ben_gibson.git.link.ui.components.SubstitutionReferenceTable -import uk.co.ben_gibson.git.link.ui.layout.reportBugLink -import uk.co.ben_gibson.git.link.ui.validation.* - -class CustomHostsSettingsConfigurable : BoundConfigurable(message("settings.custom-host.group.title")) { - private var settings = service() - private var customHosts = settings.customHosts - private val customHostTableModel = createCustomHostModel() - - private val customHostsTable = TableView(customHostTableModel).apply { - setShowColumns(true) - setSelectionMode(SINGLE_SELECTION) - emptyText.text = message("settings.custom-host.table.empty") - } - - private val customHostTableContainer = ToolbarDecorator.createDecorator(customHostsTable) - .setAddAction { addCustomHost() } - .setEditAction { editCustomHost() } - .setRemoveAction { removeCustomHost() } - .createPanel() - - override fun createPanel() = panel { - row { - component(customHostTableContainer).constraints(CCFlags.grow) - } - row { - reportBugLink() - } - } - - private fun createCustomHostModel(): ListTableModel = ListTableModel( - arrayOf( - createCustomHostColumn(message("settings.custom-host.table.column.name")) { customHost -> customHost?.displayName }, - createCustomHostColumn(message("settings.custom-host.table.column.domain")) { customHost -> customHost?.baseUrl }, - ), - customHosts - ) - - private fun createCustomHostColumn(name: String, formatter: (CustomHostSettings?) -> String?) : ColumnInfo { - return object : ColumnInfo(name) { - override fun valueOf(item: CustomHostSettings?): String? { - return formatter(item) - } - } - } - - private fun addCustomHost() { - val dialog = CustomHostDialog() - - if (dialog.showAndGet()) { - customHosts = customHosts.plus(dialog.host) - refreshCustomHostTableModel() - } - } - - private fun removeCustomHost() { - val row = customHostsTable.selectedObject ?: return - - customHosts = customHosts.minus(row) - refreshCustomHostTableModel() - } - - private fun editCustomHost() { - val row = customHostsTable.selectedObject ?: return - - val dialog = CustomHostDialog(row.copy()) - - if (dialog.showAndGet()) { - customHosts = customHosts.replaceAt(customHostsTable.selectedRow, dialog.host) - refreshCustomHostTableModel() - } - } - - private fun refreshCustomHostTableModel() { - customHostTableModel.items = customHosts - } - - override fun reset() { - super.reset() - - customHosts = settings.customHosts - refreshCustomHostTableModel() - } - - override fun isModified() : Boolean { - return super.isModified() || customHosts != settings.customHosts - } - - override fun apply() { - super.apply() - - settings.customHosts = customHosts - } -} - -private class CustomHostDialog(private val customHost: CustomHostSettings? = null) : DialogWrapper(false) { - val host = customHost ?: CustomHostSettings() - private val substitutionReferenceTable = SubstitutionReferenceTable().apply { setShowColumns(true) } - - init { - title = message("settings.custom-host.add-dialog.title") - setOKButtonText(customHost?.let { message("actions.update") } ?: message("actions.add")) - setSize(700, 700) - init() - } - - override fun createCenterPanel() = panel { - row(message("settings.custom-host.add-dialog.field.name.label")) { - textField(host::displayName) - .focused() - .withValidationOnApply { notBlank(it.text) ?: alphaNumeric(it.text) ?: length(it.text, 3, 15) } - .comment(message("settings.custom-host.add-dialog.field.name.comment")) - } - row(message("settings.custom-host.add-dialog.field.domain.label")) { - textField(host::baseUrl) - .withValidationOnApply { notBlank(it.text) ?: domain(it.text) } - .comment(message("settings.custom-host.add-dialog.field.domain.comment")) - } - row(message("settings.custom-host.add-dialog.field.file-at-branch-template.label")) { - textField(host::fileAtBranchTemplate) - .withValidationOnApply { notBlank(it.text) ?: fileAtBranchTemplate(it.text) } - .comment(message("settings.custom-host.add-dialog.field.file-at-branch-template.comment")) - } - row(message("settings.custom-host.add-dialog.field.file-at-commit-template.label")) { - textField(host::fileAtCommitTemplate) - .withValidationOnApply { notBlank(it.text) ?: fileAtCommitTemplate(it.text) } - .comment(message("settings.custom-host.add-dialog.field.file-at-commit-template.comment")) - } - row(message("settings.custom-host.add-dialog.field.commit-template.label")) { - textField(host::commitTemplate) - .withValidationOnApply { notBlank(it.text) ?: commitTemplate(it.text) } - .comment(message("settings.custom-host.add-dialog.field.commit-template.comment")) - } - row() { - scrollPane(substitutionReferenceTable) - } - } -} \ No newline at end of file diff --git a/src/main/kotlin/uk/co/ben_gibson/git/link/ui/settings/CustomPlatformSettingsConfigurable.kt b/src/main/kotlin/uk/co/ben_gibson/git/link/ui/settings/CustomPlatformSettingsConfigurable.kt new file mode 100644 index 0000000..f4e9293 --- /dev/null +++ b/src/main/kotlin/uk/co/ben_gibson/git/link/ui/settings/CustomPlatformSettingsConfigurable.kt @@ -0,0 +1,154 @@ +package uk.co.ben_gibson.git.link.ui.settings + +import com.intellij.openapi.components.service +import com.intellij.openapi.options.BoundConfigurable +import com.intellij.openapi.ui.DialogWrapper +import com.intellij.ui.ToolbarDecorator +import com.intellij.ui.layout.CCFlags +import com.intellij.ui.layout.panel +import com.intellij.ui.table.TableView +import com.intellij.util.ui.ColumnInfo +import com.intellij.util.ui.ListTableModel +import uk.co.ben_gibson.git.link.settings.ApplicationSettings +import uk.co.ben_gibson.git.link.settings.ApplicationSettings.CustomHostSettings +import javax.swing.ListSelectionModel.SINGLE_SELECTION +import uk.co.ben_gibson.git.link.GitLinkBundle.message +import uk.co.ben_gibson.git.link.extension.replaceAt +import uk.co.ben_gibson.git.link.ui.components.SubstitutionReferenceTable +import uk.co.ben_gibson.git.link.ui.layout.reportBugLink +import uk.co.ben_gibson.git.link.ui.validation.* + +class CustomPlatformSettingsConfigurable : BoundConfigurable(message("settings.custom-platform.group.title")) { + private var settings = service() + private var customPlatforms = settings.customHosts + private val tableModel = createTableModel() + + private val table = TableView(tableModel).apply { + setShowColumns(true) + setSelectionMode(SINGLE_SELECTION) + emptyText.text = message("settings.custom-platform.table.empty") + } + + private val tableContainer = ToolbarDecorator.createDecorator(table) + .setAddAction { addCustomPlatform() } + .setEditAction { editCustomPlatform() } + .setRemoveAction { removeCustomPlatform() } + .createPanel() + + override fun createPanel() = panel { + row { + component(tableContainer).constraints(CCFlags.grow) + } + row { + reportBugLink() + } + } + + private fun createTableModel(): ListTableModel = ListTableModel( + arrayOf( + createColumn(message("settings.custom-platform.table.column.name")) { customPlatform -> customPlatform?.displayName }, + createColumn(message("settings.custom-platform.table.column.domain")) { customPlatform -> customPlatform?.baseUrl }, + ), + customPlatforms + ) + + private fun createColumn(name: String, formatter: (CustomHostSettings?) -> String?) : ColumnInfo { + return object : ColumnInfo(name) { + override fun valueOf(item: CustomHostSettings?): String? { + return formatter(item) + } + } + } + + private fun addCustomPlatform() { + val dialog = CustomPlatformDialog() + + if (dialog.showAndGet()) { + customPlatforms = customPlatforms.plus(dialog.platform) + refreshTableModel() + } + } + + private fun removeCustomPlatform() { + val row = table.selectedObject ?: return + + customPlatforms = customPlatforms.minus(row) + refreshTableModel() + } + + private fun editCustomPlatform() { + val row = table.selectedObject ?: return + + val dialog = CustomPlatformDialog(row.copy()) + + if (dialog.showAndGet()) { + customPlatforms = customPlatforms.replaceAt(table.selectedRow, dialog.platform) + refreshTableModel() + } + } + + private fun refreshTableModel() { + tableModel.items = customPlatforms + } + + override fun reset() { + super.reset() + + customPlatforms = settings.customHosts + refreshTableModel() + } + + override fun isModified() : Boolean { + return super.isModified() || customPlatforms != settings.customHosts + } + + override fun apply() { + super.apply() + + settings.customHosts = customPlatforms + } +} + +private class CustomPlatformDialog(customPlatform: CustomHostSettings? = null) : DialogWrapper(false) { + val platform = customPlatform ?: CustomHostSettings() + private val substitutionReferenceTable = SubstitutionReferenceTable().apply { setShowColumns(true) } + + init { + title = message("settings.custom-platform.add-dialog.title") + setOKButtonText(customPlatform?.let { message("actions.update") } ?: message("actions.add")) + setSize(700, 700) + init() + } + + override fun createCenterPanel() = panel { + row(message("settings.custom-platform.add-dialog.field.name.label")) { + textField(platform::displayName) + .focused() + .withValidationOnApply { notBlank(it.text) ?: alphaNumeric(it.text) ?: length(it.text, 3, 15) } + .comment(message("settings.custom-platform.add-dialog.field.name.comment")) + } + row(message("settings.custom-platform.add-dialog.field.domain.label")) { + textField(platform::baseUrl) + .withValidationOnApply { notBlank(it.text) ?: domain(it.text) } + .comment(message("settings.custom-platform.add-dialog.field.domain.comment")) + } + row(message("settings.custom-platform.add-dialog.field.file-at-branch-template.label")) { + textField(platform::fileAtBranchTemplate) + .withValidationOnApply { notBlank(it.text) ?: fileAtBranchTemplate(it.text) } + .comment(message("settings.custom-platform.add-dialog.field.file-at-branch-template.comment")) + } + row(message("settings.custom-platform.add-dialog.field.file-at-commit-template.label")) { + textField(platform::fileAtCommitTemplate) + .withValidationOnApply { notBlank(it.text) ?: fileAtCommitTemplate(it.text) } + .comment(message("settings.custom-platform.add-dialog.field.file-at-commit-template.comment")) + } + row(message("settings.custom-platform.add-dialog.field.commit-template.label")) { + textField(platform::commitTemplate) + .withValidationOnApply { notBlank(it.text) ?: commitTemplate(it.text) } + .comment(message("settings.custom-platform.add-dialog.field.commit-template.comment")) + } + row() { + scrollPane(substitutionReferenceTable) + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/uk/co/ben_gibson/git/link/ui/settings/DomainRegistrySettings.kt b/src/main/kotlin/uk/co/ben_gibson/git/link/ui/settings/DomainRegistrySettings.kt index bc393bf..8ae167f 100644 --- a/src/main/kotlin/uk/co/ben_gibson/git/link/ui/settings/DomainRegistrySettings.kt +++ b/src/main/kotlin/uk/co/ben_gibson/git/link/ui/settings/DomainRegistrySettings.kt @@ -3,6 +3,7 @@ package uk.co.ben_gibson.git.link.ui.settings import com.intellij.openapi.components.service import com.intellij.openapi.options.BoundConfigurable import com.intellij.openapi.ui.DialogWrapper +import com.intellij.ui.CollectionComboBoxModel import com.intellij.ui.ToolbarDecorator import com.intellij.ui.layout.CCFlags import com.intellij.ui.layout.panel @@ -10,12 +11,10 @@ import com.intellij.ui.table.TableView import com.intellij.util.ui.ColumnInfo import com.intellij.util.ui.ListTableModel import uk.co.ben_gibson.git.link.GitLinkBundle.message -import uk.co.ben_gibson.git.link.git.Host -import uk.co.ben_gibson.git.link.git.Hosts -import uk.co.ben_gibson.git.link.git.HostsProvider +import uk.co.ben_gibson.git.link.platform.Platform +import uk.co.ben_gibson.git.link.platform.PlatformRepository import uk.co.ben_gibson.git.link.settings.ApplicationSettings -import uk.co.ben_gibson.git.link.ui.components.HostCellRenderer -import uk.co.ben_gibson.git.link.ui.components.HostComboBoxModelProvider +import uk.co.ben_gibson.git.link.ui.components.PlatformCellRenderer import uk.co.ben_gibson.git.link.ui.layout.reportBugLink import uk.co.ben_gibson.git.link.ui.validation.domain import uk.co.ben_gibson.git.link.ui.validation.exists @@ -23,12 +22,12 @@ import uk.co.ben_gibson.git.link.ui.validation.notBlank import java.awt.event.ItemEvent import javax.swing.ListSelectionModel -class DomainRegistrySettings : BoundConfigurable(message("settings.domain-registry.group.title")) { - private val settings = service(); - private val hosts = service().provide(); +class DomainRegistrySettings : BoundConfigurable(message("settings.domain-registry.group.title")), ApplicationSettings.ChangeListener { + private val settings = service() + private val platforms = service() private var domainRegistry = settings.customHostDomains - private val hostsComboBoxModel = HostComboBoxModelProvider.provide() + private val platformComboBoxModel = CollectionComboBoxModel(platforms.getAll().toList()) private val domainsTableModel = createDomainsTableModel() @@ -46,17 +45,21 @@ class DomainRegistrySettings : BoundConfigurable(message("settings.domain-regist .setRemoveActionUpdater() { canModifyDomain() } .createPanel() + init { + service().registerListener(this) + } + override fun createPanel() = panel { - row(message("settings.general.field.host.label")) { + row(message("settings.general.field.platform.label")) { comboBox( - hostsComboBoxModel, - { hosts.toSet().first() }, + platformComboBoxModel, + { platforms.getAll().first() }, { }, - HostCellRenderer() + PlatformCellRenderer() ).component.addItemListener { if (it.stateChange == ItemEvent.SELECTED) { - val selectedHost = it.itemSelectable.selectedObjects.first() as Host - refreshDomainsTable(selectedHost) + val selectedPlatform = it.itemSelectable.selectedObjects.first() as Platform + refreshDomainsTable(selectedPlatform) } } } @@ -68,47 +71,51 @@ class DomainRegistrySettings : BoundConfigurable(message("settings.domain-regist } } - private fun canModifyDomain() = hostsComboBoxModel.selected?.domains?.map { it.toString() }?.contains(domainsTable.selectedObject) == false + private fun canModifyDomain() : Boolean { + val platform = platformComboBoxModel.selectedItem as Platform? ?: return false + + return platform.domains.map { it.toString() }.contains(domainsTable.selectedObject) + } private fun addDomain() { - val host = hostsComboBoxModel.selected ?: return - val dialog = RegisterDomainDialog(domainsRegistry = domainRegistry, hosts = hosts) + val platform = platformComboBoxModel.selected ?: return + val dialog = RegisterDomainDialog(domainsRegistry = domainRegistry, platforms = platforms) if (dialog.showAndGet()) { - val hostDomains = domainRegistry.getOrDefault(host.id.toString(), setOf()) - domainRegistry = domainRegistry.plus(Pair(host.id.toString(), hostDomains.plus(dialog.domain))) - refreshDomainsTable(host) + val domains = domainRegistry.getOrDefault(platform.id.toString(), setOf()) + domainRegistry = domainRegistry.plus(Pair(platform.id.toString(), domains.plus(dialog.domain))) + refreshDomainsTable(platform) } } private fun removeDomain() { - val host = hostsComboBoxModel.selected ?: return + val platform = platformComboBoxModel.selected ?: return val remove = domainsTable.selectedObject ?: return - val hostDomains = domainRegistry.getOrDefault(host.id.toString(), setOf()) + val domains = domainRegistry.getOrDefault(platform.id.toString(), setOf()) - domainRegistry = domainRegistry.plus(Pair(host.id.toString(), hostDomains.minus(remove))) + domainRegistry = domainRegistry.plus(Pair(platform.id.toString(), domains.minus(remove))) - refreshDomainsTable(host) + refreshDomainsTable(platform) } private fun editDomain() { - val host = hostsComboBoxModel.selected ?: return + val platform = platformComboBoxModel.selected ?: return val domain = domainsTable.selectedObject ?: return - val dialog = RegisterDomainDialog(domain, domainRegistry, hosts) + val dialog = RegisterDomainDialog(domain, domainRegistry, platforms) if (dialog.showAndGet()) { - val existingUrls = domainRegistry.getOrDefault(host.id.toString(), setOf()) + val existingUrls = domainRegistry.getOrDefault(platform.id.toString(), setOf()) - domainRegistry = domainRegistry.plus(Pair(host.id.toString(), existingUrls.minus(domain).plus(dialog.domain))) + domainRegistry = domainRegistry.plus(Pair(platform.id.toString(), existingUrls.minus(domain).plus(dialog.domain))) - refreshDomainsTable(host) + refreshDomainsTable(platform) } } - private fun refreshDomainsTable(host: Host) { - domainsTableModel.items = host.domains.map { it.toString() }.toList() + domainRegistry.getOrDefault(host.id.toString(), setOf()) + private fun refreshDomainsTable(platform: Platform) { + domainsTableModel.items = platform.domains.map { it.toString() }.toList() + domainRegistry.getOrDefault(platform.id.toString(), setOf()) } private fun createDomainsTableModel(domains: List = listOf()): ListTableModel = ListTableModel( @@ -127,9 +134,9 @@ class DomainRegistrySettings : BoundConfigurable(message("settings.domain-regist domainRegistry = settings.customHostDomains - val host = hostsComboBoxModel.selected ?: return + val platform = platformComboBoxModel.selected ?: return - refreshDomainsTable(host) + refreshDomainsTable(platform) } override fun isModified() : Boolean { @@ -141,12 +148,20 @@ class DomainRegistrySettings : BoundConfigurable(message("settings.domain-regist settings.customHostDomains = domainRegistry } + + override fun onChange() { + val current = platformComboBoxModel.selectedItem as? Platform + + platformComboBoxModel.removeAll() + platformComboBoxModel.add(platforms.getAll().toList()) + platformComboBoxModel.selectedItem = current?.let { platforms.getById(it.id) } + } } class RegisterDomainDialog( var domain: String = "", private val domainsRegistry: Map>, - private val hosts: Hosts + private val platforms: PlatformRepository ) : DialogWrapper(false) { init { title = message("settings.auto-detect.register-domain-dialog.title") @@ -162,7 +177,7 @@ class RegisterDomainDialog( .withValidationOnApply { notBlank(it.text) ?: domain(it.text) ?: - exists(it.text, hosts.toSet().flatMap { host -> host.domains.map { domain -> domain.toString() } } ) ?: + exists(it.text, platforms.getAll().flatMap { platform -> platform.domains.map { domain -> domain.toString() } } ) ?: exists(it.text, domainsRegistry.values.flatten()) } diff --git a/src/main/kotlin/uk/co/ben_gibson/git/link/ui/settings/ProjectSettingsConfigurable.kt b/src/main/kotlin/uk/co/ben_gibson/git/link/ui/settings/ProjectSettingsConfigurable.kt index 1fc5b26..e96b9e4 100644 --- a/src/main/kotlin/uk/co/ben_gibson/git/link/ui/settings/ProjectSettingsConfigurable.kt +++ b/src/main/kotlin/uk/co/ben_gibson/git/link/ui/settings/ProjectSettingsConfigurable.kt @@ -3,35 +3,37 @@ package uk.co.ben_gibson.git.link.ui.settings import com.intellij.openapi.components.service import com.intellij.openapi.options.BoundConfigurable import com.intellij.openapi.project.Project +import com.intellij.ui.CollectionComboBoxModel import com.intellij.ui.layout.panel import uk.co.ben_gibson.git.link.GitLinkBundle.message -import uk.co.ben_gibson.git.link.git.Host +import uk.co.ben_gibson.git.link.platform.Platform +import uk.co.ben_gibson.git.link.platform.PlatformRepository import uk.co.ben_gibson.git.link.settings.ProjectSettings -import uk.co.ben_gibson.git.link.git.HostsProvider import uk.co.ben_gibson.git.link.settings.ApplicationSettings -import uk.co.ben_gibson.git.link.ui.components.HostCellRenderer +import uk.co.ben_gibson.git.link.ui.components.PlatformCellRenderer import uk.co.ben_gibson.git.link.ui.layout.reportBugLink import uk.co.ben_gibson.git.link.ui.validation.notBlank -import javax.swing.DefaultComboBoxModel +import java.util.* class ProjectSettingsConfigurable(project : Project) : BoundConfigurable(message("settings.general.group.title")), ApplicationSettings.ChangeListener { - private val hosts = service().provide() + private val platforms = service() private val settings = project.service() - private val hostsComboBoxModel = DefaultComboBoxModel(hosts.toArray()) - private val initialHost = settings.host?.let { hosts.getById(it) } + private val platformComboBoxModel = CollectionComboBoxModel(platforms.getAll().toList()) + private val initialPlatform = settings.host?.let { platforms.getById(it) } init { service().registerListener(this) } override fun createPanel() = panel { - row(message("settings.general.field.host.label")) { + row(message("settings.general.field.platform.label")) { comboBox( - hostsComboBoxModel, - { initialHost }, + platformComboBoxModel, + { initialPlatform }, { settings.host = it?.id?.toString() }, - HostCellRenderer() + PlatformCellRenderer() ) + .comment(message("settings.general.field.platform.help")) } row(message("settings.general.field.fallback-branch.label")) { textField(settings::fallbackBranch) @@ -46,12 +48,7 @@ class ProjectSettingsConfigurable(project : Project) : BoundConfigurable(message row(message("settings.general.field.force-https.label")) { checkBox(message("settings.general.field.force-https.label"), settings::forceHttps) }.largeGapAfter() -// row("Generate URLs to current file using") { -// buttonGroup(settings::generateUrlTo) { -// radioButton("Commit", ContextType.COMMIT) -// radioButton("Branch", ContextType.BRANCH) -// } -// }.largeGapAfter() + row(message("settings.general.field.check-commit-on-remote.label")) { checkBox( message("settings.general.field.check-commit-on-remote.label"), @@ -66,11 +63,10 @@ class ProjectSettingsConfigurable(project : Project) : BoundConfigurable(message } override fun onChange() { - val current = hostsComboBoxModel.selectedItem as? Host - val updatedHosts = service().provide(); + val current = platformComboBoxModel.selectedItem as? Platform - hostsComboBoxModel.removeAllElements(); - hostsComboBoxModel.addAll(updatedHosts.toSet()); - hostsComboBoxModel.selectedItem = current?.let { updatedHosts.getById(it.id) } + platformComboBoxModel.removeAll() + platformComboBoxModel.add(platforms.getAll().toList()) + platformComboBoxModel.selectedItem = current?.let { platforms.getById(it.id) } } } \ No newline at end of file diff --git a/src/main/kotlin/uk/co/ben_gibson/git/link/url/factory/TemplatedUrlFactoryProvider.kt b/src/main/kotlin/uk/co/ben_gibson/git/link/url/factory/TemplatedUrlFactoryProvider.kt index 837825d..58fc29f 100644 --- a/src/main/kotlin/uk/co/ben_gibson/git/link/url/factory/TemplatedUrlFactoryProvider.kt +++ b/src/main/kotlin/uk/co/ben_gibson/git/link/url/factory/TemplatedUrlFactoryProvider.kt @@ -2,12 +2,12 @@ package uk.co.ben_gibson.git.link.url.factory import com.intellij.openapi.components.Service import com.intellij.openapi.components.service -import uk.co.ben_gibson.git.link.git.* +import uk.co.ben_gibson.git.link.platform.* import uk.co.ben_gibson.git.link.settings.ApplicationSettings import uk.co.ben_gibson.git.link.url.template.UrlTemplates import java.util.UUID -val HOST_MAP = mapOf( +val PLATFORM_MAP = mapOf( GitHub::class.java to UrlTemplates.gitHub(), GitLab::class.java to UrlTemplates.gitLab(), Gitee::class.java to UrlTemplates.gitee(), @@ -20,15 +20,15 @@ val HOST_MAP = mapOf( @Service class TemplatedUrlFactoryProvider() { - fun forHost(host: Host): TemplatedUrlFactory { - if (host is Custom) { - return customHost(host) + fun forPlatform(platform: Platform): TemplatedUrlFactory { + if (platform is Custom) { + return customPlatform(platform) } - return TemplatedUrlFactory(HOST_MAP.getValue(host::class.java)) + return TemplatedUrlFactory(PLATFORM_MAP.getValue(platform::class.java)) } - private fun customHost(host: Custom): TemplatedUrlFactory { + private fun customPlatform(host: Custom): TemplatedUrlFactory { val config = service().customHosts.first { UUID.fromString(it.id).equals(host.id) } return TemplatedUrlFactory(UrlTemplates(config.fileAtBranchTemplate, config.fileAtCommitTemplate, config.commitTemplate)) diff --git a/src/main/kotlin/uk/co/ben_gibson/git/link/url/factory/UrlFactoryLocator.kt b/src/main/kotlin/uk/co/ben_gibson/git/link/url/factory/UrlFactoryLocator.kt index a38060e..68aed55 100644 --- a/src/main/kotlin/uk/co/ben_gibson/git/link/url/factory/UrlFactoryLocator.kt +++ b/src/main/kotlin/uk/co/ben_gibson/git/link/url/factory/UrlFactoryLocator.kt @@ -2,14 +2,15 @@ package uk.co.ben_gibson.git.link.url.factory import com.intellij.openapi.components.Service import com.intellij.openapi.components.service -import uk.co.ben_gibson.git.link.git.* +import uk.co.ben_gibson.git.link.platform.Chromium +import uk.co.ben_gibson.git.link.platform.Platform @Service class UrlFactoryLocator { - fun locate(host: Host) : UrlFactory { - return when(host) { + fun locate(platform: Platform) : UrlFactory { + return when(platform) { is Chromium -> service() - else -> service().forHost(host) + else -> service().forPlatform(platform) } } } \ No newline at end of file diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index e5d66cb..937be2a 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -17,7 +17,7 @@ - + @@ -28,7 +28,7 @@ /> {0} notifications.performance=GitLink taking too long? Try disabling the 'Check commit on remote' setting -notifications.could-not-detect-host=GitLink could not detect your remote host -notifications.host-detected=GitLink has detected {0} as your remote host +notifications.could-not-detect-platform=GitLink could not detect which platform you use +notifications.platform-detected.message=GitLink has automatically detected {0} as your platform. +notifications.platform-detected.action=Not right? Configure manually... notifications.copied-to-clipboard=URL copied to clipboard title.settings = Settings settings.general.group.title=GitLink -settings.general.field.host.label=Host +settings.general.field.platform.label=Platform +settings.general.field.platform.help=Determines the URL format. Note, both cloud hosted and self-hosted deployments are supported. settings.general.field.fallback-branch.label=Fallback branch settings.general.field.fallback-branch.help=When generating a file URL, if the current branch does not exist on the remote, this will be used instead settings.general.field.remote.label=Remote @@ -43,25 +45,24 @@ settings.auto-detect.table.column.domain=Domain settings.auto-detect.register-domain-dialog.title=Register Domain -settings.custom-host.group.title=Custom Hosts -settings.custom-host.table.empty=No custom hosts -settings.custom-host.table.column.name=Name -settings.custom-host.table.column.domain=Domain +settings.custom-platform.group.title=Custom Platform +settings.custom-platform.table.empty=No custom platforms +settings.custom-platform.table.column.name=Name +settings.custom-platform.table.column.domain=Domain -settings.custom-host.add-dialog.title=Add Custom Host -settings.custom-host.add-dialog.field.name.label=Name -settings.custom-host.add-dialog.field.name.comment=What's the host called? e.g. GitHub -settings.custom-host.add-dialog.field.domain.label=Domain -settings.custom-host.add-dialog.field.domain.comment=The domain, for example, custom-host.com. This will be used\ - to auto-detect the host when opening a new project. -settings.custom-host.add-dialog.field.file-at-branch-template.label=File at branch template -settings.custom-host.add-dialog.field.file-at-branch-template.comment=This template will be used when opening a file on a \ +settings.custom-platform.add-dialog.title=Add Custom Platform +settings.custom-platform.add-dialog.field.name.label=Name +settings.custom-platform.add-dialog.field.name.comment=What's the Platform called? e.g. GitHub +settings.custom-platform.add-dialog.field.domain.label=Domain +settings.custom-platform.add-dialog.field.domain.comment=The domain, for example, foo.com that this platform should be used on +settings.custom-platform.add-dialog.field.file-at-branch-template.label=File at branch template +settings.custom-platform.add-dialog.field.file-at-branch-template.comment=This template will be used when opening a file on a \ specific branch. For example, https://my-custom-host.com/repo/foo/blob/{branch}/{file:path}/{file:name}{line-block:start}#L{line:start}-L{line:end}{line-block:end} -settings.custom-host.add-dialog.field.file-at-commit-template.label=File at commit template -settings.custom-host.add-dialog.field.file-at-commit-template.comment=This template will be used when opening a file at \ +settings.custom-platform.add-dialog.field.file-at-commit-template.label=File at commit template +settings.custom-platform.add-dialog.field.file-at-commit-template.comment=This template will be used when opening a file at \ specific commit. For example, {remote:url}/blob/{commit}/{file:path}/{file:name}{line-block:start}#L{line:start}-L{line:end}{line-block:end} -settings.custom-host.add-dialog.field.commit-template.label=Commit template -settings.custom-host.add-dialog.field.commit-template.comment=This template will be used when opening a commit. For example, {remote:url}/commit/{commit} +settings.custom-platform.add-dialog.field.commit-template.label=Commit template +settings.custom-platform.add-dialog.field.commit-template.comment=This template will be used when opening a commit. For example, {remote:url}/commit/{commit} validation.required=Required validation.alpha-numeric=Invalid characters, only alphanumeric characters are supported @@ -71,12 +72,12 @@ validation.invalid-domain=Invalid domain validation.invalid-url-template=Invalid URL template validation.exists=Value already exists -hosts.github.name=GitHub -hosts.gitlab.name=GitLab -hosts.bitbucket.cloud.name=Bitbucket Cloud -hosts.bitbucket.server.name=Bitbucket Server -hosts.gitea.name=Gitea -hosts.gogs.name=Gogs -hosts.azure.name=Azure -hosts.gitee.name=Gitee -hosts.chromium.name=Chromium (Experimental) \ No newline at end of file +platform.github.name=GitHub +platform.gitlab.name=GitLab +platform.bitbucket.cloud.name=Bitbucket Cloud +platform.bitbucket.server.name=Bitbucket Server +platform.gitea.name=Gitea +platform.gogs.name=Gogs +platform.azure.name=Azure +platform.gitee.name=Gitee +platform.chromium.name=Chromium (Experimental) \ No newline at end of file