]> source.dussan.org Git - jgit.git/commitdiff
Fix URIish parsing of absolute scp-style URIs 74/1874/1
authorShawn O. Pearce <spearce@spearce.org>
Tue, 9 Nov 2010 22:36:01 +0000 (14:36 -0800)
committerShawn O. Pearce <spearce@spearce.org>
Tue, 9 Nov 2010 22:36:01 +0000 (14:36 -0800)
We stopped handling URIs such as "example.com:/some/p ath", because
this was confused with the Windows absolute path syntax of "c:/path".
Support absolute style scp URIs again, but only when the host name
is more than 2 characters long.

Change-Id: I9ab049bc9aad2d8d42a78c7ab34fa317a28efc1a
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/URIishTest.java
org.eclipse.jgit/src/org/eclipse/jgit/transport/URIish.java

index fe8e38fc7e9b5cc15c7f9e589b9d213ad8f297f1..93d909d7dbc94fa23ce585c1cd2f6c575fda1469 100644 (file)
@@ -172,7 +172,7 @@ public class URIishTest extends TestCase {
                assertEquals(u, new URIish(str));
        }
 
-       public void testScpStyleWithoutUser() throws Exception {
+       public void testScpStyleWithoutUserRelativePath() throws Exception {
                final String str = "example.com:some/p ath";
                URIish u = new URIish(str);
                assertNull(u.getScheme());
@@ -184,6 +184,18 @@ public class URIishTest extends TestCase {
                assertEquals(u, new URIish(str));
        }
 
+       public void testScpStyleWithoutUserAbsolutePath() throws Exception {
+               final String str = "example.com:/some/p ath";
+               URIish u = new URIish(str);
+               assertNull(u.getScheme());
+               assertTrue(u.isRemote());
+               assertEquals("/some/p ath", u.getPath());
+               assertEquals("example.com", u.getHost());
+               assertEquals(-1, u.getPort());
+               assertEquals(str, u.toString());
+               assertEquals(u, new URIish(str));
+       }
+
        public void testScpStyleWithUser() throws Exception {
                final String str = "user@example.com:some/p ath";
                URIish u = new URIish(str);
index 94f4a67d58dc6a0773a82d4454ec0ea1d2c8840e..bc24516a65b65e1abba76b3a0cfdc7ff233cada4 100644 (file)
@@ -155,7 +155,7 @@ public class URIish implements Serializable {
        /**
         * A pattern matching a SCP URI's of the form user@host:path/to/repo.git
         */
-       private static final Pattern SCP_URI = Pattern.compile("^" //
+       private static final Pattern RELATIVE_SCP_URI = Pattern.compile("^" //
                        + OPT_USER_PWD_P //
                        + HOST_P //
                        + ":(" //
@@ -163,6 +163,16 @@ public class URIish implements Serializable {
                        + RELATIVE_PATH_P //
                        + ")$");
 
+       /**
+        * A pattern matching a SCP URI's of the form user@host:/path/to/repo.git
+        */
+       private static final Pattern ABSOLUTE_SCP_URI = Pattern.compile("^" //
+                       + OPT_USER_PWD_P //
+                       + "([^/:]{2,})" //
+                       + ":(" //
+                       + "/" + RELATIVE_PATH_P //
+                       + ")$");
+
        private String scheme;
 
        private String path;
@@ -200,19 +210,27 @@ public class URIish implements Serializable {
                                                n2e(matcher.group(6)) + n2e(matcher.group(7)),
                                                scheme);
                        } else {
-                               matcher = SCP_URI.matcher(s);
+                               matcher = RELATIVE_SCP_URI.matcher(s);
                                if (matcher.matches()) {
                                        user = matcher.group(1);
                                        pass = matcher.group(2);
                                        host = matcher.group(3);
                                        path = matcher.group(4);
                                } else {
-                                       matcher = LOCAL_FILE.matcher(s);
+                                       matcher = ABSOLUTE_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);
+                                       }
                                }
                        }
                }