From e81592e07692284aab607e959096030027067695 Mon Sep 17 00:00:00 2001 From: Nadav Cohen Date: Sun, 1 May 2016 19:06:39 -0700 Subject: [PATCH] Allow setting FileMode to executable when applying patches in ApplyCommand git-apply allows modifying file modes in patched files using either "new mode" or "new file mode" headers. This patch adds support for setting files as executables and vice-versa. Change-Id: I24848966b46f686f540a8efa8150b42e0d9c3ad1 Signed-off-by: Nadav Cohen --- .../tst-rsrc/org/eclipse/jgit/diff/M1.patch | Bin 0 -> 113 bytes .../org/eclipse/jgit/diff/M1_PostImage | Bin 0 -> 6 bytes .../tst-rsrc/org/eclipse/jgit/diff/M2.patch | Bin 0 -> 119 bytes .../org/eclipse/jgit/diff/M2_PostImage | Bin 0 -> 2 bytes .../org/eclipse/jgit/diff/M2_PreImage | Bin 0 -> 6 bytes .../tst-rsrc/org/eclipse/jgit/diff/M3.patch | Bin 0 -> 119 bytes .../org/eclipse/jgit/diff/M3_PostImage | Bin 0 -> 6 bytes .../org/eclipse/jgit/diff/M3_PreImage | Bin 0 -> 2 bytes .../eclipse/jgit/api/ApplyCommandTest.java | 28 ++++++++++++++++++ .../org/eclipse/jgit/api/ApplyCommand.java | 3 ++ 10 files changed, 31 insertions(+) create mode 100644 org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/M1.patch create mode 100644 org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/M1_PostImage create mode 100644 org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/M2.patch create mode 100644 org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/M2_PostImage create mode 100644 org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/M2_PreImage create mode 100644 org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/M3.patch create mode 100644 org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/M3_PostImage create mode 100755 org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/M3_PreImage diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/M1.patch b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/M1.patch new file mode 100644 index 0000000000000000000000000000000000000000..395bd4c50363a78bdd01031a036878057b4c8d7b GIT binary patch literal 113 zcmXBMF%E+;3`XJIr}%ec;;5j~Ef?q^06SHrG+ik4_*CKz-}tQL43SsaFo$Qv@`suq z$fY{oA9F<2`#4f*=0E6F-_}4*CHi|b_$N&4Ji@N#0&9CC(^GR A5C8xG literal 0 HcmV?d00001 diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/M1_PostImage b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/M1_PostImage new file mode 100644 index 0000000000000000000000000000000000000000..de980441c3ab03a8c07dda1ad27b8a11f39deb1e GIT binary patch literal 6 NcmYe~O5#f90ssW`0Yv}+ literal 0 HcmV?d00001 diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/M2.patch b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/M2.patch new file mode 100644 index 0000000000000000000000000000000000000000..b56ca0828e665f2f58dac29f5bd28141899c1367 GIT binary patch literal 119 zcmX|(I|_g>5C!`^#p{#R#J^oG;33qF5>V3!dVIxzQ#=@WjD%$Y^BPW!`A}ebhvFvK yqj*?jnyRA1U%$6?P2muK!z8jyeBYV(#>`)Ylu{|=9N6j-%4!Se2qW=CJktYK+#F&6 literal 0 HcmV?d00001 diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/M2_PostImage b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/M2_PostImage new file mode 100644 index 0000000000000000000000000000000000000000..78981922613b2afb6025042ff6bd878ac1994e85 GIT binary patch literal 2 JcmYe~0ssKc0BisN literal 0 HcmV?d00001 diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/M2_PreImage b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/M2_PreImage new file mode 100644 index 0000000000000000000000000000000000000000..de980441c3ab03a8c07dda1ad27b8a11f39deb1e GIT binary patch literal 6 NcmYe~O5#f90ssW`0Yv}+ literal 0 HcmV?d00001 diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/M3.patch b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/M3.patch new file mode 100644 index 0000000000000000000000000000000000000000..ee536058ab6bdbd165e9e88e50ba39e320ba044c GIT binary patch literal 119 zcmX|(I|_g>5C!`^#p~DAg!t`p0S{r^C;>l>pvPAfoZ`W}Vl+(?MCNp0D0+wR4DE|z y-8I4*(^M60@%+6mOG=x@3+5xwHFm9eZV`DS#LQpFdx*^}*k%si69(cyJkkwU{2XEc literal 0 HcmV?d00001 diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/M3_PostImage b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/M3_PostImage new file mode 100644 index 0000000000000000000000000000000000000000..de980441c3ab03a8c07dda1ad27b8a11f39deb1e GIT binary patch literal 6 NcmYe~O5#f90ssW`0Yv}+ literal 0 HcmV?d00001 diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/M3_PreImage b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/M3_PreImage new file mode 100755 index 0000000000000000000000000000000000000000..78981922613b2afb6025042ff6bd878ac1994e85 GIT binary patch literal 2 JcmYe~0ssKc0BisN literal 0 HcmV?d00001 diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/ApplyCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/ApplyCommandTest.java index f2b5b3ba9..172807c43 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/ApplyCommandTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/ApplyCommandTest.java @@ -44,6 +44,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.ByteArrayOutputStream; @@ -156,6 +157,33 @@ public void testModifyW() throws Exception { b.getString(0, b.size(), false)); } + @Test + public void testAddM1() throws Exception { + ApplyResult result = init("M1", false, true); + assertEquals(1, result.getUpdatedFiles().size()); + assertTrue(result.getUpdatedFiles().get(0).canExecute()); + checkFile(new File(db.getWorkTree(), "M1"), + b.getString(0, b.size(), false)); + } + + @Test + public void testModifyM2() throws Exception { + ApplyResult result = init("M2", true, true); + assertEquals(1, result.getUpdatedFiles().size()); + assertTrue(result.getUpdatedFiles().get(0).canExecute()); + checkFile(new File(db.getWorkTree(), "M2"), + b.getString(0, b.size(), false)); + } + + @Test + public void testModifyM3() throws Exception { + ApplyResult result = init("M3", true, true); + assertEquals(1, result.getUpdatedFiles().size()); + assertFalse(result.getUpdatedFiles().get(0).canExecute()); + checkFile(new File(db.getWorkTree(), "M3"), + b.getString(0, b.size(), false)); + } + @Test public void testModifyX() throws Exception { ApplyResult result = init("X"); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/ApplyCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/ApplyCommand.java index 8fbf83954..d74e99139 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/ApplyCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/ApplyCommand.java @@ -58,6 +58,7 @@ import org.eclipse.jgit.diff.DiffEntry.ChangeType; import org.eclipse.jgit.diff.RawText; import org.eclipse.jgit.internal.JGitText; +import org.eclipse.jgit.lib.FileMode; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.patch.FileHeader; import org.eclipse.jgit.patch.HunkHeader; @@ -260,6 +261,8 @@ private void apply(File f, FileHeader fh) FileWriter fw = new FileWriter(f); fw.write(sb.toString()); fw.close(); + + getRepository().getFS().setExecute(f, fh.getNewMode() == FileMode.EXECUTABLE_FILE); } private static boolean isChanged(List ol, List nl) {