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