Merge changes from topic "apply"

* changes:
  ApplyCommand: fix "no newline at end" detection
  ApplyCommand: handle completely empty context lines in text patches
  ApplyCommand: use byte arrays for text patches, not strings
  ApplyCommand: support binary patches
  ApplyCommand: add a stream to apply a delta patch
  ApplyCommand: add streams to read/write binary patch hunks
  ApplyCommand: add a base-85 codec
  ApplyCommand: convert to git internal format before applying patch
diff --git a/org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/RevListTest.java b/org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/RevListTest.java
new file mode 100644
index 0000000..06fddc2
--- /dev/null
+++ b/org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/RevListTest.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2021, kylezhao <kylezhao@tencent.com> and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Distribution License v. 1.0 which is available at
+ * https://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+package org.eclipse.jgit.pgm;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jgit.api.Git;
+import org.eclipse.jgit.lib.CLIRepositoryTestCase;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.junit.Before;
+import org.junit.Test;
+
+public class RevListTest extends CLIRepositoryTestCase {
+
+	private Git git;
+
+	@Override
+	@Before
+	public void setUp() throws Exception {
+		super.setUp();
+		git = new Git(db);
+	}
+
+	@Test
+	public void testWithParentsFlag() throws Exception {
+		List<RevCommit> commits = createCommitsForParentsFlag(git);
+		String result = toString(
+				execute("git rev-list HEAD --parents -- Test.txt"));
+
+		String expect = toString(
+				commits.get(3).name() + ' ' + commits.get(1).name(),
+				commits.get(1).name());
+
+		assertEquals(expect, result);
+	}
+
+	@Test
+	public void testWithoutParentsFlag() throws Exception {
+		List<RevCommit> commits = createCommitsForParentsFlag(git);
+		String result = toString(execute("git rev-list HEAD -- Test.txt"));
+
+		String expect = toString(commits.get(3).name(), commits.get(1).name());
+
+		assertEquals(expect, result);
+	}
+
+	private List<RevCommit> createCommitsForParentsFlag(Git git)
+			throws Exception {
+		List<RevCommit> commits = new ArrayList<>();
+		writeTrashFile("Test1.txt", "Hello world");
+		git.add().addFilepattern("Test1.txt").call();
+		commits.add(git.commit().setMessage("commit#0").call());
+		writeTrashFile("Test.txt", "Hello world!");
+		git.add().addFilepattern("Test.txt").call();
+		commits.add(git.commit().setMessage("commit#1").call());
+		writeTrashFile("Test1.txt", "Hello world!!");
+		git.add().addFilepattern("Test1.txt").call();
+		commits.add(git.commit().setMessage("commit#2").call());
+		writeTrashFile("Test.txt", "Hello world!!!");
+		git.add().addFilepattern("Test.txt").call();
+		commits.add(git.commit().setMessage("commit#3").call());
+		return commits;
+	}
+}
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/RevWalkTextBuiltin.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/RevWalkTextBuiltin.java
index 822f899..696a924 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/RevWalkTextBuiltin.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/RevWalkTextBuiltin.java
@@ -129,6 +129,9 @@
 			walk.setTreeFilter(AndTreeFilter.create(pathFilter,
 					TreeFilter.ANY_DIFF));
 		}
+		if (parents) {
+			walk.setRewriteParents(true);
+		}
 
 		if (revLimiter.size() == 1)
 			walk.setRevFilter(revLimiter.get(0));