Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

FileReftableTest.java 19KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573
  1. /*
  2. * Copyright (C) 2019, 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.internal.storage.file;
  11. import static org.eclipse.jgit.lib.RefUpdate.Result.FAST_FORWARD;
  12. import static org.eclipse.jgit.lib.RefUpdate.Result.FORCED;
  13. import static org.eclipse.jgit.lib.RefUpdate.Result.IO_FAILURE;
  14. import static org.eclipse.jgit.lib.RefUpdate.Result.LOCK_FAILURE;
  15. import static org.junit.Assert.assertEquals;
  16. import static org.junit.Assert.assertFalse;
  17. import static org.junit.Assert.assertNotEquals;
  18. import static org.junit.Assert.assertNotNull;
  19. import static org.junit.Assert.assertNotSame;
  20. import static org.junit.Assert.assertNull;
  21. import static org.junit.Assert.assertSame;
  22. import static org.junit.Assert.assertTrue;
  23. import static org.junit.Assert.fail;
  24. import java.io.File;
  25. import java.io.IOException;
  26. import java.security.SecureRandom;
  27. import java.util.ArrayList;
  28. import java.util.List;
  29. import org.eclipse.jgit.lib.AnyObjectId;
  30. import org.eclipse.jgit.lib.Constants;
  31. import org.eclipse.jgit.lib.NullProgressMonitor;
  32. import org.eclipse.jgit.lib.ObjectId;
  33. import org.eclipse.jgit.lib.PersonIdent;
  34. import org.eclipse.jgit.lib.Ref;
  35. import org.eclipse.jgit.lib.RefRename;
  36. import org.eclipse.jgit.lib.RefUpdate;
  37. import org.eclipse.jgit.lib.RefUpdate.Result;
  38. import org.eclipse.jgit.lib.ReflogEntry;
  39. import org.eclipse.jgit.lib.ReflogReader;
  40. import org.eclipse.jgit.lib.RepositoryCache;
  41. import org.eclipse.jgit.revwalk.RevWalk;
  42. import org.eclipse.jgit.test.resources.SampleDataRepositoryTestCase;
  43. import org.eclipse.jgit.transport.ReceiveCommand;
  44. import org.junit.Test;
  45. public class FileReftableTest extends SampleDataRepositoryTestCase {
  46. String bCommit;
  47. @Override
  48. public void setUp() throws Exception {
  49. super.setUp();
  50. Ref b = db.exactRef("refs/heads/b");
  51. bCommit = b.getObjectId().getName();
  52. db.convertToReftable(false, false);
  53. }
  54. @SuppressWarnings("boxing")
  55. @Test
  56. public void testRacyReload() throws Exception {
  57. ObjectId id = db.resolve("master");
  58. int retry = 0;
  59. try (FileRepository repo1 = new FileRepository(db.getDirectory());
  60. FileRepository repo2 = new FileRepository(db.getDirectory())) {
  61. FileRepository repos[] = { repo1, repo2 };
  62. for (int i = 0; i < 10; i++) {
  63. for (int j = 0; j < 2; j++) {
  64. FileRepository repo = repos[j];
  65. RefUpdate u = repo.getRefDatabase().newUpdate(
  66. String.format("branch%d", i * 10 + j), false);
  67. u.setNewObjectId(id);
  68. RefUpdate.Result r = u.update();
  69. if (!r.equals(Result.NEW)) {
  70. retry++;
  71. u = repo.getRefDatabase().newUpdate(
  72. String.format("branch%d", i * 10 + j), false);
  73. u.setNewObjectId(id);
  74. r = u.update();
  75. assertEquals(r, Result.NEW);
  76. }
  77. }
  78. }
  79. // only the first one succeeds
  80. assertEquals(retry, 19);
  81. }
  82. }
  83. @Test
  84. public void additionalRefsAreRemoved() {
  85. assertFalse(new File(db.getDirectory(), Constants.HEAD).exists());
  86. }
  87. @Test
  88. public void testCompactFully() throws Exception {
  89. ObjectId c1 = db.resolve("master^^");
  90. ObjectId c2 = db.resolve("master^");
  91. for (int i = 0; i < 5; i++) {
  92. RefUpdate u = db.updateRef("refs/heads/master");
  93. u.setForceUpdate(true);
  94. u.setNewObjectId((i%2) == 0 ? c1 : c2);
  95. assertEquals(u.update(), FORCED);
  96. }
  97. File tableDir = new File(db.getDirectory(), Constants.REFTABLE);
  98. assertTrue(tableDir.listFiles().length > 1);
  99. ((FileReftableDatabase)db.getRefDatabase()).compactFully();
  100. assertEquals(tableDir.listFiles().length,1);
  101. }
  102. @Test
  103. public void testConvert() throws Exception {
  104. Ref h = db.exactRef("HEAD");
  105. assertTrue(h.isSymbolic());
  106. assertEquals("refs/heads/master", h.getTarget().getName());
  107. Ref b = db.exactRef("refs/heads/b");
  108. assertFalse(b.isSymbolic());
  109. assertTrue(b.isPeeled());
  110. assertEquals(bCommit, b.getObjectId().name());
  111. assertTrue(db.getRefDatabase().hasFastTipsWithSha1());
  112. }
  113. @Test
  114. public void testConvertToRefdir() throws Exception {
  115. db.convertToPackedRefs(false);
  116. assertTrue(db.getRefDatabase() instanceof RefDirectory);
  117. Ref h = db.exactRef("HEAD");
  118. assertTrue(h.isSymbolic());
  119. assertEquals("refs/heads/master", h.getTarget().getName());
  120. Ref b = db.exactRef("refs/heads/b");
  121. assertFalse(b.isSymbolic());
  122. assertTrue(b.isPeeled());
  123. assertEquals(bCommit, b.getObjectId().name());
  124. assertFalse(db.getRefDatabase().hasFastTipsWithSha1());
  125. }
  126. @Test
  127. public void testBatchrefUpdate() throws Exception {
  128. ObjectId cur = db.resolve("master");
  129. ObjectId prev = db.resolve("master^");
  130. PersonIdent person = new PersonIdent("name", "mail@example.com");
  131. ReceiveCommand rc1 = new ReceiveCommand(ObjectId.zeroId(), cur, "refs/heads/batch1");
  132. ReceiveCommand rc2 = new ReceiveCommand(ObjectId.zeroId(), prev, "refs/heads/batch2");
  133. String msg = "message";
  134. try (RevWalk rw = new RevWalk(db)) {
  135. db.getRefDatabase().newBatchUpdate()
  136. .addCommand(rc1, rc2)
  137. .setAtomic(true)
  138. .setRefLogIdent(person)
  139. .setRefLogMessage(msg, false)
  140. .execute(rw, NullProgressMonitor.INSTANCE);
  141. }
  142. assertEquals(rc1.getResult(), ReceiveCommand.Result.OK);
  143. assertEquals(rc2.getResult(), ReceiveCommand.Result.OK);
  144. ReflogEntry e = db.getReflogReader("refs/heads/batch1").getLastEntry();
  145. assertEquals(msg, e.getComment());
  146. assertEquals(person, e.getWho());
  147. assertEquals(cur, e.getNewId());
  148. e = db.getReflogReader("refs/heads/batch2").getLastEntry();
  149. assertEquals(msg, e.getComment());
  150. assertEquals(person, e.getWho());
  151. assertEquals(prev, e.getNewId());
  152. assertEquals(cur, db.exactRef("refs/heads/batch1").getObjectId());
  153. assertEquals(prev, db.exactRef("refs/heads/batch2").getObjectId());
  154. }
  155. @Test
  156. public void testFastforwardStatus() throws Exception {
  157. ObjectId cur = db.resolve("master");
  158. ObjectId prev = db.resolve("master^");
  159. RefUpdate u = db.updateRef("refs/heads/master");
  160. u.setNewObjectId(prev);
  161. u.setForceUpdate(true);
  162. assertEquals(FORCED, u.update());
  163. RefUpdate u2 = db.updateRef("refs/heads/master");
  164. u2.setNewObjectId(cur);
  165. assertEquals(FAST_FORWARD, u2.update());
  166. }
  167. @Test
  168. public void testUpdateChecksOldValue() throws Exception {
  169. ObjectId cur = db.resolve("master");
  170. ObjectId prev = db.resolve("master^");
  171. RefUpdate u1 = db.updateRef("refs/heads/master");
  172. RefUpdate u2 = db.updateRef("refs/heads/master");
  173. u1.setExpectedOldObjectId(cur);
  174. u1.setNewObjectId(prev);
  175. u1.setForceUpdate(true);
  176. u2.setExpectedOldObjectId(cur);
  177. u2.setNewObjectId(prev);
  178. u2.setForceUpdate(true);
  179. assertEquals(FORCED, u1.update());
  180. assertEquals(LOCK_FAILURE, u2.update());
  181. }
  182. @Test
  183. public void testWritesymref() throws Exception {
  184. writeSymref(Constants.HEAD, "refs/heads/a");
  185. assertNotNull(db.exactRef("refs/heads/b"));
  186. }
  187. @Test
  188. public void testFastforwardStatus2() throws Exception {
  189. writeSymref(Constants.HEAD, "refs/heads/a");
  190. ObjectId bId = db.exactRef("refs/heads/b").getObjectId();
  191. RefUpdate u = db.updateRef("refs/heads/a");
  192. u.setNewObjectId(bId);
  193. u.setRefLogMessage("Setup", false);
  194. assertEquals(FAST_FORWARD, u.update());
  195. }
  196. @Test
  197. public void testDelete() throws Exception {
  198. RefUpdate up = db.getRefDatabase().newUpdate("refs/heads/a", false);
  199. up.setForceUpdate(true);
  200. RefUpdate.Result res = up.delete();
  201. assertEquals(res, FORCED);
  202. assertNull(db.exactRef("refs/heads/a"));
  203. }
  204. @Test
  205. public void testDeleteWithoutHead() throws IOException {
  206. // Prepare repository without HEAD
  207. RefUpdate refUpdate = db.updateRef(Constants.HEAD, true);
  208. refUpdate.setForceUpdate(true);
  209. refUpdate.setNewObjectId(ObjectId.zeroId());
  210. RefUpdate.Result updateResult = refUpdate.update();
  211. assertEquals(FORCED, updateResult);
  212. Ref r = db.exactRef("HEAD");
  213. assertEquals(ObjectId.zeroId(), r.getObjectId());
  214. RefUpdate.Result deleteHeadResult = db.updateRef(Constants.HEAD)
  215. .delete();
  216. // why does doDelete say NEW ?
  217. assertEquals(RefUpdate.Result.NO_CHANGE, deleteHeadResult);
  218. // Any result is ok as long as it's not an NPE
  219. db.updateRef(Constants.R_HEADS + "master").delete();
  220. }
  221. @Test
  222. public void testUpdateRefDetached() throws Exception {
  223. ObjectId pid = db.resolve("refs/heads/master");
  224. ObjectId ppid = db.resolve("refs/heads/master^");
  225. RefUpdate updateRef = db.updateRef("HEAD", true);
  226. updateRef.setForceUpdate(true);
  227. updateRef.setNewObjectId(ppid);
  228. RefUpdate.Result update = updateRef.update();
  229. assertEquals(FORCED, update);
  230. assertEquals(ppid, db.resolve("HEAD"));
  231. Ref ref = db.exactRef("HEAD");
  232. assertEquals("HEAD", ref.getName());
  233. assertTrue("is detached", !ref.isSymbolic());
  234. // the branch HEAD referred to is left untouched
  235. assertEquals(pid, db.resolve("refs/heads/master"));
  236. ReflogReader reflogReader = db.getReflogReader("HEAD");
  237. ReflogEntry e = reflogReader.getReverseEntries().get(0);
  238. assertEquals(ppid, e.getNewId());
  239. assertEquals("GIT_COMMITTER_EMAIL", e.getWho().getEmailAddress());
  240. assertEquals("GIT_COMMITTER_NAME", e.getWho().getName());
  241. assertEquals(1250379778000L, e.getWho().getWhen().getTime());
  242. assertEquals(pid, e.getOldId());
  243. }
  244. @Test
  245. public void testWriteReflog() throws Exception {
  246. ObjectId pid = db.resolve("refs/heads/master^");
  247. RefUpdate updateRef = db.updateRef("refs/heads/master");
  248. updateRef.setNewObjectId(pid);
  249. String msg = "REFLOG!";
  250. updateRef.setRefLogMessage(msg, true);
  251. PersonIdent person = new PersonIdent("name", "mail@example.com");
  252. updateRef.setRefLogIdent(person);
  253. updateRef.setForceUpdate(true);
  254. RefUpdate.Result update = updateRef.update();
  255. assertEquals(FORCED, update); // internal
  256. ReflogReader r = db.getReflogReader("refs/heads/master");
  257. ReflogEntry e = r.getLastEntry();
  258. assertEquals(e.getNewId(), pid);
  259. assertEquals(e.getComment(), "REFLOG!: FORCED");
  260. assertEquals(e.getWho(), person);
  261. }
  262. @Test
  263. public void testLooseDelete() throws IOException {
  264. final String newRef = "refs/heads/abc";
  265. assertNull(db.exactRef(newRef));
  266. RefUpdate ref = db.updateRef(newRef);
  267. ObjectId nonZero = db.resolve(Constants.HEAD);
  268. assertNotEquals(nonZero, ObjectId.zeroId());
  269. ref.setNewObjectId(nonZero);
  270. assertEquals(RefUpdate.Result.NEW, ref.update());
  271. ref = db.updateRef(newRef);
  272. ref.setNewObjectId(db.resolve(Constants.HEAD));
  273. assertEquals(ref.delete(), RefUpdate.Result.NO_CHANGE);
  274. // Differs from RefupdateTest. Deleting a loose ref leaves reflog trail.
  275. ReflogReader reader = db.getReflogReader("refs/heads/abc");
  276. assertEquals(ObjectId.zeroId(), reader.getReverseEntry(1).getOldId());
  277. assertEquals(nonZero, reader.getReverseEntry(1).getNewId());
  278. assertEquals(nonZero, reader.getReverseEntry(0).getOldId());
  279. assertEquals(ObjectId.zeroId(), reader.getReverseEntry(0).getNewId());
  280. }
  281. private static class SubclassedId extends ObjectId {
  282. SubclassedId(AnyObjectId src) {
  283. super(src);
  284. }
  285. }
  286. @Test
  287. public void testNoCacheObjectIdSubclass() throws IOException {
  288. final String newRef = "refs/heads/abc";
  289. final RefUpdate ru = updateRef(newRef);
  290. final SubclassedId newid = new SubclassedId(ru.getNewObjectId());
  291. ru.setNewObjectId(newid);
  292. RefUpdate.Result update = ru.update();
  293. assertEquals(RefUpdate.Result.NEW, update);
  294. Ref r = db.exactRef(newRef);
  295. assertEquals(newRef, r.getName());
  296. assertNotNull(r.getObjectId());
  297. assertNotSame(newid, r.getObjectId());
  298. assertSame(ObjectId.class, r.getObjectId().getClass());
  299. assertEquals(newid, r.getObjectId());
  300. List<ReflogEntry> reverseEntries1 = db.getReflogReader("refs/heads/abc")
  301. .getReverseEntries();
  302. ReflogEntry entry1 = reverseEntries1.get(0);
  303. assertEquals(1, reverseEntries1.size());
  304. assertEquals(ObjectId.zeroId(), entry1.getOldId());
  305. assertEquals(r.getObjectId(), entry1.getNewId());
  306. assertEquals(new PersonIdent(db).toString(),
  307. entry1.getWho().toString());
  308. assertEquals("", entry1.getComment());
  309. List<ReflogEntry> reverseEntries2 = db.getReflogReader("HEAD")
  310. .getReverseEntries();
  311. assertEquals(0, reverseEntries2.size());
  312. }
  313. @Test
  314. public void testDeleteSymref() throws IOException {
  315. RefUpdate dst = updateRef("refs/heads/abc");
  316. assertEquals(RefUpdate.Result.NEW, dst.update());
  317. ObjectId id = dst.getNewObjectId();
  318. RefUpdate u = db.updateRef("refs/symref");
  319. assertEquals(RefUpdate.Result.NEW, u.link(dst.getName()));
  320. Ref ref = db.exactRef(u.getName());
  321. assertNotNull(ref);
  322. assertTrue(ref.isSymbolic());
  323. assertEquals(dst.getName(), ref.getLeaf().getName());
  324. assertEquals(id, ref.getLeaf().getObjectId());
  325. u = db.updateRef(u.getName());
  326. u.setDetachingSymbolicRef();
  327. u.setForceUpdate(true);
  328. assertEquals(FORCED, u.delete());
  329. assertNull(db.exactRef(u.getName()));
  330. ref = db.exactRef(dst.getName());
  331. assertNotNull(ref);
  332. assertFalse(ref.isSymbolic());
  333. assertEquals(id, ref.getObjectId());
  334. }
  335. @Test
  336. public void writeUnbornHead() throws Exception {
  337. RefUpdate.Result r = db.updateRef("HEAD").link("refs/heads/unborn");
  338. assertEquals(FORCED, r);
  339. Ref head = db.exactRef("HEAD");
  340. assertTrue(head.isSymbolic());
  341. assertEquals(head.getTarget().getName(), "refs/heads/unborn");
  342. }
  343. /**
  344. * Update the HEAD ref when the referenced branch is unborn
  345. *
  346. * @throws Exception
  347. */
  348. @Test
  349. public void testUpdateRefDetachedUnbornHead() throws Exception {
  350. ObjectId ppid = db.resolve("refs/heads/master^");
  351. writeSymref("HEAD", "refs/heads/unborn");
  352. RefUpdate updateRef = db.updateRef("HEAD", true);
  353. updateRef.setForceUpdate(true);
  354. updateRef.setNewObjectId(ppid);
  355. RefUpdate.Result update = updateRef.update();
  356. assertEquals(RefUpdate.Result.NEW, update);
  357. assertEquals(ppid, db.resolve("HEAD"));
  358. Ref ref = db.exactRef("HEAD");
  359. assertEquals("HEAD", ref.getName());
  360. assertTrue("is detached", !ref.isSymbolic());
  361. // the branch HEAD referred to is left untouched
  362. assertNull(db.resolve("refs/heads/unborn"));
  363. ReflogReader reflogReader = db.getReflogReader("HEAD");
  364. ReflogEntry e = reflogReader.getReverseEntries().get(0);
  365. assertEquals(ObjectId.zeroId(), e.getOldId());
  366. assertEquals(ppid, e.getNewId());
  367. assertEquals("GIT_COMMITTER_EMAIL", e.getWho().getEmailAddress());
  368. assertEquals("GIT_COMMITTER_NAME", e.getWho().getName());
  369. assertEquals(1250379778000L, e.getWho().getWhen().getTime());
  370. }
  371. @Test
  372. public void testDeleteNotFound() throws IOException {
  373. RefUpdate ref = updateRef("refs/heads/doesnotexist");
  374. assertNull(db.exactRef(ref.getName()));
  375. assertEquals(RefUpdate.Result.NEW, ref.delete());
  376. assertNull(db.exactRef(ref.getName()));
  377. }
  378. @Test
  379. public void testRenameSymref() throws IOException {
  380. db.resolve("HEAD");
  381. RefRename r = db.renameRef("HEAD", "KOPF");
  382. assertEquals(IO_FAILURE, r.rename());
  383. }
  384. @Test
  385. public void testRenameCurrentBranch() throws IOException {
  386. ObjectId rb = db.resolve("refs/heads/b");
  387. writeSymref(Constants.HEAD, "refs/heads/b");
  388. ObjectId oldHead = db.resolve(Constants.HEAD);
  389. assertEquals("internal test condition, b == HEAD", oldHead, rb);
  390. RefRename renameRef = db.renameRef("refs/heads/b",
  391. "refs/heads/new/name");
  392. RefUpdate.Result result = renameRef.rename();
  393. assertEquals(RefUpdate.Result.RENAMED, result);
  394. assertEquals(rb, db.resolve("refs/heads/new/name"));
  395. assertNull(db.resolve("refs/heads/b"));
  396. assertEquals(rb, db.resolve(Constants.HEAD));
  397. List<String> names = new ArrayList<>();
  398. names.add("HEAD");
  399. names.add("refs/heads/b");
  400. names.add("refs/heads/new/name");
  401. for (String nm : names) {
  402. ReflogReader rd = db.getReflogReader(nm);
  403. assertNotNull(rd);
  404. ReflogEntry last = rd.getLastEntry();
  405. ObjectId id = last.getNewId();
  406. assertTrue(ObjectId.zeroId().equals(id) || rb.equals(id));
  407. id = last.getNewId();
  408. assertTrue(ObjectId.zeroId().equals(id) || rb.equals(id));
  409. String want = "Branch: renamed b to new/name";
  410. assertEquals(want, last.getComment());
  411. }
  412. }
  413. @Test
  414. public void isGitRepository() {
  415. assertTrue(RepositoryCache.FileKey.isGitRepository(db.getDirectory(), db.getFS()));
  416. }
  417. @Test
  418. public void testRenameDestExists() throws IOException {
  419. ObjectId rb = db.resolve("refs/heads/b");
  420. writeSymref(Constants.HEAD, "refs/heads/b");
  421. ObjectId oldHead = db.resolve(Constants.HEAD);
  422. assertEquals("internal test condition, b == HEAD", oldHead, rb);
  423. RefRename renameRef = db.renameRef("refs/heads/b", "refs/heads/a");
  424. RefUpdate.Result result = renameRef.rename();
  425. assertEquals(RefUpdate.Result.LOCK_FAILURE, result);
  426. }
  427. @Test
  428. public void testRenameAtomic() throws IOException {
  429. ObjectId prevId = db.resolve("refs/heads/master^");
  430. RefRename rename = db.renameRef("refs/heads/master",
  431. "refs/heads/newmaster");
  432. RefUpdate updateRef = db.updateRef("refs/heads/master");
  433. updateRef.setNewObjectId(prevId);
  434. updateRef.setForceUpdate(true);
  435. assertEquals(FORCED, updateRef.update());
  436. assertEquals(RefUpdate.Result.LOCK_FAILURE, rename.rename());
  437. }
  438. @Test
  439. public void compactFully() throws Exception {
  440. FileReftableDatabase refDb = (FileReftableDatabase) db.getRefDatabase();
  441. PersonIdent person = new PersonIdent("jane", "jane@invalid");
  442. ObjectId aId = db.exactRef("refs/heads/a").getObjectId();
  443. ObjectId bId = db.exactRef("refs/heads/b").getObjectId();
  444. SecureRandom random = new SecureRandom();
  445. List<String> strs = new ArrayList<>();
  446. for (int i = 0; i < 1024; i++) {
  447. strs.add(String.format("%02x",
  448. Integer.valueOf(random.nextInt(256))));
  449. }
  450. String randomStr = String.join("", strs);
  451. String refName = "branch";
  452. for (long i = 0; i < 2; i++) {
  453. RefUpdate ru = refDb.newUpdate(refName, false);
  454. ru.setNewObjectId(i % 2 == 0 ? aId : bId);
  455. ru.setForceUpdate(true);
  456. // Only write a large string in the first table, so it becomes much larger
  457. // than the second, and the result is not autocompacted.
  458. ru.setRefLogMessage(i == 0 ? randomStr : "short", false);
  459. ru.setRefLogIdent(person);
  460. RefUpdate.Result res = ru.update();
  461. assertTrue(res == Result.NEW || res == FORCED);
  462. }
  463. assertEquals(refDb.exactRef(refName).getObjectId(), bId);
  464. assertTrue(randomStr.equals(refDb.getReflogReader(refName).getReverseEntry(1).getComment()));
  465. refDb.compactFully();
  466. assertEquals(refDb.exactRef(refName).getObjectId(), bId);
  467. assertTrue(randomStr.equals(refDb.getReflogReader(refName).getReverseEntry(1).getComment()));
  468. }
  469. @Test
  470. public void reftableRefsStorageClass() throws IOException {
  471. Ref b = db.exactRef("refs/heads/b");
  472. assertEquals(Ref.Storage.PACKED, b.getStorage());
  473. }
  474. private RefUpdate updateRef(String name) throws IOException {
  475. final RefUpdate ref = db.updateRef(name);
  476. ref.setNewObjectId(db.resolve(Constants.HEAD));
  477. return ref;
  478. }
  479. private void writeSymref(String src, String dst) throws IOException {
  480. RefUpdate u = db.updateRef(src);
  481. switch (u.link(dst)) {
  482. case NEW:
  483. case FORCED:
  484. case NO_CHANGE:
  485. break;
  486. default:
  487. fail("link " + src + " to " + dst);
  488. }
  489. }
  490. }