#!/bin/sh
#   Copyright (c) 2010-2011, Diaspora Inc.  This file is
#   licensed under the Affero General Public License version 3 or later.  See
#   the COPYRIGHT file.

warning()
{
  echo "WARNING: $1" >&2
}

fatal()
{
  echo "FATAL: $1" >&2
  exit 1
}

on_failure()
{
  if [ $? != 0 ]
  then
    fatal "$1"
  fi
}

# ensure right directory
realpath=$( ruby -e "puts File.expand_path(\"$0\")")
cd $(dirname $realpath)/..

# Check if database.yml exists
if [ ! -e "config/database.yml" ]
then
  fatal "config/database.yml is missing! Copy over config/database.yml.example to config/database.yml and edit it properly!"
fi

# Check if diaspora.toml exists
if [ -e "config/diaspora.toml" ]
then
  CONFIG_FILE="config/diaspora.toml"
elif [ -e "config/diaspora.yml" ]
then
  CONFIG_FILE="config/diaspora.yml"
else
  fatal "config/diaspora.toml is missing! Copy over config/diaspora.toml.example to config/diaspora.toml and edit it properly!"
fi

command -v git > /dev/null 2>&1
if [ $? -eq 0 ]; then
  # Check if we're in a repository, before doing any verification.
  if git status > /dev/null 2>&1;
  then
    # Check if git merge is in progress
    if [ -f .git/MERGE_MODE ]; then
      fatal "A git merge is in progress!"
    fi

    # Check if detached head state
    git_branch_name="$(git symbolic-ref HEAD 2>/dev/null)"
    if [ -z "$git_branch_name" ];
    then
      warning "You are in detached HEAD state!"
    fi
  fi
fi

# Do RVM checks if RVM is being used
command -v rvm > /dev/null 2>&1
if [ $? -eq 0 ]; then
  rvm_gemset="$(rvm current | cut -d"@" -f2)"
  project_gemset="$(cat .ruby-gemset | tr -d " \t\n\r")"
  if [ "$rvm_gemset" != "$project_gemset" ]; then
    warning "Project gemset is $project_gemset but you are using $rvm_gemset"
  fi
fi

# Check if bundle is complete
if ! bin/bundle check > /dev/null
then
  fatal "Your bundle is not up to date, run the command \"bundle install\""
fi

# Setup environment
if [ -z "$RAILS_ENV" ]
then
  RAILS_ENV=$(bin/bundle exec ruby ./script/get_config.rb server.rails_environment | grep -vE "is not writable|as your home directory temporarily" )
  on_failure "Couldn't parse $CONFIG_FILE!"
  export RAILS_ENV
fi


os=$(uname -s)
vars=$(bin/bundle exec ruby ./script/get_config.rb \
  workers=server.sidekiq_workers \
  redis_url=environment.redis \
  | grep -vE "is not writable|as your home directory temporarily"
)
on_failure "Couldn't parse $CONFIG_FILE!"
eval "$vars"

# Force AGPL
if [ -w "public" -a ! -e  "public/source.tar.gz" ]
then
  if command -v git > /dev/null 2>&1 && git rev-parse --is-inside-work-tree > /dev/null 2>&1
  then
    commit_sha=$(git rev-parse HEAD)
    tar czf public/source.tar.gz  $(git ls-tree -r $commit_sha | awk '{print $4}')
  else
    fatal "Can't generate public/source.tar.gz for you.
Please tar up a copy of your Diaspora installation and place it there."
  fi
fi

if [ ! -e "public/source.tar.gz" ]
then
  fatal "Can't find public/source.tar.gz"
fi

# Check if assets are precompiled
if [ "$RAILS_ENV" = "production" -a -z "$(find public/assets/ -maxdepth 1 -name 'main-*.js' -print -quit 2>/dev/null)" ]
then
  fatal "You're running in production mode without having assets
precompiled. Now and after each update before you restart the
application, run:
    bin/rake assets:precompile"
fi

# Check if redis is running
if [ -n "$redis_url" ]
then
  redis_param="url: '$redis_url'"
fi
if [ "$(bin/bundle exec ruby -e "require 'redis-client'; puts RedisClient.config($redis_param).new_client.call('PING')" 2> /dev/null | grep -vE "is not writable|as your home directory temporarily" )" != "PONG" ]
then
  fatal "Can't connect to redis. Please check if it's running and if environment.redis is configured correctly in $CONFIG_FILE."
fi

# Check for old curl versions (see https://github.com/diaspora/diaspora/issues/4202)
if [ `curl -V | grep AsynchDNS | wc -l` -ne 1 ]
then
  warning "
*****************************************************************
curl does not support async DNS, this can cause Sidekiq to crash!
Please update curl to version 7.32, see issue
https://github.com/diaspora/diaspora/issues/4202 for details
*****************************************************************
"
fi

# Use libjemalloc if it's available for better memory usage
command -v ldconfig > /dev/null 2>&1
if [ $? -eq 0 ]; then
  ldconfig=ldconfig
elif [ -x /sbin/ldconfig ]; then
  ldconfig=/sbin/ldconfig
fi
if [ -n "${ldconfig}" ]; then
  jemalloc_path=$(${ldconfig} -p | grep jemalloc | tr ' ' '\n' | grep '^/' | head -1)

  if [ -n "${jemalloc_path}" ]; then
    export LD_PRELOAD="${jemalloc_path}"
  fi
fi

# Start Diaspora
echo "Starting Diaspora in $RAILS_ENV mode with $workers Sidekiq worker(s)."
exec bin/foreman start -c -m all=1,sidekiq=$workers
