You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

DiffCommandTest.java 7.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. /*
  2. * Copyright (C) 2011, Tomasz Zarna <Tomasz.Zarna@pl.ibm.com> and others
  3. *
  4. * This program and the accompanying materials are made available under the
  5. * terms of the Eclipse Distribution License v. 1.0 which is available at
  6. * https://www.eclipse.org/org/documents/edl-v10.php.
  7. *
  8. * SPDX-License-Identifier: BSD-3-Clause
  9. */
  10. package org.eclipse.jgit.api;
  11. import static org.junit.Assert.assertEquals;
  12. import static org.junit.Assert.assertNotNull;
  13. import java.io.ByteArrayOutputStream;
  14. import java.io.File;
  15. import java.io.IOException;
  16. import java.io.OutputStream;
  17. import java.util.List;
  18. import org.eclipse.jgit.diff.DiffEntry;
  19. import org.eclipse.jgit.diff.DiffEntry.ChangeType;
  20. import org.eclipse.jgit.junit.RepositoryTestCase;
  21. import org.eclipse.jgit.junit.time.TimeUtil;
  22. import org.eclipse.jgit.lib.ObjectId;
  23. import org.eclipse.jgit.lib.ObjectReader;
  24. import org.eclipse.jgit.revwalk.RevWalk;
  25. import org.eclipse.jgit.treewalk.AbstractTreeIterator;
  26. import org.eclipse.jgit.treewalk.CanonicalTreeParser;
  27. import org.eclipse.jgit.treewalk.filter.PathFilter;
  28. import org.junit.Test;
  29. public class DiffCommandTest extends RepositoryTestCase {
  30. @Test
  31. public void testDiffModified() throws Exception {
  32. write(new File(db.getWorkTree(), "test.txt"), "test");
  33. File folder = new File(db.getWorkTree(), "folder");
  34. folder.mkdir();
  35. write(new File(folder, "folder.txt"), "folder");
  36. try (Git git = new Git(db)) {
  37. git.add().addFilepattern(".").call();
  38. git.commit().setMessage("Initial commit").call();
  39. write(new File(folder, "folder.txt"), "folder change");
  40. OutputStream out = new ByteArrayOutputStream();
  41. List<DiffEntry> entries = git.diff().setOutputStream(out).call();
  42. assertEquals(1, entries.size());
  43. assertEquals(ChangeType.MODIFY, entries.get(0)
  44. .getChangeType());
  45. assertEquals("folder/folder.txt", entries.get(0)
  46. .getOldPath());
  47. assertEquals("folder/folder.txt", entries.get(0)
  48. .getNewPath());
  49. String actual = out.toString();
  50. String expected = "diff --git a/folder/folder.txt b/folder/folder.txt\n"
  51. + "index 0119635..95c4c65 100644\n"
  52. + "--- a/folder/folder.txt\n"
  53. + "+++ b/folder/folder.txt\n"
  54. + "@@ -1 +1 @@\n"
  55. + "-folder\n"
  56. + "\\ No newline at end of file\n"
  57. + "+folder change\n"
  58. + "\\ No newline at end of file\n";
  59. assertEquals(expected, actual);
  60. }
  61. }
  62. @Test
  63. public void testDiffCached() throws Exception {
  64. write(new File(db.getWorkTree(), "test.txt"), "test");
  65. File folder = new File(db.getWorkTree(), "folder");
  66. folder.mkdir();
  67. try (Git git = new Git(db)) {
  68. git.add().addFilepattern(".").call();
  69. git.commit().setMessage("Initial commit").call();
  70. write(new File(folder, "folder.txt"), "folder");
  71. git.add().addFilepattern(".").call();
  72. OutputStream out = new ByteArrayOutputStream();
  73. List<DiffEntry> entries = git.diff().setOutputStream(out)
  74. .setCached(true).call();
  75. assertEquals(1, entries.size());
  76. assertEquals(ChangeType.ADD, entries.get(0)
  77. .getChangeType());
  78. assertEquals("/dev/null", entries.get(0)
  79. .getOldPath());
  80. assertEquals("folder/folder.txt", entries.get(0)
  81. .getNewPath());
  82. String actual = out.toString();
  83. String expected = "diff --git a/folder/folder.txt b/folder/folder.txt\n"
  84. + "new file mode 100644\n"
  85. + "index 0000000..0119635\n"
  86. + "--- /dev/null\n"
  87. + "+++ b/folder/folder.txt\n"
  88. + "@@ -0,0 +1 @@\n"
  89. + "+folder\n"
  90. + "\\ No newline at end of file\n";
  91. assertEquals(expected, actual);
  92. }
  93. }
  94. @Test
  95. public void testDiffTwoCommits() throws Exception {
  96. write(new File(db.getWorkTree(), "test.txt"), "test");
  97. File folder = new File(db.getWorkTree(), "folder");
  98. folder.mkdir();
  99. write(new File(folder, "folder.txt"), "folder");
  100. try (Git git = new Git(db)) {
  101. git.add().addFilepattern(".").call();
  102. git.commit().setMessage("Initial commit").call();
  103. write(new File(folder, "folder.txt"), "folder change");
  104. git.add().addFilepattern(".").call();
  105. git.commit().setMessage("second commit").call();
  106. write(new File(folder, "folder.txt"), "second folder change");
  107. git.add().addFilepattern(".").call();
  108. git.commit().setMessage("third commit").call();
  109. // bad filter
  110. DiffCommand diff = git.diff().setShowNameAndStatusOnly(true)
  111. .setPathFilter(PathFilter.create("test.txt"))
  112. .setOldTree(getTreeIterator("HEAD^^"))
  113. .setNewTree(getTreeIterator("HEAD^"));
  114. List<DiffEntry> entries = diff.call();
  115. assertEquals(0, entries.size());
  116. // no filter, two commits
  117. OutputStream out = new ByteArrayOutputStream();
  118. diff = git.diff().setOutputStream(out)
  119. .setOldTree(getTreeIterator("HEAD^^"))
  120. .setNewTree(getTreeIterator("HEAD^"));
  121. entries = diff.call();
  122. assertEquals(1, entries.size());
  123. assertEquals(ChangeType.MODIFY, entries.get(0).getChangeType());
  124. assertEquals("folder/folder.txt", entries.get(0).getOldPath());
  125. assertEquals("folder/folder.txt", entries.get(0).getNewPath());
  126. String actual = out.toString();
  127. String expected = "diff --git a/folder/folder.txt b/folder/folder.txt\n"
  128. + "index 0119635..95c4c65 100644\n"
  129. + "--- a/folder/folder.txt\n"
  130. + "+++ b/folder/folder.txt\n"
  131. + "@@ -1 +1 @@\n"
  132. + "-folder\n"
  133. + "\\ No newline at end of file\n"
  134. + "+folder change\n"
  135. + "\\ No newline at end of file\n";
  136. assertEquals(expected, actual);
  137. }
  138. }
  139. @Test
  140. public void testDiffWithPrefixes() throws Exception {
  141. write(new File(db.getWorkTree(), "test.txt"), "test");
  142. try (Git git = new Git(db)) {
  143. git.add().addFilepattern(".").call();
  144. git.commit().setMessage("Initial commit").call();
  145. write(new File(db.getWorkTree(), "test.txt"), "test change");
  146. OutputStream out = new ByteArrayOutputStream();
  147. git.diff().setOutputStream(out).setSourcePrefix("old/")
  148. .setDestinationPrefix("new/").call();
  149. String actual = out.toString();
  150. String expected = "diff --git old/test.txt new/test.txt\n"
  151. + "index 30d74d2..4dba797 100644\n" + "--- old/test.txt\n"
  152. + "+++ new/test.txt\n" + "@@ -1 +1 @@\n" + "-test\n"
  153. + "\\ No newline at end of file\n" + "+test change\n"
  154. + "\\ No newline at end of file\n";
  155. assertEquals(expected, actual);
  156. }
  157. }
  158. @Test
  159. public void testDiffWithNegativeLineCount() throws Exception {
  160. write(new File(db.getWorkTree(), "test.txt"),
  161. "0\n1\n2\n3\n4\n5\n6\n7\n8\n9");
  162. try (Git git = new Git(db)) {
  163. git.add().addFilepattern(".").call();
  164. git.commit().setMessage("Initial commit").call();
  165. write(new File(db.getWorkTree(), "test.txt"),
  166. "0\n1\n2\n3\n4a\n5\n6\n7\n8\n9");
  167. OutputStream out = new ByteArrayOutputStream();
  168. git.diff().setOutputStream(out).setContextLines(1).call();
  169. String actual = out.toString();
  170. String expected = "diff --git a/test.txt b/test.txt\n"
  171. + "index f55b5c9..c5ec8fd 100644\n" + "--- a/test.txt\n"
  172. + "+++ b/test.txt\n" + "@@ -4,3 +4,3 @@\n" + " 3\n" + "-4\n"
  173. + "+4a\n" + " 5\n";
  174. assertEquals(expected, actual);
  175. }
  176. }
  177. @Test
  178. public void testNoOutputStreamSet() throws Exception {
  179. File file = writeTrashFile("test.txt", "a");
  180. TimeUtil.setLastModifiedWithOffset(file.toPath(), -5000L);
  181. try (Git git = new Git(db)) {
  182. git.add().addFilepattern(".").call();
  183. write(file, "b");
  184. List<DiffEntry> diffs = git.diff().call();
  185. assertNotNull(diffs);
  186. assertEquals(1, diffs.size());
  187. DiffEntry diff = diffs.get(0);
  188. assertEquals(ChangeType.MODIFY, diff.getChangeType());
  189. assertEquals("test.txt", diff.getOldPath());
  190. assertEquals("test.txt", diff.getNewPath());
  191. }
  192. }
  193. private AbstractTreeIterator getTreeIterator(String name)
  194. throws IOException {
  195. final ObjectId id = db.resolve(name);
  196. if (id == null)
  197. throw new IllegalArgumentException(name);
  198. final CanonicalTreeParser p = new CanonicalTreeParser();
  199. try (ObjectReader or = db.newObjectReader();
  200. RevWalk rw = new RevWalk(db)) {
  201. p.reset(or, rw.parseTree(id));
  202. return p;
  203. }
  204. }
  205. }