Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

PatchTest.java 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337
  1. /*
  2. * Copyright (C) 2008-2009, Google Inc. 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.patch;
  11. import static org.junit.Assert.assertEquals;
  12. import static org.junit.Assert.assertFalse;
  13. import static org.junit.Assert.assertNotNull;
  14. import static org.junit.Assert.assertNull;
  15. import static org.junit.Assert.assertSame;
  16. import static org.junit.Assert.assertTrue;
  17. import static org.junit.Assert.fail;
  18. import java.io.IOException;
  19. import java.io.InputStream;
  20. import org.eclipse.jgit.junit.JGitTestUtil;
  21. import org.eclipse.jgit.lib.FileMode;
  22. import org.eclipse.jgit.lib.ObjectId;
  23. import org.junit.Test;
  24. public class PatchTest {
  25. @Test
  26. public void testEmpty() {
  27. final Patch p = new Patch();
  28. assertTrue(p.getFiles().isEmpty());
  29. assertTrue(p.getErrors().isEmpty());
  30. }
  31. @Test
  32. public void testParse_ConfigCaseInsensitive() throws IOException {
  33. final Patch p = parseTestPatchFile();
  34. assertEquals(2, p.getFiles().size());
  35. assertTrue(p.getErrors().isEmpty());
  36. final FileHeader fRepositoryConfigTest = p.getFiles().get(0);
  37. final FileHeader fRepositoryConfig = p.getFiles().get(1);
  38. assertEquals(
  39. "org.eclipse.jgit.test/tst/org/spearce/jgit/lib/RepositoryConfigTest.java",
  40. fRepositoryConfigTest.getNewPath());
  41. assertEquals(
  42. "org.eclipse.jgit/src/org/spearce/jgit/lib/RepositoryConfig.java",
  43. fRepositoryConfig.getNewPath());
  44. assertEquals(572, fRepositoryConfigTest.startOffset);
  45. assertEquals(1490, fRepositoryConfig.startOffset);
  46. assertEquals("da7e704", fRepositoryConfigTest.getOldId().name());
  47. assertEquals("34ce04a", fRepositoryConfigTest.getNewId().name());
  48. assertSame(FileHeader.PatchType.UNIFIED, fRepositoryConfigTest
  49. .getPatchType());
  50. assertSame(FileMode.REGULAR_FILE, fRepositoryConfigTest.getOldMode());
  51. assertSame(FileMode.REGULAR_FILE, fRepositoryConfigTest.getNewMode());
  52. assertEquals(1, fRepositoryConfigTest.getHunks().size());
  53. {
  54. final HunkHeader h = fRepositoryConfigTest.getHunks().get(0);
  55. assertSame(fRepositoryConfigTest, h.getFileHeader());
  56. assertEquals(921, h.startOffset);
  57. assertEquals(109, h.getOldImage().getStartLine());
  58. assertEquals(4, h.getOldImage().getLineCount());
  59. assertEquals(109, h.getNewStartLine());
  60. assertEquals(11, h.getNewLineCount());
  61. assertEquals(4, h.getLinesContext());
  62. assertEquals(7, h.getOldImage().getLinesAdded());
  63. assertEquals(0, h.getOldImage().getLinesDeleted());
  64. assertSame(fRepositoryConfigTest.getOldId(), h.getOldImage()
  65. .getId());
  66. assertEquals(1490, h.endOffset);
  67. }
  68. assertEquals("45c2f8a", fRepositoryConfig.getOldId().name());
  69. assertEquals("3291bba", fRepositoryConfig.getNewId().name());
  70. assertSame(FileHeader.PatchType.UNIFIED, fRepositoryConfig
  71. .getPatchType());
  72. assertSame(FileMode.REGULAR_FILE, fRepositoryConfig.getOldMode());
  73. assertSame(FileMode.REGULAR_FILE, fRepositoryConfig.getNewMode());
  74. assertEquals(3, fRepositoryConfig.getHunks().size());
  75. {
  76. final HunkHeader h = fRepositoryConfig.getHunks().get(0);
  77. assertSame(fRepositoryConfig, h.getFileHeader());
  78. assertEquals(1803, h.startOffset);
  79. assertEquals(236, h.getOldImage().getStartLine());
  80. assertEquals(9, h.getOldImage().getLineCount());
  81. assertEquals(236, h.getNewStartLine());
  82. assertEquals(9, h.getNewLineCount());
  83. assertEquals(7, h.getLinesContext());
  84. assertEquals(2, h.getOldImage().getLinesAdded());
  85. assertEquals(2, h.getOldImage().getLinesDeleted());
  86. assertSame(fRepositoryConfig.getOldId(), h.getOldImage().getId());
  87. assertEquals(2434, h.endOffset);
  88. }
  89. {
  90. final HunkHeader h = fRepositoryConfig.getHunks().get(1);
  91. assertEquals(2434, h.startOffset);
  92. assertEquals(300, h.getOldImage().getStartLine());
  93. assertEquals(7, h.getOldImage().getLineCount());
  94. assertEquals(300, h.getNewStartLine());
  95. assertEquals(7, h.getNewLineCount());
  96. assertEquals(6, h.getLinesContext());
  97. assertEquals(1, h.getOldImage().getLinesAdded());
  98. assertEquals(1, h.getOldImage().getLinesDeleted());
  99. assertEquals(2816, h.endOffset);
  100. }
  101. {
  102. final HunkHeader h = fRepositoryConfig.getHunks().get(2);
  103. assertEquals(2816, h.startOffset);
  104. assertEquals(954, h.getOldImage().getStartLine());
  105. assertEquals(7, h.getOldImage().getLineCount());
  106. assertEquals(954, h.getNewStartLine());
  107. assertEquals(7, h.getNewLineCount());
  108. assertEquals(6, h.getLinesContext());
  109. assertEquals(1, h.getOldImage().getLinesAdded());
  110. assertEquals(1, h.getOldImage().getLinesDeleted());
  111. assertEquals(3035, h.endOffset);
  112. }
  113. }
  114. @Test
  115. public void testParse_NoBinary() throws IOException {
  116. final Patch p = parseTestPatchFile();
  117. assertEquals(5, p.getFiles().size());
  118. assertTrue(p.getErrors().isEmpty());
  119. for (int i = 0; i < 4; i++) {
  120. final FileHeader fh = p.getFiles().get(i);
  121. assertSame(FileHeader.ChangeType.ADD, fh.getChangeType());
  122. assertNotNull(fh.getOldId());
  123. assertNotNull(fh.getNewId());
  124. assertEquals("0000000", fh.getOldId().name());
  125. assertSame(FileMode.MISSING, fh.getOldMode());
  126. assertSame(FileMode.REGULAR_FILE, fh.getNewMode());
  127. assertTrue(fh.getNewPath().startsWith(
  128. "org.spearce.egit.ui/icons/toolbar/"));
  129. assertSame(FileHeader.PatchType.BINARY, fh.getPatchType());
  130. assertTrue(fh.getHunks().isEmpty());
  131. assertTrue(fh.hasMetaDataChanges());
  132. assertNull(fh.getForwardBinaryHunk());
  133. assertNull(fh.getReverseBinaryHunk());
  134. }
  135. final FileHeader fh = p.getFiles().get(4);
  136. assertEquals("org.spearce.egit.ui/plugin.xml", fh.getNewPath());
  137. assertSame(FileHeader.ChangeType.MODIFY, fh.getChangeType());
  138. assertSame(FileHeader.PatchType.UNIFIED, fh.getPatchType());
  139. assertFalse(fh.hasMetaDataChanges());
  140. assertEquals("ee8a5a0", fh.getNewId().name());
  141. assertNull(fh.getForwardBinaryHunk());
  142. assertNull(fh.getReverseBinaryHunk());
  143. assertEquals(1, fh.getHunks().size());
  144. assertEquals(272, fh.getHunks().get(0).getOldImage().getStartLine());
  145. }
  146. @Test
  147. public void testParse_GitBinaryLiteral() throws IOException {
  148. final Patch p = parseTestPatchFile();
  149. final int[] binsizes = { 359, 393, 372, 404 };
  150. assertEquals(5, p.getFiles().size());
  151. assertTrue(p.getErrors().isEmpty());
  152. for (int i = 0; i < 4; i++) {
  153. final FileHeader fh = p.getFiles().get(i);
  154. assertSame(FileHeader.ChangeType.ADD, fh.getChangeType());
  155. assertNotNull(fh.getOldId());
  156. assertNotNull(fh.getNewId());
  157. assertEquals(ObjectId.zeroId().name(), fh.getOldId().name());
  158. assertSame(FileMode.REGULAR_FILE, fh.getNewMode());
  159. assertTrue(fh.getNewPath().startsWith(
  160. "org.spearce.egit.ui/icons/toolbar/"));
  161. assertSame(FileHeader.PatchType.GIT_BINARY, fh.getPatchType());
  162. assertTrue(fh.getHunks().isEmpty());
  163. assertTrue(fh.hasMetaDataChanges());
  164. final BinaryHunk fwd = fh.getForwardBinaryHunk();
  165. final BinaryHunk rev = fh.getReverseBinaryHunk();
  166. assertNotNull(fwd);
  167. assertNotNull(rev);
  168. assertEquals(binsizes[i], fwd.getSize());
  169. assertEquals(0, rev.getSize());
  170. assertSame(fh, fwd.getFileHeader());
  171. assertSame(fh, rev.getFileHeader());
  172. assertSame(BinaryHunk.Type.LITERAL_DEFLATED, fwd.getType());
  173. assertSame(BinaryHunk.Type.LITERAL_DEFLATED, rev.getType());
  174. }
  175. final FileHeader fh = p.getFiles().get(4);
  176. assertEquals("org.spearce.egit.ui/plugin.xml", fh.getNewPath());
  177. assertSame(FileHeader.ChangeType.MODIFY, fh.getChangeType());
  178. assertSame(FileHeader.PatchType.UNIFIED, fh.getPatchType());
  179. assertFalse(fh.hasMetaDataChanges());
  180. assertEquals("ee8a5a0", fh.getNewId().name());
  181. assertNull(fh.getForwardBinaryHunk());
  182. assertNull(fh.getReverseBinaryHunk());
  183. assertEquals(1, fh.getHunks().size());
  184. assertEquals(272, fh.getHunks().get(0).getOldImage().getStartLine());
  185. }
  186. @Test
  187. public void testParse_GitBinaryDelta() throws IOException {
  188. final Patch p = parseTestPatchFile();
  189. assertEquals(1, p.getFiles().size());
  190. assertTrue(p.getErrors().isEmpty());
  191. final FileHeader fh = p.getFiles().get(0);
  192. assertTrue(fh.getNewPath().startsWith("zero.bin"));
  193. assertSame(FileHeader.ChangeType.MODIFY, fh.getChangeType());
  194. assertSame(FileHeader.PatchType.GIT_BINARY, fh.getPatchType());
  195. assertSame(FileMode.REGULAR_FILE, fh.getNewMode());
  196. assertNotNull(fh.getOldId());
  197. assertNotNull(fh.getNewId());
  198. assertEquals("08e7df176454f3ee5eeda13efa0adaa54828dfd8", fh.getOldId()
  199. .name());
  200. assertEquals("d70d8710b6d32ff844af0ee7c247e4b4b051867f", fh.getNewId()
  201. .name());
  202. assertTrue(fh.getHunks().isEmpty());
  203. assertFalse(fh.hasMetaDataChanges());
  204. final BinaryHunk fwd = fh.getForwardBinaryHunk();
  205. final BinaryHunk rev = fh.getReverseBinaryHunk();
  206. assertNotNull(fwd);
  207. assertNotNull(rev);
  208. assertEquals(12, fwd.getSize());
  209. assertEquals(11, rev.getSize());
  210. assertSame(fh, fwd.getFileHeader());
  211. assertSame(fh, rev.getFileHeader());
  212. assertSame(BinaryHunk.Type.DELTA_DEFLATED, fwd.getType());
  213. assertSame(BinaryHunk.Type.DELTA_DEFLATED, rev.getType());
  214. assertEquals(496, fh.endOffset);
  215. }
  216. @Test
  217. public void testParse_FixNoNewline() throws IOException {
  218. final Patch p = parseTestPatchFile();
  219. assertEquals(1, p.getFiles().size());
  220. assertTrue(p.getErrors().isEmpty());
  221. final FileHeader f = p.getFiles().get(0);
  222. assertEquals("a", f.getNewPath());
  223. assertEquals(252, f.startOffset);
  224. assertEquals("2e65efe", f.getOldId().name());
  225. assertEquals("f2ad6c7", f.getNewId().name());
  226. assertSame(FileHeader.PatchType.UNIFIED, f.getPatchType());
  227. assertSame(FileMode.REGULAR_FILE, f.getOldMode());
  228. assertSame(FileMode.REGULAR_FILE, f.getNewMode());
  229. assertEquals(1, f.getHunks().size());
  230. {
  231. final HunkHeader h = f.getHunks().get(0);
  232. assertSame(f, h.getFileHeader());
  233. assertEquals(317, h.startOffset);
  234. assertEquals(1, h.getOldImage().getStartLine());
  235. assertEquals(1, h.getOldImage().getLineCount());
  236. assertEquals(1, h.getNewStartLine());
  237. assertEquals(1, h.getNewLineCount());
  238. assertEquals(0, h.getLinesContext());
  239. assertEquals(1, h.getOldImage().getLinesAdded());
  240. assertEquals(1, h.getOldImage().getLinesDeleted());
  241. assertSame(f.getOldId(), h.getOldImage().getId());
  242. assertEquals(363, h.endOffset);
  243. }
  244. }
  245. @Test
  246. public void testParse_AddNoNewline() throws IOException {
  247. final Patch p = parseTestPatchFile();
  248. assertEquals(1, p.getFiles().size());
  249. assertTrue(p.getErrors().isEmpty());
  250. final FileHeader f = p.getFiles().get(0);
  251. assertEquals("a", f.getNewPath());
  252. assertEquals(256, f.startOffset);
  253. assertEquals("f2ad6c7", f.getOldId().name());
  254. assertEquals("c59d9b6", f.getNewId().name());
  255. assertSame(FileHeader.PatchType.UNIFIED, f.getPatchType());
  256. assertSame(FileMode.REGULAR_FILE, f.getOldMode());
  257. assertSame(FileMode.REGULAR_FILE, f.getNewMode());
  258. assertEquals(1, f.getHunks().size());
  259. {
  260. final HunkHeader h = f.getHunks().get(0);
  261. assertSame(f, h.getFileHeader());
  262. assertEquals(321, h.startOffset);
  263. assertEquals(1, h.getOldImage().getStartLine());
  264. assertEquals(1, h.getOldImage().getLineCount());
  265. assertEquals(1, h.getNewStartLine());
  266. assertEquals(1, h.getNewLineCount());
  267. assertEquals(0, h.getLinesContext());
  268. assertEquals(1, h.getOldImage().getLinesAdded());
  269. assertEquals(1, h.getOldImage().getLinesDeleted());
  270. assertSame(f.getOldId(), h.getOldImage().getId());
  271. assertEquals(367, h.endOffset);
  272. }
  273. }
  274. private Patch parseTestPatchFile() throws IOException {
  275. final String patchFile = JGitTestUtil.getName() + ".patch";
  276. try (InputStream in = getClass().getResourceAsStream(patchFile)) {
  277. if (in == null) {
  278. fail("No " + patchFile + " test vector");
  279. return null; // Never happens
  280. }
  281. final Patch p = new Patch();
  282. p.parse(in);
  283. return p;
  284. }
  285. }
  286. }