📄 tar.java
字号:
throw new BuildException("fullpath attribute may only " + "be specified for " + "filesets that specify a " + "single file."); } TarFileSet tfs = asTarFileSet(afs); if (isFileFileSet(rc)) { FileSet fs = (FileSet) rc; String[] files = getFileNames(fs); for (int i = 0; i < files.length; i++) { File f = new File(fs.getDir(getProject()), files[i]); String name = files[i].replace(File.separatorChar, '/'); tarFile(f, tOut, name, tfs); } } else if (rc.isFilesystemOnly()) { Iterator iter = rc.iterator(); while (iter.hasNext()) { FileResource r = (FileResource) iter.next(); File f = r.getFile(); if (f == null) { f = new File(r.getBaseDir(), r.getName()); } tarFile(f, tOut, f.getName(), tfs); } } else { // non-file resources Iterator iter = rc.iterator(); while (iter.hasNext()) { Resource r = (Resource) iter.next(); tarResource(r, tOut, r.getName(), tfs); } } } /** * whether the given resource collection is a (subclass of) * FileSet that only contains file system resources. * @param rc the resource collection to check. * @return true if the collection is a fileset. * @since Ant 1.7 */ protected static final boolean isFileFileSet(ResourceCollection rc) { return rc instanceof FileSet && rc.isFilesystemOnly(); } /** * Grabs all included files and directors from the FileSet and * returns them as an array of (relative) file names. * @param fs the fileset to operate on. * @return a list of the filenames. * @since Ant 1.7 */ protected static final String[] getFileNames(FileSet fs) { DirectoryScanner ds = fs.getDirectoryScanner(fs.getProject()); String[] directories = ds.getIncludedDirectories(); String[] filesPerSe = ds.getIncludedFiles(); String[] files = new String [directories.length + filesPerSe.length]; System.arraycopy(directories, 0, files, 0, directories.length); System.arraycopy(filesPerSe, 0, files, directories.length, filesPerSe.length); return files; } /** * Copies fullpath, prefix and permission attributes from the * ArchiveFileSet to a new TarFileSet (or returns it unchanged if * it already is a TarFileSet). * * @param archiveFileSet fileset to copy attributes from, may be null * @return a new TarFileSet. * @since Ant 1.7 */ protected TarFileSet asTarFileSet(ArchiveFileSet archiveFileSet) { TarFileSet tfs = null; if (archiveFileSet != null && archiveFileSet instanceof TarFileSet) { tfs = (TarFileSet) archiveFileSet; } else { tfs = new TarFileSet(); tfs.setProject(getProject()); if (archiveFileSet != null) { tfs.setPrefix(archiveFileSet.getPrefix(getProject())); tfs.setFullpath(archiveFileSet.getFullpath(getProject())); if (archiveFileSet.hasFileModeBeenSet()) { tfs.integerSetFileMode(archiveFileSet .getFileMode(getProject())); } if (archiveFileSet.hasDirModeBeenSet()) { tfs.integerSetDirMode(archiveFileSet .getDirMode(getProject())); } if (archiveFileSet instanceof org.apache.tools.ant.types.TarFileSet) { org.apache.tools.ant.types.TarFileSet t = (org.apache.tools.ant.types.TarFileSet) archiveFileSet; if (t.hasUserNameBeenSet()) { tfs.setUserName(t.getUserName()); } if (t.hasGroupBeenSet()) { tfs.setGroup(t.getGroup()); } if (t.hasUserIdBeenSet()) { tfs.setUid(t.getUid()); } if (t.hasGroupIdBeenSet()) { tfs.setGid(t.getGid()); } } } } return tfs; } /** * This is a FileSet with the option to specify permissions * and other attributes. */ public static class TarFileSet extends org.apache.tools.ant.types.TarFileSet { private String[] files = null; private boolean preserveLeadingSlashes = false; /** * Creates a new <code>TarFileSet</code> instance. * Using a fileset as a constructor argument. * * @param fileset a <code>FileSet</code> value */ public TarFileSet(FileSet fileset) { super(fileset); } /** * Creates a new <code>TarFileSet</code> instance. * */ public TarFileSet() { super(); } /** * Get a list of files and directories specified in the fileset. * @param p the current project. * @return a list of file and directory names, relative to * the baseDir for the project. */ public String[] getFiles(Project p) { if (files == null) { files = getFileNames(this); } return files; } /** * A 3 digit octal string, specify the user, group and * other modes in the standard Unix fashion; * optional, default=0644 * @param octalString a 3 digit octal string. */ public void setMode(String octalString) { setFileMode(octalString); } /** * @return the current mode. */ public int getMode() { return getFileMode(this.getProject()); } /** * Flag to indicates whether leading `/'s should * be preserved in the file names. * Optional, default is <code>false</code>. * @param b the leading slashes flag. */ public void setPreserveLeadingSlashes(boolean b) { this.preserveLeadingSlashes = b; } /** * @return the leading slashes flag. */ public boolean getPreserveLeadingSlashes() { return preserveLeadingSlashes; } } /** * Set of options for long file handling in the task. * */ public static class TarLongFileMode extends EnumeratedAttribute { /** permissible values for longfile attribute */ public static final String WARN = "warn", FAIL = "fail", TRUNCATE = "truncate", GNU = "gnu", OMIT = "omit"; private final String[] validModes = {WARN, FAIL, TRUNCATE, GNU, OMIT}; /** Constructor, defaults to "warn" */ public TarLongFileMode() { super(); setValue(WARN); } /** * @return the possible values for this enumerated type. */ public String[] getValues() { return validModes; } /** * @return true if value is "truncate". */ public boolean isTruncateMode() { return TRUNCATE.equalsIgnoreCase(getValue()); } /** * @return true if value is "warn". */ public boolean isWarnMode() { return WARN.equalsIgnoreCase(getValue()); } /** * @return true if value is "gnu". */ public boolean isGnuMode() { return GNU.equalsIgnoreCase(getValue()); } /** * @return true if value is "fail". */ public boolean isFailMode() { return FAIL.equalsIgnoreCase(getValue()); } /** * @return true if value is "omit". */ public boolean isOmitMode() { return OMIT.equalsIgnoreCase(getValue()); } } /** * Valid Modes for Compression attribute to Tar Task * */ public static final class TarCompressionMethod extends EnumeratedAttribute { // permissible values for compression attribute /** * No compression */ private static final String NONE = "none"; /** * GZIP compression */ private static final String GZIP = "gzip"; /** * BZIP2 compression */ private static final String BZIP2 = "bzip2"; /** * Default constructor */ public TarCompressionMethod() { super(); setValue(NONE); } /** * Get valid enumeration values. * @return valid enumeration values */ public String[] getValues() { return new String[] {NONE, GZIP, BZIP2 }; } /** * This method wraps the output stream with the * corresponding compression method * * @param ostream output stream * @return output stream with on-the-fly compression * @exception IOException thrown if file is not writable */ private OutputStream compress(final OutputStream ostream) throws IOException { final String v = getValue(); if (GZIP.equals(v)) { return new GZIPOutputStream(ostream); } else { if (BZIP2.equals(v)) { ostream.write('B'); ostream.write('Z'); return new CBZip2OutputStream(ostream); } } return ostream; } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -