From bb09da956d778fed357d55821a549e9da146b6cb Mon Sep 17 00:00:00 2001 From: Robin Rosenberg Date: Mon, 13 Aug 2007 01:57:25 +0200 Subject: [PATCH] Add a revision parser This one parses expressions like head~1 etc. Signed-off-by: Robin Rosenberg --- .../src/org/spearce/jgit/lib/Repository.java | 121 +++++++++++++++++++++ .../org/spearce/jgit/lib/T0008_testparserev.java | 85 +++++++++++++++ 2 files changed, 206 insertions(+) create mode 100644 org.spearce.jgit/tst/org/spearce/jgit/lib/T0008_testparserev.java diff --git a/org.spearce.jgit/src/org/spearce/jgit/lib/Repository.java b/org.spearce.jgit/src/org/spearce/jgit/lib/Repository.java index 86b7f8b1..42ebc087 100644 --- a/org.spearce.jgit/src/org/spearce/jgit/lib/Repository.java +++ b/org.spearce.jgit/src/org/spearce/jgit/lib/Repository.java @@ -281,7 +281,128 @@ public class Repository { return l.lock() ? l : null; } + /** Parse a git revision string and return an object id. + * + * It is not fully implemented, so it only deals with + * commits and to some extent tags. Reflogs are not + * supported yet. + * The plan is to implement it fully. + * @param revstr A git object references expression + * @return an ObjectId + * @throws IOException on serious errors + */ + public ObjectId parse(String revstr) throws IOException { + char[] rev = revstr.toCharArray(); + ObjectId ret = null; + Commit ref = null; + for (int i = 0; i < rev.length; ++i) { + switch (rev[i]) { + case '^': + if (ref == null) { + String refstr = new String(rev,0,i); + ObjectId refId = resolveSimple(refstr); + ref = mapCommit(refId); + } + if (i + 1 < rev.length) { + switch (rev[i + 1]) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + int j; + for (j=i+1; j= 0) { + ref = mapCommit(ref.getParentIds()[0]); + --dist; + } + i = l - 1; + break; + case '@': + int m; + String time = null; + for (m=i+2; m