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.

SubmoduleDeinitTest.java 7.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. /*
  2. * Copyright (C) 2017, Two Sigma Open Source 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.submodule;
  11. import java.io.File;
  12. import java.io.IOException;
  13. import java.util.Collection;
  14. import org.eclipse.jgit.api.Git;
  15. import org.eclipse.jgit.api.SubmoduleDeinitCommand;
  16. import org.eclipse.jgit.api.SubmoduleDeinitResult;
  17. import org.eclipse.jgit.api.SubmoduleUpdateCommand;
  18. import org.eclipse.jgit.api.errors.GitAPIException;
  19. import org.eclipse.jgit.dircache.DirCache;
  20. import org.eclipse.jgit.dircache.DirCacheEditor;
  21. import org.eclipse.jgit.dircache.DirCacheEditor.PathEdit;
  22. import org.eclipse.jgit.dircache.DirCacheEntry;
  23. import org.eclipse.jgit.junit.JGitTestUtil;
  24. import org.eclipse.jgit.junit.RepositoryTestCase;
  25. import org.eclipse.jgit.lib.ConfigConstants;
  26. import org.eclipse.jgit.lib.Constants;
  27. import org.eclipse.jgit.lib.FileMode;
  28. import org.eclipse.jgit.lib.Repository;
  29. import org.eclipse.jgit.lib.StoredConfig;
  30. import org.eclipse.jgit.revwalk.RevCommit;
  31. import org.eclipse.jgit.storage.file.FileBasedConfig;
  32. import org.junit.Test;
  33. import static org.junit.Assert.assertEquals;
  34. import static org.junit.Assert.assertNotEquals;
  35. import static org.junit.Assert.assertNotNull;
  36. import static org.junit.Assert.assertTrue;
  37. /**
  38. * Unit tests of {@link SubmoduleDeinitCommand}
  39. */
  40. public class SubmoduleDeinitTest extends RepositoryTestCase {
  41. @Test
  42. public void repositoryWithNoSubmodules() throws GitAPIException {
  43. SubmoduleDeinitCommand command = new SubmoduleDeinitCommand(db);
  44. Collection<SubmoduleDeinitResult> modules = command.call();
  45. assertNotNull(modules);
  46. assertTrue(modules.isEmpty());
  47. }
  48. @Test
  49. public void alreadyClosedSubmodule() throws Exception {
  50. final String path = "sub";
  51. Git git = Git.wrap(db);
  52. commitSubmoduleCreation(path, git);
  53. SubmoduleDeinitResult result = runDeinit(new SubmoduleDeinitCommand(db).addPath("sub"));
  54. assertEquals(path, result.getPath());
  55. assertEquals(SubmoduleDeinitCommand.SubmoduleDeinitStatus.ALREADY_DEINITIALIZED, result.getStatus());
  56. }
  57. @Test
  58. public void dirtySubmoduleBecauseUntracked() throws Exception {
  59. final String path = "sub";
  60. Git git = Git.wrap(db);
  61. commitSubmoduleCreation(path, git);
  62. Collection<String> updated = new SubmoduleUpdateCommand(db).addPath(path).setFetch(false).call();
  63. assertEquals(1, updated.size());
  64. File submoduleDir = assertSubmoduleIsInitialized();
  65. write(new File(submoduleDir, "untracked"), "untracked");
  66. SubmoduleDeinitResult result = runDeinit(new SubmoduleDeinitCommand(db).addPath("sub"));
  67. assertEquals(path, result.getPath());
  68. assertEquals(SubmoduleDeinitCommand.SubmoduleDeinitStatus.DIRTY, result.getStatus());
  69. try (SubmoduleWalk generator = SubmoduleWalk.forIndex(db)) {
  70. assertTrue(generator.next());
  71. }
  72. assertTrue(submoduleDir.isDirectory());
  73. assertNotEquals(0, submoduleDir.list().length);
  74. }
  75. @Test
  76. public void dirtySubmoduleBecauseNewCommit() throws Exception {
  77. final String path = "sub";
  78. Git git = Git.wrap(db);
  79. commitSubmoduleCreation(path, git);
  80. Collection<String> updated = new SubmoduleUpdateCommand(db).addPath(path).setFetch(false).call();
  81. assertEquals(1, updated.size());
  82. File submoduleDir = assertSubmoduleIsInitialized();
  83. try (SubmoduleWalk generator = SubmoduleWalk.forIndex(db)) {
  84. generator.next();
  85. // want to create a commit inside the repo...
  86. try (Repository submoduleLocalRepo = generator.getRepository()) {
  87. JGitTestUtil.writeTrashFile(submoduleLocalRepo, "file.txt",
  88. "new data");
  89. Git.wrap(submoduleLocalRepo).commit().setAll(true)
  90. .setMessage("local commit").call();
  91. }
  92. }
  93. SubmoduleDeinitResult result = runDeinit(new SubmoduleDeinitCommand(db).addPath("sub"));
  94. assertEquals(path, result.getPath());
  95. assertEquals(SubmoduleDeinitCommand.SubmoduleDeinitStatus.DIRTY, result.getStatus());
  96. try (SubmoduleWalk generator = SubmoduleWalk.forIndex(db)) {
  97. assertTrue(generator.next());
  98. }
  99. assertTrue(submoduleDir.isDirectory());
  100. assertNotEquals(0, submoduleDir.list().length);
  101. }
  102. private File assertSubmoduleIsInitialized() throws IOException {
  103. try (SubmoduleWalk generator = SubmoduleWalk.forIndex(db)) {
  104. assertTrue(generator.next());
  105. File submoduleDir = new File(db.getWorkTree(), generator.getPath());
  106. assertTrue(submoduleDir.isDirectory());
  107. assertNotEquals(0, submoduleDir.list().length);
  108. return submoduleDir;
  109. }
  110. }
  111. @Test
  112. public void dirtySubmoduleWithForce() throws Exception {
  113. final String path = "sub";
  114. Git git = Git.wrap(db);
  115. commitSubmoduleCreation(path, git);
  116. Collection<String> updated = new SubmoduleUpdateCommand(db).addPath(path).setFetch(false).call();
  117. assertEquals(1, updated.size());
  118. File submoduleDir = assertSubmoduleIsInitialized();
  119. write(new File(submoduleDir, "untracked"), "untracked");
  120. SubmoduleDeinitCommand command = new SubmoduleDeinitCommand(db).addPath("sub").setForce(true);
  121. SubmoduleDeinitResult result = runDeinit(command);
  122. assertEquals(path, result.getPath());
  123. assertEquals(SubmoduleDeinitCommand.SubmoduleDeinitStatus.FORCED, result.getStatus());
  124. try (SubmoduleWalk generator = SubmoduleWalk.forIndex(db)) {
  125. assertTrue(generator.next());
  126. }
  127. assertTrue(submoduleDir.isDirectory());
  128. assertEquals(0, submoduleDir.list().length);
  129. }
  130. @Test
  131. public void cleanSubmodule() throws Exception {
  132. final String path = "sub";
  133. Git git = Git.wrap(db);
  134. commitSubmoduleCreation(path, git);
  135. Collection<String> updated = new SubmoduleUpdateCommand(db).addPath(path).setFetch(false).call();
  136. assertEquals(1, updated.size());
  137. File submoduleDir = assertSubmoduleIsInitialized();
  138. SubmoduleDeinitResult result = runDeinit(new SubmoduleDeinitCommand(db).addPath("sub"));
  139. assertEquals(path, result.getPath());
  140. assertEquals(SubmoduleDeinitCommand.SubmoduleDeinitStatus.SUCCESS, result.getStatus());
  141. try (SubmoduleWalk generator = SubmoduleWalk.forIndex(db)) {
  142. assertTrue(generator.next());
  143. }
  144. assertTrue(submoduleDir.isDirectory());
  145. assertEquals(0, submoduleDir.list().length);
  146. }
  147. private SubmoduleDeinitResult runDeinit(SubmoduleDeinitCommand command) throws GitAPIException {
  148. Collection<SubmoduleDeinitResult> deinitialized = command.call();
  149. assertNotNull(deinitialized);
  150. assertEquals(1, deinitialized.size());
  151. return deinitialized.iterator().next();
  152. }
  153. private RevCommit commitSubmoduleCreation(String path, Git git) throws IOException, GitAPIException {
  154. writeTrashFile("file.txt", "content");
  155. git.add().addFilepattern("file.txt").call();
  156. final RevCommit commit = git.commit().setMessage("create file").call();
  157. DirCache cache = db.lockDirCache();
  158. DirCacheEditor editor = cache.editor();
  159. editor.add(new PathEdit(path) {
  160. @Override
  161. public void apply(DirCacheEntry ent) {
  162. ent.setFileMode(FileMode.GITLINK);
  163. ent.setObjectId(commit);
  164. }
  165. });
  166. editor.commit();
  167. StoredConfig config = db.getConfig();
  168. config.setString(ConfigConstants.CONFIG_SUBMODULE_SECTION, path,
  169. ConfigConstants.CONFIG_KEY_URL, db.getDirectory().toURI()
  170. .toString());
  171. config.save();
  172. FileBasedConfig modulesConfig = new FileBasedConfig(new File(
  173. db.getWorkTree(), Constants.DOT_GIT_MODULES), db.getFS());
  174. modulesConfig.setString(ConfigConstants.CONFIG_SUBMODULE_SECTION, path,
  175. ConfigConstants.CONFIG_KEY_PATH, path);
  176. modulesConfig.save();
  177. new File(db.getWorkTree(), "sub").mkdir();
  178. git.add().addFilepattern(Constants.DOT_GIT_MODULES).call();
  179. git.commit().setMessage("create submodule").call();
  180. return commit;
  181. }
  182. }