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.

FileHeaderTest.java 13KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429
  1. /*
  2. * Copyright (C) 2008, 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 org.eclipse.jgit.diff.DiffEntry;
  18. import org.eclipse.jgit.lib.Constants;
  19. import org.eclipse.jgit.lib.FileMode;
  20. import org.eclipse.jgit.lib.ObjectId;
  21. import org.junit.Test;
  22. public class FileHeaderTest {
  23. @Test
  24. public void testParseGitFileName_Empty() {
  25. final FileHeader fh = data("");
  26. assertEquals(-1, fh.parseGitFileName(0, fh.buf.length));
  27. assertNotNull(fh.getHunks());
  28. assertTrue(fh.getHunks().isEmpty());
  29. assertFalse(fh.hasMetaDataChanges());
  30. }
  31. @Test
  32. public void testParseGitFileName_NoLF() {
  33. final FileHeader fh = data("a/ b/");
  34. assertEquals(-1, fh.parseGitFileName(0, fh.buf.length));
  35. }
  36. @Test
  37. public void testParseGitFileName_NoSecondLine() {
  38. final FileHeader fh = data("\n");
  39. assertEquals(-1, fh.parseGitFileName(0, fh.buf.length));
  40. }
  41. @Test
  42. public void testParseGitFileName_EmptyHeader() {
  43. final FileHeader fh = data("\n\n");
  44. assertEquals(1, fh.parseGitFileName(0, fh.buf.length));
  45. }
  46. @Test
  47. public void testParseGitFileName_Foo() {
  48. final String name = "foo";
  49. final FileHeader fh = header(name);
  50. assertEquals(gitLine(name).length(), fh.parseGitFileName(0,
  51. fh.buf.length));
  52. assertEquals(name, fh.getOldPath());
  53. assertSame(fh.getOldPath(), fh.getNewPath());
  54. assertFalse(fh.hasMetaDataChanges());
  55. }
  56. @Test
  57. public void testParseGitFileName_FailFooBar() {
  58. final FileHeader fh = data("a/foo b/bar\n-");
  59. assertTrue(fh.parseGitFileName(0, fh.buf.length) > 0);
  60. assertNull(fh.getOldPath());
  61. assertNull(fh.getNewPath());
  62. assertFalse(fh.hasMetaDataChanges());
  63. }
  64. @Test
  65. public void testParseGitFileName_FooSpBar() {
  66. final String name = "foo bar";
  67. final FileHeader fh = header(name);
  68. assertEquals(gitLine(name).length(), fh.parseGitFileName(0,
  69. fh.buf.length));
  70. assertEquals(name, fh.getOldPath());
  71. assertSame(fh.getOldPath(), fh.getNewPath());
  72. assertFalse(fh.hasMetaDataChanges());
  73. }
  74. @Test
  75. public void testParseGitFileName_DqFooTabBar() {
  76. final String name = "foo\tbar";
  77. final String dqName = "foo\\tbar";
  78. final FileHeader fh = dqHeader(dqName);
  79. assertEquals(dqGitLine(dqName).length(), fh.parseGitFileName(0,
  80. fh.buf.length));
  81. assertEquals(name, fh.getOldPath());
  82. assertSame(fh.getOldPath(), fh.getNewPath());
  83. assertFalse(fh.hasMetaDataChanges());
  84. }
  85. @Test
  86. public void testParseGitFileName_DqFooSpLfNulBar() {
  87. final String name = "foo \n\0bar";
  88. final String dqName = "foo \\n\\0bar";
  89. final FileHeader fh = dqHeader(dqName);
  90. assertEquals(dqGitLine(dqName).length(), fh.parseGitFileName(0,
  91. fh.buf.length));
  92. assertEquals(name, fh.getOldPath());
  93. assertSame(fh.getOldPath(), fh.getNewPath());
  94. assertFalse(fh.hasMetaDataChanges());
  95. }
  96. @Test
  97. public void testParseGitFileName_SrcFooC() {
  98. final String name = "src/foo/bar/argh/code.c";
  99. final FileHeader fh = header(name);
  100. assertEquals(gitLine(name).length(), fh.parseGitFileName(0,
  101. fh.buf.length));
  102. assertEquals(name, fh.getOldPath());
  103. assertSame(fh.getOldPath(), fh.getNewPath());
  104. assertFalse(fh.hasMetaDataChanges());
  105. }
  106. @Test
  107. public void testParseGitFileName_SrcFooCNonStandardPrefix() {
  108. final String name = "src/foo/bar/argh/code.c";
  109. final String header = "project-v-1.0/" + name + " mydev/" + name + "\n";
  110. final FileHeader fh = data(header + "-");
  111. assertEquals(header.length(), fh.parseGitFileName(0, fh.buf.length));
  112. assertEquals(name, fh.getOldPath());
  113. assertSame(fh.getOldPath(), fh.getNewPath());
  114. assertFalse(fh.hasMetaDataChanges());
  115. }
  116. @Test
  117. public void testParseUnicodeName_NewFile() {
  118. final FileHeader fh = data("diff --git \"a/\\303\\205ngstr\\303\\266m\" \"b/\\303\\205ngstr\\303\\266m\"\n"
  119. + "new file mode 100644\n"
  120. + "index 0000000..7898192\n"
  121. + "--- /dev/null\n"
  122. + "+++ \"b/\\303\\205ngstr\\303\\266m\"\n"
  123. + "@@ -0,0 +1 @@\n" + "+a\n");
  124. assertParse(fh);
  125. assertEquals("/dev/null", fh.getOldPath());
  126. assertSame(DiffEntry.DEV_NULL, fh.getOldPath());
  127. assertEquals("\u00c5ngstr\u00f6m", fh.getNewPath());
  128. assertSame(FileHeader.ChangeType.ADD, fh.getChangeType());
  129. assertSame(FileHeader.PatchType.UNIFIED, fh.getPatchType());
  130. assertTrue(fh.hasMetaDataChanges());
  131. assertSame(FileMode.MISSING, fh.getOldMode());
  132. assertSame(FileMode.REGULAR_FILE, fh.getNewMode());
  133. assertEquals("0000000", fh.getOldId().name());
  134. assertEquals("7898192", fh.getNewId().name());
  135. assertEquals(0, fh.getScore());
  136. }
  137. @Test
  138. public void testParseUnicodeName_DeleteFile() {
  139. final FileHeader fh = data("diff --git \"a/\\303\\205ngstr\\303\\266m\" \"b/\\303\\205ngstr\\303\\266m\"\n"
  140. + "deleted file mode 100644\n"
  141. + "index 7898192..0000000\n"
  142. + "--- \"a/\\303\\205ngstr\\303\\266m\"\n"
  143. + "+++ /dev/null\n"
  144. + "@@ -1 +0,0 @@\n" + "-a\n");
  145. assertParse(fh);
  146. assertEquals("\u00c5ngstr\u00f6m", fh.getOldPath());
  147. assertEquals("/dev/null", fh.getNewPath());
  148. assertSame(DiffEntry.DEV_NULL, fh.getNewPath());
  149. assertSame(FileHeader.ChangeType.DELETE, fh.getChangeType());
  150. assertSame(FileHeader.PatchType.UNIFIED, fh.getPatchType());
  151. assertTrue(fh.hasMetaDataChanges());
  152. assertSame(FileMode.REGULAR_FILE, fh.getOldMode());
  153. assertSame(FileMode.MISSING, fh.getNewMode());
  154. assertEquals("7898192", fh.getOldId().name());
  155. assertEquals("0000000", fh.getNewId().name());
  156. assertEquals(0, fh.getScore());
  157. }
  158. @Test
  159. public void testParseModeChange() {
  160. final FileHeader fh = data("diff --git a/a b b/a b\n"
  161. + "old mode 100644\n" + "new mode 100755\n");
  162. assertParse(fh);
  163. assertEquals("a b", fh.getOldPath());
  164. assertEquals("a b", fh.getNewPath());
  165. assertSame(FileHeader.ChangeType.MODIFY, fh.getChangeType());
  166. assertSame(FileHeader.PatchType.UNIFIED, fh.getPatchType());
  167. assertTrue(fh.hasMetaDataChanges());
  168. assertNull(fh.getOldId());
  169. assertNull(fh.getNewId());
  170. assertSame(FileMode.REGULAR_FILE, fh.getOldMode());
  171. assertSame(FileMode.EXECUTABLE_FILE, fh.getNewMode());
  172. assertEquals(0, fh.getScore());
  173. }
  174. @Test
  175. public void testParseRename100_NewStyle() {
  176. final FileHeader fh = data("diff --git a/a b/ c/\\303\\205ngstr\\303\\266m\n"
  177. + "similarity index 100%\n"
  178. + "rename from a\n"
  179. + "rename to \" c/\\303\\205ngstr\\303\\266m\"\n");
  180. int ptr = fh.parseGitFileName(0, fh.buf.length);
  181. assertTrue(ptr > 0);
  182. assertNull(fh.getOldPath()); // can't parse names on a rename
  183. assertNull(fh.getNewPath());
  184. ptr = fh.parseGitHeaders(ptr, fh.buf.length);
  185. assertTrue(ptr > 0);
  186. assertEquals("a", fh.getOldPath());
  187. assertEquals(" c/\u00c5ngstr\u00f6m", fh.getNewPath());
  188. assertSame(FileHeader.ChangeType.RENAME, fh.getChangeType());
  189. assertSame(FileHeader.PatchType.UNIFIED, fh.getPatchType());
  190. assertTrue(fh.hasMetaDataChanges());
  191. assertNull(fh.getOldId());
  192. assertNull(fh.getNewId());
  193. assertNull(fh.getOldMode());
  194. assertNull(fh.getNewMode());
  195. assertEquals(100, fh.getScore());
  196. }
  197. @Test
  198. public void testParseRename100_OldStyle() {
  199. final FileHeader fh = data("diff --git a/a b/ c/\\303\\205ngstr\\303\\266m\n"
  200. + "similarity index 100%\n"
  201. + "rename old a\n"
  202. + "rename new \" c/\\303\\205ngstr\\303\\266m\"\n");
  203. int ptr = fh.parseGitFileName(0, fh.buf.length);
  204. assertTrue(ptr > 0);
  205. assertNull(fh.getOldPath()); // can't parse names on a rename
  206. assertNull(fh.getNewPath());
  207. ptr = fh.parseGitHeaders(ptr, fh.buf.length);
  208. assertTrue(ptr > 0);
  209. assertEquals("a", fh.getOldPath());
  210. assertEquals(" c/\u00c5ngstr\u00f6m", fh.getNewPath());
  211. assertSame(FileHeader.ChangeType.RENAME, fh.getChangeType());
  212. assertSame(FileHeader.PatchType.UNIFIED, fh.getPatchType());
  213. assertTrue(fh.hasMetaDataChanges());
  214. assertNull(fh.getOldId());
  215. assertNull(fh.getNewId());
  216. assertNull(fh.getOldMode());
  217. assertNull(fh.getNewMode());
  218. assertEquals(100, fh.getScore());
  219. }
  220. @Test
  221. public void testParseCopy100() {
  222. final FileHeader fh = data("diff --git a/a b/ c/\\303\\205ngstr\\303\\266m\n"
  223. + "similarity index 100%\n"
  224. + "copy from a\n"
  225. + "copy to \" c/\\303\\205ngstr\\303\\266m\"\n");
  226. int ptr = fh.parseGitFileName(0, fh.buf.length);
  227. assertTrue(ptr > 0);
  228. assertNull(fh.getOldPath()); // can't parse names on a copy
  229. assertNull(fh.getNewPath());
  230. ptr = fh.parseGitHeaders(ptr, fh.buf.length);
  231. assertTrue(ptr > 0);
  232. assertEquals("a", fh.getOldPath());
  233. assertEquals(" c/\u00c5ngstr\u00f6m", fh.getNewPath());
  234. assertSame(FileHeader.ChangeType.COPY, fh.getChangeType());
  235. assertSame(FileHeader.PatchType.UNIFIED, fh.getPatchType());
  236. assertTrue(fh.hasMetaDataChanges());
  237. assertNull(fh.getOldId());
  238. assertNull(fh.getNewId());
  239. assertNull(fh.getOldMode());
  240. assertNull(fh.getNewMode());
  241. assertEquals(100, fh.getScore());
  242. }
  243. @Test
  244. public void testParseFullIndexLine_WithMode() {
  245. final String oid = "78981922613b2afb6025042ff6bd878ac1994e85";
  246. final String nid = "61780798228d17af2d34fce4cfbdf35556832472";
  247. final FileHeader fh = data("diff --git a/a b/a\n" + "index " + oid
  248. + ".." + nid + " 100644\n" + "--- a/a\n" + "+++ b/a\n");
  249. assertParse(fh);
  250. assertEquals("a", fh.getOldPath());
  251. assertEquals("a", fh.getNewPath());
  252. assertSame(FileMode.REGULAR_FILE, fh.getOldMode());
  253. assertSame(FileMode.REGULAR_FILE, fh.getNewMode());
  254. assertFalse(fh.hasMetaDataChanges());
  255. assertNotNull(fh.getOldId());
  256. assertNotNull(fh.getNewId());
  257. assertTrue(fh.getOldId().isComplete());
  258. assertTrue(fh.getNewId().isComplete());
  259. assertEquals(ObjectId.fromString(oid), fh.getOldId().toObjectId());
  260. assertEquals(ObjectId.fromString(nid), fh.getNewId().toObjectId());
  261. }
  262. @Test
  263. public void testParseFullIndexLine_NoMode() {
  264. final String oid = "78981922613b2afb6025042ff6bd878ac1994e85";
  265. final String nid = "61780798228d17af2d34fce4cfbdf35556832472";
  266. final FileHeader fh = data("diff --git a/a b/a\n" + "index " + oid
  267. + ".." + nid + "\n" + "--- a/a\n" + "+++ b/a\n");
  268. assertParse(fh);
  269. assertEquals("a", fh.getOldPath());
  270. assertEquals("a", fh.getNewPath());
  271. assertFalse(fh.hasMetaDataChanges());
  272. assertNull(fh.getOldMode());
  273. assertNull(fh.getNewMode());
  274. assertNotNull(fh.getOldId());
  275. assertNotNull(fh.getNewId());
  276. assertTrue(fh.getOldId().isComplete());
  277. assertTrue(fh.getNewId().isComplete());
  278. assertEquals(ObjectId.fromString(oid), fh.getOldId().toObjectId());
  279. assertEquals(ObjectId.fromString(nid), fh.getNewId().toObjectId());
  280. }
  281. @Test
  282. public void testParseAbbrIndexLine_WithMode() {
  283. final int a = 7;
  284. final String oid = "78981922613b2afb6025042ff6bd878ac1994e85";
  285. final String nid = "61780798228d17af2d34fce4cfbdf35556832472";
  286. final FileHeader fh = data("diff --git a/a b/a\n" + "index "
  287. + oid.substring(0, a - 1) + ".." + nid.substring(0, a - 1)
  288. + " 100644\n" + "--- a/a\n" + "+++ b/a\n");
  289. assertParse(fh);
  290. assertEquals("a", fh.getOldPath());
  291. assertEquals("a", fh.getNewPath());
  292. assertSame(FileMode.REGULAR_FILE, fh.getOldMode());
  293. assertSame(FileMode.REGULAR_FILE, fh.getNewMode());
  294. assertFalse(fh.hasMetaDataChanges());
  295. assertNotNull(fh.getOldId());
  296. assertNotNull(fh.getNewId());
  297. assertFalse(fh.getOldId().isComplete());
  298. assertFalse(fh.getNewId().isComplete());
  299. assertEquals(oid.substring(0, a - 1), fh.getOldId().name());
  300. assertEquals(nid.substring(0, a - 1), fh.getNewId().name());
  301. assertTrue(ObjectId.fromString(oid).startsWith(fh.getOldId()));
  302. assertTrue(ObjectId.fromString(nid).startsWith(fh.getNewId()));
  303. }
  304. @Test
  305. public void testParseAbbrIndexLine_NoMode() {
  306. final int a = 7;
  307. final String oid = "78981922613b2afb6025042ff6bd878ac1994e85";
  308. final String nid = "61780798228d17af2d34fce4cfbdf35556832472";
  309. final FileHeader fh = data("diff --git a/a b/a\n" + "index "
  310. + oid.substring(0, a - 1) + ".." + nid.substring(0, a - 1)
  311. + "\n" + "--- a/a\n" + "+++ b/a\n");
  312. assertParse(fh);
  313. assertEquals("a", fh.getOldPath());
  314. assertEquals("a", fh.getNewPath());
  315. assertNull(fh.getOldMode());
  316. assertNull(fh.getNewMode());
  317. assertFalse(fh.hasMetaDataChanges());
  318. assertNotNull(fh.getOldId());
  319. assertNotNull(fh.getNewId());
  320. assertFalse(fh.getOldId().isComplete());
  321. assertFalse(fh.getNewId().isComplete());
  322. assertEquals(oid.substring(0, a - 1), fh.getOldId().name());
  323. assertEquals(nid.substring(0, a - 1), fh.getNewId().name());
  324. assertTrue(ObjectId.fromString(oid).startsWith(fh.getOldId()));
  325. assertTrue(ObjectId.fromString(nid).startsWith(fh.getNewId()));
  326. }
  327. private static void assertParse(FileHeader fh) {
  328. int ptr = fh.parseGitFileName(0, fh.buf.length);
  329. assertTrue(ptr > 0);
  330. ptr = fh.parseGitHeaders(ptr, fh.buf.length);
  331. assertTrue(ptr > 0);
  332. }
  333. private static FileHeader data(String in) {
  334. return new FileHeader(Constants.encodeASCII(in), 0);
  335. }
  336. private static FileHeader header(String path) {
  337. return data(gitLine(path) + "--- " + path + "\n");
  338. }
  339. private static String gitLine(String path) {
  340. return "a/" + path + " b/" + path + "\n";
  341. }
  342. private static FileHeader dqHeader(String path) {
  343. return data(dqGitLine(path) + "--- " + path + "\n");
  344. }
  345. private static String dqGitLine(String path) {
  346. return "\"a/" + path + "\" \"b/" + path + "\"\n";
  347. }
  348. }