xz-utils (5.0.0-3) stable; urgency=low

  * Fixes from upstream:
    * liblzma:
      - lzma_easy_buffer_encode() and lzma_stream_buffer_encode()
        avoid writing Blocks with empty compressed data that xz and
        liblzma versions before 5.0.2 cannot read.
      - The LZMA2 decoder skips Blocks with empty compressed data
        instead of rejecting them.
      - Validates encoder arguments better.  It is harder to segfault
        or create a corrupt XZ file instead of receiving an error
        when calling these functions:
        - lzma_stream_buffer_encode() and lzma_block_buffer_encode()
          reject unsupported integrity checks;
        - lzma_block_encoder() checks for block == NULL.
      - bcj: Fix possibility of incorrect LZMA_BUF_ERROR (reported in
        XZ Embedded as Fedora bug 735408).
      - Plugs a memory leak in lzma_stream_encoder().
      - lzma_index_init() returns NULL instead of segfaulting on
        allocation failure.
    * docs/examples/xz_pipe_decompress.c checks that the last
      lzma_code() call returned LZMA_STREAM_END to avoid mistaking a
      file without a proper footer for a valid XZ file.
    * "xz -v -v --list" does not free() filter options unless the
      filter options array has been initialized.  This prevents
      reading and free()ing pointers from past the end of an on-stack
      array when one of the listed files has an unmeaningful Block
      header size.
    * xzegrep and xzfgrep perform extended regex and fixed-string
      matches, respectively.  (The previous behavior was to always
      use basic regexes.)
    * The exit status from “xzdiff foo.xz bar.xz” reflects whether
      files differ.  Thanks to Peter Pallinger.  Closes: #635501.
    * xzgrep does not fail just because the decompressor has died
      with SIGPIPE due to some unconsumed output.  This makes the
      exit status from commands such as "xzgrep -q" more predictable.
    * The Czech “xz --help” output uses a more correct term for files
      with holes.  Thanks to Petr Hubený.  Closes: #605762.
    * The Italian diagnostic for an invalid --format argument lost an
      extra 'N'.
  * debian/rules: "chmod +x tests/test_scripts.sh" for new xzdiff
    tests.
  * debian/symbols: Bump the minimal versions for LZMA2 encoder
    functions that reject more bad arguments and skip empty blocks.
  * liblzma-dev: Install an appropriate library for static linking
    instead of the decompression-only version used to build xzdec.
    Thanks to Anton Tolchanov.  Closes: #673001.

 -- Jonathan Nieder <jrnieder@gmail.com>  Sat, 23 Jun 2012 04:47:21 -0500

xz-utils (5.0.0-2) unstable; urgency=low

  * Upload to unstable.
  * liblzma2, liblzma-dev, xz-lzma: Install release notes.
  * debian/symbols: Bump the minimal versions for lzma_index_encoder,
    lzma_index_decoder to the version in which they gained LZMA_FINISH
    support.
  * xz-utils/README.Debian: Document differences from upstream ABI.
  * debian/changelog.upstream.sh: Avoid empty changelog entries when
    multiple Debian revisions match an upstream tag.

 -- Jonathan Nieder <jrnieder@gmail.com>  Thu, 11 Nov 2010 13:45:20 -0600

xz-utils (5.0.0-1) experimental; urgency=low

  * Upload to experimental.
  * New stable upstream release.  Closes: #592298.
    - xz avoids SA_RESTART.  This should not have a visible effect
      because xz already blocked signals during operations that
      would be difficult to resume after interruption.
    - liblzma: The coders returned by lzma_index_encoder() and
      lzma_index_decoder() support an LZMA_FINISH action, with
      identical semantics to LZMA_RUN.
    - The printable (PDF and PS) versions of the manual are easier
      to read.
    - Many documentation and build system cleanups.
  * liblzma: Back out upstream ABI tweaks.
  * liblzma/README.Debian: Document ABI differences from upstream.
  * Copy sample code not included in the release tarball from
    the development upstream repository to debian/examples.
  * debian/rules clean: Remove some files not included in the
    release tarball.
  * copyright: List new INSTALL.generic license.
  * debian/rules clean: Take new build-aux scripts into account.
  * debian/rules:  Adapt for upstream build system changes.
    Closes: #540443.
  * xz-utils, xzdec: Install release notes.

 -- Jonathan Nieder <jrnieder@gmail.com>  Mon, 25 Oct 2010 05:45:18 -0500

xz-utils (4.999.9beta+20100927-1) experimental; urgency=low

  * New snapshot, taken from upstream commit cec0ddc.
    - liblzma: The meaning of --extreme has been tweaked to address
      cases in which it made the compression ratio worse.  Some files
      might benefit slightly less from --extreme.
    - xz: Table columns are not misaligned any more in messages with
      multi-byte characters (e.g., file sizes with LANG=fi_FI.UTF-8).
    - xz: New German and Italian translations.
    - Various documentation, message, and translation updates.
  * Update copyright file.
  * debian/rules get-orig-source: Update upstream Git URL.
  * xz-utils/README.Debian: Advertise XZ_DEFAULTS.

 -- Jonathan Nieder <jrnieder@gmail.com>  Mon, 27 Sep 2010 16:22:22 -0500

xz-utils (4.999.9beta+20100903-1) experimental; urgency=low

  * New snapshot, taken from upstream commit 373ee26.
    - liblzma: The settings for compression levels 0 through 5
      (used by xz -0/.../-5) have been tweaked.  This affects the
      speed, compression ratio, and memory usage at compression and
      decompression time.
    - Does not search so hard for a match when a low "nice match
      length" setting is specified without a depth.
    - xz: The -1/.../-9 preset options override any previously
      specified filters, rather than vice versa.  To mix presets
      with filter options, use the --lzma2=preset=n option.
    - xz: Warns about --memlimit-compress settings that result in
      compression settings changing even if no explicit -1/.../-9,
      --lzma1, or --lzma2 option was used.
    - "xz -v -v --compress" now prints an estimate of the memory
      required to decompress a file.
  * debian/copyright: Update upstream Git URL.
  * debian/changelog.upstream.sh: Permit terser changelog lines.
  * Standards-Version: 3.9.1 (checked).

 -- Jonathan Nieder <jrnieder@gmail.com>  Fri, 03 Sep 2010 17:05:20 -0500

xz-utils (4.999.9beta+20100810-1) unstable; urgency=low

  * New upstream snapshot, taken from upstream commit d5653ba8a.
    - xz: The memory usage limiter is now disabled by default.
    - xz: Support for an XZ_DEFAULTS environment variable was added.
      It contains user-specific default settings, such as memory usage
      limits, and can be overridden by the command line and XZ_OPT.
    - xz: The new --memlimit-compress and --memlimit-decompress
      options allow the memory usage limit to be set separately for
      compression and decompression.  A new --memlimit alias has been
      added for the existing --memory option.
    - xz: The --info-memory option (with or without --robot) now prints
      how much RAM is installed in addition to the compression and
      decompression memory limits.
  * liblzma-doc: Simplify package description.
  * debian/control: Build-Depends: autopoint | gettext (<< 0.18-1),
    autopoint | cvs instead of autopoint, to help with backporting.
    Thanks to Thorsten Glaser for a report.

 -- Jonathan Nieder <jrnieder@gmail.com>  Tue, 10 Aug 2010 20:27:14 -0500

xz-utils (4.999.9beta+20100713-1) unstable; urgency=low

  [ Thorsten Glaser ]
  * Explicitly depend on autoconf (>= 2.64~) due to AC_PREREQ,
    discovered during backporting.

  [ Jonathan Nieder ]
  * Upload to unstable.
  * New upstream snapshot, taken from upstream commit a540198f.
    - xz: The new --no-adjust option can be used to error out if there
      is insufficient memory for the chosen compression level.
  * liblzma-dev: Install examples to /usr/share/doc/liblzma-dev.
  * Update copyright file.

  * Drop unpack-time conflicts in favor of configuration-time
    conflicts (Replaces + Breaks):
     - xz-utils: against old xz-lzma (for lzmainfo).
     - xzdec: against old xz-lzma (for lzmadec).
     - xz-lzma: against lzip 1.7 (for lzdiff and lzgrep).
  * Standards-Version: 3.9.0.

  * debian/autogen.sh: Don’t regenerate upstream changelog when it is
    not out of date.
  * debian/rules get-orig-source: Use gzip --no-name --rsyncable.

 -- Jonathan Nieder <jrnieder@gmail.com>  Thu, 15 Jul 2010 01:53:37 -0500

xz-utils (4.999.9beta+20100602-1) experimental; urgency=low

  * New upstream snapshot, taken from upstream commit d8b41eed.
    - The output from "xz -v --list" and "xz -v -v --list" has been
      improved.
      "xz -v -v --list" can be used to obtain an estimate for the memory
      required to decompress a file.
    - The xz manual page has some new material, including examples.
      Closes: #578465.
    - liblzma: The lzma_block_compressed_size() function no longer
      returns LZMA_DATA_ERROR for valid Blocks.
  * debian/symbols: Bump minimal version for lzma_block_compressed_size.
  * Correct the 4.999.9beta+20100307-1 changelog entry to describe
    which public functions were affected.

  * Add new xz-lzma package to allow xz to provide lzma and related
    commands.  Conflicts: and Provides: lzma.
  * xz-utils: Suggests: xz-lzma.
  * xz-utils/README.Debian: Take xz-lzma into account.

 -- Jonathan Nieder <jrnieder@gmail.com>  Fri, 04 Jun 2010 15:53:58 -0500

xz-utils (4.999.9beta+20100527-1) unstable; urgency=low

  * New upstream snapshot, taken from upstream commit a334348dc.
    - Show both elapsed time and estimated remaining time in xz -v.
      Thanks to Trent W. Buck for the idea.  Closes: #574583.
    - liblzma: Remove the Subblock filter from the public API
      (the ABI is unchanged).
  * liblzma-dev.NEWS: Update.
  * xz-utils: Update Czech translation.
  * Change priority of xz-utils and liblzma2 to required and
    xzdec to extra.

 -- Jonathan Nieder <jrnieder@gmail.com>  Thu, 27 May 2010 16:27:04 -0500

xz-utils (4.999.9beta+20100307-1) unstable; urgency=low

  * New upstream snapshot, taken from upstream commit f4b2b526.
    - liblzma: The stream initialization functions were not correctly
      initializing the internal allow_buffer_error flag.  As a result,
      ever since 4.999.9beta-1 in rare circumstances when decompressing
      LZMA files, the xz tool would produce spurious "Unexpected end
      of input" failures (Gentoo bug 305591).
    - The default memory usage limit on low-memory systems has been
      increased.
  * debian/copyright: Clarify.

 -- Jonathan Nieder <jrnieder@gmail.com>  Tue, 09 Mar 2010 10:22:24 -0600

xz-utils (4.999.9beta+20100212-4) unstable; urgency=low

  * debian/control: Build-Depends: autopoint instead of cvs.
    Closes: #572481.
  * debian/copyright: Clean up and include more details.
  * debian/rules get-orig-source: Unindent comment lines.
  * xz-utils: include Czech translation.

 -- Jonathan Nieder <jrnieder@gmail.com>  Thu, 04 Mar 2010 10:17:15 -0600

xz-utils (4.999.9beta+20100212-3) unstable; urgency=low

  * liblzma-dev: Remove unneeded .la file.
  * xz-utils: Dynamically link the xz binary.
  * Do not waste time installing and running doxygen on buildds that
    are not going to build arch-all packages.
    Build-Depends-Indep: doxygen.  Closes: #540444.

 -- Jonathan Nieder <jrnieder@gmail.com>  Tue, 23 Feb 2010 18:23:29 -0600

xz-utils (4.999.9beta+20100212-2) unstable; urgency=low

  * Split off xzdec and lzmadec commands into new xzdec package.
    Thanks to Guillem Jover for the idea.  Closes: #571060.
  * xz-utils.NEWS: advertise this change.

 -- Jonathan Nieder <jrnieder@gmail.com>  Tue, 23 Feb 2010 08:09:39 -0600

xz-utils (4.999.9beta+20100212-1) unstable; urgency=low

  * New upstream snapshot, taken from upstream commit eb7d51a3f.
     - xz --force compresses symlinks without complaint now.
     - liblzma: the optimized CRC32 implementation for x86 no longer
       misdetects the Hurd as Mac OS X.
  * debian/rules: ./configure --enable-assembler on the Hurd.
  * xz-utils: Simplify NEWS.Debian.gz.
  * liblzma-dev: Add a NEWS file to keep track of future API changes.

  * Drop unnecessary build-time conflict with autoconf2.13.
  * Add a blank line to the end of all NEWS files.
    (Works around: #247356)
  * debian/README.source: Leave out “-I -i” options.  Ignoring version
    control cruft is the default behavior with dpkg source format 3.0.
  * debian/changelog.upstream.sh: Pass ‘git log’ an explicit --format
    option to avoid problems if format.pretty is set in gitconfig.

  * Correct the 4.999.9beta+20100117-1 changelog entry.  It said:
     + The user-specified memory usage limit was not being honored in
       some cases.
    No such bug was observed, so describe the change instead.

 -- Jonathan Nieder <jrnieder@gmail.com>  Tue, 16 Feb 2010 00:30:24 -0600

xz-utils (4.999.9beta+20100131-1) unstable; urgency=low

  * New upstream snapshot, taken from upstream commit f9dd797a.
     + xz: the --list option to display information about a compressed
       file (e.g., its uncompressed size) is now functional.  The output
       of the xz --robot --list command still may change in future
       versions.
  * xz-utils: NEWS.Debian.gz: Clarify how interleaved output can
    go wrong.
  * debian/rules: Simplify:
     - remove support for comma as a delimiter for $(DEB_BUILD_OPTIONS).
     - rely on dh --parallel instead of tricky logic of our own to
       handle parallel builds.  Build-Depends: debhelper (>= 7.4.10).
  * Correct some typos in the 4.999.9beta+20100117-1 changelog entry.
  * Standards-Version: 3.8.4 (checked).
  * Update copyright file.

 -- Jonathan Nieder <jrnieder@gmail.com>  Sun, 31 Jan 2010 17:32:02 -0600

xz-utils (4.999.9beta+20100117-1) unstable; urgency=low

  * New upstream snapshot, taken from upstream commit 07a11dad.
     + Fix some logic errors in the internal memory usage configuration
       API.
     + xz will no longer compress or decompress special files in place,
       even with --force.
       --force still enables compression of the target of a symlink.
     + xz will no longer read compressed data from a terminal or write
       it to a terminal, even with --force.
     + liblzma: many Index handling API improvements:
        - An lzma_index includes more useful metadata that is not
          actually from the Index.  This is particularly helpful for
          describing multiple-stream files.
           * lzma_index_cat() does not take a stream padding argument
             any more; use lzma_index_stream_padding() instead.
           * lzma_index_memusage() takes two arguments now.
             The new lzma_index_memused() convenience function
             calculates the total memory usage of an lzma_index.
           * lzma_index_count() has been replaced with
             lzma_index_block_count() and lzma_index_stream_count().
           * The new lzma_index_stream_flags() allows storing Stream
             Flags (e.g., checksum types) with the Index information.
           * The new lzma_index_checks() function indicates the list of
             checksum types in use.
           * lzma_index_equal() has been removed.  Its semantics were
             unclear, and something approximately equivalent can be
             implemented by iterating over Blocks in application code.
        - An lzma_index no longer represents a position within an Index.
          The new lzma_index_iter type can be used for that purpose.
           * Certain functions generate an iterator on demand now rather
             than clobbering their lzma_index arguments.  Using a single
             lzma_index for multiple concurrent invocations is safe now:
              lzma_index_buffer_encode(), lzma_index_encoder()
           * Functions that used to specify a Record by modifying an
             lzma_index argument have been renamed and taught to write
             an lzma_index_iter instead:
              lzma_index_locate() -> lzma_index_iter_locate()
              lzma_index_rewind() -> lzma_index_iter_rewind()
              lzma_index_read() -> lzma_index_iter_next()
           * The lzma_index_record type used by lzma_index_read() for
             complex seeks is no more.  lzma_index_iter_next() instead
             takes a parameter of the new lzma_index_iter_mode type.
           * New function: lzma_index_iter_init()
           * lzma_index_init() cannot reuse memory from an existing
             lzma_index any more.  The signature changed accordingly.
     + xz: support for decompressing to a sparse file
        - Try to write a sparse file if the decompressed stream contains
          long runs of null bytes.
        - The new --no-sparse option disables this behavior.
     + xz: add Czech translation.
     + liblzma-dev: lzma_filters_copy() and lzma_filters_update() are
       declared not to throw exceptions.
  * liblzma: bump soname.
  * xz-utils: Add NEWS.Debian describing the sparse file support.
  * debian/rules: Stop explicitly disabling assembler optimizations on
    the Hurd.  The configure script will check if a platform is
    supported.

  * debian/rules: Update clean target to handle comments and wildcards
    in .gitignore.
  * Build-Depends: perl.

  * debian/rules: Speed up build by using autoreconf --symlink.
  * Remove debian/dirs lists.
  * Update copyright file and fix a small typo.

 -- Jonathan Nieder <jrnieder@gmail.com>  Mon, 18 Jan 2010 04:19:50 -0600

xz-utils (4.999.9beta+20091116-1) unstable; urgency=low

  * New upstream snapshot, taken from upstream commit d315ca4.
     + liblzma: add some new functions:
        - lzma_filters_copy() to copy a filter chain;
        - lzma_filters_update() to change compression options mid-stream;
        - lzma_physmem() to retrieve the total quantity of installed RAM.
     + Fix a design error in liblzma API.
        - Stop requiring caller to maintain filter chain during
          compression.  The library used to read it for new compression
          options.  Callers that need to change options mid-stream should
          use lzma_filters_update() instead.
        - Remove 'persistent' member from struct lzma_options_lzma.
     + xz: add --robot --info-memory options, for front-ends to use to
       read the memory usage limit.
  * liblzma: bump soname; add README.Debian explaining why soname
    differs from upstream.
  * Use source format 3.0 (quilt).
  * Update and clarify copyright file.

 -- Jonathan Nieder <jrnieder@gmail.com>  Mon, 16 Nov 2009 16:33:35 -0600

xz-utils (4.999.9beta+20091016-1) unstable; urgency=low

  * New upstream snapshot, taken from upstream commit 78e92c1.
  * Drop xzmore.1 patch, applied upstream.
  * debian/rules: Disable assembler optimizations on hurd. (Closes: #553331)
  * debian/control: Clarify binary package descriptions.  Thanks to
    Justin B Rye and Ben Finney for the text.
  * debian/rules get-orig-source: Use commit date (instead of last patch
    date) to name snapshots.

 -- Jonathan Nieder <jrnieder@gmail.com>  Sun, 01 Nov 2009 00:22:04 -0500

xz-utils (4.999.9beta+20091004-1) unstable; urgency=low

  * Upload to unstable. (Closes: #543562)
  * New upstream snapshot, taken from upstream commit ebfb2c5.
  * Patch xzmore.1 to use dashes instead of minus signs.
  * debian/control: Conflicts: xz-lzma. (Closes: #550249)
  * liblzma-doc: Register Doxygen-generated docs with doc-base.
  * debian/changelog.upstream.sh: Declare local variables.
  * debian/changelog.upstream.sh: Cope with multiple Debian revisions per
    upstream version.
  * debian/rules: Use ":=" where appropriate.
  * Add watch file.

 -- Jonathan Nieder <jrnieder@gmail.com>  Fri, 16 Oct 2009 13:58:54 -0500

xz-utils (4.999.9beta+20091002-1) experimental; urgency=low

  * New upstream snapshot, taken from upstream commit 29fd321.
  * debian/control: Build-Depends: cvs (for autopoint).

 -- Jonathan Nieder <jrnieder@gmail.com>  Sun, 04 Oct 2009 00:21:08 -0500

xz-utils (4.999.9beta-1) experimental; urgency=low

  [ Jonathan Nieder ]
  * New upstream release.
     - Fix a data corruption in the compression code. (Closes: #544872)
     - xzdiff: Fix comparing two compressed files. (Closes: #540543)
     - Most of XZ Utils is now in the public domain. (Closes: #541391)
     - Add doc/history.txt to the distributed tarball. (Closes: #541540)
  * Update and clarify copyright file.
  * Drop lzma compatibility commands for now. (Closes: #542060, #540232)
    Add instructions to README.Debian for installing them locally.
  * debian/control: Add information about the packaging Git repository.
  * debian/control: Clarify package descriptions.
  * debian/README.source: Clarify build instructions.
  * Add debian/.gitignore listing build products.
  * Build xz-utils with static liblzma.
     - debian/rules: Use configure --enable-dynamic=mixed.
  * Optimize xzdec for size, following suggestion in PACKAGERS.
     - debian/rules: Build xzdec separately so it can be optimized for size.
     - debian/control: Build-Depends: debhelper (>= 7.3.0).
  * Generate upstream changelog instead of shipping placeholder.
     - debian/README.source: Add instructions for regenerating upstream
       changelog file.
     - debian/changelog.upstream.sh: New script.
     - debian/rules: Install generated changelog file.
  * liblzma-doc: Drop documentation already shipped in
    /usr/share/doc/xz-utils.
  * liblzma-dev, liblzma-doc: Add short README.Debian with pointers to
    development documentation.
  * Drop debian/xzdec.1, since upstream ships a better man page.
  * Run autotools at build time.
     + debian/control:
        - Build-Depends: autoconf, automake, libtool, gettext
        - Build-Conflicts: autoconf2.13, automake1.4
     + debian/rules:
        - configure: autoreconf -fi
        - clean: remove autotools-generated files to avoid .diff.gz
          changes when built twice in a row.
  * debian/rules: Add get-orig-source target.
  * Prepare for upload to experimental.

  [ Cristian Greco ]
  * debian/copyright: refer to versioned GPL-3 file.
  * debian/control: remove duplicate field ‘section’ in package xz-utils.

 -- Jonathan Nieder <jrnieder@gmail.com>  Wed, 30 Sep 2009 01:44:04 -0500

xz-utils (4.999.8beta-1) experimental; urgency=low

  [ Jonathan Nieder ]
  * Initial package for Debian. (Closes: #518803)
     + debian/rules:
        - add minimal rules file (using Debhelper 7), a control file
          describing the binary packages, and an appropriate compat file.
        - use configure --enable-dynamic; use up-to-date config.guess and
          config.sub files.
        - do not run automake and so on on autobuilders. Instead, we can
          run them ourselves when we build the source package.
     + debian/README.source:
        - add informations about the packaging GIT repository.
  * Add liblzma-doc package with Doxygen-generated API docs.

  [ Mohammed Adnène Trojette ]
  * Prepare for upload to experimental.

 -- Mohammed Adnène Trojette <adn+deb@diwi.org>  Sat, 27 Jun 2009 17:26:56 +0200
