diff --git a/src/main/java/org/openrewrite/gitlab/MigrateToRules.java b/src/main/java/org/openrewrite/gitlab/MigrateToRules.java index 60a0151..671b0ce 100644 --- a/src/main/java/org/openrewrite/gitlab/MigrateToRules.java +++ b/src/main/java/org/openrewrite/gitlab/MigrateToRules.java @@ -99,7 +99,8 @@ private static Yaml.Mapping migrateWithOnly(Yaml.Mapping m, Yaml.Mapping.Entry o String entryPrefix = onlyEntry.getPrefix(); String baseIndent = entryPrefix.contains("\n") ? entryPrefix.substring(entryPrefix.lastIndexOf('\n') + 1) : " "; - String seqIndent = baseIndent + " "; + String indentUnit = detectIndentUnit(baseIndent, (Yaml.Sequence) onlyEntry.getValue()); + String seqIndent = baseIndent + indentUnit; String contentIndent = seqIndent + " "; StringBuilder sb = new StringBuilder("rules:"); @@ -147,7 +148,8 @@ private static Yaml.Mapping migrateExceptOnly(Yaml.Mapping m, Yaml.Mapping.Entry String entryPrefix = exceptEntry.getPrefix(); String baseIndent = entryPrefix.contains("\n") ? entryPrefix.substring(entryPrefix.lastIndexOf('\n') + 1) : " "; - String seqIndent = baseIndent + " "; + String indentUnit = detectIndentUnit(baseIndent, (Yaml.Sequence) exceptEntry.getValue()); + String seqIndent = baseIndent + indentUnit; String contentIndent = seqIndent + " "; StringBuilder sb = new StringBuilder("rules:"); @@ -190,6 +192,21 @@ private static Yaml.Mapping migrateExceptOnly(Yaml.Mapping m, Yaml.Mapping.Entry .orElse(null); } + private static String detectIndentUnit(String baseIndent, Yaml.Sequence seq) { + List entries = seq.getEntries(); + if (entries.isEmpty()) { + return " "; + } + String childPrefix = entries.get(0).getPrefix(); + String childIndent = childPrefix.contains("\n") ? + childPrefix.substring(childPrefix.lastIndexOf('\n') + 1) : ""; + int increment = childIndent.length() - baseIndent.length(); + if (increment <= 0) { + return " "; + } + return childIndent.substring(baseIndent.length()); + } + static String refToCondition(String ref) { switch (ref) { case "branches": diff --git a/src/test/java/org/openrewrite/gitlab/MigrateToRulesTest.java b/src/test/java/org/openrewrite/gitlab/MigrateToRulesTest.java index ffcddae..06d823e 100644 --- a/src/test/java/org/openrewrite/gitlab/MigrateToRulesTest.java +++ b/src/test/java/org/openrewrite/gitlab/MigrateToRulesTest.java @@ -348,6 +348,80 @@ void multipleJobs() { ); } + @Test + void migrateFourSpaceIndentOnly() { + rewriteRun( + //language=yaml + yaml( + """ + build_job: + script: make build + only: + - main + - tags + """, + """ + build_job: + script: make build + rules: + - if: $CI_COMMIT_BRANCH == 'main' + - if: $CI_COMMIT_TAG + """, + source -> source.path(".gitlab-ci.yml") + ) + ); + } + + @Test + void migrateFourSpaceIndentExcept() { + rewriteRun( + //language=yaml + yaml( + """ + build_job: + script: make build + except: + - tags + """, + """ + build_job: + script: make build + rules: + - if: $CI_COMMIT_TAG + when: never + - when: always + """, + source -> source.path(".gitlab-ci.yml") + ) + ); + } + + @Test + void migrateFourSpaceIndentCombined() { + rewriteRun( + //language=yaml + yaml( + """ + build_job: + script: make build + only: + - branches + except: + - main + """, + """ + build_job: + script: make build + rules: + - if: $CI_COMMIT_BRANCH == 'main' + when: never + - if: $CI_COMMIT_BRANCH + """, + source -> source.path(".gitlab-ci.yml") + ) + ); + } + @Test void noopForNonGitlabCiFiles() { rewriteRun(