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.

NameConflictTreeWalkTest.java 7.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. /*
  2. * Copyright (C) 2008, 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.treewalk;
  11. import static org.junit.Assert.assertEquals;
  12. import static org.junit.Assert.assertFalse;
  13. import static org.junit.Assert.assertTrue;
  14. import org.eclipse.jgit.dircache.DirCache;
  15. import org.eclipse.jgit.dircache.DirCacheBuilder;
  16. import org.eclipse.jgit.dircache.DirCacheIterator;
  17. import org.eclipse.jgit.junit.RepositoryTestCase;
  18. import org.eclipse.jgit.lib.FileMode;
  19. import org.junit.Test;
  20. public class NameConflictTreeWalkTest extends RepositoryTestCase {
  21. private static final FileMode TREE = FileMode.TREE;
  22. private static final FileMode SYMLINK = FileMode.SYMLINK;
  23. private static final FileMode MISSING = FileMode.MISSING;
  24. private static final FileMode REGULAR_FILE = FileMode.REGULAR_FILE;
  25. private static final FileMode EXECUTABLE_FILE = FileMode.EXECUTABLE_FILE;
  26. @Test
  27. public void testNoDF_NoGap() throws Exception {
  28. final DirCache tree0 = db.readDirCache();
  29. final DirCache tree1 = db.readDirCache();
  30. {
  31. final DirCacheBuilder b0 = tree0.builder();
  32. final DirCacheBuilder b1 = tree1.builder();
  33. b0.add(createEntry("a", REGULAR_FILE));
  34. b0.add(createEntry("a.b", EXECUTABLE_FILE));
  35. b1.add(createEntry("a/b", REGULAR_FILE));
  36. b0.add(createEntry("a0b", SYMLINK));
  37. b0.finish();
  38. b1.finish();
  39. assertEquals(3, tree0.getEntryCount());
  40. assertEquals(1, tree1.getEntryCount());
  41. }
  42. try (TreeWalk tw = new TreeWalk(db)) {
  43. tw.addTree(new DirCacheIterator(tree0));
  44. tw.addTree(new DirCacheIterator(tree1));
  45. assertModes("a", REGULAR_FILE, MISSING, tw);
  46. assertModes("a.b", EXECUTABLE_FILE, MISSING, tw);
  47. assertModes("a", MISSING, TREE, tw);
  48. tw.enterSubtree();
  49. assertModes("a/b", MISSING, REGULAR_FILE, tw);
  50. assertModes("a0b", SYMLINK, MISSING, tw);
  51. }
  52. }
  53. @Test
  54. public void testDF_NoGap() throws Exception {
  55. final DirCache tree0 = db.readDirCache();
  56. final DirCache tree1 = db.readDirCache();
  57. {
  58. final DirCacheBuilder b0 = tree0.builder();
  59. final DirCacheBuilder b1 = tree1.builder();
  60. b0.add(createEntry("a", REGULAR_FILE));
  61. b0.add(createEntry("a.b", EXECUTABLE_FILE));
  62. b1.add(createEntry("a/b", REGULAR_FILE));
  63. b0.add(createEntry("a0b", SYMLINK));
  64. b0.finish();
  65. b1.finish();
  66. assertEquals(3, tree0.getEntryCount());
  67. assertEquals(1, tree1.getEntryCount());
  68. }
  69. try (NameConflictTreeWalk tw = new NameConflictTreeWalk(db)) {
  70. tw.addTree(new DirCacheIterator(tree0));
  71. tw.addTree(new DirCacheIterator(tree1));
  72. assertModes("a", REGULAR_FILE, TREE, tw);
  73. assertTrue(tw.isDirectoryFileConflict());
  74. assertTrue(tw.isSubtree());
  75. tw.enterSubtree();
  76. assertModes("a/b", MISSING, REGULAR_FILE, tw);
  77. assertTrue(tw.isDirectoryFileConflict());
  78. assertModes("a.b", EXECUTABLE_FILE, MISSING, tw);
  79. assertFalse(tw.isDirectoryFileConflict());
  80. assertModes("a0b", SYMLINK, MISSING, tw);
  81. assertFalse(tw.isDirectoryFileConflict());
  82. }
  83. }
  84. @Test
  85. public void testDF_GapByOne() throws Exception {
  86. final DirCache tree0 = db.readDirCache();
  87. final DirCache tree1 = db.readDirCache();
  88. {
  89. final DirCacheBuilder b0 = tree0.builder();
  90. final DirCacheBuilder b1 = tree1.builder();
  91. b0.add(createEntry("a", REGULAR_FILE));
  92. b0.add(createEntry("a.b", EXECUTABLE_FILE));
  93. b1.add(createEntry("a.b", EXECUTABLE_FILE));
  94. b1.add(createEntry("a/b", REGULAR_FILE));
  95. b0.add(createEntry("a0b", SYMLINK));
  96. b0.finish();
  97. b1.finish();
  98. assertEquals(3, tree0.getEntryCount());
  99. assertEquals(2, tree1.getEntryCount());
  100. }
  101. try (NameConflictTreeWalk tw = new NameConflictTreeWalk(db)) {
  102. tw.addTree(new DirCacheIterator(tree0));
  103. tw.addTree(new DirCacheIterator(tree1));
  104. assertModes("a", REGULAR_FILE, TREE, tw);
  105. assertTrue(tw.isSubtree());
  106. assertTrue(tw.isDirectoryFileConflict());
  107. tw.enterSubtree();
  108. assertModes("a/b", MISSING, REGULAR_FILE, tw);
  109. assertTrue(tw.isDirectoryFileConflict());
  110. assertModes("a.b", EXECUTABLE_FILE, EXECUTABLE_FILE, tw);
  111. assertFalse(tw.isDirectoryFileConflict());
  112. assertModes("a0b", SYMLINK, MISSING, tw);
  113. assertFalse(tw.isDirectoryFileConflict());
  114. }
  115. }
  116. @Test
  117. public void testDF_SkipsSeenSubtree() throws Exception {
  118. final DirCache tree0 = db.readDirCache();
  119. final DirCache tree1 = db.readDirCache();
  120. {
  121. final DirCacheBuilder b0 = tree0.builder();
  122. final DirCacheBuilder b1 = tree1.builder();
  123. b0.add(createEntry("a", REGULAR_FILE));
  124. b1.add(createEntry("a.b", EXECUTABLE_FILE));
  125. b1.add(createEntry("a/b", REGULAR_FILE));
  126. b0.add(createEntry("a0b", SYMLINK));
  127. b1.add(createEntry("a0b", SYMLINK));
  128. b0.finish();
  129. b1.finish();
  130. assertEquals(2, tree0.getEntryCount());
  131. assertEquals(3, tree1.getEntryCount());
  132. }
  133. try (NameConflictTreeWalk tw = new NameConflictTreeWalk(db)) {
  134. tw.addTree(new DirCacheIterator(tree0));
  135. tw.addTree(new DirCacheIterator(tree1));
  136. assertModes("a", REGULAR_FILE, TREE, tw);
  137. assertTrue(tw.isSubtree());
  138. assertTrue(tw.isDirectoryFileConflict());
  139. tw.enterSubtree();
  140. assertModes("a/b", MISSING, REGULAR_FILE, tw);
  141. assertTrue(tw.isDirectoryFileConflict());
  142. assertModes("a.b", MISSING, EXECUTABLE_FILE, tw);
  143. assertFalse(tw.isDirectoryFileConflict());
  144. assertModes("a0b", SYMLINK, SYMLINK, tw);
  145. assertFalse(tw.isDirectoryFileConflict());
  146. }
  147. }
  148. @Test
  149. public void testDF_DetectConflict() throws Exception {
  150. final DirCache tree0 = db.readDirCache();
  151. final DirCache tree1 = db.readDirCache();
  152. {
  153. final DirCacheBuilder b0 = tree0.builder();
  154. final DirCacheBuilder b1 = tree1.builder();
  155. b0.add(createEntry("0", REGULAR_FILE));
  156. b0.add(createEntry("a", REGULAR_FILE));
  157. b1.add(createEntry("0", REGULAR_FILE));
  158. b1.add(createEntry("a.b", REGULAR_FILE));
  159. b1.add(createEntry("a/b", REGULAR_FILE));
  160. b1.add(createEntry("a/c/e", REGULAR_FILE));
  161. b0.finish();
  162. b1.finish();
  163. assertEquals(2, tree0.getEntryCount());
  164. assertEquals(4, tree1.getEntryCount());
  165. }
  166. try (NameConflictTreeWalk tw = new NameConflictTreeWalk(db)) {
  167. tw.addTree(new DirCacheIterator(tree0));
  168. tw.addTree(new DirCacheIterator(tree1));
  169. assertModes("0", REGULAR_FILE, REGULAR_FILE, tw);
  170. assertFalse(tw.isDirectoryFileConflict());
  171. assertModes("a", REGULAR_FILE, TREE, tw);
  172. assertTrue(tw.isSubtree());
  173. assertTrue(tw.isDirectoryFileConflict());
  174. tw.enterSubtree();
  175. assertModes("a/b", MISSING, REGULAR_FILE, tw);
  176. assertTrue(tw.isDirectoryFileConflict());
  177. assertModes("a/c", MISSING, TREE, tw);
  178. assertTrue(tw.isDirectoryFileConflict());
  179. tw.enterSubtree();
  180. assertModes("a/c/e", MISSING, REGULAR_FILE, tw);
  181. assertTrue(tw.isDirectoryFileConflict());
  182. assertModes("a.b", MISSING, REGULAR_FILE, tw);
  183. assertFalse(tw.isDirectoryFileConflict());
  184. }
  185. }
  186. private static void assertModes(final String path, final FileMode mode0,
  187. final FileMode mode1, final TreeWalk tw) throws Exception {
  188. assertTrue("has " + path, tw.next());
  189. assertEquals(path, tw.getPathString());
  190. assertEquals(mode0, tw.getFileMode(0));
  191. assertEquals(mode1, tw.getFileMode(1));
  192. }
  193. }