Apache CouchDB CHANGES
======================

Version 1.3.1
-------------

Replicator:

 * Tolerate missing source and target fields in _replicator docs (COUCHDB-1788).

Log System:

 * Don't log about missing .compact files.
 * Fix bug in WARN level logging from 1.3.0 (COUCHDB-1794).

View Server:

 * Fix the -S option to couchjs to increase memory limits (COUCHDB-1792).

Misc:

 * Improve documentation: better structure, improve language, less duplication.
 * Improvements to test suite and VPATH build system.

Version 1.3.0
-------------

HTTP Interface:

 * No longer rewrites the X-CouchDB-Requested-Path during recursive calls to the
   rewriter.
 * Limit recursion depth in the URL rewriter. Defaults to a maximum of 100
   invocations but is configurable.
 * Fix _session for IE7.
 * Added Server-Sent Events protocol to db changes API. See
   http://www.w3.org/TR/eventsource/ for details.
 * Make password hashing synchronous when using the /_config/admins API.
 * Include user name in show/list ETags.
 * Experimental support for Cross-Origin Resource Sharing (CORS). See 
   http://www.w3.org/TR/cors/ for details.

Replicator:

 * The replicator will use a new server-wide UUID in checkpoint IDs to
   improve the chances of an efficient resume.

Storage System:

 * Fixed unnecessary conflict when deleting and creating a
   document in the same batch.

View Server:

 * Additional response headers may be varied prior to send().
 * GetRow() is now side-effect free.

Futon:

 * Disabled the link to the Futon test suite. These tests were causing problems
   when run from a browser, and are now available via the CLI instead.
 * Added view request duration to Futon.
 * Disable buttons for actions that the user doesn't have permissions to.

Docs:

 * Import initial documentation and converted to RST format.
 * Set up Sphinx configuration and integrated into the build system.
 * Serve up HTML manual from Futon, with a link in the sidebar.
 * PDF and info version of the manual also installed.
  
Security:

 * Passwords are now hashed using the PBKDF2 algorithm with a configurable work
   factor.

Test Suite:

 * Moved the JS test suite to the CLI.
 * Improved tracebacks printed by the JS CLI tests.
 * Improved the reliability of a number of tests.

UUID Algorithms:

 * Added the utc_id algorithm.

URL Rewriter & Vhosts:

 * Database name is encoded during rewriting (allowing embedded /'s, etc).
 * Reset rewrite counter on new request, avoiding unnecessary request failures
   due to bogus rewrite limit reports.

Build System:

 * C/C++ compiler detection has been improved.
 * Autoconf v2.63 is now required if building from Git checkout directly. See
   DEVELOPERS file for more details.
 * Fixed issue in couchdb script where stopped status returns before process
   exits.

Version 1.2.2
-------------

HTTP Interface:

 * Reset rewrite counter on new request, avoiding unnecessary request failures
   due to bogus rewrite limit reports.

Build System:

 * Fixed issue in couchdb script where stopped status returns before process
   exits.

Version 1.2.1
-------------

Security:

 * Fixed CVE-2012-5641: Apache CouchDB Information disclosure via unescaped
   backslashes in URLs on Windows
 * Fixed CVE-2012-5649: Apache CouchDB JSONP arbitrary code execution with Adobe
   Flash
 * Fixed CVE-2012-5650: Apache CouchDB DOM based Cross-Site Scripting via Futon
   UI

HTTP Interface:

 * No longer rewrites the X-CouchDB-Requested-Path during recursive
   calls to the rewriter.
 * Limit recursion depth in the URL rewriter. Defaults to a maximum
   of 100 invocations but is configurable.

Build System:

 * Fix couchdb start script.
 * Win: fix linker invocations.

Futon:

 * Disable buttons that aren't available for the logged-in user.

Replication:

 * Fix potential timeouts.

View System:

 * Change use of signals to avoid broken view groups.

Version 1.2.0
-------------

Authentication:

 * Fix use of OAuth with VHosts and URL rewriting.
 * OAuth secrets can now be stored in the users system database
   as an alternative to key value pairs in the .ini configuration.
   By default this is disabled (secrets are stored in the .ini)
   but can be enabled via the .ini configuration key `use_users_db`
   in the `couch_httpd_oauth` section.
 * Documents in the _users database are no longer publicly
   readable.
 * Confidential information in the _replication database is no
   longer publicly readable.
 * Password hashes are now calculated by CouchDB. Clients are no
   longer required to do this manually.
 * Cookies used for authentication can be made persistent by enabling
   the .ini configuration key `allow_persistent_cookies' in the
   `couch_httpd_auth` section.

Build System:

 * cURL is no longer required to build CouchDB as it is only
   used by the command line JS test runner. If cURL is available
   when building CouchJS you can enable the HTTP bindings by
   passing -H on the command line.
 * Temporarily made `make check` pass with R15B. A more thorough
   fix is in the works (COUCHDB-1424).
 * Fixed --with-js-include and --with-js-lib options.
 * Added --with-js-lib-name option.

HTTP Interface:

 * Added a native JSON parser.
 * The _active_tasks API now offers more granular fields. Each
   task type is now able to expose different properties.
 * Added built-in changes feed filter `_view`.
 * Fixes to the `_changes` feed heartbeat option which caused
   heartbeats to be missed when used with a filter. This caused
   timeouts of continuous pull replications with a filter.
 * Properly restart the SSL socket on configuration changes.

Replicator:

 * A new replicator implementation. It offers more performance and
   configuration options.
 * Passing non-string values to query_params is now a 400 bad
   request. This is to reduce the surprise that all parameters
   are converted to strings internally.
 * Added optional field `since_seq` to replication objects/documents.
   It allows to bootstrap a replication from a specific source sequence
   number.
 * Simpler replication cancellation. In addition to the current method,
   replications can now be canceled by specifying the replication ID
   instead of the original replication object/document.

Storage System:

 * Added optional database and view index file compression (using Google's
   snappy or zlib's deflate). This feature is enabled by default, but it
   can be disabled by adapting local.ini accordingly. The on-disk format
   is upgraded on compaction and new DB/view creation to support this.
 * Several performance improvements, most notably regarding database writes
   and view indexing.
 * Computation of the size of the latest MVCC snapshot data and all its
   supporting metadata, both for database and view index files. This
   information is exposed as the `data_size` attribute in the database and
   view group information URIs.
 * The size of the buffers used for database and view compaction is now
   configurable.
 * Added support for automatic database and view compaction. This feature
   is disabled by default, but it can be enabled via the .ini configuration.
 * Performance improvements for the built-in changes feed filters `_doc_ids`
   and `_design'.

View Server:

 * Add CoffeeScript (http://coffeescript.org/) as a first class view server
   language.
 * Fixed old index file descriptor leaks after a view cleanup.
 * The requested_path property keeps the pre-rewrite path even when no VHost
   configuration is matched.
 * Fixed incorrect reduce query results when using pagination parameters.
 * Made icu_driver work with Erlang R15B and later.
 * Avoid invalidating view indexes when running out of file descriptors
   (COUCHDB-1445).

OAuth:

 * Updated bundled erlang_oauth library to the latest version.

Futon:

 * The `Status` screen (active tasks) now displays two new task status
   fields: `Started on` and `Updated on`.
 * Futon remembers view code every time it is saved, allowing to save an
   edit that amounts to a revert.

Log System:

 * Log correct stacktrace in all cases.
 * Improvements to log messages for file-related errors.

Version 1.1.2
-------------

Security:

 * Fixed CVE-2012-5641: Apache CouchDB Information disclosure via unescaped
   backslashes in URLs on Windows
 * Fixed CVE-2012-5649: Apache CouchDB JSONP arbitrary code execution with
   Adobe Flash
 * Fixed CVE-2012-5650: Apache CouchDB DOM based Cross-Site Scripting via Futon
   UI

HTTP Interface:

 * ETag of attachment changes only when the attachment changes, not
   the document.
 * Fix retrieval of headers larger than 4k.
 * Allow OPTIONS HTTP method for list requests.
 * Don't attempt to encode invalid json.

Replicator:

 * Fix pull replication of documents with many revisions.
 * Fix replication from an HTTP source to an HTTP target.

View Server:

 * Avoid invalidating view indexes when running out of file descriptors.

Log System:

 * Improvements to log messages for file-related errors.

Build System:

 * Don't `ln` the `couchjs` install target on Windows
 * Remove ICU version dependency on Windows.
 * Improve SpiderMonkey version detection.

Version 1.1.1
-------------

HTTP Interface:

 * Add configurable maximum to the number of bytes returned by _log.
 * ETags for views include current sequence if include_docs=true.
 * Fix bug where duplicates can appear in _changes feed.
 * Fix missing revisions in _changes?style=all_docs.
 * JSONP responses now send "text/javascript" for Content-Type.
 * Permit forward slashes in path to update functions.
 * Status code can be specified in update handlers.
 * _view_cleanup when ddoc has no views now removes all index files.
 * Fixes to the document multipart PUT API.

Core Database:

 * Fixes regarding file descriptor leaks for databases with views.
 * Fix bug where update handlers break after conflict resolution.
 * Fix file descriptor leak in _log
 * Improve handling of compaction at max_dbs_open limit.
 * Fix crashes when compacting large views.

Query Server:

 * Support SpiderMonkey 1.8.5
 * Support provides() in show functions.
 * Fix deadlock when assigning couchjs processes to serve requests.
 * Allow CommonJS modules to be an empty string.
 * Reap couchjs processes that hit reduce_overflow error.

Replicator:

 * max_replication_retry_count now supports "infinity".
 * Fix replication crash when source database has a document with empty ID.
 * Fix bug with _replicator where include "filter" could crash couch.

Misc:

 * Bump minimum Erlang version to R13B02.
 * Link to ICU 4.2 on Windows.
 * Do not run deleted validate_doc_update functions.

Version 1.1.0
-------------

All CHANGES for 1.0.2 and 1.0.3 also apply to 1.1.0.

HTTP Interface:

 * Native SSL support.
 * Added support for HTTP range requests for attachments.
 * Added built-in filters for `_changes`: `_doc_ids` and `_design`.
 * Added configuration option for TCP_NODELAY aka "Nagle".
 * Allow POSTing arguments to `_changes`.
 * Allow `keys` parameter for GET requests to views.
 * Allow wildcards in vhosts definitions.
 * More granular ETag support for views.
 * More flexible URL rewriter.
 * Added support for recognizing "Q values" and media parameters in
   HTTP Accept headers.
 * Validate doc ids that come from a PUT to a URL.

Externals:

 * Added OS Process module to manage daemons outside of CouchDB.
 * Added HTTP Proxy handler for more scalable externals.

Replicator:

 * Added `_replicator` database to manage replications.
 * Fixed issues when an endpoint is a remote database accessible via SSL.
 * Added support for continuous by-doc-IDs replication.
 * Fix issue where revision info was omitted when replicating attachments.
 * Integrity of attachment replication is now verified by MD5.

Storage System:

 * Multiple micro-optimizations when reading data.

View Server:

 * Added CommonJS support to map functions.
 * Added `stale=update_after` query option that triggers a view update after
   returning a `stale=ok` response.
 * Warn about empty result caused by `startkey` and `endkey` limiting.
 * Built-in reduce function `_sum` now accepts lists of integers as input.
 * Added view query aliases start_key, end_key, start_key_doc_id and
   end_key_doc_id.

Futon:

 * Added a "change password"-feature to Futon.

URL Rewriter & Vhosts:

 * Fix for variable substituion

Version 1.0.4
-------------

Security:

 * Fixed CVE-2012-5641: Apache CouchDB Information disclosure via unescaped
   backslashes in URLs on Windows
 * Fixed CVE-2012-5649: Apache CouchDB JSONP arbitrary code execution with
   Adobe Flash
 * Fixed CVE-2012-5650: Apache CouchDB DOM based Cross-Site Scripting via Futon
   UI

Log System:

 * Fix file descriptor leak in _log.

HTTP Interface:

 * Fix missing revisions in _changes?style=all_docs.
 * Fix validation of attachment names.

View System:

 * Avoid invalidating view indexes when running out of file descriptors.

Replicator:

 * Fix a race condition where replications can go stale

Version 1.0.3
-------------

General:

 * Fixed compatibility issues with Erlang R14B02.

HTTP Interface:

 * Fix bug that allows invalid UTF-8 after valid escapes.
 * The query parameter `include_docs` now honors the parameter `conflicts`.
   This applies to queries against map views, _all_docs and _changes.
 * Added support for inclusive_end with reduce views.

Storage System:

 * More performant queries against _changes and _all_docs when using the
  `include_docs` parameter.

Replicator:

 * Enabled replication over IPv6.
 * Fixed for crashes in continuous and filtered changes feeds.
 * Fixed error when restarting replications in OTP R14B02.
 * Upgrade ibrowse to version 2.2.0.
 * Fixed bug when using a filter and a limit of 1.

Security:

 * Fixed OAuth signature computation in OTP R14B02.
 * Handle passwords with : in them.

Futon:

 * Made compatible with jQuery 1.5.x.

Etap Test Suite:

 * Etap tests no longer require use of port 5984. They now use a randomly
   selected port so they won't clash with a running CouchDB.

Windows:

 * Windows builds now require ICU >= 4.4.0 and Erlang >= R14B03. See
   COUCHDB-1152, and COUCHDB-963 + OTP-9139 for more information.

Version 1.0.2
-------------

Security:

 * Fixed CVE-2010-3854: Apache CouchDB Cross Site Scripting Issue

Futon:

 * Make test suite work with Safari and Chrome.
 * Fixed animated progress spinner.
 * Fix raw view document link due to overzealous URI encoding.
 * Spell javascript correctly in loadScript(uri).

Storage System:

 * Fix leaking file handles after compacting databases and views.
 * Fix databases forgetting their validation function after compaction.
 * Fix occasional timeout errors after successfully compacting large databases.
 * Fix ocassional error when writing to a database that has just been compacted.
 * Fix occasional timeout errors on systems with slow or heavily loaded IO.
 * Fix for OOME when compactions include documents with many conflicts.
 * Fix for missing attachment compression when MIME types included parameters.
 * Preserve purge metadata during compaction to avoid spurious view rebuilds.
 * Fix spurious conflicts introduced when uploading an attachment after
   a doc has been in a conflict. See COUCHDB-902 for details.
 * Fix for frequently edited documents in multi-master deployments being
   duplicated in _changes and _all_docs.  See COUCHDDB-968 for details on how
   to repair.
 * Significantly higher read and write throughput against database and
   view index files.

Log System:

 * Reduce lengthy stack traces.
 * Allow logging of native <xml> types.

HTTP Interface:

 * Allow reduce=false parameter in map-only views.
 * Fix parsing of Accept headers.
 * Fix for multipart GET APIs when an attachment was created during a
   local-local replication. See COUCHDB-1022 for details.

Replicator:

 * Updated ibrowse library to 2.1.2 fixing numerous replication issues.
 * Make sure that the replicator respects HTTP settings defined in the config.
 * Fix error when the ibrowse connection closes unexpectedly.
 * Fix authenticated replication (with HTTP basic auth) of design documents
   with attachments.
 * Various fixes to make replication more resilient for edge-cases.

View Server:

 * Don't trigger view updates when requesting `_design/doc/_info`.
 * Fix for circular references in CommonJS requires.
 * Made isArray() function available to functions executed in the query server.
 * Documents are now sealed before being passed to map functions.
 * Force view compaction failure when duplicated document data exists. When
   this error is seen in the logs users should rebuild their views from
   scratch to fix the issue. See COUCHDB-999 for details.

Version 1.0.1
-------------

Security:

 * Fixed CVE-2010-2234: Apache CouchDB Cross Site Request Forgery Attack

Storage System:

 * Fix data corruption bug COUCHDB-844. Please see
   http://couchdb.apache.org/notice/1.0.1.html for details.

Replicator:

 * Added support for replication via an HTTP/HTTPS proxy.
 * Fix pull replication of attachments from 0.11 to 1.0.x.
 * Make the _changes feed work with non-integer seqnums.

HTTP Interface:

 * Expose `committed_update_seq` for monitoring purposes.
 * Show fields saved along with _deleted=true. Allows for auditing of deletes.
 * More robust Accept-header detection.

Authentication:

 * Enable basic-auth popup when required to access the server, to prevent
   people from getting locked out.

Futon:

 * User interface element for querying stale (cached) views.

Build and System Integration:

 * Included additional source files for distribution.

Version 1.0.0
-------------

Security:

 * Added authentication caching, to avoid repeated opening and closing of the
   users database for each request requiring authentication.

Storage System:

 * Small optimization for reordering result lists.
 * More efficient header commits.
 * Use O_APPEND to save lseeks.
 * Faster implementation of pread_iolist(). Further improves performance on
   concurrent reads.

View Server:

 * Faster default view collation.
 * Added option to include update_seq in view responses.

Version 0.11.2
--------------

Security:

 * Fixed CVE-2010-2234: Apache CouchDB Cross Site Request Forgery Attack
 * Avoid potential DOS attack by guarding all creation of atoms.

Replicator:

 * Fix bug when pushing design docs by non-admins, which was hanging the
   replicator for no good reason.
 * Fix bug when pulling design documents from a source that requires
   basic-auth.

HTTP Interface:

 * Better error messages on invalid URL requests.

Authentication:

 * User documents can now be deleted by admins or the user.

Futon:

 * Add some Futon files that were missing from the Makefile.

Version 0.11.1
--------------

HTTP Interface:

 * Mask passwords in active tasks and logging.
 * Update mochijson2 to allow output of BigNums not in float form.
 * Added support for X-HTTP-METHOD-OVERRIDE.
 * Better error message for database names.
 * Disable jsonp by default.
 * Accept gzip encoded standalone attachments.
 * Made max_concurrent_connections configurable.
 * Made changes API more robust.
 * Send newly generated document rev to callers of an update function.

Futon:

 * Use "expando links" for over-long document values in Futon.
 * Added continuous replication option.
 * Added option to replicating test results anonymously to a community
   CouchDB instance.
 * Allow creation and deletion of config entries.
 * Fixed display issues with doc ids that have escaped characters.
 * Fixed various UI issues.

Build and System Integration:

 * Output of `couchdb --help` has been improved.
 * Fixed compatibility with the Erlang R14 series.
 * Fixed warnings on Linux builds.
 * Fixed build error when aclocal needs to be called during the build.
 * Require ICU 4.3.1.
 * Fixed compatibility with Solaris.

Security:

 * Added authentication redirect URL to log in clients.
 * Fixed query parameter encoding issue in oauth.js.
 * Made authentication timeout configurable.
 * Temporary views are now admin-only resources.

Storage System:

 * Don't require a revpos for attachment stubs.
 * Added checking to ensure when a revpos is sent with an attachment stub,
   it's correct.
 * Make file deletions async to avoid pauses during compaction and db
   deletion.
 * Fixed for wrong offset when writing headers and converting them to blocks,
   only triggered when header is larger than 4k.
 * Preserve _revs_limit and instance_start_time after compaction.

Configuration System:

 * Fixed timeout with large .ini files.

JavaScript Clients:

 * Added tests for couch.js and jquery.couch.js
 * Added changes handler to jquery.couch.js.
 * Added cache busting to jquery.couch.js if the user agent is msie.
 * Added support for multi-document-fetch (via _all_docs) to jquery.couch.js.
 * Added attachment versioning to jquery.couch.js.
 * Added option to control ensure_full_commit to jquery.couch.js.
 * Added list functionality to jquery.couch.js.
 * Fixed issues where bulkSave() wasn't sending a POST body.

View Server:

 * Provide a UUID to update functions (and all other functions) that they can
   use to create new docs.
 * Upgrade CommonJS modules support to 1.1.1.
 * Fixed erlang filter funs and normalize filter fun API.
 * Fixed hang in view shutdown.

Log System:

 * Log HEAD requests as HEAD, not GET.
 * Keep massive JSON blobs out of the error log.
 * Fixed a timeout issue.

Replication System:

 * Refactored various internal APIs related to attachment streaming.
 * Fixed hanging replication.
 * Fixed keepalive issue.

URL Rewriter & Vhosts:

 * Allow more complex keys in rewriter.
 * Allow global rewrites so system defaults are available in vhosts.
 * Allow isolation of databases with vhosts.
 * Fix issue with passing variables to query parameters.

Test Suite:

 * Made the test suite overall more reliable.

Version 0.11.0
--------------

Security:

 * Fixed CVE-2010-0009: Apache CouchDB Timing Attack Vulnerability.
 * Added default cookie-authentication and users database.
 * Added Futon user interface for user signup and login.
 * Added per-database reader access control lists.
 * Added per-database security object for configuration data in validation
   functions.
 * Added proxy authentication handler

HTTP Interface:

 * Provide Content-MD5 header support for attachments.
 * Added URL Rewriter handler.
 * Added virtual host handling.

View Server:

 * Added optional 'raw' binary collation for faster view builds where Unicode
   collation is not important.
 * Improved view index build time by reducing ICU collation callouts.
 * Improved view information objects.
 * Bug fix for partial updates during view builds.
 * Move query server to a design-doc based protocol.
 * Use json2.js for JSON serialization for compatiblity with native JSON.
 * Major refactoring of couchjs to lay the groundwork for disabling cURL
   support. The new HTTP interaction acts like a synchronous XHR. Example usage
   of the new system is in the JavaScript CLI test runner.

Replication:

 * Added option to implicitly create replication target databases.
 * Avoid leaking file descriptors on automatic replication restarts.
 * Added option to replicate a list of documents by id.
 * Allow continuous replication to be cancelled.

Storage System:

 * Adds batching of multiple updating requests, to improve throughput with many
   writers. Removed the now redundant couch_batch_save module.
 * Adds configurable compression of attachments.

Runtime Statistics:

 * Statistics are now calculated for a moving window instead of non-overlapping
   timeframes.
 * Fixed a problem with statistics timers and system sleep.
 * Moved statistic names to a term file in the priv directory.

Futon:

 * Added a button for view compaction.
 * JSON strings are now displayed as-is in the document view, without the escaping of
   new-lines and quotes. That dramatically improves readability of multi-line
   strings.
 * Same goes for editing of JSON string values. When a change to a field value is
   submitted, and the value is not valid JSON it is assumed to be a string. This
   improves editing of multi-line strings a lot.
 * Hitting tab in textareas no longer moves focus to the next form field, but simply
   inserts a tab character at the current caret position.
 * Fixed some font declarations.

Build and System Integration:

 * Updated and improved source documentation.
 * Fixed distribution preparation for building on Mac OS X.
 * Added support for building a Windows installer as part of 'make dist'.
 * Bug fix for building couch.app's module list.
 * ETap tests are now run during make distcheck. This included a number of
   updates to the build system to properly support VPATH builds.
 * Gavin McDonald setup a build-bot instance. More info can be found at
   http://ci.apache.org/buildbot.html

Version 0.10.2
--------------

Security:

 * Fixed CVE-2010-0009: Apache CouchDB Timing Attack Vulnerability

Replicator:

 * Avoid leaking file descriptors on automatic replication restarts.

Build and System Integration:

 * Fixed distribution preparation for building on Mac OS X.

Version 0.10.1
--------------

Replicator:

 * Stability enhancements regarding redirects, timeouts, OAuth.

Query Server:

 * Avoid process leaks
 * Allow list and view to span languages

Stats:

 * Eliminate new process flood on system wake

Build and System Integration:

 * Test suite now works with the distcheck target.

Version 0.10.0
--------------

Storage Format:

 * Add move headers with checksums to the end of database files for extra robust
   storage and faster storage.

View Server:

 * Added native Erlang views for high-performance applications.

HTTP Interface:

 * Added optional cookie-based authentication handler.
 * Added optional two-legged OAuth authentication handler.

Build and System Integration:

 * Changed `couchdb` script configuration options.
 * Added default.d and local.d configuration directories to load sequence.


Version 0.9.2
-------------

Replication:

 * Fix replication with 0.10 servers initiated by an 0.9 server (COUCHDB-559).

Build and System Integration:

 * Remove branch callbacks to allow building couchjs against newer versions of
   Spidermonkey.

Version 0.9.1
-------------

Build and System Integration:

 * PID file directory is now created by the SysV/BSD daemon scripts.
 * Fixed the environment variables shown by the configure script.
 * Fixed the build instructions shown by the configure script.
 * Updated ownership and permission advice in `README` for better security.

Configuration and stats system:

 * Corrected missing configuration file error message.
 * Fixed incorrect recording of request time.

Database Core:

 * Document validation for underscore prefixed variables.
 * Made attachment storage less sparse.
 * Fixed problems when a database with delayed commits pending is considered
   idle, and subject to losing changes when shutdown. (COUCHDB-334)

External Handlers:

 * Fix POST requests.

Futon:

 * Redirect when loading a deleted view URI from the cookie.

HTTP Interface:

 * Attachment requests respect the "rev" query-string parameter.

JavaScript View Server:

 * Useful JavaScript Error messages.

Replication:

 * Added support for Unicode characters transmitted as UTF-16 surrogate pairs.
 * URL-encode attachment names when necessary.
 * Pull specific revisions of an attachment, instead of just the latest one.
 * Work around a rare chunk-merging problem in ibrowse.
 * Work with documents containing Unicode characters outside the Basic
   Multilingual Plane.

Version 0.9.0
-------------

Futon:

 * Added pagination to the database listing page.
 * Implemented attachment uploading from the document page.
 * Added page that shows the current configuration, and allows modification of
   option values.
 * Added a JSON "source view" for document display.
 * JSON data in view rows is now syntax highlighted.
 * Removed the use of an iframe for better integration with browser history and
   bookmarking.
 * Full database listing in the sidebar has been replaced by a short list of
   recent databases.
 * The view editor now allows selection of the view language if there is more
   than one configured.
 * Added links to go to the raw view or document URI.
 * Added status page to display currently running tasks in CouchDB.
 * JavaScript test suite split into multiple files.
 * Pagination for reduce views.

Design Document Resource Paths:

 * Added httpd_design_handlers config section.
 * Moved _view to httpd_design_handlers.
 * Added ability to render documents as non-JSON content-types with _show and
   _list functions, which are also httpd_design_handlers.

HTTP Interface:

 * Added client side UUIDs for idempotent document creation
 * HTTP COPY for documents
 * Streaming of chunked attachment PUTs to disk
 * Remove negative count feature
 * Add include_docs option for view queries
 * Add multi-key view post for views
 * Query parameter validation
 * Use stale=ok to request potentially cached view index
 * External query handler module for full-text or other indexers.
 * Etags for attachments, views, shows and lists
 * Show and list functions for rendering documents and views as developer
   controlled content-types.
 * Attachment names may use slashes to allow uploading of nested directories
   (useful for static web hosting).
 * Option for a view to run over design documents.
 * Added newline to JSON responses. Closes bike-shed.

Replication:

 * Using ibrowse.
 * Checkpoint replications so failures are less expensive.
 * Automatically retry of failed replications.
 * Stream attachments in pull-replication.

Database Core:

 * Faster B-tree implementation.
 * Changed internal JSON term format.
 * Improvements to Erlang VM interactions under heavy load.
 * User context and administrator role.
 * Update validations with design document validation functions.
 * Document purge functionality.
 * Ref-counting for database file handles.

Build and System Integration:

 * The `couchdb` script now supports system chainable configuration files.
 * The Mac OS X daemon script now redirects STDOUT and STDERR like SysV/BSD.
 * The build and system integration have been improved for portability.
 * Added COUCHDB_OPTIONS to etc/default/couchdb file.
 * Remove COUCHDB_INI_FILE and COUCHDB_PID_FILE from etc/default/couchdb file.
 * Updated `configure.ac` to manually link `libm` for portability.
 * Updated `configure.ac` to extended default library paths.
 * Removed inets configuration files.
 * Added command line test runner.
 * Created dev target for make.

Configuration and stats system:

 * Separate default and local configuration files.
 * HTTP interface for configuration changes.
 * Statistics framework with HTTP query API.

Version 0.8.1-incubating
------------------------

Database Core:

 * Fix for replication problems where the write queues can get backed up if the
   writes aren't happening fast enough to keep up with the reads. For a large
   replication, this can exhaust memory and crash, or slow down the machine
   dramatically. The fix keeps only one document in the write queue at a time.
 * Fix for databases sometimes incorrectly reporting that they contain 0
   documents after compaction.
 * CouchDB now uses ibrowse instead of inets for its internal HTTP client
   implementation. This means better replication stability.

HTTP Interface:

 * Fix for chunked responses where chunks were always being split into multiple
   TCP packets, which caused problems with the test suite under Safari, and in
   some other cases.
 * Fix for an invalid JSON response body being returned for some kinds of
   views. (COUCHDB-84)
 * Fix for connections not getting closed after rejecting a chunked request.
   (COUCHDB-55)
 * CouchDB can now be bound to IPv6 addresses.
 * The HTTP `Server` header now contains the versions of CouchDB and Erlang.

JavaScript View Server:

 * Sealing of documents has been disabled due to an incompatibility with
   SpiderMonkey 1.9.
 * Improve error handling for undefined values emitted by map functions.
   (COUCHDB-83)

Build and System Integration:

 * The `couchdb` script no longer uses `awk` for configuration checks as this
   was causing portability problems.
 * Updated `sudo` example in `README` to use the `-i` option, this fixes
   problems when invoking from a directory the `couchdb` user cannot access.

Futon:

 * The view selector dropdown should now work in Opera and Internet Explorer
   even when it includes optgroups for design documents. (COUCHDB-81)

Version 0.8.0-incubating
------------------------

Database Core:

 * The view engine has been completely decoupled from the storage engine. Index
   data is now stored in separate files, and the format of the main database
   file has changed.
 * Databases can now be compacted to reclaim space used for deleted documents
   and old document revisions.
 * Support for incremental map/reduce views has been added.
 * To support map/reduce, the structure of design documents has changed. View
   values are now JSON objects containing at least a `map` member, and
   optionally a `reduce` member.
 * View servers are now identified by name (for example `javascript`) instead of
   by media type.
 * Automatically generated document IDs are now based on proper UUID generation
   using the crypto module.
 * The field `content-type` in the JSON representation of attachments has been
   renamed to `content_type` (underscore).

HTTP Interface:

 * CouchDB now uses MochiWeb instead of inets for the HTTP server
   implementation. Among other things, this means that the extra configuration
   files needed for inets (such as `couch_httpd.conf`) are no longer used.
 * The HTTP interface now completely supports the `HEAD` method. (COUCHDB-3)
 * Improved compliance of `Etag` handling with the HTTP specification.
   (COUCHDB-13)
 * Etags are no longer included in responses to document `GET` requests that
   include query string parameters causing the JSON response to change without
   the revision or the URI having changed.
 * The bulk document update API has changed slightly on both the request and the
   response side. In addition, bulk updates are now atomic.
 * CouchDB now uses `TCP_NODELAY` to fix performance problems with persistent
   connections on some platforms due to nagling.
 * Including a `?descending=false` query string parameter in requests to views
   no longer raises an error.
 * Requests to unknown top-level reserved URLs (anything with a leading
   underscore) now return a `unknown_private_path` error instead of the
   confusing `illegal_database_name`.
 * The Temporary view handling now expects a JSON request body, where the JSON
   is an object with at least a `map` member, and optional `reduce` and
   `language` members.
 * Temporary views no longer determine the view server based on the Content-Type
   header of the `POST` request, but rather by looking for a `language` member
   in the JSON body of the request.
 * The status code of responses to `DELETE` requests is now 200 to reflect that
   that the deletion is performed synchronously.

JavaScript View Server:

 * SpiderMonkey is no longer included with CouchDB, but rather treated as a
   normal external dependency. A simple C program (`_couchjs`) is provided that
   links against an existing SpiderMonkey installation and uses the interpreter
   embedding API.
 * View functions using the default JavaScript view server can now do logging
   using the global `log(message)` function. Log messages are directed into the
   CouchDB log at `INFO` level. (COUCHDB-59)
 * The global `map(key, value)` function made available to view code has been
   renamed to `emit(key, value)`.
 * Fixed handling of exceptions raised by view functions.

Build and System Integration:

 * CouchDB can automatically respawn following a server crash.
 * Database server no longer refuses to start with a stale PID file.
 * System logrotate configuration provided.
 * Improved handling of ICU shared libraries.
 * The `couchdb` script now automatically enables SMP support in Erlang.
 * The `couchdb` and `couchjs` scripts have been improved for portability.
 * The build and system integration have been improved for portability.

Futon:

 * When adding a field to a document, Futon now just adds a field with an
   autogenerated name instead of prompting for the name with a dialog. The name
   is automatically put into edit mode so that it can be changed immediately.
 * Fields are now sorted alphabetically by name when a document is displayed.
 * Futon can be used to create and update permanent views.
 * The maximum number of rows to display per page on the database page can now
   be adjusted.
 * Futon now uses the XMLHTTPRequest API asynchronously to communicate with the
   CouchDB HTTP server, so that most operations no longer block the browser.
 * View results sorting can now be switched between ascending and descending by
   clicking on the `Key` column header.
 * Fixed a bug where documents that contained a `@` character could not be
   viewed. (COUCHDB-12)
 * The database page now provides a `Compact` button to trigger database
   compaction. (COUCHDB-38)
 * Fixed portential double encoding of document IDs and other URI segments in
   many instances. (COUCHDB-39)
 * Improved display of attachments.
 * The JavaScript Shell has been removed due to unresolved licensing issues.
