From be2ddff6a72cff3d28b87d038a96194a6e2bd272 Mon Sep 17 00:00:00 2001 From: Christian Halstrick Date: Wed, 6 Oct 2010 17:35:06 +0200 Subject: [PATCH] Add support for single-slash URI In bug 323571 it is mentioned that if you call 'toURI().toURL().toString()' on a java.io.File you cannot pass that string to jgit as an URIish. Problem is that the passed URI looks like 'file:/C:/a/b.txt' and that we where expecting double slashes after scheme':'. This fix adds support for this single-slash file URLs. Bug: 323571 Change-Id: I866a76a4fcd0c3b58e0d26a104fc4564e7ba5999 Signed-off-by: Christian Halstrick --- .../eclipse/jgit/transport/URIishTest.java | 37 +++++++++++++ .../org/eclipse/jgit/transport/URIish.java | 55 ++++++++++++------- 2 files changed, 73 insertions(+), 19 deletions(-) diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/URIishTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/URIishTest.java index 6a53810d07..fe8e38fc7e 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/URIishTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/URIishTest.java @@ -45,6 +45,8 @@ package org.eclipse.jgit.transport; +import java.io.File; +import java.io.IOException; import java.net.URISyntaxException; import junit.framework.TestCase; @@ -448,6 +450,41 @@ public class URIishTest extends TestCase { assertEquals(u, new URIish(str)); } + public void testFileProtocol() throws IllegalArgumentException, + URISyntaxException, IOException { + // as defined by git docu + URIish u = new URIish("file:///a/b.txt"); + assertEquals("file", u.getScheme()); + assertFalse(u.isRemote()); + assertNull(u.getHost()); + assertNull(u.getPass()); + assertEquals("/a/b.txt", u.getPath()); + assertEquals(-1, u.getPort()); + assertNull(u.getUser()); + assertEquals("b.txt", u.getHumanishName()); + + File tmp = File.createTempFile("jgitUnitTest", ".tmp"); + u = new URIish(tmp.toURI().toString()); + assertEquals("file", u.getScheme()); + assertFalse(u.isRemote()); + assertNull(u.getHost()); + assertNull(u.getPass()); + assertTrue(u.getPath().contains("jgitUnitTest")); + assertEquals(-1, u.getPort()); + assertNull(u.getUser()); + assertTrue(u.getHumanishName().startsWith("jgitUnitTest")); + + u = new URIish("file:/a/b.txt"); + assertEquals("file", u.getScheme()); + assertFalse(u.isRemote()); + assertNull(u.getHost()); + assertNull(u.getPass()); + assertEquals("/a/b.txt", u.getPath()); + assertEquals(-1, u.getPort()); + assertNull(u.getUser()); + assertEquals("b.txt", u.getHumanishName()); + } + public void testMissingPort() throws URISyntaxException { final String incorrectSshUrl = "ssh://some-host:/path/to/repository.git"; URIish u = new URIish(incorrectSshUrl); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/URIish.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/URIish.java index 82f80c547e..94f4a67d58 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/URIish.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/URIish.java @@ -143,7 +143,17 @@ public class URIish implements Serializable { + "$"); /** - * A pattern matching SCP URI's of the form user@host:path/to/repo.git + * A pattern matching a URI for the scheme 'file' which has only ':/' as + * separator between scheme and path. Standard file URIs have '://' as + * separator, but java.io.File.toURI() constructs those URIs. + */ + private static final Pattern SINGLE_SLASH_FILE_URI = Pattern.compile("^" // + + "(file):(/(?!/)" // + + PATH_P // + + ")$"); + + /** + * A pattern matching a SCP URI's of the form user@host:path/to/repo.git */ private static final Pattern SCP_URI = Pattern.compile("^" // + OPT_USER_PWD_P // @@ -173,30 +183,37 @@ public class URIish implements Serializable { */ public URIish(String s) throws URISyntaxException { s = s.replace('\\', '/'); - Matcher matcher = FULL_URI.matcher(s); + Matcher matcher = SINGLE_SLASH_FILE_URI.matcher(s); if (matcher.matches()) { scheme = matcher.group(1); - user = matcher.group(2); - pass = matcher.group(3); - host = matcher.group(4); - if (matcher.group(5) != null) - port = Integer.parseInt(matcher.group(5)); - path = cleanLeadingSlashes( - n2e(matcher.group(6)) + n2e(matcher.group(7)), scheme); + path = cleanLeadingSlashes(matcher.group(2), scheme); } else { - matcher = SCP_URI.matcher(s); + matcher = FULL_URI.matcher(s); if (matcher.matches()) { - user = matcher.group(1); - pass = matcher.group(2); - host = matcher.group(3); - path = matcher.group(4); + scheme = matcher.group(1); + user = matcher.group(2); + pass = matcher.group(3); + host = matcher.group(4); + if (matcher.group(5) != null) + port = Integer.parseInt(matcher.group(5)); + path = cleanLeadingSlashes( + n2e(matcher.group(6)) + n2e(matcher.group(7)), + scheme); } else { - matcher = LOCAL_FILE.matcher(s); + matcher = SCP_URI.matcher(s); if (matcher.matches()) { - path = matcher.group(1); - } else - throw new URISyntaxException(s, - JGitText.get().cannotParseGitURIish); + user = matcher.group(1); + pass = matcher.group(2); + host = matcher.group(3); + path = matcher.group(4); + } else { + matcher = LOCAL_FILE.matcher(s); + if (matcher.matches()) { + path = matcher.group(1); + } else + throw new URISyntaxException(s, + JGitText.get().cannotParseGitURIish); + } } } } -- 2.39.5