Merge branch 'stable-0.12'

* stable-0.12:
  JGit 0.12.1
diff --git a/org.eclipse.jgit.ant/.classpath b/org.eclipse.jgit.ant/.classpath
new file mode 100644
index 0000000..b3d21cc
--- /dev/null
+++ b/org.eclipse.jgit.ant/.classpath
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="src" path="resources"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.jgit.ant/.gitignore b/org.eclipse.jgit.ant/.gitignore
new file mode 100644
index 0000000..7ca6747
--- /dev/null
+++ b/org.eclipse.jgit.ant/.gitignore
@@ -0,0 +1,3 @@
+bin/
+target/
+tmp/
diff --git a/org.eclipse.jgit.ant/.project b/org.eclipse.jgit.ant/.project
new file mode 100644
index 0000000..855b351
--- /dev/null
+++ b/org.eclipse.jgit.ant/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.jgit.ant</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/org.eclipse.jgit.ant/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.jgit.ant/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..86d287e
--- /dev/null
+++ b/org.eclipse.jgit.ant/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,8 @@
+#Sat Feb 12 08:27:33 PST 2011
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.5
diff --git a/org.eclipse.jgit.ant/.settings/org.eclipse.pde.core.prefs b/org.eclipse.jgit.ant/.settings/org.eclipse.pde.core.prefs
new file mode 100644
index 0000000..48279b5
--- /dev/null
+++ b/org.eclipse.jgit.ant/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,3 @@
+#Sat Feb 12 08:36:17 PST 2011
+eclipse.preferences.version=1
+resolve.requirebundle=false
diff --git a/org.eclipse.jgit.ant/META-INF/MANIFEST.MF b/org.eclipse.jgit.ant/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..ed58fdb
--- /dev/null
+++ b/org.eclipse.jgit.ant/META-INF/MANIFEST.MF
@@ -0,0 +1,10 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name
+Bundle-SymbolicName: org.eclipse.jgit.ant
+Bundle-Version: 0.12.0.qualifier
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Import-Package: org.apache.tools.ant
+Bundle-Localization: plugin
+Bundle-Vendor: %Provider-Name
+Export-Package: org.eclipse.jgit.ant.tasks;version="0.12.0"
diff --git a/org.eclipse.jgit.ant/build.properties b/org.eclipse.jgit.ant/build.properties
new file mode 100644
index 0000000..3de103d
--- /dev/null
+++ b/org.eclipse.jgit.ant/build.properties
@@ -0,0 +1,9 @@
+source.. = src/,\
+           resources/
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               plugin.properties
+additional.bundles = org.apache.ant,\
+                     org.eclipse.jgit,\
+                     org.eclipse.jgit.pgm
diff --git a/org.eclipse.jgit.ant/plugin.properties b/org.eclipse.jgit.ant/plugin.properties
new file mode 100644
index 0000000..6f2ce38
--- /dev/null
+++ b/org.eclipse.jgit.ant/plugin.properties
@@ -0,0 +1,3 @@
+#Properties file for org.eclipse.jgit.ant
+Bundle-Name = JGit Ant Tasks (Incubation)
+Provider-Name = Eclipse JGit
\ No newline at end of file
diff --git a/org.eclipse.jgit.ant/resources/org/eclipse/jgit/ant/ant-tasks.properties b/org.eclipse.jgit.ant/resources/org/eclipse/jgit/ant/ant-tasks.properties
new file mode 100644
index 0000000..b0454a1
--- /dev/null
+++ b/org.eclipse.jgit.ant/resources/org/eclipse/jgit/ant/ant-tasks.properties
@@ -0,0 +1,3 @@
+git-init=org.eclipse.jgit.ant.tasks.GitInitTask
+git-clone=org.eclipse.jgit.ant.tasks.GitCloneTask
+git-checkout=org.eclipse.jgit.ant.tasks.GitCheckoutTask
\ No newline at end of file
diff --git a/org.eclipse.jgit.ant/src/org/eclipse/jgit/ant/tasks/GitCheckoutTask.java b/org.eclipse.jgit.ant/src/org/eclipse/jgit/ant/tasks/GitCheckoutTask.java
new file mode 100644
index 0000000..92c74f6
--- /dev/null
+++ b/org.eclipse.jgit.ant/src/org/eclipse/jgit/ant/tasks/GitCheckoutTask.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright (C) 2011, Ketan Padegaonkar <KetanPadegaonkar@gmail.com>
+ * and other copyright owners as documented in the project's IP log.
+ *
+ * This program and the accompanying materials are made available
+ * under the terms of the Eclipse Distribution License v1.0 which
+ * accompanies this distribution, is reproduced below, and is
+ * available at http://www.eclipse.org/org/documents/edl-v10.php
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above
+ *   copyright notice, this list of conditions and the following
+ *   disclaimer in the documentation and/or other materials provided
+ *   with the distribution.
+ *
+ * - Neither the name of the Eclipse Foundation, Inc. nor the
+ *   names of its contributors may be used to endorse or promote
+ *   products derived from this software without specific prior
+ *   written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package org.eclipse.jgit.ant.tasks;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Task;
+import org.eclipse.jgit.api.CheckoutCommand;
+import org.eclipse.jgit.api.Git;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.storage.file.FileRepositoryBuilder;
+
+/**
+ * Checkout a branch or paths to the working tree.
+ * 
+ * @see <a
+ *      href="http://www.kernel.org/pub/software/scm/git/docs/git-checkout.html"
+ *      >git-checkout(1)</a>
+ */
+public class GitCheckoutTask extends Task {
+
+	private File src;
+	private String branch;
+	private boolean createBranch;
+	private boolean force;
+
+	/**
+	 * @param src
+	 *            the src to set
+	 */
+	public void setSrc(File src) {
+		this.src = src;
+	}
+
+	/**
+	 * @param branch
+	 *            the initial branch to check out
+	 */
+	public void setBranch(String branch) {
+		this.branch = branch;
+	}
+
+	/**
+	 * @param createBranch
+	 *            whether the branch should be created if it does not already
+	 *            exist
+	 */
+	public void setCreateBranch(boolean createBranch) {
+		this.createBranch = createBranch;
+	}
+
+	/**
+	 * @param force
+	 *            if <code>true</code> and the branch with the given name
+	 *            already exists, the start-point of an existing branch will be
+	 *            set to a new start-point; if false, the existing branch will
+	 *            not be changed
+	 * @return this instance
+	 */
+	public void setForce(boolean force) {
+		this.force = force;
+	}
+
+	@Override
+	public void execute() throws BuildException {
+		CheckoutCommand checkout;
+		try {
+			Repository repo = new FileRepositoryBuilder().readEnvironment()
+					.findGitDir(src).build();
+			checkout = new Git(repo).checkout();
+		} catch (IOException e) {
+			throw new BuildException("Could not access repository " + src, e);
+		}
+
+		try {
+			checkout.setCreateBranch(createBranch).setForce(force)
+					.setName(branch);
+			checkout.call();
+		} catch (Exception e) {
+			throw new BuildException("Could not checkout repository " + src, e);
+		}
+	}
+
+}
diff --git a/org.eclipse.jgit.ant/src/org/eclipse/jgit/ant/tasks/GitCloneTask.java b/org.eclipse.jgit.ant/src/org/eclipse/jgit/ant/tasks/GitCloneTask.java
new file mode 100644
index 0000000..0794bf1
--- /dev/null
+++ b/org.eclipse.jgit.ant/src/org/eclipse/jgit/ant/tasks/GitCloneTask.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright (C) 2011, Ketan Padegaonkar <KetanPadegaonkar@gmail.com>
+ * and other copyright owners as documented in the project's IP log.
+ *
+ * This program and the accompanying materials are made available
+ * under the terms of the Eclipse Distribution License v1.0 which
+ * accompanies this distribution, is reproduced below, and is
+ * available at http://www.eclipse.org/org/documents/edl-v10.php
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above
+ *   copyright notice, this list of conditions and the following
+ *   disclaimer in the documentation and/or other materials provided
+ *   with the distribution.
+ *
+ * - Neither the name of the Eclipse Foundation, Inc. nor the
+ *   names of its contributors may be used to endorse or promote
+ *   products derived from this software without specific prior
+ *   written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package org.eclipse.jgit.ant.tasks;
+
+import java.io.File;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Task;
+import org.eclipse.jgit.api.CloneCommand;
+import org.eclipse.jgit.api.Git;
+import org.eclipse.jgit.api.errors.JGitInternalException;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.transport.URIish;
+
+/**
+ * Clone a repository into a new directory.
+ * 
+ * @see <a href="http://www.kernel.org/pub/software/scm/git/docs/git-clone.html"
+ *      >git-clone(1)</a>
+ */
+public class GitCloneTask extends Task {
+
+	private String uri;
+	private File destination;
+	private boolean bare;
+	private String branch = Constants.HEAD;
+
+	/**
+	 * @param uri
+	 *            the uri to clone from
+	 */
+	public void setUri(String uri) {
+		this.uri = uri;
+	}
+
+	/**
+	 * The optional directory associated with the clone operation. If the
+	 * directory isn't set, a name associated with the source uri will be used.
+	 * 
+	 * @see URIish#getHumanishName()
+	 * 
+	 * @param destination
+	 *            the directory to clone to
+	 */
+	public void setDest(File destination) {
+		this.destination = destination;
+	}
+
+	/**
+	 * @param bare
+	 *            whether the cloned repository is bare or not
+	 */
+	public void setBare(boolean bare) {
+		this.bare = bare;
+	}
+
+	/**
+	 * @param branch
+	 *            the initial branch to check out when cloning the repository
+	 */
+	public void setBranch(String branch) {
+		this.branch = branch;
+	}
+
+	@Override
+	public void execute() throws BuildException {
+		log("Cloning repository " + uri);
+		
+		CloneCommand clone = Git.cloneRepository();
+		clone.setURI(uri).setDirectory(destination).setBranch(branch).setBare(bare);
+		try {
+			clone.call();
+		} catch (JGitInternalException e) {
+			throw new BuildException("Could not clone repository: " + e.getMessage(), e);
+		}
+	}
+}
diff --git a/org.eclipse.jgit.ant/src/org/eclipse/jgit/ant/tasks/GitInitTask.java b/org.eclipse.jgit.ant/src/org/eclipse/jgit/ant/tasks/GitInitTask.java
new file mode 100644
index 0000000..cab45e0
--- /dev/null
+++ b/org.eclipse.jgit.ant/src/org/eclipse/jgit/ant/tasks/GitInitTask.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2011, Ketan Padegaonkar <KetanPadegaonkar@gmail.com>
+ * and other copyright owners as documented in the project's IP log.
+ *
+ * This program and the accompanying materials are made available
+ * under the terms of the Eclipse Distribution License v1.0 which
+ * accompanies this distribution, is reproduced below, and is
+ * available at http://www.eclipse.org/org/documents/edl-v10.php
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above
+ *   copyright notice, this list of conditions and the following
+ *   disclaimer in the documentation and/or other materials provided
+ *   with the distribution.
+ *
+ * - Neither the name of the Eclipse Foundation, Inc. nor the
+ *   names of its contributors may be used to endorse or promote
+ *   products derived from this software without specific prior
+ *   written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package org.eclipse.jgit.ant.tasks;
+
+import java.io.File;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Task;
+import org.eclipse.jgit.api.Git;
+import org.eclipse.jgit.api.InitCommand;
+
+/**
+ * Create an empty git repository.
+ *
+ * @see <a href="http://www.kernel.org/pub/software/scm/git/docs/git-init.html"
+ *      >git-init(1)</a>
+ */
+public class GitInitTask extends Task {
+	private File destination;
+	private boolean bare;
+
+	/**
+	 * Set the destination git repository.
+	 *
+	 * @param dest
+	 *            the destination directory that should be initialized with the
+	 *            git repository.
+	 */
+	public void setDest(File dest) {
+		this.destination = dest;
+	}
+
+	/**
+	 * @param bare
+	 *            whether the repository should be initialized to a bare
+	 *            repository or not.
+	 */
+	public void setBare(boolean bare) {
+		this.bare = bare;
+	}
+
+	@Override
+	public void execute() throws BuildException {
+		if (bare) {
+			log("Initializing bare repository at " + destination);
+		} else {
+			log("Initializing repository at " + destination);
+		}
+		InitCommand init = Git.init();
+		init.setBare(bare).setDirectory(destination);
+		init.call();
+	}
+}
diff --git a/org.eclipse.jgit.http.test/tst/org/eclipse/jgit/http/test/HttpClientTests.java b/org.eclipse.jgit.http.test/tst/org/eclipse/jgit/http/test/HttpClientTests.java
index c48d9b1..35989e8 100644
--- a/org.eclipse.jgit.http.test/tst/org/eclipse/jgit/http/test/HttpClientTests.java
+++ b/org.eclipse.jgit.http.test/tst/org/eclipse/jgit/http/test/HttpClientTests.java
@@ -81,6 +81,8 @@
 import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider;
 import org.eclipse.jgit.transport.resolver.RepositoryResolver;
 import org.eclipse.jgit.transport.resolver.ServiceNotEnabledException;
+import org.junit.Before;
+import org.junit.Test;
 
 public class HttpClientTests extends HttpTestCase {
 	private TestRepository<FileRepository> remoteRepository;
@@ -93,6 +95,7 @@ public class HttpClientTests extends HttpTestCase {
 
 	private URIish smartAuthBasicURI;
 
+	@Before
 	public void setUp() throws Exception {
 		super.setUp();
 
@@ -149,6 +152,7 @@ private static String nameOf(final FileRepository db) {
 		return db.getDirectory().getName();
 	}
 
+	@Test
 	public void testRepositoryNotFound_Dumb() throws Exception {
 		URIish uri = toURIish("/dumb.none/not-found");
 		Repository dst = createBareRepository();
@@ -167,6 +171,7 @@ public void testRepositoryNotFound_Dumb() throws Exception {
 		}
 	}
 
+	@Test
 	public void testRepositoryNotFound_Smart() throws Exception {
 		URIish uri = toURIish("/smart.none/not-found");
 		Repository dst = createBareRepository();
@@ -185,6 +190,7 @@ public void testRepositoryNotFound_Smart() throws Exception {
 		}
 	}
 
+	@Test
 	public void testListRemote_Dumb_DetachedHEAD() throws Exception {
 		Repository src = remoteRepository.getRepository();
 		RefUpdate u = src.updateRef(Constants.HEAD, true);
@@ -209,6 +215,7 @@ public void testListRemote_Dumb_DetachedHEAD() throws Exception {
 		assertEquals(Q, head.getObjectId());
 	}
 
+	@Test
 	public void testListRemote_Dumb_NoHEAD() throws Exception {
 		FileRepository src = remoteRepository.getRepository();
 		File headref = new File(src.getDirectory(), Constants.HEAD);
@@ -231,6 +238,7 @@ public void testListRemote_Dumb_NoHEAD() throws Exception {
 		assertNull("has no " + Constants.HEAD, head);
 	}
 
+	@Test
 	public void testListRemote_Smart_DetachedHEAD() throws Exception {
 		Repository src = remoteRepository.getRepository();
 		RefUpdate u = src.updateRef(Constants.HEAD, true);
@@ -255,6 +263,7 @@ public void testListRemote_Smart_DetachedHEAD() throws Exception {
 		assertEquals(Q, head.getObjectId());
 	}
 
+	@Test
 	public void testListRemote_Smart_WithQueryParameters() throws Exception {
 		URIish myURI = toURIish("/snone/do?r=1&p=test.git");
 		Repository dst = createBareRepository();
@@ -283,6 +292,7 @@ public void testListRemote_Smart_WithQueryParameters() throws Exception {
 		assertEquals(404, info.getStatus());
 	}
 
+	@Test
 	public void testListRemote_Dumb_NeedsAuth() throws Exception {
 		Repository dst = createBareRepository();
 		Transport t = Transport.open(dst, dumbAuthBasicURI);
@@ -300,6 +310,7 @@ public void testListRemote_Dumb_NeedsAuth() throws Exception {
 		}
 	}
 
+	@Test
 	public void testListRemote_Dumb_Auth() throws Exception {
 		Repository dst = createBareRepository();
 		Transport t = Transport.open(dst, dumbAuthBasicURI);
@@ -325,6 +336,7 @@ public void testListRemote_Dumb_Auth() throws Exception {
 		}
 	}
 
+	@Test
 	public void testListRemote_Smart_UploadPackNeedsAuth() throws Exception {
 		Repository dst = createBareRepository();
 		Transport t = Transport.open(dst, smartAuthBasicURI);
@@ -342,6 +354,7 @@ public void testListRemote_Smart_UploadPackNeedsAuth() throws Exception {
 		}
 	}
 
+	@Test
 	public void testListRemote_Smart_UploadPackDisabled() throws Exception {
 		FileRepository src = remoteRepository.getRepository();
 		final FileBasedConfig cfg = src.getConfig();
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/IndexDiffTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/IndexDiffTest.java
index d983587..80c779d 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/IndexDiffTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/IndexDiffTest.java
@@ -50,11 +50,16 @@
 
 import java.io.File;
 import java.io.IOException;
+import java.util.TreeSet;
 
 import org.eclipse.jgit.api.Git;
+import org.eclipse.jgit.api.MergeResult;
+import org.eclipse.jgit.api.MergeResult.MergeStatus;
 import org.eclipse.jgit.dircache.DirCache;
 import org.eclipse.jgit.dircache.DirCacheEditor;
 import org.eclipse.jgit.dircache.DirCacheEntry;
+import org.eclipse.jgit.merge.MergeStrategy;
+import org.eclipse.jgit.revwalk.RevCommit;
 import org.eclipse.jgit.treewalk.FileTreeIterator;
 import org.junit.Test;
 
@@ -140,6 +145,47 @@ public void testModified() throws IOException {
 	}
 
 	@Test
+	public void testConflicting() throws Exception {
+		Git git = new Git(db);
+
+		writeTrashFile("a", "1\na\n3\n");
+		writeTrashFile("b", "1\nb\n3\n");
+		git.add().addFilepattern("a").addFilepattern("b").call();
+		RevCommit initialCommit = git.commit().setMessage("initial").call();
+
+		// create side branch with two modifications
+		createBranch(initialCommit, "refs/heads/side");
+		checkoutBranch("refs/heads/side");
+		writeTrashFile("a", "1\na(side)\n3\n");
+		writeTrashFile("b", "1\nb\n3\n(side)");
+		git.add().addFilepattern("a").addFilepattern("b").call();
+		RevCommit secondCommit = git.commit().setMessage("side").call();
+
+		// update a on master to generate conflict
+		checkoutBranch("refs/heads/master");
+		writeTrashFile("a", "1\na(main)\n3\n");
+		git.add().addFilepattern("a").call();
+		git.commit().setMessage("main").call();
+
+		// merge side with master
+		MergeResult result = git.merge().include(secondCommit.getId())
+				.setStrategy(MergeStrategy.RESOLVE).call();
+		assertEquals(MergeStatus.CONFLICTING, result.getMergeStatus());
+
+		FileTreeIterator iterator = new FileTreeIterator(db);
+		IndexDiff diff = new IndexDiff(db, Constants.HEAD, iterator);
+		diff.diff();
+
+		assertEquals("[a, b]",
+				new TreeSet<String>(diff.getChanged()).toString());
+		assertEquals("[a]", diff.getAdded().toString());
+		assertEquals("[]", diff.getRemoved().toString());
+		assertEquals("[a]", diff.getMissing().toString());
+		assertEquals("[a]", diff.getModified().toString());
+		assertEquals("[a]", diff.getConflicting().toString());
+	}
+
+	@Test
 	public void testUnchangedSimple() throws IOException {
 		GitIndex index = new GitIndex(db);
 
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/IndexDiff.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/IndexDiff.java
index 73bda08..b2c05ae 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/IndexDiff.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/IndexDiff.java
@@ -52,6 +52,7 @@
 import java.util.Set;
 
 import org.eclipse.jgit.dircache.DirCache;
+import org.eclipse.jgit.dircache.DirCacheEntry;
 import org.eclipse.jgit.dircache.DirCacheIterator;
 import org.eclipse.jgit.errors.IncorrectObjectTypeException;
 import org.eclipse.jgit.errors.MissingObjectException;
@@ -76,6 +77,7 @@
  * <li>removed files</li>
  * <li>missing files</li>
  * <li>modified files</li>
+ * <li>conflicting files</li>
  * <li>untracked files</li>
  * <li>files with assume-unchanged flag</li>
  * </ul>
@@ -153,6 +155,8 @@ public TreeFilter clone() {
 
 	private Set<String> untracked = new HashSet<String>();
 
+	private Set<String> conflicts = new HashSet<String>();
+
 	private Set<String> assumeUnchanged;
 
 	private DirCache dirCache;
@@ -320,6 +324,12 @@ public boolean diff(final ProgressMonitor monitor, int estWorkTreeSize,
 						modified.add(treeWalk.getPathString());
 					}
 				}
+
+				final DirCacheEntry dirCacheEntry = dirCacheIterator
+						.getDirCacheEntry();
+				if (dirCacheEntry != null && dirCacheEntry.getStage() > 0) {
+					conflicts.add(treeWalk.getPathString());
+				}
 			}
 		}
 
@@ -378,6 +388,13 @@ public Set<String> getUntracked() {
 	}
 
 	/**
+	 * @return list of files that are in conflict
+	 */
+	public Set<String> getConflicting() {
+		return conflicts;
+	}
+
+	/**
 	 * @return list of files with the flag assume-unchanged
 	 */
 	public Set<String> getAssumeUnchanged() {