Browse Source

Merge changes I2515a6ed,Ib6b24035

* changes:
  Fix ArrayIndexOutOfBoundsException in CreateBranchCommand
  Add methods to Repository to handle remote names
stable-3.4
Matthias Sohn 11 years ago committed by Gerrit Code Review @ Eclipse.org
parent
commit
8e4018390e
  1. 46
      org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/RefTest.java
  2. 11
      org.eclipse.jgit/src/org/eclipse/jgit/api/CreateBranchCommand.java
  3. 43
      org.eclipse.jgit/src/org/eclipse/jgit/lib/Repository.java

46
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.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.util.Map; import java.util.Map;
import java.util.TreeSet;
import org.eclipse.jgit.lib.Ref.Storage; import org.eclipse.jgit.lib.Ref.Storage;
import org.eclipse.jgit.lib.RefUpdate.Result; import org.eclipse.jgit.lib.RefUpdate.Result;
import org.eclipse.jgit.storage.file.FileBasedConfig;
import org.eclipse.jgit.test.resources.SampleDataRepositoryTestCase; import org.eclipse.jgit.test.resources.SampleDataRepositoryTestCase;
import org.junit.Test; import org.junit.Test;
@ -82,6 +84,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 @Test
public void testReadAllIncludingSymrefs() throws Exception { public void testReadAllIncludingSymrefs() throws Exception {
ObjectId masterId = db.resolve("refs/heads/master"); ObjectId masterId = db.resolve("refs/heads/master");

11
org.eclipse.jgit/src/org/eclipse/jgit/api/CreateBranchCommand.java

@ -246,12 +246,11 @@ public class CreateBranchCommand extends GitCommand<Ref> {
if (doConfigure) { if (doConfigure) {
StoredConfig config = repo.getConfig(); StoredConfig config = repo.getConfig();
String[] tokens = baseBranch.split("/", 4); //$NON-NLS-1$
boolean isRemote = tokens[1].equals("remotes"); //$NON-NLS-1$ String remoteName = repo.getRemoteName(baseBranch);
if (isRemote) { if (remoteName != null) {
// refs/remotes/<remote name>/<branch> String branchName = repo
String remoteName = tokens[2]; .shortenRemoteBranchName(baseBranch);
String branchName = tokens[3];
config config
.setString(ConfigConstants.CONFIG_BRANCH_SECTION, .setString(ConfigConstants.CONFIG_BRANCH_SECTION,
name, ConfigConstants.CONFIG_KEY_REMOTE, name, ConfigConstants.CONFIG_KEY_REMOTE,

43
org.eclipse.jgit/src/org/eclipse/jgit/lib/Repository.java

@ -1274,6 +1274,40 @@ public abstract class Repository {
return refName; return refName;
} }
/**
* @param refName
* @return the remote branch name part of <code>refName</code>, i.e. without
* the <code>refs/remotes/&lt;remote&gt;</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/&lt;remote&gt;</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 * @param refName
* @return a {@link ReflogReader} for the supplied refname, or null if the * @return a {@link ReflogReader} for the supplied refname, or null if the
@ -1613,4 +1647,13 @@ public abstract class Repository {
throws IOException { throws IOException {
new RebaseTodoFile(this).writeRebaseTodoFile(path, steps, append); 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);
}
} }

Loading…
Cancel
Save