Version 0.34.0 (released 3 December 2003, from revision r7859)
http://svn.collab.net/repos/svn/tags/0.34.0

#####################################################################
##  WARNING  WARNING  WARNING  WARNING  WARNING  WARNING  WARNING  ##
#####################################################################
##                                                                 ##
## This release makes  an incompatible  change  to  the Subversion ##
## database.    Repositories created with versions  of  Subversion ##
## prior to 0.34 will not work with Subversion 0.34.               ##  
## To  upgrade,   first  use  'svnadmin dump'  with  your existing ##
## Subversion binaries.   Then upgrade your binaries to 0.34,  and ##
## use  'svnadmin load'  to  create  a  new  repository  from your ##
## dumpfile.                                                       ##
## Don't  forget  to  copy any custom configuration/hooks from the ##
## old to the new repository.                                      ##
##                                                                 ##
#####################################################################

 Please see notes/repos_upgrade_HOWTO for documentation on migrating
 pre-0.34.0 repos to 0.34.0.

 That document is also located here:
    http://svn.collab.net/repos/svn/trunk/notes/repos_upgrade_HOWTO

 User-visible changes:
 * fs schema change (#1578, #1595) **NOTE: repos dump/load cycle required!**
 * Berkeley DB 4.2.50 is now the recommended Berkeley version
 * Fix: 'svn status' thought replaced items were unversioned (#1609)
 * SSL server cert error prompt improvement (r7849)
 * many error message improvements (r7745, r7763, r7824 and 7827 - #897)
 * don't show update-completion message until all wc work completes (#1556) 
 * many other enhancements, minor features, and bugfixes not listed here

 Developer-visible changes:
 * public client APIs changes (r7799) after fixing #1556
 * many improvements and fixes on Perl bindings (perl => 5.8.0 are required)
 * improvements, fixes on misc. test scripts
 * many other changes not listed here

 Merged revisions after release branching:
 * r7868 - Java bindings
 * r7888 - Security fix for svnserve

Version 0.33.1 (released 17 November 2003, revision r7782)
http://svn.collab.net/repos/svn/tags/0.33.1

    NOTICE: This is a bugfix release.  The bug is fixed if *either*
            the client or server uses the new code.

User-visible changes:
* major performance fix for updates


Version 0.33.0 (released 13 November 2003, revision r7737)
http://svn.collab.net/repos/svn/tags/0.33.0

                              NOTICES:

    1. This client may be incompatible with ra_dav servers <= 0.31.

    2. In order to make commits more responsive, repository
       deltification is no longer automatic.  However, you may want
       to run deltification as a background process in your repository
       post-commit hook.  For example, the new post-commit.tmpl file
       recommends 'nice -2 svnadmin deltify "$REPOS" -r "$REV" &'.

 User-visible changes:
 * now require APR/APU 0.9.5 (ships in Apache 2.0.48)
 * lose automatic deltification, but recommend it in post-commit (r7695, #1573)
 * new configuration and authn/authz support in ra_svn (r7604, r7601)
 * much faster checkouts and updates, over both svn:// and http:// (#1429)
 * new partial-authz feature: checkouts/updates just skip unauthorized items
 * new 'use-commit-times = yes' config option to use commit-time timestamps
 * new 'svnadmin hotcopy' command, like hot-backup.py (#1567)
 * fix Win32 "access denied" error in renames (r7598, #1576)
 * unnecessary working copy tree locks now avoided, to save time (#1245)
 * Compatibility changes:
    - lose ra_dav compatibility with servers 0.31 and earlier
    - lose support for working copy format "1" (not created for over a year)
 * 'svn diff' and other read-only actions now work in read-only working copies
 * 'svn blame -rX' now does the intuitive thing
 * 'svn log' output headers now say "rXXXX | " instead of "rev XXXX:  "
 * 'svnversion' no longer stymied by svn:externals
 * new 'svn pd' alias for 'svn propdel'
 * '-rCOMMITTED' keyword now works on more commands
 * minor changes to output of 'svn ls -v' and 'svn st -v' (r7530)
 * 'svn log --xml' now obeys the '-q' flag (r7555)
 * cvs2svn.py bugfixes, especially issue #1440
 * book and documentation updates
 * removed server config options ssl-ignore-invalid-date and
   ssl-override-cert-hostname (r7644)
 * many other enhancements, minor features, and bugfixes not listed here

 Developer-visible changes:
 * repair text- and prop-time in .svn/entries if spuriously wrong (r7565)
 * speed up keyword translation (r7502)
 * two new editor functions, absent_file() and absent_directory()
 * ra_dav checkouts/updates no longer do O(n) number of GET, PROPFIND requests
 * new svn_io_temp_dir function, will morph to apr_temp_dir_get soon
 * new svn_io_file_close wrapper for apr_file_close
 * tools/test-scripts/svntest/ scripts now support ra_dav and ramdisk
 * many other changes not listed here


Version 0.32.1 (released 23 October 2003, revision 7497)
http://svn.collab.net/repos/svn/tags/0.32.1

 NOTICE: This release is to correct for the problems in the 0.32.0
         release.  There are no user or developer changes in this release
	 other than the subversion/include/svn_version.h now reflects
	 the correct version number.

 NOTICE: This release of Subversion causes an ra_dav client/server
         compatibility break with Subversions older than 0.28.0.

Version 0.32.0 (released 22 October 2003, revision 7480)
http://svn.collab.net/repos/svn/tags/0.32.0

 NOTICE: This release of Subversion causes an ra_dav client/server
         compatibility break with Subversions older than 0.28.0.

 User-visible changes:
 * new 'svn blame' subcommand. (r7389, 7438, #508)
 * fix huge ra_dav 'svn import' memory leak. (r7381)
 * other bugfixes: proper line endings in diff headers (r7450, #1533),
   stop auto-props from removing all whitespace (r7358), 'svn st' UI
   consistency fix (r7364), various 'svn switch' fixes (r7366),
   mini-manpages for svnadmin, svnserve, svnversion (r7421), remove
   'P' field from 'svn ls -v' (r7432), 'svn merge' double-notification
   bug (r7447), prevent 'svn:externals' infinite loop (r7459), 'svn
   merge' segfault (r7458).

 Developer-visible changes:
 * 'svn diff' is now reasonably streamy. (r7393, 7439, #1481)
 * fix many ra_dav pool abuses. (r7370-3, 7380, 7368, 7400, ...)
 * fix mini leaks:  clear unused svn_error_t's. (r7378-9, 7405, 7408, 7429)
 * tons of code, doc, API cleanup. (from julianfoad!)
 * new RA->get_repos_root() API. (r7428)
 * swig/python, swig/perl and native JNI updates and improvements.
 * more work on build depenedency generator. (r7412-8)
 * svn_repos_finish_report() now aborts txns on error. (r7424)
 * remove crufty old ra_dav compatibility code (r7466, 7468)
 * other changes: new SVN_DEBUG_ERROR tool macro, new 'davautocheck'
   and 'contrib' makefile targets, new --enable-gprof configure option
   (r7437), new scramble-tree.py testing tool, auth provider
   reorganization, make RA->get_dir fetch props correctly over ra_dav
   (r7431), notice permission error when creating unique tmpfile (r7434).


Version 0.31.0 (released 08 October 2003, revision 7355)
http://svn.collab.net/repos/svn/tags/0.31.0

 User-visible changes:
 * new 'svnlook history' command (and removal of 'svnadmin lscr').
 * new 'auto-props' feature can set file properties during 'svn add/import'
 * win32 client now properly converts UTF8 to console-locale. (r7168, #872)
 * 'svn up' now notices when svn:externals value changes. (r7256, #1519)
 * authentication changes:
     - client caches auth-creds in memory for a single session (r7292, #1526)
     - SSL cert caches keyed on host+port, not any SSL connection. (r7174)
 * faster 'svn log' (see new fs-history algorithm) (#1499)
 * faster repos read-operations (caching gives ~20% speedup) (rXXXX, #1499)
 * faster updates (fewer entries-file writes gives ~20% speedup) (r7170, #1490)
 * more work on psvn.el and svn_load_dirs.pl
 * more cvs2svn bugfixes
 * obsolete manpages truncated to point to 'help' and book URLs. (r7340, #1508)
 * other bugfixes:  no more revision keywords "FIRST" or "CHANGED" (r7250),
   fix 'svn cp URL URL' $EDITOR msg generation (r7264), fix regression
   bug in 'svnadmin load' (r7273), 'svnadmin setlog' now triggers
   repository hooks (r7322), 'svn cp -rHEAD wc' now works correctly (r7331),
   post-commit-hook failures correctly ignored by client (r7342, #906)

 Developer-visible changes:
 * tons of filesystem improvements (#1499):
     - new fast fs-history algorithm: allows stable VR urls (r7283, #1499)
     - new dag-node caching (r7163)
     - skip-deltas now run in individual trails (r7138)
     - no-op svn_fs_copy()s don't write to the database (r7158)
 * mod_dav_svn MERGE response is faster (using svn_repos_replay()) (r7191)
 * ensure consistent wc 'dead entry' cleanup (r7197, r7204, #1075)
 * lots of work on gen_win.py, gen_make.py, gen_base.py tools
 * lots of work on making SWIG-java bindings build.
 * updates/improvements to javahl bindings and SWIG-perl bindings
 * updates/improvements to Mandrake RPM builds
 * other bugfixes:  python testsuite now uses local path separators (r7224),
   svn:externals no longer keeps connections open (r7312, #1448),
   UTF8-to-local date conversion (r7316, #1534), API consistification 
   changes (r7298, r7302, r7304, r7307).


Version 0.30.0 (released 24 Sep 2003, revision 7178)
http://svn.collab.net/repos/svn/tags/0.30.0

 User-visible changes:
 * SSL changes:  (r7134, #1330)
      - client now prompts to cache server certificates       
      - no more 'ssl-ignore-unknown-ca' option
      - 'ssl-ignore-host-mismatch' is renamed to 'ssl-override-cert-hostname'
      - new 'ssl-trust-default-ca' option to trust 'default' openssl CAs
 * 'svn log' no longer dies on unversioned args (r6989, #777)
 * local mods now obstruct 'svn up' deletions (r7050, #1196)
 * 'svnserve' now notices (unauthenticated) --username arg (r7060)
 * no more 'svnadmin createtxn' subcommand. (r7062)
 * 'svn ls -v' shows years when appropriate
 * document some new things in Book (r7014), plus minor technical fixes
 * website changes:  new sidebar, new 'svn links' page, new tigris.org!!
 * other bugfixes:  hooks use proper stdout handles on win32 (r7001),
   prevent copies of copies in wc (r7077, #1259), display failed
   revprop change over ra_dav (r7081, #1520), 'svn st -u' throws RA
   error properly (r7094, #1506)

 Developer-visible changes:
 * ra_dav now requires neon-0.24.X
 * many gen_make.py/gen-base.py improvements, especially for win32 builds
 * many improvements to swig/perl bindings
 * improvements to contrib/:  psvn.el, and new svn-push program.
 * more cvs2svn bugfixes:  issue #1504, #1421, #1514, and new --username arg.
 * python testsuite only raises exceptions, never status codes. (#1192)
 * various libsvn_fs re-org (prepwork) for issue #1499.
 * other bugfixes: code-complete timestamp feature (r6983, #1445), add
   op-counting features to trails (r6984, #655), fs UUID caching
   (r7037), almost finish win32 iconv issues (#872), restored-file
   entry-timestamp bugfix (r7090, #1523), always print CWD as '.' (r7097)


Version 0.29.0 (released 05 Sep 2003, revision 6976)
http://svn.collab.net/repos/svn/tags/0.29.0

 User-visible changes:
 * 'svn status' now streams its response.  (r6913, #1426)
 * 'svn status' now recurses into externals (r6913, #1428)
 * new 'svnadmin verify' command to verify repository data (r6851, #1074)
 * SSL changes:  (r6958, #1371)
     - dropped support for PEM-encoded client certs, only accept PKCS12 now.
     - 'ssl-authority-files' is now a list of CA files
     - no more 'ssl-client-cert-type' and 'ssl-client-key-file' variables.
 * new svndumpfilter option: '--preserve-revprops' to keep props on empty revs
 * mailer.py improvement:  handle multiple match groups (r6940)
 * remove in-repos/on-disk repository template features, till post-1.0 (r6965)
 * various cleanups to the Book
 * other bugfixes: switch deletion bug (r6890, #1496), status
   repos-delete bug (r6913, #1469), reversion of '.' (r6953, #854).

 Developer-visible changes:
 * GUI developers take note: prompting API changed (r6928, #1214)
 * now compile against neon-0.24; 0.23.9 support to be dropped soon. (r6958)
 * various improvements to Perl/SWIG bindings
 * tree re-org:  non-core utilities split into 'tools' and 'contrib' areas.
 * some gen_make.py/gen-base.py improvements
 * configure.in CFLAGS bugfix (r6963)
 * stop calling deprecated APIs in APR, in preparation for upcoming APR-1.0.


Version 0.28.2 (released 29 Aug 2003, revision 6946)
http://svn.collab.net/repos/svn/tags/0.28.2

 User-visible changes:
 * MAJOR BUGFIX:  revert revision 6764.

      The new history-searching code was over-stressing our use
      of BerkeleyDB transactions, causing checkouts to go
      twice as slow and lose all concurrent-client scalability.

      This is a temporary fix for a larger design problem.  See issue
      http://subversion.tigris.org/issues/show_bug.cgi?id=1499


Version 0.28.1
(released 28 Aug 2003,http://svn.collab.net/repos/svn/tags/0.28.1)

  There are no changes in this release.
  It is strictly an updated release, build with the correct version
  of autoconf; autconf-2.57


Version 0.28.0 (released 27 August 2003, rev 6894, branches/release-0.28)
(http://svn.collab.net/repos/svn/tags/0.28)

#####################################################################
##  WARNING  WARNING  WARNING  WARNING  WARNING  WARNING  WARNING  ##
#####################################################################
##                                                                 ##
##  This release makes an incompatible change to the Subversion    ##
##  repository filesystem schema.  Repositories created with       ##
##  Subversion code prior to this release will unable to operate   ##
##  with this new code.  To maintain the ability to use said       ##
##  repositories, you must use a version 'svnadmin dump' prior to  ##
##  this change to dump your repository to a dumpfile, then use    ##
##  this new Subversion code to create, and load your dumpfile     ##
##  a new repository using 'svnadmin load'.  And don't forget to   ##
##  copy over any custom configuration/hooks from the old to the   ##
##  new repository.                                                ##
##                                                                 ##
#####################################################################

 Please see notes/repos_upgrade_HOWTO for documentation on migrating
 pre-0.28.0 repos to 0.28.0.

 That document is also located here:
    http://svn.collab.net/repos/svn/trunk/notes/repos_upgrade_HOWTO

 User-visible changes:
 * fs schema change, see issue #1003 **NOTE: repos dump/load cycle required!**
 * command-line options
  - changed  'lsdblogs' is now 2 commands 'list-dblogs', 'list-unused-dblogs'
  - removed  '--only-unread' option 
  - new      'list-unused-dblogs'
  - new      '--config-dir' allows svn config to live outside ~/.subversion 
  - new      (r6811)
    - svn-status-get-specific-revision (interface to svn cat)
    - svn-ediff-with-revision (run ediff w/ a file wc and a specified rev)
 * fixed 'mod_dav_svn' segfault bug caused by foreign DeltaV requests (r6725)
 * fixed 'svn switch' bug which could result in corrupted repo (#1316,r6746)
 * fixed items now marked as 'deleted' if they no longer exist (#919,r6748)
 * fixed 'merge' no longer adds file/dir if schema differs from wc. (#1321)
 * fixed Handle \r correctly when prompting on Windows. (r6792,#1307)
 * 'svn merge' now 'skip's when it hits unversioned obstructions (r6810,#1425)
 * fixed repos->wc of file w/ svn:keywords set caused segfault (r6818,#1473)
 * fixed 'svn diff -r PREV:HEAD' failed if tmp/ exists in cwd (r6838,#1487)

 Developer-visible changes:
 * database schema changed (see warning above!) (r6752,#1003,#1248,#1438)
 * svn Perl bindings are ready - see swig/INSTALL
 * internal changes to treat swig libraries more like normal libraries (r6761)
 * improved handling of errors opening a repository over ra_svn (r6841)



Version 0.27.0 (released 12 August 2003, rev 6707, branches/release-0.27.0)

 User-visible changes:
 * fixed ra_svn:
    - (r6588) avoid hangs due to ra_svn tunnel creation errors
    - (r6696, r6697, #1465) svnserve crash due to pre-commit hook failure
 * fixed 'svn log':
    - (r6642, #1423) log on a deleted path over ra-dav
    - (r6684, #1438) log performance bug
 * fixed 'svn diff' and 'svn merge':
    - (r6604, #1311) diff URL URL on files now works
    - (r6668, #1142) diff comparing wc to repos branch
    - (r6687, #1297) diff/merge interaction in file adds
    - (r6703, #1319) merge problem with adding subtrees
    - (#6607) new default ancestry-following behavior for diff, merge
 * fixed 'svn status':
    - (r6688, r6691, r6692, #1289) status on nodes deleted in repos
    - (r6637) status now always uses "I" for ignored directories
 * fixed 'svn copy':
    - (r6704, #1313) copy between 2 repositories errors cleanly now
    - (r6649, #1444) seg fault when copying empty dir from repos to wc
 * fixed 'svn export':
    - (r6652, #1461) exporting an empty directory
    - (r6664, #1296) path->path exports
 * fixed - gracefully handle failure to get uid on Win98 (r6695, #1470)
 * fixed - avoid spurious conflicts when merging binary files (r6621, #1319)
 * fixed - merge of a single file into implicit '.' (r6630, #1150)
 * fixed - various Win32 innosetup improvements/fixes (r6693, r6656, #1133)
 * fixed - disallow ".." in svn:externals target paths (r6639, #1449)
 * fixed - use 'env' instead of hard-coded paths in scripts (r6626, #1413)
 * fixed - bug in loading incremental dumpfiles (r6595)
 * fixed - performance issue in svn_load_dirs.pl fixed (r6623, r6627, #1455)
 * fixed - handle IPv6 addresses in URLs (r6638, r6654, #1338)
 * changed - 'svn resolve' renamed to 'svn resolved' (r6597)
 * changed - 'svnlook tree' takes new optional path-in-repos argument (r6583)
 * changed - renamed 'svnadmin archive' to 'svnadmin lsdblogs'; offer
             either all logs, or just the unused ones (r6661)  
 * changed - now offer full-text search in Windows documentation file (r6658)
 * changed - much documentation updated, especially the book
 * Many other fixes and changes, too numerous to mention individually.

 Developer-visible changes:
 * fixed - many improvements to Perl and Python bindings, including some
           Win32-specific improvements (r6619, r6686, r6590, r6580, r6579)
 * All other important dev changes are implied by the user-visible changes.


Version 0.26.0 (released 24 July 2003, revision 6550, branches/release-0.26.0)

 User-visible changes:
 * fixed - --parent-dir option to svnadmin load (r6436)
 * fixed - 'svnlook diff' now properly displays diffs  (r6408, #1241)
 * fixed - 'svn cat' no longer expands values from the wrong revision.
 * fixed 'svn merge':
    - (r6447,#1402) -r FOO:PREV works correctly
    - (r6452,#1379) no longer prints confusing no-op lines
    - (r6500/6503,#1399) warn user when a tree-delta chunk can't be applied
 * turn compression off to work around to mod_deflate timeouts (r6509)

 Developer-visible changes:
 * cvs2svn.py:  lots of bugfixing related to branch/tag support
 * diff code refactored to allow use by other tools (r6407)
 * make 'svn export' set commit-timestamps (not ready yet) (r6420)
 * fixed - memory leaks in libsvn_ra_dav commits (r6422)
 * fixed - cvs2svn.py handles branch files rooted in dead revs (r6482,#1417)
 * fixed - new lines now detected in svn:author property (r6497,#1401)
 * fixed - svn_load_dirs works w/ absolute paths (r6507, Debian bug #187331)
 * changed - build infrastructure now supports Perl SWIG bindings (r6441)
 * removed - PORTING document no longer necessary (r6472)


Version 0.25.0 (released 11 July 2003, revision 6394, branches/release-0.25.0)

 User-visible changes:
 * command line options:
    - new --force option for svn export (r6327,#1296)
    - new --force-log for commit, copy, delete, import, mkdir, move (r6294)
    - no longer need --force for commit
 * commands
    - new - svnadmin archive (r6310)
    - changed - svn import syntax now 'svn import [PATH] URL' (r6288,#933,#735)
    - fixed - Search PATH for external diff commands (r6373)
    - fixed - 'svn switch' memory bug (r6296)
    - fixed - 'svn mkdir' coredump (r6388,#1369)
 * python bindings now in -tools rpm for Mandrake 9.1 (r6374)
 * allow parent-into-child copies, provided they are not WC->WC. (r6348,#1367)
 * fixed - Apache module installation order (r6382-6,#1381)	
 * now require apache 2.0.47 (and apr 0.9.4)
 * fix 2 commit leaks
 * fix mod_dav_svn path-escaping bug

 Developer-visible changes:
 * Win32 build system
    - new - .vcproj files for svn_config project and APR (r6311)
    - fixed - SWIG bindings for Win32 (r6304)
    - vcproj generator now works (r6316)
    - swig's generated .c files now dependent on headers in .i files (r6379)
    - refactored code common to dsp & vcproj into gen_win.py (r6328)
 * fixed
    - SEGFAULTs in SWIG bindings (r6339)
    - potential SEGFAULTs in 'REPORT vcc' backward-compatibility code (r6377)
    - mod_dav_svn's autoversioning failure on PUT (r6312)
    - 'svn switch' memory bug (r6296)
 * changed - mailer.py now uses svn_repos_replay()


Version 0.24.2 (released 18 June 2003, revision 6284, branches/release-0.24.2)

 User-visible changes:
 * fix 'svn export' potential segfault
 * fix occasional diff test failures
 * fix 'svnadmin dump' memory hog
 * fix new-dir-with-spaces bug

 Developer-visible changes:
 * none


Version 0.24.1 (released 16 June 2003, revision 6249, branches/release-0.24.1)

 User-visible changes:
 * Fix bug in 'svn log'.

 Developer-visible changes:
 * none


Version 0.24.0 (released 15 June 2003, revision 6234, branches/release-0.24.0)

 User-visible changes:
 * new 'svn diff [--old OLD] [--new NEW]' syntax (#1142)
 * new --relocate option for svn switch (#951)
 * new --version option for svnadmin and svnlook
 * new path-based authorization module for apache
 * make 'svn checkout' and not just 'svn update' resume a checkout
 * .svn directories now hidden on Windows
 * config variable 'store-password = no' now actually works
 * fix 'svn merge --dry-run'
 * fix 'properties hanging after a rename' issue (#1303)
 * fix odd behavior of 'svn up -r PREV filename' (#1304)
 * fix delete-tracking bug (#1348)
 * fix dump and load corner cases (#1290)
 * ra_dav server more resilient for foreign deltaV clients
 * numerous ra_svn changes - must update clients and servers
 * fix export over ra_svn (#1318)
 * fix ra_svn error transmission bug (#1146)
 * fix ra_svn corruption in tunnel mode (#1145)
 * make svnserve multi-threaded on non-fork platforms (now works on Windows)
 * remove svnserve -F and -S options
 * various memory use improvements (#1323)
 * various performance improvements for all protocols
 * various performance improvements for 'svnadmin dump' and svnlook
 * various subversion book updates (you have read the book right?)
 * more cvs2svn.py improvements (and more to follow)
 * new debugging script normalize-dump.py to normalize dump output

 Developer-visible changes:
 * path-based editor drivers
 * no more RA->do_checkout()
 * update python and java bindings
 * various windows build fixes


Version 0.23.0 (released 16 May 2003, revision 5962, branches/release-0.23.0)

 User-visible changes:
 * 'svn cat' now performs keyword expansion (#399)
 * 'svn export' keyword expansion fixed
 * checkouts are now restartable (#730)
 * ssh ra_svn tunnel agent specified with svn+ssh://hostname/path syntax.
 * remove dependency on external diff program
 * don't error out early on unversioned files (#774)
 * fix commands where REPORT fails if item isn't in HEAD (#891)
 * updates now receive checksums like checkouts (#1101)
 * 'svn revert dir' now resets property timestamp (#1163)
 * fix instances of client showing help instead of error message (#1265)
 * fix incorrect path in 'not a working copy' error messages (#1291)
 * fix cvs2svn.py file added on branch problem (#1302)
 * fix various vc-svn.el problems (#1257, #1268)
 * fix various psvn problems (#1270)
 * various Win32 build fixes

 Developer-visible changes:
 * fix various gcc 3.3 warnings (#1031)
 * fix various memory errors/leaks
 * remove java/jni bindings


Version 0.22.2 (released 13 May 2003, revision 5918, branches/release-0.22.2)

 User-visible changes:
 * fix Win32 build
 * properly handle on-disk template errors
 * fix bogus uuid bug in cvs2svn.py

 Developer-visible changes:
 * none


Version 0.22.1 (released 9 May 2003, revision 5874, branches/release-0.22.1)

 User-visible changes:
 * fix shared library installation problem
 * update cvs2svn.py script

 Developer-visible changes:
 * none


Version 0.22.0 (released 7 May 2003, revision 5842, branches/release-0.22)

 User-visible changes:
 * svn diff -r BASE:HEAD and other edge cases fixed (#977)
 * svn diff and merge now have --ignore-ancestry option (#1034)
 * svn ci -N DIR no longer errors during post-commit (#1239)
 * ra_dav now optional (#617)
 * update vn-svn.el (#1250, #1253)
 * improvements to svn_load_dirs.pl (#1223, #1215)
 * misc ra_svn bug fixes and protocol change
 * log-encoding option now properly only applied to logs
 * fix mmap failures on HP-UX
 * fix some client memory leaks

 Developer-visible changes:
 * finish transition to new xml prop namespaces for mod_dav_svn (#840)
 * minimize full tree locks and number of system calls (#1245)
 * auto-generated .dsp files (#850)
 * fix ETag of directory (#1251)
 * added export editor (#1230)


Version 0.21.0 (released 15 Apr 2003, revision 5639, branches/release-0.21)

 User-visible changes:
 * SSL client and server certificate verification
 * authentication info now stored in ~/.subversion/auth/
 * svn diff on a copied file only shows local mods, not the whole file
 * svn propget now takes a --strict option to control output
 * svnadmin load now takes a --parent-dir option
 * added the new 'svndumpfilter' program
 * svnlook now has 'cat', 'propget', and 'proplist' commands to enable
   viewing this information on transactions
 * 'svn copy' from another repository now adds without history
 * tag/branch conversion disabled in cvs2svn until it gets fixed
 * the 'anonymous' user is no longer used; we simply avoid attaching an
   author property when an author is not available
 * improvements to ignored-file handling
 * Python ConfigParser-style variable expansion for config file (#1165)

 Developer-visible changes:
 * introduced the svn_filesize_t type (#639)
 * realmstring added to the svn_auth framework
 * the "result checksum" moved to the editor.close_file function
 * more checksumming here and there
 * initial work to enable binary properties via ra_dav
 * initial, internal support for compressed streams
 * test framework shifting to exception-based failure recording (#1193)
 * improved options and handling in the C test framework
 * java and python binding work
 * libsvn_auth folded into libsvn_subr
 * bug fixes: 'svnadmin load' parse bug; ra_svn crashes (#1160); 'svn
   log' on a switched wc (#1108); 'svn ci -N' on named files (#1195)


Version 0.20.1 (released 26 Mar 2003, revision 5467, branches/release-0.20.1)

 User-visible changes:
 * fix svnadmin load bug so that property deletions actually occur
 * fix checksum compatibility issue for older repositories

 Developer-visible changes:
 * none


Version 0.20.0 (released 20 Mar 2003, revision 5410, branches/release-0.20)

 User-visible changes:
 * new compatibility rule: require only that each interim release be
                           compatible with the one before it (see HACKING)
 * ra_svn is still new so above rule doesn't yet apply
   (i.e. 0.20 over ra_svn is NOT compatible with previous releases)
 * merge infers the target path (see book chapters 4 & 8)
 * merge continues in presence of missing target file
 * merge's add notifications are no longer duplicated
 * commands can be safely interrupted (Ctrl-C)
 * --encoding global default in ~/.subversion/config
 * new option --editor-cmd
 * begin multi-release transition to escape binary properties over DAV
 * misc performance improvements

 Developer-visible changes:
 * RA vtable functions take pool argument
 * svn-config --includes path fixed
 * uuid at creation now complete
 * start having test failures throw exceptions rather than return errors
 * test suite option --cleanup with --verbose being default mode
 * continued diff library development
 * minor revprop hook changes
 * bug fixes: no diff on binary files (#1019), consistent error messages
   (#1181), version numbers in hook scripts (#1182), win98 codepage (#1186)


Version 0.19.1 (released 12 Mar 2003, revision 5303, branches/release-0.19.1)

 User-visible changes:
 * fix svnserve tunnel mode pipe close bug

 Developer-visible changes:
 * none


Version 0.19.0 (released 10 Mar 2003, revision 5262, branches/release-0.19)

 User-visible changes:
 * svn ls works on wc paths (#1130)
 * new cvs2svn.py features and bug fixes (1105)
 * new svnlook subcommand 'uuid'
 * new svnadmin create option '--bdb-txn-nosync' (use with care)
 * fix svnserve help output
 * SVN_EDITOR now overrides svn-editor in ~/.subversion/config
 * miscellaneous performance improvements (memory and speed)
 * more work on the Book

 Developer-visible changes:
 * start implementing cancellation of long-running functions
 * misc windows build fixes and features (DSP generator)
 * -W and -P options to stress.pl
 * start adding support for multiple fs backends
 * work on bindings and bindings build system (#1132, #1149)
 * bug fixes: ra_dav import/checkout memory usage (#995), control chars
   in commit messages (#1025), svn merge memory usage (#1069, #1077),
   pre-existing ~/.subversion (#1121), keyword expansion (#1151), line
   number in config error message (#1157), svn-tunnel-agent in [default]
   (#1158), RA->close RIP (#1164), config-test non-source (#1172)


Version 0.18.1 (released 26 Feb 2003, revision 5118, branches/release-0.18.1)

 User-visible changes:
 * editor environment variables no longer incorrectly required
 * 'svn help import' now displays correct usage
 * fix crashes in the internal diff library and ra_dav
 * fix Win9x/Me console issue
 * cvs2svn.py api fix
 * hot_backup.py now correctly removes old backups

 Developer-visible changes:
 * various rpm package fixes


Version 0.18.0 (released 19 Feb 2003, revision 4968, branches/release-0.18)

 User-visible changes:
 * renamed the [default] section to [global] in the servers config file
 * compression option is now http-compression and lives in servers file
 * use internal diff by default rather than external program (#405 in progress)
 * symlinked hook scripts now run
 * read-only access flag (-R) for svnserve
 * quiet flag (--quiet) for svnadmin dump
 * --ignore-uuid and --force-uuid for svnadmin load
 * miscellaneous performance improvements
 * more work on the Book

 Developer-visible changes:
 * new authentication library libsvn_auth (#724)
 * new bdb table uuids
 * client context object in libsvn_client
 * more work on java and other language bindings
 * test framework now has a quiet option (-q)
 * miscellaneous small code cleanups
 * bug fixes: more valgrind memory bugs, apr xlate i18n mess (#872),
   non-existent URL checkout (#946), props on to-be-deleted files (#1066),
   ra_svn move/copy (#1084), eol translation (#1085), ra_svn
   checksumming (#1099), cat command corrupt output (#1104), cvs2svn
   memory consumption (#1107), merge of property add (#1109),
   '..' relative path (#1111), commit/cleanup/diff3 (#1119),
   .svn/entries checksum (#1120), svn commit in / (#1122),
   status on uncontrolled directory (#1124), commit message eol
   characters (#1126), cat -r PREV (#1134), ra_dav wcprops (#1136)
   split XML cdata/attribute encoding (#1118)


Version 0.17.1 (released 22 Jan 2003, revision 4503, branches/0.17.1)

 User-visible changes:
 * changed non-baseline build version number display.
 * compatibility change: make sure old clients can talk to newest servers.
 * some changes to the Book

 Developer-visible changes:
 * dumper/loader now use checksums (#1102)
 * miscellaneous small code cleanups
 * bug fixes:  eol-style timestamp changes (#1086), valgrind mem bug,
   better checksum error reporting, 


Version 0.17.0 (released 20 Jan 2003, revision 4468, branches/0.17)

 User-visible changes:
 * 'svn add' is now recursive by default, -N to disable (#1073)
 * new 'svnversion' program summarizes mixed-revs of a working copy
 * huge improvements to the mailer.py tool
 * more work on the Book and man page
 * default global-ignores now built-in, new runtime-config file commented out

 Developer-visible changes:
 * checksums, checksums everywhere (issues #649, #689):
    - filesystem stores them, and verifies them when reading/writing
    - working copy stores them, and verifies them when reading/writing
    - checksums transferred both ways over network, RA layers verify them
 * finish draft of internal diff/diff3 library -- ready for testing/optimizing
 * more utf8<->apr conversion work (#872)
 * more work on swig/python and ruby bindings
 * improvements to win32-innosetup package
 * 'svnserve' now has an official IANA-assigned portnumber.
 * mod_dav_svn now only sends/understands new xml prop namespaces (#840)
 * bug fixes:  stop needless fs rep data copies (#1067), wc auth
   caching bugs (#1064), use APR_BUFFERED to open files (#1071), lots
   of wc 'missing dir' edge-case bugs (#962), prevent wc from
   receiving '.svn' (#1068), don't commit symlinks (#1081), better
   diff labels (#1080), better fulltext tmpfile names in conflicts (#1079),
   prevent ra_dav from deleting out-of-date items (#1017), segfault (#1092), 
   don't attempt checksum on missing tmp textbase (#1091), allow diffs
   during update again (yikes!)


Version 0.16.1 (released 6 Jan 2003, revision 4276)

 User-visible changes:
 * ra_svn network layer (apache alternative) now tested & ssh-tunnelable
 * new (experimental) mod_dav_svn autoversioning feature (SVNAutoversioning)
 * reorganization of the ~/.subversion/ run-time config files.
 * more entry caching: approx. 3x speedup on checkouts & updates.
 * option rename: --non-recursive instead of --nonrecursive
 * option rename: --no-diff-deleted instead of --no-diff-on-delete
 * new 'svn log --quiet'
 * new 'svn diff --no-diff-deleted'
 * fix keyword expansion behaviors ($keyword:$ / $keyword$ / $keyword: $)
 * handle win32 non-ascii config-file paths (#968, #1048, part of #872)

 Developer-visible changes:
 * most public header files now using doxygen markup
 * new (untested) internal difflib (#405)
 * neon debugging now tweakable via run-time config file
 * more progress on Subversion Book rewrite.
 * new ./configure --with-diffutils
 * begin work on client/server checksums (#649)
 * regression tests now depend on svnadmin dump/load
 * lose src_err field of svn_error_t
 * many fs function renames:  begins fs database back-end abstraction.
 * new libsvn_repos prop-validating wrappers
 * lots of work on build-system dependency graph generation (for SWIG building)
 * swig binding work:
    - python svn calls can now run as independent threads
    - new java-binding build system
    - improved swig building features:  --prefix, LDFLAGS behaviors
 * many, many bug fixes: wc->repos copies (#1029), #943 followup
   (#1023), copies of copies (#830), 'svn resolve' cleans up entries
   file (#1021), prop merging (#1012), segfault fixes (#1027, #1055),
   autoconf 2.5X (#886), O(1) copies (#717), new 'failed revert'
   signal (#714), detect missing schedule-add conflicts (#899, #863),
   begin dav namespace switchover (#840), status bugs, url auth
   inference (#1038), log bug (#1028), newline prompt (#1039),
   svnadmin errorchecking, url syntax errors (#1057, #1058), apr/utf8
   work (start #872), and many more.


Version 0.16 (released 4 Dec 2002, revision 3987)

 User-visible changes:
 * new 'svn cat' subcommand
 * new --revprop flag to access revision props, -r for versioned props (#943)
 * new "compression" runtime option in ~/.subversion/config
 * svnadmin/svnlook now use help system, and some subcommands deleted or moved.
 * tool changes:
    - new svnshell.py tool
    - new mirror_dir_through_svn.cgi script
    - new svn_load_dirs.pl features
    - updates to vc-svn.el
 * --message-encoding is now just --encoding, and affects svn: propvals too.
 * major rewrites of chapters 3, 4, 5 of the Subversion Book.

 Developer-visible changes:
 * new network layer, libsvn_ra_svn!  still experimental.
 * all svn_error_t's now allocated in subpool of global pool.
 * reorganize svnlook/svnadmin subcommands & option-parsing (#540, #915, #910)
 * all log messages and svn: props now stored as UTF8/LF endings (#896)
 * huge cleanup/reorg of all svn_path_* routines
 * svn_client_status sends feedback, distinguishes unversioned vs. ignored
 * improvements to swig typemappings and build processes
 * fixes to pool cleanup handlers
 * begin abstraction of gen_make.py 
 * entry-caching improvements
 * stop using global apr_xlate objects
 * win32-innosetup code added to packages/
 * new work on ruby bindings and swig-java bindings
 * many, many bug fixes: various small coredumps, svn_error_t leaks,
   copy props correctly (#976), copy executable bits correctly (#982),
   test-system fix (#882), accidentally imported tmpfile (#964),
   ra_local checkout memleak (#985), accidental wc deletion (#988),
   better text vs. binary detection (#994), dav log-report error
   handling, bad 'svn switch' dav caching (#1000), don't call NULL
   callbacks (#1005), bogus switch feedback (#1007), eol-style file
   corruption (#920), getdate.y fix (#1009), ra_local error reporting (#900),
   start of work on issues #830 and #869.


Version 0.15 (released 7 Nov 2002, revision 3687)

 User-visible changes:
 * New 'S' indicator in 'svn status' shows switched subdirs 
 * New --dry-run option added for 'svn merge' (issue #953)
 * Fix 'svn update .' to handle svn:externals correctly
 * Memory usage of 'svn import' reduced (issue #860)
 * Allow 'svn revert' on missing directories scheduled for deletion
 * Assorted bug fixes in several exciting flavors
 * Documentation improvements

 Developer-visible changes:
 * #911 (apr and apr-util version at build time)
 * Fixed issues #851, #894, 
 * Testing scripts accept --url=URL and BASE_URL=URL
 * Issue #881 (--enable-all-static)
 * Delta editors all converted to new-style, and editor composition is gone
 * Improve libsvn_wc wcprop handling (issue #806)
 * SWIG binding improvements
 * Various pool usage improvements


Version 0.14.5 [Alpha Interim 5] (released 30 Oct 2002, revision 3578)

 User-visible changes:
 * allow --incremental option for 'svn log' xml output

 Developer-visible changes:
 * autoconf bugfix for berkeley-db detection
 * clean up property interface mess (part of #806)
 * dish.sh bugfix:  build the new docbook docs correctly
 * python tests now log commands
 * gen-make.py now assumes 'build.conf'


Version 0.14.4 [Alpha Interim 4] (released 29 Oct 2002, revision 3553)

 User-visible changes:
 * new working-copy entry-caching: speeds many ops up to 5x (#749)
 * new 'svnadmin recover', instead of db_recover
 * client can now view & change server-side revision props (e.g. log messages)
 * new --non-interactive switch for commandline client
 * new --incremental option to 'svn log'
 * new -r {date} syntax for specifying dated revs; works over network too.
 * automatically set svn:executable prop when adding or importing (#870)
 * initial $EDITOR text now ignores all log data below special token
 * consistify behavior of text & prop columns in 'svn status' output.
 * .svn/auth/* files now chmod 700, to stop scaring people.  :-)
 * improved labels in 'svn diff' output (#936)
 * run-time adjustable neon timeout in newly renamed 'servers' config file
 * big improvements to cvs2svn script:  bugfixes and basic branch/tag support
 * new python access-control hook script
 * no more implicit dot-target for 'svn propedit' or 'svn propset' (#924)
 * Win32 improvements:
    - use system-wide config-file/registry
    - run-time configurable diff/diff3 binary locations (#668)
 * remove obsolete --xml-file support
 * Handbook is now ported to Docbook, 2 new chapters.

 Developer-visible changes:
 * abstracted option/help-parsing code, now shared between svn and svnadmin
 * require apache 2.0.42
 * use neon 0.23.5: fix XML entity derefs, SSL server certs, HP-UX build, etc.
 * support Berkeley DB 4.0 *or* 4.1
 * many SWIG binding improvements:
    - better overall coverage of apr and libsvn_* library symbols
    - new 'make swig-py-ext' and 'make install-swig-py-ext' targets
 * finish conversion of all editor/drivers to "new" style (#737)
 * removed xml-delta editors and editor drivers and related tests
 * new predicate-logic system added to automated-test system ("skip" support)
 * more work on mailer.py
 * no more lost commit messages (#761)
 * eradication of misused stringbufs, obsolete code removal (#909)
 * mem-leak fixes in libsvn_fs (#860)
 * improved atomicity of working-file translations (#914)
 * improve ./configure --help output (#949)
 * MANY bugfixes, especially for entry-locks (#931, #932, #847, #938),
   merges (#880, ), auth storage (#934); also #921 (svnadmin
   segfault), #907 (xml quoting), #918 (post-commit processing), #935
   (path canonicalization), #779 (diff errors)


Version 0.14.3 [Alpha Interim 3] (released 20 Sept 2002, revision 3200)

 User-visible changes:
 * new ~/.subversion/config file
 * new $Id$ keyword
 * new client --no-auth-cache option
 * empty values in the Windows Registry are no longer ignored (issue #671)
 * report details of repository start-commit or pre-commit hook errors
 * fix locking behaviour when using current directory as a target
 * updated man page
 * new front-page logo.  :-)

 Developer-visible changes:
 * continuing work on python SWIG bindings
 * continuing work on new access-baton system for libsvn_wc
 * upgrade to neon 0.23.4 to fix Windows build issues and seg faults
 * add XFAIL to the C testing framework
 * prevent setting of certain svn: props on incorrect file types
 * cleanup libsvn_subr's path library behavior
 * new 'fast-clean' vs. 'clean' Makefile targets
 * various bugfixes, tweaks, cleanups.


Version 0.14.2 [Alpha Interim 2] (released 22 Aug 2002, revision 3033)

 User-visible changes:
 * fs schema change, see issue #842. **NOTE: repos dump/load cycle required!**
 * new 'svn ls -R' option
 * new status code `~', for type changes
 * add --username and --password options to 'svn ls'
 * new script tools/client-side/svn_all_diffs.pl
 * new script tools/examples/blame.py (draft)

 Developer-visible changes:
 * test suite now does XFAIL and XPASS
 * test suite over DAV now uses SVNParentPath, no longer depends on symlinks
 * DAV tests now work on Windows
 * upgrade to neon 0.22.0
 * 'make install' notices the $(DESTDIR) parameter
 * new dav prop namespaces, but old still sent for compat; see issue #840
 * error code space reorganized, see issue #702
 * many cleanups to path handling
 * more use of access batons in libsvn_wc, see issue #749
 * working props now stored with ".svn-work" extension, see issue #618
 * the usual round of bug fixes, new regression tests, etc


Version 0.14.1 [Alpha Interim 1] (released 9 August 2002, revision 2927)

 User-visible changes:
 * show copy-ancestry in 'svn log -v'
 * 'svn co' can take multiple URLs now
 * new 'svn ls' command
 * new 'svn st --no-ignore' option
 * new 'svn --version --quiet' option
 * more conservative 'svn help' usage error-message
 * more graceful degradation from charset conversion failure
 * standardize policy of -q switch behavior
 * less intimidating error output
 * new SVNParentPath directive for mod_dav_svn <Location>s
 * svnlook now correctly displays copied subtrees
 * Handbook: additions, tweaks, cleanups, and new French Translation :-)
 * svn_load_dirs.pl: auto propset on files matching specified regex, bug fixes

 Developer-visible changes:
 * integrated the delta-combiner! (issue #531)
 * integration of libsvn_wc-baton-locking branch (issue #749)
 * new "skip-deltas" added to delta-combiner
 * properly URI-encode/decode path components throughout our code
 * RA->do_diff() made independent from RA->do_switch().
 * stricter setting/parsing of svn:mime-type property in client and server.
 * new 'install-static' make target
 * extend SWIG bindings to libsvn_wc and libsvn_client
 * BerkeleyDB usage tweaking:  in preparation for auto-recovery features.
 * work on #850 (.dsp generator)
 * Better support for incremental dumps (see revision 2920)
 * started fs branch work on #842 (copyID inheritance), #830 (copies of
   copies), #790 (copy table uses txnID), #815 (custom sorting)
 * numerous bugfixes: #709 (better error handling), #813/814
   (apr_filepath_merge), #685 (showing dir propdiffs), OS X dumper
   bugfix, #561 (property conflict detection), mod_dav_svn path bugs,
   svn_wc_status() bugs, path canonicalization bugs, #816 (svn log  -r), 
   #843 (URL keyword), #846 (kind-change replacement), #809 ($EDITOR dir),
   #855 (module updates not cooperating with new wc access batons),
   improvements to test suite sensitivity, 


Version 0.14.0 [Alpha] (released 23 July 2002, revision 2667)

 User-visible changes:
 * finally some documentation: The Subversion Handbook
 * i18n support for paths, prop names, and log messages; (not on Win32 yet)
 * support for URI-escaped paths
 * "-R" is now short for --recursive, and "-N" replaces "-n"
 * add the -R option to 'svn info' and 'svn resolve'
 * new syntax for 'svn switch' and 'svn co'
 * new 'svn-config' file installed
 * new commit-access-control.pl utility (feature #775)
 * new vc-svn.el, first pass at Emacs VC support for Subversion
 * lots of work on svn_load_dirs.pl (provides vendor-branch-like features)
 * new --message-encoding option for logfiles given by -F
 * support win32 drive-letters in file:/// urls
 * improved date output syntax: ISO-8601 prefix, then human-friendly suffix
 * the usual round of bug fixes

 Developer-visible changes:
 * UTF-8 changes
    - all libraries now assume UTF-8 input paths and log msgs
    - many apr calls are now abstracted into new svn_io_* wrappers
 * fs schema change
    - cache each revision's changed-paths in a new 'changes' table
    - another repository dump/load is required
 * a number of fs-dumper bugfixes and redesigns
 * test suite is now all python, so it can run on win32
 * reduce huge memory consumption of mod_dav_svn during checkouts
 * memory optimizations for prop-reading and 'svn diff'
 * bugfixes for commit-email.pl and tweak-log.cgi
 * lots of branch work on the delta-combiner and on libsvn_wc rewrite
 * numerous bugfixes: 'svn merge .' bug (#748), bug #764, two new
   ghudson-dirversioning bugs, #756, #675, #783, #796, wc-root bugs,
   #799, #800, #797, directory-removal bugs (#611, #687)


Version 0.13.2 [Pre-Alpha] (released 28 June 2002, revision 2376)

 User-visible changes:
 * fixed various buggy commandline outputs
 * allow global/local config-files on win32
 * prevent overwrites with 'svn cp URL URL'
 * improvements to svn_load_dirs.pl
 * mod_dav_svn can generate xml output for directory GETs
 * new svnadmin(1) man page

 Developer-visible changes:
 * finished notification callback system, no more buggy output
 * fs-changes:
    - revisions table nothing but an index to txns table
    - branch work-in-progress:  new 'changes' table to store changed paths
 * more work on svn_time_* funcs and formats (moving towards ISO8601)
 * property reversion bugs fixed, dumper bug fixed
 * add version number to svndiff database storage
 * new regression tests for 'svn merge'
 * fix 'svn diff -rX:Y' server bug
 * fix bugs in python test system
 * bring win32 build up-to-date, get most python tests working on win32
 

Version 0.13.1 [Pre-Alpha] (released 20 June 2002, revision 2291)

 User-visible changes:
 * "modules" are now implemented
 * new 'svn export' command
 * 'svn log' now traverses copy history and can print changed paths
 * 'svn merge' now (temporarily) only merges into '.'
 * 'svnadmin lscr' now traverses copy history
 * changes to the 'svn:executable' prop take effect immediately now
 * server is more tolerant of wc's with old-style version resource URLs
 * new Handbook started
 * commit-email.pl fixes/improvements -- now shows prop mods and copy history
 * bug fixes to cp, rm, merge, revert, admin dump and load, svnlook

 Developer-visible changes:
 * headers now install in subdir and libs are named libsvn_FOO-1.so
 * improvements to the Python test suite
 * delta combiner implemented (unused for now, though)
 * Python SWIG binding improvements: ability to write an editor in Python
 * new example: tools/examples/svnlook.py
 * start moving libsvn_client to new notification system (no composed editors!)
 * upgrade to neon 0.21.2, fixing deflated communication with apache
 * Moved Berkeley-specific code to libsvn_fs/bdb/, skels into libsvn_fs/util/
 * changes to the RPM packaging


Version 0.13.0 [Pre-Alpha] (released 10 June 2002, revision 2140)

 User-visible changes:
 * repositories have a new database schema;  existing ones must be upgraded!
    - new svnadmin 'dump'/'load' commands to migrate repositories
    - read http://svn.collab.net/repos/svn/trunk/notes/repos_upgrade_HOWTO

 Developer-visible changes:
 * complete rewrite of filesystem schema!
    - skels are abstracted away, opening the door to SQL backends
    - node-ids now have copy IDs
 * huge progress on module system [only checkouts work at the moment]
 * massive conversion of stringbufs to char* in our public APIs
 * vsn-rsc-urls are now based on created-rev/path instead of fs_id_t's.
 * reinstate 'deleted' flag on entries, to ensure accurate update reports
 * dir_delta learns how to send copy history
    - svnlook no longer sends 10MB emails when we make a branch
    - dumpfiles get much smaller
 * memory consumption reduced via new apr-pool code that reuses/frees mem
 * client can now parse ISO-8601 timestamps (start of issue 614)
 * added script for stress-testing concurrent repository access
 * auto-locate apache's apr libraries at build-time
 * beginnings of ra_pipe library
 * progress on delta combiner code
 * many memleaks fixed, thanks to valgrind!
 * upgrade to newest neon, allow deflated communication with apache
 * many bugfixes to merge, switch, checkout, rm; tackling of issues 704,
   705, 698, 711, 713, 721, 718 and many others


Version 0.12.0 (released 3 May 2002, revision 1868)

 User-visible changes:
 * 'svn diff' can now compare two arbitrary URLs
 * 'svn diff' now displays property changes
 * 'svn rm' requires --force for unversioned and/or modified items
 * 'svn rm' immediately removes files & uncommitted dirs
 * 'svn mv' for WC->WC behaves like 'svn rm' with respect to the source
 * checkouts, updates, switches now print received revision on final line.
 * new 'svn info' command prints information about a versioned resource.
 * switch to 2-part conflict markers (diff3 -E) instead of 3-part (diff3 -A)
 * new bash programmable completion file
 * file's executable bit can be versioned (svn:executable prop)
 * commits and imports now support --nonrecursive option
 * new --xml option for 'svn log'
 * new 'svnadmin dump' command

 Developer-visible changes:
 * updates correctly deal with disjoint urls.
 * libsvn_wc now checksums text-bases, to detect working copy corruption
 * cached wcprops (vsn-rsc-urls) now auto-regenerate if invalid
 * python testsuite now runs on Win32.
 * new switch_tests.py added to testsuite
 * NEW internalized diff/diff3 library.  Not yet integrated/tested.
 * dir_delta sends entry props; pipe-editor removed.
 * no more expat/ tree;  use apr-util's expat instead.
 * fs deltificaton happens outside commit process, using fewer db locks
 * privatize svn_fs_id_t structure
 * start abstracting skels out of libsvn_fs
 * new docs: secure coding tips, quickref card
 * memory bugfixes for import/commit/mass removals
 * many bugfixes: issues 644, 646, 691, 693, 694, 543, 684


Version 0.11.1 (released 12 April 2002, revision 1692, branches/0.11.0)

 User-visible changes:
 * completion of 'svn merge' (issue 504)
 * added SVNReposName directive to mod_dav_svn
 * insist on a diff binary that supports "-u"
 * fix and unify pop-up $EDITOR behaviors (issues 638, 633, 615)

 Developer-visible changes:
 * finish rewrite of commit system to handle disjoint urls (issue 575)
 * finish proxy support via config files (esp. on win32) (issue 579)
 * fix svn_ra_dav__get_baseline_info and related bugs (issue 581)
 * reorganization of libsvn_wc header files & API
 * new getopt_tests.py to test commandline option processing
 * 'make check' now more portable -- tests invoked via python, not sh
 * miscellaneous bugfixes in imports, svndiff, db linkage.


Version 0.11.0 (unreleased)


Version 0.10.2 (released 25 Mar 2002, revision 1587)

 User-visible changes:
 * new ~/.subversion configuration directory
 * proxy support via ~/.subversion/proxies file
          
 Developer-visible changes:
 * rewrite of client-side commit process partially done
 * beginnings of 'svn merge'
 * mod_dav_svn now generates "streamy" report responses
 * stringbuf cleanups and bugfixes
 * interface to svn_wc_entry_t cleaned up
 * tweaks to build system and freebsd port
 * miscellaneous bugfixes in path escaping, pool usage, hp-ux compilation


Version 0.10.1 (released 17 Mar 2002, revision 1537)

 User-visible changes:
 * New --targets command-line option for some commands.
 * conflicts now create conflict-markers in files, and 3 fulltext backups.
 * new 'svn resolve' command removes conflicted state (by removing backups)
  
 Developer-visible changes:
 * no more dependency on 'patch'; only on GNU diff3 and some version of 'diff'
 * complete rewrite of svn_wc_entry_t interface
 * begin abstracting svn_fs API by hiding implementation details
 * consolidate RA layer callbacks
 * start work on commit-driver rewrite
 * start work on ~/.subversion/ configuration directory, and proxy support
 * move a lot of svn_wc.h into private wc.h
 * bugfixes relating to commits, network prop xfers, 'svn log', 'svn co -q'
 * major deletion bug fixed 
   (see email WARNING: 
    http://subversion.tigris.org/servlets/ReadMsg?msgId=64442&listName=dev)


Version 0.10.0 (released 08 Mar 2002, revision 1467)

 User-visible changes:
 * fewer out-of-memory errors:  (see "memory consumption" below)
 * clearer user errors:  
    - detailed marshalling of server errors to client
    - better errors from ra_dav
    - better commandline-client-specific error messages
 * 'svn log' now works on single paths correctly
 * show locked directories in 'svn status'
 * 'svnadmin lstxns' improvements, and new --long switch
 * commits show "Replacing" instead of "Deleting/Adding" (#571)
 * commits show progress on postfix txdeltas.
 * WARNING:  existing repositories need to be upgraded;
             read tools/enable-dupkeys.sh.

 Developer-visible changes:
 * reduced memory consumption
    - new Editor interface that manages pools automatically
    - conversion of most existing editors to new system
    - have libsvn_fs write data to DB streamily
    - reduce DB logfile growth via 'duplicate keys'
    - stop using one pool for post-commit processing
    - stop using one pool for sending all textdeltas
    - many, many other pool-usage improvements in libsvn_wc, ra_dav, etc.
 * start of work on 'svn merge": issue 504, and diff3 integration
 * start of work on disjoint-url detection:  issue 575
 * start removing stringbuf path library funcs; use new const char * funcs
 * better python 2.X detection in test suite
 * svnlook uses single tempdir
 * build system evolution
    - upgrade to neon 0.19.[2-3]
    - lots of work on FreeBSD port
 * many small bugfixes: 
    - propedit, file merges, revert, dir_delta, keywords
    - memory leaks in 'svn add', 'svn import/commit', and svnlook
    - date-parsing and readonly bugs


Version 0.9 (released 15 Feb 2002, revision 1302)

 User-visible changes:
 * 'svn switch', for switching part of a working copy to a branch
 * 'svn status -v' now shows created-rev and last-author info
 * 'svn help <subcommand>' now shows proper switches
 * if no log message passed to commit, $EDITOR pops up
 * greatly improved/re-organized README, INSTALL, and HACKING docs
 * big progress on cvs2svn repository converter
 * faster retrieval of old revisions: turn off fs directory deltification
 * fixed broken behaviors in 'svn diff' and 'svn log'

 Developer-visible changes:
 * new fs code for detecting differences and relatedness
 * new cancellation editor, for event-driven users of libsvn_client
 * make .svn/ area readonly
 * continued development of ruby, java, and python (swig) bindings
 * new config-file parser
 * code reorganization and cleanup
    - huge conversion of svn_stringbuf_t --> char *
    - standardized on commit_info return structure
    - no more 'path styles' in path library
    - rewrite bootstrapping code for python test framework
    - rewrite commandline app's help-system and alias-system
    - feedback table replaced with notfication callback
    - rewrite sorting of hashes
    - svnadmin internal rewrite
    - faster post-update processing
    - using SVN_ERR macros where they weren't
    - new svn_client_revision_t mechanism
    - txdelta windows are readonly now
    - pool debugging code moved to APR
    - various pool-usage fixes
 * build system evolution
    - apr-util now required
    - upgrade to neon 0.18.5
    - much apr m4 macro churn
    - win32 updates, no longer needs precompiled neon
    - 'make check' when builddir != srcdir
 * fixes for many issues, including #624, 627, 580, 598, 591,
   607. 609, 590, 565


[Versions 0.8 and older are only brief summaries]

Version 0.8  (released 15 Jan 2002, revision 909)

 * newline conversion and keyword substitution (#524)
 * rewrite ra_local commit system to commit against HEAD (#463)
 * mod_dav_svn sends svndiffs now (#518)
 * code migration from libsvn_fs to libsvn_repos (#428)


Version 0.7  (released 03 Dec 2001, revision 587)

 * 'svn cp/mv' completed:  
    - can copy from wc/repos to wc/repos
    - This how we create branches/tags
 * 'svn mkdir' [WC_PATH|REPOS_URL]
 * 'svn delete' [REPOS_URL]


Version 0.6  (released 12 Nov 2001, revision 444)

 * 'svn log'
 * 'svn cp/mv' from wc to wc


Milestones M4/M5  (released 19 Oct 2001, revision 271)

 * network layer bugfixes
 * filesystem deltification


Milestone M3  (released 30 Aug 2001, revision 1)

 * self-hosting begins, all history left behind in CVS repository.


Milestone M2  (released 15 May 2001, from CVS, "milestone-2" tag)

 * filesystem library (libsvn_fs)
 * network layer (libsvn_ra_dav and mod_dav_svn)


Milestone M1  (released 20 Oct 2000, from CVS, "milestone-1" tag)

 * working-copy library (libsvn_wc), using XML files


Birth  (05 June 2000)

 * CVS repository created.
