18
18
import java .nio .charset .Charset ;
19
19
import java .nio .file .Path ;
20
20
import java .util .List ;
21
- import java .util .function .BiConsumer ;
22
- import java .util .stream .Collectors ;
23
21
24
22
import javax .annotation .Nonnull ;
25
23
28
26
import com .diffplug .spotless .LineEnding ;
29
27
import com .diffplug .spotless .LintState ;
30
28
import com .diffplug .spotless .ThrowingEx ;
29
+ import com .diffplug .spotless .cli .core .SpotlessActionContext ;
30
+ import com .diffplug .spotless .cli .core .TargetFileTypeInferer ;
31
31
import com .diffplug .spotless .cli .core .TargetResolver ;
32
32
import com .diffplug .spotless .cli .execution .SpotlessExecutionStrategy ;
33
33
import com .diffplug .spotless .cli .help .OptionConstants ;
41
41
@ Command (name = "spotless" , mixinStandardHelpOptions = true , versionProvider = SpotlessCLIVersionProvider .class , description = "Runs spotless" , subcommandsRepeatable = true , subcommands = {
42
42
LicenseHeader .class ,
43
43
RemoveMeLaterSubCommand .class })
44
- public class SpotlessCLI implements SpotlessAction , SpotlessCommand {
44
+ public class SpotlessCLI implements SpotlessAction , SpotlessCommand , SpotlessActionContextProvider {
45
45
46
46
@ CommandLine .Option (names = {"-V" , "--version" }, versionHelp = true , description = "Print version information and exit." )
47
47
boolean versionRequested ;
@@ -71,70 +71,46 @@ public Integer executeSpotlessAction(@Nonnull List<FormatterStep> formatterSteps
71
71
.steps (formatterSteps )
72
72
.build ()) {
73
73
74
- ResultType resultType = targetResolver .resolveTargets () // TODO result
74
+ ResultType resultType = targetResolver .resolveTargets ()
75
75
.parallel () // needed?
76
76
.map (path -> ThrowingEx .get (() -> new Result (path , LintState .of (formatter , path .toFile ())))) // TODO handle suppressions, see SpotlessTaskImpl
77
77
.map (result -> this .handleResult (formatter , result ))
78
78
.reduce (ResultType .CLEAN , ResultType ::combineWith );
79
- System .out .println ("Hello " + getClass ().getSimpleName () + ", abc! Files: " + new TargetResolver (targets ).resolveTargets ().collect (Collectors .toList ()));
80
- System .out .println ("result: " + resultType );
81
- formatterSteps .forEach (step -> System .out .println ("Step: " + step ));
82
- return 0 ;
79
+ return spotlessMode .translateResultTypeToExitCode (resultType );
83
80
}
84
81
}
85
82
86
83
private ResultType handleResult (Formatter formatter , Result result ) {
87
84
if (result .lintState .isClean ()) {
88
- System .out .println ("File is clean: " + result .target .toFile ().getName ());
85
+ // System.out.println("File is clean: " + result.target.toFile().getName());
89
86
return ResultType .CLEAN ;
90
87
}
91
88
if (result .lintState .getDirtyState ().didNotConverge ()) {
92
- System .out .println ("File did not converge: " + result .target .toFile ().getName ());
89
+ System .err .println ("File did not converge: " + result .target .toFile ().getName ()); // TODO: where to print the output to?
93
90
return ResultType .DID_NOT_CONVERGE ;
94
91
}
95
- this .spotlessMode .action . accept (formatter , result );
92
+ this .spotlessMode .handleResult (formatter , result );
96
93
return ResultType .DIRTY ;
97
94
98
- /*
99
- if (lintState.getDirtyState().isClean()) {
100
- // Remove previous output if it exists
101
- Files.deleteIfExists(cleanFile.toPath());
102
- } else if (lintState.getDirtyState().didNotConverge()) {
103
- getLogger().warn("Skipping '{}' because it does not converge. Run {@code spotlessDiagnose} to understand why", relativePath);
104
- } else {
105
- Path parentDir = cleanFile.toPath().getParent();
106
- if (parentDir == null) {
107
- throw new IllegalStateException("Every file has a parent folder. But not: " + cleanFile);
108
- }
109
- Files.createDirectories(parentDir);
110
- // Need to copy the original file to the tmp location just to remember the file attributes
111
- Files.copy(input.toPath(), cleanFile.toPath(), StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.COPY_ATTRIBUTES);
95
+ }
112
96
113
- getLogger().info(String.format("Writing clean file: %s", cleanFile));
114
- lintState.getDirtyState().writeCanonicalTo(cleanFile);
115
- }
116
- if (!lintState.isHasLints()) {
117
- Files.deleteIfExists(lintFile.toPath());
118
- } else {
119
- LinkedHashMap<String, List<Lint>> lints = lintState.getLintsByStep(formatter);
120
- SerializableMisc.toFile(lints, lintFile);
121
- }
122
- */
97
+ private TargetResolver targetResolver () {
98
+ return new TargetResolver (targets );
123
99
}
124
100
125
- // private void writeBack(Result result) {
126
- // if (result.updated != null ) {
127
- // ThrowingEx.run(() -> Files.writeString(result.target, result.updated, Charset.defaultCharset())); // TODO charset!
128
- // }
129
- // System.out.println("Writing back to file:" + result.target + " with content:\n" + result.updated );
130
- // }
101
+ @ Override
102
+ public SpotlessActionContext spotlessActionContext ( ) {
103
+ TargetResolver targetResolver = targetResolver ();
104
+ TargetFileTypeInferer targetFileTypeInferer = new TargetFileTypeInferer ( targetResolver );
105
+ return new SpotlessActionContext ( targetFileTypeInferer . inferTargetFileType () );
106
+ }
131
107
132
108
public static void main (String ... args ) {
133
109
if (args .length == 0 ) {
134
110
// args = new String[]{"--version"};
135
111
// args = new String[]{"license-header", "--header-file", "CHANGES.md", "--delimiter-for", "java", "license-header", "--header", "abc"};
136
112
137
- args = new String []{"--mode=CHECK" , "--target" , "src/poc/java/**/*.java" , "--encoding=UTF-8" , "license-header" , "--header" , "abc" , "--delimiter-for" , "java" , " license-header" , "--header-file" , "TestHeader.txt" };
113
+ args = new String []{"--mode=CHECK" , "--target" , "src/poc/java/**/*.java" , "--encoding=UTF-8" , "license-header" , "--header" , "abc" , "license-header" , "--header-file" , "TestHeader.txt" };
138
114
// args = new String[]{"--version"};
139
115
}
140
116
int exitCode = new CommandLine (new SpotlessCLI ())
@@ -145,19 +121,54 @@ public static void main(String... args) {
145
121
}
146
122
147
123
private enum SpotlessMode {
148
- CHECK (((formatter , result ) -> {
149
- if (result .lintState .isHasLints ()) {
150
- result .lintState .asStringOneLine (result .target .toFile (), formatter );
151
- } else {
152
- System .out .println (String .format ("%s is violating formatting rules." , result .target ));
124
+ CHECK {
125
+ @ Override
126
+ void handleResult (Formatter formatter , Result result ) {
127
+ if (result .lintState .isHasLints ()) {
128
+ result .lintState .asStringOneLine (result .target .toFile (), formatter );
129
+ } else {
130
+ System .out .println (String .format ("%s is violating formatting rules." , result .target ));
131
+ }
153
132
}
154
- })), APPLY (((formatter , result ) -> ThrowingEx .run (() -> result .lintState .getDirtyState ().writeCanonicalTo (result .target .toFile ()))));
155
133
156
- private final BiConsumer <Formatter , Result > action ;
134
+ @ Override
135
+ Integer translateResultTypeToExitCode (ResultType resultType ) {
136
+ if (resultType == ResultType .CLEAN ) {
137
+ return 0 ;
138
+ }
139
+ if (resultType == ResultType .DIRTY ) {
140
+ return 1 ;
141
+ }
142
+ if (resultType == ResultType .DID_NOT_CONVERGE ) {
143
+ return -1 ;
144
+ }
145
+ throw new IllegalStateException ("Unexpected result type: " + resultType );
146
+ }
147
+ },
148
+ APPLY {
149
+ @ Override
150
+ void handleResult (Formatter formatter , Result result ) {
151
+ ThrowingEx .run (() -> result .lintState .getDirtyState ().writeCanonicalTo (result .target .toFile ()));
152
+ }
157
153
158
- SpotlessMode (BiConsumer <Formatter , Result > action ) {
159
- this .action = action ;
160
- }
154
+ @ Override
155
+ Integer translateResultTypeToExitCode (ResultType resultType ) {
156
+ if (resultType == ResultType .CLEAN ) {
157
+ return 0 ;
158
+ }
159
+ if (resultType == ResultType .DIRTY ) {
160
+ return 0 ;
161
+ }
162
+ if (resultType == ResultType .DID_NOT_CONVERGE ) {
163
+ return -1 ;
164
+ }
165
+ throw new IllegalStateException ("Unexpected result type: " + resultType );
166
+ }
167
+ };
168
+
169
+ abstract void handleResult (Formatter formatter , Result result );
170
+
171
+ abstract Integer translateResultTypeToExitCode (ResultType resultType );
161
172
162
173
}
163
174
0 commit comments