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.

RevTagParseTest.java 20KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578
  1. /*
  2. * Copyright (C) 2008, 2020, 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.revwalk;
  11. import static java.nio.charset.StandardCharsets.ISO_8859_1;
  12. import static java.nio.charset.StandardCharsets.US_ASCII;
  13. import static java.nio.charset.StandardCharsets.UTF_8;
  14. import static org.junit.Assert.assertEquals;
  15. import static org.junit.Assert.assertNotNull;
  16. import static org.junit.Assert.assertNull;
  17. import static org.junit.Assert.assertSame;
  18. import java.io.ByteArrayOutputStream;
  19. import java.io.UnsupportedEncodingException;
  20. import org.eclipse.jgit.errors.CorruptObjectException;
  21. import org.eclipse.jgit.junit.RepositoryTestCase;
  22. import org.eclipse.jgit.lib.Constants;
  23. import org.eclipse.jgit.lib.ObjectId;
  24. import org.eclipse.jgit.lib.ObjectInserter;
  25. import org.eclipse.jgit.lib.PersonIdent;
  26. import org.eclipse.jgit.lib.TagBuilder;
  27. import org.junit.Test;
  28. public class RevTagParseTest extends RepositoryTestCase {
  29. @Test
  30. public void testTagBlob() throws Exception {
  31. testOneType(Constants.OBJ_BLOB);
  32. }
  33. @Test
  34. public void testTagTree() throws Exception {
  35. testOneType(Constants.OBJ_TREE);
  36. }
  37. @Test
  38. public void testTagCommit() throws Exception {
  39. testOneType(Constants.OBJ_COMMIT);
  40. }
  41. @Test
  42. public void testTagTag() throws Exception {
  43. testOneType(Constants.OBJ_TAG);
  44. }
  45. private void testOneType(int typeCode) throws Exception {
  46. final ObjectId id = id("9788669ad918b6fcce64af8882fc9a81cb6aba67");
  47. final StringBuilder b = new StringBuilder();
  48. b.append("object " + id.name() + "\n");
  49. b.append("type " + Constants.typeString(typeCode) + "\n");
  50. b.append("tag v1.2.3.4.5\n");
  51. b.append("tagger A U. Thor <a_u_thor@example.com> 1218123387 +0700\n");
  52. b.append("\n");
  53. final RevTag c;
  54. c = new RevTag(id("9473095c4cb2f12aefe1db8a355fe3fafba42f67"));
  55. assertNull(c.getObject());
  56. assertNull(c.getTagName());
  57. try (RevWalk rw = new RevWalk(db)) {
  58. c.parseCanonical(rw, b.toString().getBytes(UTF_8));
  59. assertNotNull(c.getObject());
  60. assertEquals(id, c.getObject().getId());
  61. assertSame(rw.lookupAny(id, typeCode), c.getObject());
  62. }
  63. }
  64. @Test
  65. public void testParseAllFields() throws Exception {
  66. final ObjectId treeId = id("9788669ad918b6fcce64af8882fc9a81cb6aba67");
  67. final String name = "v1.2.3.4.5";
  68. final String taggerName = "A U. Thor";
  69. final String taggerEmail = "a_u_thor@example.com";
  70. final int taggerTime = 1218123387;
  71. final StringBuilder body = new StringBuilder();
  72. body.append("object ");
  73. body.append(treeId.name());
  74. body.append("\n");
  75. body.append("type tree\n");
  76. body.append("tag ");
  77. body.append(name);
  78. body.append("\n");
  79. body.append("tagger ");
  80. body.append(taggerName);
  81. body.append(" <");
  82. body.append(taggerEmail);
  83. body.append("> ");
  84. body.append(taggerTime);
  85. body.append(" +0700\n");
  86. body.append("\n");
  87. final RevTag c;
  88. c = new RevTag(id("9473095c4cb2f12aefe1db8a355fe3fafba42f67"));
  89. assertNull(c.getObject());
  90. assertNull(c.getTagName());
  91. try (RevWalk rw = new RevWalk(db)) {
  92. c.parseCanonical(rw, body.toString().getBytes(UTF_8));
  93. assertNotNull(c.getObject());
  94. assertEquals(treeId, c.getObject().getId());
  95. assertSame(rw.lookupTree(treeId), c.getObject());
  96. }
  97. assertNotNull(c.getTagName());
  98. assertEquals(name, c.getTagName());
  99. assertEquals("", c.getFullMessage());
  100. assertNull(c.getRawGpgSignature());
  101. final PersonIdent cTagger = c.getTaggerIdent();
  102. assertNotNull(cTagger);
  103. assertEquals(taggerName, cTagger.getName());
  104. assertEquals(taggerEmail, cTagger.getEmailAddress());
  105. }
  106. @Test
  107. public void testParseOldStyleNoTagger() throws Exception {
  108. final ObjectId treeId = id("9788669ad918b6fcce64af8882fc9a81cb6aba67");
  109. final String name = "v1.2.3.4.5";
  110. final String fakeSignature = "-----BEGIN PGP SIGNATURE-----\n" //
  111. + "Version: GnuPG v1.4.1 (GNU/Linux)\n" //
  112. + "\n" //
  113. + "iD8DBQBC0b9oF3Y\n" //
  114. + "-----END PGP SIGNATURE-----";
  115. final String message = "test\n" + fakeSignature + '\n';
  116. final StringBuilder body = new StringBuilder();
  117. body.append("object ");
  118. body.append(treeId.name());
  119. body.append("\n");
  120. body.append("type tree\n");
  121. body.append("tag ");
  122. body.append(name);
  123. body.append("\n");
  124. body.append("\n");
  125. body.append(message);
  126. final RevTag c;
  127. c = new RevTag(id("9473095c4cb2f12aefe1db8a355fe3fafba42f67"));
  128. assertNull(c.getObject());
  129. assertNull(c.getTagName());
  130. try (RevWalk rw = new RevWalk(db)) {
  131. c.parseCanonical(rw, body.toString().getBytes(UTF_8));
  132. assertNotNull(c.getObject());
  133. assertEquals(treeId, c.getObject().getId());
  134. assertSame(rw.lookupTree(treeId), c.getObject());
  135. }
  136. assertNotNull(c.getTagName());
  137. assertEquals(name, c.getTagName());
  138. assertEquals("test", c.getShortMessage());
  139. assertEquals("test\n", c.getFullMessage());
  140. assertEquals(fakeSignature + '\n',
  141. new String(c.getRawGpgSignature(), US_ASCII));
  142. assertNull(c.getTaggerIdent());
  143. }
  144. private RevTag create(String msg) throws Exception {
  145. final StringBuilder b = new StringBuilder();
  146. b.append("object 9788669ad918b6fcce64af8882fc9a81cb6aba67\n");
  147. b.append("type tree\n");
  148. b.append("tag v1.2.3.4.5\n");
  149. b.append("tagger A U. Thor <a_u_thor@example.com> 1218123387 +0700\n");
  150. b.append("\n");
  151. b.append(msg);
  152. final RevTag c;
  153. c = new RevTag(id("9473095c4cb2f12aefe1db8a355fe3fafba42f67"));
  154. try (RevWalk rw = new RevWalk(db)) {
  155. c.parseCanonical(rw, b.toString().getBytes(UTF_8));
  156. }
  157. return c;
  158. }
  159. @Test
  160. public void testParse_implicit_UTF8_encoded() throws Exception {
  161. final ByteArrayOutputStream b = new ByteArrayOutputStream();
  162. b.write("object 9788669ad918b6fcce64af8882fc9a81cb6aba67\n"
  163. .getBytes(UTF_8));
  164. b.write("type tree\n".getBytes(UTF_8));
  165. b.write("tag v1.2.3.4.5\n".getBytes(UTF_8));
  166. b
  167. .write("tagger F\u00f6r fattare <a_u_thor@example.com> 1218123387 +0700\n"
  168. .getBytes(UTF_8));
  169. b.write("\n".getBytes(UTF_8));
  170. b.write("Sm\u00f6rg\u00e5sbord\n".getBytes(UTF_8));
  171. b.write("\n".getBytes(UTF_8));
  172. b.write("\u304d\u308c\u3044\n".getBytes(UTF_8));
  173. final RevTag c;
  174. c = new RevTag(id("9473095c4cb2f12aefe1db8a355fe3fafba42f67"));
  175. try (RevWalk rw = new RevWalk(db)) {
  176. c.parseCanonical(rw, b.toByteArray());
  177. }
  178. assertEquals("F\u00f6r fattare", c.getTaggerIdent().getName());
  179. assertEquals("Sm\u00f6rg\u00e5sbord", c.getShortMessage());
  180. assertEquals("Sm\u00f6rg\u00e5sbord\n\n\u304d\u308c\u3044\n", c
  181. .getFullMessage());
  182. }
  183. @Test
  184. public void testParse_implicit_mixed_encoded() throws Exception {
  185. final ByteArrayOutputStream b = new ByteArrayOutputStream();
  186. b.write("object 9788669ad918b6fcce64af8882fc9a81cb6aba67\n"
  187. .getBytes(UTF_8));
  188. b.write("type tree\n".getBytes(UTF_8));
  189. b.write("tag v1.2.3.4.5\n".getBytes(UTF_8));
  190. b.write("tagger F\u00f6r fattare <a_u_thor@example.com> 1218123387 +0700\n"
  191. .getBytes(ISO_8859_1));
  192. b.write("\n".getBytes(UTF_8));
  193. b.write("Sm\u00f6rg\u00e5sbord\n".getBytes(UTF_8));
  194. b.write("\n".getBytes(UTF_8));
  195. b.write("\u304d\u308c\u3044\n".getBytes(UTF_8));
  196. final RevTag c;
  197. c = new RevTag(id("9473095c4cb2f12aefe1db8a355fe3fafba42f67"));
  198. try (RevWalk rw = new RevWalk(db)) {
  199. c.parseCanonical(rw, b.toByteArray());
  200. }
  201. assertEquals("F\u00f6r fattare", c.getTaggerIdent().getName());
  202. assertEquals("Sm\u00f6rg\u00e5sbord", c.getShortMessage());
  203. assertEquals("Sm\u00f6rg\u00e5sbord\n\n\u304d\u308c\u3044\n", c
  204. .getFullMessage());
  205. }
  206. /**
  207. * Test parsing of a commit whose encoding is given and works.
  208. *
  209. * @throws Exception
  210. */
  211. @Test
  212. public void testParse_explicit_encoded() throws Exception {
  213. final ByteArrayOutputStream b = new ByteArrayOutputStream();
  214. b.write("object 9788669ad918b6fcce64af8882fc9a81cb6aba67\n"
  215. .getBytes("EUC-JP"));
  216. b.write("type tree\n".getBytes("EUC-JP"));
  217. b.write("tag v1.2.3.4.5\n".getBytes("EUC-JP"));
  218. b
  219. .write("tagger F\u00f6r fattare <a_u_thor@example.com> 1218123387 +0700\n"
  220. .getBytes("EUC-JP"));
  221. b.write("encoding euc_JP\n".getBytes("EUC-JP"));
  222. b.write("\n".getBytes("EUC-JP"));
  223. b.write("\u304d\u308c\u3044\n".getBytes("EUC-JP"));
  224. b.write("\n".getBytes("EUC-JP"));
  225. b.write("Hi\n".getBytes("EUC-JP"));
  226. final RevTag c;
  227. c = new RevTag(id("9473095c4cb2f12aefe1db8a355fe3fafba42f67"));
  228. try (RevWalk rw = new RevWalk(db)) {
  229. c.parseCanonical(rw, b.toByteArray());
  230. }
  231. assertEquals("F\u00f6r fattare", c.getTaggerIdent().getName());
  232. assertEquals("\u304d\u308c\u3044", c.getShortMessage());
  233. assertEquals("\u304d\u308c\u3044\n\nHi\n", c.getFullMessage());
  234. }
  235. /**
  236. * This is a twisted case, but show what we expect here. We can revise the
  237. * expectations provided this case is updated.
  238. *
  239. * What happens here is that an encoding us given, but data is not encoded
  240. * that way (and we can detect it), so we try other encodings.
  241. *
  242. * @throws Exception
  243. */
  244. @Test
  245. public void testParse_explicit_bad_encoded() throws Exception {
  246. final ByteArrayOutputStream b = new ByteArrayOutputStream();
  247. b.write("object 9788669ad918b6fcce64af8882fc9a81cb6aba67\n"
  248. .getBytes(UTF_8));
  249. b.write("type tree\n".getBytes(UTF_8));
  250. b.write("tag v1.2.3.4.5\n".getBytes(UTF_8));
  251. b
  252. .write("tagger F\u00f6r fattare <a_u_thor@example.com> 1218123387 +0700\n"
  253. .getBytes(ISO_8859_1));
  254. b.write("encoding EUC-JP\n".getBytes(UTF_8));
  255. b.write("\n".getBytes(UTF_8));
  256. b.write("\u304d\u308c\u3044\n".getBytes(UTF_8));
  257. b.write("\n".getBytes(UTF_8));
  258. b.write("Hi\n".getBytes(UTF_8));
  259. final RevTag c;
  260. c = new RevTag(id("9473095c4cb2f12aefe1db8a355fe3fafba42f67"));
  261. try (RevWalk rw = new RevWalk(db)) {
  262. c.parseCanonical(rw, b.toByteArray());
  263. }
  264. assertEquals("F\u00f6r fattare", c.getTaggerIdent().getName());
  265. assertEquals("\u304d\u308c\u3044", c.getShortMessage());
  266. assertEquals("\u304d\u308c\u3044\n\nHi\n", c.getFullMessage());
  267. }
  268. /**
  269. * This is a twisted case too, but show what we expect here. We can revise
  270. * the expectations provided this case is updated.
  271. *
  272. * What happens here is that an encoding us given, but data is not encoded
  273. * that way (and we can detect it), so we try other encodings. Here data
  274. * could actually be decoded in the stated encoding, but we override using
  275. * UTF-8.
  276. *
  277. * @throws Exception
  278. */
  279. @Test
  280. public void testParse_explicit_bad_encoded2() throws Exception {
  281. final ByteArrayOutputStream b = new ByteArrayOutputStream();
  282. b.write("object 9788669ad918b6fcce64af8882fc9a81cb6aba67\n"
  283. .getBytes(UTF_8));
  284. b.write("type tree\n".getBytes(UTF_8));
  285. b.write("tag v1.2.3.4.5\n".getBytes(UTF_8));
  286. b
  287. .write("tagger F\u00f6r fattare <a_u_thor@example.com> 1218123387 +0700\n"
  288. .getBytes(UTF_8));
  289. b.write("encoding ISO-8859-1\n".getBytes(UTF_8));
  290. b.write("\n".getBytes(UTF_8));
  291. b.write("\u304d\u308c\u3044\n".getBytes(UTF_8));
  292. b.write("\n".getBytes(UTF_8));
  293. b.write("Hi\n".getBytes(UTF_8));
  294. final RevTag c;
  295. c = new RevTag(id("9473095c4cb2f12aefe1db8a355fe3fafba42f67"));
  296. try (RevWalk rw = new RevWalk(db)) {
  297. c.parseCanonical(rw, b.toByteArray());
  298. }
  299. assertEquals("F\u00f6r fattare", c.getTaggerIdent().getName());
  300. assertEquals("\u304d\u308c\u3044", c.getShortMessage());
  301. assertEquals("\u304d\u308c\u3044\n\nHi\n", c.getFullMessage());
  302. }
  303. @Test
  304. public void testParse_illegalEncoding() throws Exception {
  305. ByteArrayOutputStream b = new ByteArrayOutputStream();
  306. b.write("object 9788669ad918b6fcce64af8882fc9a81cb6aba67\n".getBytes(UTF_8));
  307. b.write("type tree\n".getBytes(UTF_8));
  308. b.write("tag v1.0\n".getBytes(UTF_8));
  309. b.write("tagger t <t@example.com> 1218123387 +0700\n".getBytes(UTF_8));
  310. b.write("encoding utf-8logoutputencoding=gbk\n".getBytes(UTF_8));
  311. b.write("\n".getBytes(UTF_8));
  312. b.write("message\n".getBytes(UTF_8));
  313. RevTag t = new RevTag(id("9473095c4cb2f12aefe1db8a355fe3fafba42f67"));
  314. try (RevWalk rw = new RevWalk(db)) {
  315. t.parseCanonical(rw, b.toByteArray());
  316. }
  317. assertEquals("t", t.getTaggerIdent().getName());
  318. assertEquals("message", t.getShortMessage());
  319. assertEquals("message\n", t.getFullMessage());
  320. }
  321. @Test
  322. public void testParse_unsupportedEncoding() throws Exception {
  323. ByteArrayOutputStream b = new ByteArrayOutputStream();
  324. b.write("object 9788669ad918b6fcce64af8882fc9a81cb6aba67\n".getBytes(UTF_8));
  325. b.write("type tree\n".getBytes(UTF_8));
  326. b.write("tag v1.0\n".getBytes(UTF_8));
  327. b.write("tagger t <t@example.com> 1218123387 +0700\n".getBytes(UTF_8));
  328. b.write("encoding it_IT.UTF8\n".getBytes(UTF_8));
  329. b.write("\n".getBytes(UTF_8));
  330. b.write("message\n".getBytes(UTF_8));
  331. RevTag t = new RevTag(id("9473095c4cb2f12aefe1db8a355fe3fafba42f67"));
  332. try (RevWalk rw = new RevWalk(db)) {
  333. t.parseCanonical(rw, b.toByteArray());
  334. }
  335. assertEquals("t", t.getTaggerIdent().getName());
  336. assertEquals("message", t.getShortMessage());
  337. assertEquals("message\n", t.getFullMessage());
  338. }
  339. @Test
  340. public void testParse_gpgSignature() throws Exception {
  341. final String signature = "-----BEGIN PGP SIGNATURE-----\n\n"
  342. + "wsBcBAABCAAQBQJbGB4pCRBK7hj4Ov3rIwAAdHIIAENrvz23867ZgqrmyPemBEZP\n"
  343. + "U24B1Tlq/DWvce2buaxmbNQngKZ0pv2s8VMc11916WfTIC9EKvioatmpjduWvhqj\n"
  344. + "znQTFyiMor30pyYsfrqFuQZvqBW01o8GEWqLg8zjf9Rf0R3LlOEw86aT8CdHRlm6\n"
  345. + "wlb22xb8qoX4RB+LYfz7MhK5F+yLOPXZdJnAVbuyoMGRnDpwdzjL5Hj671+XJxN5\n"
  346. + "SasRdhxkkfw/ZnHxaKEc4juMz8Nziz27elRwhOQqlTYoXNJnsV//wy5Losd7aKi1\n"
  347. + "xXXyUpndEOmT0CIcKHrN/kbYoVL28OJaxoBuva3WYQaRrzEe3X02NMxZe9gkSqA=\n"
  348. + "=TClh\n" + "-----END PGP SIGNATURE-----";
  349. ByteArrayOutputStream b = new ByteArrayOutputStream();
  350. b.write("object 9788669ad918b6fcce64af8882fc9a81cb6aba67\n"
  351. .getBytes(UTF_8));
  352. b.write("type tree\n".getBytes(UTF_8));
  353. b.write("tag v1.0\n".getBytes(UTF_8));
  354. b.write("tagger t <t@example.com> 1218123387 +0700\n".getBytes(UTF_8));
  355. b.write('\n');
  356. b.write("message\n".getBytes(UTF_8));
  357. b.write(signature.getBytes(US_ASCII));
  358. b.write('\n');
  359. RevTag t = new RevTag(id("9473095c4cb2f12aefe1db8a355fe3fafba42f67"));
  360. try (RevWalk rw = new RevWalk(db)) {
  361. t.parseCanonical(rw, b.toByteArray());
  362. }
  363. assertEquals("t", t.getTaggerIdent().getName());
  364. assertEquals("message", t.getShortMessage());
  365. assertEquals("message\n", t.getFullMessage());
  366. String gpgSig = new String(t.getRawGpgSignature(), UTF_8);
  367. assertEquals(signature + '\n', gpgSig);
  368. }
  369. @Test
  370. public void testParse_gpgSignature2() throws Exception {
  371. final String signature = "-----BEGIN PGP SIGNATURE-----\n\n"
  372. + "wsBcBAABCAAQBQJbGB4pCRBK7hj4Ov3rIwAAdHIIAENrvz23867ZgqrmyPemBEZP\n"
  373. + "U24B1Tlq/DWvce2buaxmbNQngKZ0pv2s8VMc11916WfTIC9EKvioatmpjduWvhqj\n"
  374. + "znQTFyiMor30pyYsfrqFuQZvqBW01o8GEWqLg8zjf9Rf0R3LlOEw86aT8CdHRlm6\n"
  375. + "wlb22xb8qoX4RB+LYfz7MhK5F+yLOPXZdJnAVbuyoMGRnDpwdzjL5Hj671+XJxN5\n"
  376. + "SasRdhxkkfw/ZnHxaKEc4juMz8Nziz27elRwhOQqlTYoXNJnsV//wy5Losd7aKi1\n"
  377. + "xXXyUpndEOmT0CIcKHrN/kbYoVL28OJaxoBuva3WYQaRrzEe3X02NMxZe9gkSqA=\n"
  378. + "=TClh\n" + "-----END PGP SIGNATURE-----";
  379. ByteArrayOutputStream b = new ByteArrayOutputStream();
  380. b.write("object 9788669ad918b6fcce64af8882fc9a81cb6aba67\n"
  381. .getBytes(UTF_8));
  382. b.write("type tree\n".getBytes(UTF_8));
  383. b.write("tag v1.0\n".getBytes(UTF_8));
  384. b.write("tagger t <t@example.com> 1218123387 +0700\n".getBytes(UTF_8));
  385. b.write('\n');
  386. String message = "message\n\n" + signature.replace("xXXy", "aAAb")
  387. + '\n';
  388. b.write(message.getBytes(UTF_8));
  389. b.write(signature.getBytes(US_ASCII));
  390. b.write('\n');
  391. RevTag t = new RevTag(id("9473095c4cb2f12aefe1db8a355fe3fafba42f67"));
  392. try (RevWalk rw = new RevWalk(db)) {
  393. t.parseCanonical(rw, b.toByteArray());
  394. }
  395. assertEquals("t", t.getTaggerIdent().getName());
  396. assertEquals("message", t.getShortMessage());
  397. assertEquals(message, t.getFullMessage());
  398. String gpgSig = new String(t.getRawGpgSignature(), UTF_8);
  399. assertEquals(signature + '\n', gpgSig);
  400. }
  401. @Test
  402. public void testParse_gpgSignature3() throws Exception {
  403. final String signature = "-----BEGIN PGP SIGNATURE-----\n\n"
  404. + "wsBcBAABCAAQBQJbGB4pCRBK7hj4Ov3rIwAAdHIIAENrvz23867ZgqrmyPemBEZP\n"
  405. + "U24B1Tlq/DWvce2buaxmbNQngKZ0pv2s8VMc11916WfTIC9EKvioatmpjduWvhqj\n"
  406. + "znQTFyiMor30pyYsfrqFuQZvqBW01o8GEWqLg8zjf9Rf0R3LlOEw86aT8CdHRlm6\n"
  407. + "wlb22xb8qoX4RB+LYfz7MhK5F+yLOPXZdJnAVbuyoMGRnDpwdzjL5Hj671+XJxN5\n"
  408. + "SasRdhxkkfw/ZnHxaKEc4juMz8Nziz27elRwhOQqlTYoXNJnsV//wy5Losd7aKi1\n"
  409. + "xXXyUpndEOmT0CIcKHrN/kbYoVL28OJaxoBuva3WYQaRrzEe3X02NMxZe9gkSqA=\n"
  410. + "=TClh\n" + "-----END PGP SIGNATURE-----";
  411. ByteArrayOutputStream b = new ByteArrayOutputStream();
  412. b.write("object 9788669ad918b6fcce64af8882fc9a81cb6aba67\n"
  413. .getBytes(UTF_8));
  414. b.write("type tree\n".getBytes(UTF_8));
  415. b.write("tag v1.0\n".getBytes(UTF_8));
  416. b.write("tagger t <t@example.com> 1218123387 +0700\n".getBytes(UTF_8));
  417. b.write('\n');
  418. String message = "message\n\n-----BEGIN PGP SIGNATURE-----\n";
  419. b.write(message.getBytes(UTF_8));
  420. b.write(signature.getBytes(US_ASCII));
  421. b.write('\n');
  422. RevTag t = new RevTag(id("9473095c4cb2f12aefe1db8a355fe3fafba42f67"));
  423. try (RevWalk rw = new RevWalk(db)) {
  424. t.parseCanonical(rw, b.toByteArray());
  425. }
  426. assertEquals("t", t.getTaggerIdent().getName());
  427. assertEquals("message", t.getShortMessage());
  428. assertEquals(message, t.getFullMessage());
  429. String gpgSig = new String(t.getRawGpgSignature(), UTF_8);
  430. assertEquals(signature + '\n', gpgSig);
  431. }
  432. @Test
  433. public void testParse_NoMessage() throws Exception {
  434. final String msg = "";
  435. final RevTag c = create(msg);
  436. assertEquals(msg, c.getFullMessage());
  437. assertEquals(msg, c.getShortMessage());
  438. }
  439. @Test
  440. public void testParse_OnlyLFMessage() throws Exception {
  441. final RevTag c = create("\n");
  442. assertEquals("\n", c.getFullMessage());
  443. assertEquals("", c.getShortMessage());
  444. }
  445. @Test
  446. public void testParse_ShortLineOnlyNoLF() throws Exception {
  447. final String shortMsg = "This is a short message.";
  448. final RevTag c = create(shortMsg);
  449. assertEquals(shortMsg, c.getFullMessage());
  450. assertEquals(shortMsg, c.getShortMessage());
  451. }
  452. @Test
  453. public void testParse_ShortLineOnlyEndLF() throws Exception {
  454. final String shortMsg = "This is a short message.";
  455. final String fullMsg = shortMsg + "\n";
  456. final RevTag c = create(fullMsg);
  457. assertEquals(fullMsg, c.getFullMessage());
  458. assertEquals(shortMsg, c.getShortMessage());
  459. }
  460. @Test
  461. public void testParse_ShortLineOnlyEmbeddedLF() throws Exception {
  462. final String fullMsg = "This is a\nshort message.";
  463. final String shortMsg = fullMsg.replace('\n', ' ');
  464. final RevTag c = create(fullMsg);
  465. assertEquals(fullMsg, c.getFullMessage());
  466. assertEquals(shortMsg, c.getShortMessage());
  467. }
  468. @Test
  469. public void testParse_ShortLineOnlyEmbeddedAndEndingLF() throws Exception {
  470. final String fullMsg = "This is a\nshort message.\n";
  471. final String shortMsg = "This is a short message.";
  472. final RevTag c = create(fullMsg);
  473. assertEquals(fullMsg, c.getFullMessage());
  474. assertEquals(shortMsg, c.getShortMessage());
  475. }
  476. @Test
  477. public void testParse_GitStyleMessage() throws Exception {
  478. final String shortMsg = "This fixes a bug.";
  479. final String body = "We do it with magic and pixie dust and stuff.\n"
  480. + "\n" + "Signed-off-by: A U. Thor <author@example.com>\n";
  481. final String fullMsg = shortMsg + "\n" + "\n" + body;
  482. final RevTag c = create(fullMsg);
  483. assertEquals(fullMsg, c.getFullMessage());
  484. assertEquals(shortMsg, c.getShortMessage());
  485. }
  486. @Test
  487. public void testParse_PublicParseMethod()
  488. throws CorruptObjectException, UnsupportedEncodingException {
  489. TagBuilder src = new TagBuilder();
  490. try (ObjectInserter.Formatter fmt = new ObjectInserter.Formatter()) {
  491. src.setObjectId(fmt.idFor(Constants.OBJ_TREE, new byte[] {}),
  492. Constants.OBJ_TREE);
  493. }
  494. src.setTagger(committer);
  495. src.setTag("a.test");
  496. src.setMessage("Test tag\n\nThis is a test.\n");
  497. RevTag p = RevTag.parse(src.build());
  498. assertEquals(src.getObjectId(), p.getObject());
  499. assertEquals(committer, p.getTaggerIdent());
  500. assertEquals("a.test", p.getTagName());
  501. assertEquals("Test tag", p.getShortMessage());
  502. assertEquals(src.getMessage(), p.getFullMessage());
  503. }
  504. private static ObjectId id(String str) {
  505. return ObjectId.fromString(str);
  506. }
  507. }