Merge pull request #22897 from timor/couchdb-2.0.0

couchdb: add support for version 2.0.0

Changed files
+142 -5
nixos
modules
services
databases
pkgs
servers
http
top-level
+25 -5
nixos/modules/services/databases/couchdb.nix
···
let
cfg = config.services.couchdb;
-
configFile = pkgs.writeText "couchdb.ini"
+
useVersion2 = strings.versionAtLeast (strings.getVersion cfg.package) "2.0";
+
configFile = pkgs.writeText "couchdb.ini" (
''
[couchdb]
database_dir = ${cfg.databaseDir}
uri_file = ${cfg.uriFile}
view_index_dir = ${cfg.viewIndexDir}
-
+
'' + (if useVersion2 then
+
''
+
[chttpd]
+
'' else
+
''
[httpd]
+
'') +
+
''
port = ${toString cfg.port}
bind_address = ${cfg.bindAddress}
[log]
file = ${cfg.logFile}
-
'';
+
'');
+
executable = if useVersion2 then "${cfg.package}/bin/couchdb"
+
else ''${cfg.package}/bin/couchdb -a ${configFile} -a ${pkgs.writeText "couchdb-extra.ini" cfg.extraConfig} -a ${cfg.configFile}'';
in {
···
configFile = mkOption {
type = types.string;
-
default = "/var/lib/couchdb/couchdb.ini";
description = ''
Configuration file for persisting runtime changes. File
needs to be readable and writable from couchdb user/group.
···
config = mkIf config.services.couchdb.enable {
environment.systemPackages = [ cfg.package ];
+
+
services.couchdb.configFile = mkDefault
+
(if useVersion2 then "/var/lib/couchdb/local.ini" else "/var/lib/couchdb/couchdb.ini");
systemd.services.couchdb = {
description = "CouchDB Server";
···
fi
'';
+
environment = mkIf useVersion2 {
+
# we are actually specifying 4 configuration files:
+
# 1. the preinstalled default.ini
+
# 2. the module configuration
+
# 3. the extraConfig from the module options
+
# 4. the locally writable config file, which couchdb itself writes to
+
ERL_FLAGS= ''-couch_ini ${cfg.package}/etc/default.ini ${configFile} ${pkgs.writeText "couchdb-extra.ini" cfg.extraConfig} ${cfg.configFile}'';
+
};
+
serviceConfig = {
PermissionsStartOnly = true;
User = cfg.user;
Group = cfg.group;
-
ExecStart = "${cfg.package}/bin/couchdb -a ${configFile} -a ${pkgs.writeText "couchdb-extra.ini" cfg.extraConfig} -a ${cfg.configFile}";
+
ExecStart = executable;
};
};
+53
pkgs/servers/http/couchdb/2.0.0.nix
···
+
{ stdenv, fetchurl, erlang, icu, openssl, spidermonkey
+
, coreutils, bash, makeWrapper }:
+
+
stdenv.mkDerivation rec {
+
name = "couchdb-${version}";
+
version = "2.0.0";
+
+
src = fetchurl {
+
url = "mirror://apache/couchdb/source/${version}/apache-${name}.tar.gz";
+
sha256 = "1jkfx6g9anrgmkhrkcn50axcamragranwsciw1rhmi86rglkrbyc";
+
};
+
+
buildInputs = [ erlang icu openssl spidermonkey makeWrapper ];
+
+
patches = [ ./jsapi.patch ];
+
postPatch = ''
+
substituteInPlace src/couch/rebar.config.script --replace '-DHAVE_CURL -I/usr/local/include' "-DHAVE_CURL -I/usr/local/include $NIX_CFLAGS_COMPILE"
+
+
patch bin/rebar <<EOF
+
1c1
+
< #!/usr/bin/env escript
+
---
+
> #!${coreutils}/bin/env escript
+
EOF
+
+
'';
+
+
# Configure a username. The build system would use "couchdb" as
+
# default if none is provided. Note that it is unclear where this
+
# username is actually used in the build, as any choice seems to be
+
# working.
+
configurePhase = ''
+
./configure -u nobody
+
'';
+
+
buildPhase = ''
+
make release
+
'';
+
+
installPhase = ''
+
mkdir -p $out
+
cp -r rel/couchdb/* $out
+
wrapProgram $out/bin/couchdb --suffix PATH : ${bash}/bin
+
'';
+
+
meta = with stdenv.lib; {
+
description = "A database that uses JSON for documents, JavaScript for MapReduce queries, and regular HTTP for an API";
+
homepage = "http://couchdb.apache.org";
+
license = licenses.asl20;
+
platforms = platforms.all;
+
maintainers = with maintainers; [ garbas ];
+
};
+
}
+60
pkgs/servers/http/couchdb/jsapi.patch
···
+
diff -ru couch_js/http.c couch_js-patched/http.c
+
--- apache-couchdb-2.0.0/src/couch/priv/couch_js/http.c 2016-09-12 11:28:51.000000000 +0200
+
+++ apache-couchdb-2.0.0-patched/src/couch/priv/couch_js/http.c 2017-02-10 10:52:33.025854045 +0100
+
@@ -15,7 +15,7 @@
+
#include <string.h>
+
#include <sys/types.h>
+
#include <sys/stat.h>
+
-#include <jsapi.h>
+
+#include <js/jsapi.h>
+
#include "config.h"
+
#include "utf8.h"
+
#include "util.h"
+
diff -ru couch_js/main.c couch_js-patched/main.c
+
--- apache-couchdb-2.0.0/src/couch/priv/couch_js/main.c 2016-09-12 11:28:51.000000000 +0200
+
+++ apache-couchdb-2.0.0-patched/src/couch/priv/couch_js/main.c 2017-02-10 10:52:33.001854154 +0100
+
@@ -20,7 +20,7 @@
+
#include <unistd.h>
+
#endif
+
+
-#include <jsapi.h>
+
+#include <js/jsapi.h>
+
#include "config.h"
+
#include "http.h"
+
#include "utf8.h"
+
diff -ru couch_js/utf8.c couch_js-patched/utf8.c
+
--- apache-couchdb-2.0.0/src/couch/priv/couch_js/utf8.c 2016-09-12 11:28:51.000000000 +0200
+
+++ apache-couchdb-2.0.0-patched/src/couch/priv/couch_js/utf8.c 2017-02-10 10:52:33.009854117 +0100
+
@@ -10,7 +10,7 @@
+
// License for the specific language governing permissions and limitations under
+
// the License.
+
+
-#include <jsapi.h>
+
+#include <js/jsapi.h>
+
#include "config.h"
+
+
static int
+
diff -ru couch_js/util.c couch_js-patched/util.c
+
--- apache-couchdb-2.0.0/src/couch/priv/couch_js/util.c 2016-09-12 11:28:51.000000000 +0200
+
+++ apache-couchdb-2.0.0-patched/src/couch/priv/couch_js/util.c 2017-02-10 10:52:33.017854081 +0100
+
@@ -13,7 +13,7 @@
+
#include <stdlib.h>
+
#include <string.h>
+
+
-#include <jsapi.h>
+
+#include <js/jsapi.h>
+
+
#include "help.h"
+
#include "util.h"
+
diff -ru couch_js/util.h couch_js-patched/util.h
+
--- apache-couchdb-2.0.0/src/couch/priv/couch_js/util.h 2016-09-12 11:28:51.000000000 +0200
+
+++ apache-couchdb-2.0.0-patched/src/couch/priv/couch_js/util.h 2017-02-10 10:52:32.988854212 +0100
+
@@ -13,7 +13,7 @@
+
#ifndef COUCHJS_UTIL_H
+
#define COUCHJS_UTIL_H
+
+
-#include <jsapi.h>
+
+#include <js/jsapi.h>
+
+
typedef struct {
+
int no_eval;
+4
pkgs/top-level/all-packages.nix
···
erlang = erlangR16;
+
couchdb2 = callPackage ../servers/http/couchdb/2.0.0.nix {
+
spidermonkey = spidermonkey_1_8_5;
+
};
+
couchpotato = callPackage ../servers/couchpotato {};
dico = callPackage ../servers/dico { };