26
26
import java .util .Set ;
27
27
import java .util .TreeMap ;
28
28
import java .util .function .Function ;
29
+ import java .util .function .Supplier ;
29
30
31
+ import org .gradle .api .GradleException ;
30
32
import org .gradle .api .file .CopySpec ;
31
33
import org .gradle .api .file .FileCopyDetails ;
32
34
import org .gradle .api .file .FileTreeElement ;
36
38
import org .gradle .api .internal .file .copy .FileCopyDetailsInternal ;
37
39
import org .gradle .api .java .archives .Attributes ;
38
40
import org .gradle .api .java .archives .Manifest ;
41
+ import org .gradle .api .provider .Property ;
39
42
import org .gradle .api .specs .Spec ;
40
43
import org .gradle .api .specs .Specs ;
41
44
import org .gradle .api .tasks .WorkResult ;
42
45
import org .gradle .api .tasks .bundling .Jar ;
43
46
import org .gradle .api .tasks .util .PatternSet ;
47
+ import org .gradle .util .GradleVersion ;
44
48
45
49
import org .springframework .boot .loader .tools .LoaderImplementation ;
46
50
@@ -128,8 +132,8 @@ CopyAction createCopyAction(Jar jar, ResolvedDependencies resolvedDependencies,
128
132
File output = jar .getArchiveFile ().get ().getAsFile ();
129
133
Manifest manifest = jar .getManifest ();
130
134
boolean preserveFileTimestamps = jar .isPreserveFileTimestamps ();
131
- Integer dirMode = jar . getDirMode ();
132
- Integer fileMode = jar . getFileMode ();
135
+ Integer dirMode = getDirMode (jar );
136
+ Integer fileMode = getFileMode (jar );
133
137
boolean includeDefaultLoader = isUsingDefaultLoader (jar );
134
138
Spec <FileTreeElement > requiresUnpack = this .requiresUnpack .getAsSpec ();
135
139
Spec <FileTreeElement > exclusions = this .exclusions .getAsExcludeSpec ();
@@ -143,6 +147,46 @@ CopyAction createCopyAction(Jar jar, ResolvedDependencies resolvedDependencies,
143
147
return jar .isReproducibleFileOrder () ? new ReproducibleOrderingCopyAction (action ) : action ;
144
148
}
145
149
150
+ private Integer getDirMode (CopySpec copySpec ) {
151
+ return getMode (copySpec , "getDirPermissions" , copySpec ::getDirMode );
152
+ }
153
+
154
+ private Integer getFileMode (CopySpec copySpec ) {
155
+ return getMode (copySpec , "getFilePermissions" , copySpec ::getFileMode );
156
+ }
157
+
158
+ @ SuppressWarnings ("unchecked" )
159
+ private Integer getMode (CopySpec copySpec , String methodName , Supplier <Integer > fallback ) {
160
+ if (GradleVersion .current ().compareTo (GradleVersion .version ("8.3" )) >= 0 ) {
161
+ try {
162
+ Object filePermissions = ((Property <Object >) copySpec .getClass ().getMethod (methodName ).invoke (copySpec ))
163
+ .getOrNull ();
164
+ return getMode (filePermissions );
165
+ }
166
+ catch (Exception ex ) {
167
+ throw new GradleException ("Failed to get permissions" , ex );
168
+ }
169
+ }
170
+ return fallback .get ();
171
+ }
172
+
173
+ private Integer getMode (Object permissions ) throws Exception {
174
+ if (permissions == null ) {
175
+ return null ;
176
+ }
177
+ String user = asIntegerString (permissions .getClass ().getMethod ("getUser" ).invoke (permissions ));
178
+ String group = asIntegerString (permissions .getClass ().getMethod ("getGroup" ).invoke (permissions ));
179
+ String other = asIntegerString (permissions .getClass ().getMethod ("getOther" ).invoke (permissions ));
180
+ return Integer .parseInt ("0" + user + group + other , 8 );
181
+ }
182
+
183
+ private String asIntegerString (Object permissions ) throws Exception {
184
+ boolean read = (boolean ) permissions .getClass ().getMethod ("getRead" ).invoke (permissions );
185
+ boolean write = (boolean ) permissions .getClass ().getMethod ("getWrite" ).invoke (permissions );
186
+ boolean execute = (boolean ) permissions .getClass ().getMethod ("getExecute" ).invoke (permissions );
187
+ return Integer .toString (((read ) ? 4 : 0 ) + ((write ) ? 2 : 0 ) + ((execute ) ? 1 : 0 ));
188
+ }
189
+
146
190
private boolean isUsingDefaultLoader (Jar jar ) {
147
191
return DEFAULT_LAUNCHER_CLASSES .contains (jar .getManifest ().getAttributes ().get ("Main-Class" ));
148
192
}
0 commit comments