previously added to Untar, Unjar, Unwar and Unzip, so that these tasks stay focussed on unarchival and nothing but it. 2. If the Src attribute represents a directory, an exception is thrown, as Stefan suggested. Nested Filesets to be used instead. 3. Testcase added to catch this exception. git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@269985 13f79535-47bb-0310-9956-ffa450edef68master
@@ -12,6 +12,10 @@ Changes that could break older environments: | |||||
* <gzip> will throw an exception if your src attribute points to a directory. | * <gzip> will throw an exception if your src attribute points to a directory. | ||||
* Unjar, Unzip and Unwar will throw an exception if the Src attribute | |||||
represents a directory. Support for nested filesets is provided | |||||
instead. | |||||
Fixed bugs: | Fixed bugs: | ||||
----------- | ----------- | ||||
@@ -41,10 +45,9 @@ Fixed bugs: | |||||
Other changes: | Other changes: | ||||
-------------- | -------------- | ||||
* Attributes outfile and verbose added to Unjar, Untar, Unwar and Unzip. | |||||
These tasks now support patternsets to select files from an archive | |||||
for extraction. Filesets may be used to select archived files for | |||||
unarchival. | |||||
* Unjar, Untar, Unwar and Unzip now support patternsets to | |||||
select files from an archive for extraction. Filesets may be | |||||
used to select archived files for unarchival. | |||||
* Javac task allows debug levels to be spcified. Debug levels | * Javac task allows debug levels to be spcified. Debug levels | ||||
will have an effect only when the modern compiler is used. | will have an effect only when the modern compiler is used. | ||||
@@ -35,7 +35,7 @@ to perform unarchival upon. | |||||
<tr> | <tr> | ||||
<td valign="top">dest</td> | <td valign="top">dest</td> | ||||
<td valign="top">directory where to store the expanded files.</td> | <td valign="top">directory where to store the expanded files.</td> | ||||
<td align="center" valign="top">Yes, if outfile is not specified.</td> | |||||
<td align="center" valign="top">Yes</td> | |||||
</tr> | </tr> | ||||
<tr> | <tr> | ||||
<td valign="top">overwrite</td> | <td valign="top">overwrite</td> | ||||
@@ -44,17 +44,6 @@ to perform unarchival upon. | |||||
true).</td> | true).</td> | ||||
<td align="center" valign="top">No</td> | <td align="center" valign="top">No</td> | ||||
</tr> | </tr> | ||||
<tr> | |||||
<td valign="top">outfile</td> | |||||
<td valign="top">List the contents of the archive into this file.</td> | |||||
<td align="center" valign="top">Yes, if dest is not specified.</td> | |||||
</tr> | |||||
<tr> | |||||
<td valign="top">verbose</td> | |||||
<td valign="top">Include file details when listing contents of | |||||
the archive into outfile? Defaults to <I>false</I>.</td> | |||||
<td align="center" valign="top">No</td> | |||||
</tr> | |||||
</table> | </table> | ||||
<h3>Examples</h3> | <h3>Examples</h3> | ||||
<blockquote> | <blockquote> | ||||
@@ -70,9 +59,7 @@ to perform unarchival upon. | |||||
<blockquote> | <blockquote> | ||||
<p><pre> | <p><pre> | ||||
<unzip src="${tomcat_src}/tools-src.zip" | <unzip src="${tomcat_src}/tools-src.zip" | ||||
dest="${tools.home}" | |||||
outfile="${outfile}" | |||||
vebose="on"> | |||||
dest="${tools.home}"> | |||||
<patternset> | <patternset> | ||||
<include name="**/*.java"/> | <include name="**/*.java"/> | ||||
<exclude name="**/Test*.java"/> | <exclude name="**/Test*.java"/> | ||||
@@ -82,9 +69,7 @@ to perform unarchival upon. | |||||
</blockquote> | </blockquote> | ||||
<blockquote> | <blockquote> | ||||
<p><pre> | <p><pre> | ||||
<unzip dest="${tools.home}" | |||||
outfile="${outfile}" | |||||
vebose="on"> | |||||
<unzip dest="${tools.home}"> | |||||
<patternset> | <patternset> | ||||
<include name="**/*.java"/> | <include name="**/*.java"/> | ||||
<exclude name="**/Test*.java"/> | <exclude name="**/Test*.java"/> | ||||
@@ -16,4 +16,8 @@ | |||||
<untar src="expected/asf-logo.gif.tar" dest="." /> | <untar src="expected/asf-logo.gif.tar" dest="." /> | ||||
</target> | </target> | ||||
<target name="srcDirTest"> | |||||
<untar src="." dest="." /> | |||||
</target> | |||||
</project> | </project> |
@@ -60,15 +60,12 @@ import org.apache.tools.ant.Project; | |||||
import org.apache.tools.ant.types.FileSet; | import org.apache.tools.ant.types.FileSet; | ||||
import org.apache.tools.ant.types.PatternSet; | import org.apache.tools.ant.types.PatternSet; | ||||
import org.apache.tools.ant.util.FileUtils; | import org.apache.tools.ant.util.FileUtils; | ||||
import java.io.BufferedWriter; | |||||
import java.io.File; | import java.io.File; | ||||
import java.io.FileInputStream; | import java.io.FileInputStream; | ||||
import java.io.FileOutputStream; | import java.io.FileOutputStream; | ||||
import java.io.FileNotFoundException; | import java.io.FileNotFoundException; | ||||
import java.io.FileWriter; | |||||
import java.io.InputStream; | import java.io.InputStream; | ||||
import java.io.IOException; | import java.io.IOException; | ||||
import java.io.PrintWriter; | |||||
import java.util.Date; | import java.util.Date; | ||||
import java.util.Vector; | import java.util.Vector; | ||||
import java.util.zip.ZipInputStream; | import java.util.zip.ZipInputStream; | ||||
@@ -82,16 +79,11 @@ import java.util.zip.ZipEntry; | |||||
* @author <a href="mailto:umagesh@rediffmail.com">Magesh Umasankar</a> | * @author <a href="mailto:umagesh@rediffmail.com">Magesh Umasankar</a> | ||||
*/ | */ | ||||
public class Expand extends MatchingTask { | public class Expand extends MatchingTask { | ||||
protected File dest; | |||||
protected File source; // req | |||||
protected File outFile; | |||||
protected boolean overwrite = true; | |||||
protected boolean verbose; | |||||
protected PrintWriter pw = null; | |||||
protected BufferedWriter bw = null; | |||||
protected FileWriter fw = null; | |||||
protected Vector patternsets = new Vector(); | |||||
protected Vector filesets = new Vector(); | |||||
private File dest; //req | |||||
private File source; // req | |||||
private boolean overwrite = true; | |||||
private Vector patternsets = new Vector(); | |||||
private Vector filesets = new Vector(); | |||||
/** | /** | ||||
* Do the work. | * Do the work. | ||||
@@ -107,58 +99,22 @@ public class Expand extends MatchingTask { | |||||
throw new BuildException("src attribute and/or filesets must be specified"); | throw new BuildException("src attribute and/or filesets must be specified"); | ||||
} | } | ||||
if (dest == null && outFile == null) { | |||||
if (dest == null) { | |||||
throw new BuildException( | throw new BuildException( | ||||
"Dest and/or the OutFile attribute " + | |||||
"must be specified"); | |||||
"Dest attribute must be specified"); | |||||
} | } | ||||
if (dest != null && dest.exists() && !dest.isDirectory()) { | |||||
if (dest.exists() && !dest.isDirectory()) { | |||||
throw new BuildException("Dest must be a directory.", location); | throw new BuildException("Dest must be a directory.", location); | ||||
} | } | ||||
if (verbose && outFile == null) { | |||||
throw new BuildException( | |||||
"Verbose can be set only when OutFile is " + | |||||
"specified"); | |||||
} | |||||
FileUtils fileUtils = FileUtils.newFileUtils(); | FileUtils fileUtils = FileUtils.newFileUtils(); | ||||
try { | |||||
if (outFile != null) { | |||||
if (outFile.isDirectory()) { | |||||
throw new BuildException("Outfile " + outFile | |||||
+ " must not be a directory."); | |||||
} | |||||
if (!outFile.exists()) { | |||||
File parent = new File(outFile.getParent()); | |||||
if (!parent.exists()) { | |||||
if (!parent.mkdirs()) { | |||||
throw new BuildException("Unable to create " | |||||
+ outFile); | |||||
} | |||||
} | |||||
} | |||||
fw = new FileWriter(outFile); | |||||
bw = new BufferedWriter(fw); | |||||
pw = new PrintWriter(bw, true); | |||||
} | |||||
} catch (IOException ioe) { | |||||
throw new BuildException(ioe.getMessage(), location); | |||||
} | |||||
if (source != null) { | if (source != null) { | ||||
if (source.isDirectory()) { | if (source.isDirectory()) { | ||||
// get all the files in the descriptor directory | |||||
DirectoryScanner ds = super.getDirectoryScanner(source); | |||||
String[] files = ds.getIncludedFiles(); | |||||
for (int i = 0; i < files.length; ++i) { | |||||
File file = new File(source, files[i]); | |||||
expandFile(fileUtils, file, dest); | |||||
} | |||||
} | |||||
else { | |||||
throw new BuildException("Src must not be a directory." + | |||||
" Use nested filesets instead.", location); | |||||
} else { | |||||
expandFile(fileUtils, source, dest); | expandFile(fileUtils, source, dest); | ||||
} | } | ||||
} | } | ||||
@@ -175,21 +131,6 @@ public class Expand extends MatchingTask { | |||||
} | } | ||||
} | } | ||||
} | } | ||||
if (pw != null) { | |||||
pw.close(); | |||||
} | |||||
if (bw != null) { | |||||
try { | |||||
bw.close(); | |||||
} catch (IOException ioe1) {} | |||||
} | |||||
if (fw != null) { | |||||
try { | |||||
fw.close(); | |||||
} catch (IOException ioe1) { | |||||
//Oh, well! We did our best | |||||
} | |||||
} | |||||
} | } | ||||
/* | /* | ||||
@@ -204,15 +145,12 @@ public class Expand extends MatchingTask { | |||||
while ((ze = zis.getNextEntry()) != null) { | while ((ze = zis.getNextEntry()) != null) { | ||||
extractFile(fileUtils, srcF, dir, zis, | extractFile(fileUtils, srcF, dir, zis, | ||||
ze.getName(), ze.getSize(), | |||||
ze.getName(), | |||||
new Date(ze.getTime()), | new Date(ze.getTime()), | ||||
ze.isDirectory()); | ze.isDirectory()); | ||||
} | } | ||||
if (dest != null) { | |||||
log("expand complete", Project.MSG_VERBOSE ); | |||||
} | |||||
log("expand complete", Project.MSG_VERBOSE ); | |||||
} catch (IOException ioe) { | } catch (IOException ioe) { | ||||
throw new BuildException("Error while expanding " + srcF.getPath(), ioe); | throw new BuildException("Error while expanding " + srcF.getPath(), ioe); | ||||
} finally { | } finally { | ||||
@@ -227,21 +165,9 @@ public class Expand extends MatchingTask { | |||||
protected void extractFile(FileUtils fileUtils, File srcF, File dir, | protected void extractFile(FileUtils fileUtils, File srcF, File dir, | ||||
InputStream compressedInputStream, | InputStream compressedInputStream, | ||||
String entryName, long entrySize, | |||||
String entryName, | |||||
Date entryDate, boolean isDirectory) | Date entryDate, boolean isDirectory) | ||||
throws IOException { | throws IOException { | ||||
extractFile(fileUtils, srcF, dir, compressedInputStream, | |||||
entryName, entrySize, entryDate, isDirectory, | |||||
null, null); | |||||
} | |||||
protected void extractFile(FileUtils fileUtils, File srcF, File dir, | |||||
InputStream compressedInputStream, | |||||
String entryName, long entrySize, | |||||
Date entryDate, boolean isDirectory, | |||||
String modeStr, String userGroup) | |||||
throws IOException { | |||||
if (patternsets != null && patternsets.size() > 0) { | if (patternsets != null && patternsets.size() > 0) { | ||||
String name = entryName; | String name = entryName; | ||||
@@ -275,81 +201,50 @@ public class Expand extends MatchingTask { | |||||
} | } | ||||
} | } | ||||
if (dest != null) { | |||||
log("Expanding: " + srcF + " into " + dir, Project.MSG_INFO); | |||||
} | |||||
log("Expanding: " + srcF + " into " + dir, Project.MSG_INFO); | |||||
File f = fileUtils.resolveFile(dir, entryName); | |||||
try { | |||||
if (!overwrite && f.exists() | |||||
&& f.lastModified() >= entryDate.getTime()) { | |||||
log("Skipping " + f + " as it is up-to-date", | |||||
Project.MSG_DEBUG); | |||||
return; | |||||
} | |||||
if (outFile != null) { | |||||
if (verbose) { | |||||
StringBuffer sb = new StringBuffer(); | |||||
if (modeStr != null) { | |||||
sb.append(modeStr); | |||||
sb.append(' '); | |||||
} | |||||
if (userGroup != null) { | |||||
sb.append(userGroup); | |||||
sb.append(' '); | |||||
} | |||||
String s = Long.toString(entrySize); | |||||
int len = s.length(); | |||||
for(int i = 6 - len; i > 0; i--) { | |||||
sb.append(' '); | |||||
} | |||||
sb.append(s) | |||||
.append(' ') | |||||
.append(entryDate.toString()); | |||||
sb.append(' ') | |||||
.append(entryName); | |||||
pw.println(sb); | |||||
log("expanding " + entryName + " to "+ f, | |||||
Project.MSG_VERBOSE); | |||||
// create intermediary directories - sometimes zip don't add them | |||||
File dirF= fileUtils.getParentFile(f); | |||||
dirF.mkdirs(); | |||||
if (isDirectory) { | |||||
f.mkdirs(); | |||||
} else { | } else { | ||||
pw.println(entryName); | |||||
} | |||||
} | |||||
if (dest != null) { | |||||
File f = fileUtils.resolveFile(dir, entryName); | |||||
try { | |||||
if (!overwrite && f.exists() | |||||
&& f.lastModified() >= entryDate.getTime()) { | |||||
log("Skipping " + f + " as it is up-to-date", | |||||
Project.MSG_DEBUG); | |||||
return; | |||||
} | |||||
byte[] buffer = new byte[1024]; | |||||
int length = 0; | |||||
FileOutputStream fos = null; | |||||
try { | |||||
fos = new FileOutputStream(f); | |||||
log("expanding " + entryName + " to "+ f, | |||||
Project.MSG_VERBOSE); | |||||
// create intermediary directories - sometimes zip don't add them | |||||
File dirF= fileUtils.getParentFile(f); | |||||
dirF.mkdirs(); | |||||
while ((length = | |||||
compressedInputStream.read(buffer)) >= 0) { | |||||
fos.write(buffer, 0, length); | |||||
} | |||||
if (isDirectory) { | |||||
f.mkdirs(); | |||||
} else { | |||||
byte[] buffer = new byte[1024]; | |||||
int length = 0; | |||||
FileOutputStream fos = null; | |||||
try { | |||||
fos = new FileOutputStream(f); | |||||
while ((length = | |||||
compressedInputStream.read(buffer)) >= 0) { | |||||
fos.write(buffer, 0, length); | |||||
} | |||||
fos.close(); | |||||
fos = null; | |||||
} finally { | |||||
if (fos != null) { | |||||
try { | |||||
fos.close(); | |||||
} catch (IOException e) {} | |||||
} | |||||
fos.close(); | |||||
fos = null; | |||||
} finally { | |||||
if (fos != null) { | |||||
try { | |||||
fos.close(); | |||||
} catch (IOException e) {} | |||||
} | } | ||||
} | } | ||||
fileUtils.setFileLastModified(f, entryDate.getTime()); | |||||
} catch( FileNotFoundException ex ) { | |||||
log("Unable to expand to file " + f.getPath(), Project.MSG_WARN); | |||||
} | } | ||||
fileUtils.setFileLastModified(f, entryDate.getTime()); | |||||
} catch( FileNotFoundException ex ) { | |||||
log("Unable to expand to file " + f.getPath(), Project.MSG_WARN); | |||||
} | } | ||||
} | } | ||||
@@ -381,23 +276,6 @@ public class Expand extends MatchingTask { | |||||
overwrite = b; | overwrite = b; | ||||
} | } | ||||
/** | |||||
* Set the output file to be used to store the list of the | |||||
* archive's contents. | |||||
* | |||||
* @param outFile the output file to be used. | |||||
*/ | |||||
public void setOutfile(File outFile) { | |||||
this.outFile = outFile; | |||||
} | |||||
/** | |||||
* Set the verbose mode for the contents-list file. | |||||
*/ | |||||
public void setVerbose(boolean verbose) { | |||||
this.verbose = verbose; | |||||
} | |||||
/** | /** | ||||
* Add a patternset | * Add a patternset | ||||
*/ | */ | ||||
@@ -73,50 +73,21 @@ import java.util.Date; | |||||
* @author <a href="mailto:umagesh@rediffmail.com">Magesh Umasankar</a> | * @author <a href="mailto:umagesh@rediffmail.com">Magesh Umasankar</a> | ||||
*/ | */ | ||||
public class Untar extends Expand { | public class Untar extends Expand { | ||||
private final static int S_IFMT = 0170000; | |||||
private final static int S_IFSOCK = 0140000; | |||||
private final static int S_IFLNK = 0120000; | |||||
private final static int S_IFREG = 0100000; | |||||
private final static int S_IFBLK = 0060000; | |||||
private final static int S_IFDIR = 0040000; | |||||
private final static int S_IFCHR = 0020000; | |||||
private final static int S_IFIFO = 0010000; | |||||
private final static int S_ISUID = 0004000; | |||||
private final static int S_ISGID = 0002000; | |||||
private final static int S_ISVTX = 0001000; | |||||
private final static int S_IRWXU = 00700; | |||||
private final static int S_IRUSR = 00400; | |||||
private final static int S_IWUSR = 00200; | |||||
private final static int S_IXUSR = 00100; | |||||
private final static int S_IRWXG = 00070; | |||||
private final static int S_IRGRP = 00040; | |||||
private final static int S_IWGRP = 00020; | |||||
private final static int S_IXGRP = 00010; | |||||
private final static int S_IRWXO = 00007; | |||||
private final static int S_IROTH = 00004; | |||||
private final static int S_IWOTH = 00002; | |||||
private final static int S_IXOTH = 00001; | |||||
protected void expandFile(FileUtils fileUtils, File srcF, File dir) { | protected void expandFile(FileUtils fileUtils, File srcF, File dir) { | ||||
TarInputStream tis = null; | TarInputStream tis = null; | ||||
try { | try { | ||||
if (dest != null) { | |||||
log("Expanding: " + srcF + " into " + dir, Project.MSG_INFO); | |||||
} | |||||
log("Expanding: " + srcF + " into " + dir, Project.MSG_INFO); | |||||
tis = new TarInputStream(new FileInputStream(srcF)); | tis = new TarInputStream(new FileInputStream(srcF)); | ||||
TarEntry te = null; | TarEntry te = null; | ||||
while ((te = tis.getNextEntry()) != null) { | while ((te = tis.getNextEntry()) != null) { | ||||
extractFile(fileUtils, srcF, dir, tis, | extractFile(fileUtils, srcF, dir, tis, | ||||
te.getName(), te.getSize(), | |||||
te.getModTime(), te.isDirectory(), | |||||
mode2str(te.getMode()), | |||||
te.getUserId() + "/" + te.getGroupId()); | |||||
} | |||||
if (dest != null) { | |||||
log("expand complete", Project.MSG_VERBOSE ); | |||||
te.getName(), | |||||
te.getModTime(), te.isDirectory()); | |||||
} | } | ||||
log("expand complete", Project.MSG_VERBOSE ); | |||||
} catch (IOException ioe) { | } catch (IOException ioe) { | ||||
throw new BuildException("Error while expanding " + srcF.getPath(), | throw new BuildException("Error while expanding " + srcF.getPath(), | ||||
@@ -130,56 +101,4 @@ public class Untar extends Expand { | |||||
} | } | ||||
} | } | ||||
} | } | ||||
private String mode2str(int mode) { | |||||
StringBuffer sb = new StringBuffer("----------"); | |||||
if ((mode & S_IFREG ) == 0) { | |||||
if ((mode & S_IFDIR ) != 0) { | |||||
sb.setCharAt(0, 'd'); | |||||
} else if ((mode & S_IFLNK) != 0) { | |||||
sb.setCharAt(0, 'l'); | |||||
} else if ((mode & S_IFIFO) != 0) { | |||||
sb.setCharAt(0, 'p'); | |||||
} else if ((mode & S_IFCHR) != 0) { | |||||
sb.setCharAt(0, 'c'); | |||||
} else if ((mode & S_IFBLK) != 0) { | |||||
sb.setCharAt(0, 'b'); | |||||
} else if ((mode & S_IFSOCK) != 0) { | |||||
sb.setCharAt(0, 's'); | |||||
} else if ((mode & S_IFIFO) != 0) { | |||||
sb.setCharAt(0, 'p'); | |||||
} | |||||
} | |||||
if ((mode & S_IRUSR ) != 0) { | |||||
sb.setCharAt(1, 'r'); | |||||
} | |||||
if ((mode & S_IWUSR ) != 0) { | |||||
sb.setCharAt(2, 'w'); | |||||
} | |||||
if ((mode & S_IXUSR ) != 0) { | |||||
sb.setCharAt(3, 'x'); | |||||
} | |||||
if ((mode & S_IRGRP ) != 0) { | |||||
sb.setCharAt(4, 'r'); | |||||
} | |||||
if ((mode & S_IWGRP ) != 0) { | |||||
sb.setCharAt(5, 'w'); | |||||
} | |||||
if ((mode & S_IXGRP ) != 0) { | |||||
sb.setCharAt(6, 'x'); | |||||
} | |||||
if ((mode & S_IROTH ) != 0) { | |||||
sb.setCharAt(7, 'r'); | |||||
} | |||||
if ((mode & S_IWOTH ) != 0) { | |||||
sb.setCharAt(8, 'w'); | |||||
} | |||||
if ((mode & S_IXOTH ) != 0) { | |||||
sb.setCharAt(9, 'x'); | |||||
} | |||||
return new String(sb); | |||||
} | |||||
} | } |
@@ -52,7 +52,7 @@ | |||||
* <http://www.apache.org/>. | * <http://www.apache.org/>. | ||||
*/ | */ | ||||
package org.apache.tools.ant.taskdefs; | package org.apache.tools.ant.taskdefs; | ||||
import java.io.File; | import java.io.File; | ||||
import org.apache.tools.ant.BuildFileTest; | import org.apache.tools.ant.BuildFileTest; | ||||
import org.apache.tools.ant.util.FileUtils; | import org.apache.tools.ant.util.FileUtils; | ||||
@@ -61,13 +61,13 @@ import org.apache.tools.ant.util.FileUtils; | |||||
* @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | ||||
* @version $Revision$ | * @version $Revision$ | ||||
*/ | */ | ||||
public class UntarTest extends BuildFileTest { | |||||
public UntarTest(String name) { | |||||
public class UntarTest extends BuildFileTest { | |||||
public UntarTest(String name) { | |||||
super(name); | super(name); | ||||
} | |||||
public void setUp() { | |||||
} | |||||
public void setUp() { | |||||
configureProject("src/etc/testcases/taskdefs/untar.xml"); | configureProject("src/etc/testcases/taskdefs/untar.xml"); | ||||
} | } | ||||
@@ -81,12 +81,16 @@ public class UntarTest extends BuildFileTest { | |||||
assertTrue(fileUtils.contentEquals(project.resolveFile("../asf-logo.gif"), | assertTrue(fileUtils.contentEquals(project.resolveFile("../asf-logo.gif"), | ||||
project.resolveFile("asf-logo.gif"))); | project.resolveFile("asf-logo.gif"))); | ||||
} | } | ||||
public void testTestTarTask() throws java.io.IOException { | public void testTestTarTask() throws java.io.IOException { | ||||
FileUtils fileUtils = FileUtils.newFileUtils(); | FileUtils fileUtils = FileUtils.newFileUtils(); | ||||
executeTarget("testTarTask"); | executeTarget("testTarTask"); | ||||
assertTrue(fileUtils.contentEquals(project.resolveFile("../asf-logo.gif"), | assertTrue(fileUtils.contentEquals(project.resolveFile("../asf-logo.gif"), | ||||
project.resolveFile("asf-logo.gif"))); | project.resolveFile("asf-logo.gif"))); | ||||
} | } | ||||
public void testSrcDirTest() throws java.io.IOException { | |||||
FileUtils fileUtils = FileUtils.newFileUtils(); | |||||
expectBuildException("srcDirTest", "Src cannot be a directory."); | |||||
} | |||||
} | } |