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 {
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);
}
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;
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;
}
}
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 {