diff --git a/pom.xml b/pom.xml index a2f4d38..e0ed9a3 100644 --- a/pom.xml +++ b/pom.xml @@ -50,10 +50,10 @@ - 1.580.1 - - 6 - + + 2.46.3 + + 7 diff --git a/src/main/java/com/github/terma/jenkins/githubprcoveragestatus/GitUtils.java b/src/main/java/com/github/terma/jenkins/githubprcoveragestatus/GitUtils.java index b44bbbe..f80ca60 100644 --- a/src/main/java/com/github/terma/jenkins/githubprcoveragestatus/GitUtils.java +++ b/src/main/java/com/github/terma/jenkins/githubprcoveragestatus/GitUtils.java @@ -23,6 +23,8 @@ @SuppressWarnings("WeakerAccess") public class GitUtils { + public static final Pattern HTTP_GITHUB_REPO_URL = Pattern.compile("^(http[s]?://[^/]*/[^/]*/[^/]*).*"); + public static final Pattern HTTP_GITHUB_USER_REPO_PATTERN = Pattern.compile("^(http[s]?://[^/]*)/([^/]*/[^/]*).*"); public static final Pattern SSH_GITHUB_USER_REPO_PATTERN = Pattern.compile("^.+:(.+)"); @@ -40,6 +42,33 @@ public static String getRepoName(String gitRepoUrl) { return userRepo[1]; } + /** + * Extract repo URL part form Git URL. For example https://github.com/terma/test/pull/1 + * should be converted to https://github.com/terma/test + * + * @param gitUrl - any type of Git URL + * @return repo URL exclude branches or pull request parts + */ + public static String getRepoUrl(String gitUrl) { + String repoUrl = null; + + if (gitUrl != null) { + if (gitUrl.startsWith("git@")) { + repoUrl = gitUrl; + } else { + Matcher m = HTTP_GITHUB_REPO_URL.matcher(gitUrl); + if (m.matches()) repoUrl = m.group(1); + } + } + + if (repoUrl == null) { + throw new IllegalArgumentException(String.format("Invalid Git Hub repository URL: %s", gitUrl)); + } + + if (repoUrl.endsWith(".git")) repoUrl = repoUrl.substring(0, repoUrl.length() - ".git".length()); + return repoUrl; + } + /** * Extract user name and repo name from Git URL. * For example: https://github.com/terma/jenkins-github-coverage-updater.git @@ -62,7 +91,7 @@ public static String getUserRepo(final String gitRepoUrl) { } if (userRepo == null) { - throw new IllegalStateException(String.format("Invalid Git Hub repository URL: %s", gitRepoUrl)); + throw new IllegalArgumentException(String.format("Invalid Git Hub repository URL: %s", gitRepoUrl)); } if (userRepo.endsWith(".git")) userRepo = userRepo.substring(0, userRepo.length() - ".git".length()); diff --git a/src/main/java/com/github/terma/jenkins/githubprcoveragestatus/PrIdAndUrlUtils.java b/src/main/java/com/github/terma/jenkins/githubprcoveragestatus/PrIdAndUrlUtils.java index b0498d1..96ca7c6 100644 --- a/src/main/java/com/github/terma/jenkins/githubprcoveragestatus/PrIdAndUrlUtils.java +++ b/src/main/java/com/github/terma/jenkins/githubprcoveragestatus/PrIdAndUrlUtils.java @@ -75,12 +75,20 @@ public static int getPrId( return id; } + /** + * @param scmVars - scmVars + * @param build - build + * @param listener - listener + * @return - Git URL always Repo URL even if CHANGE_URL passed which in general PR URL + * @throws IOException inherited + * @throws InterruptedException inherited + */ public static String getGitUrl(final Map scmVars, final Run build, final TaskListener listener) throws IOException, InterruptedException { Map envVars = build.getEnvironment(listener); final String gitUrl = envVars.get(GIT_URL_PROPERTY); final String changeUrl = envVars.get(CHANGE_URL_PROPERTY); if (gitUrl != null) return gitUrl; - else if (changeUrl != null) return changeUrl; + else if (changeUrl != null) return GitUtils.getRepoUrl(changeUrl); // change URL is full path to PR, so we normalize it to repo URL before return else if (scmVars != null && scmVars.containsKey(GIT_URL_PROPERTY)) return scmVars.get(GIT_URL_PROPERTY); else throw new UnsupportedOperationException("Can't find " + GIT_URL_PROPERTY + " or " + CHANGE_URL_PROPERTY + " in envs: " + envVars); diff --git a/src/test/java/com/github/terma/jenkins/githubprcoveragestatus/GitUtilsTest.java b/src/test/java/com/github/terma/jenkins/githubprcoveragestatus/GitUtilsTest.java index 05e909c..9c4d141 100644 --- a/src/test/java/com/github/terma/jenkins/githubprcoveragestatus/GitUtilsTest.java +++ b/src/test/java/com/github/terma/jenkins/githubprcoveragestatus/GitUtilsTest.java @@ -39,6 +39,38 @@ public void getUserRepo() { GitUtils.getUserRepo("git@github.com:terma/jenkins-github-coverage-updater")); } + @Test + public void getRepoUrl() { + try { + GitUtils.getRepoUrl(null); + Assert.fail(); + } catch (IllegalArgumentException e) { + // all good + } + + Assert.assertEquals( + "https://github.com/terma/jenkins-github-coverage-updater", + GitUtils.getRepoUrl("https://github.com/terma/jenkins-github-coverage-updater")); + + Assert.assertEquals("https://github.com/terma/jenkins-github-coverage-updater", + GitUtils.getRepoUrl("https://github.com/terma/jenkins-github-coverage-updater.git")); + + Assert.assertEquals("git@github.com:terma/jenkins-github-coverage-updater", + GitUtils.getRepoUrl("git@github.com:terma/jenkins-github-coverage-updater.git")); + + Assert.assertEquals("git@github.com:terma/jenkins-github-coverage-updater", + GitUtils.getRepoUrl("git@github.com:terma/jenkins-github-coverage-updater")); + + Assert.assertEquals("https://github.com/terma/test", + GitUtils.getRepoUrl("https://github.com/terma/test/pull/1")); + + Assert.assertEquals("http://github.com/terma/test", + GitUtils.getRepoUrl("http://github.com/terma/test/pull/1")); + + Assert.assertEquals("https://github.com/terma/test", + GitUtils.getRepoUrl("https://github.com/terma/test/tree/branch")); + } + @Test public void getRepoName() { Assert.assertEquals( diff --git a/src/test/java/com/github/terma/jenkins/githubprcoveragestatus/JacocoParserTest.java b/src/test/java/com/github/terma/jenkins/githubprcoveragestatus/JacocoParserTest.java index 25ef44b..cd12a95 100644 --- a/src/test/java/com/github/terma/jenkins/githubprcoveragestatus/JacocoParserTest.java +++ b/src/test/java/com/github/terma/jenkins/githubprcoveragestatus/JacocoParserTest.java @@ -50,7 +50,7 @@ public void throwExceptionWhenExtractCoverageFromJacocoAndNoLineTag() throws IOE Assert.fail("Where is my exception?"); } catch (Exception e) { String messageWithoutAbsolutePath = e.getMessage().replace(filePath, "FILE_PATH"); - Assert.assertEquals( + assertStringEqualsIgnoreSlashR( "Strange Jacoco report!\n" + "File path: FILE_PATH\n" + "Can't extract float value by XPath: /report/counter[@type='LINE']/@missed\n" + @@ -73,7 +73,7 @@ public void throwExceptionWhenExtractCoverageFromJacocoAndMissedNotNumber() thro Assert.fail("Where is my exception?"); } catch (Exception e) { String messageWithoutAbsolutePath = e.getMessage().replace(filePath, "FILE_PATH"); - Assert.assertEquals( + assertStringEqualsIgnoreSlashR( "Strange Jacoco report!\n" + "File path: FILE_PATH\n" + "Can't extract float value by XPath: /report/counter[@type='LINE']/@missed\n" + @@ -97,7 +97,7 @@ public void throwExceptionWhenExtractCoverageFromJacocoAndCoveredNotNumber() thr Assert.fail("Where is my exception?"); } catch (Exception e) { String messageWithoutAbsolutePath = e.getMessage().replace(filePath, "FILE_PATH"); - Assert.assertEquals( + assertStringEqualsIgnoreSlashR( "Strange Jacoco report!\n" + "File path: FILE_PATH\n" + "Can't extract float value by XPath: /report/counter[@type='LINE']/@covered\n" + @@ -121,4 +121,8 @@ public void throwExceptionWhenExtractCoverageFromJacocoAndNoFile() throws IOExce } } + private static void assertStringEqualsIgnoreSlashR(String a, String b) { + Assert.assertEquals(a.replaceAll("\\r", ""), b.replaceAll("\\r", "")); + } + } diff --git a/src/test/java/com/github/terma/jenkins/githubprcoveragestatus/PrIdAndUrlUtilsTest.java b/src/test/java/com/github/terma/jenkins/githubprcoveragestatus/PrIdAndUrlUtilsTest.java index 80c1482..c2ef4a4 100644 --- a/src/test/java/com/github/terma/jenkins/githubprcoveragestatus/PrIdAndUrlUtilsTest.java +++ b/src/test/java/com/github/terma/jenkins/githubprcoveragestatus/PrIdAndUrlUtilsTest.java @@ -41,6 +41,7 @@ public class PrIdAndUrlUtilsTest { private static final int PR_ID_INT = 12; private static final int CHANGE_ID_INT = 13; private static final int SCM_ENVS_PR_ID_INT = 14; + private static final String CHANGE_URL = "http://test.github.com/terma/test-repo/pr/123"; private Run build = mock(Run.class); private EnvVars envVars = mock(EnvVars.class); @@ -120,9 +121,9 @@ public void getGitUrlGitUrlHasPriority() throws IOException, InterruptedExceptio @Test public void getGitUrlIfGitUrlsNullChangeUrlIsUsed() throws IOException, InterruptedException { when(envVars.get(PrIdAndUrlUtils.GIT_URL_PROPERTY)).thenReturn(null); - when(envVars.get(PrIdAndUrlUtils.CHANGE_URL_PROPERTY)).thenReturn(CHANGE_ID); + when(envVars.get(PrIdAndUrlUtils.CHANGE_URL_PROPERTY)).thenReturn(CHANGE_URL); - Assert.assertEquals(CHANGE_ID, PrIdAndUrlUtils.getGitUrl(null, build, listener)); + Assert.assertEquals("http://test.github.com/terma/test-repo", PrIdAndUrlUtils.getGitUrl(null, build, listener)); } @Test