[JGIT PATCH 27/28] Convert rev-list, log, glog programs to args4j

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Signed-off-by: Shawn O. Pearce <spearce@xxxxxxxxxxx>
---
 .../org/spearce/jgit/pgm/RevWalkTextBuiltin.java   |  146 +++++++++++---------
 1 files changed, 80 insertions(+), 66 deletions(-)

diff --git a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/RevWalkTextBuiltin.java b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/RevWalkTextBuiltin.java
index 2aba3c5..97fe7a4 100644
--- a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/RevWalkTextBuiltin.java
+++ b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/RevWalkTextBuiltin.java
@@ -41,9 +41,14 @@ import java.util.ArrayList;
 import java.util.EnumSet;
 import java.util.List;
 
+import org.kohsuke.args4j.Argument;
+import org.kohsuke.args4j.Option;
 import org.spearce.jgit.lib.Constants;
+import org.spearce.jgit.lib.ObjectId;
+import org.spearce.jgit.pgm.opt.PathTreeFilterHandler;
 import org.spearce.jgit.revwalk.ObjectWalk;
 import org.spearce.jgit.revwalk.RevCommit;
+import org.spearce.jgit.revwalk.RevFlag;
 import org.spearce.jgit.revwalk.RevObject;
 import org.spearce.jgit.revwalk.RevSort;
 import org.spearce.jgit.revwalk.RevWalk;
@@ -53,98 +58,105 @@ import org.spearce.jgit.revwalk.filter.CommitterRevFilter;
 import org.spearce.jgit.revwalk.filter.MessageRevFilter;
 import org.spearce.jgit.revwalk.filter.RevFilter;
 import org.spearce.jgit.treewalk.filter.AndTreeFilter;
-import org.spearce.jgit.treewalk.filter.PathFilter;
-import org.spearce.jgit.treewalk.filter.PathFilterGroup;
 import org.spearce.jgit.treewalk.filter.TreeFilter;
 
 abstract class RevWalkTextBuiltin extends TextBuiltin {
 	RevWalk walk;
 
+	@Option(name = "--objects")
 	boolean objects = false;
 
+	@Option(name = "--parents")
 	boolean parents = false;
 
+	@Option(name = "--total-count")
 	boolean count = false;
 
 	char[] outbuffer = new char[Constants.OBJECT_ID_LENGTH * 2];
 
-	@Override
-	public final void execute(String[] args) throws Exception {
-		final EnumSet<RevSort> sorting = EnumSet.noneOf(RevSort.class);
-		final List<String> argList = new ArrayList<String>();
-		final List<RevFilter> revLimiter = new ArrayList<RevFilter>();
-		List<PathFilter> pathLimiter = null;
-		for (final String a : args) {
-			if (pathLimiter != null)
-				pathLimiter.add(PathFilter.create(a));
-			else if ("--".equals(a))
-				pathLimiter = new ArrayList<PathFilter>();
-			else if (a.startsWith("--author="))
-				revLimiter.add(AuthorRevFilter.create(a.substring("--author="
-						.length())));
-			else if (a.startsWith("--committer="))
-				revLimiter.add(CommitterRevFilter.create(a
-						.substring("--committer=".length())));
-			else if (a.startsWith("--grep="))
-				revLimiter.add(MessageRevFilter.create(a.substring("--grep="
-						.length())));
-			else if ("--objects".equals(a))
-				objects = true;
-			else if ("--date-order".equals(a))
-				sorting.add(RevSort.COMMIT_TIME_DESC);
-			else if ("--topo-order".equals(a))
-				sorting.add(RevSort.TOPO);
-			else if ("--reverse".equals(a))
-				sorting.add(RevSort.REVERSE);
-			else if ("--boundary".equals(a))
-				sorting.add(RevSort.BOUNDARY);
-			else if ("--parents".equals(a))
-				parents = true;
-			else if ("--total-count".equals(a))
-				count = true;
-			else
-				argList.add(a);
-		}
+	private final EnumSet<RevSort> sorting = EnumSet.noneOf(RevSort.class);
+
+	private void enableRevSort(final RevSort type, final boolean on) {
+		if (on)
+			sorting.add(type);
+		else
+			sorting.remove(type);
+	}
+
+	@Option(name = "--date-order")
+	void enableDateOrder(final boolean on) {
+		enableRevSort(RevSort.COMMIT_TIME_DESC, on);
+	}
+
+	@Option(name = "--topo-order")
+	void enableTopoOrder(final boolean on) {
+		enableRevSort(RevSort.TOPO, on);
+	}
+
+	@Option(name = "--reverse")
+	void enableReverse(final boolean on) {
+		enableRevSort(RevSort.REVERSE, on);
+	}
+
+	@Option(name = "--boundary")
+	void enableBoundary(final boolean on) {
+		enableRevSort(RevSort.BOUNDARY, on);
+	}
+
+	@Argument(index = 0, metaVar = "commit-ish")
+	private final List<RevCommit> commits = new ArrayList<RevCommit>();
+
+	@Option(name = "--", metaVar = "path", multiValued = true, handler = PathTreeFilterHandler.class)
+	private TreeFilter pathFilter = TreeFilter.ALL;
+
+	private final List<RevFilter> revLimiter = new ArrayList<RevFilter>();
 
+	@Option(name = "--author")
+	void addAuthorRevFilter(final String who) {
+		revLimiter.add(AuthorRevFilter.create(who));
+	}
+
+	@Option(name = "--committer")
+	void addCommitterRevFilter(final String who) {
+		revLimiter.add(CommitterRevFilter.create(who));
+	}
+
+	@Option(name = "--grep")
+	void addCMessageRevFilter(final String msg) {
+		revLimiter.add(MessageRevFilter.create(msg));
+	}
+
+	@Override
+	protected void run() throws Exception {
 		walk = createWalk();
 		for (final RevSort s : sorting)
 			walk.sort(s, true);
 
-		if (pathLimiter != null && !pathLimiter.isEmpty())
-			walk.setTreeFilter(AndTreeFilter.create(PathFilterGroup
-					.create(pathLimiter), TreeFilter.ANY_DIFF));
+		if (pathFilter != TreeFilter.ALL)
+			walk.setTreeFilter(AndTreeFilter.create(pathFilter,
+					TreeFilter.ANY_DIFF));
 
 		if (revLimiter.size() == 1)
 			walk.setRevFilter(revLimiter.get(0));
 		else if (revLimiter.size() > 1)
 			walk.setRevFilter(AndRevFilter.create(revLimiter));
 
-		final long start = System.currentTimeMillis();
-		boolean have_revision = false;
-		boolean not = false;
-		for (String a : argList) {
-			if ("--not".equals(a)) {
-				not = true;
-				continue;
-			}
-			boolean menot = false;
-			if (a.startsWith("^")) {
-				a = a.substring(1);
-				menot = true;
-			}
-			final RevCommit c = walk.parseCommit(resolve(a));
-			if (not ^ menot)
-				walk.markUninteresting(c);
-			else {
+		if (commits.isEmpty()) {
+			final ObjectId head = db.resolve(Constants.HEAD);
+			if (head == null)
+				throw die("Cannot resolve " + Constants.HEAD);
+			commits.add(walk.parseCommit(head));
+		}
+		for (final RevCommit c : commits) {
+			final RevCommit real = argWalk == walk ? c : walk.parseCommit(c);
+			if (c.has(RevFlag.UNINTERESTING))
+				walk.markUninteresting(real);
+			else
 				walk.markStart(c);
-				have_revision = true;
-			}
 		}
-		if (!have_revision)
-			walk.markStart(walk.parseCommit(resolve("HEAD")));
-
-		int n = walkLoop();
 
+		final long start = System.currentTimeMillis();
+		final int n = walkLoop();
 		if (count) {
 			final long end = System.currentTimeMillis();
 			System.err.print(n);
@@ -158,7 +170,9 @@ abstract class RevWalkTextBuiltin extends TextBuiltin {
 	protected RevWalk createWalk() {
 		if (objects)
 			return new ObjectWalk(db);
-		return new RevWalk(db);
+		if (argWalk == null)
+			argWalk = new RevWalk(db);
+		return argWalk;
 	}
 
 	protected int walkLoop() throws Exception {
-- 
1.5.6.3.569.ga9185

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux