
XZ Utils Release Notes
======================

5.0.8 (2014-12-21)

    * Fixed an old bug in xzgrep that affected OpenBSD and probably
      a few other operating systems too.

    * Updated French and German translations.

    * Added support for detecting the amount of RAM on AmigaOS/AROS.

    * Minor build system updates.


5.0.7 (2014-09-20)

    * Fix regressions introduced in 5.0.6:

        - Fix building with non-GNU make.

        - Fix invalid Libs.private value in liblzma.pc which broke
          static linking against liblzma if the linker flags were
          taken from pkg-config.


5.0.6 (2014-09-14)

    * xzgrep now exits with status 0 if at least one file matched.

    * A few minor portability and build system fixes


5.0.5 (2013-06-30)

    * lzmadec and liblzma's lzma_alone_decoder(): Support decompressing
      .lzma files that have less common settings in the headers
      (dictionary size other than 2^n or 2^n + 2^(n-1), or uncompressed
      size greater than 256 GiB). The limitations existed to avoid false
      positives when detecting .lzma files. The lc + lp <= 4 limitation
      still remains since liblzma's LZMA decoder has that limitation.

      NOTE: xz's .lzma support or liblzma's lzma_auto_decoder() are NOT
      affected by this change. They still consider uncommon .lzma headers
      as not being in the .lzma format. Changing this would give way too
      many false positives.

    * xz:

        - Interaction of preset and custom filter chain options was
          made less illogical. This affects only certain less typical
          uses cases so few people are expected to notice this change.

          Now when a custom filter chain option (e.g. --lzma2) is
          specified, all preset options (-0 ... -9, -e) earlier are on
          the command line are completely forgotten. Similarly, when
          a preset option is specified, all custom filter chain options
          earlier on the command line are completely forgotten.

          Example 1: "xz -9 --lzma2=preset=5 -e" is equivalent to "xz -e"
          which is equivalent to "xz -6e". Earlier -e didn't put xz back
          into preset mode and thus the example command was equivalent
          to "xz --lzma2=preset=5".

          Example 2: "xz -9e --lzma2=preset=5 -7" is equivalent to
          "xz -7". Earlier a custom filter chain option didn't make
          xz forget the -e option so the example was equivalent to
          "xz -7e".

        - Fixes and improvements to error handling.

        - Various fixes to the man page.

    * xzless: Fixed to work with "less" versions 448 and later.

    * xzgrep: Made -h an alias for --no-filename.

    * Include the previously missing debug/translation.bash which can
      be useful for translators.

    * Include a build script for Mac OS X. This has been in the Git
      repository since 2010 but due to a mistake in Makefile.am the
      script hasn't been included in a release tarball before.


5.0.4 (2012-06-22)

    * liblzma:

        - Fix lzma_index_init(). It could crash if memory allocation
          failed.

        - Fix the possibility of an incorrect LZMA_BUF_ERROR when a BCJ
          filter is used and the application only provides exactly as
          much output space as is the uncompressed size of the file.

        - Fix a bug in doc/examples_old/xz_pipe_decompress.c. It didn't
          check if the last call to lzma_code() really returned
          LZMA_STREAM_END, which made the program think that truncated
          files are valid.

        - New example programs in doc/examples (old programs are now in
          doc/examples_old). These have more comments and more detailed
          error handling.

    * Fix "xz -lvv foo.xz". It could crash on some corrupted files.

    * Fix output of "xz --robot -lv" and "xz --robot -lvv" which
      incorrectly printed the filename also in the "foo (x/x)" format.

    * Fix exit status of "xzdiff foo.xz bar.xz".

    * Fix exit status of "xzgrep foo binary_file".

    * Fix portability to EBCDIC systems.

    * Fix a configure issue on AIX with the XL C compiler. See INSTALL
      for details.

    * Update French, German, Italian, and Polish translations.


5.0.3 (2011-05-21)

    * liblzma fixes:

        - A memory leak was fixed.

        - lzma_stream_buffer_encode() no longer creates an empty .xz
          Block if encoding an empty buffer. Such an empty Block with
          LZMA2 data would trigger a bug in 5.0.1 and older (see the
          first bullet point in 5.0.2 notes). When releasing 5.0.2,
          I thought that no encoder creates this kind of files but
          I was wrong.

        - Validate function arguments better in a few functions. Most
          importantly, specifying an unsupported integrity check to
          lzma_stream_buffer_encode() no longer creates a corrupt .xz
          file. Probably no application tries to do that, so this
          shouldn't be a big problem in practice.

        - Document that lzma_block_buffer_encode(),
          lzma_easy_buffer_encode(), lzma_stream_encoder(), and
          lzma_stream_buffer_encode() may return LZMA_UNSUPPORTED_CHECK.

        - The return values of the _memusage() functions are now
          documented better.

    * Fix command name detection in xzgrep. xzegrep and xzfgrep now
      correctly use egrep and fgrep instead of grep.

    * French translation was added.


5.0.2 (2011-04-01)

    * LZMA2 decompressor now correctly accepts LZMA2 streams with no
      uncompressed data. Previously it considered them corrupt. The
      bug can affect applications that use raw LZMA2 streams. It is
      very unlikely to affect .xz files because no compressor creates
      .xz files with empty LZMA2 streams. (Empty .xz files are a
      different thing than empty LZMA2 streams.)

    * "xz --suffix=.foo filename.foo" now refuses to compress the
      file due to it already having the suffix .foo. It was already
      documented on the man page, but the code lacked the test.

    * "xzgrep -l foo bar.xz" works now.

    * Polish translation was added.


5.0.1 (2011-01-29)

    * xz --force now (de)compresses files that have setuid, setgid,
      or sticky bit set and files that have multiple hard links.
      The man page had it documented this way already, but the code
      had a bug.

    * gzip and bzip2 support in xzdiff was fixed.

    * Portability fixes

    * Minor fix to Czech translation


5.0.0 (2010-10-23)

    Only the most important changes compared to 4.999.9beta are listed
    here. One change is especially important:

      * The memory usage limit is now disabled by default. Some scripts
        written before this change may have used --memory=max on xz command
        line or in XZ_OPT. THESE USES OF --memory=max SHOULD BE REMOVED
        NOW, because they interfere with user's ability to set the memory
        usage limit himself. If user-specified limit causes problems to
        your script, blame the user.

    Other significant changes:

      * Added support for XZ_DEFAULTS environment variable. This variable
        allows users to set default options for xz, e.g. default memory
        usage limit or default compression level. Scripts that use xz
        must never set or unset XZ_DEFAULTS. Scripts should use XZ_OPT
        instead if they need a way to pass options to xz via an
        environment variable.

      * The compression settings associated with the preset levels
        -0 ... -9 have been changed. --extreme was changed a little too.
        It is now less likely to make compression worse, but with some
        files the new --extreme may compress slightly worse than the old
        --extreme.

      * If a preset level (-0 ... -9) is specified after a custom filter
        chain options have been used (e.g. --lzma2), the custom filter
        chain will be forgotten. Earlier the preset options were
        completely ignored after custom filter chain options had been
        seen.

      * xz will create sparse files when decompressing if the uncompressed
        data contains long sequences of binary zeros. This is done even
        when writing to standard output that is connected to a regular
        file and certain additional conditions are met to make it safe.

      * Support for "xz --list" was added. Combine with --verbose or
        --verbose --verbose (-vv) for detailed output.

      * I had hoped that liblzma API would have been stable after
        4.999.9beta, but there have been a couple of changes in the
        advanced features, which don't affect most applications:

          - Index handling code was revised. If you were using the old
            API, you will get a compiler error (so it's easy to notice).

          - A subtle but important change was made to the Block handling
            API. lzma_block.version has to be initialized even for
            lzma_block_header_decode(). Code that doesn't do it will work
            for now, but might break in the future, which makes this API
            change easy to miss.

      * The major soname has been bumped to 5.0.0. liblzma API and ABI
        are now stable, so the need to recompile programs linking against
        liblzma shouldn't arise soon.

