= cvs-fast-export project news =

2.4: 2026-08-11::
   Code hardening by ChatGPT 5.6.
   Attach converted tags by CVS revision ID, not content hash.
   Repair emission of incremental dumps.
   Repair emission of zero-length files.
   Do branch-parent lookup on the basic of filename as well as revision.
   Repair the fallback case in deep path comparison.
   Stream, warning, and revision-map writers propagate their first error.
   Error out on collisions produced By sanitization of CVS symbols.
   Validate all refs before fast-import emission
   Many improvements in regression testing,

2.3: 2026-07-06::
   Force correct dates on commits after a coalesce command.
   Spelling fixes.

2.2: 2026-06-21::
   Fix a bug that could drop intermediate commits on branches.

2.1: 2026-06-10::
   Repair "invalid delta" error when processing binary blobs.

2.0: 2026-02-17::
   Code ported to Golang; there will be no more heap corruption.
   No more branch cycle errors or stack-smashing.
   Improved fidelity in edge cases of assigning CVS tags to commits.
   Length of revision numbers and count of branches is no longer limited.
   The -s option is gone; the common prefix of all paths is always stripped.
   The -t option is gone; execution is always concurrent and safe.
   Vendor branch handling has been rebuilt and improved.
   All error and warning messages are fully documented.

1.68: 2024-07-31::
   Fix minor error in handling of -d argument.
   Apply stricter code validation including asan, tsan and ubsan tests.
   Complete spellcheck of all documentation.
   Assume C99 conformance for restrict keyword.

1.67: 2024-05-28::
   Fix an embarrassing packaging glitch.
   Improve documentation.

1.66: 2024-02-25::
   Add buildprep support for OpenSUSE
   Make failed author map load crap out early.
   Combination of -g and -r allows graphing of the CVS forest.

1.65: 2024-02-15::
   Quietly handle malformed author IDs with embedded spaces.
   Patch buildprep to do the right thing on FreeBSD.
   All fatal errors during master parsing report file and rev.

1.64: 2024-02-03::
   cvsconvert can do multiple conversions in a single run.

1.63: 2024-01-01::
   Now issues a warning when a vendor branch is detected.
   Leading !\n in .cvsignore files is translated correctly.
   Leading # characters on .cvsignore lines get escaped.
   Spaces in .cvsignore files are translated correctly.
   git fast-export no longer ships branch-tip resets; track this.
   Two -g options expose more detail in the output graph.
   Add -w (whole-repo) option to cvsconvert. 

1.62: 2023-11-26::
   Cope with old-style tagging sometimes found in RCS files.
   Better detection of repo type (CVS vs RCS).
   Translate CVS's handling of spaces and leading ! in ignores.

1.61: 2023-08-21::
   For git fast-export compatibility, don't emit NL after comment text.

1.60: 2023-05-14::
   Fix for expansion of $ headers, doing what the manual actually says.
   Fix for interpretation of the expand keyword.
   Test machinery is fully TAPified.

1.59: 2021-09-20::
   Ubuntu deleted /usr/bin/python, switch all invocations to python3.

1.58: 2021-07-16::
   Document non-support of non-ASCII characters in user IDs.

1.57: 2021-05-06::
   Abolish commit sorting by timestamp in the emit stage.

1.56: 2021-04-03::
   Document more exactly how dollar-cookie expansion works.
   Describe the known issues with vendor branches.
   Add support for dnf to buildprep.
   Don't choke on CVS-NT username attribute.
   cvsreduce renamed to cvsstrip for consistency with reposurgeon strip.

1.55: 2020-05-24::
   Document how to cope with branch cycle errors.

1.54: 2020-05-20::
   Document what an overrun of the branch depth limit looks like.

1.53: 2020-04-10::
   A new 'buildprep' script makes installation from source easier.

1.52: 2020-04-09::
   Incremental mode suppresses generation of default ignores.
   The -F and -C mode switches are gone; output is now always mode -C.

1.51: 2020-02-12::
   Keyword expansion default has been changed to match CVS's
   The -k option of cvs-fast-export has been removed.
   Add yet another required warning about time-skew effects.

1.50: 2020-01-02::
   Improvements and bugfixes in the release machinery.

1.49: 2019-12-10::
   Change error messages to modern GCC format.
   cvsconvert accepts an -A option for an authormap.
   Minor fix to -kv expansion.

1.48: 2019-04-26::
   cvsconvert now properly escapes branch names in shell commands.
   cvssync can now sync from a local cvs respository.
   Fix for a minor bug when reporting fixups on out-of-order commits.
   Strengthen documentation warnings about unreliability of CVS timestamps.

1.47: 2019-03-19::
   Deal gracefully with damaged attic files that yield null branch names.

1.46: 2019-03-18::
   Make cvsreduce do the right (escaping) thing when a filename contains @.
   In cvsreduce, warn on files that aren't CVS masters.
   Avoid losing commits when warning "tip commit older than imputed branch join" seen
   Warn about optimization bug triggered by -O3, reduce to -O2.

1.45: 2019-01-22::
   Allow empty branch labels - these have been observed in the wild. 
   Always report both file and line in syntax errors, using gcc style.
   Documentation polishing.
   cppcheck cleanup.
   Minor port fixes to test machinery.

1.44: 2018-07-05::
   Fix slightly incorrect generation of default .gitignore file.
   Make cvsreduce work under Python 3, and test for that.

1.43: 2017-03-20::
   Revert <2014-11-19T18:11:22Z@flower.powernet.co.uk>, optimization was wrong.

1.42: 2017-03-06::
    Fix a typo in a property name that affects interoperability with reposurgeon.

1.41: 2017-02-14::
    Savannah changed how you need to interpret pseudo-URLs.

1.40: 2016-09-07::
    Add warnings about stock CVS vs. the MirOS patched version.

1.39: 2016-09-06::
    Fix GitLab issue #8: Exporting with commitids does not coalesce changesets.

1.38: 2016-02-28::
    All Python code in the suite is 2 & 3 polyglot and 8-bit clean.

1.37: 2016-01-29::
    New -c option for when you can't trust commit-IDs.
    Port patch for Sun systems.

1.36: 2015-12-22::
    Avoid a core dump in another pathological case.

1.35: 2015-11-23::
    Properly handle CVS masters with nonempty access lists.
    Bail out gracefully on pathological masters with no revisions.

1.34: 2015-09-25::
    Another Python compatibility fix.
    Fix inconsistent license header in revdir.c.

1.33: 2015-08-30::
    Deal with a really annoying build-portability glitch around -lrt.
    Fix cvsconvert to be Python 2.6-compatible.

1.32: 2015-06-10::
    Emit a source type declaration reposurgeon can use.
    Project now has a logo.

1.31: 2015-04-28::
    Improve OSX portability. 

1.30: 2015-04-02::
    Tagged branchlets created for CVS tags not matching a gitspace commits.
    Many portability fixes for *BSD.

1.29: 2014-12-17::
    A significant improvement in the correctness of vendor-branch handling.
    More speed improvements.

1.28: 2014-12-08::
    Fix for buggy emission of lines ending in @.
    More speedups, and dramatic reduction in working-set size.

1.27: 2014-11-27::
    The bug that produced "unnumbered head" warnings has been fixed.

1.26: 2014-11-05::
    cvscompare changed to cvsconvert, a validating wrapper script.
    The rules for keyword expansion have changed yet again.

1.25: 2014-11-03::
    Simplify and fully document -k; it now requires an argument.
    In normal (non-promiscuous) mode, paths containing CVSROOT are ignored.
    There is a new wrapper script, 'cvscompare', for sanity-checking conversions.
    A HOWTO on reporting bugs has been added to the distribution.

1.24: 2014-10-30::
    Bugfix release: a late change to I/O buffering in 1.23 was faulty.

1.23: 2014-10-29::
    New -l option for redirecting logs during long conversions.
    More speedups and working-set reductions.
    Incremental dumping can now be done in fast mode.

1.22: 2014-10-21::
    New --embed-id and --expand options by Robert deBath.

1.21: 2014-10-19::
    When incremental dumping, suppress tags associated with old commits.
    Performance improved by x8; see also the new -F and -C options.
    New -a option to dump a list of author IDs found in a repo.

1.20: 2014-10-08::
    Files not ending with ,v are now ignored unless the new -P option is on.
    New -t option for parallelizing analysis on multicore systems.

1.19: 2014-10-04::
    Dramatic speedups in some bottleneck functions.

1.18: 2014-10-02::
    A bug in the regression tests was fixed by slowing down calls to CVS.

1.17: 2014-09-11::
    Some changes to reduce working-set size. More internals documentation.

1.16: 2014-09-04::
    Added an internals tour to the documentation. Polished some comments.
    Prevented a possible buffer overrun.  Fixed broken -R option.

1.15: 2014-09-02::
    Fixed a nasty order-instability bug that was confounding testing.
    Add a fatal error check for when revision numbers in input get too long.
    A significant speed improvement by tuning one of the sort algorithms.

1.14: 2014-08-12::
    Fixed several issues near ignore conversions.

1.13: 2014-08-11::
    Allow ()<> in symbol names.
    Fix a minor memory leak.
    Make cvssync a bit more liberal about SourceForge hostnames.
    In cvssync, leading /cvsroot can be omitted on Sourceforge paths.
    In cvssync, leading /sources can be omitted on Savannah paths.

1.12: 2014-06-26::
    Allow []! in symbol names.
    Python in the test suite now runs under 2.6.

1.11: 2014-06-06::
    Teach cvssync about sourceware.org. 

1.10: 2014-03-28::
    Prepends CVS default ignores to converted .cvsignores.
    Generates a .gitignore containing default CVS ignores when necessary.

1.9: 2014-03-08::
    RCS/CVS usernames may now begin with a digit (patch by Jesse Weinstein).
    Cleaned up a mess around keyword expansion; it had been misdocumented.
    Fixed some minor bugs in the test suite.
    Fixed a signedness issue on 64-bit machines.

1.8: 2014-02-19::
    Processing of hardlinks field was incorrect, is now fixed. 

1.7: 2014-02-18::
    Allow # in symbol names.  Addresses a corner case in the NetBSD repository.

1.6: 2014-02-17::
    Fix a brown-paper-bag bug in cvssync.

1.5: 2014-02-16::
    Skip a hardlinks field, if present.
    Add a -c option to cvssync that makes mirrors with CVSROOTs.

1.4: 2014-02-04::
    Optimization to call sbrk() less often needs to be conditioned on GCC.

1.3: 2014-01-23::
    Improved performance on masters with lots of symbols; thank Jens Bethkowsky.

1.2: 2014-01-04::
    Smarter blob directory creation to reduce search overhead for blobs.

1.1: 2014-01-03::
    Cope with CVS-NT kopt strings containing garbage binary data.

1.0: 2013-12-28::
    Bug fix: Non-top-level .cvsignores are now converted.
    More speed and significant lowering of memory usage.
    Most error messages are now explained on the manual page.

0.8: 2013-12-16::
    Processing speed has approximately tripled since last release.
    cvs-fast-export has save progress metering again.
    cvssync can now take a CVS URL argument.

0.7: 2013-12-15::
    -i option for incremental dumping.
    -p option for enabling load status reports.
    Many documentation improvements.
    There is now a regression-test suite for the package.
    cvssync tool for mirroring remote CVS repos added.

0.6: 2013-12-10::
    Improvements for CVS-NT support.
    Improve timing of missing-commitids message

0.5: 2013-05-21::
    CVS-NT support. Code is Coverity-clean.

0.4: 2013-05-16::
    Fix buggy handling of -k option.
    Add --remote (-e) and --stripprefix (-s) options.
    Avoid recursion overflow on very large repos.
    The fast-import stream ops are now emitted in the same order git uses.

0.3: 2013-01-16::
    Fix a bonehead packaging error.

0.2: 2012-01-12::
    Code revamped to emit a fast-export stream. Manual page added.

0.1: 2006-03-09::
    Original code by Keith Packard; traveled as 'parsecvs'.
