summaryrefslogtreecommitdiffstats
path: root/org.eclipse.jgit
diff options
context:
space:
mode:
authorRobin Rosenberg <robin.rosenberg@dewire.com>2012-07-19 16:05:28 +0200
committerRobin Rosenberg <robin.rosenberg@dewire.com>2012-07-20 08:29:10 +0200
commitc010c93694eb76e90f60de01b5a6b946c2472e9d (patch)
tree7d10f7535782a5fd1974b11818a8261b62438389 /org.eclipse.jgit
parent2a2362fbb399582bf0f1be9f0f55101ac9daa201 (diff)
downloadjgit-c010c93694eb76e90f60de01b5a6b946c2472e9d.tar.gz
jgit-c010c93694eb76e90f60de01b5a6b946c2472e9d.zip
Support [<ref>]@{upstream} revision syntax
Resolves into a ref name corresponding to the named (or current) branch's upstream ref. Change-Id: I98df46cedb498724cf14343fbb168f24ff667929
Diffstat (limited to 'org.eclipse.jgit')
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/lib/Repository.java43
1 files changed, 42 insertions, 1 deletions
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 db030952a0..82394dd757 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/Repository.java
+++ b/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 {