diff options
author | Robin Rosenberg <robin.rosenberg@dewire.com> | 2014-04-26 10:55:42 +0200 |
---|---|---|
committer | Robin Rosenberg <robin.rosenberg@dewire.com> | 2014-04-27 10:35:21 +0200 |
commit | 6605255d9906c5277d215396ebcc395484b9f10c (patch) | |
tree | 76476317d92fcee58cd5b6b3f7d6ebc178169560 | |
parent | 8923e67a1680d3a5fd7766cdce90d07bae1a407a (diff) | |
download | jgit-6605255d9906c5277d215396ebcc395484b9f10c.tar.gz jgit-6605255d9906c5277d215396ebcc395484b9f10c.zip |
Add methods to Repository to handle remote names
Instead of requiring the caller to know how to list remote
names or parse remote branch names, add a few utilities for
that.
Change-Id: Ib6b2403532f4abbce594a03c0b9da49d30b19f70
Signed-off-by: Robin Rosenberg <robin.rosenberg@dewire.com>
-rw-r--r-- | org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/RefTest.java | 46 | ||||
-rw-r--r-- | org.eclipse.jgit/src/org/eclipse/jgit/lib/Repository.java | 43 |
2 files changed, 89 insertions, 0 deletions
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/RefTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/RefTest.java index 26c4d12cc0..f2ed684511 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/RefTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/RefTest.java @@ -58,9 +58,11 @@ import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.Map; +import java.util.TreeSet; import org.eclipse.jgit.lib.Ref.Storage; import org.eclipse.jgit.lib.RefUpdate.Result; +import org.eclipse.jgit.storage.file.FileBasedConfig; import org.eclipse.jgit.test.resources.SampleDataRepositoryTestCase; import org.junit.Test; @@ -83,6 +85,50 @@ public class RefTest extends SampleDataRepositoryTestCase { } @Test + public void testRemoteNames() throws Exception { + FileBasedConfig config = db.getConfig(); + config.setBoolean(ConfigConstants.CONFIG_REMOTE_SECTION, + "origin", "dummy", true); + config.setBoolean(ConfigConstants.CONFIG_REMOTE_SECTION, + "ab/c", "dummy", true); + config.save(); + assertEquals("[ab/c, origin]", + new TreeSet<String>(db.getRemoteNames()).toString()); + + // one-level deep remote branch + assertEquals("master", + db.shortenRemoteBranchName("refs/remotes/origin/master")); + assertEquals("origin", db.getRemoteName("refs/remotes/origin/master")); + + // two-level deep remote branch + assertEquals("masta/r", + db.shortenRemoteBranchName("refs/remotes/origin/masta/r")); + assertEquals("origin", db.getRemoteName("refs/remotes/origin/masta/r")); + + // Remote with slash and one-level deep branch name + assertEquals("xmaster", + db.shortenRemoteBranchName("refs/remotes/ab/c/xmaster")); + assertEquals("ab/c", db.getRemoteName("refs/remotes/ab/c/xmaster")); + + // Remote with slash and two-level deep branch name + assertEquals("xmasta/r", + db.shortenRemoteBranchName("refs/remotes/ab/c/xmasta/r")); + assertEquals("ab/c", db.getRemoteName("refs/remotes/ab/c/xmasta/r")); + + // no such remote + assertNull(db.getRemoteName("refs/remotes/nosuchremote/x")); + assertNull(db.shortenRemoteBranchName("refs/remotes/nosuchremote/x")); + + // no such remote too, no branch name either + assertNull(db.getRemoteName("refs/remotes/abranch")); + assertNull(db.shortenRemoteBranchName("refs/remotes/abranch")); + + // // local branch + assertNull(db.getRemoteName("refs/heads/abranch")); + assertNull(db.shortenRemoteBranchName("refs/heads/abranch")); + } + + @Test public void testReadAllIncludingSymrefs() throws Exception { ObjectId masterId = db.resolve("refs/heads/master"); RefUpdate updateRef = db.updateRef("refs/remotes/origin/master"); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/Repository.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/Repository.java index c350dddb25..1538d277b1 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/Repository.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/Repository.java @@ -1276,6 +1276,40 @@ public abstract class Repository { /** * @param refName + * @return the remote branch name part of <code>refName</code>, i.e. without + * the <code>refs/remotes/<remote></code> prefix, if + * <code>refName</code> represents a remote tracking branch; + * otherwise null. + * @since 3.4 + */ + public String shortenRemoteBranchName(String refName) { + for (String remote : getRemoteNames()) { + String remotePrefix = Constants.R_REMOTES + remote + "/"; //$NON-NLS-1$ + if (refName.startsWith(remotePrefix)) + return refName.substring(remotePrefix.length()); + } + return null; + } + + /** + * @param refName + * @return the remote name part of <code>refName</code>, i.e. without the + * <code>refs/remotes/<remote></code> prefix, if + * <code>refName</code> represents a remote tracking branch; + * otherwise null. + * @since 3.4 + */ + public String getRemoteName(String refName) { + for (String remote : getRemoteNames()) { + String remotePrefix = Constants.R_REMOTES + remote + "/"; //$NON-NLS-1$ + if (refName.startsWith(remotePrefix)) + return remote; + } + return null; + } + + /** + * @param refName * @return a {@link ReflogReader} for the supplied refname, or null if the * named ref does not exist. * @throws IOException @@ -1613,4 +1647,13 @@ public abstract class Repository { throws IOException { new RebaseTodoFile(this).writeRebaseTodoFile(path, steps, append); } + + /** + * @return the names of all known remotes + * @since 3.4 + */ + public Set<String> getRemoteNames() { + return getConfig() + .getSubsections(ConfigConstants.CONFIG_REMOTE_SECTION); + } } |