diff --git a/src/main/kotlin/uk/co/ben_gibson/git/link/git/RemoteExtensions.kt b/src/main/kotlin/uk/co/ben_gibson/git/link/git/RemoteExtensions.kt index 6fe241e..979e715 100644 --- a/src/main/kotlin/uk/co/ben_gibson/git/link/git/RemoteExtensions.kt +++ b/src/main/kotlin/uk/co/ben_gibson/git/link/git/RemoteExtensions.kt @@ -16,11 +16,7 @@ val GitRemote.httpUrl : URL? get() { var url = firstUrl ?: return null url = url.trim() - - // Azure expects the .git postfix on the repo name unlike everything else - if (!url.contains("dev.azure")) { - url = url.removeSuffix(".git") - } + .removeSuffix(".git") // Do not try to remove the port if the URL uses the SSH protocol in the SCP syntax e.g. // 'git@github.com:foo.git' as it does not support port definitions. Attempting to remove the port @@ -30,12 +26,6 @@ val GitRemote.httpUrl : URL? get() { url = url.replace(":\\d{1,5}".toRegex(), "") // remove the port } - // Hack for azure - if (url.startsWith("git@ssh.dev.azure.com")) { - url = url.replace("^git@ssh.".toRegex(), "git@") - .replace(":v\\d{1,5}".toRegex(), "") // remove v3 from git@ssh.dev.azure.com:v3/ben-gibson/test/test - } - if (!url.startsWith("http")) { url = url .replace("git@", "") diff --git a/src/main/kotlin/uk/co/ben_gibson/git/link/url/factory/AzureUrlFactory.kt b/src/main/kotlin/uk/co/ben_gibson/git/link/url/factory/AzureUrlFactory.kt index 1156445..7f16356 100644 --- a/src/main/kotlin/uk/co/ben_gibson/git/link/url/factory/AzureUrlFactory.kt +++ b/src/main/kotlin/uk/co/ben_gibson/git/link/url/factory/AzureUrlFactory.kt @@ -8,26 +8,13 @@ import uk.co.ben_gibson.url.* @Service class AzureUrlFactory: UrlFactory { - private val host = Host("dev.azure.com") - override fun createUrl(baseUrl: URL, options: UrlOptions): URL { - val basePathParts = baseUrl.path.toString() - .split("/") - .toMutableList() - - // Azure expects this to be in the path between the project and repo name. It's already included when cloning the project using HTTPS, but not when cloning the project using SSH. - if (!basePathParts.contains("_git")) { - // urls might have an option company component, if that's the case we need to insert _git in between company/project and repository parts - val indexToAddGit = if (basePathParts.size >= 3) 2 else 1 - basePathParts.add(indexToAddGit, "_git") - } - - val baseUrl = URL(scheme = Scheme.https(), host = host, path = Path(basePathParts.joinToString("/"))) + val normalisedBaseUrl = normaliseBaseUrl(baseUrl) return when (options) { - is UrlOptions.UrlOptionsFileAtBranch -> createUrlToFileAtBranch(baseUrl, options) - is UrlOptions.UrlOptionsFileAtCommit -> createUrlToFileAtCommit(baseUrl, options) - is UrlOptions.UrlOptionsCommit -> createUrlToCommit(baseUrl, options) + is UrlOptions.UrlOptionsFileAtBranch -> createUrlToFileAtBranch(normalisedBaseUrl, options) + is UrlOptions.UrlOptionsFileAtCommit -> createUrlToFileAtCommit(normalisedBaseUrl, options) + is UrlOptions.UrlOptionsCommit -> createUrlToCommit(normalisedBaseUrl, options) } } @@ -81,4 +68,28 @@ class AzureUrlFactory: UrlFactory { .withParameter("lineStartColumn", "1") .withParameter("lineEndColumn", "1") } + + private fun normaliseBaseUrl(baseUrl: URL): URL { + // Convert ssh.dev.azure.com:v3/ben-gibson/test/test to dev.azure.com:ben-gibson/test/_git/test.git + val basePathParts = baseUrl.path + .toString() + .removePrefix("v3/") + .plus(".git") // Azure expects .git after the repo name + .split("/") + .toMutableList() + + // Azure expects this to be in the path between the project and repo name. It's already included when cloning the project using HTTPS, but not when cloning the project using SSH. + if (!basePathParts.contains("_git")) { + // urls might have an option company component, if that's the case we need to insert _git in between company/project and repository parts + val indexToAddGit = if (basePathParts.size >= 3) 2 else 1 + basePathParts.add(indexToAddGit, "_git") + } + + var normalisedBaseUrl = baseUrl.copy(path = Path(basePathParts.joinToString("/"))) + + if (baseUrl.host.toString().startsWith("ssh.")) { + normalisedBaseUrl = normalisedBaseUrl.copy(host = Host(baseUrl.host.toString().removePrefix("ssh."))) + } + return normalisedBaseUrl + } } \ No newline at end of file diff --git a/src/test/kotlin/uk/co/ben_gibson/git/link/git/RemoteTest.kt b/src/test/kotlin/uk/co/ben_gibson/git/link/git/RemoteTest.kt index 6d16b2b..9882eec 100644 --- a/src/test/kotlin/uk/co/ben_gibson/git/link/git/RemoteTest.kt +++ b/src/test/kotlin/uk/co/ben_gibson/git/link/git/RemoteTest.kt @@ -44,24 +44,7 @@ class RemoteTest { Arguments.of( "xy://custom.gitlab.url/group/project.git", "http://custom.gitlab.url/group/project" - ), - Arguments.of( - "git@ssh.dev.azure.com:v3/ben-gibson/test/test", - "http://dev.azure.com/ben-gibson/test/test" - ), - Arguments.of( - "http://ben-gibson@dev.azure.com/ben-gibson/test/_git/test", - "http://dev.azure.com/ben-gibson/test/_git/test" - ), - // Azure does not strip .git like the others. - Arguments.of( - "git@ssh.dev.azure.com:v3/ben-gibson/test/test.git", - "http://dev.azure.com/ben-gibson/test/test.git" - ), - Arguments.of( - "http://ben-gibson@dev.azure.com/ben-gibson/test/_git/test.git", - "http://dev.azure.com/ben-gibson/test/_git/test.git" - ), + ) ) } diff --git a/src/test/kotlin/uk/co/ben_gibson/git/link/url/AzureTest.kt b/src/test/kotlin/uk/co/ben_gibson/git/link/url/AzureTest.kt index 04aaa50..e9ffcf3 100644 --- a/src/test/kotlin/uk/co/ben_gibson/git/link/url/AzureTest.kt +++ b/src/test/kotlin/uk/co/ben_gibson/git/link/url/AzureTest.kt @@ -28,17 +28,17 @@ class AzureTest { Arguments.of( REMOTE_BASE_URL_WITH_GIT, UrlOptions.UrlOptionsFileAtBranch(FILE, BRANCH, LINE_SELECTION), - "https://dev.azure.com/ben-gibson/_git/test?version=GBmaster&path=src%2FFoo.java&line=10&lineEnd=21&lineStartColumn=1&lineEndColumn=1" + "https://dev.azure.com/ben-gibson/_git/test.git?version=GBmaster&path=src%2FFoo.java&line=10&lineEnd=21&lineStartColumn=1&lineEndColumn=1" ), Arguments.of( REMOTE_BASE_URL_WITH_GIT, UrlOptions.UrlOptionsFileAtBranch(FILE, BRANCH), - "https://dev.azure.com/ben-gibson/_git/test?version=GBmaster&path=src%2FFoo.java" + "https://dev.azure.com/ben-gibson/_git/test.git?version=GBmaster&path=src%2FFoo.java" ), Arguments.of( REMOTE_BASE_URL_WITH_GIT, UrlOptions.UrlOptionsFileAtCommit(FILE, COMMIT, LINE_SELECTION), - "https://dev.azure.com/ben-gibson/_git/test?version=GCb032a0707beac9a2f24b1b7d97ee4f7156de182c&path=src%2FFoo.java&line=10&lineEnd=21&lineStartColumn=1&lineEndColumn=1" + "https://dev.azure.com/ben-gibson/_git/test.git?version=GCb032a0707beac9a2f24b1b7d97ee4f7156de182c&path=src%2FFoo.java&line=10&lineEnd=21&lineStartColumn=1&lineEndColumn=1" ), Arguments.of( REMOTE_BASE_URL_WITH_GIT, @@ -46,7 +46,7 @@ class AzureTest { File("resources", true, "src/foo", false), COMMIT ), - "https://dev.azure.com/ben-gibson/_git/test?version=GCb032a0707beac9a2f24b1b7d97ee4f7156de182c&path=src%2Ffoo%2Fresources" + "https://dev.azure.com/ben-gibson/_git/test.git?version=GCb032a0707beac9a2f24b1b7d97ee4f7156de182c&path=src%2Ffoo%2Fresources" ), Arguments.of( REMOTE_BASE_URL_WITH_GIT, @@ -54,31 +54,36 @@ class AzureTest { File("my-project", true, "", true), COMMIT ), - "https://dev.azure.com/ben-gibson/_git/test?version=GCb032a0707beac9a2f24b1b7d97ee4f7156de182c&path=%2F"), + "https://dev.azure.com/ben-gibson/_git/test.git?version=GCb032a0707beac9a2f24b1b7d97ee4f7156de182c&path=%2F"), Arguments.of( REMOTE_BASE_URL_WITH_GIT, UrlOptions.UrlOptionsFileAtCommit(FILE, COMMIT), - "https://dev.azure.com/ben-gibson/_git/test?version=GCb032a0707beac9a2f24b1b7d97ee4f7156de182c&path=src%2FFoo.java" + "https://dev.azure.com/ben-gibson/_git/test.git?version=GCb032a0707beac9a2f24b1b7d97ee4f7156de182c&path=src%2FFoo.java" ), Arguments.of( REMOTE_BASE_URL_WITH_GIT, UrlOptions.UrlOptionsCommit(COMMIT), - "https://dev.azure.com/ben-gibson/_git/test/commit/b032a0707beac9a2f24b1b7d97ee4f7156de182c" + "https://dev.azure.com/ben-gibson/_git/test.git/commit/b032a0707beac9a2f24b1b7d97ee4f7156de182c" ), Arguments.of( REMOTE_BASE_URL_WITHOUT_GIT, UrlOptions.UrlOptionsCommit(COMMIT), - "https://dev.azure.com/ben-gibson/_git/test/commit/b032a0707beac9a2f24b1b7d97ee4f7156de182c" + "https://dev.azure.com/ben-gibson/_git/test.git/commit/b032a0707beac9a2f24b1b7d97ee4f7156de182c" ), Arguments.of( REMOTE_BASE_URL_WITH_COMPANY_AND_GIT, UrlOptions.UrlOptionsCommit(COMMIT), - "https://dev.azure.com/company/project/_git/test/commit/b032a0707beac9a2f24b1b7d97ee4f7156de182c" + "https://dev.azure.com/company/project/_git/test.git/commit/b032a0707beac9a2f24b1b7d97ee4f7156de182c" ), Arguments.of( REMOTE_BASE_URL_WITH_COMPANY_WITHOUT_GIT, UrlOptions.UrlOptionsCommit(COMMIT), - "https://dev.azure.com/company/project/_git/test/commit/b032a0707beac9a2f24b1b7d97ee4f7156de182c" + "https://dev.azure.com/company/project/_git/test.git/commit/b032a0707beac9a2f24b1b7d97ee4f7156de182c" + ), + Arguments.of( + URL.fromString("https://ssh.dev.azure.com/v3/ben-gibson/test/test"), + UrlOptions.UrlOptionsCommit(COMMIT), + "https://dev.azure.com/ben-gibson/test/_git/test.git/commit/b032a0707beac9a2f24b1b7d97ee4f7156de182c" ) ) }