From d5c890e0fdbfdd5d532121a2eb812ee2143c8ab5 Mon Sep 17 00:00:00 2001 From: Robin Rosenberg Date: Sat, 7 Jan 2012 14:00:14 +0100 Subject: [PATCH] Cannot commit -o file with only file permission change Bug 345076 Change-Id: Ie64039793ab6ba4748731320399f03301b6282ec Signed-off-by: Matthias Sohn --- .../jgit/api/CommitAndLogCommandTests.java | 31 +++++++++++++++++++ .../org/eclipse/jgit/api/CommitCommand.java | 5 ++- 2 files changed, 35 insertions(+), 1 deletion(-) 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 aac1dc1496..e6b6a096fa 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 @@ -67,6 +67,7 @@ import org.eclipse.jgit.lib.RepositoryTestCase; import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.storage.file.ReflogReader; import org.eclipse.jgit.treewalk.TreeWalk; +import org.eclipse.jgit.util.FS; import org.eclipse.jgit.util.FileUtils; import org.eclipse.jgit.util.RawParseUtils; import org.junit.Test; @@ -266,6 +267,36 @@ public class CommitAndLogCommandTests extends RepositoryTestCase { tw.getObjectId(0).getName()); } + @Test + public void testModeChange() throws IOException, NoFilepatternException, + NoHeadException, NoMessageException, ConcurrentRefUpdateException, + JGitInternalException, WrongRepositoryStateException { + Git git = new Git(db); + + // create file + File file = new File(db.getWorkTree(), "a.txt"); + FileUtils.createNewFile(file); + PrintWriter writer = new PrintWriter(file); + writer.print("content1"); + writer.close(); + + // First commit - a.txt file + git.add().addFilepattern("a.txt").call(); + git.commit().setMessage("commit1").setCommitter(committer).call(); + + // pure mode change should be committable + FS fs = db.getFS(); + fs.setExecute(file, true); + git.add().addFilepattern("a.txt").call(); + git.commit().setMessage("mode change").setCommitter(committer).call(); + + // pure mode change should be committable with -o option + fs.setExecute(file, false); + git.add().addFilepattern("a.txt").call(); + git.commit().setMessage("mode change").setCommitter(committer) + .setOnly("a.txt").call(); + } + @Test public void testCommitRange() throws NoHeadException, NoMessageException, UnmergedPathException, ConcurrentRefUpdateException, 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 a6d780e908..d2386f1e82 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/CommitCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/CommitCommand.java @@ -382,7 +382,10 @@ public class CommitCommand extends GitCommand { // add to temporary in-core index dcBuilder.add(dcEntry); - if (emptyCommit && (hTree == null || !hTree.idEqual(fTree))) + if (emptyCommit + && (hTree == null || !hTree.idEqual(fTree) || hTree + .getEntryRawMode() != fTree + .getEntryRawMode())) // this is a change emptyCommit = false; } else { -- 2.39.5