]> source.dussan.org Git - jgit.git/commitdiff
Add support for single-slash URI 03/1703/4
authorChristian Halstrick <christian.halstrick@sap.com>
Wed, 6 Oct 2010 15:35:06 +0000 (17:35 +0200)
committerChristian Halstrick <christian.halstrick@sap.com>
Fri, 8 Oct 2010 21:57:52 +0000 (23:57 +0200)
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 <christian.halstrick@sap.com>
org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/URIishTest.java
org.eclipse.jgit/src/org/eclipse/jgit/transport/URIish.java

index 6a53810d0790af46ce3af024c0b0e6ffb05a50f3..fe8e38fc7e9b5cc15c7f9e589b9d213ad8f297f1 100644 (file)
@@ -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);
index 82f80c547e5bd0ccc4ff35f66bfbdf71802ffb78..94f4a67d58dc6a0773a82d4454ec0ea1d2c8840e 100644 (file)
@@ -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);
+                               }
                        }
                }
        }