summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMykola Nikishov <mn@mn.com.ua>2009-12-18 01:03:51 +0200
committerRobin Rosenberg <robin.rosenberg@dewire.com>2009-12-19 00:47:06 +0100
commit21b6f3434ebc84f493405d890a3768d55375a721 (patch)
tree053f332f953824628686addd90b415d9a9650395
parentf8f75f8a52a30cf2a7d793ba15cd74410ba64534 (diff)
downloadjgit-21b6f3434ebc84f493405d890a3768d55375a721.tar.gz
jgit-21b6f3434ebc84f493405d890a3768d55375a721.zip
Method to get a 'humanish' name from a path
Change-Id: Iec0688232bd59d4626111d77633109918e8e1df3 Signed-off-by: Mykola Nikishov <mn@mn.com.ua> Signed-off-by: Robin Rosenberg <robin.rosenberg@dewire.com>
-rw-r--r--org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Clone.java12
-rw-r--r--org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/URIishTest.java122
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/transport/URIish.java52
3 files changed, 178 insertions, 8 deletions
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Clone.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Clone.java
index a136df5618..3fe50d6682 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Clone.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Clone.java
@@ -93,15 +93,11 @@ class Clone extends AbstractFetchCommand {
final URIish uri = new URIish(sourceUri);
if (localName == null) {
- String p = uri.getPath();
- while (p.endsWith("/"))
- p = p.substring(0, p.length() - 1);
- final int s = p.lastIndexOf('/');
- if (s < 0)
+ try {
+ localName = uri.getHumanishName();
+ } catch (IllegalArgumentException e) {
throw die("cannot guess local name from " + sourceUri);
- localName = p.substring(s + 1);
- if (localName.endsWith(".git"))
- localName = localName.substring(0, localName.length() - 4);
+ }
}
if (gitdir == null)
gitdir = new File(localName, ".git");
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/URIishTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/URIishTest.java
index 2598fdc1f5..d2d37a7edc 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/URIishTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/URIishTest.java
@@ -1,4 +1,5 @@
/*
+ * Copyright (C) 2009, Mykola Nikishov <mn@mn.com.ua>
* Copyright (C) 2008, Robin Rosenberg <robin.rosenberg@dewire.com>
* Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org>
* and other copyright owners as documented in the project's IP log.
@@ -44,10 +45,14 @@
package org.eclipse.jgit.transport;
+import java.net.URISyntaxException;
+
import junit.framework.TestCase;
public class URIishTest extends TestCase {
+ private static final String GIT_SCHEME = "git://";
+
public void testUnixFile() throws Exception {
final String str = "/home/m y";
URIish u = new URIish(str);
@@ -244,4 +249,121 @@ public class URIishTest extends TestCase {
assertEquals(u.setPass(null).toPrivateString(), u.toString());
assertEquals(u, new URIish(str));
}
+
+ public void testGetNullHumanishName() {
+ try {
+ new URIish().getHumanishName();
+ fail("path must be not null");
+ } catch (IllegalArgumentException e) {
+ // expected
+ }
+ }
+
+ public void testGetEmptyHumanishName() throws URISyntaxException {
+ try {
+ new URIish(GIT_SCHEME).getHumanishName();
+ fail("empty path is useless");
+ } catch (IllegalArgumentException e) {
+ // expected
+ }
+ }
+
+ public void testGetAbsEmptyHumanishName() {
+ try {
+ new URIish().getHumanishName();
+ fail("empty path is useless");
+ } catch (IllegalArgumentException e) {
+ // expected
+ }
+ }
+
+ public void testGetValidWithEmptySlashDotGitHumanishName()
+ throws IllegalArgumentException, URISyntaxException {
+ String humanishName = new URIish("/a/b/.git").getHumanishName();
+ assertEquals("b", humanishName);
+ }
+
+ public void testGetWithSlashDotGitHumanishName() throws URISyntaxException {
+ assertEquals("", new URIish("/.git").getHumanishName());
+ }
+
+ public void testGetTwoSlashesDotGitHumanishName() throws URISyntaxException {
+ assertEquals("", new URIish("/.git").getHumanishName());
+ }
+
+ public void testGetValidHumanishName() throws IllegalArgumentException,
+ URISyntaxException {
+ String humanishName = new URIish(GIT_SCHEME + "abc").getHumanishName();
+ assertEquals("abc", humanishName);
+ }
+
+ public void testGetValidSlashHumanishName()
+ throws IllegalArgumentException, URISyntaxException {
+ String humanishName = new URIish(GIT_SCHEME + "abc/").getHumanishName();
+ assertEquals("abc", humanishName);
+ }
+
+ public void testGetSlashValidSlashHumanishName()
+ throws IllegalArgumentException, URISyntaxException {
+ String humanishName = new URIish("/abc/").getHumanishName();
+ assertEquals("abc", humanishName);
+ }
+
+ public void testGetSlashValidSlashDotGitSlashHumanishName()
+ throws IllegalArgumentException, URISyntaxException {
+ String humanishName = new URIish("/abc/.git").getHumanishName();
+ assertEquals("abc", humanishName);
+ }
+
+ public void testGetSlashSlashDotGitSlashHumanishName()
+ throws IllegalArgumentException, URISyntaxException {
+ final String humanishName = new URIish(GIT_SCHEME + "/abc//.git")
+ .getHumanishName();
+ assertEquals("may return an empty humanish name", "", humanishName);
+ }
+
+ public void testGetSlashesValidSlashHumanishName()
+ throws IllegalArgumentException, URISyntaxException {
+ String humanishName = new URIish("/a/b/c/").getHumanishName();
+ assertEquals("c", humanishName);
+ }
+
+ public void testGetValidDotGitHumanishName()
+ throws IllegalArgumentException, URISyntaxException {
+ String humanishName = new URIish(GIT_SCHEME + "abc.git")
+ .getHumanishName();
+ assertEquals("abc", humanishName);
+ }
+
+ public void testGetValidDotGitSlashHumanishName()
+ throws IllegalArgumentException, URISyntaxException {
+ String humanishName = new URIish(GIT_SCHEME + "abc.git/")
+ .getHumanishName();
+ assertEquals("abc", humanishName);
+ }
+
+ public void testGetValidWithSlashDotGitHumanishName()
+ throws IllegalArgumentException, URISyntaxException {
+ String humanishName = new URIish("/abc.git").getHumanishName();
+ assertEquals("abc", humanishName);
+ }
+
+ public void testGetValidWithSlashDotGitSlashHumanishName()
+ throws IllegalArgumentException, URISyntaxException {
+ String humanishName = new URIish("/abc.git/").getHumanishName();
+ assertEquals("abc", humanishName);
+ }
+
+ public void testGetValidWithSlashesDotGitHumanishName()
+ throws IllegalArgumentException, URISyntaxException {
+ String humanishName = new URIish("/a/b/c.git").getHumanishName();
+ assertEquals("c", humanishName);
+ }
+
+ public void testGetValidWithSlashesDotGitSlashHumanishName()
+ throws IllegalArgumentException, URISyntaxException {
+ String humanishName = new URIish("/a/b/c.git/").getHumanishName();
+ assertEquals("c", humanishName);
+ }
+
}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/URIish.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/URIish.java
index e1df85248e..1f7bad1838 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/URIish.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/URIish.java
@@ -1,4 +1,5 @@
/*
+ * Copyright (C) 2009, Mykola Nikishov <mn@mn.com.ua>
* Copyright (C) 2008, Robin Rosenberg <robin.rosenberg@dewire.com>
* Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org>
* and other copyright owners as documented in the project's IP log.
@@ -56,6 +57,8 @@ import java.util.regex.Pattern;
* any special character is written as-is.
*/
public class URIish {
+ private static final String DOT_GIT = ".git";
+
private static final Pattern FULL_URI = Pattern
.compile("^(?:([a-z][a-z0-9+-]+)://(?:([^/]+?)(?::([^/]+?))?@)?(?:([^/]+?))?(?::(\\d+))?)?((?:[A-Za-z]:)?/.+)$");
@@ -363,4 +366,53 @@ public class URIish {
return r.toString();
}
+
+ /**
+ * Get the "humanish" part of the path. Some examples of a 'humanish' part
+ * for a full path:
+ * <table>
+ * <tr>
+ * <th>Path</th>
+ * <th>Humanish part</th>
+ * </tr>
+ * <tr>
+ * <td><code>/path/to/repo.git</code></td>
+ * <td rowspan="4"><code>repo</code></td>
+ * </tr>
+ * <tr>
+ * <td><code>/path/to/repo.git/</code></td>
+ * </tr>
+ * <tr>
+ * <td><code>/path/to/repo/.git</code></td>
+ * </tr>
+ * <tr>
+ * <td><code>/path/to/repo/</code></td>
+ * </tr>
+ * <tr>
+ * <td><code>/path//to</code></td>
+ * <td>an empty string</td>
+ * </tr>
+ * </table>
+ *
+ * @return the "humanish" part of the path. May be an empty string. Never
+ * {@code null}.
+ * @throws IllegalArgumentException
+ * if it's impossible to determine a humanish part, or path is
+ * {@code null} or empty
+ * @see #getPath
+ */
+ public String getHumanishName() throws IllegalArgumentException {
+ if ("".equals(getPath()) || getPath() == null)
+ throw new IllegalArgumentException();
+ String[] elements = getPath().split("/");
+ if (elements.length == 0)
+ throw new IllegalArgumentException();
+ String result = elements[elements.length - 1];
+ if (DOT_GIT.equals(result))
+ result = elements[elements.length - 2];
+ else if (result.endsWith(DOT_GIT))
+ result = result.substring(0, result.length() - DOT_GIT.length());
+ return result;
+ }
+
}