xz-utils (5.0.0-2.1) 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.
      - Plugs a memory leak in lzma_stream_encoder().
      - lzma_index_init() returns NULL instead of segfaulting on
        allocation failure.
    * "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.
    * 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 minimal versions for lzma_easy_buffer_encode
    and lzma_stream_buffer_encode.
  * 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>  Thu, 24 May 2012 13:23:33 -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
