This is an automated email from the ASF dual-hosted git repository. ggregory pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-compress.git
The following commit(s) were added to refs/heads/master by this push: new 5916d5b - Add ctor CpioArchiveEntry(Path, String, LinkOption...) - Add ctor CpioArchiveEntry(short, Path, String, LinkOption...) - Add CpioArchiveEntry.setTime(FileTime) - Add createArchiveEntry(Path, String, LinkOption...) - Javadoc nits. 5916d5b is described below commit 5916d5ba161e953e72e225ee7aac46eeff1c34b8 Author: Gary Gregory <garydgreg...@gmail.com> AuthorDate: Sat Aug 8 17:03:34 2020 -0400 - Add ctor CpioArchiveEntry(Path, String, LinkOption...) - Add ctor CpioArchiveEntry(short, Path, String, LinkOption...) - Add CpioArchiveEntry.setTime(FileTime) - Add createArchiveEntry(Path, String, LinkOption...) - Javadoc nits. --- src/changes/changes.xml | 12 ++ .../compress/archivers/cpio/CpioArchiveEntry.java | 167 +++++++++++++++------ .../archivers/cpio/CpioArchiveOutputStream.java | 16 ++ .../org/apache/commons/compress/utils/IOUtils.java | 13 ++ .../apache/commons/compress/AbstractTestCase.java | 2 +- 5 files changed, 160 insertions(+), 50 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index f09a45f..670b4e5 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -146,6 +146,18 @@ The <action> type attribute can be add,update,fix,remove. Add ArArchiveEntry(Path, String, LinkOption...) </action> <action type="update" date="2020-08-08" due-to="Gary Gregory" dev="ggregory"> + Add ctor CpioArchiveEntry(Path, String, LinkOption...) + </action> + <action type="update" date="2020-08-08" due-to="Gary Gregory" dev="ggregory"> + Add ctor CpioArchiveEntry(short, Path, String, LinkOption...) + </action> + <action type="update" date="2020-08-08" due-to="Gary Gregory" dev="ggregory"> + Add CpioArchiveEntry.setTime(FileTime) + </action> + <action type="update" date="2020-08-08" due-to="Gary Gregory" dev="ggregory"> + Add createArchiveEntry(Path, String, LinkOption...) + </action> + <action type="update" date="2020-08-08" due-to="Gary Gregory" dev="ggregory"> Add Path support to ZipArchiveOutputStream #123. </action> <action type="update" date="2020-07-23" due-to="Dependabot" dev="ggregory"> diff --git a/src/main/java/org/apache/commons/compress/archivers/cpio/CpioArchiveEntry.java b/src/main/java/org/apache/commons/compress/archivers/cpio/CpioArchiveEntry.java index b780f94..27db939 100644 --- a/src/main/java/org/apache/commons/compress/archivers/cpio/CpioArchiveEntry.java +++ b/src/main/java/org/apache/commons/compress/archivers/cpio/CpioArchiveEntry.java @@ -19,8 +19,14 @@ package org.apache.commons.compress.archivers.cpio; import java.io.File; +import java.io.IOException; import java.nio.charset.Charset; +import java.nio.file.Files; +import java.nio.file.LinkOption; +import java.nio.file.Path; +import java.nio.file.attribute.FileTime; import java.util.Date; +import java.util.concurrent.TimeUnit; import org.apache.commons.compress.archivers.ArchiveEntry; @@ -316,6 +322,23 @@ public class CpioArchiveEntry implements CpioConstants, ArchiveEntry { /** * Creates a CpioArchiveEntry with a specified name for a + * specified file. The format of this entry will be the new + * format. + * + * @param inputPath + * The file to gather information from. + * @param entryName + * The name of this entry. + * @param options options indicating how symbolic links are handled. + * @throws IOException if an I/O error occurs + * @since 1.21 + */ + public CpioArchiveEntry(final Path inputPath, final String entryName, LinkOption... options) throws IOException { + this(FORMAT_NEW, inputPath, entryName, options); + } + + /** + * Creates a CpioArchiveEntry with a specified name for a * specified file. * * @param format @@ -351,7 +374,44 @@ public class CpioArchiveEntry implements CpioConstants, ArchiveEntry { } /** - * Check if the method is allowed for the defined format. + * Creates a CpioArchiveEntry with a specified name for a + * specified path. + * + * @param format + * The cpio format for this entry. + * @param inputPath + * The file to gather information from. + * @param entryName + * The name of this entry. + * <p> + * Possible format values are: + * <pre> + * CpioConstants.FORMAT_NEW + * CpioConstants.FORMAT_NEW_CRC + * CpioConstants.FORMAT_OLD_BINARY + * CpioConstants.FORMAT_OLD_ASCII + * </pre> + * @param options options indicating how symbolic links are handled. + * + * @throws IOException if an I/O error occurs + * @since 1.21 + */ + public CpioArchiveEntry(final short format, final Path inputPath, final String entryName, LinkOption... options) + throws IOException { + this(format, entryName, Files.isRegularFile(inputPath, options) ? Files.size(inputPath) : 0); + if (Files.isDirectory(inputPath, options)) { + setMode(C_ISDIR); + } else if (Files.isRegularFile(inputPath, options)) { + setMode(C_ISREG); + } else { + throw new IllegalArgumentException("Cannot determine type of file " + inputPath); + } + // TODO set other fields as needed + setTime(Files.getLastModifiedTime(inputPath, options)); + } + + /** + * Checks if the method is allowed for the defined format. */ private void checkNewFormat() { if ((this.fileFormat & FORMAT_NEW_MASK) == 0) { @@ -360,7 +420,7 @@ public class CpioArchiveEntry implements CpioConstants, ArchiveEntry { } /** - * Check if the method is allowed for the defined format. + * Checks if the method is allowed for the defined format. */ private void checkOldFormat() { if ((this.fileFormat & FORMAT_OLD_MASK) == 0) { @@ -369,7 +429,7 @@ public class CpioArchiveEntry implements CpioConstants, ArchiveEntry { } /** - * Get the checksum. + * Gets the checksum. * Only supported for the new formats. * * @return Returns the checksum. @@ -381,7 +441,7 @@ public class CpioArchiveEntry implements CpioConstants, ArchiveEntry { } /** - * Get the device id. + * Gets the device id. * * @return Returns the device id. * @throws UnsupportedOperationException @@ -394,7 +454,7 @@ public class CpioArchiveEntry implements CpioConstants, ArchiveEntry { } /** - * Get the major device id. + * Gets the major device id. * * @return Returns the major device id. * @throws UnsupportedOperationException @@ -407,7 +467,7 @@ public class CpioArchiveEntry implements CpioConstants, ArchiveEntry { } /** - * Get the minor device id + * Gets the minor device id * * @return Returns the minor device id. * @throws UnsupportedOperationException if format is not a new format @@ -418,7 +478,7 @@ public class CpioArchiveEntry implements CpioConstants, ArchiveEntry { } /** - * Get the filesize. + * Gets the filesize. * * @return Returns the filesize. * @see org.apache.commons.compress.archivers.ArchiveEntry#getSize() @@ -429,7 +489,7 @@ public class CpioArchiveEntry implements CpioConstants, ArchiveEntry { } /** - * Get the format for this entry. + * Gets the format for this entry. * * @return Returns the format. */ @@ -438,7 +498,7 @@ public class CpioArchiveEntry implements CpioConstants, ArchiveEntry { } /** - * Get the group id. + * Gets the group id. * * @return Returns the group id. */ @@ -447,7 +507,7 @@ public class CpioArchiveEntry implements CpioConstants, ArchiveEntry { } /** - * Get the header size for this CPIO format + * Gets the header size for this CPIO format * * @return Returns the header size in bytes. */ @@ -456,7 +516,7 @@ public class CpioArchiveEntry implements CpioConstants, ArchiveEntry { } /** - * Get the alignment boundary for this CPIO format + * Gets the alignment boundary for this CPIO format * * @return Returns the aligment boundary (0, 2, 4) in bytes */ @@ -465,7 +525,7 @@ public class CpioArchiveEntry implements CpioConstants, ArchiveEntry { } /** - * Get the number of bytes needed to pad the header to the alignment boundary. + * Gets the number of bytes needed to pad the header to the alignment boundary. * * @deprecated This method doesn't properly work for multi-byte encodings. And * creates corrupt archives. Use {@link #getHeaderPadCount(Charset)} @@ -478,7 +538,7 @@ public class CpioArchiveEntry implements CpioConstants, ArchiveEntry { } /** - * Get the number of bytes needed to pad the header to the alignment boundary. + * Gets the number of bytes needed to pad the header to the alignment boundary. * * @param charset * The character set used to encode the entry name in the stream. @@ -496,7 +556,7 @@ public class CpioArchiveEntry implements CpioConstants, ArchiveEntry { } /** - * Get the number of bytes needed to pad the header to the alignment boundary. + * Gets the number of bytes needed to pad the header to the alignment boundary. * * @param namesize * The length of the name in bytes, as read in the stream. @@ -519,7 +579,7 @@ public class CpioArchiveEntry implements CpioConstants, ArchiveEntry { } /** - * Get the number of bytes needed to pad the data to the alignment boundary. + * Gets the number of bytes needed to pad the data to the alignment boundary. * * @return the number of bytes needed to pad the data (0,1,2,3) */ @@ -534,7 +594,7 @@ public class CpioArchiveEntry implements CpioConstants, ArchiveEntry { } /** - * Set the inode. + * Sets the inode. * * @return Returns the inode. */ @@ -543,7 +603,7 @@ public class CpioArchiveEntry implements CpioConstants, ArchiveEntry { } /** - * Get the mode of this entry (e.g. directory, regular file). + * Gets the mode of this entry (e.g. directory, regular file). * * @return Returns the mode. */ @@ -552,7 +612,7 @@ public class CpioArchiveEntry implements CpioConstants, ArchiveEntry { } /** - * Get the name. + * Gets the name. * * <p>This method returns the raw name as it is stored inside of the archive.</p> * @@ -564,7 +624,7 @@ public class CpioArchiveEntry implements CpioConstants, ArchiveEntry { } /** - * Get the number of links. + * Gets the number of links. * * @return Returns the number of links. */ @@ -575,7 +635,7 @@ public class CpioArchiveEntry implements CpioConstants, ArchiveEntry { } /** - * Get the remote device id. + * Gets the remote device id. * * @return Returns the remote device id. * @throws UnsupportedOperationException @@ -588,7 +648,7 @@ public class CpioArchiveEntry implements CpioConstants, ArchiveEntry { } /** - * Get the remote major device id. + * Gets the remote major device id. * * @return Returns the remote major device id. * @throws UnsupportedOperationException @@ -601,7 +661,7 @@ public class CpioArchiveEntry implements CpioConstants, ArchiveEntry { } /** - * Get the remote minor device id. + * Gets the remote minor device id. * * @return Returns the remote minor device id. * @throws UnsupportedOperationException @@ -614,7 +674,7 @@ public class CpioArchiveEntry implements CpioConstants, ArchiveEntry { } /** - * Get the time in seconds. + * Gets the time in seconds. * * @return Returns the time. */ @@ -628,7 +688,7 @@ public class CpioArchiveEntry implements CpioConstants, ArchiveEntry { } /** - * Get the user id. + * Gets the user id. * * @return Returns the user id. */ @@ -637,7 +697,7 @@ public class CpioArchiveEntry implements CpioConstants, ArchiveEntry { } /** - * Check if this entry represents a block device. + * Checks if this entry represents a block device. * * @return TRUE if this entry is a block device. */ @@ -646,7 +706,7 @@ public class CpioArchiveEntry implements CpioConstants, ArchiveEntry { } /** - * Check if this entry represents a character device. + * Checks if this entry represents a character device. * * @return TRUE if this entry is a character device. */ @@ -655,7 +715,7 @@ public class CpioArchiveEntry implements CpioConstants, ArchiveEntry { } /** - * Check if this entry represents a directory. + * Checks if this entry represents a directory. * * @return TRUE if this entry is a directory. */ @@ -665,7 +725,7 @@ public class CpioArchiveEntry implements CpioConstants, ArchiveEntry { } /** - * Check if this entry represents a network device. + * Checks if this entry represents a network device. * * @return TRUE if this entry is a network device. */ @@ -674,7 +734,7 @@ public class CpioArchiveEntry implements CpioConstants, ArchiveEntry { } /** - * Check if this entry represents a pipe. + * Checks if this entry represents a pipe. * * @return TRUE if this entry is a pipe. */ @@ -683,7 +743,7 @@ public class CpioArchiveEntry implements CpioConstants, ArchiveEntry { } /** - * Check if this entry represents a regular file. + * Checks if this entry represents a regular file. * * @return TRUE if this entry is a regular file. */ @@ -692,7 +752,7 @@ public class CpioArchiveEntry implements CpioConstants, ArchiveEntry { } /** - * Check if this entry represents a socket. + * Checks if this entry represents a socket. * * @return TRUE if this entry is a socket. */ @@ -701,7 +761,7 @@ public class CpioArchiveEntry implements CpioConstants, ArchiveEntry { } /** - * Check if this entry represents a symbolic link. + * Checks if this entry represents a symbolic link. * * @return TRUE if this entry is a symbolic link. */ @@ -710,7 +770,7 @@ public class CpioArchiveEntry implements CpioConstants, ArchiveEntry { } /** - * Set the checksum. The checksum is calculated by adding all bytes of a + * Sets the checksum. The checksum is calculated by adding all bytes of a * file to transfer (crc += buf[pos] & 0xFF). * * @param chksum @@ -722,7 +782,7 @@ public class CpioArchiveEntry implements CpioConstants, ArchiveEntry { } /** - * Set the device id. + * Sets the device id. * * @param device * The device id to set. @@ -736,7 +796,7 @@ public class CpioArchiveEntry implements CpioConstants, ArchiveEntry { } /** - * Set major device id. + * Sets major device id. * * @param maj * The major device id to set. @@ -747,7 +807,7 @@ public class CpioArchiveEntry implements CpioConstants, ArchiveEntry { } /** - * Set the minor device id + * Sets the minor device id * * @param min * The minor device id to set. @@ -758,7 +818,7 @@ public class CpioArchiveEntry implements CpioConstants, ArchiveEntry { } /** - * Set the filesize. + * Sets the filesize. * * @param size * The filesize to set. @@ -772,7 +832,7 @@ public class CpioArchiveEntry implements CpioConstants, ArchiveEntry { } /** - * Set the group id. + * Sets the group id. * * @param gid * The group id to set. @@ -782,7 +842,7 @@ public class CpioArchiveEntry implements CpioConstants, ArchiveEntry { } /** - * Set the inode. + * Sets the inode. * * @param inode * The inode to set. @@ -792,7 +852,7 @@ public class CpioArchiveEntry implements CpioConstants, ArchiveEntry { } /** - * Set the mode of this entry (e.g. directory, regular file). + * Sets the mode of this entry (e.g. directory, regular file). * * @param mode * The mode to set. @@ -820,7 +880,7 @@ public class CpioArchiveEntry implements CpioConstants, ArchiveEntry { } /** - * Set the name. + * Sets the name. * * @param name * The name to set. @@ -830,7 +890,7 @@ public class CpioArchiveEntry implements CpioConstants, ArchiveEntry { } /** - * Set the number of links. + * Sets the number of links. * * @param nlink * The number of links to set. @@ -840,7 +900,7 @@ public class CpioArchiveEntry implements CpioConstants, ArchiveEntry { } /** - * Set the remote device id. + * Sets the remote device id. * * @param device * The remote device id to set. @@ -854,7 +914,7 @@ public class CpioArchiveEntry implements CpioConstants, ArchiveEntry { } /** - * Set the remote major device id. + * Sets the remote major device id. * * @param rmaj * The remote major device id to set. @@ -868,7 +928,7 @@ public class CpioArchiveEntry implements CpioConstants, ArchiveEntry { } /** - * Set the remote minor device id. + * Sets the remote minor device id. * * @param rmin * The remote minor device id to set. @@ -882,7 +942,7 @@ public class CpioArchiveEntry implements CpioConstants, ArchiveEntry { } /** - * Set the time in seconds. + * Sets the time in seconds. * * @param time * The time to set. @@ -892,7 +952,17 @@ public class CpioArchiveEntry implements CpioConstants, ArchiveEntry { } /** - * Set the user id. + * Sets the time. + * + * @param time + * The time to set. + */ + public void setTime(final FileTime time) { + this.mtime = time.to(TimeUnit.SECONDS); + } + + /** + * Sets the user id. * * @param uid * The user id to set. @@ -926,8 +996,7 @@ public class CpioArchiveEntry implements CpioConstants, ArchiveEntry { final CpioArchiveEntry other = (CpioArchiveEntry) obj; if (name == null) { return other.name == null; - } else { - return name.equals(other.name); } + return name.equals(other.name); } } diff --git a/src/main/java/org/apache/commons/compress/archivers/cpio/CpioArchiveOutputStream.java b/src/main/java/org/apache/commons/compress/archivers/cpio/CpioArchiveOutputStream.java index cb15410..09d56e7 100644 --- a/src/main/java/org/apache/commons/compress/archivers/cpio/CpioArchiveOutputStream.java +++ b/src/main/java/org/apache/commons/compress/archivers/cpio/CpioArchiveOutputStream.java @@ -22,6 +22,8 @@ import java.io.File; import java.io.IOException; import java.io.OutputStream; import java.nio.ByteBuffer; +import java.nio.file.LinkOption; +import java.nio.file.Path; import java.util.Arrays; import java.util.HashMap; @@ -577,4 +579,18 @@ public class CpioArchiveOutputStream extends ArchiveOutputStream implements return new CpioArchiveEntry(inputFile, entryName); } + /** + * Creates a new ArchiveEntry. The entryName must be an ASCII encoded string. + * + * @see org.apache.commons.compress.archivers.ArchiveOutputStream#createArchiveEntry(java.io.File, java.lang.String) + */ + @Override + public ArchiveEntry createArchiveEntry(final Path inputPath, final String entryName, LinkOption... options) + throws IOException { + if(finished) { + throw new IOException("Stream has already been finished"); + } + return new CpioArchiveEntry(inputPath, entryName, options); + } + } diff --git a/src/main/java/org/apache/commons/compress/utils/IOUtils.java b/src/main/java/org/apache/commons/compress/utils/IOUtils.java index 7fa502a..97fd221 100644 --- a/src/main/java/org/apache/commons/compress/utils/IOUtils.java +++ b/src/main/java/org/apache/commons/compress/utils/IOUtils.java @@ -23,11 +23,13 @@ import java.io.Closeable; import java.io.EOFException; import java.io.File; import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.nio.ByteBuffer; import java.nio.channels.ReadableByteChannel; +import java.nio.file.Files; /** * Utility functions @@ -261,4 +263,15 @@ public final class IOUtils { } } } + + /** + * Copies the source file to the given output stream. + * @param sourceFile The file to read. + * @param outputStream The output stream to write. + * @throws IOException if an I/O error occurs when reading or writing. + * @since 1.21 + */ + public static void copy(File sourceFile, OutputStream outputStream) throws IOException { + Files.copy(sourceFile.toPath(), outputStream); + } } diff --git a/src/test/java/org/apache/commons/compress/AbstractTestCase.java b/src/test/java/org/apache/commons/compress/AbstractTestCase.java index 4e241c8..08d1985 100644 --- a/src/test/java/org/apache/commons/compress/AbstractTestCase.java +++ b/src/test/java/org/apache/commons/compress/AbstractTestCase.java @@ -217,7 +217,7 @@ public abstract class AbstractTestCase { throws IOException, FileNotFoundException { final ArchiveEntry entry = out.createArchiveEntry(infile, filename); out.putArchiveEntry(entry); - IOUtils.copy(new FileInputStream(infile), out); + IOUtils.copy(infile, out); out.closeArchiveEntry(); archiveList.add(filename); }