Browse Source

Add support for single-slash URI

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>
tags/v0.10.1
Christian Halstrick 13 years ago
parent
commit
be2ddff6a7

+ 37
- 0
org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/URIishTest.java View 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);

+ 36
- 19
org.eclipse.jgit/src/org/eclipse/jgit/transport/URIish.java View 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);
}
}
}
}

Loading…
Cancel
Save