From db1efe51f8f394899405f3b3459ed7451dc8974b Mon Sep 17 00:00:00 2001 From: David Balatero Date: Mon, 27 Nov 2017 11:40:21 -0800 Subject: [PATCH] Added developer setup script for smoother setup Moved run-osx.sh to scripts/ subdirectory --- .gitignore | 2 + scripts/lib/setup-osx/installers.sh | 105 ++++++++++++++++++++++++++ scripts/lib/setup-osx/output.sh | 76 +++++++++++++++++++ scripts/lib/setup-osx/packages.sh | 89 ++++++++++++++++++++++ scripts/lib/setup-osx/path-support.sh | 19 +++++ scripts/lib/setup-osx/platform.sh | 18 +++++ run-osx.sh => scripts/run-osx | 0 scripts/setup-osx | 54 +++++++++++++ 8 files changed, 363 insertions(+) create mode 100755 scripts/lib/setup-osx/installers.sh create mode 100755 scripts/lib/setup-osx/output.sh create mode 100755 scripts/lib/setup-osx/packages.sh create mode 100644 scripts/lib/setup-osx/path-support.sh create mode 100755 scripts/lib/setup-osx/platform.sh rename run-osx.sh => scripts/run-osx (100%) create mode 100755 scripts/setup-osx diff --git a/.gitignore b/.gitignore index c913638b75..3c7291450a 100644 --- a/.gitignore +++ b/.gitignore @@ -36,6 +36,7 @@ local.properties # node_modules/ npm-debug.log +.nvmrc # BUCK buck-out/ @@ -80,6 +81,7 @@ status-dev-cli #ios ios/Pods ios/StatusIm.xcworkspace +.ruby-version #python *.pyc diff --git a/scripts/lib/setup-osx/installers.sh b/scripts/lib/setup-osx/installers.sh new file mode 100755 index 0000000000..f44fde8011 --- /dev/null +++ b/scripts/lib/setup-osx/installers.sh @@ -0,0 +1,105 @@ +#!/usr/bin/env bash + +function install_node() { + if nvm_installed; then + install_node_via_nvm + else + install_node_via_brew + fi +} + +function install_react_native_cli() { + cd "$(repo_path)" + + if npm list -g | grep -q react-native-cli; then + already_installed "react-native-cli" + else + npm install -g react-native-cli + fi +} + +function install_node_via_nvm() { + local nvmrc="$(repo_path)/.nvmrc" + + cd "$(repo_path)" + + if [ ! -e "$nvmrc" ]; then + cecho "@b@blue[[+ Installing latest stable Node version]]" + + nvm install stable + echo stable > "$nvmrc" + + nvm use + else + nvm use >/dev/null + + local version=$(node -v) + cecho "+ Node already installed ($version via NVM)... skipping." + fi +} + +function install_node_via_brew() { + if ! program_exists "node"; then + brew install node + else + cecho "+ Node already installed ($(node -v) via Homebrew)... skipping." + fi +} + +function required_pod_version() { + cat "$(repo_path)/ios/Podfile.lock" | grep "COCOAPODS: " | awk '{ print $2 }' +} + +function correct_pod_version_is_installed() { + ! program_exists "pod" && return 1 + + [[ "$(required_pod_version)" == "$(pod --version)" ]] +} + +function initialize_rvm() { + cd "$(repo_path)" + + if [ ! -e "$(repo_path)/.ruby-version" ]; then + rvm use --default > /dev/null + echo "$(rvm current)" > .ruby-version + fi + + rvm use . >/dev/null +} + +function install_cocoapods() { + local gem_command="sudo gem" + local destination="system Ruby" + + if program_exists "rvm"; then + initialize_rvm + + gem_command="gem" + destination="RVM ($(rvm current))" + fi + + if ! program_exists "pod"; then + $gem_command install cocoapods + elif ! correct_pod_version_is_installed; then + local version=$(required_pod_version) + + cecho "@b@blue[[+ Updating to cocoapods $version]]" + + $gem_command uninstall cocoapods --ignore-dependencies --silent + $gem_command install cocoapods -v "$version" + else + cecho "+ cocoapods already installed to $destination... skipping." + fi +} + +function dependency_setup() { + cecho "@b@blue[[\$ $@]]" + echo + + cd "$(repo_path)" + eval "$@" + + echo + echo " + done" + echo +} diff --git a/scripts/lib/setup-osx/output.sh b/scripts/lib/setup-osx/output.sh new file mode 100755 index 0000000000..efa858b5d2 --- /dev/null +++ b/scripts/lib/setup-osx/output.sh @@ -0,0 +1,76 @@ +#!/usr/bin/env bash + +function load_color_support() { + # Check if we're in a terminal + if test -t 1; then + local color_count=$(tput colors) + + # Only load colors if our terminal supports them + if test -n "$color_count" && test $color_count -ge 8; then + _color_bold="$(tput bold)" + _color_underline="$(tput sgr 0 1)" + _color_red="$(tput setaf 1)" + _color_green="$(tput setaf 2)" + _color_yellow="$(tput setaf 3)" + _color_blue="$(tput setaf 4)" + _color_magenta="$(tput setaf 5)" + _color_cyan="$(tput setaf 6)" + _color_white="$(tput setaf 7)" + _color_reset="$(tput sgr0)" + fi + fi +} + +load_color_support + +function cecho() { + local colorized=$( + echo "$@" | sed -E \ + -e 's/((@(red|green|yellow|blue|magenta|cyan|white|reset|b|u))+)[[]{2}(.*)[]]{2}/\1\4@reset/g' \ + -e "s/@red/${_color_red}/g" \ + -e "s/@green/${_color_green}/g" \ + -e "s/@yellow/${_color_yellow}/g" \ + -e "s/@blue/${_color_blue}/g" \ + -e "s/@magenta/${_color_magenta}/g" \ + -e "s/@cyan/${_color_cyan}/g" \ + -e "s/@white/${_color_white}/g" \ + -e "s/@reset/${_color_reset}/g" \ + -e "s/@b/${_color_bold}/g" \ + -e "s/@u/${_color_underline}/g" + ) + + echo "$colorized" +} + +function setup_header() { + local header=$1 + + cecho "@b@green[[$header]]" + echo +} + +function already_installed() { + local package=$1 + + cecho "+ $package already installed... skipping" +} + +function setup_complete() { + cecho "@b@blue[[Setup complete!]] +=============== + +There are a few @b[[manual steps]] you might want to do: + +1. Optionally set up Genymotion if you don't want to use Android Virtual Device: + + @blue[[https://www.genymotion.com]] + +2. Setup Android Development Environment + Simulator: + + @blue[[https://facebook.github.io/react-native/docs/android-setup.html]] + +3. Add your SSH public key to Github if it isn't already in there. +" + + echo +} diff --git a/scripts/lib/setup-osx/packages.sh b/scripts/lib/setup-osx/packages.sh new file mode 100755 index 0000000000..40b44eb1e9 --- /dev/null +++ b/scripts/lib/setup-osx/packages.sh @@ -0,0 +1,89 @@ +#!/usr/bin/env bash + +######## +# Install checks +######## + +function program_exists() { + local program=$1 + command -v "$program" >/dev/null 2>&1 +} + +######## +# Homebrew +######## + +function install_homebrew_if_needed() { + ! is_macos && return 0 + + if test ! $(which brew); then + cecho "@b@blue[[+ Installing homebrew]]" + + ruby -e "$(curl -fsSL \ + https://raw.githubusercontent.com/Homebrew/install/master/install)" + + brew update + else + already_installed "Homebrew" + fi +} + +function brew_install() { + local package=$1 + + if ! is_macos; then + return 0 + fi + + if brew list "$package" > /dev/null 2>&1; then + already_installed "$package" + else + brew install $@ + fi +} + +function brew_cask_install() { + local package=$1 + + if ! is_macos; then + return 0 + fi + + if brew cask list | grep -q "$package"; then + already_installed "$package" + else + brew cask install $@ + fi +} + +function brew_tap() { + local cask=$1 + + if ! is_macos; then + return 0 + fi + + if ! brew tap | grep -q "$cask"; then + brew tap "$cask" + fi +} + +############### +# RVM +############### + +function load_rvm_if_available() { + [ -f ~/.rvm/scripts/rvm ] && source ~/.rvm/scripts/rvm +} + +############### +# NVM +############### + +function load_nvm_if_available() { + [ -f ~/.nvm/nvm.sh ] && source ~/.nvm/nvm.sh +} + +function nvm_installed() { + program_exists "nvm" +} diff --git a/scripts/lib/setup-osx/path-support.sh b/scripts/lib/setup-osx/path-support.sh new file mode 100644 index 0000000000..32a1c930ec --- /dev/null +++ b/scripts/lib/setup-osx/path-support.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env bash + +_current_dir=$(cd "${BASH_SOURCE%/*}" && pwd) +_scripts_dir=$(cd "$_current_dir/../.." && pwd) +_repo_dir=$(cd "$_scripts_dir/.." && pwd) + +function scripts_path() { + echo $_scripts_dir +} + +function repo_path() { + echo $_repo_dir +} + +function source_lib() { + local library_path=$1 + + source "$_current_dir/$library_path" +} diff --git a/scripts/lib/setup-osx/platform.sh b/scripts/lib/setup-osx/platform.sh new file mode 100755 index 0000000000..9815d6516e --- /dev/null +++ b/scripts/lib/setup-osx/platform.sh @@ -0,0 +1,18 @@ +#!/usr/bin/env bash + +OS=$(uname -s) + +function is_macos() { + [[ "$OS" =~ Darwin ]] +} + +function exit_unless_mac() { + if ! is_macos; then + cecho "@red[[This install script currently supports Mac OS X only. To +manually install, please visit the wiki for more information:]] + + @blue[[https://wiki.status.im/Building_Status]]" + + echo + fi +} diff --git a/run-osx.sh b/scripts/run-osx similarity index 100% rename from run-osx.sh rename to scripts/run-osx diff --git a/scripts/setup-osx b/scripts/setup-osx new file mode 100755 index 0000000000..9dd45d0c94 --- /dev/null +++ b/scripts/setup-osx @@ -0,0 +1,54 @@ +#!/usr/bin/env bash + +######################################################################## +# This install script will setup your development dependencies on OS X. +# Windows/Linux support is welcome! +# +# Usage: scripts/setup-osx.sh +######################################################################## + +_current_dir=$(cd "${BASH_SOURCE%/*}" && pwd) +source "$_current_dir/lib/setup-osx/path-support.sh" + +source_lib "output.sh" +source_lib "packages.sh" +source_lib "platform.sh" +source_lib "installers.sh" + +exit_unless_mac + +load_nvm_if_available +load_rvm_if_available + +#### +setup_header "Installing requirements..." + +install_homebrew_if_needed +brew_tap "caskroom/cask" + +brew_cask_install "caskroom/versions/java8" +brew_install leiningen + +install_node +brew_install watchman +install_react_native_cli + +brew_cask_install android-sdk +brew_install maven + +install_cocoapods + +#### +echo && setup_header "Installing dependencies..." + +dependency_setup lein deps +dependency_setup npm install +dependency_setup ./re-natal deps +dependency_setup ./re-natal enable-source-maps + +dependency_setup \ + "mvn -f modules/react-native-status/ios/RCTStatus dependency:unpack" + +dependency_setup "cd ios && pod install && cd .." + +setup_complete