您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

DirCachePathEditTest.java 8.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. /*
  2. * Copyright (C) 2011, 2020 Robin Rosenberg 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 org.junit.Assert.assertEquals;
  12. import static org.junit.Assert.fail;
  13. import java.util.ArrayList;
  14. import java.util.List;
  15. import org.eclipse.jgit.dircache.DirCacheEditor.PathEdit;
  16. import org.eclipse.jgit.errors.DirCacheNameConflictException;
  17. import org.eclipse.jgit.lib.FileMode;
  18. import org.eclipse.jgit.lib.ObjectId;
  19. import org.junit.Test;
  20. public class DirCachePathEditTest {
  21. static final class AddEdit extends PathEdit {
  22. public AddEdit(String entryPath) {
  23. super(entryPath);
  24. }
  25. @Override
  26. public void apply(DirCacheEntry ent) {
  27. ent.setFileMode(FileMode.REGULAR_FILE);
  28. ent.setLength(1);
  29. ent.setObjectId(ObjectId.zeroId());
  30. }
  31. }
  32. private static final class RecordingEdit extends PathEdit {
  33. final List<DirCacheEntry> entries = new ArrayList<>();
  34. public RecordingEdit(String entryPath) {
  35. super(entryPath);
  36. }
  37. @Override
  38. public void apply(DirCacheEntry ent) {
  39. entries.add(ent);
  40. }
  41. }
  42. @Test
  43. public void testAddDeletePathAndTreeNormalNames() {
  44. DirCache dc = DirCache.newInCore();
  45. DirCacheEditor editor = dc.editor();
  46. editor.add(new AddEdit("a"));
  47. editor.add(new AddEdit("b/c"));
  48. editor.add(new AddEdit("c/d"));
  49. editor.finish();
  50. assertEquals(3, dc.getEntryCount());
  51. assertEquals("a", dc.getEntry(0).getPathString());
  52. assertEquals("b/c", dc.getEntry(1).getPathString());
  53. assertEquals("c/d", dc.getEntry(2).getPathString());
  54. editor = dc.editor();
  55. editor.add(new DirCacheEditor.DeletePath("b/c"));
  56. editor.finish();
  57. assertEquals(2, dc.getEntryCount());
  58. assertEquals("a", dc.getEntry(0).getPathString());
  59. assertEquals("c/d", dc.getEntry(1).getPathString());
  60. editor = dc.editor();
  61. editor.add(new DirCacheEditor.DeleteTree(""));
  62. editor.finish();
  63. assertEquals(0, dc.getEntryCount());
  64. }
  65. @Test
  66. public void testAddDeleteTrickyNames() {
  67. DirCache dc = DirCache.newInCore();
  68. DirCacheEditor editor = dc.editor();
  69. editor.add(new AddEdit("a/b"));
  70. editor.add(new AddEdit("a-"));
  71. editor.add(new AddEdit("ab"));
  72. editor.finish();
  73. assertEquals(3, dc.getEntryCount());
  74. // Validate sort order
  75. assertEquals("a-", dc.getEntry(0).getPathString());
  76. assertEquals("a/b", dc.getEntry(1).getPathString());
  77. assertEquals("ab", dc.getEntry(2).getPathString());
  78. editor = dc.editor();
  79. // Sort order should not confuse DeleteTree
  80. editor.add(new DirCacheEditor.DeleteTree("a"));
  81. editor.finish();
  82. assertEquals(2, dc.getEntryCount());
  83. assertEquals("a-", dc.getEntry(0).getPathString());
  84. assertEquals("ab", dc.getEntry(1).getPathString());
  85. }
  86. @Test
  87. public void testPathEditShouldBeCalledForEachStage() throws Exception {
  88. DirCache dc = DirCache.newInCore();
  89. DirCacheBuilder builder = new DirCacheBuilder(dc, 3);
  90. builder.add(createEntry("a", DirCacheEntry.STAGE_1));
  91. builder.add(createEntry("a", DirCacheEntry.STAGE_2));
  92. builder.add(createEntry("a", DirCacheEntry.STAGE_3));
  93. builder.finish();
  94. DirCacheEditor editor = dc.editor();
  95. RecordingEdit recorder = new RecordingEdit("a");
  96. editor.add(recorder);
  97. editor.finish();
  98. List<DirCacheEntry> entries = recorder.entries;
  99. assertEquals(3, entries.size());
  100. assertEquals(DirCacheEntry.STAGE_1, entries.get(0).getStage());
  101. assertEquals(DirCacheEntry.STAGE_2, entries.get(1).getStage());
  102. assertEquals(DirCacheEntry.STAGE_3, entries.get(2).getStage());
  103. }
  104. @Test
  105. public void testPathEditWithStagesAndReset() throws Exception {
  106. DirCache dc = DirCache.newInCore();
  107. DirCacheBuilder builder = new DirCacheBuilder(dc, 3);
  108. builder.add(createEntry("a", DirCacheEntry.STAGE_1));
  109. builder.add(createEntry("a", DirCacheEntry.STAGE_2));
  110. builder.add(createEntry("a", DirCacheEntry.STAGE_3));
  111. builder.finish();
  112. DirCacheEditor editor = dc.editor();
  113. PathEdit edit = new PathEdit("a") {
  114. @Override
  115. public void apply(DirCacheEntry ent) {
  116. ent.setStage(DirCacheEntry.STAGE_0);
  117. }
  118. };
  119. editor.add(edit);
  120. editor.finish();
  121. assertEquals(1, dc.getEntryCount());
  122. DirCacheEntry entry = dc.getEntry(0);
  123. assertEquals("a", entry.getPathString());
  124. assertEquals(DirCacheEntry.STAGE_0, entry.getStage());
  125. }
  126. @Test
  127. public void testFileReplacesTree() throws Exception {
  128. DirCache dc = DirCache.newInCore();
  129. DirCacheEditor editor = dc.editor();
  130. editor.add(new AddEdit("a"));
  131. editor.add(new AddEdit("b/c"));
  132. editor.add(new AddEdit("b/d"));
  133. editor.add(new AddEdit("e"));
  134. editor.finish();
  135. editor = dc.editor();
  136. editor.add(new AddEdit("b"));
  137. editor.finish();
  138. assertEquals(3, dc.getEntryCount());
  139. assertEquals("a", dc.getEntry(0).getPathString());
  140. assertEquals("b", dc.getEntry(1).getPathString());
  141. assertEquals("e", dc.getEntry(2).getPathString());
  142. dc.clear();
  143. editor = dc.editor();
  144. editor.add(new AddEdit("A.c"));
  145. editor.add(new AddEdit("A/c"));
  146. editor.add(new AddEdit("A0c"));
  147. editor.finish();
  148. editor = dc.editor();
  149. editor.add(new AddEdit("A"));
  150. editor.finish();
  151. assertEquals(3, dc.getEntryCount());
  152. assertEquals("A", dc.getEntry(0).getPathString());
  153. assertEquals("A.c", dc.getEntry(1).getPathString());
  154. assertEquals("A0c", dc.getEntry(2).getPathString());
  155. }
  156. @Test
  157. public void testTreeReplacesFile() throws Exception {
  158. DirCache dc = DirCache.newInCore();
  159. DirCacheEditor editor = dc.editor();
  160. editor.add(new AddEdit("a"));
  161. editor.add(new AddEdit("ab"));
  162. editor.add(new AddEdit("b"));
  163. editor.add(new AddEdit("e"));
  164. editor.finish();
  165. editor = dc.editor();
  166. editor.add(new AddEdit("b/c/d/f"));
  167. editor.add(new AddEdit("b/g/h/i"));
  168. editor.finish();
  169. assertEquals(5, dc.getEntryCount());
  170. assertEquals("a", dc.getEntry(0).getPathString());
  171. assertEquals("ab", dc.getEntry(1).getPathString());
  172. assertEquals("b/c/d/f", dc.getEntry(2).getPathString());
  173. assertEquals("b/g/h/i", dc.getEntry(3).getPathString());
  174. assertEquals("e", dc.getEntry(4).getPathString());
  175. }
  176. @Test
  177. public void testDuplicateFiles() throws Exception {
  178. DirCache dc = DirCache.newInCore();
  179. DirCacheEditor editor = dc.editor();
  180. editor.add(new AddEdit("a"));
  181. editor.add(new AddEdit("a"));
  182. try {
  183. editor.finish();
  184. fail("Expected DirCacheNameConflictException to be thrown");
  185. } catch (DirCacheNameConflictException e) {
  186. assertEquals("a a", e.getMessage());
  187. assertEquals("a", e.getPath1());
  188. assertEquals("a", e.getPath2());
  189. }
  190. }
  191. @Test
  192. public void testFileOverlapsTree() throws Exception {
  193. DirCache dc = DirCache.newInCore();
  194. DirCacheEditor editor = dc.editor();
  195. editor.add(new AddEdit("a"));
  196. editor.add(new AddEdit("a/b").setReplace(false));
  197. try {
  198. editor.finish();
  199. fail("Expected DirCacheNameConflictException to be thrown");
  200. } catch (DirCacheNameConflictException e) {
  201. assertEquals("a a/b", e.getMessage());
  202. assertEquals("a", e.getPath1());
  203. assertEquals("a/b", e.getPath2());
  204. }
  205. editor = dc.editor();
  206. editor.add(new AddEdit("A.c"));
  207. editor.add(new AddEdit("A/c").setReplace(false));
  208. editor.add(new AddEdit("A0c"));
  209. editor.add(new AddEdit("A"));
  210. try {
  211. editor.finish();
  212. fail("Expected DirCacheNameConflictException to be thrown");
  213. } catch (DirCacheNameConflictException e) {
  214. assertEquals("A A/c", e.getMessage());
  215. assertEquals("A", e.getPath1());
  216. assertEquals("A/c", e.getPath2());
  217. }
  218. editor = dc.editor();
  219. editor.add(new AddEdit("A.c"));
  220. editor.add(new AddEdit("A/b/c/d").setReplace(false));
  221. editor.add(new AddEdit("A/b/c"));
  222. editor.add(new AddEdit("A0c"));
  223. try {
  224. editor.finish();
  225. fail("Expected DirCacheNameConflictException to be thrown");
  226. } catch (DirCacheNameConflictException e) {
  227. assertEquals("A/b/c A/b/c/d", e.getMessage());
  228. assertEquals("A/b/c", e.getPath1());
  229. assertEquals("A/b/c/d", e.getPath2());
  230. }
  231. }
  232. private static DirCacheEntry createEntry(String path, int stage) {
  233. DirCacheEntry entry = new DirCacheEntry(path, stage);
  234. entry.setFileMode(FileMode.REGULAR_FILE);
  235. return entry;
  236. }
  237. }