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>
This commit is contained in:
parent
b087bba3bd
commit
6af7e4d91a
|
@ -172,7 +172,7 @@ public void testGitProtoWindows() throws Exception {
|
||||||
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 void testScpStyleWithoutUser() throws Exception {
|
||||||
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);
|
||||||
|
|
|
@ -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 URIish(String s) throws URISyntaxException {
|
||||||
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…
Reference in New Issue