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
-```