ben-gibson / GitLink

A Jetbrains plugin that opens a local file under Git version control in its remote host using the default browser.
https://plugins.jetbrains.com/plugin/8183-gitlink
MIT License
671 stars 58 forks source link

Can't generate links if repo contains `git+ssh` remote #229

Closed wjbuys closed 1 year ago

wjbuys commented 1 year ago

We have a Github Enterprise server (redacted actual hostname with example.com) which only supports SSH remotes, so we have a remote like:

[remote "origin"]
    url = git+ssh://git@git.example.com/some/repo
    fetch = +refs/heads/*:refs/remotes/origin/*

I configured this as a custom host:

image

But when I try to copy the link, I get this error:

java.net.URISyntaxException: Illegal character in hostname at index 10: http://git+git.example.com/some/repo
    at java.base/java.net.URI$Parser.fail(URI.java:2913)
    at java.base/java.net.URI$Parser.parseHostname(URI.java:3448)
    at java.base/java.net.URI$Parser.parseServer(URI.java:3297)
    at java.base/java.net.URI$Parser.parseAuthority(URI.java:3216)
    at java.base/java.net.URI$Parser.parseHierarchical(URI.java:3158)
    at java.base/java.net.URI$Parser.parse(URI.java:3114)
    at java.base/java.net.URI.<init>(URI.java:685)
    at java.base/java.net.URI.<init>(URI.java:786)
    at uk.co.ben_gibson.git.link.git.RemoteExtensionsKt.getHttpUrl(RemoteExtensions.kt:43)
    at uk.co.ben_gibson.git.link.pipeline.GenerateUrlMiddleware.invoke(GenerateUrlMiddleware.kt:24)
    at uk.co.ben_gibson.git.link.pipeline.Pipeline.next(Pipeline.kt:36)
    at uk.co.ben_gibson.git.link.pipeline.Pipeline.access$next(Pipeline.kt:11)
    at uk.co.ben_gibson.git.link.pipeline.Pipeline$next$1.invoke(Pipeline.kt:37)
    at uk.co.ben_gibson.git.link.pipeline.Pipeline$next$1.invoke(Pipeline.kt:36)
    at uk.co.ben_gibson.git.link.pipeline.TimerMiddleware.invoke(TimerMiddleware.kt:23)
    at uk.co.ben_gibson.git.link.pipeline.Pipeline.next(Pipeline.kt:36)
    at uk.co.ben_gibson.git.link.pipeline.Pipeline.access$next(Pipeline.kt:11)
    at uk.co.ben_gibson.git.link.pipeline.Pipeline$next$1.invoke(Pipeline.kt:37)
    at uk.co.ben_gibson.git.link.pipeline.Pipeline$next$1.invoke(Pipeline.kt:36)
    at uk.co.ben_gibson.git.link.pipeline.ForceHttpsMiddleware.invoke(ForceHttpsMiddleware.kt:14)
    at uk.co.ben_gibson.git.link.pipeline.Pipeline.next(Pipeline.kt:36)
    at uk.co.ben_gibson.git.link.pipeline.Pipeline.access$next(Pipeline.kt:11)
    at uk.co.ben_gibson.git.link.pipeline.Pipeline$next$1.invoke(Pipeline.kt:37)
    at uk.co.ben_gibson.git.link.pipeline.Pipeline$next$1.invoke(Pipeline.kt:36)
    at uk.co.ben_gibson.git.link.pipeline.RecordHitMiddleware.invoke(RecordHitMiddleware.kt:13)
    at uk.co.ben_gibson.git.link.pipeline.Pipeline.next(Pipeline.kt:36)
    at uk.co.ben_gibson.git.link.pipeline.Pipeline.access$next(Pipeline.kt:11)
    at uk.co.ben_gibson.git.link.pipeline.Pipeline$next$1.invoke(Pipeline.kt:37)
    at uk.co.ben_gibson.git.link.pipeline.Pipeline$next$1.invoke(Pipeline.kt:36)
    at uk.co.ben_gibson.git.link.pipeline.HostPollMiddleware.invoke(HostPollMiddleware.kt:15)
    at uk.co.ben_gibson.git.link.pipeline.Pipeline.next(Pipeline.kt:36)
    at uk.co.ben_gibson.git.link.pipeline.Pipeline.access$next(Pipeline.kt:11)
    at uk.co.ben_gibson.git.link.pipeline.Pipeline$next$1.invoke(Pipeline.kt:37)
    at uk.co.ben_gibson.git.link.pipeline.Pipeline$next$1.invoke(Pipeline.kt:36)
    at uk.co.ben_gibson.git.link.pipeline.RatePluginMiddleware.invoke(RatePluginMiddleware.kt:15)
    at uk.co.ben_gibson.git.link.pipeline.Pipeline.next(Pipeline.kt:36)
    at uk.co.ben_gibson.git.link.pipeline.Pipeline.access$next(Pipeline.kt:11)
    at uk.co.ben_gibson.git.link.pipeline.Pipeline$next$1.invoke(Pipeline.kt:37)
    at uk.co.ben_gibson.git.link.pipeline.Pipeline$next$1.invoke(Pipeline.kt:36)
    at uk.co.ben_gibson.git.link.pipeline.ResolveContextMiddleware.invoke(ResolveContextMiddleware.kt:27)
    at uk.co.ben_gibson.git.link.pipeline.Pipeline.next(Pipeline.kt:36)
    at uk.co.ben_gibson.git.link.pipeline.Pipeline.accept(Pipeline.kt:30)
    at uk.co.ben_gibson.git.link.GitLinkRunnerKt$processGitLink$$inlined$runBackgroundableTask$1.run(progress.kt:38)
    at com.intellij.openapi.progress.impl.CoreProgressManager.startTask(CoreProgressManager.java:442)
    at com.intellij.openapi.progress.impl.ProgressManagerImpl.startTask(ProgressManagerImpl.java:114)
    at com.intellij.openapi.progress.impl.CoreProgressManager.lambda$runProcessWithProgressAsynchronously$5(CoreProgressManager.java:493)
    at com.intellij.openapi.progress.impl.ProgressRunner.lambda$submit$3(ProgressRunner.java:244)
    at com.intellij.openapi.progress.impl.CoreProgressManager.lambda$runProcess$2(CoreProgressManager.java:189)
    at com.intellij.openapi.progress.impl.CoreProgressManager.lambda$executeProcessUnderProgress$12(CoreProgressManager.java:608)
    at com.intellij.openapi.progress.impl.CoreProgressManager.registerIndicatorAndRun(CoreProgressManager.java:683)
    at com.intellij.openapi.progress.impl.CoreProgressManager.computeUnderProgress(CoreProgressManager.java:639)
    at com.intellij.openapi.progress.impl.CoreProgressManager.executeProcessUnderProgress(CoreProgressManager.java:607)
    at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:60)
    at com.intellij.openapi.progress.impl.CoreProgressManager.runProcess(CoreProgressManager.java:176)
    at com.intellij.openapi.progress.impl.ProgressRunner.lambda$submit$4(ProgressRunner.java:244)
    at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1700)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1$1.run(Executors.java:668)
    at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1$1.run(Executors.java:665)
    at java.base/java.security.AccessController.doPrivileged(Native Method)
    at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1.run(Executors.java:665)
    at java.base/java.lang.Thread.run(Thread.java:829)
ben-gibson commented 1 year ago

You can use the GitHub host type rather than a custom one. Host isn't really a good name for the option in the settings as it's mostly about the URL format i.e. using the host GitHub will work with Github Enterprise server.

The protocol of the remote url you posted, git+ssh://git@git.example.com/some/repo, doesn't look quite right though, shouldn't it be ssh://git@git.example.com/some/repo?

wjbuys commented 1 year ago

Hm, that's odd, I've re-cloned that repo with a more recent git client, and I get a more normal remote url:

[remote "origin"]
    url = git@git.example.com/some/repo.git
    fetch = +refs/heads/*:refs/remotes/origin/*

I think that git+ssh url was a quirk of an older ssh bastion setup or something. Changing to use the new remote without the + fixes it for me.

Thanks for the help!