#!/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.

# The purpose of this script is to initialize environment variables and Erlang
# configuration files so that couchdb will run inside a Snap package's confinement

export HOME=$SNAP_DATA
export COUCHDB_ARGS_FILE=${SNAP_DATA}/etc/vm.args
export ERL_FLAGS="-couch_ini ${SNAP}/rel/couchdb/etc/default.ini ${SNAP_DATA}/etc/local.d ${SNAP_DATA}/etc/local.ini"

mkdir -p ${SNAP_DATA}/etc 

if [ ! -e ${SNAP_DATA}/etc/vm.args ]; then
    cp ${SNAP}/rel/couchdb/etc/vm.args ${SNAP_DATA}/etc/vm.args
fi

if [ ! -d ${SNAP_DATA}/etc/local.d ]; then
    mkdir ${SNAP_DATA}/etc/local.d
    cp ${SNAP}/rel/couchdb/etc/local.d/*.ini ${SNAP_DATA}/etc/local.d
fi

if [ ! -e ${SNAP_DATA}/etc/local.ini ]; then
    touch ${SNAP_DATA}/etc/local.ini
fi

exec ${SNAP}/rel/couchdb/bin/couchdb
