open-vcdiff (0.5-1) unstable; urgency=low

  * Issue #14: HashedDictionary may free memory twice if implicitly copied.
    * Add private copy constructor and assignment operator for HashedDictionary.
  * Issue #18: Building RPM package fails on Fedora 9: Installed (but
    unpackaged) file vcdiff.1.gz.
    * Some OS, including Fedora 9, automatically compress man pages that are
      installed using /usr/bin/install.  This confuses the RPM packager, which
      expects a file named "vcdiff.1" and finds one named "vcdiff.1.gz" instead.
      Use a wild-card character to accept either of these two alternatives.
  * Change the VCDIFF block size to 16, but have the encoder discard all matches
    smaller than 32 bytes.  This doubles the CPU and memory needed by the
    encoder, but finds better string matches, producing a more efficient
    encoding.  Loosen the timing test limit in blockhash_test.cc for the debug
    build only.
  * Make the code table writer a virtual interface.
  * Add an interface SetTargetMatching() to the simple encoder class
    VCDEncoder.
  * Remove all references to LOG and logging.h from the unit tests and
    command-line client.
  * Remove all special cases for kBlockSize < 4.  kBlockSize must be a multiple
    of the machine word size (see blockhash.cc), so it will never be smaller
    than 4.
  * Use version 1.10 of Automake.
  * Incorporate recent changes to gflags package
    (http://code.google.com/p/google-gflags/)
  * Fix Visual Studio type-mismatch warning in vcdecoder4_test.cc.
  * Use address cache helper functions IsSameMode(), IsHereMode(), etc. to
    simplify test code.
  * Add contributor's name to THANKS file.

 -- Google Inc. <opensource@google.com>  Wed, 18 Mar 2009 14:28:23 -0700

open-vcdiff (0.4-1) unstable; urgency=low

  * Issue #15: open-vcdiff fails to compile on Fedora 9
    * Apply patch sent by Daniel Kegel
    * Add header <string.h> to src/vcdiffengine.cc, which uses memcpy.
    * Remove const qualifier from integral return types to fix gcc 4.3.1
      warning.
  * Issue #6: vcdiff crashes with zero-size dictionary
    * Add special cases for empty dictionary file in vcdiff_main.cc.
  * Issue #7: vcdiff incorrect binary I/O on Windows
    * Change stdin/stdout file type to binary in vcdiff_main.cc.
  * Issue #13: Add unit test for vcdiff command-line executable
    * Unit test vcdiff_test.bat added for Visual Studio testing of vcdiff.exe.
      Includes regression tests for issues #6 and #7.
  * Add contributors' names to THANKS file.

 -- Google Inc. <opensource@google.com>  Thu, 23 Oct 2008 09:03:56 -0700

open-vcdiff (0.3-1) unstable; urgency=low

  * Issue #15: open-vcdiff fails to compile on Fedora 9
    * Add header <string.h> to source files that use memcmp, memset, memcpy,
      and/or strlen.
    * Change C++-style includes like <cstdlib> to C-style includes like
      <stdlib.h> so that function names are guaranteed to be defined in the
      global namespace.
  * Issue #8: Decoder should not crash if it runs out of memory
    * Add a new interface that places a limit on the maximum bytes allowed in
      a single target window or a target file.
  * Issue #13: Add unit test for vcdiff command-line executable
    * Unit test vcdiff_test.sh added for Linux and Mac builds.
    * Still need to add a Windows version of this test.

 -- Google Inc. <opensource@google.com>  Fri, 10 Oct 2008 11:16:23 -0700

open-vcdiff (0.2-1) unstable; urgency=low

  * Fix problems found on OpenBSD platform.
    * Issue #1: vcdiff command-line executable crashes on startup.
      This was a problem with the stub intended to replace pthread_once if the
      package was not linked with the pthreads library.  Simplify gflags.cc to
      assume single-threaded execution.
    * Issue #2: Unit test blockhash_test fails.
      Define VCDIFF_USE_BLOCK_COMPARE_WORDS for BSD platforms to ensure that
      the most efficient version of memcmp is used in the encoder's inner loop.
  * Fix compilation warnings in gtest-filepath.cc: "warning: missing
    initializer for member 'stat::...'"

 -- Google Inc. <opensource@google.com>  Tue,  2 Sep 2008 09:20:20 -0700

open-vcdiff (0.1-1) unstable; urgency=low

  * Initial release.

 -- Google Inc. <opensource@google.com>  Mon, 16 Jun 2008 15:15:51 -0700
