Browse Source

Merge "Add the parameter "update" to the Add command"

stable-0.9
Chris Aniszczyk 15 years ago committed by Code Review
parent
commit
ad4274abcc
  1. 244
      org.eclipse.jgit.test/tst/org/eclipse/jgit/api/AddCommandTest.java
  2. 1
      org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/RepositoryTestCase.java
  3. 31
      org.eclipse.jgit/src/org/eclipse/jgit/api/AddCommand.java

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

@ -44,15 +44,17 @@
package org.eclipse.jgit.api; package org.eclipse.jgit.api;
import java.io.File; import java.io.File;
import java.io.FileInputStream;
import java.io.IOException; import java.io.IOException;
import java.io.PrintWriter; import java.io.PrintWriter;
import org.eclipse.jgit.dircache.DirCache; import org.eclipse.jgit.dircache.DirCache;
import org.eclipse.jgit.dircache.DirCacheBuilder; import org.eclipse.jgit.dircache.DirCacheBuilder;
import org.eclipse.jgit.dircache.DirCacheEntry; import org.eclipse.jgit.dircache.DirCacheEntry;
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.ObjectWriter; import org.eclipse.jgit.lib.ObjectInserter;
import org.eclipse.jgit.lib.RepositoryTestCase; import org.eclipse.jgit.lib.RepositoryTestCase;
public class AddCommandTest extends RepositoryTestCase { public class AddCommandTest extends RepositoryTestCase {
@ -86,15 +88,11 @@ public class AddCommandTest extends RepositoryTestCase {
Git git = new Git(db); Git git = new Git(db);
DirCache dc = git.add().addFilepattern("a.txt").call(); git.add().addFilepattern("a.txt").call();
assertEquals(1, dc.getEntryCount()); assertEquals(
assertEquals("a.txt", dc.getEntry(0).getPathString()); "[a.txt, mode:100644, sha1:6b584e8ece562ebffc15d38808cd6b98fc3d97ea]",
assertNotNull(dc.getEntry(0).getObjectId()); indexState(CONTENT_ID));
assertEquals(file.lastModified(), dc.getEntry(0).getLastModified());
assertEquals(file.length(), dc.getEntry(0).getLength());
assertEquals(FileMode.REGULAR_FILE, dc.getEntry(0).getFileMode());
assertEquals(0, dc.getEntry(0).getStage());
} }
public void testAddExistingSingleFileInSubDir() throws IOException, NoFilepatternException { public void testAddExistingSingleFileInSubDir() throws IOException, NoFilepatternException {
@ -107,15 +105,11 @@ public class AddCommandTest extends RepositoryTestCase {
Git git = new Git(db); Git git = new Git(db);
DirCache dc = git.add().addFilepattern("sub/a.txt").call(); git.add().addFilepattern("sub/a.txt").call();
assertEquals(1, dc.getEntryCount()); assertEquals(
assertEquals("sub/a.txt", dc.getEntry(0).getPathString()); "[sub/a.txt, mode:100644, sha1:6b584e8ece562ebffc15d38808cd6b98fc3d97ea]",
assertNotNull(dc.getEntry(0).getObjectId()); indexState(CONTENT_ID));
assertEquals(file.lastModified(), dc.getEntry(0).getLastModified());
assertEquals(file.length(), dc.getEntry(0).getLength());
assertEquals(FileMode.REGULAR_FILE, dc.getEntry(0).getFileMode());
assertEquals(0, dc.getEntry(0).getStage());
} }
public void testAddExistingSingleFileTwice() throws IOException, NoFilepatternException { public void testAddExistingSingleFileTwice() throws IOException, NoFilepatternException {
@ -128,7 +122,7 @@ public class AddCommandTest extends RepositoryTestCase {
Git git = new Git(db); Git git = new Git(db);
DirCache dc = git.add().addFilepattern("a.txt").call(); DirCache dc = git.add().addFilepattern("a.txt").call();
ObjectId id1 = dc.getEntry(0).getObjectId(); dc.getEntry(0).getObjectId();
writer = new PrintWriter(file); writer = new PrintWriter(file);
writer.print("other content"); writer.print("other content");
@ -136,10 +130,9 @@ public class AddCommandTest extends RepositoryTestCase {
dc = git.add().addFilepattern("a.txt").call(); dc = git.add().addFilepattern("a.txt").call();
assertEquals(1, dc.getEntryCount()); assertEquals(
assertEquals("a.txt", dc.getEntry(0).getPathString()); "[a.txt, mode:100644, sha1:4f41554f6e0045ef53848fc0c3f33b6a9abc24a9]",
assertNotSame(id1, dc.getEntry(0).getObjectId()); indexState(CONTENT_ID));
assertEquals(0, dc.getEntry(0).getStage());
} }
public void testAddExistingSingleFileTwiceWithCommit() throws Exception { public void testAddExistingSingleFileTwiceWithCommit() throws Exception {
@ -152,7 +145,7 @@ public class AddCommandTest extends RepositoryTestCase {
Git git = new Git(db); Git git = new Git(db);
DirCache dc = git.add().addFilepattern("a.txt").call(); DirCache dc = git.add().addFilepattern("a.txt").call();
ObjectId id1 = dc.getEntry(0).getObjectId(); dc.getEntry(0).getObjectId();
git.commit().setMessage("commit a.txt").call(); git.commit().setMessage("commit a.txt").call();
@ -162,10 +155,9 @@ public class AddCommandTest extends RepositoryTestCase {
dc = git.add().addFilepattern("a.txt").call(); dc = git.add().addFilepattern("a.txt").call();
assertEquals(1, dc.getEntryCount()); assertEquals(
assertEquals("a.txt", dc.getEntry(0).getPathString()); "[a.txt, mode:100644, sha1:4f41554f6e0045ef53848fc0c3f33b6a9abc24a9]",
assertNotSame(id1, dc.getEntry(0).getObjectId()); indexState(CONTENT_ID));
assertEquals(0, dc.getEntry(0).getStage());
} }
public void testAddRemovedFile() throws Exception { public void testAddRemovedFile() throws Exception {
@ -178,16 +170,15 @@ public class AddCommandTest extends RepositoryTestCase {
Git git = new Git(db); Git git = new Git(db);
DirCache dc = git.add().addFilepattern("a.txt").call(); DirCache dc = git.add().addFilepattern("a.txt").call();
ObjectId id1 = dc.getEntry(0).getObjectId(); dc.getEntry(0).getObjectId();
file.delete(); file.delete();
// is supposed to do nothing // is supposed to do nothing
dc = git.add().addFilepattern("a.txt").call(); dc = git.add().addFilepattern("a.txt").call();
assertEquals(1, dc.getEntryCount()); assertEquals(
assertEquals("a.txt", dc.getEntry(0).getPathString()); "[a.txt, mode:100644, sha1:6b584e8ece562ebffc15d38808cd6b98fc3d97ea]",
assertEquals(id1, dc.getEntry(0).getObjectId()); indexState(CONTENT_ID));
assertEquals(0, dc.getEntry(0).getStage());
} }
public void testAddRemovedCommittedFile() throws Exception { public void testAddRemovedCommittedFile() throws Exception {
@ -202,16 +193,15 @@ public class AddCommandTest extends RepositoryTestCase {
git.commit().setMessage("commit a.txt").call(); git.commit().setMessage("commit a.txt").call();
ObjectId id1 = dc.getEntry(0).getObjectId(); dc.getEntry(0).getObjectId();
file.delete(); file.delete();
// is supposed to do nothing // is supposed to do nothing
dc = git.add().addFilepattern("a.txt").call(); dc = git.add().addFilepattern("a.txt").call();
assertEquals(1, dc.getEntryCount()); assertEquals(
assertEquals("a.txt", dc.getEntry(0).getPathString()); "[a.txt, mode:100644, sha1:6b584e8ece562ebffc15d38808cd6b98fc3d97ea]",
assertEquals(id1, dc.getEntry(0).getObjectId()); indexState(CONTENT_ID));
assertEquals(0, dc.getEntry(0).getStage());
} }
public void testAddWithConflicts() throws Exception { public void testAddWithConflicts() throws Exception {
@ -229,38 +219,42 @@ public class AddCommandTest extends RepositoryTestCase {
writer.print("content b"); writer.print("content b");
writer.close(); writer.close();
ObjectWriter ow = new ObjectWriter(db); ObjectInserter newObjectInserter = db.newObjectInserter();
DirCache dc = db.lockDirCache(); DirCache dc = db.lockDirCache();
DirCacheBuilder builder = dc.builder(); DirCacheBuilder builder = dc.builder();
addEntryToBuilder("b.txt", file2, ow, builder, 0); addEntryToBuilder("b.txt", file2, newObjectInserter, builder, 0);
addEntryToBuilder("a.txt", file, ow, builder, 1); addEntryToBuilder("a.txt", file, newObjectInserter, builder, 1);
writer = new PrintWriter(file); writer = new PrintWriter(file);
writer.print("other content"); writer.print("other content");
writer.close(); writer.close();
addEntryToBuilder("a.txt", file, ow, builder, 3); addEntryToBuilder("a.txt", file, newObjectInserter, builder, 3);
writer = new PrintWriter(file); writer = new PrintWriter(file);
writer.print("our content"); writer.print("our content");
writer.close(); writer.close();
ObjectId id1 = addEntryToBuilder("a.txt", file, ow, builder, 2) addEntryToBuilder("a.txt", file, newObjectInserter, builder, 2)
.getObjectId(); .getObjectId();
builder.commit(); builder.commit();
assertEquals(4, dc.getEntryCount()); assertEquals(
"[a.txt, mode:100644, stage:1, sha1:6b584e8ece562ebffc15d38808cd6b98fc3d97ea]" +
"[a.txt, mode:100644, stage:2, sha1:b9f89ff733bdaf49e02711535867bb821f9db55e]" +
"[a.txt, mode:100644, stage:3, sha1:4f41554f6e0045ef53848fc0c3f33b6a9abc24a9]" +
"[b.txt, mode:100644, sha1:50e9cdb03f9719261dd39d7f2920b906db3711a3]",
indexState(CONTENT_ID));
// now the test begins // now the test begins
Git git = new Git(db); Git git = new Git(db);
dc = git.add().addFilepattern("a.txt").call(); dc = git.add().addFilepattern("a.txt").call();
assertEquals(2, dc.getEntryCount()); assertEquals(
assertEquals("a.txt", dc.getEntry("a.txt").getPathString()); "[a.txt, mode:100644, sha1:b9f89ff733bdaf49e02711535867bb821f9db55e]" +
assertEquals(id1, dc.getEntry("a.txt").getObjectId()); "[b.txt, mode:100644, sha1:50e9cdb03f9719261dd39d7f2920b906db3711a3]",
assertEquals(0, dc.getEntry("a.txt").getStage()); indexState(CONTENT_ID));
assertEquals(0, dc.getEntry("b.txt").getStage());
} }
public void testAddTwoFiles() throws Exception { public void testAddTwoFiles() throws Exception {
@ -277,13 +271,11 @@ public class AddCommandTest extends RepositoryTestCase {
writer.close(); writer.close();
Git git = new Git(db); Git git = new Git(db);
DirCache dc = git.add().addFilepattern("a.txt").addFilepattern("b.txt").call(); git.add().addFilepattern("a.txt").addFilepattern("b.txt").call();
assertEquals("a.txt", dc.getEntry("a.txt").getPathString()); assertEquals(
assertEquals("b.txt", dc.getEntry("b.txt").getPathString()); "[a.txt, mode:100644, sha1:6b584e8ece562ebffc15d38808cd6b98fc3d97ea]" +
assertNotNull(dc.getEntry("a.txt").getObjectId()); "[b.txt, mode:100644, sha1:50e9cdb03f9719261dd39d7f2920b906db3711a3]",
assertNotNull(dc.getEntry("b.txt").getObjectId()); indexState(CONTENT_ID));
assertEquals(0, dc.getEntry("a.txt").getStage());
assertEquals(0, dc.getEntry("b.txt").getStage());
} }
public void testAddFolder() throws Exception { public void testAddFolder() throws Exception {
@ -301,13 +293,11 @@ public class AddCommandTest extends RepositoryTestCase {
writer.close(); writer.close();
Git git = new Git(db); Git git = new Git(db);
DirCache dc = git.add().addFilepattern("sub").call(); git.add().addFilepattern("sub").call();
assertEquals("sub/a.txt", dc.getEntry("sub/a.txt").getPathString()); assertEquals(
assertEquals("sub/b.txt", dc.getEntry("sub/b.txt").getPathString()); "[sub/a.txt, mode:100644, sha1:6b584e8ece562ebffc15d38808cd6b98fc3d97ea]" +
assertNotNull(dc.getEntry("sub/a.txt").getObjectId()); "[sub/b.txt, mode:100644, sha1:50e9cdb03f9719261dd39d7f2920b906db3711a3]",
assertNotNull(dc.getEntry("sub/b.txt").getObjectId()); indexState(CONTENT_ID));
assertEquals(0, dc.getEntry("sub/a.txt").getStage());
assertEquals(0, dc.getEntry("sub/b.txt").getStage());
} }
public void testAddIgnoredFile() throws Exception { public void testAddIgnoredFile() throws Exception {
@ -331,11 +321,11 @@ public class AddCommandTest extends RepositoryTestCase {
writer.close(); writer.close();
Git git = new Git(db); Git git = new Git(db);
DirCache dc = git.add().addFilepattern("sub").call(); git.add().addFilepattern("sub").call();
assertEquals("sub/a.txt", dc.getEntry("sub/a.txt").getPathString());
assertNull(dc.getEntry("sub/b.txt")); assertEquals(
assertNotNull(dc.getEntry("sub/a.txt").getObjectId()); "[sub/a.txt, mode:100644, sha1:6b584e8ece562ebffc15d38808cd6b98fc3d97ea]",
assertEquals(0, dc.getEntry("sub/a.txt").getStage()); indexState(CONTENT_ID));
} }
public void testAddWholeRepo() throws Exception { public void testAddWholeRepo() throws Exception {
@ -353,15 +343,125 @@ public class AddCommandTest extends RepositoryTestCase {
writer.close(); writer.close();
Git git = new Git(db); Git git = new Git(db);
DirCache dc = git.add().addFilepattern(".").call(); git.add().addFilepattern(".").call();
assertEquals("sub/a.txt", dc.getEntry("sub/a.txt").getPathString()); assertEquals(
assertEquals("sub/b.txt", dc.getEntry("sub/b.txt").getPathString()); "[sub/a.txt, mode:100644, sha1:6b584e8ece562ebffc15d38808cd6b98fc3d97ea]" +
"[sub/b.txt, mode:100644, sha1:50e9cdb03f9719261dd39d7f2920b906db3711a3]",
indexState(CONTENT_ID));
}
// the same three cases as in testAddWithParameterUpdate
// file a exists in workdir and in index -> added
// file b exists not in workdir but in index -> unchanged
// file c exists in workdir but not in index -> added
public void testAddWithoutParameterUpdate() throws Exception {
new File(db.getWorkTree(), "sub").mkdir();
File file = new File(db.getWorkTree(), "sub/a.txt");
file.createNewFile();
PrintWriter writer = new PrintWriter(file);
writer.print("content");
writer.close();
File file2 = new File(db.getWorkTree(), "sub/b.txt");
file2.createNewFile();
writer = new PrintWriter(file2);
writer.print("content b");
writer.close();
Git git = new Git(db);
git.add().addFilepattern("sub").call();
assertEquals(
"[sub/a.txt, mode:100644, sha1:6b584e8ece562ebffc15d38808cd6b98fc3d97ea]" +
"[sub/b.txt, mode:100644, sha1:50e9cdb03f9719261dd39d7f2920b906db3711a3]",
indexState(CONTENT_ID));
git.commit().setMessage("commit").call();
// new unstaged file sub/c.txt
File file3 = new File(db.getWorkTree(), "sub/c.txt");
file3.createNewFile();
writer = new PrintWriter(file3);
writer.print("content c");
writer.close();
// file sub/a.txt is modified
writer = new PrintWriter(file);
writer.print("modified content");
writer.close();
// file sub/b.txt is deleted
file2.delete();
git.add().addFilepattern("sub").call();
// change in sub/a.txt is staged
// deletion of sub/b.txt is not staged
// sub/c.txt is staged
assertEquals(
"[sub/a.txt, mode:100644, sha1:268af4e306cfcf6e79edd50fed9c553d211f68e3]" +
"[sub/b.txt, mode:100644, sha1:50e9cdb03f9719261dd39d7f2920b906db3711a3]" +
"[sub/c.txt, mode:100644, sha1:fa08654474ae2ddc4f61ee3a43d017ba65a439c3]",
indexState(CONTENT_ID));
}
// file a exists in workdir and in index -> added
// file b exists not in workdir but in index -> deleted
// file c exists in workdir but not in index -> unchanged
public void testAddWithParameterUpdate() throws Exception {
new File(db.getWorkTree(), "sub").mkdir();
File file = new File(db.getWorkTree(), "sub/a.txt");
file.createNewFile();
PrintWriter writer = new PrintWriter(file);
writer.print("content");
writer.close();
File file2 = new File(db.getWorkTree(), "sub/b.txt");
file2.createNewFile();
writer = new PrintWriter(file2);
writer.print("content b");
writer.close();
Git git = new Git(db);
git.add().addFilepattern("sub").call();
assertEquals(
"[sub/a.txt, mode:100644, sha1:6b584e8ece562ebffc15d38808cd6b98fc3d97ea]" +
"[sub/b.txt, mode:100644, sha1:50e9cdb03f9719261dd39d7f2920b906db3711a3]",
indexState(CONTENT_ID));
git.commit().setMessage("commit").call();
// new unstaged file sub/c.txt
File file3 = new File(db.getWorkTree(), "sub/c.txt");
file3.createNewFile();
writer = new PrintWriter(file3);
writer.print("content c");
writer.close();
// file sub/a.txt is modified
writer = new PrintWriter(file);
writer.print("modified content");
writer.close();
file2.delete();
// change in sub/a.txt is staged
// deletion of sub/b.txt is staged
// sub/c.txt is not staged
git.add().addFilepattern("sub").setUpdate(true).call();
// change in sub/a.txt is staged
assertEquals(
"[sub/a.txt, mode:100644, sha1:268af4e306cfcf6e79edd50fed9c553d211f68e3]",
indexState(CONTENT_ID));
} }
private DirCacheEntry addEntryToBuilder(String path, File file, private DirCacheEntry addEntryToBuilder(String path, File file,
ObjectWriter ow, DirCacheBuilder builder, int stage) ObjectInserter newObjectInserter, DirCacheBuilder builder, int stage)
throws IOException { throws IOException {
ObjectId id = ow.writeBlob(file); FileInputStream inputStream = new FileInputStream(file);
ObjectId id = newObjectInserter.insert(
Constants.OBJ_BLOB, file.length(), inputStream);
inputStream.close();
DirCacheEntry entry = new DirCacheEntry(path, stage); DirCacheEntry entry = new DirCacheEntry(path, stage);
entry.setObjectId(id); entry.setObjectId(id);
entry.setFileMode(FileMode.REGULAR_FILE); entry.setFileMode(FileMode.REGULAR_FILE);

1
org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/RepositoryTestCase.java

@ -175,6 +175,7 @@ public abstract class RepositoryTestCase extends LocalDiskRepositoryTestCase {
// iterate again, now produce the result string // iterate again, now produce the result string
NameConflictTreeWalk tw = new NameConflictTreeWalk(db); NameConflictTreeWalk tw = new NameConflictTreeWalk(db);
tw.setRecursive(true);
tw.reset(); tw.reset();
tw.addTree(new DirCacheIterator(dc)); tw.addTree(new DirCacheIterator(dc));
while (tw.next()) { while (tw.next()) {

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

@ -76,6 +76,8 @@ public class AddCommand extends GitCommand<DirCache> {
private WorkingTreeIterator workingTreeIterator; private WorkingTreeIterator workingTreeIterator;
private boolean update = false;
/** /**
* *
* @param repo * @param repo
@ -158,6 +160,7 @@ public class AddCommand extends GitCommand<DirCache> {
// this path, we however want to add only one // this path, we however want to add only one
// new DirCacheEntry per path. // new DirCacheEntry per path.
else if (!(path.equals(lastAddedFile))) { else if (!(path.equals(lastAddedFile))) {
if (!(update && tw.getTree(0, DirCacheIterator.class) == null)) {
if (f != null) { // the file exists if (f != null) { // the file exists
DirCacheEntry entry = new DirCacheEntry(path); DirCacheEntry entry = new DirCacheEntry(path);
entry.setLength((int)f.getEntryLength()); entry.setLength((int)f.getEntryLength());
@ -167,12 +170,13 @@ public class AddCommand extends GitCommand<DirCache> {
builder.add(entry); builder.add(entry);
lastAddedFile = path; lastAddedFile = path;
} else { } else if (!update){
c = tw.getTree(0, DirCacheIterator.class); c = tw.getTree(0, DirCacheIterator.class);
builder.add(c.getDirCacheEntry()); builder.add(c.getDirCacheEntry());
} }
} }
} }
}
builder.commit(); builder.commit();
setCallable(false); setCallable(false);
} catch (IOException e) { } catch (IOException e) {
@ -186,4 +190,29 @@ public class AddCommand extends GitCommand<DirCache> {
return dc; return dc;
} }
/**
* @param update
* If set to true, the command only matches {@code filepattern}
* against already tracked files in the index rather than the
* working tree. That means that it will never stage new files,
* but that it will stage modified new contents of tracked files
* and that it will remove files from the index if the
* corresponding files in the working tree have been removed.
* In contrast to the git command line a {@code filepattern} must
* exist also if update is set to true as there is no
* concept of a working directory here.
*
* @return {@code this}
*/
public AddCommand setUpdate(boolean update) {
this.update = update;
return this;
}
/**
* @return is the parameter update is set
*/
public boolean isUpdate() {
return update;
}
} }

Loading…
Cancel
Save