From 6771692dfe82d9cb83e95311010646e220f3ce6d Mon Sep 17 00:00:00 2001 From: conderls Date: Wed, 23 Dec 2020 16:22:33 +0800 Subject: [PATCH] feat: 'ratchetFrom' in git submodule supported (#746) --- .../diffplug/spotless/extra/GitRatchet.java | 31 +++++++++++++++++-- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/lib-extra/src/main/java/com/diffplug/spotless/extra/GitRatchet.java b/lib-extra/src/main/java/com/diffplug/spotless/extra/GitRatchet.java index 5130760091..d2fc3f9094 100644 --- a/lib-extra/src/main/java/com/diffplug/spotless/extra/GitRatchet.java +++ b/lib-extra/src/main/java/com/diffplug/spotless/extra/GitRatchet.java @@ -17,6 +17,8 @@ import java.io.File; import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; import java.util.HashMap; import java.util.Map; import java.util.Objects; @@ -183,13 +185,36 @@ protected Repository repositoryFor(Project project) throws IOException { return null; } + /** + * When populating a new submodule directory with "git submodule init", the $GIT_DIR meta-information directory + * for submodules is created inside $GIT_DIR/modules// directory of the super-project + * and referenced via the git-file mechanism. + */ + private static @Nullable File getDotGitDir(File dir, String dotGit) { + File dotGitPath = new File(dir, dotGit); + + if (dotGitPath.isDirectory()) { + return dotGitPath; + } else if (dotGitPath.isFile()){ + try { + String relativePath = new String(Files.readAllBytes(dir.toPath()), StandardCharsets.UTF_8) + .split(":")[1].trim(); + return getDotGitDir(dir, relativePath); + } catch (IOException e) { + return null; + } + } else { + return null; + } + } + private static boolean isGitRoot(File dir) { - File dotGit = new File(dir, Constants.DOT_GIT); - return dotGit.isDirectory() && RepositoryCache.FileKey.isGitRepository(dotGit, FS.DETECTED); + File dotGit = getDotGitDir(dir, Constants.DOT_GIT); + return dotGit != null && RepositoryCache.FileKey.isGitRepository(dotGit, FS.DETECTED); } static Repository createRepo(File dir) throws IOException { - return FileRepositoryBuilder.create(new File(dir, Constants.DOT_GIT)); + return FileRepositoryBuilder.create(getDotGitDir(dir, Constants.DOT_GIT)); } /**