Skip to content

Commit

Permalink
Improve Azure URL generation (#334)
Browse files Browse the repository at this point in the history
  • Loading branch information
ben-gibson authored Aug 31, 2024
1 parent ac364fa commit c56b708
Show file tree
Hide file tree
Showing 4 changed files with 45 additions and 56 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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@", "")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
}

Expand Down Expand Up @@ -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
}
}
19 changes: 1 addition & 18 deletions src/test/kotlin/uk/co/ben_gibson/git/link/git/RemoteTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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"
),
)
)
}

Expand Down
25 changes: 15 additions & 10 deletions src/test/kotlin/uk/co/ben_gibson/git/link/url/AzureTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -28,57 +28,62 @@ 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,
UrlOptions.UrlOptionsFileAtCommit(
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,
UrlOptions.UrlOptionsFileAtCommit(
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"
)
)
}
Expand Down

0 comments on commit c56b708

Please sign in to comment.