Skip to content

Commit 60f05ea

Browse files
committed
Merge branch '3.1.x'
Closes gh-37882
2 parents ffbacd6 + 5af13d1 commit 60f05ea

File tree

3 files changed

+101
-5
lines changed

3 files changed

+101
-5
lines changed

spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/ApplicationPluginAction.java

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,10 @@
1919
import java.io.IOException;
2020
import java.io.InputStreamReader;
2121
import java.io.StringWriter;
22+
import java.lang.reflect.Method;
2223
import java.util.concurrent.Callable;
2324

25+
import org.gradle.api.Action;
2426
import org.gradle.api.GradleException;
2527
import org.gradle.api.Plugin;
2628
import org.gradle.api.Project;
@@ -35,6 +37,7 @@
3537
import org.gradle.api.tasks.TaskProvider;
3638
import org.gradle.jvm.application.scripts.TemplateBasedScriptGenerator;
3739
import org.gradle.jvm.application.tasks.CreateStartScripts;
40+
import org.gradle.util.GradleVersion;
3841

3942
import org.springframework.boot.gradle.tasks.run.BootRun;
4043

@@ -56,7 +59,7 @@ public void execute(Project project) {
5659
.register("bootStartScripts", CreateStartScripts.class,
5760
(task) -> configureCreateStartScripts(project, javaApplication, distribution, task));
5861
CopySpec binCopySpec = project.copySpec().into("bin").from(bootStartScripts);
59-
binCopySpec.setFileMode(0755);
62+
configureFilePermissions(binCopySpec, 0755);
6063
distribution.getContents().with(binCopySpec);
6164
applyApplicationDefaultJvmArgsToRunTasks(project.getTasks(), javaApplication);
6265
}
@@ -95,7 +98,7 @@ private void configureCreateStartScripts(Project project, JavaApplication javaAp
9598

9699
private CopySpec artifactFilesToLibCopySpec(Project project, Configuration configuration) {
97100
CopySpec copySpec = project.copySpec().into("lib").from(artifactFiles(configuration));
98-
copySpec.setFileMode(0644);
101+
configureFilePermissions(copySpec, 0644);
99102
return copySpec;
100103
}
101104

@@ -123,4 +126,34 @@ private String loadResource(String name) {
123126
}
124127
}
125128

129+
private void configureFilePermissions(CopySpec copySpec, int mode) {
130+
if (GradleVersion.current().compareTo(GradleVersion.version("8.3")) >= 0) {
131+
try {
132+
Method filePermissions = copySpec.getClass().getMethod("filePermissions", Action.class);
133+
filePermissions.invoke(copySpec, new Action<Object>() {
134+
135+
@Override
136+
public void execute(Object filePermissions) {
137+
String unixPermissions = Integer.toString(mode, 8);
138+
try {
139+
Method unix = filePermissions.getClass().getMethod("unix", String.class);
140+
unix.invoke(filePermissions, unixPermissions);
141+
}
142+
catch (Exception ex) {
143+
throw new GradleException("Failed to set file permissions to '" + unixPermissions + "'",
144+
ex);
145+
}
146+
}
147+
148+
});
149+
}
150+
catch (Exception ex) {
151+
throw new GradleException("Failed to set file permissions", ex);
152+
}
153+
}
154+
else {
155+
copySpec.setFileMode(mode);
156+
}
157+
}
158+
126159
}

spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/tasks/bundling/BootArchiveSupport.java

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@
2626
import java.util.Set;
2727
import java.util.TreeMap;
2828
import java.util.function.Function;
29+
import java.util.function.Supplier;
2930

31+
import org.gradle.api.GradleException;
3032
import org.gradle.api.file.CopySpec;
3133
import org.gradle.api.file.FileCopyDetails;
3234
import org.gradle.api.file.FileTreeElement;
@@ -36,11 +38,13 @@
3638
import org.gradle.api.internal.file.copy.FileCopyDetailsInternal;
3739
import org.gradle.api.java.archives.Attributes;
3840
import org.gradle.api.java.archives.Manifest;
41+
import org.gradle.api.provider.Property;
3942
import org.gradle.api.specs.Spec;
4043
import org.gradle.api.specs.Specs;
4144
import org.gradle.api.tasks.WorkResult;
4245
import org.gradle.api.tasks.bundling.Jar;
4346
import org.gradle.api.tasks.util.PatternSet;
47+
import org.gradle.util.GradleVersion;
4448

4549
import org.springframework.boot.loader.tools.LoaderImplementation;
4650

@@ -128,8 +132,8 @@ CopyAction createCopyAction(Jar jar, ResolvedDependencies resolvedDependencies,
128132
File output = jar.getArchiveFile().get().getAsFile();
129133
Manifest manifest = jar.getManifest();
130134
boolean preserveFileTimestamps = jar.isPreserveFileTimestamps();
131-
Integer dirMode = jar.getDirMode();
132-
Integer fileMode = jar.getFileMode();
135+
Integer dirMode = getDirMode(jar);
136+
Integer fileMode = getFileMode(jar);
133137
boolean includeDefaultLoader = isUsingDefaultLoader(jar);
134138
Spec<FileTreeElement> requiresUnpack = this.requiresUnpack.getAsSpec();
135139
Spec<FileTreeElement> exclusions = this.exclusions.getAsExcludeSpec();
@@ -143,6 +147,46 @@ CopyAction createCopyAction(Jar jar, ResolvedDependencies resolvedDependencies,
143147
return jar.isReproducibleFileOrder() ? new ReproducibleOrderingCopyAction(action) : action;
144148
}
145149

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+
146190
private boolean isUsingDefaultLoader(Jar jar) {
147191
return DEFAULT_LAUNCHER_CLASSES.contains(jar.getManifest().getAttributes().get("Main-Class"));
148192
}

spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/tasks/bundling/BootZipCopyAction.java

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,11 @@
4646
import org.gradle.api.internal.file.copy.CopyActionProcessingStream;
4747
import org.gradle.api.java.archives.Attributes;
4848
import org.gradle.api.java.archives.Manifest;
49+
import org.gradle.api.provider.Provider;
4950
import org.gradle.api.specs.Spec;
5051
import org.gradle.api.tasks.WorkResult;
5152
import org.gradle.api.tasks.WorkResults;
53+
import org.gradle.util.GradleVersion;
5254

5355
import org.springframework.boot.gradle.tasks.bundling.ResolvedDependencies.DependencyDescriptor;
5456
import org.springframework.boot.loader.tools.DefaultLaunchScript;
@@ -461,7 +463,24 @@ private int getFileMode() {
461463

462464
private int getFileMode(FileCopyDetails details) {
463465
return (BootZipCopyAction.this.fileMode != null) ? BootZipCopyAction.this.fileMode
464-
: UnixStat.FILE_FLAG | details.getMode();
466+
: UnixStat.FILE_FLAG | getPermissions(details);
467+
}
468+
469+
@SuppressWarnings("unchecked")
470+
private int getPermissions(FileCopyDetails details) {
471+
if (GradleVersion.current().compareTo(GradleVersion.version("8.3")) >= 0) {
472+
try {
473+
Object permissions = ((Provider<Object>) details.getClass()
474+
.getMethod("getImmutablePermissions")
475+
.invoke(details)).get();
476+
return ((Provider<Integer>) permissions.getClass().getMethod("toUnixNumeric").invoke(permissions))
477+
.get();
478+
}
479+
catch (Exception ex) {
480+
throw new GradleException("Failed to get permissions", ex);
481+
}
482+
}
483+
return details.getMode();
465484
}
466485

467486
}

0 commit comments

Comments
 (0)