diff --git a/WHATSNEW b/WHATSNEW index 125def983..6a7416328 100644 --- a/WHATSNEW +++ b/WHATSNEW @@ -57,6 +57,9 @@ Other changes: * rmic has been removed from Java 15. The task will now throw an exception if you try to use it while running Java 15 or newer. + * a new property ant.tmpdir provides improved control over the + location Ant uses to create temporary files + Changes from Ant 1.10.6 TO Ant 1.10.7 ===================================== diff --git a/manual/Tasks/cab.html b/manual/Tasks/cab.html index 24f8af67c..a773b04e4 100644 --- a/manual/Tasks/cab.html +++ b/manual/Tasks/cab.html @@ -39,6 +39,10 @@ how the inclusion/exclusion of files works, and how to write patterns.

attributes of <fileset> (dir becomes basedir) as well as the nested <include>, <exclude> and <patternset> elements.

+ +

On non-Unix platforms this task writes the list of files to archive + to the temporary directory.

+

Parameters

diff --git a/manual/Tasks/cvstagdiff.html b/manual/Tasks/cvstagdiff.html index aef891f2b..ad1c67e0d 100644 --- a/manual/Tasks/cvstagdiff.html +++ b/manual/Tasks/cvstagdiff.html @@ -31,6 +31,8 @@ execute cvs.exe from the command line in the target directory in whic Also note that this task assumes that the cvs executable is compatible with the Unix version, this is not completely true for certain other CVS clients—like CVSNT for example—and some operation may fail when using such an incompatible client.

+

This task captures the output of the CVS command in a file inside of + the temporary directory.

Parameters

diff --git a/manual/Tasks/ejb.html b/manual/Tasks/ejb.html index 24fb9c2e8..0e78bded0 100644 --- a/manual/Tasks/ejb.html +++ b/manual/Tasks/ejb.html @@ -1423,6 +1423,9 @@ the ejbjar task (for example, basejarname, basename and flatdestdir) as well as the iplanet element (for example, suffix). Refer to the appropriate documentation for more details.

+

This task creates a directory for scratch data inside of + the temporary directory.

+

Parameters

diff --git a/manual/Tasks/exec.html b/manual/Tasks/exec.html index c90558ddb..1d2eba242 100644 --- a/manual/Tasks/exec.html +++ b/manual/Tasks/exec.html @@ -83,6 +83,8 @@ target="_top">OpenJDK build instructions for cygwin.

The command specified using executable and <arg> elements is executed exactly as specified inside a temporary DCL script. This has some implications:

+ 1.6
+ If this is set to true then Ant will create an empty + file inside of the temporary + directory and transfer it to the remote server - deleting it on + both sides once the difference has been determined. + diff --git a/manual/Tasks/javadoc.html b/manual/Tasks/javadoc.html index 933b74d68..452233cd6 100644 --- a/manual/Tasks/javadoc.html +++ b/manual/Tasks/javadoc.html @@ -436,7 +436,10 @@ with the exclude patterns of the packageset (and vice ve nested source elements should be written to a temporary file to make the command line shorter. Also applies to the package names specified via the packagenames attribute or nested package elements. Since Ant 1.7.0, also applies to - all the other command line options. (yes|no). + all the other command line options. (yes|no).
+ If enabled, the file will be written to + the temporary + directory. diff --git a/manual/Tasks/replaceregexp.html b/manual/Tasks/replaceregexp.html index f0886013c..5077fbcba 100644 --- a/manual/Tasks/replaceregexp.html +++ b/manual/Tasks/replaceregexp.html @@ -28,8 +28,12 @@

ReplaceRegExp is a directory based task for replacing the occurrence of a given regular expression with a substitution pattern in a selected file or set of files.

-

The output file is only written if it differs from the existing file. This prevents spurious -rebuilds based on unchanged files which have been regenerated by this task.

+

The output file is only written if it differs from the existing +file. This prevents spurious rebuilds based on unchanged files which +have been regenerated by this task. In order to assess whether a file +has changed, this task will create a pre-processed version of the +source file inside of the temporary +directory.

Similar to regexp type mappers this task needs a supporting regular expression library and an implementation diff --git a/manual/Types/selectors.html b/manual/Types/selectors.html index 98b503389..6007c3e39 100644 --- a/manual/Types/selectors.html +++ b/manual/Types/selectors.html @@ -619,6 +619,10 @@ the <modified> selector tries to (attention!) copy the content into a local file for computing the hashvalue.

+

If the source resource is not a filesystem resource the + modified selector will download it to + the temporary directory.

+
timediffauto set to true to make Ant calculate the time difference between client and server.
requires write access in the remote directory
Since Ant - 1.6
No
all No; default is no
diff --git a/manual/running.html b/manual/running.html index c1b031f81..ab48f95ac 100644 --- a/manual/running.html +++ b/manual/running.html @@ -460,6 +460,22 @@ And I filtered out the getPropertyHelper access.

+ + + +
Attribute ant.tstamp.now.iso ISO-8601 timestamp string like 1972-04-17T08:07:00Z
java.io.tmpdirSome tasks need to create temporary files and will write them to + the directory specified by this property. This property is set by + the Java VM but can be overridden when Ant is started.
+ See also Temporary Directories.
+ + ant.tmpdir + Since Ant 1.10.8
+ Some tasks need to create temporary files and will write them to + the directory specified by this property. This property takes + precedence over java.io.tmpdir if it has been + set. Unlike java.io.tmpdir this property can be set + from within the build file.
+ See also Temporary Directories.

@@ -477,6 +493,37 @@ return code of the java program. So a successful build returns 0, failed builds return other values.

+

Temporary Directories

+ +Some Ant tasks and types need to create temporary files. By default +they use the default temporary directory of the Java VM they are +running in - which can be set by setting the system +property java.io.tmpdir. The default value of it depends +on the platform and the JVM implementation.

+ +

Setting a system property when invoking Ant is not straight forward + as the corresponding command line arguments must be sent to the Java + executable rather than Ant's main class. When using + the ant(.cmd) wrapper scripts you can do so with the + help of the ANT_OPTS environment variable.

+ +

Starting with Ant 1.10.8 we've introduced a new Ant + property ant.tmpdir that takes precedence + over java.io.tmpdir when set. As this is a normal Ant + property it can be set via the command line or even from within a + build file.

+ +

Tasks and types using the temporary directory will state the fact + inside of their respective manual page. In addition every execution + of an external command on OpenVMS will create a temporary file + holding a DCL script that invokes the actual command.

+ +

Tasks not provided with the Ant distribution will ignore + the ant.tmpdir property and + use java.io.tmpdir unless they have been adapted to the + changed API of Ant 1.10.8.

+ +

Cygwin Users

Unix launch script that come with Ant works correctly with Cygwin. You @@ -489,7 +536,6 @@ task, executable names such as /bin/sh will not work, even though these work from the Cygwin shell from which Ant was launched. You can use an executable name such as sh and rely on that command being available in the Windows path. -

OS/2 Users

diff --git a/src/main/org/apache/tools/ant/MagicNames.java b/src/main/org/apache/tools/ant/MagicNames.java index 6e7fc702c..29bbaeef6 100644 --- a/src/main/org/apache/tools/ant/MagicNames.java +++ b/src/main/org/apache/tools/ant/MagicNames.java @@ -322,5 +322,13 @@ public final class MagicNames { */ public static final String TSTAMP_NOW_ISO = "ant.tstamp.now.iso"; + /** + * Magic property that can be set to override the java.io.tmpdir + * system property as the location for Ant's default temporary + * directory. + * Value: {@value} + * @since Ant 1.10.8 + */ + public static final String TMPDIR = "ant.tmpdir"; } diff --git a/src/main/org/apache/tools/ant/taskdefs/FixCRLF.java b/src/main/org/apache/tools/ant/taskdefs/FixCRLF.java index 405234038..cff7ed820 100644 --- a/src/main/org/apache/tools/ant/taskdefs/FixCRLF.java +++ b/src/main/org/apache/tools/ant/taskdefs/FixCRLF.java @@ -354,7 +354,7 @@ public class FixCRLF extends MatchingTask implements ChainableReader { fcv = new Vector<>(1); fcv.add(fc); } - File tmpFile = FILE_UTILS.createTempFile("fixcrlf", "", null, true, true); + File tmpFile = FILE_UTILS.createTempFile(getProject(), "fixcrlf", "", null, true, true); try { FILE_UTILS.copyFile(srcFile, tmpFile, null, fcv, true, false, encoding, outputEncoding == null ? encoding : outputEncoding, diff --git a/src/main/org/apache/tools/ant/taskdefs/Javadoc.java b/src/main/org/apache/tools/ant/taskdefs/Javadoc.java index bca0e0bdc..d768088e8 100644 --- a/src/main/org/apache/tools/ant/taskdefs/Javadoc.java +++ b/src/main/org/apache/tools/ant/taskdefs/Javadoc.java @@ -1868,7 +1868,7 @@ public class Javadoc extends Task { */ BufferedWriter srcListWriter = null; if (useExternalFile) { - tmpList = FILE_UTILS.createTempFile("javadoc", "", null, true, true); + tmpList = FILE_UTILS.createTempFile(getProject(), "javadoc", "", null, true, true); toExecute.createArgument() .setValue("@" + tmpList.getAbsolutePath()); wr = new FileWriter(tmpList.getAbsolutePath(), true); @@ -2049,7 +2049,7 @@ public class Javadoc extends Task { File optionsTmpFile = null; try { optionsTmpFile = FILE_UTILS.createTempFile( - "javadocOptions", "", null, true, true); + getProject(), "javadocOptions", "", null, true, true); final String[] listOpt = toExecute.getArguments(); toExecute.clearArgs(); toExecute.createArgument().setValue( diff --git a/src/main/org/apache/tools/ant/taskdefs/Jikes.java b/src/main/org/apache/tools/ant/taskdefs/Jikes.java index 7453933ef..f428a4de5 100644 --- a/src/main/org/apache/tools/ant/taskdefs/Jikes.java +++ b/src/main/org/apache/tools/ant/taskdefs/Jikes.java @@ -81,7 +81,7 @@ public class Jikes { // Windows has a 32k limit on total arg size, so // create a temporary file to store all the arguments if (Os.isFamily(Os.FAMILY_WINDOWS) && args.length > MAX_FILES_ON_COMMAND_LINE) { - tmpFile = FileUtils.getFileUtils().createTempFile("jikes", + tmpFile = FileUtils.getFileUtils().createTempFile(project, "jikes", "tmp", null, false, true); try (BufferedWriter out = new BufferedWriter(new FileWriter(tmpFile))) { for (String arg : args) { diff --git a/src/main/org/apache/tools/ant/taskdefs/Replace.java b/src/main/org/apache/tools/ant/taskdefs/Replace.java index 05d4767a8..66cdef43b 100644 --- a/src/main/org/apache/tools/ant/taskdefs/Replace.java +++ b/src/main/org/apache/tools/ant/taskdefs/Replace.java @@ -649,7 +649,7 @@ public class Replace extends MatchingTask { logFilterChain(src.getPath()); try { - File temp = FILE_UTILS.createTempFile("rep", ".tmp", + File temp = FILE_UTILS.createTempFile(getProject(), "rep", ".tmp", src.getParentFile(), false, true); try { try (FileInput in = new FileInput(src); diff --git a/src/main/org/apache/tools/ant/taskdefs/TempFile.java b/src/main/org/apache/tools/ant/taskdefs/TempFile.java index f0e1e234a..7a1570f9d 100644 --- a/src/main/org/apache/tools/ant/taskdefs/TempFile.java +++ b/src/main/org/apache/tools/ant/taskdefs/TempFile.java @@ -154,7 +154,7 @@ public class TempFile extends Task { if (destDir == null) { destDir = getProject().resolveFile("."); } - File tfile = FILE_UTILS.createTempFile(prefix, suffix, destDir, + File tfile = FILE_UTILS.createTempFile(getProject(), prefix, suffix, destDir, deleteOnExit, createFile); getProject().setNewProperty(property, tfile.toString()); } diff --git a/src/main/org/apache/tools/ant/taskdefs/Zip.java b/src/main/org/apache/tools/ant/taskdefs/Zip.java index b545cb83e..9efae6d4d 100644 --- a/src/main/org/apache/tools/ant/taskdefs/Zip.java +++ b/src/main/org/apache/tools/ant/taskdefs/Zip.java @@ -800,7 +800,7 @@ public class Zip extends MatchingTask { /** rename the zip file. */ private File renameFile() { final File renamedFile = FILE_UTILS.createTempFile( - "zip", ".tmp", zipFile.getParentFile(), true, false); + getProject(), "zip", ".tmp", zipFile.getParentFile(), true, false); try { FILE_UTILS.rename(zipFile, renamedFile); } catch (final SecurityException | IOException e) { diff --git a/src/main/org/apache/tools/ant/taskdefs/compilers/DefaultCompilerAdapter.java b/src/main/org/apache/tools/ant/taskdefs/compilers/DefaultCompilerAdapter.java index ec2d9d886..7b37a5845 100644 --- a/src/main/org/apache/tools/ant/taskdefs/compilers/DefaultCompilerAdapter.java +++ b/src/main/org/apache/tools/ant/taskdefs/compilers/DefaultCompilerAdapter.java @@ -545,7 +545,7 @@ public abstract class DefaultCompilerAdapter && firstFileName >= 0) { try { tmpFile = FILE_UTILS.createTempFile( - "files", "", getJavac().getTempdir(), true, true); + getProject(), "files", "", getJavac().getTempdir(), true, true); try (BufferedWriter out = new BufferedWriter(new FileWriter(tmpFile))) { for (int i = firstFileName; i < args.length; i++) { diff --git a/src/main/org/apache/tools/ant/taskdefs/cvslib/CvsTagDiff.java b/src/main/org/apache/tools/ant/taskdefs/cvslib/CvsTagDiff.java index 56b8e8c40..e01dd6e53 100644 --- a/src/main/org/apache/tools/ant/taskdefs/cvslib/CvsTagDiff.java +++ b/src/main/org/apache/tools/ant/taskdefs/cvslib/CvsTagDiff.java @@ -260,7 +260,7 @@ public class CvsTagDiff extends AbstractCvsTask { try { handlePackageNames(); - tmpFile = FILE_UTILS.createTempFile("cvstagdiff", ".log", null, + tmpFile = FILE_UTILS.createTempFile(getProject(), "cvstagdiff", ".log", null, true, true); setOutput(tmpFile); diff --git a/src/main/org/apache/tools/ant/taskdefs/launcher/VmsCommandLauncher.java b/src/main/org/apache/tools/ant/taskdefs/launcher/VmsCommandLauncher.java index 6d9306716..be5c44da1 100644 --- a/src/main/org/apache/tools/ant/taskdefs/launcher/VmsCommandLauncher.java +++ b/src/main/org/apache/tools/ant/taskdefs/launcher/VmsCommandLauncher.java @@ -48,7 +48,7 @@ public class VmsCommandLauncher extends Java13CommandLauncher { @Override public Process exec(Project project, String[] cmd, String[] env) throws IOException { - File cmdFile = createCommandFile(cmd, env); + File cmdFile = createCommandFile(project, cmd, env); Process p = super.exec(project, new String[] {cmdFile.getPath()}, env); deleteAfter(cmdFile, p); @@ -76,7 +76,7 @@ public class VmsCommandLauncher extends Java13CommandLauncher { @Override public Process exec(Project project, String[] cmd, String[] env, File workingDir) throws IOException { - File cmdFile = createCommandFile(cmd, env); + File cmdFile = createCommandFile(project, cmd, env); Process p = super.exec(project, new String[] {cmdFile.getPath()}, env, workingDir); deleteAfter(cmdFile, p); @@ -91,9 +91,9 @@ public class VmsCommandLauncher extends Java13CommandLauncher { * @return the command File. * @throws IOException if errors are encountered creating the file. */ - private File createCommandFile(String[] cmd, String[] env) + private File createCommandFile(final Project project, String[] cmd, String[] env) throws IOException { - File script = FILE_UTILS.createTempFile("ANT", ".COM", null, true, true); + File script = FILE_UTILS.createTempFile(project, "ANT", ".COM", null, true, true); try (BufferedWriter out = new BufferedWriter(new FileWriter(script))) { // add the environment as logicals to the DCL script diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/Cab.java b/src/main/org/apache/tools/ant/taskdefs/optional/Cab.java index bddbdb4fb..7be3b2874 100644 --- a/src/main/org/apache/tools/ant/taskdefs/optional/Cab.java +++ b/src/main/org/apache/tools/ant/taskdefs/optional/Cab.java @@ -173,7 +173,7 @@ public class Cab extends MatchingTask { */ protected File createListFile(Vector files) throws IOException { - File listFile = FILE_UTILS.createTempFile("ant", "", null, true, true); + File listFile = FILE_UTILS.createTempFile(getProject(), "ant", "", null, true, true); try (BufferedWriter writer = new BufferedWriter(new FileWriter(listFile))) { @@ -301,7 +301,7 @@ public class Cab extends MatchingTask { exec.setDir(baseDir); if (!doVerbose) { - outFile = FILE_UTILS.createTempFile("ant", "", null, true, true); + outFile = FILE_UTILS.createTempFile(getProject(), "ant", "", null, true, true); exec.setOutput(outFile); } diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/ReplaceRegExp.java b/src/main/org/apache/tools/ant/taskdefs/optional/ReplaceRegExp.java index 7ed0404b4..5b7e3e695 100644 --- a/src/main/org/apache/tools/ant/taskdefs/optional/ReplaceRegExp.java +++ b/src/main/org/apache/tools/ant/taskdefs/optional/ReplaceRegExp.java @@ -350,7 +350,7 @@ public class ReplaceRegExp extends Task { */ protected void doReplace(File f, int options) throws IOException { - File temp = FILE_UTILS.createTempFile("replace", ".txt", null, true, true); + File temp = FILE_UTILS.createTempFile(getProject(), "replace", ".txt", null, true, true); try { boolean changes = false; diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTask.java b/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTask.java index a0ce572ba..6fd77809b 100644 --- a/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTask.java +++ b/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTask.java @@ -1427,7 +1427,7 @@ public class JUnitTask extends Task { * @return created file */ private File createTempPropertiesFile(final String prefix) { - return FILE_UTILS.createTempFile(prefix, ".properties", + return FILE_UTILS.createTempFile(getProject(), prefix, ".properties", tmpDir != null ? tmpDir : getProject().getBaseDir(), true, true); } diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/net/FTP.java b/src/main/org/apache/tools/ant/taskdefs/optional/net/FTP.java index 61cdc3bfc..e8fa600a2 100644 --- a/src/main/org/apache/tools/ant/taskdefs/optional/net/FTP.java +++ b/src/main/org/apache/tools/ant/taskdefs/optional/net/FTP.java @@ -2058,7 +2058,7 @@ public class FTP extends Task implements FTPTaskConfig { FTPFile[] files = null; final int maxIterations = 1000; for (int counter = 1; counter < maxIterations; counter++) { - File localFile = FILE_UTILS.createTempFile( + File localFile = FILE_UTILS.createTempFile(getProject(), "ant" + Integer.toString(counter), ".tmp", null, false, false); String fileName = localFile.getName(); diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/net/FTPTaskMirrorImpl.java b/src/main/org/apache/tools/ant/taskdefs/optional/net/FTPTaskMirrorImpl.java index 93edd7dfe..aec12cc42 100644 --- a/src/main/org/apache/tools/ant/taskdefs/optional/net/FTPTaskMirrorImpl.java +++ b/src/main/org/apache/tools/ant/taskdefs/optional/net/FTPTaskMirrorImpl.java @@ -1371,7 +1371,7 @@ public class FTPTaskMirrorImpl implements FTPTaskMirror { FTPFile[] files = null; final int maxIterations = 1000; for (int counter = 1; counter < maxIterations; counter++) { - File localFile = FILE_UTILS.createTempFile( + File localFile = FILE_UTILS.createTempFile(task.getProject(), "ant" + Integer.toString(counter), ".tmp", null, false, false); String fileName = localFile.getName(); diff --git a/src/main/org/apache/tools/ant/types/selectors/modifiedselector/ModifiedSelector.java b/src/main/org/apache/tools/ant/types/selectors/modifiedselector/ModifiedSelector.java index 7d559dc19..93fe23bb7 100644 --- a/src/main/org/apache/tools/ant/types/selectors/modifiedselector/ModifiedSelector.java +++ b/src/main/org/apache/tools/ant/types/selectors/modifiedselector/ModifiedSelector.java @@ -446,7 +446,7 @@ public class ModifiedSelector extends BaseExtendSelector // How to handle non-file-Resources? I copy temporarily the // resource to a file and use the file-implementation. FileUtils fu = FileUtils.getFileUtils(); - File tmpFile = fu.createTempFile("modified-", ".tmp", null, true, false); + File tmpFile = fu.createTempFile(getProject(), "modified-", ".tmp", null, true, false); Resource tmpResource = new FileResource(tmpFile); ResourceUtils.copyResource(resource, tmpResource); boolean isSelected = isSelected(tmpFile.getParentFile(), diff --git a/src/main/org/apache/tools/ant/util/FileUtils.java b/src/main/org/apache/tools/ant/util/FileUtils.java index ad90bcb93..565d69b6f 100644 --- a/src/main/org/apache/tools/ant/util/FileUtils.java +++ b/src/main/org/apache/tools/ant/util/FileUtils.java @@ -50,6 +50,7 @@ import java.util.jar.JarFile; import java.util.stream.Collectors; import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.MagicNames; import org.apache.tools.ant.PathTokenizer; import org.apache.tools.ant.Project; import org.apache.tools.ant.launch.Locator; @@ -891,19 +892,15 @@ public class FileUtils { * this method was invoked, any subsequent invocation of this method will * yield a different file name. *

- *

- * The filename is prefixNNNNNsuffix where NNNN is a random number. - *

* - * @param prefix - * prefix before the random number. + * @param prefix file name prefix. * @param suffix * file extension; include the '.'. * @param parentDir * Directory to create the temporary file in; java.io.tmpdir used * if not specified. * - * @deprecated since ant 1.7.1 use createTempFile(String, String, File, + * @deprecated since ant 1.7.1 use createTempFile(Project, String, String, File, * boolean, boolean) instead. * @return a File reference to the new, nonexistent temporary file. */ @@ -912,8 +909,6 @@ public class FileUtils { return createTempFile(prefix, suffix, parentDir, false, false); } - private static final String NULL_PLACEHOLDER = "null"; - /** * Create a temporary file in a given directory. * @@ -921,7 +916,7 @@ public class FileUtils { * exist before this method was invoked, any subsequent invocation * of this method will yield a different file name.

* - * @param prefix prefix before the random number. + * @param prefix file name prefix. * @param suffix file extension; include the '.'. * @param parentDir Directory to create the temporary file in; * java.io.tmpdir used if not specified. @@ -934,13 +929,52 @@ public class FileUtils { * * @return a File reference to the new temporary file. * @since Ant 1.7.1 + * @deprecated since Ant 1.10.8 use createTempFile(Project, String, String, File, + * boolean, boolean) instead. */ + @Deprecated public File createTempFile(String prefix, String suffix, File parentDir, boolean deleteOnExit, boolean createFile) { + return createTempFile(null, prefix, suffix, parentDir, deleteOnExit, createFile); + } + + private static final String NULL_PLACEHOLDER = "null"; + + /** + * Create a temporary file in a given directory. + * + *

The file denoted by the returned abstract pathname did not + * exist before this method was invoked, any subsequent invocation + * of this method will yield a different file name.

+ * + * @param project reference to the current Ant project. + * @param prefix file name prefix. + * @param suffix file extension; include the '.'. + * @param parentDir Directory to create the temporary file in; + * if not specified and {@code project} is not null then the value + * of the property {@code ant.tmpdir} is used if set; + * otherwise {@code java.io.tmpdir} is used. + * @param deleteOnExit whether to set the tempfile for deletion on + * normal VM exit. + * @param createFile true if the file must actually be created. If false + * chances exist that a file with the same name is created in the time + * between invoking this method and the moment the file is actually created. + * If possible set to true. + * + * @return a File reference to the new temporary file. + * @since Ant 1.9.15 + */ + public File createTempFile(final Project project, String prefix, String suffix, + final File parentDir, final boolean deleteOnExit, final boolean createFile) { File result; - String parent = (parentDir == null) - ? System.getProperty("java.io.tmpdir") - : parentDir.getPath(); + final String parent; + if (parentDir != null) { + parent = parentDir.getPath(); + } else if (project != null && project.getProperty(MagicNames.TMPDIR) != null) { + parent = project.getProperty(MagicNames.TMPDIR); + } else { + parent = System.getProperty("java.io.tmpdir"); + } if (prefix == null) { prefix = NULL_PLACEHOLDER; } @@ -980,12 +1014,8 @@ public class FileUtils { * this method was invoked, any subsequent invocation of this method will * yield a different file name. *

- *

- * The filename is prefixNNNNNsuffix where NNNN is a random number. - *

* - * @param prefix - * prefix before the random number. + * @param prefix file name prefix. * @param suffix * file extension; include the '.'. * @param parentDir @@ -994,7 +1024,7 @@ public class FileUtils { * @param deleteOnExit * whether to set the tempfile for deletion on normal VM exit. * - * @deprecated since ant 1.7.1 use createTempFile(String, String, File, + * @deprecated since ant 1.7.1 use createTempFile(Project, String, String, File, * boolean, boolean) instead. * @return a File reference to the new, nonexistent temporary file. */ diff --git a/src/main/org/apache/tools/ant/util/JavaEnvUtils.java b/src/main/org/apache/tools/ant/util/JavaEnvUtils.java index fe5a02498..899c714a9 100644 --- a/src/main/org/apache/tools/ant/util/JavaEnvUtils.java +++ b/src/main/org/apache/tools/ant/util/JavaEnvUtils.java @@ -542,7 +542,7 @@ public final class JavaEnvUtils { */ public static File createVmsJavaOptionFile(String[] cmds) throws IOException { - File script = FILE_UTILS.createTempFile("ANT", ".JAVA_OPTS", null, false, true); + File script = FILE_UTILS.createTempFile(null, "ANT", ".JAVA_OPTS", null, false, true); try (BufferedWriter out = new BufferedWriter(new FileWriter(script))) { for (String cmd : cmds) { out.write(cmd); diff --git a/src/main/org/apache/tools/ant/util/SymbolicLinkUtils.java b/src/main/org/apache/tools/ant/util/SymbolicLinkUtils.java index 30492aacc..7a5f7ed0a 100644 --- a/src/main/org/apache/tools/ant/util/SymbolicLinkUtils.java +++ b/src/main/org/apache/tools/ant/util/SymbolicLinkUtils.java @@ -22,6 +22,7 @@ import java.io.FileNotFoundException; import java.io.IOException; import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.Project; import org.apache.tools.ant.Task; import org.apache.tools.ant.taskdefs.Execute; @@ -240,9 +241,9 @@ public class SymbolicLinkUtils { if (task == null || target.getParentFile().canWrite()) { // rename the resource, thus breaking the link: - final File temp = FILE_UTILS.createTempFile("symlink", ".tmp", - target.getParentFile(), false, - false); + final Project project = task == null ? null : task.getProject(); + final File temp = FILE_UTILS.createTempFile(project, "symlink", ".tmp", + target.getParentFile(), false, false); if (FILE_UTILS.isLeadingPath(target, link)) { // link points to a parent directory, renaming the parent diff --git a/src/tests/junit/org/apache/tools/ant/util/FileUtilsTest.java b/src/tests/junit/org/apache/tools/ant/util/FileUtilsTest.java index 5f68b80db..fc584563d 100644 --- a/src/tests/junit/org/apache/tools/ant/util/FileUtilsTest.java +++ b/src/tests/junit/org/apache/tools/ant/util/FileUtilsTest.java @@ -29,6 +29,7 @@ import java.util.Optional; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.MagicTestNames; +import org.apache.tools.ant.Project; import org.apache.tools.ant.taskdefs.condition.Os; import org.junit.Before; import org.junit.Rule; @@ -355,9 +356,14 @@ public class FileUtilsTest { */ @Test public void testCreateTempFile() throws IOException { - // null parent dir - File tmp1 = getFileUtils().createTempFile("pre", ".suf", null, false, true); - String tmploc = System.getProperty("java.io.tmpdir"); + final String tmploc = System.getProperty("java.io.tmpdir"); + final Project projectWithoutTempDir = new Project(); + final Project projectWithTempDir = new Project(); + final File projectTmpDir = folder.newFolder("subdir"); + projectWithTempDir.setProperty("ant.tmpdir", projectTmpDir.getAbsolutePath()); + + // null parent dir, null project + File tmp1 = getFileUtils().createTempFile(null, "pre", ".suf", null, false, true); String name = tmp1.getName(); assertThat("starts with pre", name, startsWith("pre")); assertThat("ends with .suf", name, endsWith(".suf")); @@ -366,9 +372,29 @@ public class FileUtilsTest { tmp1.getAbsolutePath()); tmp1.delete(); + // null parent dir, project without magic property + tmp1 = getFileUtils().createTempFile(projectWithoutTempDir, "pre", ".suf", null, false, true); + name = tmp1.getName(); + assertTrue("starts with pre", name.startsWith("pre")); + assertTrue("ends with .suf", name.endsWith(".suf")); + assertTrue("File was created", tmp1.exists()); + assertEquals((new File(tmploc, tmp1.getName())).getAbsolutePath(), tmp1 + .getAbsolutePath()); + tmp1.delete(); + + // null parent dir, project with magic property + tmp1 = getFileUtils().createTempFile(projectWithTempDir, "pre", ".suf", null, false, true); + name = tmp1.getName(); + assertTrue("starts with pre", name.startsWith("pre")); + assertTrue("ends with .suf", name.endsWith(".suf")); + assertTrue("File was created", tmp1.exists()); + assertEquals((new File(projectTmpDir, tmp1.getName())).getAbsolutePath(), tmp1 + .getAbsolutePath()); + tmp1.delete(); + File dir2 = folder.newFolder("ant-test"); - File tmp2 = getFileUtils().createTempFile("pre", ".suf", dir2, true, true); + File tmp2 = getFileUtils().createTempFile(null, "pre", ".suf", dir2, true, true); String name2 = tmp2.getName(); assertThat("starts with pre", name2, startsWith("pre")); assertThat("ends with .suf", name2, endsWith(".suf")); @@ -377,6 +403,25 @@ public class FileUtilsTest { tmp2.getAbsolutePath()); tmp2.delete(); + tmp2 = getFileUtils().createTempFile(projectWithoutTempDir, "pre", ".suf", dir2, true, true); + name2 = tmp2.getName(); + assertTrue("starts with pre", name2.startsWith("pre")); + assertTrue("ends with .suf", name2.endsWith(".suf")); + assertTrue("File was created", tmp2.exists()); + assertEquals((new File(dir2, tmp2.getName())).getAbsolutePath(), tmp2 + .getAbsolutePath()); + tmp2.delete(); + + tmp2 = getFileUtils().createTempFile(projectWithTempDir, "pre", ".suf", dir2, true, true); + name2 = tmp2.getName(); + assertTrue("starts with pre", name2.startsWith("pre")); + assertTrue("ends with .suf", name2.endsWith(".suf")); + assertTrue("File was created", tmp2.exists()); + assertEquals((new File(dir2, tmp2.getName())).getAbsolutePath(), tmp2 + .getAbsolutePath()); + tmp2.delete(); + dir2.delete(); + File parent = new File((new File("/tmp")).getAbsolutePath()); tmp1 = getFileUtils().createTempFile("pre", ".suf", parent, false); assertFalse("new file", tmp1.exists()); @@ -388,13 +433,8 @@ public class FileUtilsTest { .getParent()); tmp2 = getFileUtils().createTempFile("pre", ".suf", parent, false); - assertNotEquals("files are different", tmp1.getAbsolutePath(), tmp2.getAbsolutePath()); - - // null parent dir - File tmp3 = getFileUtils().createTempFile("pre", ".suf", null, false); - tmploc = System.getProperty("java.io.tmpdir"); - assertEquals((new File(tmploc, tmp3.getName())).getAbsolutePath(), - tmp3.getAbsolutePath()); + assertTrue("files are different", !tmp1.getAbsolutePath().equals( + tmp2.getAbsolutePath())); } /**