| @@ -57,6 +57,9 @@ Other changes: | |||||
| * rmic has been removed from Java 15. The task will now throw an | * 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. | 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 | Changes from Ant 1.10.6 TO Ant 1.10.7 | ||||
| ===================================== | ===================================== | ||||
| @@ -39,6 +39,10 @@ how the inclusion/exclusion of files works, and how to write patterns.</p> | |||||
| attributes of <code><fileset></code> (<var>dir</var> becomes <var>basedir</var>) as well as | attributes of <code><fileset></code> (<var>dir</var> becomes <var>basedir</var>) as well as | ||||
| the nested <code><include></code>, <code><exclude></code> | the nested <code><include></code>, <code><exclude></code> | ||||
| and <code><patternset></code> elements.</p> | and <code><patternset></code> elements.</p> | ||||
| <p>On non-Unix platforms this task writes the list of files to archive | |||||
| to the <a href="../running.html#tmpdir">temporary directory</a>.</p> | |||||
| <h3>Parameters</h3> | <h3>Parameters</h3> | ||||
| <table class="attr"> | <table class="attr"> | ||||
| <tr> | <tr> | ||||
| @@ -31,6 +31,8 @@ execute <kbd>cvs.exe</kbd> from the command line in the target directory in whic | |||||
| Also note that this task assumes that the <kbd>cvs</kbd> executable is compatible with the Unix | Also note that this task assumes that the <kbd>cvs</kbd> executable is compatible with the Unix | ||||
| version, this is not completely true for certain other CVS clients—like CVSNT for | 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.</p> | example—and some operation may fail when using such an incompatible client.</p> | ||||
| <p>This task captures the output of the CVS command in a file inside of | |||||
| the <a href="../running.html#tmpdir">temporary directory</a>.</p> | |||||
| <h3>Parameters</h3> | <h3>Parameters</h3> | ||||
| <table class="attr"> | <table class="attr"> | ||||
| <tr> | <tr> | ||||
| @@ -1423,6 +1423,9 @@ the <code>ejbjar</code> task (for example, <var>basejarname</var>, <var>basename | |||||
| and <var>flatdestdir</var>) as well as the <code>iplanet</code> element (for | and <var>flatdestdir</var>) as well as the <code>iplanet</code> element (for | ||||
| example, <var>suffix</var>). Refer to the appropriate documentation for more details.</p> | example, <var>suffix</var>). Refer to the appropriate documentation for more details.</p> | ||||
| <p>This task creates a directory for scratch data inside of | |||||
| the <a href="../running.html#tmpdir">temporary directory</a>.</p> | |||||
| <h3>Parameters</h3> | <h3>Parameters</h3> | ||||
| <table class="attr"> | <table class="attr"> | ||||
| @@ -83,6 +83,8 @@ target="_top">OpenJDK build instructions for cygwin</a>.</p> | |||||
| <p>The command specified using <var>executable</var> and <code><arg></code> elements is | <p>The command specified using <var>executable</var> and <code><arg></code> elements is | ||||
| executed exactly as specified inside a temporary DCL script. This has some implications:</p> | executed exactly as specified inside a temporary DCL script. This has some implications:</p> | ||||
| <ul> | <ul> | ||||
| <li>the DCL script will be created inside | |||||
| the <a href="../running.html#tmpdir">temporary directory</a>.</li> | |||||
| <li>paths have to be written in VMS style</li> | <li>paths have to be written in VMS style</li> | ||||
| <li>if your <var>executable</var> points to a DCL script remember to prefix it with | <li>if your <var>executable</var> points to a DCL script remember to prefix it with | ||||
| an <q>@</q>-sign (e.g. <var>executable</var>=<q>@[FOO]BAR.COM</q>), just as you would in a DCL | an <q>@</q>-sign (e.g. <var>executable</var>=<q>@[FOO]BAR.COM</q>), just as you would in a DCL | ||||
| @@ -42,9 +42,14 @@ | |||||
| the nested <code><include></code>, <code><exclude></code> | the nested <code><include></code>, <code><exclude></code> | ||||
| and <code><patternset></code> elements.</p> | and <code><patternset></code> elements.</p> | ||||
| <p>The output file is only written if it is a new file, or if it differs from the existing file. | |||||
| This prevents spurious rebuilds based on unchanged files which have been regenerated by this | |||||
| task.</p> | |||||
| <p> | |||||
| The output file is only written if it is a new file, or 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 <a href="../running.html#tmpdir">temporary directory</a>. | |||||
| </p> | |||||
| <p><em>Since Apache Ant 1.7</em>, this task can be used in | <p><em>Since Apache Ant 1.7</em>, this task can be used in | ||||
| a <a href="../Types/filterchain.html">filterchain</a>.</p> | a <a href="../Types/filterchain.html">filterchain</a>.</p> | ||||
| @@ -129,7 +129,12 @@ connection.</p> | |||||
| <td>timediffauto</td> | <td>timediffauto</td> | ||||
| <td>set to <q>true</q> to make Ant calculate the time difference between client and | <td>set to <q>true</q> to make Ant calculate the time difference between client and | ||||
| server.<br/><em>requires write access in the remote directory</em><br/><em>Since Ant | server.<br/><em>requires write access in the remote directory</em><br/><em>Since Ant | ||||
| 1.6</em></td> | |||||
| 1.6</em><br/> | |||||
| If this is set to <code>true</code> then Ant will create an empty | |||||
| file inside of the <a href="../running.html#tmpdir">temporary | |||||
| directory</a> and transfer it to the remote server - deleting it on | |||||
| both sides once the difference has been determined. | |||||
| </td> | |||||
| <td>No</td> | <td>No</td> | ||||
| </tr> | </tr> | ||||
| <tr id="timestampGranularity"> | <tr id="timestampGranularity"> | ||||
| @@ -436,7 +436,10 @@ with the <var>exclude</var> patterns of the <code>packageset</code> (and vice ve | |||||
| nested <code>source</code> elements should be written to a temporary file to make the command | nested <code>source</code> elements should be written to a temporary file to make the command | ||||
| line shorter. Also applies to the package names specified via the <var>packagenames</var> | line shorter. Also applies to the package names specified via the <var>packagenames</var> | ||||
| attribute or nested <code>package</code> elements. <em>Since Ant 1.7.0</em>, also applies to | attribute or nested <code>package</code> elements. <em>Since Ant 1.7.0</em>, also applies to | ||||
| all the other command line options. (<q>yes|no</q>).</td> | |||||
| all the other command line options. (<q>yes|no</q>).<br/> | |||||
| If enabled, the file will be written to | |||||
| the <a href="../running.html#tmpdir">temporary | |||||
| directory</a>.</td> | |||||
| <td>all</td> | <td>all</td> | ||||
| <td>No; default is <q>no</q></td> | <td>No; default is <q>no</q></td> | ||||
| </tr> | </tr> | ||||
| @@ -28,8 +28,12 @@ | |||||
| <p><code>ReplaceRegExp</code> is a directory based task for replacing the occurrence of a given | <p><code>ReplaceRegExp</code> 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.</p> | regular expression with a substitution pattern in a selected file or set of files.</p> | ||||
| <p>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.</p> | |||||
| <p>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 <a href="../running.html#tmpdir">temporary | |||||
| directory</a>.</p> | |||||
| <p>Similar to <a href="../Types/mapper.html#regexp-mapper">regexp type mappers</a> this task needs a | <p>Similar to <a href="../Types/mapper.html#regexp-mapper">regexp type mappers</a> this task needs a | ||||
| supporting regular expression library and an implementation | supporting regular expression library and an implementation | ||||
| @@ -619,6 +619,10 @@ | |||||
| the <code><modified></code> selector tries to (<strong>attention!</strong>) copy the | the <code><modified></code> selector tries to (<strong>attention!</strong>) copy the | ||||
| content into a local file for computing the hashvalue.</p> | content into a local file for computing the hashvalue.</p> | ||||
| <p>If the source resource is not a filesystem resource the | |||||
| modified selector will download it to | |||||
| the <a href="../running.html#tmpdir">temporary directory</a>.</p> | |||||
| <table class="attr"> | <table class="attr"> | ||||
| <tr> | <tr> | ||||
| <th scope="col">Attribute</th> | <th scope="col">Attribute</th> | ||||
| @@ -460,6 +460,22 @@ And I filtered out the <code>getPropertyHelper</code> access.</p> | |||||
| <td><code>ant.tstamp.now.iso</code></td> | <td><code>ant.tstamp.now.iso</code></td> | ||||
| <td>ISO-8601 timestamp string like <code>1972-04-17T08:07:00Z</code></td> | <td>ISO-8601 timestamp string like <code>1972-04-17T08:07:00Z</code></td> | ||||
| </tr> | </tr> | ||||
| <tr> | |||||
| <td><code>java.io.tmpdir</code></td> | |||||
| <td>Some 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.<br/> | |||||
| See also <a href="#tmpdir">Temporary Directories</a>.</td> | |||||
| </table> | |||||
| <tr> | |||||
| <td><code>ant.tmpdir</code></td> | |||||
| <td><em>Since Ant 1.10.8</em><br/> | |||||
| Some tasks need to create temporary files and will write them to | |||||
| the directory specified by this property. This property takes | |||||
| precedence over <code>java.io.tmpdir</code> if it has been | |||||
| set. Unlike <code>java.io.tmpdir</code> this property can be set | |||||
| from within the build file.<br/> | |||||
| See also <a href="#tmpdir">Temporary Directories</a>.</td> | |||||
| </table> | </table> | ||||
| <p> | <p> | ||||
| @@ -477,6 +493,37 @@ return code of the <code>java</code> program. So a successful build | |||||
| returns <q>0</q>, failed builds return other values. | returns <q>0</q>, failed builds return other values. | ||||
| </p> | </p> | ||||
| <h2 id="tmpdir">Temporary Directories</h2> | |||||
| 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 <code>java.io.tmpdir</code>. The default value of it depends | |||||
| on the platform and the JVM implementation.</p> | |||||
| <p>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 <code>ant(.cmd)</code> wrapper scripts you can do so with the | |||||
| help of the <code>ANT_OPTS</code> environment variable.</p> | |||||
| <p>Starting with Ant 1.10.8 we've introduced a new Ant | |||||
| property <code>ant.tmpdir</code> that takes precedence | |||||
| over <code>java.io.tmpdir</code> when set. As this is a normal Ant | |||||
| property it can be set via the command line or even from within a | |||||
| build file.</p> | |||||
| <p>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.</p> | |||||
| <p>Tasks not provided with the Ant distribution will ignore | |||||
| the <code>ant.tmpdir</code> property and | |||||
| use <code>java.io.tmpdir</code> unless they have been adapted to the | |||||
| changed API of Ant 1.10.8.</p> | |||||
| <h2 id="cygwin">Cygwin Users</h2> | <h2 id="cygwin">Cygwin Users</h2> | ||||
| <p> | <p> | ||||
| Unix launch script that come with Ant works correctly with Cygwin. You | Unix launch script that come with Ant works correctly with Cygwin. You | ||||
| @@ -489,7 +536,6 @@ task, executable names such as <q>/bin/sh</q> will not work, even | |||||
| though these work from the Cygwin shell from which Ant was | though these work from the Cygwin shell from which Ant was | ||||
| launched. You can use an executable name such as <q>sh</q> and rely on | launched. You can use an executable name such as <q>sh</q> and rely on | ||||
| that command being available in the Windows path. | that command being available in the Windows path. | ||||
| </p> | |||||
| <h2 id="os2">OS/2 Users</h2> | <h2 id="os2">OS/2 Users</h2> | ||||
| <p> | <p> | ||||
| @@ -322,5 +322,13 @@ public final class MagicNames { | |||||
| */ | */ | ||||
| public static final String TSTAMP_NOW_ISO = "ant.tstamp.now.iso"; | 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"; | |||||
| } | } | ||||
| @@ -354,7 +354,7 @@ public class FixCRLF extends MatchingTask implements ChainableReader { | |||||
| fcv = new Vector<>(1); | fcv = new Vector<>(1); | ||||
| fcv.add(fc); | fcv.add(fc); | ||||
| } | } | ||||
| File tmpFile = FILE_UTILS.createTempFile("fixcrlf", "", null, true, true); | |||||
| File tmpFile = FILE_UTILS.createTempFile(getProject(), "fixcrlf", "", null, true, true); | |||||
| try { | try { | ||||
| FILE_UTILS.copyFile(srcFile, tmpFile, null, fcv, true, false, | FILE_UTILS.copyFile(srcFile, tmpFile, null, fcv, true, false, | ||||
| encoding, outputEncoding == null ? encoding : outputEncoding, | encoding, outputEncoding == null ? encoding : outputEncoding, | ||||
| @@ -1868,7 +1868,7 @@ public class Javadoc extends Task { | |||||
| */ | */ | ||||
| BufferedWriter srcListWriter = null; | BufferedWriter srcListWriter = null; | ||||
| if (useExternalFile) { | if (useExternalFile) { | ||||
| tmpList = FILE_UTILS.createTempFile("javadoc", "", null, true, true); | |||||
| tmpList = FILE_UTILS.createTempFile(getProject(), "javadoc", "", null, true, true); | |||||
| toExecute.createArgument() | toExecute.createArgument() | ||||
| .setValue("@" + tmpList.getAbsolutePath()); | .setValue("@" + tmpList.getAbsolutePath()); | ||||
| wr = new FileWriter(tmpList.getAbsolutePath(), true); | wr = new FileWriter(tmpList.getAbsolutePath(), true); | ||||
| @@ -2049,7 +2049,7 @@ public class Javadoc extends Task { | |||||
| File optionsTmpFile = null; | File optionsTmpFile = null; | ||||
| try { | try { | ||||
| optionsTmpFile = FILE_UTILS.createTempFile( | optionsTmpFile = FILE_UTILS.createTempFile( | ||||
| "javadocOptions", "", null, true, true); | |||||
| getProject(), "javadocOptions", "", null, true, true); | |||||
| final String[] listOpt = toExecute.getArguments(); | final String[] listOpt = toExecute.getArguments(); | ||||
| toExecute.clearArgs(); | toExecute.clearArgs(); | ||||
| toExecute.createArgument().setValue( | toExecute.createArgument().setValue( | ||||
| @@ -81,7 +81,7 @@ public class Jikes { | |||||
| // Windows has a 32k limit on total arg size, so | // Windows has a 32k limit on total arg size, so | ||||
| // create a temporary file to store all the arguments | // create a temporary file to store all the arguments | ||||
| if (Os.isFamily(Os.FAMILY_WINDOWS) && args.length > MAX_FILES_ON_COMMAND_LINE) { | 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); | "tmp", null, false, true); | ||||
| try (BufferedWriter out = new BufferedWriter(new FileWriter(tmpFile))) { | try (BufferedWriter out = new BufferedWriter(new FileWriter(tmpFile))) { | ||||
| for (String arg : args) { | for (String arg : args) { | ||||
| @@ -649,7 +649,7 @@ public class Replace extends MatchingTask { | |||||
| logFilterChain(src.getPath()); | logFilterChain(src.getPath()); | ||||
| try { | try { | ||||
| File temp = FILE_UTILS.createTempFile("rep", ".tmp", | |||||
| File temp = FILE_UTILS.createTempFile(getProject(), "rep", ".tmp", | |||||
| src.getParentFile(), false, true); | src.getParentFile(), false, true); | ||||
| try { | try { | ||||
| try (FileInput in = new FileInput(src); | try (FileInput in = new FileInput(src); | ||||
| @@ -154,7 +154,7 @@ public class TempFile extends Task { | |||||
| if (destDir == null) { | if (destDir == null) { | ||||
| destDir = getProject().resolveFile("."); | destDir = getProject().resolveFile("."); | ||||
| } | } | ||||
| File tfile = FILE_UTILS.createTempFile(prefix, suffix, destDir, | |||||
| File tfile = FILE_UTILS.createTempFile(getProject(), prefix, suffix, destDir, | |||||
| deleteOnExit, createFile); | deleteOnExit, createFile); | ||||
| getProject().setNewProperty(property, tfile.toString()); | getProject().setNewProperty(property, tfile.toString()); | ||||
| } | } | ||||
| @@ -800,7 +800,7 @@ public class Zip extends MatchingTask { | |||||
| /** rename the zip file. */ | /** rename the zip file. */ | ||||
| private File renameFile() { | private File renameFile() { | ||||
| final File renamedFile = FILE_UTILS.createTempFile( | final File renamedFile = FILE_UTILS.createTempFile( | ||||
| "zip", ".tmp", zipFile.getParentFile(), true, false); | |||||
| getProject(), "zip", ".tmp", zipFile.getParentFile(), true, false); | |||||
| try { | try { | ||||
| FILE_UTILS.rename(zipFile, renamedFile); | FILE_UTILS.rename(zipFile, renamedFile); | ||||
| } catch (final SecurityException | IOException e) { | } catch (final SecurityException | IOException e) { | ||||
| @@ -545,7 +545,7 @@ public abstract class DefaultCompilerAdapter | |||||
| && firstFileName >= 0) { | && firstFileName >= 0) { | ||||
| try { | try { | ||||
| tmpFile = FILE_UTILS.createTempFile( | tmpFile = FILE_UTILS.createTempFile( | ||||
| "files", "", getJavac().getTempdir(), true, true); | |||||
| getProject(), "files", "", getJavac().getTempdir(), true, true); | |||||
| try (BufferedWriter out = | try (BufferedWriter out = | ||||
| new BufferedWriter(new FileWriter(tmpFile))) { | new BufferedWriter(new FileWriter(tmpFile))) { | ||||
| for (int i = firstFileName; i < args.length; i++) { | for (int i = firstFileName; i < args.length; i++) { | ||||
| @@ -260,7 +260,7 @@ public class CvsTagDiff extends AbstractCvsTask { | |||||
| try { | try { | ||||
| handlePackageNames(); | handlePackageNames(); | ||||
| tmpFile = FILE_UTILS.createTempFile("cvstagdiff", ".log", null, | |||||
| tmpFile = FILE_UTILS.createTempFile(getProject(), "cvstagdiff", ".log", null, | |||||
| true, true); | true, true); | ||||
| setOutput(tmpFile); | setOutput(tmpFile); | ||||
| @@ -48,7 +48,7 @@ public class VmsCommandLauncher extends Java13CommandLauncher { | |||||
| @Override | @Override | ||||
| public Process exec(Project project, String[] cmd, String[] env) | public Process exec(Project project, String[] cmd, String[] env) | ||||
| throws IOException { | throws IOException { | ||||
| File cmdFile = createCommandFile(cmd, env); | |||||
| File cmdFile = createCommandFile(project, cmd, env); | |||||
| Process p = | Process p = | ||||
| super.exec(project, new String[] {cmdFile.getPath()}, env); | super.exec(project, new String[] {cmdFile.getPath()}, env); | ||||
| deleteAfter(cmdFile, p); | deleteAfter(cmdFile, p); | ||||
| @@ -76,7 +76,7 @@ public class VmsCommandLauncher extends Java13CommandLauncher { | |||||
| @Override | @Override | ||||
| public Process exec(Project project, String[] cmd, String[] env, | public Process exec(Project project, String[] cmd, String[] env, | ||||
| File workingDir) throws IOException { | 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, | Process p = super.exec(project, new String[] {cmdFile.getPath()}, env, | ||||
| workingDir); | workingDir); | ||||
| deleteAfter(cmdFile, p); | deleteAfter(cmdFile, p); | ||||
| @@ -91,9 +91,9 @@ public class VmsCommandLauncher extends Java13CommandLauncher { | |||||
| * @return the command File. | * @return the command File. | ||||
| * @throws IOException if errors are encountered creating the 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 { | 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))) { | try (BufferedWriter out = new BufferedWriter(new FileWriter(script))) { | ||||
| // add the environment as logicals to the DCL script | // add the environment as logicals to the DCL script | ||||
| @@ -173,7 +173,7 @@ public class Cab extends MatchingTask { | |||||
| */ | */ | ||||
| protected File createListFile(Vector<String> files) | protected File createListFile(Vector<String> files) | ||||
| throws IOException { | throws IOException { | ||||
| File listFile = FILE_UTILS.createTempFile("ant", "", null, true, true); | |||||
| File listFile = FILE_UTILS.createTempFile(getProject(), "ant", "", null, true, true); | |||||
| try (BufferedWriter writer = | try (BufferedWriter writer = | ||||
| new BufferedWriter(new FileWriter(listFile))) { | new BufferedWriter(new FileWriter(listFile))) { | ||||
| @@ -301,7 +301,7 @@ public class Cab extends MatchingTask { | |||||
| exec.setDir(baseDir); | exec.setDir(baseDir); | ||||
| if (!doVerbose) { | if (!doVerbose) { | ||||
| outFile = FILE_UTILS.createTempFile("ant", "", null, true, true); | |||||
| outFile = FILE_UTILS.createTempFile(getProject(), "ant", "", null, true, true); | |||||
| exec.setOutput(outFile); | exec.setOutput(outFile); | ||||
| } | } | ||||
| @@ -350,7 +350,7 @@ public class ReplaceRegExp extends Task { | |||||
| */ | */ | ||||
| protected void doReplace(File f, int options) | protected void doReplace(File f, int options) | ||||
| throws IOException { | throws IOException { | ||||
| File temp = FILE_UTILS.createTempFile("replace", ".txt", null, true, true); | |||||
| File temp = FILE_UTILS.createTempFile(getProject(), "replace", ".txt", null, true, true); | |||||
| try { | try { | ||||
| boolean changes = false; | boolean changes = false; | ||||
| @@ -1427,7 +1427,7 @@ public class JUnitTask extends Task { | |||||
| * @return created file | * @return created file | ||||
| */ | */ | ||||
| private File createTempPropertiesFile(final String prefix) { | 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); | tmpDir != null ? tmpDir : getProject().getBaseDir(), true, true); | ||||
| } | } | ||||
| @@ -2058,7 +2058,7 @@ public class FTP extends Task implements FTPTaskConfig { | |||||
| FTPFile[] files = null; | FTPFile[] files = null; | ||||
| final int maxIterations = 1000; | final int maxIterations = 1000; | ||||
| for (int counter = 1; counter < maxIterations; counter++) { | for (int counter = 1; counter < maxIterations; counter++) { | ||||
| File localFile = FILE_UTILS.createTempFile( | |||||
| File localFile = FILE_UTILS.createTempFile(getProject(), | |||||
| "ant" + Integer.toString(counter), ".tmp", | "ant" + Integer.toString(counter), ".tmp", | ||||
| null, false, false); | null, false, false); | ||||
| String fileName = localFile.getName(); | String fileName = localFile.getName(); | ||||
| @@ -1371,7 +1371,7 @@ public class FTPTaskMirrorImpl implements FTPTaskMirror { | |||||
| FTPFile[] files = null; | FTPFile[] files = null; | ||||
| final int maxIterations = 1000; | final int maxIterations = 1000; | ||||
| for (int counter = 1; counter < maxIterations; counter++) { | for (int counter = 1; counter < maxIterations; counter++) { | ||||
| File localFile = FILE_UTILS.createTempFile( | |||||
| File localFile = FILE_UTILS.createTempFile(task.getProject(), | |||||
| "ant" + Integer.toString(counter), ".tmp", | "ant" + Integer.toString(counter), ".tmp", | ||||
| null, false, false); | null, false, false); | ||||
| String fileName = localFile.getName(); | String fileName = localFile.getName(); | ||||
| @@ -446,7 +446,7 @@ public class ModifiedSelector extends BaseExtendSelector | |||||
| // How to handle non-file-Resources? I copy temporarily the | // How to handle non-file-Resources? I copy temporarily the | ||||
| // resource to a file and use the file-implementation. | // resource to a file and use the file-implementation. | ||||
| FileUtils fu = FileUtils.getFileUtils(); | 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); | Resource tmpResource = new FileResource(tmpFile); | ||||
| ResourceUtils.copyResource(resource, tmpResource); | ResourceUtils.copyResource(resource, tmpResource); | ||||
| boolean isSelected = isSelected(tmpFile.getParentFile(), | boolean isSelected = isSelected(tmpFile.getParentFile(), | ||||
| @@ -50,6 +50,7 @@ import java.util.jar.JarFile; | |||||
| import java.util.stream.Collectors; | import java.util.stream.Collectors; | ||||
| import org.apache.tools.ant.BuildException; | import org.apache.tools.ant.BuildException; | ||||
| import org.apache.tools.ant.MagicNames; | |||||
| import org.apache.tools.ant.PathTokenizer; | import org.apache.tools.ant.PathTokenizer; | ||||
| import org.apache.tools.ant.Project; | import org.apache.tools.ant.Project; | ||||
| import org.apache.tools.ant.launch.Locator; | 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 | * this method was invoked, any subsequent invocation of this method will | ||||
| * yield a different file name. | * yield a different file name. | ||||
| * </p> | * </p> | ||||
| * <p> | |||||
| * The filename is prefixNNNNNsuffix where NNNN is a random number. | |||||
| * </p> | |||||
| * | * | ||||
| * @param prefix | |||||
| * prefix before the random number. | |||||
| * @param prefix file name prefix. | |||||
| * @param suffix | * @param suffix | ||||
| * file extension; include the '.'. | * file extension; include the '.'. | ||||
| * @param parentDir | * @param parentDir | ||||
| * Directory to create the temporary file in; java.io.tmpdir used | * Directory to create the temporary file in; java.io.tmpdir used | ||||
| * if not specified. | * 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. | * boolean, boolean) instead. | ||||
| * @return a File reference to the new, nonexistent temporary file. | * @return a File reference to the new, nonexistent temporary file. | ||||
| */ | */ | ||||
| @@ -912,8 +909,6 @@ public class FileUtils { | |||||
| return createTempFile(prefix, suffix, parentDir, false, false); | return createTempFile(prefix, suffix, parentDir, false, false); | ||||
| } | } | ||||
| private static final String NULL_PLACEHOLDER = "null"; | |||||
| /** | /** | ||||
| * Create a temporary file in a given directory. | * Create a temporary file in a given directory. | ||||
| * | * | ||||
| @@ -921,7 +916,7 @@ public class FileUtils { | |||||
| * exist before this method was invoked, any subsequent invocation | * exist before this method was invoked, any subsequent invocation | ||||
| * of this method will yield a different file name.</p> | * of this method will yield a different file name.</p> | ||||
| * | * | ||||
| * @param prefix prefix before the random number. | |||||
| * @param prefix file name prefix. | |||||
| * @param suffix file extension; include the '.'. | * @param suffix file extension; include the '.'. | ||||
| * @param parentDir Directory to create the temporary file in; | * @param parentDir Directory to create the temporary file in; | ||||
| * java.io.tmpdir used if not specified. | * java.io.tmpdir used if not specified. | ||||
| @@ -934,13 +929,52 @@ public class FileUtils { | |||||
| * | * | ||||
| * @return a File reference to the new temporary file. | * @return a File reference to the new temporary file. | ||||
| * @since Ant 1.7.1 | * @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, | public File createTempFile(String prefix, String suffix, File parentDir, | ||||
| boolean deleteOnExit, boolean createFile) { | 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. | |||||
| * | |||||
| * <p>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.</p> | |||||
| * | |||||
| * @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; | 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) { | if (prefix == null) { | ||||
| prefix = NULL_PLACEHOLDER; | prefix = NULL_PLACEHOLDER; | ||||
| } | } | ||||
| @@ -980,12 +1014,8 @@ public class FileUtils { | |||||
| * this method was invoked, any subsequent invocation of this method will | * this method was invoked, any subsequent invocation of this method will | ||||
| * yield a different file name. | * yield a different file name. | ||||
| * </p> | * </p> | ||||
| * <p> | |||||
| * The filename is prefixNNNNNsuffix where NNNN is a random number. | |||||
| * </p> | |||||
| * | * | ||||
| * @param prefix | |||||
| * prefix before the random number. | |||||
| * @param prefix file name prefix. | |||||
| * @param suffix | * @param suffix | ||||
| * file extension; include the '.'. | * file extension; include the '.'. | ||||
| * @param parentDir | * @param parentDir | ||||
| @@ -994,7 +1024,7 @@ public class FileUtils { | |||||
| * @param deleteOnExit | * @param deleteOnExit | ||||
| * whether to set the tempfile for deletion on normal VM exit. | * 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. | * boolean, boolean) instead. | ||||
| * @return a File reference to the new, nonexistent temporary file. | * @return a File reference to the new, nonexistent temporary file. | ||||
| */ | */ | ||||
| @@ -542,7 +542,7 @@ public final class JavaEnvUtils { | |||||
| */ | */ | ||||
| public static File createVmsJavaOptionFile(String[] cmds) | public static File createVmsJavaOptionFile(String[] cmds) | ||||
| throws IOException { | 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))) { | try (BufferedWriter out = new BufferedWriter(new FileWriter(script))) { | ||||
| for (String cmd : cmds) { | for (String cmd : cmds) { | ||||
| out.write(cmd); | out.write(cmd); | ||||
| @@ -22,6 +22,7 @@ import java.io.FileNotFoundException; | |||||
| import java.io.IOException; | import java.io.IOException; | ||||
| import org.apache.tools.ant.BuildException; | import org.apache.tools.ant.BuildException; | ||||
| import org.apache.tools.ant.Project; | |||||
| import org.apache.tools.ant.Task; | import org.apache.tools.ant.Task; | ||||
| import org.apache.tools.ant.taskdefs.Execute; | import org.apache.tools.ant.taskdefs.Execute; | ||||
| @@ -240,9 +241,9 @@ public class SymbolicLinkUtils { | |||||
| if (task == null || target.getParentFile().canWrite()) { | if (task == null || target.getParentFile().canWrite()) { | ||||
| // rename the resource, thus breaking the link: | // 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)) { | if (FILE_UTILS.isLeadingPath(target, link)) { | ||||
| // link points to a parent directory, renaming the parent | // link points to a parent directory, renaming the parent | ||||
| @@ -29,6 +29,7 @@ import java.util.Optional; | |||||
| import org.apache.tools.ant.BuildException; | import org.apache.tools.ant.BuildException; | ||||
| import org.apache.tools.ant.MagicTestNames; | import org.apache.tools.ant.MagicTestNames; | ||||
| import org.apache.tools.ant.Project; | |||||
| import org.apache.tools.ant.taskdefs.condition.Os; | import org.apache.tools.ant.taskdefs.condition.Os; | ||||
| import org.junit.Before; | import org.junit.Before; | ||||
| import org.junit.Rule; | import org.junit.Rule; | ||||
| @@ -355,9 +356,14 @@ public class FileUtilsTest { | |||||
| */ | */ | ||||
| @Test | @Test | ||||
| public void testCreateTempFile() throws IOException { | 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(); | String name = tmp1.getName(); | ||||
| assertThat("starts with pre", name, startsWith("pre")); | assertThat("starts with pre", name, startsWith("pre")); | ||||
| assertThat("ends with .suf", name, endsWith(".suf")); | assertThat("ends with .suf", name, endsWith(".suf")); | ||||
| @@ -366,9 +372,29 @@ public class FileUtilsTest { | |||||
| tmp1.getAbsolutePath()); | tmp1.getAbsolutePath()); | ||||
| tmp1.delete(); | 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 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(); | String name2 = tmp2.getName(); | ||||
| assertThat("starts with pre", name2, startsWith("pre")); | assertThat("starts with pre", name2, startsWith("pre")); | ||||
| assertThat("ends with .suf", name2, endsWith(".suf")); | assertThat("ends with .suf", name2, endsWith(".suf")); | ||||
| @@ -377,6 +403,25 @@ public class FileUtilsTest { | |||||
| tmp2.getAbsolutePath()); | tmp2.getAbsolutePath()); | ||||
| tmp2.delete(); | 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()); | File parent = new File((new File("/tmp")).getAbsolutePath()); | ||||
| tmp1 = getFileUtils().createTempFile("pre", ".suf", parent, false); | tmp1 = getFileUtils().createTempFile("pre", ".suf", parent, false); | ||||
| assertFalse("new file", tmp1.exists()); | assertFalse("new file", tmp1.exists()); | ||||
| @@ -388,13 +433,8 @@ public class FileUtilsTest { | |||||
| .getParent()); | .getParent()); | ||||
| tmp2 = getFileUtils().createTempFile("pre", ".suf", parent, false); | 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())); | |||||
| } | } | ||||
| /** | /** | ||||