Add RPM support, top-level Makefile
diff --git a/.gitignore b/.gitignore
index 3bc6f41..2d85773 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,3 +4,7 @@
 debian/files
 debian/couchdb
 debian/tmp
+rpm/BUILD
+rpm/BUILDROOT
+rpm/RPMS
+rpm/SRPMS
diff --git a/Makefile.nightly b/Makefile.nightly
new file mode 100644
index 0000000..726f0b3
--- /dev/null
+++ b/Makefile.nightly
@@ -0,0 +1,95 @@
+# 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.
+
+COUCHDIR=../couchdb
+DEBCHANGELOG="Automatically generated package from upstreasm."
+ERLANG_VERSION=18.3
+
+export DEBFULLNAME="CouchDB Developers"
+export DEBEMAIL="dev@couchdb.apache.org"
+
+# Debian default
+debian: find-couch-dist copy-debian update-changelog dpkg lintian
+
+# Debian 8
+jessie: debian
+
+# Ubuntu 12.04
+precise: find-couch-dist copy-debian precise-prep dpkg lintian
+
+precise-prep:
+	sed -i '/dh-systemd/d' $(DISTDIR)/debian/control
+	sed -i '/init-system-helpers/d' $(DISTDIR)/debian/control
+	sed -i 's/ --with=systemd//' $(DISTDIR)/debian/rules
+
+# Ubuntu 14.04
+trusty: debian
+
+# Ubuntu 16.04
+xenial: debian
+
+# RPM default
+centos: find-couch-dist link-couch-dist build-rpm
+
+centos6: make-rpmbuild install-js185 centos
+
+centos7: make-rpmbuild centos
+
+# ######################################
+get-couch:
+	mkdir -p $(COUCHDIR)
+	git clone https://github.com/apache/couchdb
+
+build-couch:
+	cd $(COUCHDIR) && make dist
+
+# ######################################
+find-couch-dist:
+	$(eval ORIGDISTDIR := $(shell cd $(COUCHDIR) && find . -type d -name apache-couchdb-\*))
+	$(eval NEWDIR := $(shell echo $(ORIGDISTDIR) | sed 's/.\/apache-couchdb/couchdb/'))
+	mv $(COUCHDIR)/$(ORIGDISTDIR) $(COUCHDIR)/$(NEWDIR)
+	$(eval DISTDIR := $(COUCHDIR)/$(NEWDIR))
+
+copy-debian:
+	rm -rf $(DISTDIR)/debian
+	cp -R debian $(DISTDIR)
+
+update-changelog:
+	cd $(DISTDIR) && dch -d $(DEBCHANGELOG)
+
+dpkg:
+	cd $(DISTDIR) && dpkg-buildpackage -b -us -uc
+
+lintian:
+	cd $(DISTDIR)/.. && lintian --profile couchdb couch*deb
+
+# ######################################
+link-couch-dist:
+	rm -rf ~/rpmbuild/BUILD
+	ln -s $(DISTDIR) ~/rpmbuild/BUILD
+
+make-rpmbuild:
+	rm -rf ~/rpmbuild
+	mkdir -p ~/rpmbuild
+	cp -R rpm/* ~/rpmbuild
+
+build-rpm:
+	cd ~/rpmbuild && rpmbuild --verbose -bb SPECS/couchdb.spec --define "erlang_version $(ERLANG_VERSION)"
+
+# ######################################
+make-js185:
+	spectool -g -R rpm/SPECS/js-1.8.5.spec
+	cd ~/rpmbuild && rpmbuild --verbose -bb SPECS/js-1.8.5.spec
+
+install-js185:
+	sudo rpm -i ~/rpmbuild/RPMS/x86_64/js-1*
+	sudo rpm -i ~/rpmbuild/RPMS/x86_64/js-devel*
diff --git a/README.md b/README.md
index 8d7f5a9..62e5bbd 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,8 @@
 # CouchDB Packaging support files
 
-TBD - testing GH-ASF integration
+Quickstart:
+
+```shell
+$ cd .. && git clone https://github.com/apache/couchdb
+$ cd couchdb-pkg && make -f Makefile.nightly build-couch $(lsb_release)
+```
diff --git a/debian/control b/debian/control
index ccde0e1..c7a7d3a 100644
--- a/debian/control
+++ b/debian/control
@@ -34,6 +34,7 @@
          debconf,
          init-system-helpers,
          procps,
+         python,
          python-requests,
          ${misc:Depends},
          ${shlibs:Depends},
diff --git a/rpm/RPMS/x86_64/js-1.8.5-7.el6.x86_64.rpm b/rpm/RPMS/x86_64/js-1.8.5-7.el6.x86_64.rpm
new file mode 100644
index 0000000..cab05c6
--- /dev/null
+++ b/rpm/RPMS/x86_64/js-1.8.5-7.el6.x86_64.rpm
Binary files differ
diff --git a/rpm/RPMS/x86_64/js-debuginfo-1.8.5-7.el6.x86_64.rpm b/rpm/RPMS/x86_64/js-debuginfo-1.8.5-7.el6.x86_64.rpm
new file mode 100644
index 0000000..ccb8162
--- /dev/null
+++ b/rpm/RPMS/x86_64/js-debuginfo-1.8.5-7.el6.x86_64.rpm
Binary files differ
diff --git a/rpm/RPMS/x86_64/js-devel-1.8.5-7.el6.x86_64.rpm b/rpm/RPMS/x86_64/js-devel-1.8.5-7.el6.x86_64.rpm
new file mode 100644
index 0000000..dfb867c
--- /dev/null
+++ b/rpm/RPMS/x86_64/js-devel-1.8.5-7.el6.x86_64.rpm
Binary files differ
diff --git a/rpm/SOURCES/10-filelog.ini b/rpm/SOURCES/10-filelog.ini
new file mode 100644
index 0000000..6e0d7cf
--- /dev/null
+++ b/rpm/SOURCES/10-filelog.ini
@@ -0,0 +1,4 @@
+[log]
+writer = file
+file = /var/log/couchdb/couchdb.log
+level = info
diff --git a/rpm/SOURCES/couchdb.init b/rpm/SOURCES/couchdb.init
new file mode 100644
index 0000000..5f44dc9
--- /dev/null
+++ b/rpm/SOURCES/couchdb.init
@@ -0,0 +1,131 @@
+#!/bin/sh
+# 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.
+#
+# chkconfig: - 26 74
+# description: Starts and stops the CouchDB daemon that handles \
+#              all database requests.
+#
+### BEGIN INIT INFO
+# Provides:          couchdb
+# Required-Start:    $remote_fs $syslog $network
+# Required-Stop:     $remote_fs $syslog $network
+# Default-Start:     2 3 4 5
+# Default-Stop:      0 1 6
+# Short-Description: Apache CouchDB, a RESTful document oriented database
+# Description:       Apache CouchDB is a distributed, fault-tolerant and schema-free
+#                    document-oriented database accessible via a RESTful HTTP/JSON API. Among other
+#                    features, it provides robust, incremental replication with bi-directional
+#                    conflict detection and resolution, and is queryable and indexable using a
+#                    table-oriented view engine with JavaScript acting as the default view
+#                    definition language.
+### END INIT INFO
+# Author: CouchDB Developers <dev@couchdb.apache.org>
+
+# Source function library.
+. /etc/rc.d/init.d/functions
+
+prog=couchdb
+exec=/opt/couchdb/bin/$prog
+
+COUCHDB_USER=couchdb
+COUCHDB_PIDFILE=/var/run/$prog.pid
+
+[ -e /etc/sysconfig/$prog ] && . /etc/sysconfig/$prog
+
+PID="$(pgrep -u couchdb beam* || true)"
+LOCKFILE=/var/lock/subsys/$prog
+
+start() {
+    [ -x $exec ] || exit 5
+    echo -n $"Starting $prog: "
+    status_q && echo -n "already running" && warning && echo && exit 0
+    daemon --user $COUCHDB_USER \
+        --pidfile $COUCHDB_PIDFILE \
+        nohup $exec $COUCHDB_OPTIONS >/dev/null 2>&1 &
+    retval=$?
+    [ $retval -eq 0 ] && touch $LOCKFILE && success || failure
+    echo
+    return $retval
+}
+
+stop() {
+    echo -n $"Stopping $prog: "
+    retval=0
+    if ! status_q ; then
+	echo -n "already stopped" && warning
+    else
+        pkill -u $COUCHDB_USER beam\*
+        retval=$?
+        [ $retval -eq 0 ] && rm -f $lockfile && success || failure
+    fi
+    echo
+    return $retval
+}
+
+restart() {
+    stop
+    start
+}
+
+reload() {
+    restart
+}
+
+usage() {
+    echo "Usage: couchdb {start|stop|status|restart|force-reload}" >&2
+}
+
+status() {
+    pgrep -u couchdb beam* > /dev/null && status="$?" || status="$?"
+    if [ "$status" = 0 ]; then
+        echo "$prog is running"
+        return 0
+    elif [ "$status" = 4 ]; then
+        echo "could not access PID file for $prog"
+        return $status
+    else
+        echo "$prog is not running"
+        return $status
+    fi
+}
+
+status_q() {
+    status >/dev/null 2>&1
+}
+
+case "$1" in
+    start)
+        start
+    ;;
+    stop)
+        stop
+    ;;
+    status)
+        status
+    ;;
+    reload)
+        usage
+        exit 3
+    ;;
+    force-reload)
+        reload
+    ;;
+    restart)
+        restart
+    ;;
+    '')
+        usage
+        exit 3
+    ;;
+esac
+exit 0
diff --git a/rpm/SOURCES/couchdb.logrotate b/rpm/SOURCES/couchdb.logrotate
new file mode 100644
index 0000000..1ef2fdb
--- /dev/null
+++ b/rpm/SOURCES/couchdb.logrotate
@@ -0,0 +1,9 @@
+/var/log/couchdb/couchdb.log {
+  weekly
+  rotate 10
+  copytruncate
+  delaycompress
+  compress
+  notifempty
+  missingok
+}
diff --git a/rpm/SOURCES/couchdb.service b/rpm/SOURCES/couchdb.service
new file mode 100644
index 0000000..4b882bc
--- /dev/null
+++ b/rpm/SOURCES/couchdb.service
@@ -0,0 +1,15 @@
+[Unit]
+Description=Apache CouchDB
+Wants=network-online.target
+After=network-online.target
+
+[Service]
+RuntimeDirectory=couchdb
+User=couchdb
+Group=couchdb
+ExecStart=/opt/couchdb/bin/couchdb
+Restart=on-failure
+
+[Install]
+WantedBy=multi-user.target
+
diff --git a/rpm/SOURCES/couchup b/rpm/SOURCES/couchup
new file mode 100755
index 0000000..858ccc8
--- /dev/null
+++ b/rpm/SOURCES/couchup
@@ -0,0 +1,480 @@
+#!/usr/bin/env python
+# 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.
+
+import argparse
+import base64
+import json
+import textwrap
+import threading
+import time
+import sys
+try:
+    from urllib import quote
+except ImportError:
+    from urllib.parse import quote
+import requests
+try:
+    import progressbar
+    HAVE_BAR = True
+except ImportError:
+    HAVE_BAR = False
+
+def _tojson(req):
+    """Support requests v0.x as well as 1.x+"""
+    if requests.__version__[0] == '0':
+        return json.loads(req.content)
+    return req.json()
+
+def _args(args):
+    args = vars(args)
+    if args['password']:
+        args['creds'] = (args['login'], args['password'])
+    else:
+        args['creds'] = None
+    return args
+
+def _do_list(args):
+    port = str(args['local_port'])
+    req = requests.get('http://127.0.0.1:' + port + '/_all_dbs',
+        auth=args['creds'])
+    req.raise_for_status()
+    dbs = _tojson(req)
+    local_dbs = [x for x in dbs if "shards" not in x
+        and x not in ['_dbs', '_nodes']]
+    clustered_dbs = list(set(
+        [x.split('/')[2].split('.')[0] for x in dbs if "shards" in x]
+    ))
+    if not args['include_system_dbs']:
+        # list comprehension to eliminate dbs starting with underscore
+        local_dbs = [x for x in local_dbs if x[0] != '_']
+        clustered_dbs = [x for x in clustered_dbs if x[0] != '_']
+    local_dbs.sort()
+    clustered_dbs.sort()
+    if args.get('clustered'):
+        return clustered_dbs
+    return local_dbs
+
+def _list(args):
+    args = _args(args)
+    ret = _do_list(args)
+    print(", ".join(ret))
+
+def _watch_replication(db,
+        local_port=5986,
+        clustered_port=5984,
+        creds=None,
+        hide_progress_bar=False,
+        quiet=False,
+        timeout=30):
+    """Watches replication, optionally with a progressbar."""
+    time.sleep(1)
+    if not quiet:
+        print("Replication started.")
+    url = "http://127.0.0.1:{}/{}".format(local_port, db)
+    try:
+        req = requests.get(url, auth=creds)
+        req.raise_for_status()
+        req = _tojson(req)
+        # here, local means node-local, i.e. source (1.x) database
+        local_docs = req['doc_count']
+        local_size = req['data_size']
+    except requests.exceptions.HTTPError:
+        raise Exception('Cannot retrieve {} doc_count!'.format(db))
+    if local_size == 0:
+        return
+    if HAVE_BAR and not hide_progress_bar and not quiet:
+        widgets = [
+            db,
+            ' ', progressbar.Percentage(),
+            ' ', progressbar.Bar(marker=progressbar.RotatingMarker()),
+            ' ', progressbar.ETA(),
+            ' ', progressbar.FileTransferSpeed(),
+        ]
+        progbar = progressbar.ProgressBar(widgets=widgets,
+                maxval=local_size).start()
+    count = 0
+    stall_count = 0
+    url = "http://127.0.0.1:{}/{}".format(clustered_port, db)
+    while count < local_docs:
+        try:
+            req = requests.get(url, auth=creds)
+            req.raise_for_status()
+            req = _tojson(req)
+            # here, cluster means clustered port, i.e. port 5984
+            clus_count = req['doc_count']
+            clus_size = req['data_size']
+        except requests.exceptions.HTTPError as exc:
+            if exc.response.status_code == 404:
+                clus_count = 0
+                clus_size = 0
+            else:
+                raise Exception('Cannot retrieve {} doc_count!'.format(db))
+        if count == clus_count:
+            stall_count += 1
+        else:
+            stall_count = 0
+        if stall_count == timeout:
+            if not quiet:
+                print(
+                    "Replication is stalled. Increase timeout or reduce load.")
+            exit(1)
+        if HAVE_BAR and not hide_progress_bar and not quiet:
+            if clus_size > local_size:
+                clus_size = local_size
+            progbar.update(clus_size)
+        count = clus_count
+        time.sleep(1)
+    if HAVE_BAR and not hide_progress_bar and not quiet:
+        progbar.finish()
+    return 0
+
+def _put_filter(args, db=None):
+    """Adds _design/repl_filters tombstone replication filter to DB."""
+    ddoc = {
+        '_id': '_design/repl_filters',
+        'filters': {
+            'no_deleted': 'function(doc,req){return !doc._deleted;};'
+        }
+    }
+    try:
+        req = requests.get(
+            'http://127.0.0.1:{}/{}/_design/repl_filters'.format(
+            args['local_port'], db),
+            auth=args['creds'])
+        req.raise_for_status()
+        doc = _tojson(req)
+        del doc['_rev']
+        if doc != ddoc:
+            if not args['quiet']:
+                print('Source replication filter does not match! Aborting.')
+            exit(1)
+    except requests.exceptions.HTTPError as exc:
+        if exc.response.status_code == 404:
+            if not args['quiet']:
+                print('Adding replication filter to source database...')
+            req = requests.put(
+                'http://127.0.0.1:{}/{}/_design/repl_filters'.format(
+                args['local_port'], db),
+                data=json.dumps(ddoc),
+                auth=args['creds'])
+            req.raise_for_status()
+        elif not args['quiet']:
+            print(exc.response.text)
+            exit(1)
+
+def _replicate(args):
+    args = _args(args)
+    if args['all_dbs']:
+        dbs = _do_list(args)
+    else:
+        dbs = args['dbs']
+
+    for db in dbs:
+        if args['filter_deleted']:
+            _put_filter(args, db)
+
+        if not args['quiet']:
+            print('Starting replication for ' + db + '...')
+        db = quote(db, safe='')
+        doc = {
+            'continuous': False,
+            'create_target': True,
+            'source': {
+                'url': 'http://127.0.0.1:{}/{}'.format(
+                    args['local_port'], db)
+            },
+            'target': {
+                'url': 'http://127.0.0.1:{}/{}'.format(
+                    args['clustered_port'], db)
+            }
+        }
+        if args['filter_deleted']:
+            doc['filter'] = 'repl_filters/no_deleted'
+        if args['creds']:
+            auth = 'Basic ' + base64.b64encode(':'.join(args['creds']))
+            headers = {
+                'authorization': auth
+            }
+            doc['source']['headers'] = headers
+            doc['target']['headers'] = headers
+        watch_args = {y: args[y] for y in [
+            'local_port', 'clustered_port', 'creds', 'hide_progress_bar',
+            'timeout', 'quiet']}
+        watch_args['db'] = db
+        watch = threading.Thread(target=_watch_replication, kwargs=watch_args)
+        watch.start()
+        try:
+            req = requests.post('http://127.0.0.1:{}/_replicate'.format(
+                args['clustered_port']),
+                auth=args['creds'],
+                data=json.dumps(doc),
+                headers={'Content-type': 'application/json'})
+            req.raise_for_status()
+            req = _tojson(req)
+        except requests.exceptions.HTTPError as exc:
+            if not args['quiet']:
+                print(exc.response.text)
+            exit(1)
+        watch.join()
+        if req.get('no_changes'):
+            if not args['quiet']:
+                print("No changes, replication is caught up.")
+        if not args['quiet']:
+            print("Replication complete.")
+
+def _rebuild(args):
+    args = _args(args)
+    if args['all_dbs']:
+        if args['views']:
+            if not args['quiet']:
+                print("Cannot take list of views for more than 1 database.")
+            exit(1)
+        args['clustered'] = True
+        dbs = _do_list(args)
+    else:
+        dbs = [args['db']]
+    for db in dbs:
+        if args['views']:
+            views = args['views']
+        else:
+            try:
+                req = requests.get('http://127.0.0.1:{}/{}/_all_docs'.format(
+                    args['clustered_port'], db),
+                    params={
+                        'start_key': '"_design/"',
+                        'end_key': '"_design0"'
+                    },
+                    auth=args['creds'])
+                req.raise_for_status()
+                req = _tojson(req)
+            except requests.exceptions.HTTPError as exc:
+                if not args['quiet']:
+                    print(exc.response.text)
+                exit(1)
+            req = req['rows']
+            ddocs = [x['id'].split('/')[1] for x in req]
+        for ddoc in ddocs:
+            try:
+                req = requests.get('http://127.0.0.1:{}/{}/_design/{}'.format(
+                    args['clustered_port'], db, ddoc),
+                    auth=args['creds'])
+                req.raise_for_status()
+                doc = _tojson(req)
+            except requests.exceptions.HTTPError as exc:
+                if not args['quiet']:
+                    print(exc.response.text)
+                exit(1)
+            if 'views' not in doc:
+                if not args['quiet']:
+                    print("Skipping {}/{}, no views found".format(db, ddoc))
+                    continue
+            # only need to refresh a single view per ddoc
+            if not args['quiet']:
+                print("Refreshing views in {}/{}...".format(db, ddoc))
+            view = list(doc['views'].keys())[0]
+            try:
+                req = requests.get(
+                    'http://127.0.0.1:{}/{}/_design/{}/_view/{}'.format(
+                        args['clustered_port'], db, ddoc, view),
+                    params={'limit': 1},
+                    auth=args['creds'],
+                    timeout=args['timeout'])
+            except requests.exceptions.Timeout:
+                if not args['quiet']:
+                    print("Timeout, view is processing. Moving on.")
+            except requests.exceptions.HTTPError as exc:
+                if not args['quiet']:
+                    print(exc.response.text)
+                exit(1)
+
+def _delete(args):
+    args = _args(args)
+    if args['all_dbs']:
+        args['include_system_dbs'] = False
+        dbs = _do_list(args)
+    else:
+        dbs = args['dbs']
+    for db in dbs:
+        db = quote(db, safe='')
+        local_url = 'http://127.0.0.1:{}/{}'.format(args['local_port'], db)
+        clus_url = 'http://127.0.0.1:{}/{}'.format(args['clustered_port'], db)
+        try:
+            req = requests.get(local_url, auth=args['creds'])
+            req.raise_for_status()
+            req = _tojson(req)
+            local_docs = req['doc_count']
+            req = requests.get(clus_url, auth=args['creds'])
+            req.raise_for_status()
+            req = _tojson(req)
+            clus_docs = req['doc_count']
+            if clus_docs < local_docs and not args['force']:
+                if not args['quiet']:
+                    print('Clustered DB has less docs than local version!' +
+                            ' Skipping...')
+                    continue
+            if not args['quiet']:
+                print('Deleting ' + db + '...')
+            req = requests.delete('http://127.0.0.1:{}/{}'.format(
+                args['local_port'], db),
+                auth=args['creds'])
+            req.raise_for_status()
+        except requests.exceptions.HTTPError as exc:
+            if not args['quiet']:
+                print(exc.response.text)
+            exit(1)
+
+def main(argv):
+    """Kindly do the needful."""
+    parser = argparse.ArgumentParser(prog='couchup',
+        formatter_class=argparse.RawDescriptionHelpFormatter,
+        description=textwrap.dedent('''\
+            Migrate CouchDB 1.x databases to CouchDB 2.x.
+
+            Specify a subcommand and -h or --help for more help.
+         '''))
+
+    subparsers = parser.add_subparsers()
+
+    parser_list = subparsers.add_parser('list',
+        help='lists all CouchDB 1.x databases',
+        formatter_class=argparse.RawTextHelpFormatter,
+        description=textwrap.dedent('''\
+            Examples:
+              couchup list
+              couchup list -c -i -p mysecretpassword
+         '''))
+    parser_list.add_argument('-c', '--clustered', action='store_true',
+        help='show clustered (2.x) databases instead')
+    parser_list.add_argument('-i', '--include-system-dbs',
+        action='store_true',
+        help='include system databases (_users, _replicator, etc.)')
+    parser_list.add_argument('-l', '--login', default='admin',
+        help='specify login (default admin)')
+    parser_list.add_argument('-p', '--password',
+        help='specify password')
+    parser_list.add_argument('--local-port', default=5986,
+        help='override local port (default 5986)')
+    parser_list.add_argument('--clustered-port', default=5984,
+        help='override clustered port (default 5984)')
+    parser_list.set_defaults(func=_list)
+
+    parser_replicate = subparsers.add_parser('replicate',
+        help='replicates one or more 1.x databases to CouchDB 2.x',
+        formatter_class=argparse.RawTextHelpFormatter,
+        description=textwrap.dedent('''\
+            Examples:
+              couchup replicate movies
+              couchup replicate -f lots_of_deleted_docs_db
+              couchup replicate -i -q -n _users
+
+            Note:
+              The -f/--filter-deleted option adds a replication filter
+              to the source database, _design/repl_filters, that
+              is used during replication to filter out deleted
+              documents. This can greatly reduce the size of your
+              2.x database if there are many deleted documents.
+
+              It is IMPORTANT that no documents be deleted from the 1.x
+              database during this process, or those deletions may not
+              successfully replicate to the 2.x database.
+         '''))
+    parser_replicate.add_argument('-a', '--all_dbs', action='store_true',
+        help='act on all databases available')
+    parser_replicate.add_argument('-i', '--include-system-dbs',
+        action='store_true',
+        help='include system databases (_users, _replicator, etc.)')
+    parser_replicate.add_argument('-q', '--quiet', action='store_true',
+        help='suppress all output')
+    parser_replicate.add_argument('-n', '--hide-progress-bar',
+        action='store_true',
+        help='suppress progress bar display')
+    parser_replicate.add_argument('-f', '--filter-deleted',
+        action='store_true',
+        help='filter deleted document tombstones during replication')
+    parser_replicate.add_argument('-t', '--timeout', default=30,
+         help='stalled replication timeout threshhold in s (def: 30)')
+    parser_replicate.add_argument('-l', '--login', default='admin',
+        help='specify login (default admin)')
+    parser_replicate.add_argument('-p', '--password',
+        help='specify password')
+    parser_replicate.add_argument('--local-port', default=5986,
+        help='override local port (default 5986)')
+    parser_replicate.add_argument('--clustered-port', default=5984,
+        help='override clustered port (default 5984)')
+    parser_replicate.add_argument('dbs', metavar='db', type=str, nargs="*",
+        help="database(s) to be processed")
+    parser_replicate.set_defaults(func=_replicate)
+
+    parser_rebuild = subparsers.add_parser('rebuild',
+        help='rebuilds one or more CouchDB 2.x views',
+        formatter_class=argparse.RawTextHelpFormatter,
+        description=textwrap.dedent('''\
+            Examples:
+              couchup rebuild movies
+              couchup rebuild movies by_name
+              couchup rebuild -a -q -p mysecretpassword
+         '''))
+    parser_rebuild.add_argument('-a', '--all-dbs', action='store_true',
+        help='act on all databases available')
+    parser_rebuild.add_argument('-q', '--quiet', action='store_true',
+        help='suppress all output')
+    parser_rebuild.add_argument('-t', '--timeout', default=5,
+        help='timeout for waiting for view rebuild in s (default: 5)')
+    parser_rebuild.add_argument('-i', '--include-system-dbs',
+        action='store_true',
+        help='include system databases (_users, _replicator, etc.)')
+    parser_rebuild.add_argument('-l', '--login', default='admin',
+        help='specify login (default admin)')
+    parser_rebuild.add_argument('-p', '--password',
+        help='specify password')
+    parser_rebuild.add_argument('--local-port', default=5986,
+        help='override local port (default 5986)')
+    parser_rebuild.add_argument('--clustered-port', default=5984,
+        help='override clustered port (default 5984)')
+    parser_rebuild.add_argument('db', metavar='db', type=str, nargs="?",
+        help="database to be processed")
+    parser_rebuild.add_argument('views', metavar='view', type=str, nargs="*",
+        help="view(s) to be processed (all by default)")
+    parser_rebuild.set_defaults(func=_rebuild)
+
+    parser_delete = subparsers.add_parser('delete',
+        help='deletes one or more CouchDB 1.x databases',
+        formatter_class=argparse.RawTextHelpFormatter,
+        description=textwrap.dedent('''\
+            Examples:
+              couchup delete movies
+              couchup delete -q -p mysecretpassword movies
+         '''))
+    parser_delete.add_argument('-a', '--all-dbs', action='store_true',
+        help='act on all databases available')
+    parser_delete.add_argument('-f', '--force', action='store_true',
+        help='force deletion even if 1.x and 2.x databases are not identical')
+    parser_delete.add_argument('-q', '--quiet', action='store_true',
+        help='suppress all output')
+    parser_delete.add_argument('-l', '--login', default='admin',
+        help='specify login (default admin)')
+    parser_delete.add_argument('-p', '--password',
+        help='specify password')
+    parser_delete.add_argument('--local-port', default=5986,
+        help='override local port (default 5986)')
+    parser_delete.add_argument('--clustered-port', default=5984,
+        help='override clustered port (default 5984)')
+    parser_delete.add_argument('dbs', metavar='db', type=str, nargs="*",
+        help="database(s) to be processed")
+    parser_delete.set_defaults(func=_delete)
+
+    args = parser.parse_args(argv[1:])
+    args.func(args)
+
+if __name__ == '__main__':
+    main(sys.argv)
diff --git a/rpm/SOURCES/js-1.8.5-64bit-big-endian.patch b/rpm/SOURCES/js-1.8.5-64bit-big-endian.patch
new file mode 100644
index 0000000..8cf3fc9
--- /dev/null
+++ b/rpm/SOURCES/js-1.8.5-64bit-big-endian.patch
@@ -0,0 +1,13 @@
+https://bugzilla.mozilla.org/show_bug.cgi?id=627664
+
+diff -up xulrunner-2.0/mozilla-central/js/src/jsval.h.64bit-big-endian xulrunner-2.0/mozilla-central/js/src/jsval.h
+--- xulrunner-2.0/mozilla-central/js/src/jsval.h.64bit-big-endian	2011-01-20 15:59:49.000000000 +0100
++++ xulrunner-2.0/mozilla-central/js/src/jsval.h	2011-01-20 16:00:21.000000000 +0100
+@@ -347,6 +347,7 @@ typedef union jsval_layout
+             int32          i32;
+             uint32         u32;
+             JSWhyMagic     why;
++            jsuword        word;
+         } payload;
+     } s;
+     double asDouble;
diff --git a/rpm/SOURCES/js-1.8.5-secondary-jit.patch b/rpm/SOURCES/js-1.8.5-secondary-jit.patch
new file mode 100644
index 0000000..4656129
--- /dev/null
+++ b/rpm/SOURCES/js-1.8.5-secondary-jit.patch
@@ -0,0 +1,14 @@
+https://bugzilla.mozilla.org/show_bug.cgi?id=627668
+
+diff -up xulrunner-2.0/mozilla-central/js/src/Makefile.in.big-endian-jit xulrunner-2.0/mozilla-central/js/src/Makefile.in
+--- xulrunner-2.0/mozilla-central/js/src/Makefile.in.big-endian-jit	2010-11-04 21:05:48.000000000 +0100
++++ xulrunner-2.0/mozilla-central/js/src/Makefile.in	2010-11-15 14:17:39.000000000 +0100
+@@ -371,7 +371,7 @@ CPPSRCS += 	checks.cc \
+ # END enclude sources for V8 dtoa
+ #############################################
+ 
+-ifeq (,$(filter-out powerpc sparc,$(TARGET_CPU)))
++ifeq (,$(filter-out powerpc powerpc64 sparc sparc64 s390 s390x,$(TARGET_CPU)))
+ 
+ VPATH +=	$(srcdir)/assembler \
+ 		$(srcdir)/assembler/wtf \
diff --git a/rpm/SOURCES/js185-destdir.patch b/rpm/SOURCES/js185-destdir.patch
new file mode 100644
index 0000000..e28baed
--- /dev/null
+++ b/rpm/SOURCES/js185-destdir.patch
@@ -0,0 +1,16 @@
+# See discussion in https://bugzilla.mozilla.org/show_bug.cgi?id=628723
+# Patch created by Colin Walters <walters@verbum.org>
+
+--- js/src/Makefile.in.orig	2011-06-15 19:40:27.447770306 -0400
++++ js/src/Makefile.in	2011-06-15 19:40:57.013770299 -0400
+@@ -888,8 +888,8 @@
+ ifeq (,$(HOST_BIN_SUFFIX))
+ 	mv -f $(SHLIB_ANY_VER) $(SHLIB_EXACT_VER)
+ 	@[ ! -h $(SHLIB_ABI_VER) ] || rm -f $(SHLIB_ABI_VER)
+-	ln -s $(SHLIB_EXACT_VER) $(SHLIB_ABI_VER)
+-	ln -s $(SHLIB_ABI_VER) $(SHLIB_ANY_VER)
++	ln -s $(notdir $(SHLIB_EXACT_VER)) $(SHLIB_ABI_VER)
++	ln -s $(notdir $(SHLIB_ABI_VER)) $(SHLIB_ANY_VER)
+ endif
+ endif
+ ifneq (,$(IMPORT_LIBRARY))
diff --git a/rpm/SPECS/couchdb.spec b/rpm/SPECS/couchdb.spec
new file mode 100644
index 0000000..dfa6f60
--- /dev/null
+++ b/rpm/SPECS/couchdb.spec
@@ -0,0 +1,164 @@
+# 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.
+#
+
+%define name couchdb
+%define prefix /opt/%{name}
+
+Summary:       RESTful document oriented database
+License:       Apache License v2.0
+Name:          %{name}
+Version:       2.0.0
+Release:       1%{?dist}
+Source:        https://www.apache.org/dist/couchdb/source/${version}/apache-couchdb-%{version}.tar.gz
+Source1:       %{name}.service
+Source2:       %{name}.init
+Source3:       10-filelog.ini
+Source4:       couchup
+Source5:       %{name}.logrotate
+Prefix:        %{prefix}
+Group:         Applications/Databases
+URL:           https://couchdb.apache.org/
+Vendor:        The Apache Software Foundation
+BuildArch:     x86_64
+ExclusiveArch: x86_64
+Exclusiveos:   linux
+Packager:      CouchDB Developers <dev@couchdb.apache.org>
+
+BuildRequires: esl-erlang = %{erlang_version}
+BuildRequires: gcc
+BuildRequires: git
+BuildRequires: help2man
+#BuildRequires: js-devel = 1:1.8.5
+BuildRequires: libcurl-devel
+BuildRequires: libicu-devel
+BuildRequires: nodejs >= 6.10.1
+BuildRequires: python >= 2.6
+#BuildRequires: python-pip
+#BuildRequires: python-sphinx >= 1.5.3
+#BuildRequires: shunit2
+
+Requires(pre): shadow-utils
+
+Requires(post): curl
+Requires(post): js = 1:1.8.5
+Requires(post): libicu >= 4.2.1
+Requires(post): procps
+Requires(post): python-progressbar
+Requires(post): python-requests
+
+%if 0%{?fedora} || 0%{?rhel} >= 7
+BuildRequires:		xfsprogs-devel
+%{?systemd_requires}
+BuildRequires:		systemd
+%else
+Requires(post):		chkconfig
+Requires(preun):	chkconfig, initscripts
+Requires(postun):	initscripts
+%endif
+
+%description
+Apache CouchDB is a distributed, fault-tolerant and schema-free
+document-oriented database accessible via a RESTful HTTP/JSON API. Among other
+features, it provides robust, incremental replication with bi-directional
+conflict detection and resolution, and is queryable and indexable using a
+table-oriented view engine with JavaScript acting as the default view
+definition language.
+.
+CouchDB is written in Erlang, but can be easily accessed from any environment
+that provides means to make HTTP requests. There are a multitude of third-party
+client libraries that make this even easier for a variety of programming
+languages and environments.
+
+# NOTE: Stripping binaries causes issues so we skip it.
+%define __os_install_post %{nil}
+
+%build
+./configure -c
+%{__make} release
+
+%clean
+%{__rm} -rf %{buildroot}
+
+%pre
+if ! /usr/bin/getent passwd couchdb > /dev/null; then /usr/sbin/adduser \
+  --system --home /opt/couchdb --no-create-home \
+  --shell /bin/bash --comment "CouchDB Administrator" \
+  --user-group couchdb; fi
+
+%install
+%{__install} -d -m0755 %{buildroot}/opt
+%{__cp} -r rel/couchdb %{buildroot}/opt
+%{__install} -d -m0750 %{buildroot}/var/log/%{name}
+%{__install} -d -m0750 %{buildroot}%{_sharedstatedir}/%{name}
+%{__install} -Dp -m0644 %{SOURCE3} %{buildroot}/opt/%{name}/etc/default.d/10-filelog.ini
+%{__install} -Dp -m0755 %{SOURCE4} %{buildroot}/opt/%{name}/bin/couchup
+%{__install} -Dp -m0644 %{SOURCE5} %{buildroot}/etc/logrotate.d/%{name}
+/bin/find %{buildroot}/opt/%{name} -name *.ini -exec %{__chmod} 0640 {} \;
+
+%if 0%{?fedora} || 0%{?rhel} >= 7
+%{__install} -Dp -m0644 %{SOURCE1} %{buildroot}%{_unitdir}/%{name}.service
+%else
+%{__install} -Dp -m0755 %{SOURCE2} %{buildroot}%{_initrddir}/%{name}
+%endif
+
+%post
+%{__chown} -R couchdb:couchdb /opt/%{name}
+%{__chmod} a+x /opt/%{name}/bin/*
+%{__ln_s} %{_sharedstatedir}/%{name} /opt/%{name}/data
+%{__ln_s} /var/log/%{name} /opt/%{name}/var/log/%{name}
+%if 0%{?fedora} || 0%{?rhel} >= 7
+%systemd_post %{name}.service
+%else
+/sbin/chkconfig --add %{name} || :
+%endif
+
+%preun
+%if 0%{?fedora} || 0%{?rhel} >= 7
+%systemd_preun %{name}.service
+%else
+# stop couchdb only when uninstalling
+if [ $1 -eq 0 ]; then
+  /sbin/service %{name} stop >/dev/null 2>&1 || :
+  /sbin/chkconfig --del %{name} || :
+fi
+killall -u couchdb epmd
+%endif
+
+%postun
+%if 0%{?fedora} || 0%{?rhel} >= 7
+%systemd_postun_with_restart %{name}.service
+%else
+# restart couchdb only when upgrading
+if [ $1 -eq 1 ]; then
+  /sbin/service %{name} condrestart >/dev/null 2>&1 || :
+fi
+%endif
+
+%files
+%attr(0755, %{name}, %{name}) /opt/couchdb
+%attr(0755, %{name}, %{name}) %dir %{_sharedstatedir}/%{name}
+%attr(0755, %{name}, %{name}) %dir /var/log/%{name}
+%config(noreplace) /opt/couchdb/etc/local.ini
+%config /etc/logrotate.d/%{name}
+%if 0%{?fedora} || 0%{?rhel} >= 7
+%{_unitdir}/%{name}.service
+%else
+%{_initrddir}/%{name}
+%endif
+
+
+%changelog
+* Tue May 2 2017 CouchDB Developers <dev@couchdb.apache.org> 2.0.0-1
+- New upstream version
+- New sysvinit and systemd service files
+- New backported couchup script
diff --git a/rpm/SPECS/js-1.8.5.spec b/rpm/SPECS/js-1.8.5.spec
new file mode 100644
index 0000000..9f5aa91
--- /dev/null
+++ b/rpm/SPECS/js-1.8.5.spec
@@ -0,0 +1,279 @@
+#% global hgdate 51702867d932
+
+Summary:		JavaScript interpreter and libraries
+Name:		js
+Version:		1.8.5
+Release:		7%{?hgdate:.hg%{hgdate}}%{?dist}
+License:		GPLv2+ or LGPLv2+ or MPLv1.1
+Group:		Development/Languages
+URL:			http://www.mozilla.org/js/
+Source0:		http://ftp.mozilla.org/pub/mozilla.org/js/js185-1.0.0.tar.gz
+Patch0:			js-1.8.5-64bit-big-endian.patch
+Patch1:			js-1.8.5-secondary-jit.patch
+Patch2:			js185-destdir.patch
+Provides:		libjs = %{version}-%{release}
+BuildRoot:	%{_tmppath}/%{name}-%{version}-%{release}-root
+Buildrequires:	python, zip
+Buildrequires:	ncurses-devel, autoconf213
+Epoch:		1
+
+
+%description
+JavaScript is the Netscape-developed object scripting language used in millions
+of web pages and server applications worldwide. Netscape's JavaScript is a
+superset of the ECMA-262 Edition 3 (ECMAScript) standard scripting language,
+with only mild differences from the published standard.
+
+
+%package devel
+Summary: Header files, libraries and development documentation for %{name}
+Group: Development/Libraries
+Requires: %{name} = %{epoch}:%{version}-%{release}
+Requires: pkgconfig
+Requires: ncurses-devel readline-devel
+Provides: libjs-devel = %{version}-%{release}
+
+%description devel
+This package contains the header files, static libraries and development
+documentation for %{name}. If you like to develop programs using %{name},
+you will need to install %{name}-devel.
+
+
+%prep
+# All patches come from old version and maintainer. I think it is Fedora related only
+%setup -q -n %{name}-%{version}
+%patch0 -p2 -b .64bit-big-endian
+%patch1 -p2 -b .secondary-jit
+%patch2 -p0 -b .destdir
+cd js
+
+# Rm parts with spurios licenses, binaries
+# Some parts under BSD (but different suppliers): src/assembler
+#rm -rf src/assembler src/yarr/yarr src/yarr/pcre src/yarr/wtf src/v8-dtoa
+rm -rf src/ctypes/libffi src/t src/tests/src/jstests.jar src/tracevis src/v8
+
+pushd src
+autoconf-2.13
+%configure \
+    --with-system-nspr \
+    --disable-tests \
+    --disable-strip \
+    --disable-ctypes
+
+popd
+
+# Create pkgconfig file
+%{__cat} > libjs.pc << 'EOF'
+prefix=%{_prefix}
+exec_prefix=%{_prefix}
+libdir=%{_libdir}
+includedir=%{_includedir}
+
+Name: libjs
+Description: JS library
+Requires: nspr >= 4.7
+Version: %{version}
+Libs: -L${libdir} -ljs
+Cflags: -DXP_UNIX=1 -DJS_THREADSAFE=1 -I${includedir}/js
+EOF
+
+
+%build
+cd js
+%{__make} %{?_smp_mflags} -C src
+
+%install
+cd js
+%{__make} -C src install DESTDIR=%{buildroot}
+# We don't want this
+%{__rm} -f %{buildroot}%{_bindir}/js-config
+%{__install} -m 0755 src/jscpucfg src/shell/js %{buildroot}%{_bindir}/
+#%{__rm} -rf %{buildroot}%{_libdir}/*.a
+#%{__rm} -rf %{buildroot}%{_libdir}/*.la
+
+%{__install} -m 0644 src/js*.h src/prmjtime.h src/js.msg src/*.tbl %{buildroot}%{_includedir}/
+
+# For compatibility
+pushd %{buildroot}%{_libdir}
+%{__ln_s} libmozjs185.so.1.0 libmozjs.so.1 
+%{__ln_s} libmozjs185.so.1.0 libjs.so.1 
+%{__ln_s} libmozjs185.so libmozjs.so
+%{__ln_s} libmozjs185.so libjs.so
+popd
+
+%{__install} -m 0644 libjs.pc %{buildroot}%{_libdir}/pkgconfig/
+
+%clean
+%{__rm} -rf %{buildroot}
+
+
+%post -p /sbin/ldconfig
+
+%postun -p /sbin/ldconfig
+
+
+%files
+%defattr(-,root,root,-)
+%doc js/src/README.html
+%{_bindir}/js
+%{_libdir}/*.so.*
+
+%files devel
+%defattr(-,root,root,-)
+%{_bindir}/jscpucfg
+%{_libdir}/pkgconfig/*.pc
+%{_libdir}/*.so
+%{_libdir}/*.a
+%{_includedir}/js
+%{_includedir}/js*.h
+%{_includedir}/*.tbl
+%{_includedir}/js.msg
+%{_includedir}/prmjtime.h
+
+%changelog
+* Thu Jun 23 2011 Pavel Alexeev <Pahan@Hubbitus.info> - 1:1.8.5-7
+- Make build system more proper (bz#710837), thanks to Jasper St. Pierre.
+- Add missing header prmjtime.h (bz#709955), thanks to Jim Meyering.
+- Merge Colin Walters build changes http://www.spinics.net/lists/fedora-devel/msg153214.html (1:1.8.5-6)
+
+* Wed Jun 22 2011 Colin Walters <walters@verbum.org> - 1:1.8.5-6
+- Include mozjs185.pc, clean up build
+- Based on work from Christopher Aillon <caillon@redhat.com>
+- Switch to using make install DESTDIR=, instead of hardcoding build rules.
+- Add DESTDIR= patch from GNOME 3.2 jhbuild
+- Make mozjs185 the canonical target for both libmozjs and libmozjs185.
+
+* Fri May 27 2011 Dan Horák <dan[at]danny.cz> - 1.8.5-5
+- add secondary arch patches from xulrunner
+
+* Tue Apr 12 2011 Christopher Aillon <caillon@redhat.com> - 1.8.5-4
+- devel subpackage needs to ask for the newly added epoch
+
+* Tue Apr 12 2011 Pavel Alexeev <Pahan@Hubbitus.info> - 1.8.5-3
+- Add Epoch: 1 to allow update of 1.70-13 version.
+
+* Sat Apr 9 2011 Pavel Alexeev <Pahan@Hubbitus.info> - 1.8.5-2
+- Correct symlink to provide backward capabiliies libjs.so.1
+
+* Wed Apr 6 2011 Pavel Alexeev <Pahan@Hubbitus.info> - 1.8.5-1
+- Update to release.
+- Remove unneeded anymore patches.
+- Add backward capability symlink.
+
+* Sat Feb 12 2011 Pavel Alexeev <Pahan@Hubbitus.info> - 1.8.5-0.hg51702867d932
+- Build version 1.8.5 by update request - BZ#676441 from Firefox 4.0 mercurial repository.
+- Gone -DJS_C_STRINGS_ARE_UTF8
+- Add BR autoconf213, change build system to use configure.
+- Adopt patch0 (js-1.7.0-make.patch -> js-1.8.5-make.patch)
+- Adopt patch1 (js-shlib.patch -> js-1.8.5-shlib.patch)
+- Remove Patch2 (js-1.5-va_copy.patch) and Patch3 (js-ldflags.patch)
+- Add BR python, zip.
+
+* Wed Feb 09 2011 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 1.70-13
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild
+
+* Wed Jun 16 2010 Pavel Alexeev <Pahan@Hubbitus.info> - 1.70-12
+- Add UTF-8 support (add -DJS_C_STRINGS_ARE_UTF8 ) by request Peter Halliday: BZ#576585
+
+* Mon Jun 14 2010 Dan Horák <dan[at]danny.cz> - 1.70-11
+- updated the va_copy patch for s390
+
+* Mon Jan 25 2010 Pavel Alexeev <Pahan@Hubbitus.info> - 1.70-10
+- Remove static library from -devel - %%{_libdir}/*.a (bz#556057) to meet guidelines.
+
+* Sun Aug 2 2009 Pavel Alexeev <Pahan@Hubbitus.info> - 1.70-8
+- Reformat spec with tabs.
+- By report of Thomas Sondergaard (BZ#511162) Add -DXP_UNIX=1 -DJS_THREADSAFE=1 flags and nspr requires into libjs.pc
+
+* Fri Jul 24 2009 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 1.70-7
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild
+
+* Fri May 29 2009 Dan Horak <dan[at]danny.cz> 1.70-6
+- update the va_copy patch for s390x
+
+* Thu Apr  9 2009 Matthias Saou <http://freshrpms.net/> 1.70-5
+- Update description (#487903).
+
+* Wed Feb 25 2009 Fedora Release Engineering <rel-eng@lists.fedoraproject.org>
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild
+
+* Wed Jun  4 2008 Jon McCann <jmccann@redhat.com> - 1.70-3
+- Add two missing files (#449715)
+
+* Wed Feb 27 2008 Tom "spot" Callaway <tcallawa@redhat.com> - 1.70-2
+- Rebuild for perl 5.10 (again)
+
+* Sun Feb  3 2008 Matthias Saou <http://freshrpms.net/> 1.70-1
+- Update to 1.7.0, as 1.70 to avoid introducing an epoch for now...
+- Remove no longer provided perlconnect parts.
+
+* Thu Jan 24 2008 Tom "spot" Callaway <tcallawa@redhat.com> 1.60-6
+- BR: perl(ExtUtils::Embed)
+
+* Sun Jan 20 2008 Tom "spot" Callaway <tcallawa@redhat.com> 1.60-5
+- rebuild for new perl
+
+* Wed Aug 22 2007 Matthias Saou <http://freshrpms.net/> 1.60-4
+- Rebuild for new BuildID feature.
+
+* Mon Aug  6 2007 Matthias Saou <http://freshrpms.net/> 1.60-3
+- Update License field.
+- Add perl(ExtUtils::MakeMaker) build requirement to pull in perl-devel.
+
+* Fri Feb  2 2007 Matthias Saou <http://freshrpms.net/> 1.60-2
+- Include jsopcode.tbl and js.msg in devel (#235481).
+- Install static lib mode 644 instead of 755.
+
+* Fri Feb  2 2007 Matthias Saou <http://freshrpms.net/> 1.60-1
+- Update to 1.60.
+- Rebuild in order to link against ncurses instead of termcap (#226773).
+- Add ncurses-devel build requirement and patch s/termcap/ncurses/ in.
+- Change mode of perl library from 555 to 755 (#224603).
+
+* Mon Aug 28 2006 Matthias Saou <http://freshrpms.net/> 1.5-6
+- Fix pkgconfig file (#204232 & dupe #204236).
+
+* Mon Jul 24 2006 Matthias Saou <http://freshrpms.net/> 1.5-5
+- FC6 rebuild.
+- Enable JS_THREADSAFE in the build (#199696), add patch and nspr build req.
+
+* Mon Mar  6 2006 Matthias Saou <http://freshrpms.net/> 1.5-4
+- FC5 rebuild.
+
+* Thu Feb  9 2006 Matthias Saou <http://freshrpms.net/> 1.5-3
+- Rebuild for new gcc/glibc.
+
+* Mon Jan 30 2006 Matthias Saou <http://freshrpms.net/> 1.5-2
+- Fix .pc file.
+
+* Thu Jan 26 2006 Matthias Saou <http://freshrpms.net/> 1.5-1
+- Update to 1.5.0 final.
+- Spec file cleanups.
+- Move docs from devel to main, since we need the license there.
+- Remove no longer needed js-perlconnect.patch.
+- Update js-1.5-va_copy.patch.
+- Include a pkgconfig file (#178993).
+
+* Tue Apr 19 2005 Ville Skyttä <ville.skytta at iki.fi> - 1.5-0.rc6a.6
+- Link shared lib with libperl.
+
+* Fri Apr  7 2005 Michael Schwendt <mschwendt[AT]users.sf.net>
+- rebuilt
+
+* Mon Feb 14 2005 David Woodhouse <dwmw2@infradead.org> - 1.5-0.rc6a.4
+- Take js-va_copy.patch out of %%ifarch x86_64 so it fixes the PPC build too
+
+* Sun Feb 13 2005 Thorsten Leemhuis <fedora at leemhuis dot info> - 1.5-0.rc6a.3
+- Add js-va_copy.patch to fix x86_64; Patch was found in a Mandrake srpm
+
+* Sat Dec 11 2004 Ville Skyttä <ville.skytta at iki.fi> - 1.5-0.rc6a.2
+- Include perlconnect.
+- Include readline support, rebuild using "--without readline" to disable.
+- Add libjs* provides for upstream compatibility.
+- Install header files in %%{_includedir} instead of %%{_includedir}/js.
+
+* Tue Jun 15 2004 Matthias Saou <http://freshrpms.net> 1.5-0.rc6a
+- Update to 1.5rc6a.
+
+* Tue Mar 02 2004 Dag Wieers <dag@wieers.com> - 1.5-0.rc6
+- Initial package. (using DAR)
diff --git a/ubuntu-notes.txt b/ubuntu-notes.txt
deleted file mode 100644
index dcb0fb8..0000000
--- a/ubuntu-notes.txt
+++ /dev/null
@@ -1,38 +0,0 @@
-Build notes
------------
-
-Debian 8
-========
-Works perfectly.
-
-Ubuntu 12.04 (precise)
-======================
-1. remove dh-systemd from control file
-2. remove dependency on init-system-helpers from control file
-3. edit rules file to remove --with-systemd
-4. build as usual
-
-Ubuntu 14.04 (trusty)
-=====================
-1. erlang solutions has no 18.3 packages?! grumble.
-
-Ubuntu 16.04 (xenial)
-=====================
-1. Does not recognize vendor profiles anywhere but /usr/share/lintian/profiles
-
-
-Current build script
---------------------
-
-```
-curl http://www.apache.org/dist/couchdb/source/2.0.0/apache-couchdb-2.0.0.tar.gz> apache-couchdb-2.0.0.tar.gz
-mv apache-couchdb-2.0.0.tar.gz /usr/src/couchdb/couchdb_2.0.0.orig.tar.gz
-cd /usr/src/couchdb && tar xfz couchdb_2.0.0.orig.tar.gz
-cd apache-couchdb-2.0.0
-cp -R /path/to/couchdb-pkg/debian .
-export DEBEMAIL="dev@couchdb.apache.org"
-export DEBFULLNAME="CouchDB Developers"
-dpkg-buildpackage -us -uc
-# optional
-cd .. && lintian --profile couchdb couch*deb
-```