ReceiveCommand.filter: Accept Iterable

PreReceiveHook is given a Collection<ReceiveCommand> and it can be
very useful here to call ReceiveCommand.filter(cmds, NOT_ATTEMPTED).

Overload filter to accept both Iterable and List.
Keep backwards binary compatibility for List by upcasting to Iterable.

Change-Id: Ib1341876c703670945ef209edc8259715ee86c26
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceiveCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceiveCommand.java
index 7c44dba..0cc7e5c 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceiveCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceiveCommand.java
@@ -46,6 +46,7 @@
 import java.io.IOException;
 import java.text.MessageFormat;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
 
 import org.eclipse.jgit.internal.JGitText;
@@ -127,6 +128,31 @@ public static enum Result {
 	}
 
 	/**
+	 * Filter a collection of commands according to result.
+	 *
+	 * @param in
+	 *            commands to filter.
+	 * @param want
+	 *            desired status to filter by.
+	 * @return a copy of the command list containing only those commands with
+	 *         the desired status.
+	 * @since 4.3
+	 */
+	public static List<ReceiveCommand> filter(Iterable<ReceiveCommand> in,
+			Result want) {
+		List<ReceiveCommand> r;
+		if (in instanceof Collection)
+			r = new ArrayList<>(((Collection<?>) in).size());
+		else
+			r = new ArrayList<>();
+		for (ReceiveCommand cmd : in) {
+			if (cmd.getResult() == want)
+				r.add(cmd);
+		}
+		return r;
+	}
+
+	/**
 	 * Filter a list of commands according to result.
 	 *
 	 * @param commands
@@ -138,13 +164,8 @@ public static enum Result {
 	 * @since 2.0
 	 */
 	public static List<ReceiveCommand> filter(List<ReceiveCommand> commands,
-			final Result want) {
-		List<ReceiveCommand> r = new ArrayList<ReceiveCommand>(commands.size());
-		for (final ReceiveCommand cmd : commands) {
-			if (cmd.getResult() == want)
-				r.add(cmd);
-		}
-		return r;
+			Result want) {
+		return filter((Iterable<ReceiveCommand>) commands, want);
 	}
 
 	private final ObjectId oldId;