<?xml version="1.0" encoding="UTF-8"?>
<!--
 Licensed to the Apache Software Foundation (ASF) under one
 or more contributor license agreements.  See the NOTICE file
 distributed with this work for additional information
 regarding copyright ownership.  The ASF licenses this file
 to you under the Apache License, Version 2.0 (the
 "License"); you may not use this file except in compliance
 with the License.  You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing,
 software distributed under the License is distributed on an
 "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 KIND, either express or implied.  See the License for the
 specific language governing permissions and limitations
 under the License.
-->

<!--
This file is also used by the maven-changes-plugin to generate the release notes.
Useful ways of finding items to add to this file are:

1.  Add items when you fix a bug or add a feature (this makes the
release process easy :-).

2.  Do a JIRA search for tickets closed since the previous release.

3.  Use the report generated by the maven-changelog-plugin to see all
SVN commits. TBA how to use this with SVN.

To generate the release notes from this file:

mvn changes:announcement-generate -Prelease-notes [-Dchanges.version=m.n]

The <action> type attribute can be add,update,fix,remove.
-->

<document>
  <properties>
    <title>Apache Commons Compress Release Notes</title>
  </properties>
  <body>
    <release version="1.22" date="not released, yet (Java 8)">
      <!-- FIX -->
      <action type="fix" dev="ggregory" due-to="Gary Gregory">
        Fix some compiler warnings in pack200 packages.
      </action>
      <action type="fix" dev="ggregory" due-to="Gary Gregory">
        Close File input stream after unpacking in Pack200UnpackerAdapter.unpack(File, JarOutputStream).
      </action>
      <action type="fix" dev="ggregory" due-to="Gary Gregory">
        Pack200UnpackerAdapter.unpack(InputStream, JarOutputStream) should not close its given input stream.
      </action>
      <action issue="COMPRESS-596" type="fix" date="2021-12-07" dev="Peter Lee" due-to="Tamas Mucs">
        Fix minor problem in examples.
      </action>
      <action issue="COMPRESS-584" type="fix" date="2021-08-11" dev="matthijsln" due-to="Matthijs Laan, Peter Lee">
        Add a limit to the copy buffer in IOUtils.readRange() to
        avoid reading more from a channel than asked for.
        Github Pull Request #214.
      </action>
      <action type="fix" dev="ggregory" due-to="Helder Magalhães, Gary Gregory, PeterAlfredLee">
        Documentation nits #217.
      </action>
      <action type="fix" dev="ggregory" due-to="Arturo Bernal">
        Replace wrapper Collections.sort is with an instance method directly. #245.
      </action>
      <action type="fix" dev="ggregory" due-to="Arturo Bernal">
        Replace manual comparisons with Comparator.comparingInt() #244.
      </action>
      <action type="fix" dev="ggregory" due-to="Arturo Bernal">
        Replace manual copy of array contents with System.arraycopy() #246.
      </action>
      <action type="fix" dev="ggregory" due-to="Glavo, Bruno P. Kinoshita, PeterAlfredLee, Gary Gregory">
        Fix thread safety issues when encoding 7z password #248.
      </action>
      <action type="fix" dev="ggregory" due-to="Peter Dettman">
        bzip2: calculate median-of-3 on unsigned values #242.
      </action>
      <action type="fix" dev="ggregory" due-to="Arturo Bernal, Gary Gregory, Bruno P. Kinoshita">
        Use Math.min and Math.max calculations. #247.
      </action>
      <action issue="COMPRESS-603" type="fix" date="2022-02-09" dev="Peter Lee" due-to="Matt Sicker">
        Expander should be able to work if an entry's name is "./".
      </action>
      <action issue="COMPRESS-604" type="fix" dev="ggregory" due-to="Andre Brait">
        Ensure compatibility with Java 8 #252.
      </action>
      <action type="fix" dev="ggregory" due-to="Arturo Bernal">
        Use StringBuilder instead of StringBuffer. #284.
      </action>
      <action type="fix" dev="ggregory" due-to="Arturo Bernal">
        Inline variable. Remove redundant local variable. #283.
      </action>
      <action type="fix" dev="ggregory" due-to="Arturo Bernal">
        Use compare method #285.
      </action>
      <action type="fix" dev="ggregory" due-to="Arturo Bernal">
        Remove Unnecessary interface modifiers #281.
      </action>
      <action type="fix" dev="ggregory" due-to="Arturo Bernal">
        Avoid use C-style array declaration. #282.
      </action>
      <action type="fix" dev="ggregory" due-to="Gary Gregory">
        ChecksumVerifyingInputStream.read() does not always validate checksum at end-of-stream.        
      </action>
      <action type="fix" dev="ggregory" due-to="Matt Juntunen">
        Fix TarFileTest #289.
      </action>
      <action issue="COMPRESS-625" type="fix" dev="ggregory" due-to="MrBump, Gary Gregory">
        Update Wikipedia link in TarUtils.java:627.
      </action>
      <action issue="COMPRESS-626" type="fix" dev="ggregory" due-to="Andrii Hudz, Gary Gregory">
        OutOfMemoryError on malformed pack200 input (attributes).
      </action>
      <action issue="COMPRESS-628" type="fix" dev="ggregory" due-to="Andrii Hudz, Gary Gregory">
        OutOfMemoryError on malformed pack200 input (org.apache.commons.compress.harmony.pack200.NewAttributeBands.readNextUnionCase).
      </action>
      <action issue="COMPRESS-628" type="fix" dev="ggregory" due-to="Gary Gregory">
        OutOfMemoryError on malformed unpack200 input (org.apache.commons.compress.harmony.unpack200.NewAttributeBands.readNextUnionCase).
      </action>
      <action type="fix" dev="ggregory" due-to="Gary Gregory">
        Some input streams are not closed in org.apache.commons.compress.harmony.pack200.PackingUtils.
      </action>
      <action issue="COMPRESS-627" type="fix" dev="ggregory" due-to="anatawa12, Gary Gregory">
        Pack200 causes a 'archive.3E' error if it’s not in the system class loader.
      </action>
      <!-- ADD -->
      <action issue="COMPRESS-602" type="add" dev="ggregory" due-to="Postelnicu George, Gary Gregory">
        Migrate zip package to use NIO #236.
      </action>
      <action type="add" dev="ggregory" due-to="Gary Gregory">
        Add APK file extension constants: ArchiveStreamFactory.APK, APKM, APKS, XAPK.
      </action>
      <action type="add" dev="ggregory" due-to="Gary Gregory">
        ArchiveStreamFactory.createArchiveInputStream(String, InputStream, String) supports the "APK" format (it's a JAR).
      </action>
      <action type="add" dev="ggregory" due-to="Gary Gregory">
        Expander example now has NIO Path versions of IO File APIs.
      </action>
      <action issue="COMPRESS-612" type="add" dev="ggregory" due-to="Andre Brait, Gary Gregory">
        Improve TAR support for file times #254.
      </action>
      <action type="add" dev="ggregory" due-to="Gary Gregory">
        Add SevenZArchiveEntry.setContentMethods(SevenZMethodConfiguration...).
      </action>
      <!-- UPDATE -->
      <action type="update" dev="kinow" due-to="Dependabot, Gary Gregory">
        Bump actions/cache from 2.1.6 to 3.0.10 #230, #257, #305, #320.
      </action>
      <action type="update" dev="ggregory" due-to="Dependabot, Gary Gregory">
        Bump actions/checkout from 2.3.4 to 3.1.0 #226, #227, #251, #300, #321.
      </action>
      <action type="update" dev="kinow" due-to="Dependabot">
        Bump actions/setup-java from 2 to 3.5.1 #278.
      </action>
      <action type="update" dev="kinow" due-to="Dependabot">
        Bump github/codeql-action from 1 to 2 #287.
      </action>
      <action type="update" dev="ggregory" due-to="Dependabot">
        Bump mockito-core from 3.11.1 to 4.6.1 #209, #224, #231, #235, #243, #253, #286, #294.
      </action>
      <action type="update" dev="ggregory" due-to="Dependabot">
        Bump org.apache.felix.framework from 7.0.0 to 7.0.1 #208.
      </action>
      <action type="update" dev="ggregory" due-to="Dependabot">
        Bump memoryfilesystem from 2.1.0 to 2.3.0 #212, #237.
      </action>
      <action type="update" dev="ggregory" due-to="Dependabot, Gary Gregory">
        Bump zstd-jni from 1.5.0-2 to 1.5.2-5 #215, #233, #238, #240, #250, #291, #326.
      </action>
      <action type="update" issue="COMPRESS-582" dev="ggregory" due-to="Alex Landau, Stephan, Gary Gregory">
        Bump Pack200 packages from ASM 3.2 to 9.2 #216. 
        Breaks binary compatibility in the internals of the pack200 implementation:
        - org.apache.commons.compress.harmony.pack200.Segment
        - org.apache.commons.compress.harmony.pack200.SegmentMethodVisitor
        - org.apache.commons.compress.harmony.pack200.SegmentAnnotationVisitor
        - org.apache.commons.compress.harmony.pack200.SegmentFieldVisitor
      </action>
      <action type="update" dev="kinow" due-to="Dependabot">
        Bump asm from 9.2 to 9.4 #279, #322.
      </action>
      <action type="update" dev="ggregory" due-to="Dependabot">
        Bump maven-javadoc-plugin from 3.3.0 to 3.4.1 #221, #249, #288, #308.
      </action>
      <action type="update" dev="ggregory" due-to="Gary Gregory, Dependabot">
        Bump maven-pmd-plugin from 3.14.0 to 3.19.0 #296, #309, #311.
      </action>
      <action type="update" dev="ggregory" due-to="Gary Gregory">
        Bump pmd from 6.44.0 to 6.50.0.
      </action>
      <action type="update" dev="kinow" due-to="Gary Gregory">
        Bump commons.japicmp.version from 0.15.3 to 0.16.0.
      </action>
      <action type="update" dev="ggregory" due-to="Dependabot">
        Bump maven-bundle-plugin from 5.1.2 to 5.1.8 #234, #239, #290, #292, #301, #304.
      </action>
      <action type="update" dev="ggregory" due-to="Dependabot">
        Bump org.apache.felix.framework from 7.0.1 to 7.0.5 #232, #295.
      </action>
      <action type="update" dev="kinow" due-to="Dependabot">
        Bump slf4j-api from 1.7.30 to 2.0.3 #213, #241, #258, #310, #314, #315, #318.
      </action>
      <action type="update" dev="kinow" due-to="Dependabot, Gary Gregory">
        Bump commons-parent from 52 to 54 #280.
      </action>
      <action type="update" dev="ggregory" due-to="Gary Gregory">
        Bump commons.jacoco.version from 0.8.7 to 0.8.8.
      </action>
      <action type="update" dev="kinow" due-to="Dependabot">
        Bump junit.version from 5.8.2 to 5.9.1 #302, #317.
      </action>
      <action type="update" dev="kinow" due-to="Dependabot">
        Bump mockito.version from 4.6.1 to 4.8.0 #307, #312.
      </action>
      <action type="update" dev="ggregory" due-to="Gary Gregory">
        Bump maven-surefire-plugin from 3.0.0-M6 to 3.0.0-M7.
      </action>
    </release>
    <release version="1.21" date="2021-07-12"
             description="Release 1.21 (Java 8)
----------------------------------------

SevenZFileOptions has a new setting that needs to be enabled explicity
if SevenZFile should try to recover broken archives - a feature
introduced with Commons Compress 1.19. This is a breaking change if
you relied on the recovery attempt.">
      <action type="update" date="2020-03-07"
              due-to="Peter Alfred Lee">
        Made sure ZstdCompressorOutputStream no longer used
        deprecated ZstOutputStream constructors.
        Github Pull Request #94.
      </action>
      <action issue="COMPRESS-504" type="update" date="2020-03-16">
        Make compression level of ParallelScatterZipCreator
        configurable via a new constructor.
      </action>
      <action issue="COMPRESS-505" type="fix" date="2020-03-24">
        Fix bugs in random access of 7z. Problems may happen
        in a mixture use of random access and sequential access
        of 7z.
        Github Pull Request #95.
      </action>
      <action issue="COMPRESS-510" type="fix" date="2020-04-18">
        Fix bugs in random access of 7z. Exceptions are thrown
        when reading the first entry multiple times by random
        access.
      </action>
      <action issue="COMPRESS-509" type="fix" date="2020-05-06"
              due-to="Petr Vasak" dev="PeterLee">
        Add '/' to directories with long name in tar. This is to
        resolve the ambiguous behavior of the TarArchiveEntry.getName()
        method between directory with short name and long name.
      </action>
      <action issue="COMPRESS-520" type="fix" date="2020-05-23" due-to="Robin Schimpf">
        Removed the PowerMock dependency.
      </action>
      <action issue="COMPRESS-516" type="fix" date="2020-05-23">
        Added improved checks to detect corrupted bzip2 streams and
        throw the expected IOException rather than obscure
        RuntimeExceptions.
        See also COMPRESS-519.
      </action>
      <action issue="COMPRESS-517" type="fix" date="2020-05-23">
        Improved parsing of X5455_ExtendedTimestamp ZIP extra field.
      </action>
      <action issue="COMPRESS-518" type="fix" date="2020-05-23">
        ZipArchiveInputStream and ZipFile will now throw an
        IOException rather than a RuntimeException if the zip64 extra
        field of an entry could not be parsed.
      </action>
      <action issue="COMPRESS-523" type="fix" date="2020-05-23">
        Improved detection of corrupt ZIP archives in ZipArchiveInputStream.
      </action>
      <action issue="COMPRESS-521" type="fix" date="2020-05-24">
        Added improved checks to detect corrupted deflate64 streams and
        throw the expected IOException rather than obscure
        RuntimeExceptions.
        See also COMPRESS-522, COMPRESS-525, COMPRESS-526, and COMPRESS-527.
      </action>
      <action issue="COMPRESS-515" type="fix" date="2020-05-22" due-to="ian-lavallee">
        Add the archive name in the exception in the constructor of
        ZipFile to make it a more specific exception.
        Github Pull Request #102.
      </action>
      <action issue="COMPRESS-530" type="fix" date="2020-05-26">
        Throw IOException when it encounters a non-number while parsing pax header.
      </action>
      <action issue="COMPRESS-531" type="fix" date="2020-05-31">
        Throw IOException when a a tar archive contains a PAX header
        without any normal entry following it.
      </action>
      <action issue="COMPRESS-532" type="fix" date="2020-05-31">
        Added improved checks to detect corrupted IMPLODED streams and
        throw the expected IOException rather than obscure
        RuntimeExceptions.
      </action>
      <action issue="COMPRESS-529" type="fix" date="2020-06-01">
        Throw expected IOException instead of NumberFormatException if
        it encounters non-numbers when parsing pax headers for tarball.

        Throw IllegalArgumentException instead of RuntimeExceptions if
        the file name is longer than 100 bytes with the longFileMode
        of LONGFILE_ERROR, and address this in java docs.

        Throw IllegalArgumentException instead of RuntimeExceptions if
        the any of the numeric values of an entry exceeds the limits
        of a traditional tar header while bigNumberMode is
        BIGNUMBER_ERROR, and address this in java docs.
      </action>
      <action issue="COMPRESS-536" type="update" date="2020-06-03"
              due-to="Jin Xu">
        Made an inner class static
        Github Pull Request #107.
      </action>
      <action issue="COMPRESS-535" type="update" date="2020-06-06"
              due-to="Jin Xu">
        added an early exit to a loop in BZip2CompressorOutputStream
        Github Pull Request #106.
      </action>
      <action issue="COMPRESS-404" type="update" date="2020-06-08" due-to="theobisproject">
        Update the class of variable file in TarArchiveEntry from
        java.io.File to java.nio.file.Path. Corresponding constructors
        and methods are also modified/added.

        NOTE: The userName, groupName, userID and groupID will also be
        set if they are available. The userName and groupName was not
        set previously, and the previous value of UserID:GroupID was
        0:0 by default.
        Please note this may cause a reproducibility problem.

        Github Pull Request #97.
      </action>
      <action issue="COMPRESS-539" type="update" date="2020-07-04" due-to="Robin Schimpf">
        Reuse the record buffer in TarArchiveInputStream.
      </action>
      <action type="update" date="2020-08-08" due-to="Gary Gregory" dev="ggregory">
        Add SevenZOutputFile.write(InputStream).
      </action>
      <action type="update" date="2020-08-08" due-to="Gary Gregory" dev="ggregory">
        Add SevenZOutputFile.write(Path, OpenOption...).
      </action>
      <action type="update" date="2020-08-08" due-to="Gary Gregory" dev="ggregory">
        Add SevenZOutputFile.createArchiveEntry(Path, String, LinkOption...).
      </action>
      <action type="update" date="2020-08-08" due-to="Gary Gregory" dev="ggregory">
        Add ArArchiveOutputStream.createArchiveEntry(Path, String, LinkOption...).
      </action>
      <action type="update" date="2020-08-08" due-to="Gary Gregory" dev="ggregory">
        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 TarArchiveOutputStream.createArchiveEntry(Path, String, LinkOption...).
      </action>
      <action type="update" date="2020-08-08" due-to="Gary Gregory" dev="ggregory">
        Add ctor TarArchiveEntry(Path, String, LinkOption...).
      </action>
      <action type="update" date="2020-08-08" due-to="Gary Gregory" dev="ggregory">
        Add IOUtils.EMPTY_LINK_OPTIONS.
      </action>
      <action type="update" date="2020-08-08" due-to="Gary Gregory" dev="ggregory">
        Add Path support to ZipArchiveOutputStream #123.
      </action>
      <action issue="COMPRESS-543" type="fix" date="2020-08-10"
              due-to="wulf2333" dev="PeterLee">
        Fix for test fails on Windows. The tests are failing because the
        default charset is not UTF-8.
      </action>
      <action issue="COMPRESS-544" type="fix" date="2020-08-13"
              due-to="Aditya Prasad" dev="PeterLee">
        TarArchiveInputStream can not detect a truncated tar in skip()
        and skipRecordPadding().
      </action>
      <action issue="COMPRESS-542" type="fix" date="2020-08-15"
              due-to="theobisproject" dev="theobisproject">
        Make the memory allocation in SevenZFile.readFilesInfo a lazy
        allocation to avoid OOM when dealing some giant 7z archives.
        Github Pull Request #120.

        Also added sanity checks before even trying to parse an
        archive and made SevenZFileOptions' maxMemorySizeInKb apply to
        the stored metadata for an archive.

        And further added an option that needs to be enabled in order
        to make SevenZFile try to recover a broken archive. This is a
        backwards incompatible change.
      </action>
      <action issue="COMPRESS-546" type="fix" date="2020-08-15"
              due-to="Maksim Zuev" dev="PeterLee">
        ZipArchiveInputStream should throw an exception if a corrputed
        zip64 extra field is met.
      </action>
      <action type="fix" date="2020-08-22" dev="PeterLee">
        Add a new maven profile in pom.xml for JDK14+ to ignore the
        failing tests about Pack200.

        This has later been superseeded by adding the Apache Harmony
        classes for Pack200 support.
      </action>
      <action issue="COMPRESS-548" type="fix" date="2020-08-24"
              due-to="Maksim Zuev" dev="PeterLee">
        Throw an IOException when reading the zip extra field if the
        length is too short.
      </action>
      <action issue="COMPRESS-554" type="fix" date="2020-09-01"
              due-to="Maksim Zuev" dev="PeterLee">
        Throw an declared IOException if a null entry is met when
        reading a global pax header instead of a runtime NPE.
      </action>
      <action issue="COMPRESS-545" type="fix" date="2020-09-02"
              due-to="Maksim Zuev" dev="PeterLee">
        ZIP extraction could lead to ArrayIndexOutOfBoundsExceptions
        rather than the expected IOException.
      </action>
      <action issue="COMPRESS-547" type="fix" date="2020-09-02"
              due-to="Maksim Zuev" dev="PeterLee">
        Add asserts for Arrays.copyOf in X0017_StrongEncryptionHeader.
      </action>
      <action issue="COMPRESS-550" type="add" date="2020-09-07"
              due-to="Scott Frederick" dev="PeterLee">
        Add writePreamble to ZipArchiveInputStream. This method could
        write raw data to zip archive before any entry was written to
        the zip archive.
        For most of the time, this is used to create self-extracting
        zip.
        Github Pull Request #127.
      </action>
      <action type="fix" date="2020-09-24" dev="PeterLee">
        Fix for the CFH signature detect in ZipArchiveInputStream.
        The problem could be reproduced by a zip archive with Data
        Descriptor and STORED, and without the Data Descriptor
        signature.
      </action>
      <action issue="COMPRESS-553" type="fix" date="2020-10-07"
              due-to="Maksim Zuev" dev="PeterLee">
        The length validation in TarArchiveInputStream.parsePaxHeaders
        should also consider the headers with length smaller than 1
        and ignore these headers.
      </action>
      <action issue="COMPRESS-558" type="fix" date="2020-11-13"
              due-to="Robin Schimpf" dev="Robin Schimpf">
        Fix accidentally added '/' to file names.
        This problem is caused by the incomplete fix of
        COMPRESS-509.
        Github Pull Request #151.
      </action>
      <action issue="COMPRESS-560" type="fix" date="2020-11-30"
              due-to="Robin Schimpf" dev="Robin Schimpf">
        As sparse entries can be successfully parsed now,
        TarArchiveInputStream.canReadEntryData should return
        true if the entry is a sparse entry.
        Github Pull Request #153.
      </action>
      <action issue="COMPRESS-559" type="fix" date="2020-12-10"
              due-to="Robin Schimpf" dev="Robin Schimpf">
        SparseFilesTest#testExtractPaxGNU should be skipped
        if the version of GNU tar binary is 1.28.
        Github Pull Request #152.
      </action>
      <action issue="COMPRESS-561" type="update" date="2020-12-22"
              due-to="Arturo Bernal" dev="Arturo Bernal">
        Some minor improvements.
        Github Pull Request #157.
      </action>
      <action issue="COMPRESS-540" type="add" date="2020-01-09"
              due-to="Robin Schimpf" dev="Robin Schimpf">
        Added support for random access to the TAR packages.
        Github Pull Request #113.
      </action>
      <action issue="COMPRESS-565" type="add" date="2021-02-14"
              due-to="Michael L Heuer" dev="PeterLee">
        Added support for BufferPool in ZstdCompressorInputStream.
        Github Pull Request #165.
      </action>
      <action type="fix" date="2021-02-27" due-to="Fabian Meumertzheim">
        Removed an empty loop that was just warming the planet for
        certain ZIP archives.
        Github Pull Request #172.
      </action>
      <action issue="COMPRESS-567" type="fix" date="2021-02-28">
        Made some of the stream classes used internally throw
        IOExceptions on illegal arguments rather than
        RuntimeExceptions to make it more likely that corrupt archives
        cause expected checked exceptions rather than RuntimException
        for various formats.

        Fixes a specific case for ZIP but affects other formats as
        well.
      </action>
      <action issue="COMPRESS-507" type="add" date="2021-07-02"
              due-to="Gary Gregory, Apache Harmony" dev="ggregory">
        Commons Compress cannot be built with JDK14 due to Pack200 removal. 
        Add Pack200 implementation from Apache Harmony.
      </action>
      <action type="fix" date="2021-07-02" due-to="Arturo Bernal" dev="ggregory">
        Simplify Assertions #205.
      </action>
      <!-- UPDATE -->
      <action type="update" date="2020-08-18">
        Update from Java 7 to 8.
      </action>
      <action type="update" date="2020-08-10" due-to="Dependabot" dev="ggregory">
        Update GitHub actions/checkout from v1 to v2.3.4, #114, #124, #139, #150.
      </action>
      <action type="update" date="2020-08-21" due-to="Dependabot, Gary Gregory" dev="ggregory">
        Update actions/setup-java from v1.4.0 to v2, #125, #133, #141.
      </action>
      <action type="update" date="2020-08-21" due-to="Dependabot, Gary Gregory" dev="ggregory">
        Update com.github.luben:zstd-jni from 1.4.4-7 to 1.5.0-2, #118, #159, #173, #174, #203.
      </action>
      <action type="update" date="2020-08-21" due-to="Dependabot" dev="ggregory">
        Update tests slf4j-api from 1.7.26 to 1.7.30 #117.
      </action>
      <action type="update" date="2020-08-21" due-to="Dependabot" dev="ggregory">
        Update maven-pmd-plugin from 3.12.0 to 3.14.0, #115, #154.
      </action>
      <action type="update" date="2020-08-21" due-to="Dependabot" dev="ggregory">
        Update maven-bundle-plugin from 3.5.1 to 5.1.2 #116, #180.
      </action>
      <action type="update" date="2020-11-01" due-to="Dependabot" dev="ggregory">
        Bump memoryfilesystem from 1.3.0 to 2.1.0 #131.
      </action>
      <action type="update" due-to="Dependabot" dev="ggregory">
        Bump actions/cache from v2 to v2.1.6, #164, #200.
      </action>
      <action type="update" due-to="Dependabot" dev="ggregory">
        Bump junit from 4.13 to 4.13.2, #143, #167.
      </action>
      <action type="update" due-to="Dependabot" dev="ggregory">
        Bump mockito-core from 1.10.19 to 3.11.1, #161, #170, #204.
      </action>
      <action type="update" due-to="Gary Gregory" dev="ggregory">
        Bump commons.jacoco.version from 0.8.5 to 0.8.7 (Java 16 builds).
      </action>
      <action type="update" due-to="Gary Gregory" dev="ggregory">
        Bump org.apache.felix:org.apache.felix.framework from 6.0.3 to 7.0.0 (Java 16 builds).
      </action>
      <action type="update" due-to="Gary Gregory" dev="ggregory">
        Bump commons.japicmp.version from 0.14.3 to 0.15.3 (Java 16 builds).
      </action>
      <action type="update" due-to="Gary Gregory" dev="ggregory">
        Bump commons.javadoc.version from 3.2.0 to 3.3.0.
      </action>
      <action issue="COMPRESS-569" type="fix" date="2021-03-06">
        Checked the sizes read for archive entries and reject archives
        as broken with negative entry sizes.

        Fixes an infinite loop in the new TarFile class but affects
        several formats.
      </action>
      <action issue="COMPRESS-552" type="fix" date="2021-03-07">
        OSGi detection was broken and so we always cached whether
        xz/brotli/zstd/lzma have been available even in OSGi
        environments.
      </action>
      <action issue="COMPRESS-571" type="fix" date="2021-03-17">
        SevenZFile.getEntries now return a copy of entries.
      </action>
      <action type="update" date="2020-08-21" due-to="Dependabot" dev="PeterLee">
        Update com.github.luben:zstd-jni from 1.4.8-7 to 1.4.9-1 #176.
      </action>
      <action issue="COMPRESS-575" type="fix" date="2021-05-01">
        Handling of sparse tar entries has been hardened to ensure bad
        inputs cause expected IOExceptions rather than RuntimeExceptions.
      </action>
      <action type="update" date="2021-05-12">
        Update org.tukaani:xz from 1.8 to 1.9
      </action>
      <action issue="COMPRESS-565" type="add" date="2021-05-19" due-to="Evgenii Bovykin" dev="PeterLee">
        Add a new AlwaysWithCompatibility in Zip64Mode, this is a
        compromise for some libraries including 7z and Expand-Archive
        Powershell utility(and likely Excel).

        And we will encode both the LFH offset and Disk Number Start
        in the ZIP64 Extended Information Extra Field - even if only
        the disk number needs to be encoded.

        Github Pull Request #169.
      </action>
      <action issue="COMPRESS-577" type="update" date="2021-05-22"
              due-to="Arturo Bernal" dev="Arturo Bernal">
        Some minor improvements.
        Github Pull Request #193.
      </action>
      <action issue="COMPRESS-578" type="update" date="2021-05-22"
              due-to="Arturo Bernal" dev="Arturo Bernal">
        Java8 improvements.
        Github Pull Request #194.
      </action>
      <action issue="COMPRESS-579" type="update" date="2021-05-22"
              due-to="Arturo Bernal" dev="Arturo Bernal">
        Remove redundant local variable.
        Github Pull Request #195.
      </action>
      <action issue="COMPRESS-580" type="update" date="2021-05-22"
              due-to="Arturo Bernal" dev="Arturo Bernal">
        Remove redundant operation
        Github Pull Request #196.
      </action>
      <action issue="COMPRESS-566" type="add" date="2021-05-24"
              due-to="Brett Okken">
        gzip deflate buffer size is now configurable.
      </action>
      <action type="fix" date="2021-06-05">
        The parser for GNU sparse tar headers could throw a
        NullPointerExcpetion rather than an IOException if the archive
        ended while more sparse headers were expected.
      </action>
      <action issue="COMPRESS-591" type="update" date="2021-09-29"
              due-to="Lasse Collin" dev="Peter Lee">
        Call enableRelaxedEndCondition() to enable decoding of 7z
        files containing LZMA streams with end marker.
        Github Pull Request #223.
      </action>
      <action issue="COMPRESS-592" type="fix" date="2021-10-29"
              dev="Peter Lee" due-to="Roland Kreuzer">
        Use LinkedHashMap for fileMap in SevenZFile.readFilesInfo,
        as it will be read in specific order.
      </action>
    </release>
    <release version="1.20" date="2020-02-08"
             description="Release 1.20 (Java 7)">
      <action issue="COMPRESS-493" type="update" date="2019-08-27">
        Update optional library com.github.luben:zstd-jni from 1.4.0-1 to 1.4.4-7.
      </action>
      <action type="update" date="2019-08-27">
        Update tests from org.apache.felix:org.apache.felix.framework 6.0.2 to 6.0.3.
      </action>
      <action issue="COMPRESS-492" type="fix" date="2019-08-28">
        SevenZFile could throw NullPointerException rather than
        IOException for certain archives. In addition it now handles
        certain empty archives more gracefully.
      </action>
      <action issue="COMPRESS-491" type="fix" date="2019-09-01">
        Deflate64CompressorInputStream.read would return 0 for some
        inputs in violation of the InputStream.read contract.
      </action>
      <action issue="COMPRESS-495" type="remove" date="2019-10-12">
        Removed the extraction code from the example CLI class inside
        of the SevenZ package. Not only is it superseeded by the
        examples package, its implementation was vulnerable to the
        ZipSlip attack.
      </action>
      <action issue="COMPRESS-497" type="update" date="2019-10-12"
              due-to="Stefan Schlott">
        SevenZFile can now recover from a certain corruption that
        seems to happen occasionally when split archives are created.
      </action>
      <action issue="COMPRESS-342" type="update" date="2019-11-07"
              due-to="Peter Alfred Lee">
        Added random access support to SevenZFile.
      </action>
      <action issue="COMPRESS-477" type="update" date="2019-12-15"
              due-to="Peter Alfred Lee">
        Added support for split ZIP archives.
      </action>
      <action issue="COMPRESS-124" type="update" date="2020-01-01"
              due-to="Peter Alfred Lee">
        Added support for reading sparse entries to the TAR package.
      </action>
      <action issue="COMPRESS-499" type="fix" date="2020-01-04">
        SeekableInMemoryByteChannel's truncate didn't set position
        according to the spec in an edge case.
      </action>
      <action type="fix" due-to="Joseph Allemandou" date="2020-01-21">
        BZip2CompressorInputStream now incorporates a similar patch as
        the one that fixed CVE-2019-12900 in libbzip2.

        Commons Compress has not been vulnerable to this CVE as it
        would have rejected a file with too many selectors. With this
        patch Commons Compress will be able to read certain archives
        that would have caused errors in Compress 1.19.
      </action>
      <action type="update" date="2020-01-25">
        Update JUnit from 4.12 to 4.13.
      </action>
    </release>
    <release version="1.19" date="2019-08-27"
             description="Release 1.19
----------------------------------------

ZipArchiveInputStream and ZipFile will no longer throw an exception if
an extra field generally understood by Commons Compress is malformed
but rather turn them into UnrecognizedExtraField instances.
You can influence the way extra fields are parsed in more detail by
using the new getExtraFields(ExtraFieldParsingBehavior) method of
ZipArchiveEntry now.

Some of the ZIP extra fields related to strong encryption will now
throw ZipExceptions rather than ArrayIndexOutOfBoundsExceptions in
certain cases when used directly. There is no practical difference
when they are read via ZipArchiveInputStream or ZipFile.
">
      <action type="fix" date="2018-09-07">
        ZipArchiveInputStream could forget the compression level has
        changed under certain circumstances.
      </action>
      <action issue="COMPRESS-466" type="add" date="2018-10-07">
        It is now possible to skip parsing of local file headers when
        using ZipFile which may speed up reading the archive at the
        cost of potentially missing important information. See the
        javadocs of the ZipFile class for details.
      </action>
      <action issue="COMPRESS-469" type="add" date="2018-11-10">
        TarArchiveInputStream has a new constructor-arg lenient that
        can be used to accept certain broken archives.
      </action>
      <action issue="COMPRESS-470" type="fix" date="2018-11-18">
        Fixed another potential resource leak in
        ParallelScatterZipCreator#writeTo.
      </action>
      <action issue="COMPRESS-475" type="add" date="2018-12-15">
        ArjArchiveEntry and SevenZArchiveEntry now implement hashCode
        and equals.
      </action>
      <action type="fix" date="2019-02-18" due-to="Alex Bertram">
        ArArchiveInputStream could think it had hit EOF prematurely.
        Github Pull Request #74.
      </action>
      <action type="update" date="2019-04-16" due-to="Robin Schimpf"
              issue="COMPRESS-481">
        SevenZFile now provides a way to cap memory consumption for
        LZMA(2) compressed content.
        Github Pull Request #76.
      </action>
      <action type="update" date="2019-04-18"
              due-to="Rostislav Krasny" issue="COMPRESS-464">
        The ARJ package has been updated to contain constants for more
        recent specifications.
      </action>
      <action type="update" date="2019-04-30"
              issue="COMPRESS-484">
        Update optional library zstd-jni from 1.3.3-3 to 1.4.0-1.
      </action>
      <action type="update" date="2019-08-07"
              due-to="Hervé Boutemy, Tibor Digana"
              issue="COMPRESS-485">
        ParallelScatterZipCreator now writes the entries to the
        gathered output in the same order they have been added.
        Github Pull Requests #78 and #79.
      </action>
      <action type="fix" date="2019-08-08" issue="COMPRESS-490">
        Throw IOException rather than RuntimeExceptions for certain
        malformed LZ4 or Snappy inputs.
      </action>
      <action type="update" date="2019-08-09" issue="COMPRESS-486">
        The Expander and Archive example classes can leak resources
        they have wrapped around passed in streams or channels. The
        methods consuming streams and channels have been adapted to
        give the calling code a chance to deal with those wrapper
        resources.
      </action>
      <action type="update" date="2019-08-16" issue="COMPRESS-479">
        ZipArchiveInputStream and ZipFile no longer assume Commons
        Compress would understand extra fields better than the writer
        of the archive and silently turn extra fields that Commons
        Compress should understand into UnrecognizedExtraFields if
        parsing said fields fails.
        It is now possible to take more control over the extra field
        parsing process with a new overload of
        ZipArchiveEntry#getExtraFields.
      </action>
      <action type="fix" date="2019-08-18" issue="COMPRESS-482">
        ZipArchiveInputStream failed to read stored entries with a
        data descriptor if the data descriptor didn't use the
        signature invented by InfoZIP.
      </action>
      <action type="update" date="2019-08-18" issue="COMPRESS-483">
        ZipArchiveInputStream will now throw an exception if reading a
        stored entry with a data descriptor and the data descriptor
        doesn't match what it has actually read.

        The most common case for a situation like this is a stored ZIP
        archive inside of the archive ZipArchiveInputStream currently
        reads. In such a case ZipArchiveInputStream would happily
        extract the contained archive and stop once the central
        directory of the inner archive has been hit. This is a case
        where ZipArchiveInputStream simply can not be used and only
        ZipFile is able to read the archive.

        The only other explanation is a broken archive. So the
        exception prevents users from thinking they had successfully
        read the contents of the archive.
      </action>
      <action type="add" date="2019-08-18" issue="COMPRESS-231"
              due-to="Tim Underwood">
        Added a MultiReadOnlySeekableByteChannel class
        that can be used to concatenate the parts of a multi volume 7z
        archive so that SevenZFile can read them.
      </action>
      <action type="update" date="2019-08-20" issue="COMPRESS-478">
        The 7zip tools provide a default name for archive entries
        without name; SevenZFile returns a null name for such
        entries. A new method getDefaultName has been added to derive
        the same name the 7zip tools would use and an option has been
        added that sets SevenZArchiveEntry's name to the default name
        if it is not contained inside the archive.
      </action>
      <action type="fix" date="2019-08-20">
        NioZipEncoding#encode could enter an infinite loop for certain
        inputs.
      </action>
    </release>
    <release version="1.18" date="2018-08-16"
             description="Release 1.18
----------------------------------------

This release changes the OSGi Manifest entry Bundle-SymbolicName from
org.apache.commons.compress to org.apache.commons.commons-compress.
">
      <action type="fix" date="2018-06-15" due-to="DidierLoiseau">
        The example Expander class has been vulnerable to a path
        traversal in the edge case that happens when the target
        directory has a sibling directory and the name of the target
        directory is a prefix of the sibling directory's name.
      </action>
      <action issue="COMPRESS-456" type="fix" date="2018-06-19">
        Changed the OSGi Import-Package to also optionally import
        javax.crypto so encrypted archives can be read.
      </action>
      <action issue="COMPRESS-457" type="fix" date="2018-07-01">
        Changed various implementations of the close method to better
        ensure all held resources get closed even if exceptions are
        thrown during the closing the stream.
      </action>
      <action issue="COMPRESS-455" type="fix" date="2018-07-01">
        ZipArchiveInputStream can now detect the APK Signing Block
        used in signed Android APK files and treats it as an "end of
        archive" marker.
      </action>
      <action issue="COMPRESS-459" type="fix" date="2018-07-11"
              due-to="Jens Reimann">
        The cpio streams didn't handle archives using a multi-byte
        encoding properly.
      </action>
      <action issue="COMPRESS-460" type="add" date="2018-07-28"
              due-to="Carmi Grushko">
        It is now possible to specify the arguments of zstd-jni's
        ZstdOutputStream constructors via Commons Compress as well.
      </action>
      <action issue="COMPRESS-463" type="fix" date="2018-08-09">
        ZipArchiveInputStream#read would silently return -1 on a
        corrupted stored entry and even return > 0 after hitting the
        end of the archive.
      </action>
      <action issue="COMPRESS-462" type="fix" date="2018-08-10">
        ArArchiveInputStream#read would allow to read from the stream
        without opening an entry at all.
      </action>
    </release>
    <release version="1.17" date="2018-06-03"
             description="Release 1.17">
      <action type="fix" date="2018-02-06">
        Removed the objenesis dependency from the pom as it is not
        needed at all.
      </action>
      <action issue="COMPRESS-446" type="fix" date="2018-03-29">
        Fixed resource leak in ParallelScatterZipCreator#writeTo.
      </action>
      <action type="update" date="2018-04-01" due-to="Marchenko Sergey">
        Fixed some code examples.
        Github Pull Request #63.
      </action>
      <action issue="COMPRESS-447" type="fix" date="2018-04-22">
        Certain errors when parsing ZIP extra fields in corrupt
        archives are now turned into ZipException, they used to
        manifest as ArrayIndexOutOfBoundsException before.
      </action>
      <action issue="COMPRESS-445" type="update" date="2018-04-22"
              due-to="Andreas Beeker">
        The streams returned by ZipFile and most other decompressing
        streams now provide information about the number of compressed
        and uncompressed bytes read so far. This may be used to detect
        a ZipBomb if the compression ratio exceeds a certain
        threshold, for example.
        For SevenZFile a new method returns the statistics for the
        current entry.
      </action>
      <action issue="COMPRESS-443" type="add" date="2018-04-25">
        Added a unit test that is supposed to fail if we break the
        OSGi manifest entries again.
      </action>
      <action issue="COMPRESS-449" type="add" date="2018-05-02">
        Add a new SkipShieldingInputStream class that can be used with
        streams that throw an IOException when skip is invoked.
      </action>
      <action issue="COMPRESS-451" type="fix" date="2018-05-04">
        IOUtils.copy now verifies the buffer size is bigger than 0.
      </action>
      <action issue="COMPRESS-452" type="add" date="2018-05-09">
        New constructors have been added to SevenZFile that accept
        char[]s rather than byte[]s in order to avoid a common error
        of using the wrong encoding when creating the byte[].  This
        change may break source compatibility for client code that
        uses one of the constructors expecting a password and passes
        in null as password. We recommend to change the code to use a
        constructor without password argument.
      </action>
      <action issue="COMPRESS-453" type="update" date="2018-05-24">
        Added a workaround for a bug in AdoptOpenJDK for S/390 to
        BZip2CompressorInputStream.
      </action>
      <action issue="COMPRESS-454" type="fix" date="2018-05-30">
        ZipArchiveInputStream failed to read some files with stored
        entries using a data descriptor.
      </action>
    </release>
    <release version="1.16.1" date="2018-02-10"
             description="Release 1.16.1">
      <action issue="COMPRESS-442" type="fix" date="2018-02-06">
        Fixed the OSGi manifest entry for imports that has been broken
        in 1.16.
      </action>
    </release>
    <release version="1.16" date="2018-02-05"
             description="Release 1.16">
      <action issue="COMPRESS-423" type="add" date="2017-10-17"
              due-to="Andre F de Miranda">
        Add read-only support for Zstandard compression based on the
        Zstd-jni project.
      </action>
      <action issue="COMPRESS-425" type="add" date="2017-10-22">
        Added auto-detection for Zstandard compressed streams.
      </action>
      <action issue="COMPRESS-430" type="fix" date="2017-11-25"
              due-to="Bruno P. Kinoshita">
        Synchronized iteration over a synchronizedList in ParallelScatterZipCreator.
      </action>
      <action issue="COMPRESS-432" type="fix" date="2017-12-22">
        ZipFile could get stuck in an infinite loop when parsing ZIP
        archives with certain strong encryption headers.
      </action>
      <action issue="COMPRESS-435" type="update" date="2017-12-27"
              due-to="BELUGA BEHR">
        Replaces instanceof checks with a type marker in LZ77 support code.
      </action>
      <action issue="COMPRESS-426" type="add" date="2017-12-28">
        Added write-support for Zstandard compression.
      </action>
      <action issue="COMPRESS-424" type="fix" date="2017-12-30">
        Added improved checks to detect corrupted bzip2 streams and
        throw the expected IOException rather than obscure
        RuntimeExceptions.
      </action>
      <action type="update" date="2018-01-04">
        Updated XZ for Java dependency to 1.8 in order to pick up bug
        fix to LZMA2InputStream's available method.
      </action>
      <action type="update" date="2018-01-05" issue="COMPRESS-429"
              due-to="Damiano Albani">
        ZipArchiveEntry now exposes how the name or comment have been
        determined when the entry was read.
      </action>
      <action issue="COMPRESS-380" type="add" date="2018-01-09"
              due-to="Christian Marquez Grabia">
        Added read-only DEFLATE64 support to ZIP archives and as
        stand-alone CompressorInputStream.
      </action>
      <action issue="COMPRESS-438" type="update" date="2018-01-10">
        ZipFile.getInputStream will now always buffer the stream
        internally in order to improve read performance.
      </action>
      <action issue="COMPRESS-440" type="update" date="2018-01-12"
              due-to="Dawid Weiss">
        Speed improvement for DEFLATE64 decompression.
      </action>
      <action issue="COMPRESS-437" type="add" date="2018-01-13">
        Added read-only DEFLATE64 support to 7z archives.
      </action>
      <action issue="COMPRESS-436" type="update" date="2018-01-14">
        Added a few extra sanity checks for the rarer compression
        methods used in ZIP archives.
      </action>
      <action issue="COMPRESS-441" type="update" date="2018-01-14">
        Simplified the special handling for the dummy byte required by
        zlib when using java.util.zip.Inflater.
      </action>
      <action type="update" date="2018-01-18" due-to="Shahab Kondri">
        Various code cleanups.
        Github Pull Request #61.
      </action>
      <action type="update" date="2018-01-29">
        TarArchiveEntry's preserveLeadingSlashes constructor argument
        has been renamed and can now also be used to preserve the
        drive letter on Windows.
      </action>
    </release>
    <release version="1.15" date="2017-10-17"
             description="Release 1.15
----------------------------------------

TarArchiveOutputStream now ensures record size is 512 and block size is
a multiple of 512 as any other value would create invalid tar
archives. This may break compatibility for code that deliberately
wanted to create such files.">
      <action issue="COMPRESS-394" type="fix" date="2017-05-22">
        Make sure "version needed to extract" in local file header and
        central directory of a ZIP archive agree with each other.
        Also ensure the version is set to 2.0 if DEFLATE is used.
      </action>
      <action issue="COMPRESS-395" type="fix" date="2017-05-22">
        Don't use a data descriptor in ZIP archives when copying a raw
        entry that already knows its size and CRC information.
      </action>
      <action issue="COMPRESS-413" type="fix" date="2017-05-22" due-to="Simon Spero">
        Travis build redundantly repeats compilation and tests redundantly #43.      
      </action>
      <action issue="COMPRESS-397" type="add" date="2017-05-22">
        Added magic MANIFEST entry Automatic-Module-Name so the module
        name will be org.apache.commons.compress when the jar is used
        as an automatic module in Java9.
      </action>
      <action issue="COMPRESS-396" type="fix" date="2017-05-23">
        The MANIFEST of 1.14 lacks an OSGi Import-Package for XZ for
        Java.
      </action>
      <action issue="COMPRESS-406" type="fix" date="2017-06-12"
              due-to="Simon Spero">
        BUILDING.md now passes the RAT check.
      </action>
      <action issue="COMPRESS-405" type="add" date="2017-06-15"
              due-to="Simon Spero ">
        Added a new utility class FixedLengthBlockOutputStream that
        can be used to ensure writing always happens in blocks of a
        given size.
      </action>
      <action issue="COMPRESS-412" type="fix" date="2017-06-17"
              due-to="Michael Hausegger">
        Made sure ChecksumCalculatingInputStream receives valid
        checksum and input stream instances via the constructor.
      </action>
      <action issue="COMPRESS-407" type="fix" date="2017-06-24"
              due-to="Simon Spero ">
        TarArchiveOutputStream now verifies the block and record sizes
        specified at construction time are compatible with the tar
        specification. In particular 512 is the only record size
        accepted and the block size must be a multiple of 512.
        At the same time the default block size in
        TarArchiveOutputStream has been changed from 10240 to 512
        bytes.
      </action>
      <action issue="COMPRESS-400" type="add" date="2017-06-26"
              due-to="Simon Spero ">
        It is now possible to specify/read custom PAX headers when
        writing/reading tar archives.
      </action>
      <action issue="COMPRESS-415" type="fix" date="2017-06-27">
        Fixed class names of CpioArchiveEntry and
        CpioArchiveInputStream in various Javadocs.
      </action>
      <action issue="COMPRESS-416" type="fix" date="2017-07-04"
              due-to="Simon Spero ">
        The code of the extended timestamp zip extra field incorrectly
        assumed the time was stored as unsigned 32-bit int and thus
        created incorrect results for years after 2037.
      </action>
      <action issue="COMPRESS-410" type="fix" date="2017-07-05"
              due-to="Simon Spero ">
        Removed ZipEncoding code that became obsolete when we started
        to require Java 5 as baseline long ago.
      </action>
      <action issue="COMPRESS-417" type="fix" date="2017-07-19">
        The tar package will no longer try to parse the major and
        minor device numbers unless the entry represents a character
        or block special file.
      </action>
      <action issue="COMPRESS-421" type="fix" date="2017-10-06"
              due-to="Roel Spilker">
        When reading tar headers with name fields containing embedded
        NULs, the name will now be terminated at the first NUL byte.
      </action>
      <action issue="COMPRESS-409" type="fix" date="2017-10-08">
        Simplified TarArchiveOutputStream by replacing the internal
        buffering with new class FixedLengthBlockOutputStream.
      </action>
    </release>
    <release version="1.14" date="2017-05-14"
             description="Release 1.14">
      <action issue="COMPRESS-378" type="fix" date="2017-01-09">
        SnappyCompressorInputStream slides the window too early
        leading to ArrayIndexOutOfBoundsExceptions for some streams.
      </action>
      <action issue="COMPRESS-246" type="add" date="2017-01-10">
        Added write support for Snappy.
      </action>
      <action issue="COMPRESS-358" type="update" date="2017-01-10">
        The blocksize for FramedSnappyCompressorInputStream can now be
        configured as some IWA files seem to be using blocks larger
        than the default 32k.
      </action>
      <action issue="COMPRESS-379" type="fix" date="2017-01-15"
              due-to="Guillaume Boué">
        ZipArchiveEntry#isUnixSymlink now only returns true if the
        corresponding link flag is the only file-type flag set.
      </action>
      <action issue="COMPRESS-271" type="add" date="2017-02-07">
        Added support for LZ4 (block and frame format).
      </action>
      <action type="update" date="2017-02-15" due-to="Thomas Meyer">
        BZip2CompressorInputstream now uses BitInputStream internally.
        Pull Request #13.
      </action>
      <action type="fix" date="2017-03-29" due-to="Daniel Collin">
        Fixed an integer overflow in CPIO's CRC calculation.
        Pull Request #17.
      </action>
      <action issue="COMPRESS-385" type="add" date="2017-04-18">
        Add static detect(InputStream in) to CompressorStreamFactory
        and ArchiveStreamFactory
      </action>
      <action issue="COMPRESS-387" type="fix" date="2017-04-18">
        Make unit tests work on Windows paths with spaces in their names.
      </action>
      <action issue="COMPRESS-388" type="update" date="2017-04-25"
              due-to="Zbynek Vyskovsky">
        Improved performance for concurrent reads from ZipFile when
        reading from a file.
      </action>
      <action issue="COMPRESS-382" type="add" date="2017-04-25"
              due-to="Tim Allison">
        Added a way to limit amount of memory ZCompressorStream may
        use.
      </action>
      <action issue="COMPRESS-386" type="add" date="2017-04-25"
              due-to="Tim Allison">
        Added a way to limit amount of memory ZCompressorStream may
        use.
      </action>
      <action issue="COMPRESS-382" type="add" date="2017-04-25"
              due-to="Tim Allison">
        Added a way to limit amount of memory LZMACompressorStream and
        XZCompressorInputStream may use.
      </action>
      <action issue="COMPRESS-389" type="fix" date="2017-04-26">
        Internal location pointer in ZipFile could get incremented
        even if nothing had been read.
      </action>
      <action issue="COMPRESS-392" type="add" date="2017-05-02" due-to="Philippe Mouawad">
        Add Brotli decoder based on the Google Brotli library.
      </action>
      <action issue="COMPRESS-390" type="add" date="2017-05-04"
              due-to="Zbynek Vyskovsky">
        ZipEntry now exposes its data offset.
      </action>
      <action issue="COMPRESS-393" type="fix" date="2017-05-07">
        LZMACompressorOutputStream#flush would throw an exception
        rather than be the NOP it promised to be.
      </action>
      <action issue="COMPRESS-391" type="add" date="2017-05-11"
              due-to="Zbynek Vyskovsky">
        Using ZipArchiveEntry's setAlignment it is now possible to
        ensure the data offset of an entry starts at a file position
        that at word or page boundaries.
        A new extra field has been added for this purpose.
      </action>
    </release>
    <release version="1.13" date="2016-12-29"
             description="Release 1.13 - API compatible to 1.12 but requires Java 7 at runtime.">
      <action issue="COMPRESS-360" type="update" date="2016-06-25" dev="ggregory">
        Update Java requirement from 6 to 7.
      </action>
      <action issue="COMPRESS-363" type="fix" date="2016-07-01">
        BitInputStream could return bad results when overflowing
        internally - if two consecutive reads tried to read more than
        64 bits.
      </action>
      <action issue="COMPRESS-366" type="update" date="2016-10-07">
        Clarified which TarArchiveEntry methods are useless for
        entries read from an archive.
      </action>
      <action issue="COMPRESS-364" type="fix" date="2016-10-07"
              due-to="Mike Mole">
        ZipArchiveInputStream.closeEntry does not properly advance to
        next entry if there are junk bytes at end of data section
      </action>
      <action issue="COMPRESS-327" type="add" date="2016-10-12">
        SevenZFile, SevenZOutputFile, ZipFile and
        ZipArchiveOutputStream can now work on non-file resources if
        they can be accessed via SeekableByteChannel.
      </action>
      <action issue="COMPRESS-368" type="add" date="2016-11-15">
        Allow compressor extensions through a standard JRE ServiceLoader.
      </action>
      <action issue="COMPRESS-369" type="add" date="2016-11-15">
        Allow archive extensions through a standard JRE ServiceLoader.
      </action>
      <action issue="COMPRESS-373" type="add" date="2016-11-29">
        Add write support for the legacy LZMA format, this requires XZ
        for Java 1.6.
      </action>
      <action issue="COMPRESS-374" type="add" date="2016-11-29">
        Add write support for the legacy LZMA stream to 7z, this
        requires XZ for Java 1.6.
      </action>
      <action issue="COMPRESS-375" type="add" date="2016-12-04"
              due-to="Plamen Totev">
        Allow the clients of ParallelScatterZipCreator to provide
        ZipArchiveEntryRequestSupplier.
      </action>
      <action issue="COMPRESS-367" type="fix" date="2016-12-09"
              due-to="Mike Mole">
        ZipArchiveInputStream now throws an Exception if it encounters
        a broken ZIP archive rather than signaling end-of-archive.
      </action>
      <action issue="COMPRESS-377" type="fix" date="2016-12-20">
        ScatterZipOutputStream didn't close the StreamCompressor
        causing a potential resource leak.
      </action>
      <action issue="COMPRESS-372" type="add" date="2016-12-20">
        Add a version-independent link to the API docs of the latest
        release.
      </action>
    </release>
    <release version="1.12" date="2016-06-21"
             description="Release 1.12 - API compatible to 1.11 but requires Java 6 at runtime.
------------



Release 1.12 changes the behavior of BZip2CompressorOutputStream's
finalize method so that it no longer invokes finish. This is going to
break code that relied on the finalizer to clean up an unfinished
stream. The code will need to be changed to call finish or
close itself. Note that a finalizer is not guaranteed to run, so
the feature was not 100% effective in any case.
">
      <action issue="COMPRESS-349" type="update" date="2016-04-09" dev="ggregory">
        Update requirement from Java 5 to 6.
      </action>
      <action issue="COMPRESS-350" type="update" date="2016-04-09" dev="ggregory">
        TarArchiveEntry wastefully allocates empty arrays.
      </action>
      <action issue="COMPRESS-348" type="fix" date="2016-04-24">
        SevenZFile.read() throws an IllegalStateException for empty entries.
      </action>
      <action issue="COMPRESS-353" type="update" date="2016-05-06" dev="ggregory">
        Javadoc for BZip2CompressorInputStream(InputStream, boolean) should refer to IOEx, not NPE.
      </action>
      <action issue="COMPRESS-354" type="update" date="2016-05-16">
        PureJavaCrc32C in the snappy package is now final so it is now
        safe to call a virtual method inside the constructor.
      </action>
      <action issue="COMPRESS-355" type="fix" date="2016-05-20"
              due-to="Jeremy Gustie">
        TarArchiveInputStream failed to parse PAX headers that
        included blank lines.
      </action>
      <action issue="COMPRESS-356" type="fix" date="2016-05-20"
              due-to="Jeremy Gustie">
        TarArchiveInputStream failed to parse PAX headers whose tar
        entry name ended with a slash.
      </action>
      <action issue="COMPRESS-352" type="add" date="2016-05-22">
        FramedSnappyCompressorInputStream now supports the dialect of
        Snappy used by the IWA files contained within the zip archives
        used in Apple's iWork 13 files.
      </action>
      <action issue="COMPRESS-351" type="update" date="2016-06-07">
        ZipArchiveInputStream and CpioArchiveInputStream could throw
        exceptions who's messages contained potentially corrupt entry
        names read from a broken archive. They will now sanitize the
        names by replacing unprintable characters and restricting the
        length to 255 characters.
      </action>
      <action issue="COMPRESS-357" type="update" date="2016-06-15">
        BZip2CompressorOutputStream no longer tries to finish the
        output stream in finalize. This is a breaking change for code
        that relied on the finalizer.
      </action>
    </release>
    <release version="1.11" date="2016-04-06"
             description="Release 1.11">
      <action issue="COMPRESS-347" type="add" date="2016-03-23">
        TarArchiveInputStream now supports reading global PAX headers.
      </action>
      <action issue="COMPRESS-346" type="add" date="2016-03-23">
        The PAX headers for sparse entries written by star are now
        applied.
      </action>
      <action issue="COMPRESS-345" type="add" date="2016-03-23">
        GNU sparse files using one of the PAX formats are now
        detected, but cannot be extracted.
      </action>
      <action issue="COMPRESS-344" type="fix" date="2016-03-22">
        ArArchiveInputStream can now read GNU extended names that are
        terminated with a NUL byte rather than a linefeed.
      </action>
      <action issue="COMPRESS-341" type="add" date="2016-03-20">
        New method SevenZFile.getEntries can be used to list the
        contents of a 7z archive.
      </action>
      <action issue="COMPRESS-343" type="fix" date="2016-03-17"
              due-to="Rene Preissel">
        Native Memory Leak in Sevenz-DeflateDecoder.
      </action>
      <action type="add" date="2016-03-05"
              due-to="Matt Hovey">
        When using Zip64Mode.Always also use ZIP64 extensions inside
        the central directory.
        GitHub Pull Request #10
      </action>
      <action issue="COMPRESS-340" type="fix" date="2016-02-24"
              due-to="Dawid Weiss">
        SevenZFile will now only try to drain an entry's content when
        moving on to the next entry if data is read from the next
        entry. This should improve performance for applications that
        try to skip over entries.
      </action>
      <action issue="COMPRESS-336" type="fix" date="2016-02-14">
        file names of tar archives using the xstar format are now
        parsed properly.
      </action>
      <action issue="COMPRESS-335" type="fix" date="2016-02-05">
        checksums of tars that pad the checksum field to the left are
        now calculated properly.
      </action>
      <action issue="COMPRESS-334" type="fix" date="2016-02-05"
              due-to="Jeremy Gustie">
        ArArchiveInputStream failed to read past the first entry when
        BSD long names have been used.
      </action>
      <action issue="COMPRESS-333" type="fix" date="2016-02-03" due-to="Dawid Weiss">
        Added buffering for random access which speeds up 7Z support.
      </action>
      <action issue="COMPRESS-331" type="fix" date="2016-01-31">
        The checksum validation of TararchiveEntry is now as strict as
        the validation of GNU tar, which eliminates a few cases of
        false positives of ArchiveStreamFactory.
        This behavior is a breaking change since the check has become
        more strict but any archive that fails the checksum test now
        would also fail it when extracted with other tools and must be
        considered an invalid archive.
      </action>
      <action issue="COMPRESS-323" type="add" date="2016-01-29">
        ZipFile.getRawInputStream() is now part of the public API
      </action>
      <action issue="COMPRESS-332" type="fix" date="2016-01-29">
        SnappyCompressorInputStream and
        FramedSnappyCompressorInputStream returned 0 at the end of the
        stream under certain circumstances.
      </action>
      <action type="add" date="2016-01-27" due-to="Jason van Zyl">
        Allow byte-for-byte replication of Zip entries.
        GitHub Pull Request #6.
      </action>
      <action issue="COMPRESS-328" type="add" date="2016-01-15">
        TarArchiveEntry's preserveLeadingSlashes is now a property and used
        on later calls to setName, too.
        This behavior is a breaking change.
      </action>
      <action issue="COMPRESS-326" type="fix" date="2015-10-24">
        Adjusted unit test to updates in Java8 and later that change
        the logic of ZipEntry#getTime.
      </action>
      <action issue="COMPRESS-324" type="fix" date="2015-10-06">
        TarArchiveOutputStream will now recognize GNU long name and
        link entries even if the special entry has a different name
        than GNU tar uses itself.  This seems to be the case for
        archives created by star.
      </action>
      <action issue="COMPRESS-321" type="fix" date="2015-08-22">
        ArrayIndexOutOfBoundsException when InfoZIP type 7875 extra
        fields are read from the central directory.
      </action>
      <action type="add" date="2015-11-11" due-to="Sören Glimm">
        Added read-only support for bzip2 compression used inside of
        ZIP archives.
        GitHub Pull Request #4.
      </action>
    </release>

    <release version="1.10" date="2015-08-18"
             description="Release 1.10
------------



Release 1.10 moves the former
org.apache.commons.compress.compressors.z._internal_ package which
breaks backwards compatibility for code which used the old package.
This also changes the superclass of ZCompressorInputStream.
">

      <action issue="COMPRESS-317" type="fix" date="2015-06-09"
              due-to="Lucas Werkmeister">
        ArrayIndexOutOfBoundsException when ZIP extra fields are read
        and the entry contains an UnparseableExtraField.
      </action>
      <action issue="COMPRESS-316" type="add" date="2015-05-23"
              due-to="Nick Burch">
        CompressorStreamFactory can now auto-detect DEFLATE streams
        with ZLIB header.
      </action>
      <action issue="COMPRESS-314" type="fix" date="2015-05-08">
        TarArchiveInputStream can now read entries with group or
        user ids &gt; 0x80000000.
      </action>
      <action issue="COMPRESS-315" type="fix" date="2015-05-06">
        TarArchiveOutputStream can now write entries with group or
        user ids &gt; 0x80000000.
      </action>
      <action issue="COMPRESS-313" type="add" date="2015-03-30">
        CompressorStreamFactory can now auto-detect LZMA streams.
      </action>
      <action issue="COMPRESS-312" type="fix" date="2015-03-28">
        TarArchiveEntry's constructor with a File and a String arg
        didn't normalize the name.
      </action>
      <action issue="COMPRESS-308" type="fix" date="2015-02-20">
        ZipEncodingHelper no longer reads system properties directly
        to determine the default charset.
      </action>
      <action issue="COMPRESS-309" type="fix" date="2015-02-20">
        BZip2CompressorInputStream#read would return -1 when asked to
        read 0 bytes.
      </action>
      <action issue="COMPRESS-306" type="fix" date="2015-02-17">
        ArchiveStreamFactory fails to pass on the encoding when creating some streams.
        * ArjArchiveInputStream
        * CpioArchiveInputStream
        * DumpArchiveInputStream
        * JarArchiveInputStream
        * TarArchiveInputStream
        * JarArchiveOutputStream
      </action>
      <action issue="COMPRESS-302" type="fix" date="2015-02-16">
        Restore immutability/thread-safety to ArchiveStreamFactory.
        The class is now immutable provided that the method setEntryEncoding is not used.
        The class is thread-safe.
      </action>
      <action issue="COMPRESS-303" type="fix" date="2015-02-16">
        Restore immutability/thread-safety to CompressorStreamFactory.
        The class is now immutable provided that the method setDecompressConcatenated is not used.
        The class is thread-safe.
      </action>
      <action issue="COMPRESS-298" type="fix" date="2015-01-20">
        SevenZFile now throws the specific PasswordRequiredException
        when it encounters an encrypted stream but no password has
        been specified.
      </action>
      <action issue="COMPRESS-290" type="fix" date="2015-01-13"
              due-to="Kristian Rosenvold">
        Improved error message when tar encounters a groupId that is
        too big to write without using the STAR or POSIX format.
      </action>
      <action issue="COMPRESS-296" type="add" date="2015-01-10"
              due-to="Kristian Rosenvold">
        Added support for parallel compression. This low-level API allows
        a client to build a zip/jar file by using the class
        org.apache.commons.compress.archivers.zip.ParallelScatterZipCreator.

        Zip documentation updated with further notes about parallel features.

        Please note that some aspects of jar creation need to be
        handled by client code and is not part of commons-compress for this
        release.
      </action>
      <action type="add" date="2014-12-24"
              due-to="Kristian Rosenvold">
        Cut overall object instantiation in half by changing file
        header generation algorithm, for a 10-15 percent performance
        improvement.

        Also extracted two private methods createLocalFileHeader
        and createCentralFileHeader in ZipArchiveOutputStream.
        These may have some interesting additional usages in the
        near future.
      </action>
      <action issue="COMPRESS-297" type="fix" date="2014-12-22">
        ZipFile logs a warning in its finalizer when its constructor
        has thrown an exception reading the file - for example if the
        file doesn't exist.
      </action>
      <action issue="COMPRESS-295" type="add" date="2014-12-18"
              due-to="Kristian Rosenvold">
        New methods in ZipArchiveOutputStream and ZipFile allows
        entries to be copied from one archive to another without
        having to re-compress them.
      </action>
      <action type="update" date="2014-10-28"
              due-to="Damjan Jovanovic">
        Moved the package
        org.apache.commons.compress.compressors.z._internal_ to
        org.apache.commons.compress.compressors.lzw and made it part
        of the API that is officially supported.  This will break
        existing code that uses the old package.
      </action>
    </release>

    <release version="1.9" date="2014-10-09"
             description="Release 1.9">
      <action type="add" date="2014-06-14" issue="COMPRESS-263"
              due-to="Matthias Stevens">
        Added support for DEFLATE streams without any gzip framing.
      </action>
      <action type="fix" date="2014-08-14" issue="COMPRESS-287">
        When reading 7z files unknown file properties and properties
        of type kDummy are now ignored.
      </action>
      <action type="fix" date="2014-08-21" issue="COMPRESS-286">
        Expanding 7z archives using LZMA compression could cause an
        EOFException.
      </action>
      <action type="update" date="2014-08-31" issue="COMPRESS-285">
        Checking for XZ for Java may be expensive.  The result will
        now be cached outside of an OSGi environment.  You can use the
        new XZUtils#setCacheXZAvailability to overrride this default
        behavior.
      </action>
      <action type="fix" date="2014-09-19" issue="COMPRESS-289"
              due-to="Bob Robertson">
        Long-Name and -link or PAX-header entries in TAR archives
        always had the current time as last modfication time, creating
        archives that are different at the byte level each time an
        archive was built.
      </action>
    </release>

    <release version="1.8.1" date="2014-05-14"
             description="Release 1.8.1">
      <action type="update" date="2014-03-19">
        The dependency on org.tukaani:xz is now marked as optional.
      </action>
      <action type="fix" date="2014-03-28" issue="COMPRESS-270">
        The snappy, ar and tar inputstreams might fail to read from a
        non-buffered stream in certain cases.
      </action>
      <action type="add" date="2014-04-12" issue="COMPRESS-272">
        CompressorStreamFactory can now auto-detect Unix compress
        (".Z") streams.
      </action>
      <action type="fix" date="2014-04-12" issue="COMPRESS-277">
        IOUtils#skip might skip fewer bytes than requested even though
        more could be read from the stream.
      </action>
      <action type="fix" date="2014-04-13" issue="COMPRESS-276">
        ArchiveStreams now validate there is a current entry before
        reading or writing entry data.
      </action>
      <action type="fix" date="2014-04-13">
        ArjArchiveInputStream#canReadEntryData tested the current
        entry of the stream rather than its argument.
      </action>
      <action type="fix" date="2014-04-13" issue="COMPRESS-274">
        ChangeSet#delete and deleteDir now properly deal with unnamed
        entries.
      </action>
      <action type="fix" date="2014-04-18" issue="COMPRESS-273">
        Added a few null checks to improve robustness.
      </action>
      <action type="fix" date="2014-04-19" issue="COMPRESS-278">
        TarArchiveInputStream failed to read archives with empty
        gid/uid fields.
      </action>
      <action type="fix" date="2014-04-27" issue="COMPRESS-279">
        TarArchiveInputStream now again throws an exception when it
        encounters a truncated archive while reading from the last
        entry.
      </action>
      <action type="fix" date="2014-05-02" issue="COMPRESS-280"
              due-to="BELUGA BEHR">
        Adapted TarArchiveInputStream#skip to the modified
        IOUtils#skip method.
      </action>
    </release>
    <release version="1.8" date="2014-03-12"
             description="Release 1.8">
      <action issue="COMPRESS-253" type="fix" date="2014-01-20">
        BZip2CompressorInputStream read fewer bytes than possible from
        a truncated stream.
      </action>
      <action issue="COMPRESS-253" type="fix" date="2014-01-22">
        SevenZFile failed claiming the dictionary was too large when
        archives used LZMA compression for headers and content and
        certain non-default dictionary sizes.
      </action>
      <action issue="COMPRESS-259" type="fix" date="2014-01-24">
        CompressorStreamFactory.createCompressorInputStream with
        explicit compression did not honor decompressConcatenated
      </action>
      <action issue="COMPRESS-260" type="add" date="2014-02-20">
        GzipCompressorInputStream now provides access to the same
        metadata that can be provided via GzipParameters when writing
        a gzip stream.
      </action>
      <action issue="COMPRESS-262" type="fix" date="2014-02-21">
        TarArchiveInputStream will now read archives created by tar
        implementations that encode big numbers by not adding a
        trailing NUL.
      </action>
      <action issue="COMPRESS-264" type="fix" date="2014-02-21">
        ZipArchiveInputStream would return NUL bytes for the first 512
        bytes of a STORED entry if it was the very first entry of the
        archive.
      </action>
      <action issue="COMPRESS-265" type="fix" date="2014-02-22">
        When writing PAX/POSIX headers for TAR entries with
        backslashes or certain non-ASCII characters in their name
        TarArchiveOutputStream could fail.
      </action>
      <action issue="COMPRESS-267" type="fix" date="2014-02-22">
        ArchiveStreamFactory now throws a StreamingNotSupported - a
        new subclass of ArchiveException - if it is asked to read from
        or write to a stream and Commons Compress doesn't support
        streaming for the format.  This currently only applies to the
        7z format.
      </action>
      <action issue="COMPRESS-266" type="add" date="2014-02-25">
        SevenZOutputFile now supports chaining multiple
        compression/encryption/filter methods and passing options to
        the methods.
      </action>
      <action issue="COMPRESS-261" type="add" date="2014-02-26">
        The (compression) method(s) can now be specified per entry in
        SevenZOutputFile.
      </action>
      <action issue="COMPRESS-258" type="add" date="2014-02-26">
        SevenZArchiveEntry "knows" which method(s) have been used to
        write it to the archive.
      </action>
      <action type="add" date="2014-02-28">
        The 7z package now supports the delta filter as method.
      </action>
      <action issue="COMPRESS-257" type="add" date="2014-03-03">
        The 7z package now supports BCJ filters for several platforms.
        You will need a version &gt;= 1.5 of XZ for Java to read archives
        using BCJ, though.
      </action>
    </release>
    <release version="1.7" date="2014-01-20"
             description="Release 1.7">
      <action issue="COMPRESS-241" type="fix" date="2013-10-27">
        SevenZOutputFile#closeArchiveEntry throws an exception when
        using LZMA2 compression on Java8.
      </action>
      <action issue="COMPRESS-147" type="add" date="2013-11-07"
              due-to="BELUGA BEHR">
        Read-Only support for Snappy compression.
      </action>
      <action issue="COMPRESS-244" type="fix" date="2013-11-27"
              due-to="Nico Kruber">
        7z reading of big 64bit values could be wrong.
      </action>
      <action issue="COMPRESS-243" type="add" date="2013-11-30"
              due-to="Damjan Jovanovic">
        Read-Only support for .Z compressed files.
      </action>
      <action type="add" date="2013-12-06" due-to="Damjan Jovanovic">
        ZipFile and ZipArchiveInputStream now support reading entries compressed using the
        SHRINKING method.
      </action>
      <action issue="COMPRESS-245" type="fix" date="2013-12-06">
        TarArchiveInputStream could fail to read an archive completely.
      </action>
      <action issue="COMPRESS-242" type="fix" date="2013-12-08">
        The time-setters in X5455_ExtendedTimestamp now set the
        corresponding flags explicitly - i.e. they set the bit if the
        valus is not-null and reset it otherwise.  This may cause
        incompatibilities if you use setFlags to unset a bit and later
        set the time to a non-null value - the flag will now be set.
      </action>
      <action issue="COMPRESS-250" type="add" date="2013-12-16" due-to="Emmanuel Bourg">
        GzipCompressorOutputStream now supports setting the compression level and the header metadata
        (filename, comment, modification time, operating system and extra flags)
      </action>
      <action issue="COMPRESS-115" type="add" date="2013-12-19" due-to="Emmanuel Bourg">
        ZipFile and ZipArchiveInputStream now support reading entries compressed using the IMPLODE method.
      </action>
      <action issue="COMPRESS-252" type="fix" date="2013-12-20">
        SevenZOutputFile would create invalid archives if more than
        six empty files or directories were included.
      </action>
      <action type="add" date="2013-12-20">
        ZipFile and the 7z file classes now implement Closeable and
        can be used in try-with-resources constructs.
      </action>
    </release>
    <release version="1.6" date="2013-10-26"
             description="Release 1.6">
      <action type="fix" date="2013-04-25" issue="COMPRESS-223"
              due-to="Jeremy Gustie">
        TarBuffer.tryToConsumeSecondEOFRecord could throw a
        NullPointerException
      </action>
      <action type="add" date="2013-05-07" issue="COMPRESS-54"
              due-to="Damjan Jovanovic">
        Added support for 7z archives.  Most compression algorithms
        can be read and written, LZMA and encryption are only
        supported when reading.
      </action>
      <action type="add" date="2013-05-19" issue="COMPRESS-226"
              due-to="Damjan Jovanovic">
        Added read-only support for ARJ archives that don't use
        compression.
      </action>
      <action type="fix" date="2013-05-26" issue="COMPRESS-228">
        Parsing of zip64 extra fields has become more lenient in order
        to be able to read archives created by DotNetZip and maybe
        other archivers as well.
      </action>
      <action type="fix" date="2013-06-03" issue="COMPRESS-229"
              due-to="Christoph Gysin">
        TAR will now properly read the names of symbolic links with
        long names that use the GNU variant to specify the long file
        name.
      </action>
      <action type="fix" date="2013-06-04" issue="COMPRESS-227">
        ZipFile#getInputStream could return null if the archive
        contained duplicate entries.
        The class now also provides two new methods to obtain all
        entries of a given name rather than just the first one.
      </action>
      <action type="update" date="2013-07-08" issue="COMPRESS-232"
              due-to="BELUGA BEHR">
        Readabilty patch to TarArchiveInputStream.
      </action>
      <action type="update" date="2013-08-08" issue="COMPRESS-234"
              due-to="BELUGA BEHR">
        Performance improvements to TarArchiveInputStream, in
        particular to the skip method.
      </action>
      <action type="fix" date="2013-08-08" issue="COMPRESS-236"
              due-to="Andrew Duffy">
        CpioArchiveInputStream failed to read archives created by
        Redline RPM.
      </action>
      <action type="fix" date="2013-08-09" issue="COMPRESS-237"
              due-to="Emmanuel Bourg">
        TarArchiveOutputStream now properly handles link names that
        are too long to fit into a traditional TAR header.
      </action>
      <action type="add" date="2013-08-10">
        DumpArchiveInputStream now supports an encoding parameter that
        can be used to specify the encoding of file names.
      </action>
      <action type="add" date="2013-08-10">
        The CPIO streams now support an encoding parameter that can be
        used to specify the encoding of file names.
      </action>
      <action type="add" date="2013-09-22" issue="COMPRESS-111">
        Read-only support for LZMA standalone compression has been added.
      </action>
      <action type="fix" date="2013-10-04" issue="COMPRESS-239">
        The auto-detecting create*InputStream methods of Archive and
        CompressorStreamFactory could fail to detect the format of
        blocking input streams.
      </action>
      <action type="fix" date="2013-10-21" issue="COMPRESS-240"
              due-to="Gary Gregory">
        ZipEncodingHelper.isUTF8(String) does not check all UTF-8 aliases.
      </action>
    </release>
    <release version="1.5" date="2013-03-14"
             description="Release 1.5">
      <action type="fix" date="2012-02-19" issue="COMPRESS-218"
              due-to="Gili">
        Typo in CompressorStreamFactory Javadoc
      </action>
      <action type="update" date="2012-07-08" issue="COMPRESS-188"
              due-to="Harald Kuhn">
        Improved exception message if a zip archive cannot be read
        because of an unsupported compression method.
      </action>
      <action type="update" date="2012-07-07" issue="COMPRESS-192"
              due-to="Jukka Zitting">
        ArchiveStreamFactory has a setting for file name encoding that
        sets up encoding for ZIP and TAR streams.
      </action>
      <action type="fix" date="2012-07-07" issue="COMPRESS-191"
              due-to="Jukka Zitting">
        ArchiveStreamFactory's tar stream detection created false
        positives for AIFF files.
      </action>
      <action type="update" date="2012-07-07" issue="COMPRESS-191"
              due-to="Jukka Zitting">
        TarArchiveEntry now has a method to verify its checksum.
      </action>
      <action type="fix" date="2012-12-27" issue="COMPRESS-199"
              due-to="Jukka Zitting">
        XZ for Java didn't provide an OSGi bundle.  Compress'
        dependency on it has now been marked optional so Compress
        itself can still be used in an OSGi context.
      </action>
      <action type="fix" date="2012-12-27" issue="COMPRESS-200"
              due-to="Christian Schlichtherle">
        When specifying the encoding explicitly TarArchiveOutputStream
        would write unreadable names in GNU mode or even cause errors
        in POSIX mode for file names longer than 66 characters.
      </action>
      <action type="fix" date="2012-12-27" issue="COMPRESS-203">
        Writing TAR PAX headers failed if the generated entry name
        ended with a "/".
      </action>
      <action type="fix" date="2012-12-28" issue="COMPRESS-189"
              due-to="Daniel Lowe">
        ZipArchiveInputStream sometimes failed to provide input to the
        Inflater when it needed it, leading to reads returning 0.
      </action>
      <action type="update" date="2013-01-01">
        Split/spanned ZIP archives are now properly detected by
        ArchiveStreamFactory but will cause an
        UnsupportedZipFeatureException when read.
      </action>
      <action type="update" date="2013-01-01" issue="COMPRESS-208">
        ZipArchiveInputStream now reads archives that start with a
        "PK00" signature.  Archives with this signatures are created
        when the archiver was willing to split the archive but in the
        end only needed a single segment - so didn't split anything.
      </action>
      <action type="update" date="2013-01-01" issue="COMPRESS-201">
        TarArchiveEntry has a new constructor that allows setting
        linkFlag and preserveLeadingSlashes at the same time.
      </action>
      <action type="update" date="2013-01-01" issue="COMPRESS-159">
        ChangeSetPerformer has a new perform overload that uses a
        ZipFile instance as input.
      </action>
      <action type="fix" date="2013-01-04" issue="COMPRESS-212">
        TarArchiveInputStream ignored the encoding for GNU long name
        entries.
      </action>
      <action type="update" date="2013-01-05" issue="COMPRESS-172"
              due-to="Thomas Mair">
        Garbage collection pressure has been reduced by reusing
        temporary byte arrays in classes.
      </action>
        <action type="update" date="2013-01-08" issue="COMPRESS-210"
                due-to="Julius Davies">
          Can now handle zip extra field 0x5455 - Extended Timestamp.
        </action>
        <action type="update" date="2013-01-07" issue="COMPRESS-211"
                due-to="Julius Davies">
          handle zip extra field 0x7875 - Info Zip New Unix Extra Field.
        </action>
        <action type="update" date="2013-01-07" issue="COMPRESS-213"
                due-to="Julius Davies">
            ZipShort, ZipLong, ZipEightByteInteger should implement Serializable
        </action>
        <action type="update" date="2013-01-14" issue="COMPRESS-214"
                due-to="Julius Davies">
            better support for unix symlinks in ZipFile entries
        </action>
        <action type="update" date="2013-01-19" issue="COMPRESS-215"
                due-to="Robin Power">
          ZipFile's initialization has been improved for non-Zip64
          archives.
        </action>
        <action type="fix" date="2013-01-20" issue="COMPRESS-206"
                due-to="Peter De Maeyer">
          TarArchiveInputStream could leave the second EOF record
          inside the stream it had just finished reading.
        </action>
        <action type="fix" date="2013-01-20">
          DumpArchiveInputStream no longer implicitly closes the
          original input stream when it reaches the end of the
          archive.
        </action>
        <action type="fix" date="2013-01-22">
          ZipArchiveInputStream now consumes the remainder of the
          archive when getNextZipEntry returns null.
        </action>
        <action type="fix" date="2013-01-27" issue="COMPRESS-205"
                due-to="Daniel Lowe">
          Unit tests could fail if the source tree was checked out to
          a directory tree containign spaces.
        </action>
        <action type="update" date="2013-01-31">
          Updated XZ for Java dependency to 1.2 as this version
          provides proper OSGi manifest attributes.
        </action>
        <action type="fix" date="2013-02-20" issue="COMPRESS-219">
          Fixed a potential ArrayIndexOutOfBoundsException when
          reading STORED entries from ZipArchiveInputStream.
        </action>
        <action type="fix" date="2013-03-07" issue="COMPRESS-221">
          CompressorStreamFactory can now be used without XZ for Java
          being available.
        </action>
        <action type="add" date="2013-03-07" issue="COMPRESS-220">
          CompressorStreamFactory has an option to create
          decompressing streams that decompress the full input for
          formats that support multiple concatenated streams.
        </action>
    </release>
    <release version="1.4.1" date="2012-05-23"
             description="Release 1.4.1">
      <action type="fix" date="2012-05-20">
        Ported libbzip2's fallback sort algorithm to
        BZip2CompressorOutputStream to speed up compression in certain
        edge cases.
        Using specially crafted inputs this can be used as a denial
        of service attack.  See the security reports page for details.
      </action>
    </release>
    <release version="1.4" date="2012-04-11"
             description="Release 1.4">
      <action issue="COMPRESS-183" type="fix" date="2012-03-24">
        The tar package now allows the encoding of file names to be
        specified and can optionally use PAX extension headers to
        write non-ASCII file names.
        The stream classes now write (or expect to read) archives that
        use the platform's native encoding for file names.  Apache
        Commons Compress 1.3 used to strip everything but the lower
        eight bits of each character which effectively only worked for
        ASCII and ISO-8859-1 file names.
        This new default behavior is a breaking change.
      </action>
      <action issue="COMPRESS-184" type="fix" date="2012-03-23">
        TarArchiveInputStream failed to parse PAX headers that
        contained non-ASCII characters.
      </action>
      <action issue="COMPRESS-182" type="update" date="2012-03-02">
        The tar package can now write archives that use star/GNU/BSD
        extensions or use the POSIX/PAX variant to store numeric
        values that don't fit into the traditional header fields.
      </action>
      <action issue="COMPRESS-181" type="update" date="2012-03-02">
        Added a workaround for a Bug some tar implementations that add
        a NUL byte as first byte in numeric header fields.
      </action>
      <action issue="COMPRESS-176" type="update" date="2012-02-28">
        Added a workaround for a Bug in WinZIP which uses backslashes
        as path separators in Unicode Extra Fields.
      </action>
      <action issue="COMPRESS-131" type="update" date="2012-02-23">
        ArrayOutOfBounds while decompressing bz2. Added test case - code already seems to have been fixed.
      </action>
      <action issue="COMPRESS-178" type="fix" date="2012-02-23">
        TarArchiveInputStream throws IllegalArgumentException instead of IOException
      </action>
      <action issue="COMPRESS-179" type="fix" date="2012-02-23">
        TarUtils.formatLongOctalOrBinaryBytes() assumes the field will be 12 bytes long
      </action>
      <action issue="COMPRESS-175" type="fix" date="2012-02-22">
        GNU Tar sometimes uses binary encoding for UID and GID
      </action>
      <action issue="COMPRESS-171" type="fix" date="2012-01-29">
        ArchiveStreamFactory.createArchiveInputStream would claim
        short text files were TAR archives.
      </action>
      <action issue="COMPRESS-156" type="add" date="2011-11-02">
        Support for the XZ format has been added.
      </action>
      <action issue="COMPRESS-146" type="update" date="2011-11-07">
        BZip2CompressorInputStream now optionally supports reading of
        concatenated .bz2 files.
      </action>
      <action issue="COMPRESS-154" type="update" date="2011-11-09">
        GZipCompressorInputStream now optionally supports reading of
        concatenated .gz files.
      </action>
      <action issue="COMPRESS-164" type="fix" date="2011-12-05">
        ZipFile didn't work properly for archives using unicode extra
        fields rather than UTF-8 filenames and the EFS-Flag.
      </action>
      <action issue="COMPRESS-16" type="update" date="2011-12-07">
        The tar package can now read archives that use star/GNU/BSD
        extensions for files that are longer than 8 GByte as well as
        archives that use the POSIX/PAX variant.
      </action>
      <action issue="COMPRESS-165" type="update" date="2011-12-08">
        The tar package can now write archives that use star/GNU/BSD
        extensions for files that are longer than 8 GByte as well as
        archives that use the POSIX/PAX variant.
      </action>
      <action issue="COMPRESS-166" type="update" date="2011-12-08">
        The tar package can now use the POSIX/PAX variant for writing
        entries with names longer than 100 characters.
      </action>
      <action issue="COMPRESS-169" type="fix" date="2011-12-22">
        For corrupt archives ZipFile would throw a RuntimeException in
        some cases and an IOException in others.  It will now
        consistently throw an IOException.
      </action>
    </release>
    <release version="1.3" date="2011-11-01"
             description="Release 1.3 - API compatible to 1.2 but requires Java5 at runtime">
      <action issue="COMPRESS-142" type="add" date="2011-09-14">
        Support for the Pack200 format has been added.
      </action>
      <action issue="COMPRESS-132" type="add" date="2011-08-17">
        Read-only support for the format used by the Unix dump(8) tool
        has been added.
      </action>
      <action issue="COMPRESS-36" type="update" date="2011-08-15">
        The ZIP package now supports Zip64 extensions.
      </action>
      <action issue="COMPRESS-144" type="update" date="2011-08-08">
        The AR package now supports the BSD dialect of storing file
        names longer than 16 chars (both reading and writing).
      </action>
      <action type="fix" date="2011-08-08">
        BZip2CompressorInputStream's getBytesRead method always
        returned 0.
      </action>
      <action issue="COMPRESS-152" type="fix" date="2011-08-03">
        ZipArchiveInputStream and ZipArchiveOutputStream could leak
        resources on some JDKs.
      </action>
      <action issue="COMPRESS-160" type="fix" date="2011-10-23">
        TarArchiveOutputStream's getBytesWritten method didn't count
        correctly.
      </action>
    </release>
    <release version="1.2" date="2011-07-31"
             description="Release 1.2 - a bugfix release, the last release expected to be compatible with Java 1.4">
      <action issue="COMPRESS-129" type="fix" date="2011-07-26">
        ZipArchiveInputStream could fail with a "Truncated ZIP" error
        message for entries between 2 GByte and 4 GByte in size.
      </action>
      <action issue="COMPRESS-145" type="fix" date="2011-07-23"
              due-tue="Patrick Dreyer">
        TarArchiveInputStream now detects sparse entries using the
        oldgnu format and properly reports it cannot extract their
        contents.
      </action>
      <action issue="COMPRESS-123" type="add" date="2011-07-23">
        ZipArchiveEntry has a new method getRawName that provides the
        original bytes that made up the name.  This may allow user
        code to detect the encoding.
      </action>
      <action issue="COMPRESS-130" type="fix" date="2011-07-20">
        The Javadoc for ZipArchiveInputStream#skip now matches the
        implementation, the code has been made more defensive.
      </action>
      <action issue="COMPRESS-140" type="fix" date="2011-07-20"
              due-to="Trejkaz">
        ArArchiveInputStream fails if entries contain only blanks for
        userId or groupId.
      </action>
      <action issue="COMPRESS-139" type="fix" date="2011-07-13">
        ZipFile may leak resources on some JDKs.
      </action>
      <action type="update" date="2011-04-18">
        ZipFile now implements finalize which closes the underlying
        file.
      </action>
      <action issue="COMPRESS-117" type="update" date="2011-03-23">
        Certain tar files not recognised by ArchiveStreamFactory.
      </action>
      <action issue="COMPRESS-125" type="fix" date="2011-03-23">
        BZip2CompressorInputStream throws IOException if underlying stream returns available() == 0.
        Removed the check.
      </action>
      <action issue="COMPRESS-127" type="fix" date="2011-03-23">
        Calling close() on inputStream returned by CompressorStreamFactory.createCompressorInputStream()
        does not close the underlying input stream.
      </action>
      <action issue="COMPRESS-122" type="add" date="2010-10-29">
        TarArchiveEntry provides access to the flags that determine
        whether it is an archived symbolic link, pipe or other
        "uncommon" file system object.
      </action>
      <action issue="COMPRESS-119" type="fix" date="2010-10-26">
        TarArchiveOutputStream#finish now writes all buffered data to the stream
      </action>
    </release>
    <release version="1.1" date="2010-08-13" description="Release 1.1">
      <action issue="COMPRESS-72" type="fix" date="2010-06-02">
       Move acknowledgements from NOTICE to README
      </action>
      <action issue="COMPRESS-113" type="fix" date="2010-06-02">
       TarArchiveEntry.parseTarHeader() includes the trailing space/NUL when parsing the octal size
      </action>
      <action issue="COMPRESS-108" type="add" date="2010-05-23">
       Command-line interface to list archive contents.
       Usage: java -jar commons-compress-n.m.jar archive-name [zip|tar|etc]
      </action>
      <action issue="COMPRESS-118" type="fix" date="2010-05-17">
       TarUtils.parseName does not properly handle characters outside the range 0-127
      </action>
      <action issue="COMPRESS-112" type="update" date="2010-05-13">
       ArArchiveInputStream does not handle GNU extended filename records (//)
      </action>
      <action issue="COMPRESS-109" type="add" date="2010-05-10">
       Tar implementation does not support Pax headers
       Added support for reading pax headers.
       Note: does not support global pax headers
      </action>
      <action issue="COMPRESS-107" type="fix" date="2010-05-10">
       ArchiveStreamFactory does not recognise tar files created by Ant
      </action>
      <action issue="COMPRESS-110" type="fix" date="2010-05-09">
       Support "ustar" prefix field, which is used when file paths are longer
       than 100 characters.
      </action>
      <action type="update" date="2010-04-19" issue="COMPRESS-105">
       Document that the name of an ZipArchiveEntry determines whether
       an entry is considered a directory or not.
       If you don't use the constructor with the File argument the entry's
        name must end in a "/" in order for the entry to be known as a directory.
      </action>
      <action type="add" date="2010-03-19" issue="COMPRESS-103">
        ZipArchiveInputStream can optionally extract data that used
        the STORED compression method and a data descriptor.
        Doing so in a stream is not safe in general, so you have to
        explicitly enable the feature.  By default the stream will
        throw an exception if it encounters such an entry.
      </action>
      <action type="fix" date="2010-03-12" issue="COMPRESS-100">
        ZipArchiveInputStream will throw an exception if it detects an
        entry that uses a data descriptor for a STORED entry since it
        cannot reliably find the end of data for this "compression"
        method.
      </action>
      <action type="fix" date="2010-03-12" issue="COMPRESS-101">
        ZipArchiveInputStream should now properly read archives that
        use data descriptors but without the "unofficial" signature.
      </action>
      <action type="add" date="2010-03-09" issue="COMPRESS-98">
        The ZIP classes will throw specialized exceptions if any
        attempt is made to read or write data that uses zip features
        not supported (yet).
      </action>
      <action type="add" date="2010-03-08" issue="COMPRESS-99">
        ZipFile#getEntries returns entries in a predictable order -
        the order they appear inside the central directory.
        A new method getEntriesInPhysicalOrder returns entries in
        order of the entry data, i.e. the order ZipArchiveInputStream
        would see.
      </action>
      <action type="add" date="2010-02-19">
        The Archive*Stream and ZipFile classes now have
        can(Read|Write)EntryData methods that can be used to check
        whether a given entry's data can be read/written.
        The method currently returns false for ZIP archives if an
        entry uses an unsupported compression method or encryption.
      </action>
      <action type="add" date="2010-02-19" issue="COMPRESS-89">
        The ZIP classes now detect encrypted entries.
      </action>
      <action type="update" date="2010-02-18" issue="COMPRESS-79">
        Move DOS/Java time conversions into Zip utility class.
      </action>
      <action type="fix" date="2010-02-18" issue="COMPRESS-74">
        ZipArchiveInputStream failed to update the number of bytes
        read properly.
      </action>
      <action type="fix" date="2010-02-18">
        ArchiveInputStream has a new method getBytesRead that should
        be preferred over getCount since the later may truncate the
        number of bytes read for big archives.
      </action>
      <action type="fix" date="2010-02-18" issue="COMPRESS-85">
        The cpio archives created by CpioArchiveOutputStream couldn't
        be read by many existing native implementations because the
        archives contained multiple entries with the same inode/device
        combinations and weren't padded to a blocksize of 512 bytes.
      </action>
      <action type="fix" date="2010-02-16" issue="COMPRESS-73">
        ZipArchiveEntry, ZipFile and ZipArchiveInputStream are now
        more lenient when parsing extra fields.
      </action>
      <action issue="COMPRESS-75" type="update" date="2010-02-12">
       ZipArchiveInputStream does not show location in file where a problem occurred.
      </action>
      <action type="fix" date="2010-02-12" issue="COMPRESS-82">
        cpio is terribly slow.
        Documented that buffered streams are needed for performance
      </action>
      <action type="add" date="2010-02-12" issue="COMPRESS-97">
        Added autodetection of compression format to
        CompressorStreamFactory.
      </action>
      <action type="fix" date="2010-02-12">
        Improved exception message if the extra field data in ZIP
        archives cannot be parsed.
      </action>
      <action type="fix" date="2010-02-11" issue="COMPRESS-17">
        Tar format unspecified - current support documented.
      </action>
      <action type="add" issue="COMPRESS-95" date="2010-01-29"
              due-to="Joerg Bellmann">
        Improve ExceptionMessages in ArchiveStreamFactory
      </action>
      <action type="fix" issue="COMPRESS-94" date="2010-01-07"
              due-to="Anon Devs">
        ZipArchiveEntry's equals method was broken for entries created
        with the String-arg constructor.  This lead to broken ZIP
        archives if two different entries had the same hash code.
      </action>
      <action type="fix" issue="COMPRESS-87" date="2009-10-30"
              due-to="Antoni Mylka">
        ZipArchiveInputStream could repeatedly return 0 on read() when
        the archive was truncated.
      </action>
      <action type="fix" issue="COMPRESS-86" date="2009-10-08">
        Tar archive entries holding the file name for names longer
        than 100 characters in GNU longfile mode didn't properly
        specify they'd be using the "oldgnu" extension.
      </action>
      <action type="add" date="2009-08-25">
        A new constructor of TarArchiveEntry can create entries with
        names that start with slashes - the default is to strip
        leading slashes in order to create relative path names.
      </action>
      <action issue="COMPRESS-83" type="fix" date="2009-08-01">
        Delegate all read and write methods in GZip stream in order to
        speed up operations.
      </action>
      <action type="add" date="2009-08-01">
        ArchiveEntry now has a getLastModifiedDate method.
      </action>
      <action type="fix" date="2009-08-01">
        The ar and cpio streams now properly read and write last
        modified times.
      </action>
      <action issue="COMPRESS-81" type="fix" date="2009-06-30">
        TarOutputStream can leave garbage at the end of the archive
      </action>
      <action issue="COMPRESS-78" type="add" date="2009-06-30"
              due-to="Jukka Zitting">
        Add a BZip2Utils class modelled after GZipUtils
      </action>
    </release>
    <release version="1.0" date="2009-05-21" description="First Public Release">
      <action dev="all" type="add" date="2009-05-21">
        Initial release
      </action>
      <action dev="sgoeschl" type="fix">
        Updating the pom.xml for preparing a move to commons-proper
      </action>
    </release>
  </body>
</document>
