# Mac Setup Script

Borrowed and customized from nickytonline@github (opens new window).

Does this work? They've done studies, you know. 60% of the time, it works every time.

#!/bin/sh

# log setup
timestamp=$(date +%Y-%m-%d)
logFile="./mac-setup-$timestamp.log"

# clear out log file
> $logFile

beginStep() {
    echo "DEBUG: Starting installation for $1..." | tee -a $logFile
}

endStep() {
    echo "DEBUG: Completed installation for $1.\n" | tee -a $logFile
}

isCmdInstalled() {
    command -v $1 >/dev/null 2>&1 || return 1

    return 0
}

function joinBy() {
    local IFS="$1";
    shift;
    echo "$*";
}

didBrewInstall() {
    local pkg=${1:-""}
    local checkCask=${2:-""}

    if [ -n "$checkCask" ]; then
        cmd="brew cask"
    else
        cmd="brew"
    fi

    if ! isCmdInstalled $1; then
        return 1
    fi

    local pgkPath=$($cmd ls --versions $pkg)

    if [ -n "$pgkPath" ]; then
        return 0
    else
        return 1
    fi
}

function installComposer() {
    local EXPECTED_SIGNATURE=$(wget -q -O - https://composer.github.io/installer.sig)
    php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
    local ACTUAL_SIGNATURE=$(php -r "echo hash_file('SHA384', 'composer-setup.php');")

    if [ "$EXPECTED_SIGNATURE" != "$ACTUAL_SIGNATURE" ]
    then
        >&2 echo 'ERROR: Invalid installer signature'
        rm composer-setup.php
        return 1
    fi

    php composer-setup.php --quiet --install-dir=/usr/local/bin --filename=composer
    RESULT=$?
    rm composer-setup.php

    echo "Composer install script returned $RESULT"

    return $RESULT
}

brewPkgs=(
    node
    z
    zsh
)

brewCaskPkgs=(
    alfred
    boom-3d
    docker
    filezilla
    firefox
    font-input
    google-chrome
    iterm2
    ngrok
    sequel-pro
    sizeup
    slack
    spotify
    visual-studio-code
)

# TODO: implement
ohMyZshPlugins=(
    zsh-completions
    zsh-autosuggestions
)

# TODO: implement
yarnPkgs=(

)

vsCodeExtensions=(
    Dart-Code.dart-code
    KTamas.laravel-blade
    esbenp.prettier-vscode
    felixfbecker.php-intellisense
    marcostazi.VS-code-drupal
    mikestead.dotenv
    mrmlnc.vscode-apache
    octref.vetur
    pnp.polacode
    sysoev.language-stylus
    taniarascia.new-moon-vscode
    whatwedo.twig
)

customPath=(
    $HOME/.config/yarn/global/node_modules/.bin
    $HOME/.composer/vendor/bin
    /Applications/Visual Studio Code.app/Contents/Resources/app/bin
)

echo "Installing applications. You may be prompted at certain points to provide your password.\n" | tee -a $logFile

xcodeCLDTPath=$(xcode-select -p)

if [ -z "$xcodeCLDTPath" ]; then
    beginStep "Command Line Developer Tools"
    xcode-select --install | tee -a $logFile
    endStep "Command Line Developer Tools"
fi

# check for brew; install if not found
command -v brew >/dev/null 2>&1 || {
    beginStep "Homebrew"
    /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" | tee -a $logFile
    endStep "Homebrew"

    beginStep "Homebrew Cask"
    brew tap caskroom/cask | tee -a $logFile
    endStep

    beginStep "Homebrew Cask Fonts"
    brew tap caskroom/fonts | tee -a $logFile
    endStep
} | tee -a $logFile

if ! didBrewInstall "ruby"; then
    beginStep "Moving Ruby to Brew"
    brew install ruby --force --overwrite | tee -a $logFile
    endStep "Moving Ruby to Brew"
fi

# check for composer; install if not found
command -v composer >/dev/null 2>&1 || {
    beginStep "Composer"
    installComposer | tee -a $logFile
    endStep "Composer"
}

# install homebrew packages
for pkg in "${brewPkgs[@]}"; do
    beginStep $pkg
    brew install $pkg | tee -a $logFile
    endStep $pkg
done

# oh my zsh
if ! didBrewInstall "zsh"; then
    sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)" | tee -a $logFile
fi

# update path
customPathJoined=$(joinBy : "${customPath[@]}")

# install brew cask apps
for pkg in "${brewCaskPkgs[@]}"; do
    beginStep $pkg
    brew cask install $pkg | tee -a $logFile
    endStep $pkg
done

# install vscode extensions
for ext in "${vsCodeExtensions[@]}"; do
    beginStep $ext
    code --install-extension $ext | tee -a $logFile
    endStep $ext
done

# cleanup
brew upgrade
brew cleanup
brew cask upgrade
brew cask cleanup

echo "A setup log is available at $logFile."
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202