From ab57af08e83d5d042bb954ad280389b34ca36d0e Mon Sep 17 00:00:00 2001 From: Stefan Lay Date: Wed, 28 Jul 2010 11:00:22 +0200 Subject: [PATCH] Add "all" parameter to the commit Command When the add parameter is set all modified and deleted files are staged prior to commit. Change-Id: Id23bc25730fcdd151386cd495a7cdc0935cbc00b Signed-off-by: Stefan Lay --- .../jgit/api/CommitAndLogCommandTests.java | 34 +++++++++++++++++++ .../org/eclipse/jgit/api/CommitCommand.java | 29 ++++++++++++++++ 2 files changed, 63 insertions(+) diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CommitAndLogCommandTests.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CommitAndLogCommandTests.java index a62045dc9..cf30039ab 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CommitAndLogCommandTests.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CommitAndLogCommandTests.java @@ -45,6 +45,7 @@ import java.io.File; import java.io.FileWriter; import java.io.IOException; +import java.io.PrintWriter; import org.eclipse.jgit.errors.UnmergedPathException; import org.eclipse.jgit.lib.Constants; @@ -53,6 +54,7 @@ import org.eclipse.jgit.lib.RefUpdate; import org.eclipse.jgit.lib.RepositoryTestCase; import org.eclipse.jgit.revwalk.RevCommit; +import org.eclipse.jgit.treewalk.TreeWalk; public class CommitAndLogCommandTests extends RepositoryTestCase { public void testSomeCommits() throws NoHeadException, NoMessageException, @@ -151,4 +153,36 @@ public void testMergeEmptyBranches() throws IOException, NoHeadException, assertEquals(parents[1], second); assertTrue(parents.length==2); } + + public void testAddUnstagedChanges() throws IOException, NoHeadException, + NoMessageException, ConcurrentRefUpdateException, + JGitInternalException, WrongRepositoryStateException, + NoFilepatternException { + File file = new File(db.getWorkTree(), "a.txt"); + file.createNewFile(); + PrintWriter writer = new PrintWriter(file); + writer.print("content"); + writer.close(); + + Git git = new Git(db); + git.add().addFilepattern("a.txt").call(); + RevCommit commit = git.commit().setMessage("initial commit").call(); + TreeWalk tw = TreeWalk.forPath(db, "a.txt", commit.getTree()); + assertEquals("6b584e8ece562ebffc15d38808cd6b98fc3d97ea", + tw.getObjectId(0).getName()); + + writer = new PrintWriter(file); + writer.print("content2"); + writer.close(); + commit = git.commit().setMessage("second commit").call(); + tw = TreeWalk.forPath(db, "a.txt", commit.getTree()); + assertEquals("6b584e8ece562ebffc15d38808cd6b98fc3d97ea", + tw.getObjectId(0).getName()); + + commit = git.commit().setAll(true).setMessage("third commit") + .setAll(true).call(); + tw = TreeWalk.forPath(db, "a.txt", commit.getTree()); + assertEquals("db00fd65b218578127ea51f3dffac701f12f486a", + tw.getObjectId(0).getName()); + } } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/CommitCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/CommitCommand.java index 0dbe51281..ae4b33477 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/CommitCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/CommitCommand.java @@ -79,6 +79,8 @@ public class CommitCommand extends GitCommand { private String message; + private boolean all; + /** * parents this commit should have. The current HEAD will be in this list * and also all commits mentioned in .git/MERGE_HEAD @@ -127,6 +129,18 @@ public RevCommit call() throws NoHeadException, NoMessageException, processOptions(state); try { + if (all && !repo.isBare() && repo.getWorkTree() != null) { + Git git = new Git(repo); + try { + git.add() + .addFilepattern(".") + .setUpdate(true).call(); + } catch (NoFilepatternException e) { + // should really not happen + throw new JGitInternalException(e.getMessage(), e); + } + } + Ref head = repo.getRef(Constants.HEAD); if (head == null) throw new NoHeadException( @@ -353,4 +367,19 @@ public CommitCommand setAuthor(String name, String email) { public PersonIdent getAuthor() { return author; } + + /** + * If set to true the Commit command automatically stages files that have + * been modified and deleted, but new files you not known by the repository + * are not affected. This corresponds to the parameter -a on the command + * line. + * + * @param all + * @return {@code this} + */ + public CommitCommand setAll(boolean all) { + this.all = all; + return this; + } + }