Browse Source

Keep submodules in index that are missing in working directory

Submodules present in the index but missing from the working
directory should not be staged for deletion when AddCommand
is called with the update flag set to true.

This mirrors the behavior of CGit.  Submodules can still be
staged for deletion by running by using the RmCommand.

Change-Id: Iee508a67f9621269d1c28d422f88c6b8dd9f8e6e
stable-2.0
Kevin Sawicki 13 years ago
parent
commit
5c18fcb81b
  1. 37
      org.eclipse.jgit.test/tst/org/eclipse/jgit/api/AddCommandTest.java
  2. 5
      org.eclipse.jgit/src/org/eclipse/jgit/api/AddCommand.java

37
org.eclipse.jgit.test/tst/org/eclipse/jgit/api/AddCommandTest.java

@ -44,7 +44,9 @@
package org.eclipse.jgit.api; package org.eclipse.jgit.api;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail; import static org.junit.Assert.fail;
import java.io.File; import java.io.File;
@ -61,6 +63,7 @@ import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.FileMode; import org.eclipse.jgit.lib.FileMode;
import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.ObjectInserter; import org.eclipse.jgit.lib.ObjectInserter;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.lib.RepositoryTestCase; import org.eclipse.jgit.lib.RepositoryTestCase;
import org.eclipse.jgit.lib.StoredConfig; import org.eclipse.jgit.lib.StoredConfig;
import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.revwalk.RevCommit;
@ -684,6 +687,40 @@ public class AddCommandTest extends RepositoryTestCase {
assertEquals(FileMode.EXECUTABLE_FILE, walk.getFileMode(0)); assertEquals(FileMode.EXECUTABLE_FILE, walk.getFileMode(0));
} }
@Test
public void testSubmoduleDeleteNotStagedWithUpdate() throws Exception {
Git git = new Git(db);
writeTrashFile("file.txt", "content");
git.add().addFilepattern("file.txt").call();
assertNotNull(git.commit().setMessage("create file").call());
SubmoduleAddCommand command = new SubmoduleAddCommand(db);
String path = "sub";
command.setPath(path);
String uri = db.getDirectory().toURI().toString();
command.setURI(uri);
Repository repo = command.call();
assertNotNull(repo);
assertNotNull(git.commit().setMessage("add submodule").call());
assertTrue(git.status().call().isClean());
FileUtils.delete(repo.getWorkTree(), FileUtils.RECURSIVE);
FileUtils.mkdir(new File(db.getWorkTree(), path), false);
assertNotNull(git.add().addFilepattern(".").setUpdate(true).call());
Status status = git.status().call();
assertFalse(status.isClean());
assertTrue(status.getAdded().isEmpty());
assertTrue(status.getChanged().isEmpty());
assertTrue(status.getRemoved().isEmpty());
assertTrue(status.getUntracked().isEmpty());
assertTrue(status.getModified().isEmpty());
assertEquals(1, status.getMissing().size());
assertEquals(path, status.getMissing().iterator().next());
}
private DirCacheEntry addEntryToBuilder(String path, File file, private DirCacheEntry addEntryToBuilder(String path, File file,
ObjectInserter newObjectInserter, DirCacheBuilder builder, int stage) ObjectInserter newObjectInserter, DirCacheBuilder builder, int stage)
throws IOException { throws IOException {

5
org.eclipse.jgit/src/org/eclipse/jgit/api/AddCommand.java

@ -203,12 +203,13 @@ public class AddCommand extends GitCommand<DirCache> {
builder.add(c.getDirCacheEntry()); builder.add(c.getDirCacheEntry());
} }
} else if (!update){ } else if (c != null
&& (!update || FileMode.GITLINK == c
.getEntryFileMode()))
builder.add(c.getDirCacheEntry()); builder.add(c.getDirCacheEntry());
} }
} }
} }
}
inserter.flush(); inserter.flush();
builder.commit(); builder.commit();
setCallable(false); setCallable(false);

Loading…
Cancel
Save