git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@722967 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -586,6 +586,10 @@ Other changes: | |||||
| as nested element of <zip> and friends. | as nested element of <zip> and friends. | ||||
| Bugzilla Report 46257. | Bugzilla Report 46257. | ||||
| * <dependset> has a new verbose attribute that makes the task list | |||||
| all deleted targets and give a hint as to why it deleted them. | |||||
| Bugzilla Report 13681. | |||||
| Changes from Ant 1.7.0 TO Ant 1.7.1 | Changes from Ant 1.7.0 TO Ant 1.7.1 | ||||
| ============================================= | ============================================= | ||||
| @@ -59,9 +59,19 @@ well as other stylesheets imported by the main stylesheet. | |||||
| <h3>Parameters</h3> | <h3>Parameters</h3> | ||||
| <p> | |||||
| (none) | |||||
| </p> | |||||
| <table border="1" cellpadding="2" cellspacing="0"> | |||||
| <tr> | |||||
| <td valign="top"><b>Attribute</b></td> | |||||
| <td valign="top"><b>Description</b></td> | |||||
| <td valign="top" align="center"><b>Required</b></td> | |||||
| </tr> | |||||
| <tr> | |||||
| <td valign="top">verbose</td> | |||||
| <td valign="top">Makes the task list all deleted targets files | |||||
| and the reason why they get deleted.</td> | |||||
| <td align="center" valign="top" rowspan="2">No</td> | |||||
| </tr> | |||||
| </table> | |||||
| <h3>Parameters Specified as Nested Elements</h3> | <h3>Parameters Specified as Nested Elements</h3> | ||||
| @@ -19,6 +19,7 @@ | |||||
| package org.apache.tools.ant.taskdefs; | package org.apache.tools.ant.taskdefs; | ||||
| import java.io.File; | import java.io.File; | ||||
| import java.util.Date; | |||||
| import java.util.Iterator; | import java.util.Iterator; | ||||
| import org.apache.tools.ant.BuildException; | import org.apache.tools.ant.BuildException; | ||||
| import org.apache.tools.ant.Project; | import org.apache.tools.ant.Project; | ||||
| @@ -119,6 +120,8 @@ public class DependSet extends MatchingTask { | |||||
| private Union sources = null; | private Union sources = null; | ||||
| private Path targets = null; | private Path targets = null; | ||||
| private boolean verbose; | |||||
| /** | /** | ||||
| * Create a nested sources element. | * Create a nested sources element. | ||||
| * @return a Union instance. | * @return a Union instance. | ||||
| @@ -169,6 +172,19 @@ public class DependSet extends MatchingTask { | |||||
| createTargets().add(fl); | createTargets().add(fl); | ||||
| } | } | ||||
| /** | |||||
| * In verbose mode missing targets and sources as well as the | |||||
| * modification times of the newest source and latest target will | |||||
| * be logged as info. | |||||
| * | |||||
| * <p>All deleted files will be logged as well.</p> | |||||
| * | |||||
| * @since Ant 1.8.0 | |||||
| */ | |||||
| public void setVerbose(boolean b) { | |||||
| verbose = b; | |||||
| } | |||||
| /** | /** | ||||
| * Execute the task. | * Execute the task. | ||||
| * @throws BuildException if errors occur. | * @throws BuildException if errors occur. | ||||
| @@ -185,6 +201,12 @@ public class DependSet extends MatchingTask { | |||||
| //no sources = nothing to compare; no targets = nothing to delete: | //no sources = nothing to compare; no targets = nothing to delete: | ||||
| if (sources.size() > 0 && targets.size() > 0 && !uptodate(sources, targets)) { | if (sources.size() > 0 && targets.size() > 0 && !uptodate(sources, targets)) { | ||||
| log("Deleting all target files.", Project.MSG_VERBOSE); | log("Deleting all target files.", Project.MSG_VERBOSE); | ||||
| if (verbose) { | |||||
| String[] t = targets.list(); | |||||
| for (int i = 0; i < t.length; i++) { | |||||
| log("Deleting " + t[i]); | |||||
| } | |||||
| } | |||||
| Delete delete = new Delete(); | Delete delete = new Delete(); | ||||
| delete.bindToOwner(this); | delete.bindToOwner(this); | ||||
| delete.add(targets); | delete.add(targets); | ||||
| @@ -202,23 +224,27 @@ public class DependSet extends MatchingTask { | |||||
| datesel.setGranularity(0); | datesel.setGranularity(0); | ||||
| logFuture(targets, datesel); | logFuture(targets, datesel); | ||||
| int neTargets = new NonExistent(targets).size(); | |||||
| NonExistent missingTargets = new NonExistent(targets); | |||||
| int neTargets = missingTargets.size(); | |||||
| if (neTargets > 0) { | if (neTargets > 0) { | ||||
| log(neTargets + " nonexistent targets", Project.MSG_VERBOSE); | log(neTargets + " nonexistent targets", Project.MSG_VERBOSE); | ||||
| logMissing(missingTargets, "target"); | |||||
| return false; | return false; | ||||
| } | } | ||||
| Resource oldestTarget = getOldest(targets); | Resource oldestTarget = getOldest(targets); | ||||
| log(oldestTarget + " is oldest target file", Project.MSG_VERBOSE); | |||||
| logWithModificationTime(oldestTarget, "oldest target file"); | |||||
| logFuture(sources, datesel); | logFuture(sources, datesel); | ||||
| int neSources = new NonExistent(sources).size(); | |||||
| NonExistent missingSources = new NonExistent(sources); | |||||
| int neSources = missingSources.size(); | |||||
| if (neSources > 0) { | if (neSources > 0) { | ||||
| log(neSources + " nonexistent sources", Project.MSG_VERBOSE); | log(neSources + " nonexistent sources", Project.MSG_VERBOSE); | ||||
| logMissing(missingSources, "source"); | |||||
| return false; | return false; | ||||
| } | } | ||||
| Resource newestSource = (Resource) getNewest(sources); | Resource newestSource = (Resource) getNewest(sources); | ||||
| log(newestSource.toLongString() + " is newest source", Project.MSG_VERBOSE); | |||||
| logWithModificationTime(newestSource, "newest source"); | |||||
| return oldestTarget.getLastModified() >= newestSource.getLastModified(); | return oldestTarget.getLastModified() >= newestSource.getLastModified(); | ||||
| } | } | ||||
| @@ -255,4 +281,18 @@ public class DependSet extends MatchingTask { | |||||
| return getXest(rc, DATE); | return getXest(rc, DATE); | ||||
| } | } | ||||
| private void logWithModificationTime(Resource r, String what) { | |||||
| log(r.toLongString() + " is " + what + ", modified at " | |||||
| + new Date(r.getLastModified()), | |||||
| verbose ? Project.MSG_INFO : Project.MSG_VERBOSE); | |||||
| } | |||||
| private void logMissing(ResourceCollection missing, String what) { | |||||
| if (verbose) { | |||||
| for (Iterator i = missing.iterator(); i.hasNext(); ) { | |||||
| Resource r = (Resource) i.next(); | |||||
| log("Expected " + what + " " + r.toLongString() + " is missing."); | |||||
| } | |||||
| } | |||||
| } | |||||
| } | } | ||||
| @@ -54,6 +54,8 @@ | |||||
| <srcfilelist dir="${input}" files="test4.tmp" /> | <srcfilelist dir="${input}" files="test4.tmp" /> | ||||
| <targetfileset id="targetfs" dir="${output}" includes="i-do-not-exist" /> | <targetfileset id="targetfs" dir="${output}" includes="i-do-not-exist" /> | ||||
| </dependset> | </dependset> | ||||
| <au:assertLogDoesntContain text="Deleting all target files." | |||||
| level="verbose"/> | |||||
| </target> | </target> | ||||
| <target name="testMoreRecentSourceFile" depends="setUp"> | <target name="testMoreRecentSourceFile" depends="setUp"> | ||||
| @@ -64,6 +66,12 @@ | |||||
| <srcfilelist dir="${input}" files="newer.tmp" /> | <srcfilelist dir="${input}" files="newer.tmp" /> | ||||
| <targetfilelist dir="${output}" files="older.tmp" /> | <targetfilelist dir="${output}" files="older.tmp" /> | ||||
| </dependset> | </dependset> | ||||
| <!--au:assertLogContains text="older.tmp" is oldest target file" | |||||
| level="verbose"/--> | |||||
| <au:assertLogContains text="newer.tmp" is newest source" | |||||
| level="verbose"/> | |||||
| <au:assertLogContains text="Deleting all target files." | |||||
| level="verbose"/> | |||||
| <au:assertFileDoesntExist file="${output}/older.tmp"/> | <au:assertFileDoesntExist file="${output}/older.tmp"/> | ||||
| </target> | </target> | ||||
| @@ -82,6 +90,12 @@ | |||||
| <filelist dir="${output}/" files="targetset_1.tmp,targetset_2.tmp" /> | <filelist dir="${output}/" files="targetset_1.tmp,targetset_2.tmp" /> | ||||
| </targets> | </targets> | ||||
| </dependset> | </dependset> | ||||
| <!--au:assertLogContains text="targetset_1" is oldest target file" | |||||
| level="verbose"/--> | |||||
| <au:assertLogContains text="sourceset_2.tmp" is newest source" | |||||
| level="verbose"/> | |||||
| <au:assertLogContains text="Deleting all target files." | |||||
| level="verbose"/> | |||||
| <au:assertFileDoesntExist file="${output}/targetset_1.tmp" /> | <au:assertFileDoesntExist file="${output}/targetset_1.tmp" /> | ||||
| <au:assertFileDoesntExist file="${output}/targetset_2.tmp" /> | <au:assertFileDoesntExist file="${output}/targetset_2.tmp" /> | ||||
| </target> | </target> | ||||
| @@ -96,6 +110,10 @@ | |||||
| <filelist dir="${output}" files="older.tmp" /> | <filelist dir="${output}" files="older.tmp" /> | ||||
| </targets> | </targets> | ||||
| </dependset> | </dependset> | ||||
| <au:assertLogContains text="1 nonexistent sources" | |||||
| level="verbose"/> | |||||
| <au:assertLogContains text="Deleting all target files." | |||||
| level="verbose"/> | |||||
| <au:assertFileDoesntExist file="${output}/older.tmp" /> | <au:assertFileDoesntExist file="${output}/older.tmp" /> | ||||
| </target> | </target> | ||||
| @@ -110,6 +128,8 @@ | |||||
| <filelist dir="${output}" files="older.tmp" /> | <filelist dir="${output}" files="older.tmp" /> | ||||
| </targets> | </targets> | ||||
| </dependset> | </dependset> | ||||
| <au:assertLogDoesntContain text="Deleting all target files." | |||||
| level="verbose"/> | |||||
| <au:assertFileExists file="${output}/older.tmp" /> | <au:assertFileExists file="${output}/older.tmp" /> | ||||
| </target> | </target> | ||||
| @@ -122,6 +142,8 @@ | |||||
| <srcfileset dir="." includes="test9.tmp" /> | <srcfileset dir="." includes="test9.tmp" /> | ||||
| <targetfileset dir="${output}/test9dir" /> | <targetfileset dir="${output}/test9dir" /> | ||||
| </dependset> | </dependset> | ||||
| <au:assertLogDoesntContain text="Deleting all target files." | |||||
| level="verbose"/> | |||||
| </target> | </target> | ||||
| </project> | </project> | ||||