📄 executeon.java
字号:
String[] s = getDirs(base, ds); for (int j = 0; j < s.length; j++) { totalDirs++; fileNames.addElement(s[j]); baseDirs.addElement(base); } } if (fileNames.size() == 0 && skipEmpty) { logSkippingFileset(currentType, ds, base); continue; } if (!parallel) { String[] s = new String[fileNames.size()]; fileNames.copyInto(s); for (int j = 0; j < s.length; j++) { String[] command = getCommandline(s[j], base); log(Commandline.describeCommand(command), Project.MSG_VERBOSE); exe.setCommandline(command); if (redirectorElement != null) { setupRedirector(); redirectorElement.configure(redirector, s[j]); } if (redirectorElement != null || haveExecuted) { // need to reset the stream handler to restart // reading of pipes; // go ahead and do it always w/ nested redirectors exe.setStreamHandler(redirector.createHandler()); } runExecute(exe); haveExecuted = true; } fileNames.removeAllElements(); baseDirs.removeAllElements(); } } if (resources != null) { Iterator iter = resources.iterator(); while (iter.hasNext()) { Resource res = (Resource) iter.next(); if (!res.isExists() && ignoreMissing) { continue; } File base = null; String name = res.getName(); if (res instanceof FileResource) { FileResource fr = (FileResource) res; base = fr.getBaseDir(); if (base == null) { name = fr.getFile().getAbsolutePath(); } } if (restrict(new String[] {name}, base).length == 0) { continue; } if ((!res.isDirectory() || !res.isExists()) && !FileDirBoth.DIR.equals(type)) { totalFiles++; } else if (res.isDirectory() && !FileDirBoth.FILE.equals(type)) { totalDirs++; } else { continue; } baseDirs.add(base); fileNames.add(name); if (!parallel) { String[] command = getCommandline(name, base); log(Commandline.describeCommand(command), Project.MSG_VERBOSE); exe.setCommandline(command); if (redirectorElement != null) { setupRedirector(); redirectorElement.configure(redirector, name); } if (redirectorElement != null || haveExecuted) { // need to reset the stream handler to restart // reading of pipes; // go ahead and do it always w/ nested redirectors exe.setStreamHandler(redirector.createHandler()); } runExecute(exe); haveExecuted = true; fileNames.removeAllElements(); baseDirs.removeAllElements(); } } } if (parallel && (fileNames.size() > 0 || !skipEmpty)) { runParallel(exe, fileNames, baseDirs); haveExecuted = true; } if (haveExecuted) { log("Applied " + cmdl.getExecutable() + " to " + totalFiles + " file" + (totalFiles != 1 ? "s" : "") + " and " + totalDirs + " director" + (totalDirs != 1 ? "ies" : "y") + ".", verbose ? Project.MSG_INFO : Project.MSG_VERBOSE); } } catch (IOException e) { throw new BuildException("Execute failed: " + e, e, getLocation()); } finally { // close the output file if required logFlush(); redirector.setAppendProperties(false); redirector.setProperties(); } } /** * log a message for skipping a fileset. * @param currentType the current type. * @param ds the directory scanner. * @param base the dir base */ private void logSkippingFileset( String currentType, DirectoryScanner ds, File base) { int includedCount = ((!FileDirBoth.DIR.equals(currentType)) ? ds.getIncludedFilesCount() : 0) + ((!FileDirBoth.FILE.equals(currentType)) ? ds.getIncludedDirsCount() : 0); log("Skipping fileset for directory " + base + ". It is " + ((includedCount > 0) ? "up to date." : "empty."), verbose ? Project.MSG_INFO : Project.MSG_VERBOSE); } /** * Construct the command line for parallel execution. * * @param srcFiles The filenames to add to the commandline. * @param baseDirs filenames are relative to this dir. * @return the command line in the form of a String[]. */ protected String[] getCommandline(String[] srcFiles, File[] baseDirs) { final char fileSeparator = File.separatorChar; Vector targets = new Vector(); if (targetFilePos != null) { Hashtable addedFiles = new Hashtable(); for (int i = 0; i < srcFiles.length; i++) { String[] subTargets = mapper.mapFileName(srcFiles[i]); if (subTargets != null) { for (int j = 0; j < subTargets.length; j++) { String name = null; if (!relative) { name = (new File(destDir, subTargets[j])).getAbsolutePath(); } else { name = subTargets[j]; } if (forwardSlash && fileSeparator != '/') { name = name.replace(fileSeparator, '/'); } if (!addedFiles.contains(name)) { targets.addElement(name); addedFiles.put(name, name); } } } } } String[] targetFiles = new String[targets.size()]; targets.copyInto(targetFiles); if (!addSourceFile) { srcFiles = new String[0]; } String[] orig = cmdl.getCommandline(); String[] result = new String[orig.length + srcFiles.length + targetFiles.length]; int srcIndex = orig.length; if (srcFilePos != null) { srcIndex = srcFilePos.getPosition(); } if (targetFilePos != null) { int targetIndex = targetFilePos.getPosition(); if (srcIndex < targetIndex || (srcIndex == targetIndex && srcIsFirst)) { // 0 --> srcIndex System.arraycopy(orig, 0, result, 0, srcIndex); // srcIndex --> targetIndex System.arraycopy(orig, srcIndex, result, srcIndex + srcFiles.length, targetIndex - srcIndex); // targets are already absolute file names System.arraycopy(targetFiles, 0, result, targetIndex + srcFiles.length, targetFiles.length); // targetIndex --> end System.arraycopy(orig, targetIndex, result, targetIndex + srcFiles.length + targetFiles.length, orig.length - targetIndex); } else { // 0 --> targetIndex System.arraycopy(orig, 0, result, 0, targetIndex); // targets are already absolute file names System.arraycopy(targetFiles, 0, result, targetIndex, targetFiles.length); // targetIndex --> srcIndex System.arraycopy(orig, targetIndex, result, targetIndex + targetFiles.length, srcIndex - targetIndex); // srcIndex --> end System.arraycopy(orig, srcIndex, result, srcIndex + srcFiles.length + targetFiles.length, orig.length - srcIndex); srcIndex += targetFiles.length; } } else { // no targetFilePos // 0 --> srcIndex System.arraycopy(orig, 0, result, 0, srcIndex); // srcIndex --> end System.arraycopy(orig, srcIndex, result, srcIndex + srcFiles.length, orig.length - srcIndex); } // fill in source file names for (int i = 0; i < srcFiles.length; i++) { if (!relative) { result[srcIndex + i] = (new File(baseDirs[i], srcFiles[i])).getAbsolutePath(); } else { result[srcIndex + i] = srcFiles[i]; } if (forwardSlash && fileSeparator != '/') { result[srcIndex + i] = result[srcIndex + i].replace(fileSeparator, '/'); } } return result; } /** * Construct the command line for serial execution. * * @param srcFile The filename to add to the commandline. * @param baseDir filename is relative to this dir. * @return the command line in the form of a String[]. */ protected String[] getCommandline(String srcFile, File baseDir) { return getCommandline(new String[] {srcFile}, new File[] {baseDir}); } /** * Return the list of files from this DirectoryScanner that should * be included on the command line. * @param baseDir the File base directory. * @param ds the DirectoryScanner to use for file scanning. * @return a String[] containing the filenames. */ protected String[] getFiles(File baseDir, DirectoryScanner ds) { return restrict(ds.getIncludedFiles(), baseDir); } /** * Return the list of Directories from this DirectoryScanner that * should be included on the command line. * @param baseDir the File base directory. * @param ds the DirectoryScanner to use for file scanning. * @return a String[] containing the directory names. */ protected String[] getDirs(File baseDir, DirectoryScanner ds) { return restrict(ds.getIncludedDirectories(), baseDir); } /** * Return the list of files or directories from this FileList that * should be included on the command line. * @param list the FileList to check. * @return a String[] containing the directory names. * * @since Ant 1.6.2 */ protected String[] getFilesAndDirs(FileList list) { return restrict(list.getFiles(getProject()), list.getDir(getProject())); } private String[] restrict(String[] s, File baseDir) { return (mapper == null || force) ? s : new SourceFileScanner(this).restrict(s, baseDir, destDir, mapper); } /** * Run the command in "parallel" mode, making sure that at most * maxParallel sourcefiles get passed on the command line. * @param exe the Executable to use. * @param fileNames the Vector of filenames. * @param baseDirs the Vector of base directories corresponding to fileNames. * @throws IOException on I/O errors. * @throws BuildException on other errors. * @since Ant 1.6 */ protected void runParallel(Execute exe, Vector fileNames, Vector baseDirs) throws IOException, BuildException { String[] s = new String[fileNames.size()]; fileNames.copyInto(s); File[] b = new File[baseDirs.size()]; baseDirs.copyInto(b); if (maxParallel <= 0 || s.length == 0 /* this is skipEmpty == false */) { String[] command = getCommandline(s, b); log(Commandline.describeCommand(command), Project.MSG_VERBOSE); exe.setCommandline(command); runExecute(exe); } else { int stillToDo = fileNames.size(); int currentOffset = 0; while (stillToDo > 0) { int currentAmount = Math.min(stillToDo, maxParallel); String[] cs = new String[currentAmount]; System.arraycopy(s, currentOffset, cs, 0, currentAmount); File[] cb = new File[currentAmount]; System.arraycopy(b, currentOffset, cb, 0, currentAmount); String[] command = getCommandline(cs, cb); log(Commandline.describeCommand(command), Project.MSG_VERBOSE); exe.setCommandline(command); if (redirectorElement != null) { setupRedirector(); redirectorElement.configure(redirector, null); } if (redirectorElement != null || currentOffset > 0) { // need to reset the stream handler to restart // reading of pipes; // go ahead and do it always w/ nested redirectors exe.setStreamHandler(redirector.createHandler()); } runExecute(exe); stillToDo -= currentAmount; currentOffset += currentAmount; } } } /** * Enumerated attribute with the values "file", "dir" and "both" * for the type attribute. */ public static class FileDirBoth extends EnumeratedAttribute { /** File value */ public static final String FILE = "file"; /** Dir value */ public static final String DIR = "dir"; /** * @see EnumeratedAttribute#getValues */ /** {@inheritDoc}. */ public String[] getValues() { return new String[] {FILE, DIR, "both"}; } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -