From a72331eecb1c32d334231938ca2931b35c3ee8c5 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) --- CHANGES.md | 1 + .../diffplug/spotless/extra/GitRatchet.java | 32 +++++++++++++++++-- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 783cc196f0..6e873f8756 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -12,6 +12,7 @@ We adhere to the [keepachangelog](https://keepachangelog.com/en/1.0.0/) format ( ## [Unreleased] ### Changed * Update default ktfmt from 0.16 to 0.18 ([#748](https://github.com/diffplug/spotless/issues/748)) +* Added support for git-submodule with `ratchetFrom` ([#746](https://github.com/diffplug/spotless/issues/746)) ## [2.10.2] - 2020-11-16 ### Fixed 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..2fbd568191 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,37 @@ 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(dotGitPath.toPath()), StandardCharsets.UTF_8) + .split(":")[1].trim(); + return getDotGitDir(dir, relativePath); + } catch (IOException e) { + System.err.println("failed to parse git meta: " + e.getMessage()); + 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)); } /**