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.

ReflogReaderTest.java 10KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. /*
  2. * Copyright (C) 2009, Robin Rosenberg
  3. * Copyright (C) 2009, Robin Rosenberg <robin.rosenberg@dewire.com> and others
  4. *
  5. * This program and the accompanying materials are made available under the
  6. * terms of the Eclipse Distribution License v. 1.0 which is available at
  7. * https://www.eclipse.org/org/documents/edl-v10.php.
  8. *
  9. * SPDX-License-Identifier: BSD-3-Clause
  10. */
  11. package org.eclipse.jgit.internal.storage.file;
  12. import static java.nio.charset.StandardCharsets.UTF_8;
  13. import static org.junit.Assert.assertEquals;
  14. import static org.junit.Assert.assertNotNull;
  15. import static org.junit.Assert.assertNull;
  16. import java.io.File;
  17. import java.io.FileNotFoundException;
  18. import java.io.FileOutputStream;
  19. import java.io.IOException;
  20. import java.text.SimpleDateFormat;
  21. import java.util.List;
  22. import org.eclipse.jgit.lib.CheckoutEntry;
  23. import org.eclipse.jgit.lib.Constants;
  24. import org.eclipse.jgit.lib.ObjectId;
  25. import org.eclipse.jgit.lib.PersonIdent;
  26. import org.eclipse.jgit.lib.ReflogEntry;
  27. import org.eclipse.jgit.lib.ReflogReader;
  28. import org.eclipse.jgit.test.resources.SampleDataRepositoryTestCase;
  29. import org.junit.Test;
  30. public class ReflogReaderTest extends SampleDataRepositoryTestCase {
  31. static byte[] oneLine = "da85355dfc525c9f6f3927b876f379f46ccf826e 3e7549db262d1e836d9bf0af7e22355468f1717c A O Thor Too <authortoo@wri.tr> 1243028200 +0200\tcommit: Add a toString for debugging to RemoteRefUpdate\n"
  32. .getBytes(UTF_8);
  33. static byte[] twoLine = ("0000000000000000000000000000000000000000 c6734895958052a9dbc396cff4459dc1a25029ab A U Thor <thor@committer.au> 1243028201 -0100\tbranch: Created from rr/renamebranchv4\n"
  34. + "c6734895958052a9dbc396cff4459dc1a25029ab 54794942a18a237c57a80719afed44bb78172b10 Same A U Thor <same.author@example.com> 1243028202 +0100\trebase finished: refs/heads/rr/renamebranch5 onto c6e3b9fe2da0293f11eae202ec35fb343191a82d\n")
  35. .getBytes(UTF_8);
  36. static byte[] twoLineWithAppendInProgress = ("0000000000000000000000000000000000000000 c6734895958052a9dbc396cff4459dc1a25029ab A U Thor <thor@committer.au> 1243028201 -0100\tbranch: Created from rr/renamebranchv4\n"
  37. + "c6734895958052a9dbc396cff4459dc1a25029ab 54794942a18a237c57a80719afed44bb78172b10 Same A U Thor <same.author@example.com> 1243028202 +0100\trebase finished: refs/heads/rr/renamebranch5 onto c6e3b9fe2da0293f11eae202ec35fb343191a82d\n"
  38. + "54794942a18a237c57a80719afed44bb78172b10 ")
  39. .getBytes(UTF_8);
  40. static byte[] aLine = "1111111111111111111111111111111111111111 3e7549db262d1e836d9bf0af7e22355468f1717c A U Thor <thor@committer.au> 1243028201 -0100\tbranch: change to a\n"
  41. .getBytes(UTF_8);
  42. static byte[] masterLine = "2222222222222222222222222222222222222222 3e7549db262d1e836d9bf0af7e22355468f1717c A U Thor <thor@committer.au> 1243028201 -0100\tbranch: change to master\n"
  43. .getBytes(UTF_8);
  44. static byte[] headLine = "3333333333333333333333333333333333333333 3e7549db262d1e836d9bf0af7e22355468f1717c A U Thor <thor@committer.au> 1243028201 -0100\tbranch: change to HEAD\n"
  45. .getBytes(UTF_8);
  46. static byte[] oneLineWithoutComment = "da85355dfc525c9f6f3927b876f379f46ccf826e 3e7549db262d1e836d9bf0af7e22355468f1717c A O Thor Too <authortoo@wri.tr> 1243028200 +0200\n"
  47. .getBytes(UTF_8);
  48. static byte[] switchBranch = "0d43a6890a19fd657faad1c4cfbe3cb1b47851c3 4809df9c0d8bce5b00955563f77c5a9f25aa0d12 A O Thor Too <authortoo@wri.tr> 1315088009 +0200\tcheckout: moving from new/work to master\n"
  49. .getBytes(UTF_8);
  50. @Test
  51. public void testReadOneLine() throws Exception {
  52. setupReflog("logs/refs/heads/master", oneLine);
  53. ReflogReader reader = new ReflogReaderImpl(db, "refs/heads/master");
  54. ReflogEntry e = reader.getLastEntry();
  55. assertEquals(ObjectId
  56. .fromString("da85355dfc525c9f6f3927b876f379f46ccf826e"), e
  57. .getOldId());
  58. assertEquals(ObjectId
  59. .fromString("3e7549db262d1e836d9bf0af7e22355468f1717c"), e
  60. .getNewId());
  61. assertEquals("A O Thor Too", e.getWho().getName());
  62. assertEquals("authortoo@wri.tr", e.getWho().getEmailAddress());
  63. assertEquals(120, e.getWho().getTimeZoneOffset());
  64. assertEquals("2009-05-22T23:36:40", iso(e.getWho()));
  65. assertEquals("commit: Add a toString for debugging to RemoteRefUpdate",
  66. e.getComment());
  67. }
  68. private static String iso(PersonIdent id) {
  69. final SimpleDateFormat fmt;
  70. fmt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
  71. fmt.setTimeZone(id.getTimeZone());
  72. return fmt.format(id.getWhen());
  73. }
  74. @Test
  75. public void testReadTwoLine() throws Exception {
  76. setupReflog("logs/refs/heads/master", twoLine);
  77. ReflogReader reader = new ReflogReaderImpl(db, "refs/heads/master");
  78. List<ReflogEntry> reverseEntries = reader.getReverseEntries();
  79. assertEquals(2, reverseEntries.size());
  80. ReflogEntry e = reverseEntries.get(0);
  81. assertEquals(ObjectId
  82. .fromString("c6734895958052a9dbc396cff4459dc1a25029ab"), e
  83. .getOldId());
  84. assertEquals(ObjectId
  85. .fromString("54794942a18a237c57a80719afed44bb78172b10"), e
  86. .getNewId());
  87. assertEquals("Same A U Thor", e.getWho().getName());
  88. assertEquals("same.author@example.com", e.getWho().getEmailAddress());
  89. assertEquals(60, e.getWho().getTimeZoneOffset());
  90. assertEquals("2009-05-22T22:36:42", iso(e.getWho()));
  91. assertEquals(
  92. "rebase finished: refs/heads/rr/renamebranch5 onto c6e3b9fe2da0293f11eae202ec35fb343191a82d",
  93. e.getComment());
  94. e = reverseEntries.get(1);
  95. assertEquals(ObjectId
  96. .fromString("0000000000000000000000000000000000000000"), e
  97. .getOldId());
  98. assertEquals(ObjectId
  99. .fromString("c6734895958052a9dbc396cff4459dc1a25029ab"), e
  100. .getNewId());
  101. assertEquals("A U Thor", e.getWho().getName());
  102. assertEquals("thor@committer.au", e.getWho().getEmailAddress());
  103. assertEquals(-60, e.getWho().getTimeZoneOffset());
  104. assertEquals("2009-05-22T20:36:41", iso(e.getWho()));
  105. assertEquals("branch: Created from rr/renamebranchv4", e.getComment());
  106. }
  107. @Test
  108. public void testReadWhileAppendIsInProgress() throws Exception {
  109. setupReflog("logs/refs/heads/master", twoLineWithAppendInProgress);
  110. ReflogReader reader = new ReflogReaderImpl(db, "refs/heads/master");
  111. List<ReflogEntry> reverseEntries = reader.getReverseEntries();
  112. assertEquals(2, reverseEntries.size());
  113. ReflogEntry e = reverseEntries.get(0);
  114. assertEquals(ObjectId
  115. .fromString("c6734895958052a9dbc396cff4459dc1a25029ab"), e
  116. .getOldId());
  117. assertEquals(ObjectId
  118. .fromString("54794942a18a237c57a80719afed44bb78172b10"), e
  119. .getNewId());
  120. assertEquals("Same A U Thor", e.getWho().getName());
  121. assertEquals("same.author@example.com", e.getWho().getEmailAddress());
  122. assertEquals(60, e.getWho().getTimeZoneOffset());
  123. assertEquals("2009-05-22T22:36:42", iso(e.getWho()));
  124. assertEquals(
  125. "rebase finished: refs/heads/rr/renamebranch5 onto c6e3b9fe2da0293f11eae202ec35fb343191a82d",
  126. e.getComment());
  127. // while similar to testReadTwoLine, we can assume that if we get the last entry
  128. // right, everything else is too
  129. }
  130. @Test
  131. public void testReadRightLog() throws Exception {
  132. setupReflog("logs/refs/heads/a", aLine);
  133. setupReflog("logs/refs/heads/master", masterLine);
  134. setupReflog("logs/HEAD", headLine);
  135. assertEquals("branch: change to master", db.getReflogReader("master")
  136. .getLastEntry().getComment());
  137. assertEquals("branch: change to a", db.getReflogReader("a")
  138. .getLastEntry().getComment());
  139. assertEquals("branch: change to HEAD", db.getReflogReader("HEAD")
  140. .getLastEntry().getComment());
  141. }
  142. @Test
  143. public void testReadLineWithMissingComment() throws Exception {
  144. setupReflog("logs/refs/heads/master", oneLineWithoutComment);
  145. final ReflogReader reader = db.getReflogReader("master");
  146. ReflogEntry e = reader.getLastEntry();
  147. assertEquals(ObjectId
  148. .fromString("da85355dfc525c9f6f3927b876f379f46ccf826e"), e
  149. .getOldId());
  150. assertEquals(ObjectId
  151. .fromString("3e7549db262d1e836d9bf0af7e22355468f1717c"), e
  152. .getNewId());
  153. assertEquals("A O Thor Too", e.getWho().getName());
  154. assertEquals("authortoo@wri.tr", e.getWho().getEmailAddress());
  155. assertEquals(120, e.getWho().getTimeZoneOffset());
  156. assertEquals("2009-05-22T23:36:40", iso(e.getWho()));
  157. assertEquals("",
  158. e.getComment());
  159. }
  160. @Test
  161. public void testNoLog() throws Exception {
  162. assertEquals(0, db.getReflogReader("master").getReverseEntries().size());
  163. assertNull(db.getReflogReader("master").getLastEntry());
  164. }
  165. @Test
  166. public void testCheckout() throws Exception {
  167. setupReflog("logs/HEAD", switchBranch);
  168. List<ReflogEntry> entries = db.getReflogReader(Constants.HEAD)
  169. .getReverseEntries();
  170. assertEquals(1, entries.size());
  171. ReflogEntry entry = entries.get(0);
  172. CheckoutEntry checkout = entry.parseCheckout();
  173. assertNotNull(checkout);
  174. assertEquals("master", checkout.getToBranch());
  175. assertEquals("new/work", checkout.getFromBranch());
  176. }
  177. @Test
  178. public void testSpecificEntryNumber() throws Exception {
  179. setupReflog("logs/refs/heads/master", twoLine);
  180. ReflogReader reader = new ReflogReaderImpl(db, "refs/heads/master");
  181. ReflogEntry e = reader.getReverseEntry(0);
  182. assertEquals(
  183. ObjectId.fromString("c6734895958052a9dbc396cff4459dc1a25029ab"),
  184. e.getOldId());
  185. assertEquals(
  186. ObjectId.fromString("54794942a18a237c57a80719afed44bb78172b10"),
  187. e.getNewId());
  188. assertEquals("Same A U Thor", e.getWho().getName());
  189. assertEquals("same.author@example.com", e.getWho().getEmailAddress());
  190. assertEquals(60, e.getWho().getTimeZoneOffset());
  191. assertEquals("2009-05-22T22:36:42", iso(e.getWho()));
  192. assertEquals(
  193. "rebase finished: refs/heads/rr/renamebranch5 onto c6e3b9fe2da0293f11eae202ec35fb343191a82d",
  194. e.getComment());
  195. e = reader.getReverseEntry(1);
  196. assertEquals(
  197. ObjectId.fromString("0000000000000000000000000000000000000000"),
  198. e.getOldId());
  199. assertEquals(
  200. ObjectId.fromString("c6734895958052a9dbc396cff4459dc1a25029ab"),
  201. e.getNewId());
  202. assertEquals("A U Thor", e.getWho().getName());
  203. assertEquals("thor@committer.au", e.getWho().getEmailAddress());
  204. assertEquals(-60, e.getWho().getTimeZoneOffset());
  205. assertEquals("2009-05-22T20:36:41", iso(e.getWho()));
  206. assertEquals("branch: Created from rr/renamebranchv4", e.getComment());
  207. assertNull(reader.getReverseEntry(3));
  208. }
  209. private void setupReflog(String logName, byte[] data)
  210. throws FileNotFoundException, IOException {
  211. File logfile = new File(db.getDirectory(), logName);
  212. if (!logfile.getParentFile().mkdirs()
  213. && !logfile.getParentFile().isDirectory()) {
  214. throw new IOException(
  215. "oops, cannot create the directory for the test reflog file"
  216. + logfile);
  217. }
  218. try (FileOutputStream fileOutputStream = new FileOutputStream(logfile)) {
  219. fileOutputStream.write(data);
  220. }
  221. }
  222. }