package org.eclipse.jgit.transport;
+import java.io.File;
+import java.io.IOException;
import java.net.URISyntaxException;
import junit.framework.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);
+ "$");
/**
- * 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 //
*/
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);
+ }
}
}
}