Browse Source

Fix URIish parsing of absolute scp-style URIs

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>
stable-0.10
Shawn O. Pearce 14 years ago
parent
commit
6af7e4d91a
  1. 14
      org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/URIishTest.java
  2. 32
      org.eclipse.jgit/src/org/eclipse/jgit/transport/URIish.java

14
org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/URIishTest.java

@ -172,7 +172,7 @@ public class URIishTest extends TestCase {
assertEquals(u, new URIish(str)); assertEquals(u, new URIish(str));
} }
public void testScpStyleWithoutUser() throws Exception { public void testScpStyleWithoutUserRelativePath() throws Exception {
final String str = "example.com:some/p ath"; final String str = "example.com:some/p ath";
URIish u = new URIish(str); URIish u = new URIish(str);
assertNull(u.getScheme()); assertNull(u.getScheme());
@ -184,6 +184,18 @@ public class URIishTest extends TestCase {
assertEquals(u, new URIish(str)); 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 { public void testScpStyleWithUser() throws Exception {
final String str = "user@example.com:some/p ath"; final String str = "user@example.com:some/p ath";
URIish u = new URIish(str); URIish u = new URIish(str);

32
org.eclipse.jgit/src/org/eclipse/jgit/transport/URIish.java

@ -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 * 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 // + OPT_USER_PWD_P //
+ HOST_P // + HOST_P //
+ ":(" // + ":(" //
@ -163,6 +163,16 @@ public class URIish implements Serializable {
+ RELATIVE_PATH_P // + 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 scheme;
private String path; private String path;
@ -200,19 +210,27 @@ public class URIish implements Serializable {
n2e(matcher.group(6)) + n2e(matcher.group(7)), n2e(matcher.group(6)) + n2e(matcher.group(7)),
scheme); scheme);
} else { } else {
matcher = SCP_URI.matcher(s); matcher = RELATIVE_SCP_URI.matcher(s);
if (matcher.matches()) { if (matcher.matches()) {
user = matcher.group(1); user = matcher.group(1);
pass = matcher.group(2); pass = matcher.group(2);
host = matcher.group(3); host = matcher.group(3);
path = matcher.group(4); path = matcher.group(4);
} else { } else {
matcher = LOCAL_FILE.matcher(s); matcher = ABSOLUTE_SCP_URI.matcher(s);
if (matcher.matches()) { if (matcher.matches()) {
path = matcher.group(1); user = matcher.group(1);
} else pass = matcher.group(2);
throw new URISyntaxException(s, host = matcher.group(3);
JGitText.get().cannotParseGitURIish); 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);
}
} }
} }
} }

Loading…
Cancel
Save