Add a release() method to SubmoduleWalk

We need a way to release the underlying TreeWalk. Also, use this
method to release walks from the static factory methods on error or
when submodules are not found.

Change-Id: I6bedc2db78bcd577aef2cfe6715bb981a26dcfd7
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/submodule/SubmoduleWalk.java b/org.eclipse.jgit/src/org/eclipse/jgit/submodule/SubmoduleWalk.java
index d18f1e1..f037a7c 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/submodule/SubmoduleWalk.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/submodule/SubmoduleWalk.java
@@ -102,12 +102,18 @@ public static SubmoduleWalk forIndex(Repository repository)
 	public static SubmoduleWalk forPath(Repository repository,
 			AnyObjectId treeId, String path) throws IOException {
 		SubmoduleWalk generator = new SubmoduleWalk(repository);
-		generator.setTree(treeId);
-		PathFilter filter = PathFilter.create(path);
-		generator.setFilter(filter);
-		while (generator.next())
-			if (filter.isDone(generator.walk))
-				return generator;
+		try {
+			generator.setTree(treeId);
+			PathFilter filter = PathFilter.create(path);
+			generator.setFilter(filter);
+			while (generator.next())
+				if (filter.isDone(generator.walk))
+					return generator;
+		} catch (IOException e) {
+			generator.release();
+			throw e;
+		}
+		generator.release();
 		return null;
 	}
 
@@ -124,12 +130,18 @@ public static SubmoduleWalk forPath(Repository repository,
 	public static SubmoduleWalk forPath(Repository repository,
 			AbstractTreeIterator iterator, String path) throws IOException {
 		SubmoduleWalk generator = new SubmoduleWalk(repository);
-		generator.setTree(iterator);
-		PathFilter filter = PathFilter.create(path);
-		generator.setFilter(filter);
-		while (generator.next())
-			if (filter.isDone(generator.walk))
-				return generator;
+		try {
+			generator.setTree(iterator);
+			PathFilter filter = PathFilter.create(path);
+			generator.setFilter(filter);
+			while (generator.next())
+				if (filter.isDone(generator.walk))
+					return generator;
+		} catch (IOException e) {
+			generator.release();
+			throw e;
+		}
+		generator.release();
 		return null;
 	}
 
@@ -511,4 +523,9 @@ public String getRemoteUrl() throws IOException, ConfigInvalidException {
 		String url = getModulesUrl();
 		return url != null ? getSubmoduleRemoteUrl(repository, url) : null;
 	}
+
+	/** Release any resources used by this walker's reader. */
+	public void release() {
+		walk.release();
+	}
 }