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.

DirCachePathEditTest.java 7.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. /*
  2. * Copyright (C) 2011, 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 testFileReplacesTree() throws Exception {
  106. DirCache dc = DirCache.newInCore();
  107. DirCacheEditor editor = dc.editor();
  108. editor.add(new AddEdit("a"));
  109. editor.add(new AddEdit("b/c"));
  110. editor.add(new AddEdit("b/d"));
  111. editor.add(new AddEdit("e"));
  112. editor.finish();
  113. editor = dc.editor();
  114. editor.add(new AddEdit("b"));
  115. editor.finish();
  116. assertEquals(3, dc.getEntryCount());
  117. assertEquals("a", dc.getEntry(0).getPathString());
  118. assertEquals("b", dc.getEntry(1).getPathString());
  119. assertEquals("e", dc.getEntry(2).getPathString());
  120. dc.clear();
  121. editor = dc.editor();
  122. editor.add(new AddEdit("A.c"));
  123. editor.add(new AddEdit("A/c"));
  124. editor.add(new AddEdit("A0c"));
  125. editor.finish();
  126. editor = dc.editor();
  127. editor.add(new AddEdit("A"));
  128. editor.finish();
  129. assertEquals(3, dc.getEntryCount());
  130. assertEquals("A", dc.getEntry(0).getPathString());
  131. assertEquals("A.c", dc.getEntry(1).getPathString());
  132. assertEquals("A0c", dc.getEntry(2).getPathString());
  133. }
  134. @Test
  135. public void testTreeReplacesFile() throws Exception {
  136. DirCache dc = DirCache.newInCore();
  137. DirCacheEditor editor = dc.editor();
  138. editor.add(new AddEdit("a"));
  139. editor.add(new AddEdit("ab"));
  140. editor.add(new AddEdit("b"));
  141. editor.add(new AddEdit("e"));
  142. editor.finish();
  143. editor = dc.editor();
  144. editor.add(new AddEdit("b/c/d/f"));
  145. editor.add(new AddEdit("b/g/h/i"));
  146. editor.finish();
  147. assertEquals(5, dc.getEntryCount());
  148. assertEquals("a", dc.getEntry(0).getPathString());
  149. assertEquals("ab", dc.getEntry(1).getPathString());
  150. assertEquals("b/c/d/f", dc.getEntry(2).getPathString());
  151. assertEquals("b/g/h/i", dc.getEntry(3).getPathString());
  152. assertEquals("e", dc.getEntry(4).getPathString());
  153. }
  154. @Test
  155. public void testDuplicateFiles() throws Exception {
  156. DirCache dc = DirCache.newInCore();
  157. DirCacheEditor editor = dc.editor();
  158. editor.add(new AddEdit("a"));
  159. editor.add(new AddEdit("a"));
  160. try {
  161. editor.finish();
  162. fail("Expected DirCacheNameConflictException to be thrown");
  163. } catch (DirCacheNameConflictException e) {
  164. assertEquals("a a", e.getMessage());
  165. assertEquals("a", e.getPath1());
  166. assertEquals("a", e.getPath2());
  167. }
  168. }
  169. @Test
  170. public void testFileOverlapsTree() throws Exception {
  171. DirCache dc = DirCache.newInCore();
  172. DirCacheEditor editor = dc.editor();
  173. editor.add(new AddEdit("a"));
  174. editor.add(new AddEdit("a/b").setReplace(false));
  175. try {
  176. editor.finish();
  177. fail("Expected DirCacheNameConflictException to be thrown");
  178. } catch (DirCacheNameConflictException e) {
  179. assertEquals("a a/b", e.getMessage());
  180. assertEquals("a", e.getPath1());
  181. assertEquals("a/b", e.getPath2());
  182. }
  183. editor = dc.editor();
  184. editor.add(new AddEdit("A.c"));
  185. editor.add(new AddEdit("A/c").setReplace(false));
  186. editor.add(new AddEdit("A0c"));
  187. editor.add(new AddEdit("A"));
  188. try {
  189. editor.finish();
  190. fail("Expected DirCacheNameConflictException to be thrown");
  191. } catch (DirCacheNameConflictException e) {
  192. assertEquals("A A/c", e.getMessage());
  193. assertEquals("A", e.getPath1());
  194. assertEquals("A/c", e.getPath2());
  195. }
  196. editor = dc.editor();
  197. editor.add(new AddEdit("A.c"));
  198. editor.add(new AddEdit("A/b/c/d").setReplace(false));
  199. editor.add(new AddEdit("A/b/c"));
  200. editor.add(new AddEdit("A0c"));
  201. try {
  202. editor.finish();
  203. fail("Expected DirCacheNameConflictException to be thrown");
  204. } catch (DirCacheNameConflictException e) {
  205. assertEquals("A/b/c A/b/c/d", e.getMessage());
  206. assertEquals("A/b/c", e.getPath1());
  207. assertEquals("A/b/c/d", e.getPath2());
  208. }
  209. }
  210. private static DirCacheEntry createEntry(String path, int stage) {
  211. DirCacheEntry entry = new DirCacheEntry(path, stage);
  212. entry.setFileMode(FileMode.REGULAR_FILE);
  213. return entry;
  214. }
  215. }