= reposurgeon project news =

5.2: 2024-10-15::
     Bug fix for repotool generated Makefile.

5.1: 2024-07-20::
     Improve repotool documentation.
     All documentation is spellchecked.

5.0: 2024-05-23::
     Major overhaul of the DSL syntax.
     Make --quiet an effective option when reading repositories.
     Added "view" command for GUI browsing of repositories.
     Fixed a deep bug in the graft and unite commands.
     Add prefix negation operator ~ for pathsets.
     Repaired a bug in CVS reference lifting.
     Removed read --use-uuid option.
     Added Content-Path and Content-Name support to msgin --create.
     Added =E selector for branch root commits.
     Added "clone" command.
     Graceful recovery from transcode errors.
     Macro argument formal change from {0}, {1}, {2}... to %{0}, %{1}, %{2}...
     Move to Go-style match references (${1}) from Python ones (\1).
     repotool initialize becomes repotool initmake.
     Tested support for reading darcs repositories.
     The ignores, add, timequake, and timeoffset commands set Q bits
     Source types of stream dumps can be deduced from ignore file names.
     Fossil import/export from checkouts is supported; --format=fossil is gone.
     Ignore pattern translation is available with "ignores --translate".
     Documentation on working with hg has been much expanded.
     Added --decode option to list and msgout commands.
     Implemented and documented X selector.

4.38: 2023-06-14::
     Experimental Perforce (p4) mirroring support in repotool.
     Added timequake --tick option.

4.37: 2023-05-28::
     Add experimental support for brz/Breezy.
     Support reading SCCS repository directories directly.
     Add repocutter hash command for working with a content-addressable annex.

4.36: 2023-04-27::
     Documentation refresh.
     Minor cleanups for code validation.

4.35: 2023-03-21::
     Document an important gotcha about working with CVS.
     Clean up some annoyances in the build and test machinery.

4.34: 2023-01-24::
     Change repocutter -f (basename) option to -n.
     Default filecopy to matching a regexp; -f now undoes this.
     Add repocutter count and debug commands.
     Repocutter patches missing copyfrom source revisions.
     Added repocutter swapcheck command for sanity checking.

4.33: 2022-12-21::
     Some potentially unsafe shellouts have been fixed.
     Format --fossil is no longer broken.
     Fix segfault when listing descendants of orphaned commit.
     Ensure that repocutter is quieted when output is not stdout.

4.32: 2022-04-28::
     "lint" command no longer accidentally clears most Q bits.
     repocutter renumber no longer mangles mergeinfo properties.
     Fixed mergeinfo handling in repoocutter commands that remove revisions.
     Interactive lint listing is interruptible.
     Significant bugfixes and major code simplification in repocutter swapsvn.
     repocutter push is restricted by pathmatch rather than range.
     repocutter push can be pattern-restricted.
     All repocutter commands with a pattern rsetruction match against segments.
     Added new repocutter setcopyfrom and setpath commands.
     Add -o option to pass raw options into repotool checkout.

4.31: 2022-01-08::
     Minor improvements in baton handling.
     repocutter pathrename/sift/expunge REs now match only full path segments.
     --nobranch/--branchify are gone; use repocutter to prep nonstandard repos.
     repocutter reduce now has simpler behavior and can take input from stdin.
     reposurgeon incorporate can handle symlinks
     repocutter can now select and deselect node spans within revisions.
     In repocutter sift/expunge, new -f option disables regexp interpretation.
     In repocutter, new skipcopy and filecopy commands.
     In Subversion IDs, uniform use of .-notation for node indices.

4.30: 2021-10-13::
     Speed up DoTagify by parallelizing it.
     =J selection gets all commits and tags with non-ASCII metadata
     Added msgin --relax option.
     On most subcommands repocutter -r restricts which commits are transformed.
     Added pathlist command to repocutter.

4.29: 2021-09-08::
     Added swapsvn subcommand to repocutter.
     Don't screw up non-ASCII UTF-8 characters in pathnames.
     Node-parsing phase patches up missing copy sources.
     lint/setperm/prepend/squash/coalesce/add/remove now set Q bits.
     Several changes to reduce the working--set cost of large selections.

4.28: 2021-08-07::
     Bug fixes for incremental mirroring, text search by tag name.
     Avoid creating duplicate tag names when a tag turns into a branch
     Enforce stable order of sub-node traversals when doing node expansion.
     Added repocutter -t option to tag error messages from pipelines.

4.27: 2021-05-27::
     repocutter pathrename can do multiple path transforms in one command.
     repocutter closure finds transitive closures of path sets under copyfrom.
     IRC channel migration to OFTC.

4.26: 2021-04-03::
     Read and write original-oid fields in annotated tags.
     The read --cvsignores option is gone; use expunge to drop cvsignores.
     Replace tappy with tapview.

4.25: 2021-03-02::
     New manual section, "Tips and tricks".
     Tag rename checks that it won't step on an existing name.
     "help" without topic now emits a custom TOC with command groupings.
     Unite now produces union repositories with a valid master branch.
     repocutter errors out if presented with unexpected extra arguments.
     "tip" has been removed; what it was computing is not well defined.
     Revert removal of --cvsignores. May be revisited in a future release
     All test messages conform to TAP and results are shipped through tappy.

4.24: 2021-02-13::
     Retire the read --cvsignores option; best to use an expunge instead.
     Subversion properties discarded during read are logged, not shouted.
     In branch/tag rename and expunge, be more flexible about RE delimiters.
     Commands that accept output redirection can also pipe to a command,
     The --branchmap option is gone in favor of using branch rename.
     The behavior and interface of the tag command has been simplified.
     The syntax of the expunge command has been simplified.
     The "paths [sub|sup]" command has been replaced by "path rename".
     The =Q set now provides a way to inspect recently modified events.
     The "edit" and "references edit" commands gave been retired.
     Subcommand moves to before first arg in branch/path/tag/reset commands.
     Filter syntax now uses subcommands rather than options.
     Blob command now takes an explicit mark.

4.23: 2021-01-13::
     Branch rename can take a regexp and do substitutions on the new name(s).
     The branchify and branchmap commands have been replaced by read options.
     Help directed to a tty goes though $PAGER when long enough to need it.
     Minor bugs related to the "done" end marker have been fixed.

4.22: 2020-12-28::
     Properly handle yet another bizarre Subversion tag-rename case.
     Massage any Subversion branch name to be legal as a git reference.
     Much of "Repository Editing" is now generated from embedded help.
     repotool mirror can now use rsync for pulling repositories.
     Repair repocutter reduce logic and add a test for it.
     New "branchlift" primitive for use after a --nobranch read.
     In SVN lifts, user .gitignores can be merged with svn:ignore properties.
     In SVN lifts, reduce overloading of the "-root" suffix.
     Add --obscure option to reposurgeon strip command, like repocutter.
     --preserve prevents automatic deletion of cv2svn branch creation tags.
     The repocutter see command dumps property settings
     Many improvements to documentation, including improved cross-references.

4.21: 2020-11-18::
     Fix for a bug that could scramble history in pathological tag-copy cases.

4.20: 2020-11-16::
     Fixed a bug when an SVN file's content looked exactly like a link special.
     Prevented a crash when "stamp" was given with no selection.
     Various small improvements to documentation.

4.19: 2020-08-30::
     Fix for a bug that produced incorrect splits of mixed Subversion commits.

4.18: 2020-08-26::
     Repocutter now has a "replace" command for replacing text in blobs.
     repotool now shows closed Mercurial branches.
     The extractor logic creates all resets for multiply-tagged commits.
     Compiler optimizations are enabled for increased performance.

4.17: 2020-08-16::
     Improvements to documentation and bug-reporting guidance.
     Quash a Go 1.15 warning.
     Performance improvement in the hgclient code.
     Builds and passes tests on 32-bit machines.

4.16: 2020-08-03::
     Support property deletions from version 3 dump file format in repocutter.
     Performance of repocutter renumber is greatly improved.
     Add notes on how to support AccuRev.
     The sizeof command is now documented.

4.15: 2020-07-18::
     Documentation polishing.
     Fix buggy handling of symlinks in the tarball-maker production.
     Fix a stupid bug in the distribution's "make clean".

4.14: 2020-06-27::
     Build fixes for Mac OS X (Darwin).

4.13: 2020-06-24::
     Now interprets and translates svn:global-ignores properties.
     Numerous small improvements to documentation.

4.12: 2020-06-21::
     Snap release to fix broken tarball production (revised).

4.11: 2020-06-16::
     Minor bug fixes for lint and graph commands.

4.10: 2020-05-28::
     The default conversion workflow has been simplified and sped up.
     New crlf operation allows editing comments with Windows line endings.
     Bug fix for timequake and timeoffset commands.
     Randomize temporary directories during repotool compare.
     The ignore and strip commands now use the regular option syntax.
     All command help items now begin with a syntax summary.
     Repomapper can now mine project mail archives.
     The "prompt" command has been retired.

4.9: 2020-05-17::
     This is a long-term-stable release. All packagers should update.
     Documentation has undergone a serious polishing pass.
     The 'memory' command supports output redirection.
     A CVSROOT subdirectory is no longer required to recognize a CVS repo.
     The diff utility is no longer required by repotool.

4.8: 2020-05-13::
     Repository reads now use --show-original-ids.
     The ~ pattern-negation operator has been added to expunge.
     Expunges no longer create a synthetic repository for deleted fileops.
     Minor bugfixes for filter --regexp option handling.
     Added "deselect" command to repocutter.
     The last Python dependency is gone.
     repocutter and repotool have version commands.

4.7: 2020-04-26::
     If "foo" names a reset, "<foo>" names the commit it points to.
     Reduction of maximum working set and GC churn.

4.6: 2020-04-10::
     repocutter obscure command added.
     Expunge of fileops with inline data now works.
     Can now compute and display Git hashes for a loaded repository.
     branchify elements behave more like glob patterns; foo/*/* works.
     Numerous small speedups and a few bug fixes.

4.5: 2020-03-09::
     Lots more narrative documentation added.
     The interface of repomapper has been dramatically simplified.
     repobench is a new tool for benchmarking reposurgeon

4.4: 2020-02-20::
     Large reorganization of documentation.
     Added testify command to repocutter.

4.3: 2020-02-12::
     Administrative release to fix a packaging error.

4.2: 2020-02-11::
     %PATHS% capability restored to shell filtering.
     A performance regression in reposurgeon was detected in 4.1; it's now been fixed.

4.1: 2020-02-02::
     The "defergc" kluge in the previous release is no longer required.
     Don't fail on spaces in filenames.
     Test suite now uses as many processors as you have.
     The index command sees blobs by default.
     repocutter has a "pop" command for stripping pathnames.
     Repository read times are no longer displayed outside of stats.
     Revision numbers in a Subversion dump can be non-contiguous.

4.0: 2020-01-13::
     Production reposurgeon is now in Go.
     repocutter now patches mergeinfo references correctly when renumbering.
     repotool checkout has a -c option to chdir before operating.
     repocutter now uses Go regex syntax in the pathrename command.
     The awkward branchify_map command has been renamed to "branchmap"
     The baton prompt has improved progress metering.
     reposurgeon is now better about cleaning up old temp directories on exit.
     Added 'memory' command for reporting memory usage.
     Author aliases are recognized in timestamps.
     Results of reorder and reparent are toposorted again.
     More pathological tag-rename cases are coped with gracefully.
     All documentation moved to asciidoc for better web rendering.
     Logging now has facility flags rather than a single level.
     The svnmerge-integrated properties created by svnmerge.py are handled.
     Use Bazaar config file or .muttrc for identity if available.
     The expunge and branchify commands now respect string quotes.
     The changelogs command takes an optional regexp choosing files to be mined.
     We now use a better Mercurial importer, hg-git-fast-import.
     There is a new --cvsignores option for SVN dump reads that keeps .cvsignores.
     repocutter renumber takes an optional argument that's a renumbering base.

3.48: 2019-10-02::
     Last Python release.  4.0 will ship in Go.
     Corrected a minor error in Hg branch coloring.
     Subversion write support has been deemed too weak to live and removed.
     Fix for a crash bug when backing out of a script failure.
     Fix for an error that caused premature exit from the divide command.
     Repositories created by expunge command now have correct ancestor marks.
     Insert newly created blobs after front events.
     Minor repair to translation of Subversion default ignores. 
     Add --noignores read option to suppress filling in default Subversion ignores.
     Results of reorder and reparent are no longer toposorted.
     Fix: repocutter was not patching Node-copyfrom-rev fields as it should.

3.46: 2019-05-29::
     Added 'relax' no-op command.
     Added bug warning about repocutter not handling Mac line terminations.
     Fix for GitLab issue #117: malformed attribution.
     Repocutter help command has been repaired.
     Command renames: mailbox_in -> msgin, mailbox_out -> msgout.
     The exec and eval commands have been removed.
     Scripts now bail out on error; "relax" suppresses this.
     Fixes for repocutter strip and pathrename (GitLab issues #18 & #142)
     Document some limitations of repocutter sift and expunge.

3.45: 2018-08-24::
     Repaired the distribution maker to again include README.adoc, NEWS, TODO.
     Executable bits are now correctly propagated across SVN branch copies.
     Tests fall back to (c-)python if pypy is not available.
     Various minor testsuite and port fixes. Tests now work on Mac OS X.
     repocutter ported to Go for 40x speedup (more on large repos).
     repomapper has been ported to Go; repodiffer has been retired.

3.44: 20-18-04-29::
     New 'setperm' command for patching file path permissions.
     Abandon cyreposurgeon in favor of PyPy, which gives a better speedup.
     Max working-set size has been reduced, enabling handling of larger repos.
     New 'gitify' command for massaging comments into git conventional form.
     The tag command now allows deleting all tags matching a regexp.
     Fix crash when chaining '|', '&', '?' selection operators.

3.43: 2017-12-12::
     Fix bugs in squash --pushback, mailbox roundtripping, filter --shell.
     Resynchronize embedded help with XML docs.
     Added 'dedup' command, to deduplicate blobs in the selection set.
     Bug fix: exporter output now only captures stdout, not stderr.
     New 'changelogs' command for extracting author info from ChangeLog files.
     New 'incorporate' command digests tarballs into commits.
     Squashes now preserve comment content of squashed commits.
     New 'timequake' and 'timebump' commands for uniquifying timestamps.
     There is now a 'reset create' command.
     Fix "drop" crash.
     Fix "filter --shell" never invoking shell command.
     Fix "mailbox_in" crash when mailbox adds an author.
     Fix event selection expression parser hanging forever on mistyped "..".
     Fix "squash --pushback" utter brokenness when handed multiple events.
     Fix mailbox not roundtripping correctly (added newline and munged date).
     Fix "squash" not always garbage-collecting unreferenced blobs.
     Fix "write" crashing with "prefer svn" when parent not in selection.
     Add "attribution" and "reorder" commands.
     Fix "reset" crashes and make "reset" respect selection.
     Fix buggy behavior on 'unite' on 3 or more repositories.
     The "timing" command reports free memory if the psutil module is installed.
     Repository reading now has an OOM guard - will bail out on low memory.

3.42: 2017-03-06::
     Read/write support for BitKeeper (but BitKeeper's importer is flaky).

3.41: 2017-02-10::
     Fix fatal error in reposurgeon version command (introduced in 3.40).
     In repocutter, the pathrename command now hacks svn:mergeinfo properties.
     'split' adds a ".split" suffix to any legacy ID in the new commit.
     More control over prefix stripping in the "path sup" command.
     Add --notagify option to expunge command.
     Repair implementation of "split at".
     Add "tag create" command.

3.40: 2016-09-20::
     In repocutter, repair fatal bugs in log and setlog commands.
     In repocutter, added "see" command for reporting repository structure.
     In repocutter, added "sift" command inverting "expunge".

3.39: 2016-09-01::
     Make repocutter pathrename and expunge preserve Node-copyfrom-* headers.
     Make pathrename hack Node-copyfrom-path headers as well as Node-path.
     Enable repocutter to handle binary content in blobs.
     Improved documentation for the unite command.

3.38: 2016-08-27::
     Fix handling of second argument of timeoffset.
     Allow full find/replace with UTF-8.
     Make the syntax of the 'split' command consistent with the manual.
     Fix buggy 'authors write' command, and add a regression test for it.

3.37: 2016-03-14::
     Prevent two potential crash bug introduced by Python 3 porting.

3.36: 2016-03-13::
     The repocutter and repomapper utilities are now 8-bit clean under Python 3.
     Reorder 'done' stream terminator after tag and commit creates.
     Fix for GitLab issue #52, crash on a weird unite case. 

3.35: 2016-02-25::
     Reposurgeon now runs under either Python 2 or 3.
     CVS repos are recognized by CVSROOT, not a (possibly missing) Attic.

3.34: 2016-02-16::
     Make repocutter DTRT when copyfrom roots are removed by expunge.

3.33: 2016-02-01::
     More work on header-order independence for both reposurgeon and repocutter.

3.32: 2016-01-31::
     Handle Subversion dumps as produced by svndumpfilter with Node-kind first.

3.31: 2016-01-23::
     repocutter, a tool for preprocessing Subversion repos, is now included.
     In repotool, a new 'branches' command lists branches (not tags).
     Fix repotool, 'tags' for CVS repo so it lists only tags, not branches.
     In repotool, a new 'compare-branches' command compares all branches.
     In repotool, a new 'compare-all' compares tip, tags, and branches.
     repotool no longer needs to run within a module directory for CVS.
     Move from BSD-3-clause to BSD-2-clause, apply SPDX tag.

3.30: 2016-01-10::
     Added "when" command for timestamp conversions.
     Fix GitHub issue #42: Repository.split_commit() produces invalid marks.
     Commands now tab-complete name arguments wherever that makes sense.
     Handle format 7 Subversion dumps with sporadic empty nodes.
     Selection sets now remain ordered rather than being sorted.
     There is a new @srt() function to explicitly sort selection sets.
     The reparent command can now specify multiple ancestors.
     In SVN repositories, a tag's subdirectory is now part of its name. 

3.29: 2015-09-02::
     Now included: git aliases that allow git to work with action stamps.
     The new repomapper tool helps prepare contributor maps.
     Use of branchify/branchify_map is now less likely to produce invalid resets.
     branchify_map has been changed to handle subdirectories better.
     "branchify_map reset" actually works now.
     Prevent a crash on empty SVN comments produced by dumpfiltering.
     'assign' command with no selection set or arguments lists assignments.
     New --user-ignores option on Subversion reads passes through .gitignores.
     'repotool initialize' now generates an easier-to-read conversion makefile.

3.28: 2015-07-05::
     Make repotool honor the mirror directory argument for CVS.
     Fix gitlab issue 4: even successful CVS export returns error code.
     Fix some name lookup issues from the cache needing invalidation.
     Implement and document that action stamps from author dates are preferred.
     New --filter option to mailbox_out for selective emission of headers.
     Fix gitlab issue #9: blank lines in svn:ignore misinterpreted.

3.27: 2015-06-22::
     Per-repo-type preserves aren't clobbered when there's a lister.
     Git repository hooks are preserved.
     Read support for Monotone, not yet very well tested.

3.26: 2015-06-10::
     Output redirect with '>>' appends to the output file.
     The strip blob command can take a selection set.
     Repo source type is now kept inline in stream files and emitted on write.
     Legacy IDs are now kept inline in stream files and emitted on write.
     The selection syntax <#nnn> now names commit nnn, 1-origin numbering.

3.25: 2015-06-03::
     Reading hg is now supported through an extractor class, no plugin required.
     Now 'blob' command allows creating new content from lift scripts.

3.24: 2015-05-31::
     Fix repository-type detection bug introduced in 3.23.
     DVCS Migration HOWTO is now merged into this distribution.
     Legacy-ID detection is now more discriminating, based on sourcetype.

3.23: 2015-05-29::
     The 'prefer' command no longer changes the repo type, but 'sourcetype' does.
     The =N set is all commits and tags with text matching a legacy ID.
     Legacy-ID recognition is more intelligent, depending on the source type.
     The 'lint' command now checks for time and action-stamp collisions.
     Exporters can now embed a repository type declaration in an import stream.
     Fast-import syntax extensions are documented.

3.22: 2015-05-20::
     The path rename --relax option has been removed as too confusing.
     In selection expressions, =Z is the set of all commits with no fileops.
     repopuller has been replaced by the more general repotool.
     For consistency, the 'changed' modifier of mailbox_in is now '--changed'.
     New '--create' option of mailbox_in to create new tags and commits.
     The command prompt can be queried or set with the new command 'prompt'.
     Change in terminology: fossil IDs and maps are now legacy IDs and maps.
     The 'fossils {read.write}' commands are now 'legacy {read,write}'.
     A front end can now set legacy IDs via the "legacy-id" property.
     DMRCN suffix flags on restrict path regexp matches to specified op types.
     The 'remove' command can now be told to look for specific fileop types.

3.21: 2015-04-02::
     In selection expressions, =U is the set of all commits with callouts.

3.20: 2015-02-22::
     Code is now fully functional, all regression tests passing, on Mac OS X.
     Warn in the docs about the consequences of case-smashing filesystems.
     diff command no longer relies on external diff(1).
     Bugfix for writing callouts in partial dumps.

3.19: 2015-01-06::
     Minor bugfix for handling of indexed action stamps.

3.18: 2014-11-28::
     The graft command now has a --prune option like unite.

3.17: 2014-11-17::
     Export support for SRC and RCS.
     Bug fix for automated preservation under hg.
     Bug fix for reparenting and checkout of commits with inline data.

3.16: 1014-11-08::
     Import support for SRC.

3.15: 1014-11-05::
     New 'add' command to insert new fileops in commits.

3.14: 2014-10-29::
     Assignments are preserved across squashes (including deletions).
     Name lookups are, after the first one, significantly faster.

3.13: 2014-10-24::
     Read/write support for the Fossil system.
     Fixes for timezone handling.

3.12: 2014-09-11::
     Explicit svn:ignore patterns aren't recursive to lower directories; cope.
     A new 'ignores' command has options for translation of ignore files.
     The --noignores option has been retired.

3.11: 2014-08-12::
     When converting SVN, ignore explicit .gitignores created by git-svn.
     (Better than letting them collide with translated svn:ignore properties.)

3.10: 2014-04-19::
     Finer control over filtering with caC flags.
     New setfield command for tweaking object attributes from lift scripts.

3.9: 2014-04-12::
     The attribution-parsing code handles odd characters in names better now. 
     The filter command can operate on email addresses as well as names.
     New 'stamp' command to report action stamps of commits.
     New 'count' comment reports selection-set counts.
     New branchify_mapping option for renaming Subversion branches on analysis.

3.8: 2014-03-28::
     New transcode command for moving metadata to UTF-8.
     New @dsc() function for selecting all descendants of a selection set.

3.7: 2014-03-15::
     New --dedos option for filter command, to change \r\n line endings to \n.
     New append command for annotating comments.
     The 'b' search code has been changed to appropriately match non-commits.
     New form of 'graft' allows greater control over graft points.
     New =I selector to find non-UTF-8 commit metadata.
     Import stream comments led with # are preserved as passthroughs.
     Buggy text search of authors fields has been fixed.

3.6: 2014-02-19::
     Major rewrite of the generic conversion makefile.
     Fixed a bug in the graft and unite commands, thanks to Ralf Schlatterbeck.

3.5: 2014-02-16::
     Single fossil or tag names now select as if surrounded by <>.
     Fixed more bugs in debranch.

3.4: 2014-02-14::
     @amp() function useful for logic-gating in conjunctive expressions.
     New 'assign' command allows pre computation of expensive selections.
     There's an 'unassign' as well.
     exec/eval facility for custom Python extensions.
     path rename has a --relax and --force options to deal with path collisions
     New --changelog option of coalesce can recognize FSF-style ChangeLog files.

3.3: 2014-02-11::
     Set negation in selections with ~.
     @min() and @max() in selections.
     'define' by itself lists macros.
     New 'deletes' option in the remove command.

3.2: 2014-02-03::
     New path rename command.
     List and inspect now take either a leading or following selection.
     Text search selections can now have a B suffix to search blobs.
     Now possible to transplant fileops between commits using remove .. to.
     A date of the form <YYYY-mm-dd> selects all commits and tags that day.
     Macros can now be multiline.

3.1: 2014-01-27::
     The filter command now has a --replace modifier to avoid regex overhead.
     Associated branches are renamed when a reset or tag is moved or deleted.
     Bug fix for off-by-one error in tags reporting.

3.0: 2014-01-05::
     Many syntactic features of the language have changed incompatibly.
     Backward-incompatible language changes are documented on the manual page.
     'expunge' and 'unite' commands have been incompatibly improved.
     New 'strip' command for generating test cases with blobs stripped out
     New 'reduce' command for topological reduction of test cases.
     The 'lint' command gets a test for the existence of multiple roots.
     Selecting a date or action stamp matching multiple commits now matches all.
     The surgical language now has a macro facility.

2.43: 2013-12-01::
     "set canonicalize" is now effective during import stream reads.
     Introduced =O, =M, =F selectors for parentless, merge, and fork commits.
     The "multiline" modifier on edit is replaced by the =L selector.
     Selection-set evaluation now short-circuits predicates and is faster.
     Fixed a buggy test that caused the reader to choke on submodule links.

2.42: 2013-11-21::
     Prevented crash when tagifying a mixed-branch commit.
     svn_no_autoignores -> svn_noautoignores
     Ignore single-rev mergeinfos in Subversion, they're cherry-picks.

2.41: 2013-11-07::
     Fixed a fatal bug when reading any symlink from a live Subversion repo.
     Added svn_no_autoignores option.

2.40: 2013-08-04::
     Improvements in .gitignore processing.

2.39: 2013-05-23::
     New 'tagify' command for tagifying empty commits.
     Correctness fixes for deletion edge cases.

2.38: 2013-05-10::
     Significant improvements to Subversion branch link detection.
     New 'reparent' command for modifying the DAG.
     Fixes for two minor crash bugs in handling of malformed commands.

2.37: 2013-04-25::
     No more tree pollution on branches deduced from file copies.

2.36: 2013-04-22::
     Optimizations, and fixes for some subtle bugs in the deletion logic.

2.35: 2013-04-20::
     New "manifest" command.
     Path-matching now has @ to require all paths in a commit to match.

2.34: 2013-04-15::
     More performance improvements. Large deletions are much faster now.
     Path matches with [] now have a regexp variant

2.33: 2013-04-14::
     "from COMMIT remove OP" for removing botched renames etc.
     Event-Mark can be be used as a commit identifier in mailbox format.
     Line continuation with \ works in scripts.
     There is now a regular expression matching syntax for paths.

2.32: 2013-04-03::
     Fix bug introduced in expunges when blobfile path generation changed.

2.31: 2013-04-03::
     New 'filter' command supports content filtering with a batch command.
     Yet more speed tuning - now 17K commits/min under cpython, 22K under pypy.

2.30: 2013-03-28::
     Fossil map dumps are pruned appropriately after an expunge.
     More speed tuning.
     An AUTHORS file now credits some significant collaborators

2.29: 2013-03-24::
     Extreme speed tuning in SVN analysis - measured at over 11K commits/sec. 
     canonicalize option changes CR-LF to LF in commit comments.

2.28: 2013-03-22::
     There is now a 'reset' command like the tag command.
     Fix for buggy debranch command.
     More speed tuning.

2.27: 2013-03-18::
     More speed tuning.
     Simplify the baton display in SVN processing, its overhead was high.

2.26: 2013-03-13::
     Enable Subversion dump reader to handle yet another pathological case.
     Code has been tested and verified with PyPy.
     Prefer author date for action stamps when it is available.
     More speed tuning.

2.25: 2013-03-07::
     More speed tuning in repository analysis.
     O(n**2) cost for renumbering has been eliminated, svn_no_renumber is gone.
     New 'timings' command displays phase timings for repo analysis.
     Improved packaging for distributions (thanks, Mike Swanson).

2.24: 2013-03-03::
     Fix a crash bug in the new blob handling, and more performance tweaks.

2.23: 2013-03-01::
     Drastically cut the amount of disk storage and I/O required for surgery.
     Add svn_ignore_properties option.
     The .svn extension is now stripped from repo names on load.

2.22: 2013-02-26::
     New debranch feature for merging branches that should be subdirectories.
     Minor speed tuning via memoization.

2.21: 2013-02-21::
     Added "compressblobs" and "svn_no_renumber" option for very large repos. 
     Added the "sizes" and "lint" commands.
     Interpretation of timezone field in author maps was buggy, is now fixed.
     Experimental Emacs Lisp mode for editing comment mailboxes.

2.20: 2013-02-08::
     Teach repodiffer how not to choke on revisions with empty manifests.
     Make repodiffer more explicit when a revision's parent set changes.
     Improvements to the graph command's output of branches.

2.19: 2013-02-06::
     Serious tuning of internals for reduced memory usage.

2.18: 2013-02-02::
     Translation of symlinks in Subversion repos was buggy, is now fixed.
     repodiffer now has a useful and documented return value.
     New --tree-diff option of repodiffer shows context diffs of mismatches.

2.17: 2013-01-26::
     repodiffer can now take a map file and show fossil IDs with diff reports.
     The '?' selection-set modifier can be repeated for effect.

2.16: 2013-01-25::
     Fix a memoization bug that resulted in misbehavior after branch cuts.

2.15: 2013-01-22::
     Switch to cvs-fast-export for reading RCS and CVS collections.
     Efficiency and code-cleanup improvements by Julien Rivaud.

2.14: 2013-01-19::
     Dramatic decrease in memory footprint on large repositories.
     Improvements in DAG visualization via 'graph'.

2.13: 2013-01-08::
     The new 'graph' command supports making commit graphs in the DOT language.
     On read of an import stream, interpret a "cvs-revisions" property.

2.12: 2012-12-30::
     Support for reading RCS repositories.
     Now handling three-field authormap files with timezone offsets.
     Dump fileops in the type of the output VCS, not the input.
     Synchronized with cvsps 3.3 release.

2.11: 2012-12-20::
     CVS repositories can now be read using cvsps --fast-export as a front end.
     Ignore pathnames are mapped properly when writing to non-git VCSes.
     cvs/svn/git ignore patterns are properly translated on output to hg.
     repodiffer now has a twirly-baton progress meter.

2.10: 2012-12-16::
     svnpull renamed to repopuller in anticipation of pulling CVS repositories.
     Introducing repodiffer, a tool to report diffs between histories.
     Fossil-IDs are now dumped in pre-commit comments.
     The 'changed' modifier to mailbox_in dumps a minimal set of updates used.
     When reading svn repositories, .cvsignore files are lifted to .gitignores.
     svn's default ignore-pattern behavior is emulated in translations.

2.9: 2012-12-06::
     Syntax of "authors", "fossils", "list", and "mailbox_{in|out}" has changed.
     Many commands can now redirect output to a named file prefixed with '>'.
     The list command now displays fossil IDs if the repo has them.
     A subtle bug affecting generated directory copies has been fixed.

2.8: 2012-12-04::
     Fix for a nasty optimizer bug that could cause file loss.
     split now uses a different preposition when matching against pathnames.

2.7: 2012-12-01::
     Full (read-write) support for darcs.
     The expunge command now treats deletes correctly.
     New 'tip' command deduces if a commit is associated with a unique branch.
     Support for writing Subversion repositories, but they don't round-trip.

2.6: 2012-11-22::
     divide now cuts unconditionally, renaming branches or repos as required.
     The split command can take a path to be matched instead of an index.

2.5: 2012-11-19::
     git sometimes doesn't quote filenames with embedded spaces properly; cope.
     Correctly handle combination of SVN directory copy with a file change.
     More careful sanity checking in the workflow makefile.
     Prevent erroneous shlex interpretation of single quotes in R/C/N fileops.
     Fix and regression test for expunge when it implies removal of a commit.

2.4: 2012-11-18::
     In SVN conversion, user is warned about mid-branch deletealls.
     'version' command allows a script to be pinned to a major version.
     There is now a branch {rename,delete} command.
     More speedups and test loads.

2.3: 2012-11-13::
     SVN dump analysis now completes much faster on large examples.
     The format of action stamps has changed to fully support split commits.

2.2: 2012-11-06::
     Unit testing for the date parsing/formatting code
     'branchify' declares a non-default set of svn paths to be branchified.
     Interpretation of svn:mergeinfo properties.
     Fix for yet another corner case in ignore-property translation from SVN.
     The "authors write: command is now a proper inverse of "authors read".
     The 'merge' command now unconditionally creates a merge link.
     Reference syntax now allows references to be fossil-IDs.

2.1: 2012-11-04::
     Ignores are moved among git/hg/bzr ignore files (but not yet translated).
     Added conversion.mk to the distribution, describing a typical workflow.
     Fixed a bug that could result in incorrect timezone handling in git dates.

2.0: 2011-11-02::
     reposurgeon can now read Subversion dump files and repositories directly.
     New major commands 'tag' and 'merge' (old 'merge is now 'unite'). 
     The 'sort', 'cvspurge' and 'gitsvnparse' commands have been removed.
     Added new auxiliary script, svnpull, for mirroring Subversion repos.
     Repo 'cut' changed to 'divide' to avoid confusion with link cuts.
     Scripts can now be passed arguments substituted for $1..$n, as in shell.
     Scripts can now consume multiline here-documents, as in shell.
     Reference-name syntax is documented, and can select commits by date.

1.9: 2011-11-14::
     'prefer' command now sets the type for the selected repo.
     Added 'paths' command to list/modify pathnames touched by a selection set.
     In selection-set syntax, what was @foo for tag reference is now <foo>.
     In selection-set syntax, what was *foo for a branch set is now (foo).
     Under git and bzr, automatic file preservation of anything untracked.
     My belief that git handled properties was due to a test error...

1.8: 2011-11-10::
     Added "sort" command.
     Added "multiline" modifier to edit command.
     gitsvnparse now creates R ops from properly matched D/M pairs.
     gitsvnparse now lifts tip tags to actual tag objects.
     gitsvnparse strip is no more, since git handles properties now.
     Added =H visibility set - childless commits.

1.7: 2011-11-07::
     authormap -> authors; the command syntax has changed, read the man page.
     authors handles git-cvsimport/cvs2git style: "localname <localname>"
     authors with no arguments prints a list of committer/author/taggers
     Automatic use of .git/cvs-authors for ID mapping.
     gitsvnparse modifiers are gone; instead there's a new 'fossils' command.

1.6: 2011-11-03::
     Fix Python 3.2 compatibility problem pointed out by Mike Swanson.
     gitsvnparse moves remote branches/tags to local ones (like svn2git).

1.5: 2011-11-02::
     Suppress writing out properties if the importer won't handle them.
     'references' lists events with possible SVN or CVS rev IDs in comments.
     'references lift' turns CVS & SVN reference cookies into action stamps.
     cvslift -> cvspurge (it no longer does ID lifting)
     gitsvnlift -> gitsvnparse (it no longer does ID lifting)
     'checkout' command allows filling a specified directory with a revision. 
     'diff' command allows examining diffs between commits.
     New [ ] syntax for selecting commits containing a specified path.

1.4: 2011-10-28::
     Code is pylint clean.
     Fixed a bug in the cut coloring algorithm.
     Added 'graft', 'authormap', and 'gitsvnlift' commands.
     Merge operation is no longer confused by out-of-timestamp-order commits.
     Restore capability to coalesce empty log messages

1.3: 2011-10-25::
     Code moved to Python 3 compatibility with 2to3.
     cvspreen -> cvslift
     cvslift generates tag objects corresponding to cvs2svn-generated tags.
     Don't coalesce comments that read '*** empty log message ***'
     Various bug fixes, including for a crash bug in rebuild after expunge.
     Default preserve set is repository-type-dependent.

1.2: 2011-10-19::
     Cope better with "(no author)" attribution generated by cvs2svn.
     Preserve .git/config and .git/hooks by default.
     Slightly more relaxed parsing of Committer/Author/Tagger headers.
     More useful error messages on edit failure.
     Fix typo bug that prevented editing of Author headers from working.
     Make text search match on branch attribute and headers as well as text.
     Add obliterate, pushback, tagforward, and tagback modifiers on deletes.
     Add 'tags' command.
     Add '?' syntax for looking at neighbors and referents.
     New 'cvslift' operation for nuking junk commits from cvs2svn conversions.
     Make the branch attribute of commits editable.

1.1: 2011-08-24::
     Fix a miscoded notification message that would have crashed the
     program if it were ever issued, from Edward Z. Yang. Some typo
     fixes and documentation improvements. 

1.0: 2011-02-11::
     Pylint cleanup and release for production.

0.9: 2010-11-30::
     Can now handle 'N' file operations; they're passed through.
     The 'stats' command can now take a list of repo names as arguments.
     The file extension ".fi" is now removed from the in-core names of
     repositories read from plain files
     Fixed an embarrassing bug in the rebuild code

0.8: 2010-11-19::
     This is a beta. It is likely the next release will be 1.0.
     Expunge now saves deleted material into a new repository, so it can
     be used to carve up repositories by file path match.
     New 'renumber' command, in case importers ever care about marks 
     being consecutive.
     Allow Passthrough events to be merged.
     After a cut operation, option and feature events in the original
     repo will be duplicated onto the late fragment as well as reaming
     on the early one.

0.7: 2010-11-15::
     Added 'merge' command that merges repositories.

0.6: 2010-11-10::
     Tweaked to pass through git submodules without failing.
     Also contains a fix for a subtle bug in error handling.

0.5: 2010-11-09::
     We can round-trip bzr dumps with commit properties.
     New 'split' operation, opposite of coalesce/delete.
     Multiple author headers per commit are handled (helps with bzr).

0.4: 2010-11-08::
     Handling of inline data, previously extremely buggy, has been fixed.
     Can now handle streams produced by bzr-fast-export, which uses inline.
     Unfortunately, bzr-fast-import is buggy enough to make rebuilds fail.
     First cut at hg support, by Phil Roberts.

0.3: 2010-11-07::
     'split' operation renamed to 'cut'.
     New 'inspect' command for looking at commits in raw form.
     'list' command adapts to current width of terminal window.
     Issue a baton prompt during repo cleanup, which can be a long process.
     Multiple instances can now run in the same directory.
     Some speedup on import and export.

0.2: 2010-11-04::
     Filenames with embedded whitespace are handled. 
     The 'expunge' operation to remove files from the history is working.
     The 'split' operation (topological cut) is now working.
     There is a new 'drop' command to drop repositories from the load list.
     There is a new 'history' command to display your session history.
     The 'view' command was a bad idea and has been removed.
     & followed by branch name resolves to everything on the branch.
     A bug that caused spurious date modifications when editing events
     with a non-local timezone has been fixed.

0.1: 2010-11-01::
     First public release. Working with git, untested with hg and bzr

0.0: 2010-10-22::
     Project launched

// end
