<!--

Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License. You may obtain a copy of the
License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed
under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
CONDITIONS OF ANY KIND, either express or implied. See the License for the
specific language governing permissions and limitations under the License.

-->
<form action="" method="post">
  <h2>Share Test Reports</h2>
  <fieldset>
    <p class="help">
      After each test run, a results summary document is stored in
      <a href="/_utils/database.html?test_suite_reports">your local
        <tt>test_suite_reports</tt> database.</a> The data has no personally
      identifying information, just details about the test run and your CouchDB
      and browser versions. (Click the red link above to see what's stored.)
      The data remains private until you click the "share" button below.
    </p>
    <p class="help">
      Test reports are very valuable to the CouchDB community, and are easy to share.
      Clicking the "share" button below triggers replication from
      your local <tt>test_suite_reports</tt> database, to a database hosted by the
      project.
    </p>
    <p class="help">
      <a href="http://couchdb.couchdb.org/_utils/database.html?test_suite_reports">
        Browse test reports shared by other users.</a>
      Thank you for sharing!
    </p>
  </fieldset>
  <div class="buttons">
    <button type="submit">Share</button>
    <button type="button" class="cancel">Cancel</button>
  </div>
</form>
