1717package com .palantir .baseline .tasks ;
1818
1919import java .io .File ;
20+ import java .io .IOException ;
21+ import java .nio .charset .StandardCharsets ;
22+ import java .nio .file .Files ;
23+ import java .nio .file .Paths ;
2024import java .util .Enumeration ;
2125import java .util .HashMap ;
2226import java .util .HashSet ;
2630import java .util .jar .JarFile ;
2731import org .gradle .api .DefaultTask ;
2832import org .gradle .api .artifacts .Configuration ;
29- import org .gradle .api .tasks .Input ;
33+ import org .gradle .api .tasks .Classpath ;
34+ import org .gradle .api .tasks .CompileClasspath ;
35+ import org .gradle .api .tasks .InputFiles ;
36+ import org .gradle .api .tasks .OutputFile ;
37+ import org .gradle .api .tasks .SkipWhenEmpty ;
3038import org .gradle .api .tasks .TaskAction ;
3139
3240@ SuppressWarnings ("checkstyle:designforextension" ) // making this 'final' breaks gradle
@@ -39,9 +47,12 @@ public CheckUniqueClassNamesTask() {
3947 setDescription ("Checks that the given configuration contains no identically named classes." );
4048 }
4149
42- @ Input
43- public Configuration getConfiguration () {
44- return configuration ;
50+ @ InputFiles
51+ @ Classpath
52+ @ CompileClasspath
53+ @ SkipWhenEmpty
54+ public Iterable <File > getClasspath () {
55+ return configuration .getResolvedConfiguration ().getFiles ();
4556 }
4657
4758 public void setConfiguration (Configuration configuration ) {
@@ -50,10 +61,9 @@ public void setConfiguration(Configuration configuration) {
5061
5162 @ TaskAction
5263 public void checkForDuplicateClasses () {
53- Set <File > files = getConfiguration ().getResolvedConfiguration ().getFiles ();
5464 Map <String , Set <File >> classToJarMap = new HashMap <>();
5565
56- for (File file : files ) {
66+ for (File file : getClasspath () ) {
5767 try (JarFile jarFile1 = new JarFile (file )) {
5868 Enumeration <JarEntry > entries = jarFile1 .entries ();
5969
@@ -87,9 +97,32 @@ public void checkForDuplicateClasses() {
8797 }
8898
8999 if (errors .length () > 0 ) {
100+ writeResult (false );
90101 throw new IllegalStateException (String .format (
91102 "%s contains duplicate classes: %s" ,
92- getConfiguration ().getName (), errors .toString ()));
103+ configuration .getName (), errors .toString ()));
104+ }
105+
106+ writeResult (true );
107+ }
108+
109+ /**
110+ * This only exists to convince gradle this task is incremental.
111+ */
112+ @ OutputFile
113+ public File getResultFile () {
114+ return getProject ().getBuildDir ().toPath ()
115+ .resolve (Paths .get ("uniqueClassNames" , configuration .getName ()))
116+ .toFile ();
117+ }
118+
119+ private void writeResult (boolean success ) {
120+ try {
121+ File result = getResultFile ();
122+ Files .createDirectories (result .toPath ().getParent ());
123+ Files .write (result .toPath (), Boolean .toString (success ).getBytes (StandardCharsets .UTF_8 ));
124+ } catch (IOException e ) {
125+ throw new RuntimeException ("Unable to write boolean result file" , e );
93126 }
94127 }
95128}
0 commit comments