Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

DirCacheCGitCompatabilityTest.java 9.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  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.dircache;
  11. import static java.nio.charset.StandardCharsets.UTF_8;
  12. import static org.eclipse.jgit.junit.Assert.assertEquals;
  13. import static org.junit.Assert.assertArrayEquals;
  14. import static org.junit.Assert.assertEquals;
  15. import static org.junit.Assert.assertNotNull;
  16. import static org.junit.Assert.assertTrue;
  17. import static org.junit.Assert.fail;
  18. import java.io.BufferedReader;
  19. import java.io.ByteArrayOutputStream;
  20. import java.io.File;
  21. import java.io.FileInputStream;
  22. import java.io.InputStreamReader;
  23. import java.util.ArrayList;
  24. import java.util.Iterator;
  25. import java.util.LinkedHashMap;
  26. import java.util.Map;
  27. import org.eclipse.jgit.dircache.DirCache.DirCacheVersion;
  28. import org.eclipse.jgit.errors.CorruptObjectException;
  29. import org.eclipse.jgit.junit.JGitTestUtil;
  30. import org.eclipse.jgit.junit.LocalDiskRepositoryTestCase;
  31. import org.eclipse.jgit.lib.FileMode;
  32. import org.eclipse.jgit.lib.ObjectId;
  33. import org.eclipse.jgit.lib.Repository;
  34. import org.eclipse.jgit.treewalk.TreeWalk;
  35. import org.eclipse.jgit.util.FS;
  36. import org.eclipse.jgit.util.IO;
  37. import org.junit.Test;
  38. public class DirCacheCGitCompatabilityTest extends LocalDiskRepositoryTestCase {
  39. private final File index = pathOf("gitgit.index");
  40. @Test
  41. public void testReadIndex_LsFiles() throws Exception {
  42. final Map<String, CGitIndexRecord> ls = readLsFiles();
  43. final DirCache dc = new DirCache(index, FS.DETECTED);
  44. assertEquals(0, dc.getEntryCount());
  45. dc.read();
  46. assertEquals(ls.size(), dc.getEntryCount());
  47. {
  48. final Iterator<CGitIndexRecord> rItr = ls.values().iterator();
  49. for (int i = 0; rItr.hasNext(); i++)
  50. assertEqual(rItr.next(), dc.getEntry(i));
  51. }
  52. }
  53. @Test
  54. public void testTreeWalk_LsFiles() throws Exception {
  55. final Repository db = createBareRepository();
  56. final Map<String, CGitIndexRecord> ls = readLsFiles();
  57. final DirCache dc = new DirCache(index, db.getFS());
  58. assertEquals(0, dc.getEntryCount());
  59. dc.read();
  60. assertEquals(ls.size(), dc.getEntryCount());
  61. {
  62. final Iterator<CGitIndexRecord> rItr = ls.values().iterator();
  63. try (TreeWalk tw = new TreeWalk(db)) {
  64. tw.setRecursive(true);
  65. tw.addTree(new DirCacheIterator(dc));
  66. while (rItr.hasNext()) {
  67. final DirCacheIterator dcItr;
  68. assertTrue(tw.next());
  69. dcItr = tw.getTree(0, DirCacheIterator.class);
  70. assertNotNull(dcItr);
  71. assertEqual(rItr.next(), dcItr.getDirCacheEntry());
  72. }
  73. }
  74. }
  75. }
  76. @Test
  77. public void testUnsupportedOptionalExtension() throws Exception {
  78. final DirCache dc = new DirCache(pathOf("gitgit.index.ZZZZ"),
  79. FS.DETECTED);
  80. dc.read();
  81. assertEquals(1, dc.getEntryCount());
  82. assertEquals("A", dc.getEntry(0).getPathString());
  83. }
  84. @Test
  85. public void testUnsupportedRequiredExtension() throws Exception {
  86. final DirCache dc = new DirCache(pathOf("gitgit.index.aaaa"),
  87. FS.DETECTED);
  88. try {
  89. dc.read();
  90. fail("Cache loaded an unsupported extension");
  91. } catch (CorruptObjectException err) {
  92. assertEquals("DIRC extension 'aaaa'"
  93. + " not supported by this version.", err.getMessage());
  94. }
  95. }
  96. @Test
  97. public void testCorruptChecksumAtFooter() throws Exception {
  98. final DirCache dc = new DirCache(pathOf("gitgit.index.badchecksum"),
  99. FS.DETECTED);
  100. try {
  101. dc.read();
  102. fail("Cache loaded despite corrupt checksum");
  103. } catch (CorruptObjectException err) {
  104. assertEquals("DIRC checksum mismatch", err.getMessage());
  105. }
  106. }
  107. private static void assertEqual(final CGitIndexRecord c,
  108. final DirCacheEntry j) {
  109. assertNotNull(c);
  110. assertNotNull(j);
  111. assertEquals(c.path, j.getPathString());
  112. assertEquals(c.id, j.getObjectId());
  113. assertEquals(c.mode, j.getRawMode());
  114. assertEquals(c.stage, j.getStage());
  115. }
  116. @Test
  117. public void testReadIndex_DirCacheTree() throws Exception {
  118. final Map<String, CGitIndexRecord> cList = readLsFiles();
  119. final Map<String, CGitLsTreeRecord> cTree = readLsTree();
  120. final DirCache dc = new DirCache(index, FS.DETECTED);
  121. assertEquals(0, dc.getEntryCount());
  122. dc.read();
  123. assertEquals(cList.size(), dc.getEntryCount());
  124. final DirCacheTree jTree = dc.getCacheTree(false);
  125. assertNotNull(jTree);
  126. assertEquals("", jTree.getNameString());
  127. assertEquals("", jTree.getPathString());
  128. assertTrue(jTree.isValid());
  129. assertEquals(ObjectId
  130. .fromString("698dd0b8d0c299f080559a1cffc7fe029479a408"), jTree
  131. .getObjectId());
  132. assertEquals(cList.size(), jTree.getEntrySpan());
  133. final ArrayList<CGitLsTreeRecord> subtrees = new ArrayList<>();
  134. for (CGitLsTreeRecord r : cTree.values()) {
  135. if (FileMode.TREE.equals(r.mode))
  136. subtrees.add(r);
  137. }
  138. assertEquals(subtrees.size(), jTree.getChildCount());
  139. for (int i = 0; i < jTree.getChildCount(); i++) {
  140. final DirCacheTree sj = jTree.getChild(i);
  141. final CGitLsTreeRecord sc = subtrees.get(i);
  142. assertEquals(sc.path, sj.getNameString());
  143. assertEquals(sc.path + "/", sj.getPathString());
  144. assertTrue(sj.isValid());
  145. assertEquals(sc.id, sj.getObjectId());
  146. }
  147. }
  148. @Test
  149. public void testReadWriteV3() throws Exception {
  150. final File file = pathOf("gitgit.index.v3");
  151. final DirCache dc = new DirCache(file, FS.DETECTED);
  152. dc.read();
  153. assertEquals(10, dc.getEntryCount());
  154. assertV3TreeEntry(0, "dir1/file1.txt", false, false, dc);
  155. assertV3TreeEntry(1, "dir2/file2.txt", true, false, dc);
  156. assertV3TreeEntry(2, "dir3/file3.txt", false, false, dc);
  157. assertV3TreeEntry(3, "dir3/file3a.txt", true, false, dc);
  158. assertV3TreeEntry(4, "dir4/file4.txt", true, false, dc);
  159. assertV3TreeEntry(5, "dir4/file4a.txt", false, false, dc);
  160. assertV3TreeEntry(6, "file.txt", true, false, dc);
  161. assertV3TreeEntry(7, "newdir1/newfile1.txt", false, true, dc);
  162. assertV3TreeEntry(8, "newdir1/newfile2.txt", false, true, dc);
  163. assertV3TreeEntry(9, "newfile.txt", false, true, dc);
  164. final ByteArrayOutputStream bos = new ByteArrayOutputStream();
  165. dc.writeTo(null, bos);
  166. final byte[] indexBytes = bos.toByteArray();
  167. final byte[] expectedBytes = IO.readFully(file);
  168. assertArrayEquals(expectedBytes, indexBytes);
  169. }
  170. @Test
  171. public void testReadWriteV4() throws Exception {
  172. final File file = pathOf("gitgit.index.v4");
  173. final DirCache dc = new DirCache(file, FS.DETECTED);
  174. dc.read();
  175. assertEquals(DirCacheVersion.DIRC_VERSION_PATHCOMPRESS,
  176. dc.getVersion());
  177. assertEquals(5, dc.getEntryCount());
  178. assertV4TreeEntry(0, "src/org/eclipse/jgit/atest/foo.txt", false, dc);
  179. assertV4TreeEntry(1, "src/org/eclipse/jgit/atest/foobar.txt", false,
  180. dc);
  181. assertV4TreeEntry(2, "src/org/eclipse/jgit/other/bar.txt", true, dc);
  182. assertV4TreeEntry(3, "test.txt", false, dc);
  183. assertV4TreeEntry(4, "test.txt2", false, dc);
  184. final ByteArrayOutputStream bos = new ByteArrayOutputStream();
  185. dc.writeTo(null, bos);
  186. final byte[] indexBytes = bos.toByteArray();
  187. final byte[] expectedBytes = IO.readFully(file);
  188. assertArrayEquals(expectedBytes, indexBytes);
  189. }
  190. private static void assertV3TreeEntry(int indexPosition, String path,
  191. boolean skipWorkTree, boolean intentToAdd, DirCache dc) {
  192. final DirCacheEntry entry = dc.getEntry(indexPosition);
  193. assertEquals(path, entry.getPathString());
  194. assertEquals(skipWorkTree, entry.isSkipWorkTree());
  195. assertEquals(intentToAdd, entry.isIntentToAdd());
  196. }
  197. private static void assertV4TreeEntry(int indexPosition, String path,
  198. boolean skipWorkTree, DirCache dc) {
  199. final DirCacheEntry entry = dc.getEntry(indexPosition);
  200. assertEquals(path, entry.getPathString());
  201. assertEquals(skipWorkTree, entry.isSkipWorkTree());
  202. }
  203. private static File pathOf(String name) {
  204. return JGitTestUtil.getTestResourceFile(name);
  205. }
  206. private static Map<String, CGitIndexRecord> readLsFiles() throws Exception {
  207. final LinkedHashMap<String, CGitIndexRecord> r = new LinkedHashMap<>();
  208. try (BufferedReader br = new BufferedReader(new InputStreamReader(
  209. new FileInputStream(pathOf("gitgit.lsfiles")), UTF_8))) {
  210. String line;
  211. while ((line = br.readLine()) != null) {
  212. final CGitIndexRecord cr = new CGitIndexRecord(line);
  213. r.put(cr.path, cr);
  214. }
  215. }
  216. return r;
  217. }
  218. private static Map<String, CGitLsTreeRecord> readLsTree() throws Exception {
  219. final LinkedHashMap<String, CGitLsTreeRecord> r = new LinkedHashMap<>();
  220. try (BufferedReader br = new BufferedReader(new InputStreamReader(
  221. new FileInputStream(pathOf("gitgit.lstree")), UTF_8))) {
  222. String line;
  223. while ((line = br.readLine()) != null) {
  224. final CGitLsTreeRecord cr = new CGitLsTreeRecord(line);
  225. r.put(cr.path, cr);
  226. }
  227. }
  228. return r;
  229. }
  230. private static class CGitIndexRecord {
  231. final int mode;
  232. final ObjectId id;
  233. final int stage;
  234. final String path;
  235. CGitIndexRecord(String line) {
  236. final int tab = line.indexOf('\t');
  237. final int sp1 = line.indexOf(' ');
  238. final int sp2 = line.indexOf(' ', sp1 + 1);
  239. mode = Integer.parseInt(line.substring(0, sp1), 8);
  240. id = ObjectId.fromString(line.substring(sp1 + 1, sp2));
  241. stage = Integer.parseInt(line.substring(sp2 + 1, tab));
  242. path = line.substring(tab + 1);
  243. }
  244. }
  245. private static class CGitLsTreeRecord {
  246. final int mode;
  247. final ObjectId id;
  248. final String path;
  249. CGitLsTreeRecord(String line) {
  250. final int tab = line.indexOf('\t');
  251. final int sp1 = line.indexOf(' ');
  252. final int sp2 = line.indexOf(' ', sp1 + 1);
  253. mode = Integer.parseInt(line.substring(0, sp1), 8);
  254. id = ObjectId.fromString(line.substring(sp2 + 1, tab));
  255. path = line.substring(tab + 1);
  256. }
  257. }
  258. }