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

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.

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.
