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() {