Browse Source

Support [<ref>]@{upstream} revision syntax

Resolves into a ref name corresponding to the named (or current)
branch's upstream ref.

Change-Id: I98df46cedb498724cf14343fbb168f24ff667929
stable-2.1
Robin Rosenberg 12 years ago
parent
commit
c010c93694
  1. 23
      org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/RepositoryResolveTest.java
  2. 43
      org.eclipse.jgit/src/org/eclipse/jgit/lib/Repository.java

23
org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/RepositoryResolveTest.java

@ -55,6 +55,7 @@ import java.io.IOException;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.errors.IncorrectObjectTypeException;
import org.eclipse.jgit.revwalk.RevCommit;
import org.junit.Test;
public class RepositoryResolveTest extends SampleDataRepositoryTestCase {
@ -243,6 +244,28 @@ public class RepositoryResolveTest extends SampleDataRepositoryTestCase {
assertEquals("HEAD", db.simplify("HEAD"));
}
@Test
public void resolveUpstream() throws Exception {
Git git = new Git(db);
writeTrashFile("file.txt", "content");
git.add().addFilepattern("file.txt").call();
RevCommit c1 = git.commit().setMessage("create file").call();
writeTrashFile("file2.txt", "content");
RefUpdate updateRemoteRef = db.updateRef("refs/remotes/origin/main");
updateRemoteRef.setNewObjectId(c1);
updateRemoteRef.update();
db.getConfig().setString("branch", "master", "remote", "origin");
db.getConfig()
.setString("branch", "master", "merge", "refs/heads/main");
db.getConfig().setString("remote", "origin", "url",
"git://example.com/here");
db.getConfig().setString("remote", "origin", "fetch",
"+refs/heads/*:refs/remotes/origin/*");
git.add().addFilepattern("file2.txt").call();
git.commit().setMessage("create file").call();
assertEquals("refs/remotes/origin/main", db.simplify("@{upstream}"));
}
private static ObjectId id(String name) {
return ObjectId.fromString(name);
}

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

@ -51,6 +51,7 @@ import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URISyntaxException;
import java.text.MessageFormat;
import java.util.Collection;
import java.util.Collections;
@ -82,6 +83,8 @@ import org.eclipse.jgit.revwalk.RevWalk;
import org.eclipse.jgit.storage.file.CheckoutEntry;
import org.eclipse.jgit.storage.file.ReflogEntry;
import org.eclipse.jgit.storage.file.ReflogReader;
import org.eclipse.jgit.transport.RefSpec;
import org.eclipse.jgit.transport.RemoteConfig;
import org.eclipse.jgit.treewalk.TreeWalk;
import org.eclipse.jgit.util.FS;
import org.eclipse.jgit.util.FileUtils;
@ -577,7 +580,45 @@ public abstract class Repository {
}
}
if (time != null) {
if (time.matches("^-\\d+$")) {
if (time.equals("upstream")) {
if (name == null)
name = new String(revChars, done, i);
if (name.equals(""))
// Currently checked out branch, HEAD if
// detached
name = Constants.HEAD;
Ref ref = getRef(name);
if (ref == null)
return null;
if (ref.isSymbolic())
ref = ref.getLeaf();
name = ref.getName();
RemoteConfig remoteConfig;
try {
remoteConfig = new RemoteConfig(getConfig(),
"origin");
} catch (URISyntaxException e) {
throw new RevisionSyntaxException(revstr);
}
String remoteBranchName = getConfig()
.getString(
ConfigConstants.CONFIG_BRANCH_SECTION,
Repository.shortenRefName(ref.getName()),
ConfigConstants.CONFIG_KEY_MERGE);
List<RefSpec> fetchRefSpecs = remoteConfig
.getFetchRefSpecs();
for (RefSpec refSpec : fetchRefSpecs) {
if (refSpec.matchSource(remoteBranchName)) {
RefSpec expandFromSource = refSpec
.expandFromSource(remoteBranchName);
name = expandFromSource.getDestination();
break;
}
}
if (name == null)
throw new RevisionSyntaxException(revstr);
} else if (time.matches("^-\\d+$")) {
if (name != null)
throw new RevisionSyntaxException(revstr);
else {

Loading…
Cancel
Save