Merge "Skip cleaning inner repositories by default in CleanCommand"
This commit is contained in:
commit
2c5c035e62
|
@ -47,6 +47,7 @@
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.assertTrue;
|
||||||
import static org.eclipse.jgit.lib.Constants.DOT_GIT_MODULES;
|
import static org.eclipse.jgit.lib.Constants.DOT_GIT_MODULES;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.TreeSet;
|
import java.util.TreeSet;
|
||||||
|
|
||||||
|
@ -255,4 +256,43 @@ public void testCleanDirsWithSubmodule() throws Exception {
|
||||||
assertTrue(cleanedFiles.contains("sub-clean/"));
|
assertTrue(cleanedFiles.contains("sub-clean/"));
|
||||||
assertTrue(cleanedFiles.size() == 4);
|
assertTrue(cleanedFiles.size() == 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCleanDirsWithRepository() throws Exception {
|
||||||
|
// Set up a repository inside the outer repository
|
||||||
|
String innerRepoName = "inner-repo";
|
||||||
|
File innerDir = new File(trash, innerRepoName);
|
||||||
|
innerDir.mkdir();
|
||||||
|
InitCommand initRepoCommand = new InitCommand();
|
||||||
|
initRepoCommand.setDirectory(innerDir);
|
||||||
|
initRepoCommand.call();
|
||||||
|
|
||||||
|
Status beforeCleanStatus = git.status().call();
|
||||||
|
Set<String> untrackedFolders = beforeCleanStatus.getUntrackedFolders();
|
||||||
|
Set<String> untrackedFiles = beforeCleanStatus.getUntracked();
|
||||||
|
|
||||||
|
// The inner repository should be listed as an untracked file
|
||||||
|
assertTrue(untrackedFiles.contains(innerRepoName));
|
||||||
|
|
||||||
|
// The inner repository should not be listed as an untracked folder
|
||||||
|
assertTrue(!untrackedFolders.contains(innerRepoName));
|
||||||
|
|
||||||
|
Set<String> cleanedFiles = git.clean().setCleanDirectories(true).call();
|
||||||
|
|
||||||
|
// The inner repository should not be cleaned.
|
||||||
|
assertTrue(!cleanedFiles.contains(innerRepoName + "/"));
|
||||||
|
|
||||||
|
assertTrue(cleanedFiles.contains("File2.txt"));
|
||||||
|
assertTrue(cleanedFiles.contains("File3.txt"));
|
||||||
|
assertTrue(!cleanedFiles.contains("sub-noclean/File1.txt"));
|
||||||
|
assertTrue(cleanedFiles.contains("sub-noclean/File2.txt"));
|
||||||
|
assertTrue(cleanedFiles.contains("sub-clean/"));
|
||||||
|
assertTrue(cleanedFiles.size() == 4);
|
||||||
|
|
||||||
|
Set<String> forceCleanedFiles = git.clean().setCleanDirectories(true)
|
||||||
|
.setForce(true).call();
|
||||||
|
|
||||||
|
// The inner repository should be cleaned this time
|
||||||
|
assertTrue(forceCleanedFiles.contains(innerRepoName + "/"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,6 +43,8 @@
|
||||||
*/
|
*/
|
||||||
package org.eclipse.jgit.api;
|
package org.eclipse.jgit.api;
|
||||||
|
|
||||||
|
import static org.eclipse.jgit.lib.Constants.DOT_GIT;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
@ -73,6 +75,8 @@ public class CleanCommand extends GitCommand<Set<String>> {
|
||||||
|
|
||||||
private boolean ignore = true;
|
private boolean ignore = true;
|
||||||
|
|
||||||
|
private boolean force = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param repo
|
* @param repo
|
||||||
*/
|
*/
|
||||||
|
@ -121,18 +125,12 @@ else if (fs.isDirectory(f))
|
||||||
|
|
||||||
for (String file : notIgnoredFiles)
|
for (String file : notIgnoredFiles)
|
||||||
if (paths.isEmpty() || paths.contains(file)) {
|
if (paths.isEmpty() || paths.contains(file)) {
|
||||||
if (!dryRun)
|
files = cleanPath(file, files);
|
||||||
FileUtils.delete(new File(repo.getWorkTree(), file));
|
|
||||||
files.add(file);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (directories)
|
|
||||||
for (String dir : notIgnoredDirs)
|
for (String dir : notIgnoredDirs)
|
||||||
if (paths.isEmpty() || paths.contains(dir)) {
|
if (paths.isEmpty() || paths.contains(dir)) {
|
||||||
if (!dryRun)
|
files = cleanPath(dir, files);
|
||||||
FileUtils.delete(new File(repo.getWorkTree(), dir),
|
|
||||||
FileUtils.RECURSIVE);
|
|
||||||
files.add(dir + "/"); //$NON-NLS-1$
|
|
||||||
}
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
throw new JGitInternalException(e.getMessage(), e);
|
throw new JGitInternalException(e.getMessage(), e);
|
||||||
|
@ -140,6 +138,56 @@ else if (fs.isDirectory(f))
|
||||||
return files;
|
return files;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* When dryRun is false, deletes the specified path from disk. If dryRun
|
||||||
|
* is true, no paths are actually deleted. In both cases, the paths that
|
||||||
|
* would have been deleted are added to inFiles and returned.
|
||||||
|
*
|
||||||
|
* Paths that are directories are recursively deleted when
|
||||||
|
* {@link #directories} is true.
|
||||||
|
* Paths that are git repositories are recursively deleted when
|
||||||
|
* {@link #directories} and {@link #force} are both true.
|
||||||
|
*
|
||||||
|
* @param path
|
||||||
|
* The path to be cleaned
|
||||||
|
* @param inFiles
|
||||||
|
* A set of strings representing the files that have been cleaned
|
||||||
|
* already, the path to be cleaned will be added to this set
|
||||||
|
* before being returned.
|
||||||
|
*
|
||||||
|
* @return a set of strings with the cleaned path added to it
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
private Set<String> cleanPath(String path, Set<String> inFiles)
|
||||||
|
throws IOException {
|
||||||
|
File curFile = new File(repo.getWorkTree(), path);
|
||||||
|
if (curFile.isDirectory()) {
|
||||||
|
if (directories) {
|
||||||
|
// Is this directory a git repository?
|
||||||
|
if (new File(curFile, DOT_GIT).exists()) {
|
||||||
|
if (force) {
|
||||||
|
if (!dryRun) {
|
||||||
|
FileUtils.delete(curFile, FileUtils.RECURSIVE);
|
||||||
|
}
|
||||||
|
inFiles.add(path + "/"); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (!dryRun) {
|
||||||
|
FileUtils.delete(curFile, FileUtils.RECURSIVE);
|
||||||
|
}
|
||||||
|
inFiles.add(path + "/"); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (!dryRun) {
|
||||||
|
FileUtils.delete(curFile, FileUtils.NONE);
|
||||||
|
}
|
||||||
|
inFiles.add(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
return inFiles;
|
||||||
|
}
|
||||||
|
|
||||||
private Set<String> filterIgnorePaths(Set<String> inputPaths,
|
private Set<String> filterIgnorePaths(Set<String> inputPaths,
|
||||||
Set<String> ignoredNotInIndex, boolean exact) {
|
Set<String> ignoredNotInIndex, boolean exact) {
|
||||||
if (ignore) {
|
if (ignore) {
|
||||||
|
@ -195,6 +243,20 @@ public CleanCommand setDryRun(boolean dryRun) {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If force is set, directories that are git repositories will also be
|
||||||
|
* deleted.
|
||||||
|
*
|
||||||
|
* @param force
|
||||||
|
* whether or not to delete git repositories
|
||||||
|
* @return {@code this}
|
||||||
|
* @since 4.5
|
||||||
|
*/
|
||||||
|
public CleanCommand setForce(boolean force) {
|
||||||
|
this.force = force;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* If dirs is set, in addition to files, also clean directories.
|
* If dirs is set, in addition to files, also clean directories.
|
||||||
*
|
*
|
||||||
|
|
Loading…
Reference in New Issue