diff options
author | Robin Rosenberg <robin.rosenberg@dewire.com> | 2012-07-19 16:05:28 +0200 |
---|---|---|
committer | Robin Rosenberg <robin.rosenberg@dewire.com> | 2012-07-20 08:29:10 +0200 |
commit | c010c93694eb76e90f60de01b5a6b946c2472e9d (patch) | |
tree | 7d10f7535782a5fd1974b11818a8261b62438389 /org.eclipse.jgit | |
parent | 2a2362fbb399582bf0f1be9f0f55101ac9daa201 (diff) | |
download | jgit-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.java | 43 |
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 { |