xz-utils (5.2.4-1) unstable; urgency=low

  * New upstream release.  Closes: #851615.
  * Standards-Version: 4.3.0 (checked).
  * Use an XZ compressed tarball for upstream source.
  * Add upstream signing key and verify tarball at "uscan" time.
  * Drop patches; all were applied or otherwise fixed upstream.
  * Update copyright file.
  * debian/control:
    - Use a stable repo.or.cz URL for packaging repo.
      Closes: #826382.  Thanks to Rolf Leggewie.
    - Use https for upstream homepage URL.
    - No longer Build-Depends: freebsd-glue on kfreebsd.
  * get-orig-source: Use https for upstream Git repository.
  * liblzma:
    - Remove compatibility tricks that permit sharing a process with
      liblzma.so.2.  This means liblzma.a no longer depends on libdl
      at run time.
      Closes: #919950.  Thanks to Josh Triplett.
    - Breaks: liblzma2 versions without symbol versioning.
    - Priority: optional.
  * xz-utils:
    - Lower priority of xz-utils to standard.  Closes: #685203.
    - README.Debian: Remove notes about differences from upstream.
    - Remove old NEWS.Debian.

 -- Jonathan Nieder <jrnieder@gmail.com>  Sun, 27 Jan 2019 17:09:34 -0800

xz-utils (5.2.2-1.3) unstable; urgency=medium

  * Non-maintainer upload.
  * Force a constant /bin/sh for installed scripts. This helps the build
    be reproducible; /bin/sh on Debian is always POSIX. (Closes: #806331)

 -- Ximin Luo <infinity0@debian.org>  Wed, 28 Jun 2017 18:39:19 +0200

xz-utils (5.2.2-1.2) unstable; urgency=medium

  * Non-maintainer upload.
  * link against libfreebsd-glue on kfreebsd-* (Closes: #840063)

 -- Sebastian Andrzej Siewior <sebastian@breakpoint.cc>  Sat, 08 Oct 2016 15:11:19 +0200

xz-utils (5.2.2-1.1) unstable; urgency=medium

  * Non-maintainer upload.
  * switch to git-dpm for packaging (closes: #540405)
  * New Upstream (closes: #731634)
   - no more "xzless error in line 49" (closes: #693537)
   - xzgrep -h works (closes: #780268)
  * update symbol file
  * enable threads for the "normal build"

 -- Sebastian Andrzej Siewior <sebastian@breakpoint.cc>  Mon, 26 Sep 2016 20:45:45 +0200

xz-utils (5.1.1alpha+20120614-2.1) unstable; urgency=medium

  [ Helmut Grohne ]
  * Non-maintainer upload.

  [ Colin Watson ]
  * Remove build-dependency on perl; we use no non-trivial Perl modules so
    the Essential perl-base is perfectly adequate, and an unadorned
    build-dependency on perl is problematic for cross-building.
    Closes: #697328.

 -- Helmut Grohne <helmut@subdivi.de>  Thu, 18 Jun 2015 20:27:23 +0200

xz-utils (5.1.1alpha+20120614-2) unstable; urgency=low

  * Apply fixes from 5.1.2alpha.  Closes: #685220.
    - liblzma: report a LZMA_DATA_ERROR when range encoded data starts
      with a nonzero byte.  This is a sanity check to catch malformed
      files that no known encoders produce.
    - xz -v -v --list: Support for decompressing blocks with
      zero-length uncompressed data was added in xz 5.0.2, not 5.0.3.
    - xz.1: "xz --robot -v -v --list" gained a "minimum xz version to
      decompress" field.
  * xz-utils/README.Debian: Document differences from upstream.
    Closes: #685217.

 -- Jonathan Nieder <jrnieder@gmail.com>  Mon, 10 Sep 2012 14:35:33 -0700

xz-utils (5.1.1alpha+20120614-1) unstable; urgency=low

  * New snapshot, taken from upstream commit f1675f76.
    - liblzma: BCJ filters would return a spurious LZMA_BUF_ERROR
      result in certain circumstances.  As a result, the xz tool
      could produce inappropriate "Compressed data is corrupt" or
      "Unexpected end of input" failures (reported in XZ Embedded as
      Fedora bug 735408).
    - "xz -v -v --list" prints the minimal XZ Utils version needed
      to decompress a stream.
    - "xz --robot -v --list" formats filenames more plainly.
    - xzgrep does not fail unconditionally when the decompressor
      dies with SIGPIPE due to unconsumed output any more.  This
      makes the exit status from commands such as "xzgrep -q" and
      "xzgrep -l" more predictable and convenient for scripts.
    - examples/xz_pipe_decomp.c did not check correctly for
      truncated input.
    - There is a new set of sample programs.  The old ones have
      been renamed to examples_old but are still maintained.
  * liblzma:
    - If dlopen() indicates that liblzma.so.2 is loaded, check fewer
      reserved fields in the stream argument to the lzma_code()
      function.  This prevents out-of-bounds reads when liblzma5
      functions are called by code built against liblzma2 (see
      <http://sourceware.org/PR12977>).
    - Remove the lzma_code@Base compatibility symbol.
      Closes: #649522.  Thanks to Eduard Bloch.
    - Install run-time library to /lib so it can be used before /usr
      is mounted.  Closes: #672120.
    - Configure with --disable-threads for now to avoid needlessly
      linking to libpthread and librt.
  * liblzma-dev:
    - Install an appropriate library for static linking instead of
      the decompression-only version used to build xzdec.
      Closes: #673001.  Thanks to Anton Tolchanov.
    - Use the liblzma2-compatible version of lzma_code() in the
      static library.
    - Multi-Arch: same.  Thanks to Riku Voipio.
    - Install new examples and revised old examples to
      /usr/share/doc/liblzma-dev.
  * xz-utils:
    - Use update-alternatives to provide lzma, unlzma, lzcat, and
      the rest of the lz* scripts without conflicting with the lzma
      package.
    - Conflicts: lzma versions before before 9.22-1, when it started
      providing lzma, unlzma, and lzcat through the alternatives
      system.
    - Conflicts: and Replaces: xz-lzma.
    - README.Debian: Update instructions on configuring the package
      to provide lzma compatibility commands.
  * Remove xz-lzma package.
  * Use dpkg-buildflags to retrieve compiler flags, including
    hardening options.  Build-Depends: dpkg-dev (>= 1.16.1).
    Closes: #653739.
  * debian/rules:
    - build-arch: Simplify by using a double-colon rule instead of a
      dependency on a dummy noop target.
    - build-indep: Assume doxygen is available, instead of trying to
      get by by assuming the caller meant to invoke build-arch when
      it is missing.  Build-Depends: dpkg-dev (>= 1.16.2).
    - Rearrange for clarity.
  * debian/symbols: Bump the minimal version for lzma_code(),
    lzma_raw_buffer_decode(), and lzma_raw_buffer_encode().
  * Use machine-readable copyright-format 1.0.
  * Update copyright file.
  * Standards-Version: 3.9.3 (checked).
  * debian/changelog.upstream.sh: Use ‘git rev-list | git diff-tree’
    instead of ‘git log’ to avoid depending on the build system’s
    configuration.

 -- Jonathan Nieder <jrnieder@gmail.com>  Sat, 16 Jun 2012 15:03:17 -0500

xz-utils (5.1.1alpha+20110809-3) unstable; urgency=low

  * liblzma: Match upstream ABI.
    - Remove the lzma_chunk_size() function.
    - A few ABI tweaks to reserved space in structures.
    - Enable ELF symbol versioning.
    - Bump soname to 5.
    - Continue to leave out threading support, since the relevant
      interfaces in liblzma are not yet stable.
  * xz-utils/README.Debian: Remove note on ABI differences.
  * Remove liblzma/README.Debian.
  * liblzma: Introduce a lzma_code@Base compatibility symbol to ensure
    programs linked against unversioned symbols from liblzma2 can
    share a process image with liblzma5 without breaking.
  * debian/symbols: XZ_5.0 symbols come from liblzma5.  Build-Depends:
    dpkg-dev (>= 1.15.6); thanks to Jakub Wilk for a reminder.
  * debian/symbols: The lzma_code@Base symbol is not guaranteed to
    continue to exist in the future, so tell dpkg-shlibdeps to produce
    an error if some package manages to use it.

 -- Jonathan Nieder <jrnieder@gmail.com>  Thu, 20 Oct 2011 21:31:31 -0500

xz-utils (5.1.1alpha+20110809-2) unstable; urgency=low

  * debian/rules build-arch: Do not trigger an infinite "make"
    recursion loop when DEB_BUILD_OPTIONS=nocheck.  Closes: #638071.
    Thanks to Thorsten Glaser.

 -- Jonathan Nieder <jrnieder@gmail.com>  Tue, 16 Aug 2011 18:11:47 -0500

xz-utils (5.1.1alpha+20110809-1) unstable; urgency=low

  * New snapshot, taken from upstream commit 5c5b225.
    - liblzma:
      - lzma_stream_encoder() leaked memory.
      - The LZMA2 decoder rejected streams that decompress to a
        zero-length string.
      - lzma_easy_buffer_encode() and lzma_stream_buffer_encode()
        used to write such streams when asked to compress a 0-length
        buffer.
      - lzma_index_init() would segfault on allocation failure.
      - liblzma: Various functions check their arguments (especially
        choice of integrity check) better, making it harder to create
        a corrupt .xz file instead of receiving an error.
    - xz and scripts:
      - "xz -v -v --list" would read and try to free() uninitialized
        memory, continuing past the end of an on-stack array, when
        asked to describe certain corrupted XZ files.
      - xz -S.suf now refuses to compress a file whose name already
        ends with the suffix “.suf”.
      - xz --force can be used to compress setuid, setgid, sticky,
        and multiply linked files.
      - xz uses posix_fadvise() to speed up sequential input.
      - xz --block-size forces a full flush periodically during
        compression, for better random-access reading support and to
        make simple parallelism possible in the future.
      - unxz: The new --single-stream option discards trailing
        garbage after the end of the first stream.
      - xzdiff can read gzip- and bzip2-compressed files.
      - xzdiff and xzgrep can read lzop-compressed files.
      - xzegrep and xzfgrep perform extended regex and fixed-string
        matches, respectively.  (The previous behavior was to always
        use basic regexes.)
      - xzgrep -l (= --files-with-match) works.
      - The Czech “xz --help” output uses a more correct term for
        files with holes.  Thanks to Petr Hubený.  Closes: #605762.
      - xz: New Polish and French translations.
    - The Doxygen-generated documentation uses short, relative paths
      to name source files.  Closes: #572273.
  * Update copyright file.
  * Remove example programs from debian/examples.  They are included
    in the upstream source package now.
  * Move liblzma to an architecture-specific directory, so the
    native library and foreign-architecture versions can be installed
    simultaneously.
    - liblzma2: Pre-Depends: multiarch-support.
    - Use debhelper compatibility level 9.  This requires passing
      the dh sequence name before other options when invoking dh in
      debian/rules.  Build-Depends: debhelper (>= 8.1.3).
    - liblzma2, liblzma-dev: Install files under /usr/lib/<triplet>
      instead of /usr/lib.
    - Thanks to Steve Langasek for explaining the process on the
      Debian wiki.
  * Standards-Version: 3.9.2 (checked).
  * debian/control: liblzma2 is Multi-Arch: same, while xz-utils
    and xzdec are Multi-Arch: foreign.  Closes: #637883.  Thanks to
    Riku Voipio.
  * debian/symbols: Bump the minimal version for LZMA2 encoder
    functions that reject more bad arguments and skip empty blocks.
  * debian/rules: ./configure --disable-symbol-versions for now.
  * debian/rules: Provide build-arch and build-indep targets that
    only build the code and the API documentation, respectively.
    Thanks to Roger Leigh for suggesting it through lintian.
    Build-Depends: debhelper (>= 8.9.0).
  * debian/rules: Treat DEB_BUILD_OPTIONS=nocheck as a request not to
    run build-time tests.  Thanks to Thorsten Glaser for a reminder.
    Closes: #627209.

 -- Jonathan Nieder <jrnieder@gmail.com>  Tue, 16 Aug 2011 00:40:31 -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
