]> source.dussan.org Git - jgit.git/commitdiff
Allow setting FileMode to executable when applying patches in ApplyCommand 58/71758/3
authorNadav Cohen <nadavcoh@gmail.com>
Mon, 2 May 2016 02:06:39 +0000 (19:06 -0700)
committerNadav Cohen <nadavcoh@gmail.com>
Tue, 17 May 2016 07:08:01 +0000 (00:08 -0700)
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 <nadavcoh@gmail.com>
org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/M1.patch [new file with mode: 0644]
org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/M1_PostImage [new file with mode: 0644]
org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/M2.patch [new file with mode: 0644]
org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/M2_PostImage [new file with mode: 0644]
org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/M2_PreImage [new file with mode: 0644]
org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/M3.patch [new file with mode: 0644]
org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/M3_PostImage [new file with mode: 0644]
org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/M3_PreImage [new file with mode: 0755]
org.eclipse.jgit.test/tst/org/eclipse/jgit/api/ApplyCommandTest.java
org.eclipse.jgit/src/org/eclipse/jgit/api/ApplyCommand.java

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 (file)
index 0000000..395bd4c
--- /dev/null
@@ -0,0 +1,9 @@
+diff --git a/M1 b/M1
+new file mode 100755
+index 0000000..de98044
+--- /dev/null
++++ b/M1
+@@ -0,0 +1,3 @@
++a
++b
++c
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 (file)
index 0000000..de98044
--- /dev/null
@@ -0,0 +1,3 @@
+a
+b
+c
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 (file)
index 0000000..b56ca08
--- /dev/null
@@ -0,0 +1,10 @@
+diff --git a/M2 b/M2
+old mode 100644
+new mode 100755
+index 0000000..de98044
+--- a/M2
++++ b/M2
+@@ -1,3 +1,1 @@
+ a
+-b
+-c
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 (file)
index 0000000..7898192
--- /dev/null
@@ -0,0 +1 @@
+a
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 (file)
index 0000000..de98044
--- /dev/null
@@ -0,0 +1,3 @@
+a
+b
+c
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 (file)
index 0000000..ee53605
--- /dev/null
@@ -0,0 +1,10 @@
+diff --git a/M3 b/M3
+old mode 100755
+new mode 100644
+index 0000000..de98044
+--- a/M3
++++ b/M3
+@@ -1,1 +1,3 @@
+ a
++b
++c
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 (file)
index 0000000..de98044
--- /dev/null
@@ -0,0 +1,3 @@
+a
+b
+c
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 (executable)
index 0000000..7898192
--- /dev/null
@@ -0,0 +1 @@
+a
index f2b5b3ba95dff776c099ead95ab6c1bbbbdd925f..172807c43d50e34643882a3c4f9a52c66a567dd4 100644 (file)
@@ -44,6 +44,7 @@ package org.eclipse.jgit.api;
 
 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 class ApplyCommandTest extends RepositoryTestCase {
                                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");
index 8fbf83954cb441098a318490d7a8bf6054abb1f5..d74e991395a36f860136b5188110dfc0bf8c7b16 100644 (file)
@@ -58,6 +58,7 @@ import org.eclipse.jgit.api.errors.PatchFormatException;
 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 @@ public class ApplyCommand extends GitCommand<ApplyResult> {
                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<String> ol, List<String> nl) {