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>tags/v4.4.0.201605250940-rc1
@@ -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 |
@@ -0,0 +1,3 @@ | |||
a | |||
b | |||
c |
@@ -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 |
@@ -0,0 +1 @@ | |||
a |
@@ -0,0 +1,3 @@ | |||
a | |||
b | |||
c |
@@ -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 |
@@ -0,0 +1,3 @@ | |||
a | |||
b | |||
c |
@@ -0,0 +1 @@ | |||
a |
@@ -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"); |
@@ -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) { |