From 7efc2c1432b45cc6ad1333bf8d0e3357685a7d06 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Wed, 16 Mar 2016 18:00:10 -0400 Subject: [PATCH] [FIXED JENKINS-33409] Incorrect repository browser detection when multiple refspecs were configured, even with the same URL. --- src/main/java/hudson/plugins/git/GitSCM.java | 32 ++++++----- .../plugins/git/browser/GithubWebTest.java | 54 ++++++++++++++++++- 2 files changed, 71 insertions(+), 15 deletions(-) diff --git a/src/main/java/hudson/plugins/git/GitSCM.java b/src/main/java/hudson/plugins/git/GitSCM.java index 1772658359..d24fa6c216 100644 --- a/src/main/java/hudson/plugins/git/GitSCM.java +++ b/src/main/java/hudson/plugins/git/GitSCM.java @@ -319,22 +319,28 @@ public GitRepositoryBrowser getBrowser() { } @Override public RepositoryBrowser guessBrowser() { - if (remoteRepositories != null && remoteRepositories.size() == 1) { - List uris = remoteRepositories.get(0).getURIs(); - if (uris.size() == 1) { - String uri = uris.get(0).toString(); - // TODO make extensible by introducing an abstract GitRepositoryBrowserDescriptor - Matcher m = Pattern.compile("(https://github[.]com/[^/]+/[^/]+)[.]git").matcher(uri); - if (m.matches()) { - return new GithubWeb(m.group(1) + "/"); - } - m = Pattern.compile("git@github[.]com:([^/]+/[^/]+)[.]git").matcher(uri); - if (m.matches()) { - return new GithubWeb("https://github.com/" + m.group(1) + "/"); + Set webUrls = new HashSet(); + if (remoteRepositories != null) { + for (RemoteConfig config : remoteRepositories) { + for (URIish uriIsh : config.getURIs()) { + String uri = uriIsh.toString(); + // TODO make extensible by introducing an abstract GitRepositoryBrowserDescriptor + Matcher m = Pattern.compile("(https://github[.]com/[^/]+/[^/]+)[.]git").matcher(uri); + if (m.matches()) { + webUrls.add(m.group(1) + "/"); + } + m = Pattern.compile("git@github[.]com:([^/]+/[^/]+)[.]git").matcher(uri); + if (m.matches()) { + webUrls.add("https://github.com/" + m.group(1) + "/"); + } } } } - return null; + if (webUrls.size() == 1) { + return new GithubWeb(webUrls.iterator().next()); + } else { + return null; + } } public boolean isCreateAccountBasedOnEmail() { diff --git a/src/test/java/hudson/plugins/git/browser/GithubWebTest.java b/src/test/java/hudson/plugins/git/browser/GithubWebTest.java index 073dc3952e..7ef3e876d1 100644 --- a/src/test/java/hudson/plugins/git/browser/GithubWebTest.java +++ b/src/test/java/hudson/plugins/git/browser/GithubWebTest.java @@ -4,23 +4,26 @@ package hudson.plugins.git.browser; -import hudson.model.Run; import hudson.plugins.git.GitChangeLogParser; import hudson.plugins.git.GitChangeSet; import hudson.plugins.git.GitChangeSet.Path; import hudson.plugins.git.GitSCM; import hudson.scm.RepositoryBrowser; -import java.io.File; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; +import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; +import jenkins.plugins.git.AbstractGitSCMSource; +import jenkins.scm.api.SCMHead; +import org.eclipse.jgit.transport.RefSpec; import static org.junit.Assert.*; import org.junit.Test; +import org.jvnet.hudson.test.Issue; import org.xml.sax.SAXException; @@ -117,6 +120,53 @@ private void assertGuessURL(String repo, String web) { assertEquals(web, actual); } + @Issue("JENKINS-33409") + @Test + public void guessBrowserSCMSource() throws Exception { + // like GitSCMSource: + assertGuessURL("https://github.com/kohsuke/msv.git", "https://github.com/kohsuke/msv/", "+refs/heads/*:refs/remotes/origin/*"); + // like GitHubSCMSource: + assertGuessURL("https://github.com/kohsuke/msv.git", "https://github.com/kohsuke/msv/", "+refs/heads/*:refs/remotes/origin/*", "+refs/pull/*/merge:refs/remotes/origin/pr/*"); + } + private void assertGuessURL(String remote, String web, String... refSpecs) { + RepositoryBrowser guess = new MockSCMSource(remote, refSpecs).build(new SCMHead("master")).guessBrowser(); + String actual = guess instanceof GithubWeb ? ((GithubWeb) guess).getRepoUrl() : null; + assertEquals(web, actual); + } + private static class MockSCMSource extends AbstractGitSCMSource { + private final String remote; + private final String[] refSpecs; + MockSCMSource(String remote, String[] refSpecs) { + super(null); + this.remote = remote; + this.refSpecs = refSpecs; + } + @Override + public String getCredentialsId() { + return null; + } + @Override + public String getRemote() { + return remote; + } + @Override + public String getIncludes() { + return "*"; + } + @Override + public String getExcludes() { + return ""; + } + @Override + protected List getRefSpecs() { + List result = new ArrayList(); + for (String refSpec : refSpecs) { + result.add(new RefSpec(refSpec)); + } + return result; + } + } + private GitChangeSet createChangeSet(String rawchangelogpath) throws IOException, SAXException { final GitChangeLogParser logParser = new GitChangeLogParser(false); final List changeSetList = logParser.parse(GithubWebTest.class.getResourceAsStream(rawchangelogpath));