From 8dda567e23dafcc132a92a3ba4413f0ca3996874 Mon Sep 17 00:00:00 2001 From: Anatolii Bazko Date: Tue, 4 Apr 2023 16:31:00 +0300 Subject: [PATCH] fix: Support Azure DevOps repository urls without project (#490) Signed-off-by: Anatolii Bazko --- .../server/azure/devops/AzureDevOpsURLParser.java | 15 +++++++++------ .../server/azure/devops/AzureDevOpsUrl.java | 6 +++++- .../azure/devops/AzureDevOpsURLParserTest.java | 1 + 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/wsmaster/che-core-api-factory-azure-devops/src/main/java/org/eclipse/che/api/factory/server/azure/devops/AzureDevOpsURLParser.java b/wsmaster/che-core-api-factory-azure-devops/src/main/java/org/eclipse/che/api/factory/server/azure/devops/AzureDevOpsURLParser.java index a35987378c..5cad6fda72 100644 --- a/wsmaster/che-core-api-factory-azure-devops/src/main/java/org/eclipse/che/api/factory/server/azure/devops/AzureDevOpsURLParser.java +++ b/wsmaster/che-core-api-factory-azure-devops/src/main/java/org/eclipse/che/api/factory/server/azure/devops/AzureDevOpsURLParser.java @@ -51,7 +51,7 @@ public class AzureDevOpsURLParser { this.azureDevOpsPattern = compile( format( - "^https://(?[^@]++)?@?%s/(?[^/]++)/?(?[^/]++)/_git/" + "^https://(?[^@]++)?@?%s/(?[^/]++)/((?[^/]++)/)?_git/" + "(?[^?]++)" + "([?&]path=(?[^&]++))?" + "([?&]version=GT(?[^&]++))?" @@ -67,17 +67,20 @@ public class AzureDevOpsURLParser { public AzureDevOpsUrl parse(String url) { Matcher matcher = azureDevOpsPattern.matcher(url); if (!matcher.matches()) { - throw new IllegalArgumentException( - format( - "The given url %s is not a valid. It should start with https://@%s/ or https://%s/", - url, azureDevOpsScmApiEndpointHost, azureDevOpsScmApiEndpointHost)); + throw new IllegalArgumentException(format("The given url %s is not a valid.", url)); + } + + String project = null; + try { + project = matcher.group("project"); + } catch (IllegalArgumentException e) { } - String project = matcher.group("project"); String repoName = matcher.group("repoName"); if (repoName.endsWith(".git")) { repoName = repoName.substring(0, repoName.length() - 4); } + String organization = matcher.group("organization"); String branch = matcher.group("branch"); String tag = matcher.group("tag"); diff --git a/wsmaster/che-core-api-factory-azure-devops/src/main/java/org/eclipse/che/api/factory/server/azure/devops/AzureDevOpsUrl.java b/wsmaster/che-core-api-factory-azure-devops/src/main/java/org/eclipse/che/api/factory/server/azure/devops/AzureDevOpsUrl.java index ac25cf9655..e69d102bf8 100644 --- a/wsmaster/che-core-api-factory-azure-devops/src/main/java/org/eclipse/che/api/factory/server/azure/devops/AzureDevOpsUrl.java +++ b/wsmaster/che-core-api-factory-azure-devops/src/main/java/org/eclipse/che/api/factory/server/azure/devops/AzureDevOpsUrl.java @@ -149,7 +149,11 @@ public class AzureDevOpsUrl extends DefaultFactoryUrl { } private StringJoiner getRepoPathJoiner() { - return new StringJoiner("/").add(hostName).add(organization).add(project); + StringJoiner repoPath = new StringJoiner("/").add(hostName).add(organization); + if (project != null) { + repoPath.add("_git"); + } + return repoPath; } @Override diff --git a/wsmaster/che-core-api-factory-azure-devops/src/test/java/org/eclipse/che/api/factory/server/azure/devops/AzureDevOpsURLParserTest.java b/wsmaster/che-core-api-factory-azure-devops/src/test/java/org/eclipse/che/api/factory/server/azure/devops/AzureDevOpsURLParserTest.java index 9a631c9565..cbe43a6206 100644 --- a/wsmaster/che-core-api-factory-azure-devops/src/test/java/org/eclipse/che/api/factory/server/azure/devops/AzureDevOpsURLParserTest.java +++ b/wsmaster/che-core-api-factory-azure-devops/src/test/java/org/eclipse/che/api/factory/server/azure/devops/AzureDevOpsURLParserTest.java @@ -133,6 +133,7 @@ public class AzureDevOpsURLParserTest { null, "MyTag" }, + {"https://MyOrg@dev.azure.com/MyOrg/_git/MyRepo", "MyOrg", null, "MyRepo", null, null}, }; }