Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRobin Rosenberg2010-05-08 21:16:26 +0000
committerCode Review2010-05-08 21:16:26 +0000
commit541ad72ac6a6529e20fb1b0694c592c0bcc98d38 (patch)
tree86924dba53581c2986bf380dc4bf8239f02b26d3
parent0df679aea175aaba322416e586535ac877eba9a8 (diff)
parentb9ab040b45f0a0329d76fc919b0111414fdaf035 (diff)
downloadjgit-541ad72ac6a6529e20fb1b0694c592c0bcc98d38.tar.gz
jgit-541ad72ac6a6529e20fb1b0694c592c0bcc98d38.tar.xz
jgit-541ad72ac6a6529e20fb1b0694c592c0bcc98d38.zip
Merge "Added MERGING_RESOLVED repository state"
-rw-r--r--org.eclipse.jgit.test/tst/org/eclipse/jgit/dircache/DirCacheBasicTest.java20
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCache.java16
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/lib/Repository.java17
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/lib/RepositoryState.java11
4 files changed, 63 insertions, 1 deletions
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/dircache/DirCacheBasicTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/dircache/DirCacheBasicTest.java
index b35fc76175..f4692b168d 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/dircache/DirCacheBasicTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/dircache/DirCacheBasicTest.java
@@ -186,10 +186,30 @@ public class DirCacheBasicTest extends RepositoryTestCase {
for (int i = 0; i < ents.length; i++)
b.add(ents[i]);
b.finish();
+ assertFalse(dc.hasUnmergedPaths());
assertEquals(paths.length, dc.getEntryCount());
dc.clear();
assertEquals(0, dc.getEntryCount());
+ assertFalse(dc.hasUnmergedPaths());
+ }
+
+ public void testDetectUnmergedPaths() throws Exception {
+ final DirCache dc = DirCache.read(db);
+ final DirCacheEntry[] ents = new DirCacheEntry[3];
+
+ ents[0] = new DirCacheEntry("a", 1);
+ ents[0].setFileMode(FileMode.REGULAR_FILE);
+ ents[1] = new DirCacheEntry("a", 2);
+ ents[1].setFileMode(FileMode.REGULAR_FILE);
+ ents[2] = new DirCacheEntry("a", 3);
+ ents[2].setFileMode(FileMode.REGULAR_FILE);
+
+ final DirCacheBuilder b = dc.builder();
+ for (int i = 0; i < ents.length; i++)
+ b.add(ents[i]);
+ b.finish();
+ assertTrue(dc.hasUnmergedPaths());
}
public void testFindOnEmpty() throws Exception {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCache.java b/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCache.java
index 189787dd9e..3a8abc1a73 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCache.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCache.java
@@ -784,4 +784,20 @@ public class DirCache {
throws UnmergedPathException, IOException {
return getCacheTree(true).writeTree(sortedEntries, 0, 0, ow);
}
+
+ /**
+ * Tells whether this index contains unmerged paths.
+ *
+ * @return {@code true} if this index contains unmerged paths. Means: at
+ * least one entry is of a stage different from 0. {@code false}
+ * will be returned if all entries are of stage 0.
+ */
+ public boolean hasUnmergedPaths() {
+ for (int i = 0; i < entryCnt; i++) {
+ if (sortedEntries[i].getStage() > 0) {
+ return true;
+ }
+ }
+ return false;
+ }
}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/Repository.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/Repository.java
index e2d3da6bc2..9f4bb100f8 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/Repository.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/Repository.java
@@ -60,6 +60,7 @@ import java.util.Set;
import java.util.Vector;
import java.util.concurrent.atomic.AtomicInteger;
+import org.eclipse.jgit.dircache.DirCache;
import org.eclipse.jgit.errors.ConfigInvalidException;
import org.eclipse.jgit.errors.IncorrectObjectTypeException;
import org.eclipse.jgit.errors.RevisionSyntaxException;
@@ -1117,8 +1118,22 @@ public class Repository {
return RepositoryState.REBASING_MERGE;
// Both versions
- if (new File(gitDir,"MERGE_HEAD").exists())
+ if (new File(gitDir, "MERGE_HEAD").exists()) {
+ // we are merging - now check whether we have unmerged paths
+ try {
+ if (!DirCache.read(this).hasUnmergedPaths()) {
+ // no unmerged paths -> return the MERGING_RESOLVED state
+ return RepositoryState.MERGING_RESOLVED;
+ }
+ } catch (IOException e) {
+ // Can't decide whether unmerged paths exists. Return
+ // MERGING state to be on the safe side (in state MERGING
+ // you are not allow to do anything)
+ e.printStackTrace();
+ }
return RepositoryState.MERGING;
+ }
+
if (new File(gitDir,"BISECT_LOG").exists())
return RepositoryState.BISECTING;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/RepositoryState.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/RepositoryState.java
index 6159839b13..901d1b516b 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/RepositoryState.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/RepositoryState.java
@@ -74,6 +74,17 @@ public enum RepositoryState {
},
/**
+ * An merge where all conflicts have been resolved. The index does not
+ * contain any unmerged paths.
+ */
+ MERGING_RESOLVED {
+ public boolean canCheckout() { return true; }
+ public boolean canResetHead() { return true; }
+ public boolean canCommit() { return true; }
+ public String getDescription() { return "Merged"; }
+ },
+
+ /**
* An unfinished rebase or am. Must resolve, skip or abort before normal work can take place
*/
REBASING {

Back to the top