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 <nadavcoh@gmail.com>
This commit is contained in:
Nadav Cohen 2016-05-01 19:06:39 -07:00
parent 00db4ab06e
commit e81592e076
10 changed files with 31 additions and 0 deletions

View File

@ -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");

View File

@ -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<String> ol, List<String> nl) {