Skip to content

Instantly share code, notes, and snippets.

@ivanrodjr
Last active June 20, 2021 21:59
Show Gist options
  • Save ivanrodjr/1870167dbf0d93acd0779d9a9fe68fb5 to your computer and use it in GitHub Desktop.
Save ivanrodjr/1870167dbf0d93acd0779d9a9fe68fb5 to your computer and use it in GitHub Desktop.

Revisions

  1. ivanrodjr revised this gist Jun 20, 2021. 2 changed files with 5 additions and 2 deletions.
    2 changes: 1 addition & 1 deletion macos-setup.sh
    Original file line number Diff line number Diff line change
    @@ -142,7 +142,7 @@ brew install gpg2 gnupg pinentry-mac
    # Make the gnupg dir#
    mkdir ~/.gnupg
    # Write our configuration to it
    echo 'pinentry-program $(brew --prefix)/bin/pinentry-mac' > ~/.gnupg/gpg-agent.conf
    echo 'pinentry-program /usr/local/bin/pinentry-mac' > ~/.gnupg/gpg-agent.conf
    # This tells gpg to use the gpg-agent
    echo 'use-agent' > ~/.gnupg/gpg.conf
    export GPG_TTY=`tty`
    5 changes: 4 additions & 1 deletion oh-my-custom.sh
    Original file line number Diff line number Diff line change
    @@ -12,11 +12,14 @@ echo "Plugin installation complete"
    # Configure oh-my-zsh plugins
    echo "Configuring plugins..."
    # Add zsh-syntax-highlighting.zsh to the end of the .zshrc file
    echo "source ~/.oh-my-zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh" >> ~/.zshrc
    echo "source ~/.oh-my-zsh/custom/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh" >> ~/.zshrc
    # Add the plugins you want to enable below
    sed -io 's/^plugins=.*/plugins=(git zsh-autosuggestions zsh-syntax-highlighting)/' ~/.zshrc
    echo "Plugin configuration complete"

    # Disable verbose zsh
    echo 'ZSH_DISABLE_COMPFIX=true' >> ~/.zshrc

    # Install custom shell theme > Substitute for yours > https://github.com/ohmyzsh/ohmyzsh/wiki/Themes
    ### Powerline10k https://github.com/romkatv/powerlevel10k
    echo "Installing custom shell theme..."
  2. ivanrodjr revised this gist Jun 20, 2021. 2 changed files with 32 additions and 16 deletions.
    30 changes: 16 additions & 14 deletions mac-os-setup.md
    Original file line number Diff line number Diff line change
    @@ -2,33 +2,35 @@
    Setup for Mac OS
    ================

    Consolidated setup script for setting up a new MacOS installation.
    This script tries to be as flexible and as helpful as possible, while keeping the user intervention to a minimum.
    Ultimate setup script for setting up a new MacOS installation.

    **User carefuly.**
    This script tries to be as flexible and as helpful as possible while keeping the user intervention to a minimum.

    **Use carefully**

    The `macos-setup` script will:

    - Installs `apple command line tools` and waits until it finishes to continue the script
    - Install and set ZSH as default shell
    - Installs brew if not yet installed
    - Install core utilities
    - Install and set `ZSH` as default shell
    - Installs `brew` if not yet installed
    - Installs core utilities and more if specified
    - Installs all cli and cask packages you specify
    - Configures git
    * Creates your SSH key and adds the passphrase to the keychain (copy snippet and repeat for more keys)
    * Configures GPG ~50% (only installation and config of necessary tools) *For now generation must be done manually after the script runs
    - Configures `git`
    * Creates your `SSH key` and adds the passphrase to the keychain (copy snippet and repeat for more keys)
    * Configures GPG ~50% (only installation and config of necessary tools) *For now generation must be done manually after the script runs, when done uncomment `gpgsign = true` in git config file
    * Adds a git config file (edit to your preferences)
    * Adds commit msg validation hook, global ignore and commit message template
    - Configures dev environment
    * Installs and configures java you specify and jenv
    * Installs other dev tools if uncommented
    * Installs and configures the `java jdk` you specify and `jenv`
    * Installs other dev tools if needed (docker, node, deno, rust etc...)
    - Adds your vimrc config
    - Installs all custom fonts you specify
    - Configures MacOS
    - Configures MacOS properties to your liking
    - Installs oh-my-zsh

    The `oh-my-custom` script will:

    - Provide a way to install and configure any `oh-my-custom` plugins you specify
    - Provide a way to install and configure all `oh-my-custom` plugins you specify
    - Install a custom shell theme like `powerlevel10k` or `starship`

    Enjoy
    **Enjoy**
    18 changes: 16 additions & 2 deletions macos-setup.sh
    Original file line number Diff line number Diff line change
    @@ -19,6 +19,7 @@
    # - https://opensource.com/article/19/5/python-3-default-mac
    # - https://opensource.com/article/19/5/python-3-default-mac
    # - https://github.com/mathiasbynens/dotfiles
    # - https://gist.github.com/simonista/8703722

    # ## 0 - Either chmod this file or ask for the administrator password upfront:
    sudo -v
    @@ -238,7 +239,7 @@ cat > ~/.gitconfig <<- "EOF"
    # Prevent commit status from attaching below the custom template
    status = false
    # Ensures that all of your commits are signed by your GPG key.
    gpgsign = true
    # gpgsign = true
    [merge]
    # Get an error unless every merge is fast-forward
    ff = only
    @@ -409,7 +410,7 @@ printf "\n${JIRA_URL}/${TRIMMED}" >> $1
    # Remove trailing blank lines
    sed -i.bak -e :a -e '/^\n*$/{$d;N;ba' -e '}' $1
    EOF
    # Make it the above hook executable
    # Make the above hook executable
    chmod 755 ~/.git-templates/hooks/commit-msg

    ## Add global .gitignore file
    @@ -519,6 +520,19 @@ cat > ~/.git-templates/.git-commit-msg-template.txt <<- "EOF"
    # Edit allowed works in commit-msg hook
    EOF

    ############
    ## VIM
    ############
    ## Add your vimrc config below
    ## https://gist.github.com/simonista/8703722
    echo "Adding vimrc configuration..."
    cat > ~/.vimrc <<- "EOF"
    set textwidth=72
    set colorcolumn=73
    syntax on
    EOF


    # # #############
    # # # JAVA
    # # #############
  3. ivanrodjr revised this gist Jun 20, 2021. 2 changed files with 34 additions and 0 deletions.
    34 changes: 34 additions & 0 deletions mac-os-setup.md
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,34 @@

    Setup for Mac OS
    ================

    Consolidated setup script for setting up a new MacOS installation.
    This script tries to be as flexible and as helpful as possible, while keeping the user intervention to a minimum.

    **User carefuly.**

    The `macos-setup` script will:

    - Installs `apple command line tools` and waits until it finishes to continue the script
    - Install and set ZSH as default shell
    - Installs brew if not yet installed
    - Install core utilities
    - Installs all cli and cask packages you specify
    - Configures git
    * Creates your SSH key and adds the passphrase to the keychain (copy snippet and repeat for more keys)
    * Configures GPG ~50% (only installation and config of necessary tools) *For now generation must be done manually after the script runs
    * Adds a git config file (edit to your preferences)
    * Adds commit msg validation hook, global ignore and commit message template
    - Configures dev environment
    * Installs and configures java you specify and jenv
    * Installs other dev tools if uncommented
    - Installs all custom fonts you specify
    - Configures MacOS
    - Installs oh-my-zsh

    The `oh-my-custom` script will:

    - Provide a way to install and configure any `oh-my-custom` plugins you specify
    - Install a custom shell theme like `powerlevel10k` or `starship`

    Enjoy
    File renamed without changes.
  4. ivanrodjr revised this gist Jun 20, 2021. 1 changed file with 370 additions and 1 deletion.
    371 changes: 370 additions & 1 deletion macos-setup.sh
    Original file line number Diff line number Diff line change
    @@ -121,7 +121,6 @@ echo "Apps installation complete"
    # # # GIT
    # # #############
    echo "Configuring GIT"
    # brew install git-extras
    ## To increase security of your key this will automatically add it to the keychain
    echo "Creating your SSH key...add a passphrase"
    ssh-keygen -t ed25519 -f ~/.ssh/github_id_ed25519 -C "[email protected]"
    @@ -150,6 +149,376 @@ chmod 700 ~/.gnupg
    # When the script is done go here to complete the gpg setup
    # https://gist.github.com/troyfontaine/18c9146295168ee9ca2b30c00bd1b41e#step-7-create-your-gpg-key

    ## Add your git configs below
    # brew install git-extras
    ## Or configure aliases below
    echo "Adding git global configuration file..."
    cat > ~/.gitconfig <<- "EOF"
    [user]
    name = your name
    email = your email
    [color]
    # Enable colors in color-supporting terminals
    ui = auto
    [init]
    templatedir = ~/.git-templates
    defaultBranch = main
    [alias]
    # List available aliases
    aliases = !git config -l | grep alias | cut -c 7-
    # Display state of working dir
    s = status
    # Add files to the staging area
    a = add .
    # Creates a commit and opens default editor e.g. vim
    c = commit
    # Creates a commit, bypasses default editor and adds the message e.g. git cm "Add whatever..."
    cm = commit -m
    # Checkout a specific branch
    co = checkout
    # Create branch and checkout
    cob = checkout -b
    # Show all remote branches
    remotes = remote -v
    # Show all branches
    ab = branch -av
    # Delete branch
    db = branch -D
    # Deletes all branches except master or main (change the name) CAREFUL
    deleteAll = !git branch | grep -v master | xargs git branch -D
    # Rename current branch
    rename = branch -M
    # Disables push to upstream
    disable = remote set-url --push upstream DISABLED
    # Log with super powers
    lg = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset'
    # Log that shows the last 10 commits...change the number for more
    lgs = log -10 --color=always --all --graph --topo-order --pretty='%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative
    # Push current feature branch
    pb = !git push --set-upstream origin \"$(git rev-parse --abbrev-ref HEAD)\"
    # Ensure that force-pushing won't lose someone else's work (only mine).
    push-with-lease = push --force-with-lease
    # Rebase won’t trigger hooks on each "replayed" commit.
    # This is an ugly hack that will replay each commit during rebase with the
    # standard `commit` command which will trigger hooks.
    rebase-with-hooks = rebase -x 'git reset --soft HEAD~1 && git commit -C HEAD@{1}'
    # List local commits that were not pushed to remote repository
    review-local = !git lg @{push}..
    # Edit last commit message
    amend = commit --amend
    # Undo last commit but keep changed files in stage
    undo = reset --soft HEAD~1
    # Remove file(s) from Git but not from disk
    untrack = rm --cached
    # Deletes any local branch which has been deleted from the remote
    fp = fetch --prune
    # Ensures that when you stash, you catch the new files you haven’t caught with a git add yet. a.k.a stash-all
    sa = stash save --include-untracked
    # Pop the stash in the current branch
    sp = stash pop
    # Removes the saved stash
    sd = stash drop
    # Fetch origin
    fo = fetch origin
    # Fetch upstream
    fu = fetch upstream
    # CAREFUL WITH BELOW COMMANDS >> See Rebase docs
    # Rebase origin/master
    ro = rebase origin/master
    # Rebase upstream/master
    ru = rebase upstream/master
    # Rebase master
    rem = rebase master
    [status]
    # Shows you all of the files underneath that new directory during a git status (slow in very large repos)
    showUntrackedFiles = all
    [commit]
    # Git commit default message template
    template = ~/.git-templates/.git-commit-msg-template.txt
    # Prevent commit status from attaching below the custom template
    status = false
    # Ensures that all of your commits are signed by your GPG key.
    gpgsign = true
    [merge]
    # Get an error unless every merge is fast-forward
    ff = only
    # Intended changes from the ‘left’ and the intended changes from the ‘right, with third section of the original changes before ‘left’ and ‘right’ tried to change it.
    conflictstyle = diff3
    [core]
    # Hooks directory
    hooksPath = ~/.git-templates/hooks
    # Global ignore file
    excludesfile = ~/.git-templates/.gitignore_global
    [diff]
    # Use better, descriptive initials (c, i, w) instead of a/b.
    mnemonicPrefix = true
    # Show renames/moves as such
    renames = true
    # When using --word-diff, assume --word-diff-regex=.
    wordRegex = .
    # Display submodule-related information (commit listings)
    submodule = log
    [log]
    # Use abbrev SHAs whenever possible/relevant instead of full 40 chars
    abbrevCommit = true
    # Automatically --follow when given a single path
    follow = true
    # Disable decorate for reflog
    # (because there is no dedicated `reflog` section available)
    decorate = false
    [color "branch"]
    # Blue on black is hard to read in git branch -vv: use cyan instead
    upstream = cyan
    [color "status"]
    added = green
    changed = yellow
    untracked = red
    [gpg]
    program = /usr/local/bin/gpg
    [push]
    default = simple
    EOF

    echo "Adding commit message validation hook..."
    ## https://gist.github.com/ivanrodjr/e1b5454ec1593ea753776bdc5b44ce9a#file-git-commit-msg-template
    mkdir -p ~/.git-templates/hooks
    cat > ~/.git-templates/hooks/commit-msg <<- "EOF"
    #!/bin/bash
    commit_msg="${1}"
    commit_msg_lines=()
    error_msg="[COMMIT FAILED]"
    allowed_subject_verbs=('Add' 'Create' 'Update' 'Change' 'Fix' 'Refactor' 'Clean up' 'Remove' 'Move' 'Delete' 'Resolve' 'Merge' 'Initial')
    JIRA_URL="https://yourjiraurl.net/browse"
    # Splits the commit msg into separate lines and adds them to an array
    split_commit_msg() {
    while IFS= read -r line; do
    # Trim trailing spaces from lines
    shopt -s extglob
    line="${line%%*( )}"
    shopt -u extglob
    # Ignore comments (lines starting with #)
    if [[ ! "${line}" =~ ^# ]]; then
    commit_msg_lines+=("${line}")
    fi
    done < <(cat ${commit_msg})
    }
    # Validates the commit msg
    validate_commit_msg() {
    split_commit_msg
    # Store the subject
    local subject="${commit_msg_lines[0]}"
    # Stop validation if the message is empty or no subject is set
    if [[ -z "${commit_msg_lines[*]}" ]] || [[ -z "${subject}" ]]; then
    exit 0
    fi
    # Check if the subject has leading whitespace(s)
    if [[ "${subject}" =~ ^[[:space:]]+ ]]; then
    echo "${error_msg} The subject can not have leading whitespace"
    exit 1;
    fi
    # Check if the subject contains more than 1 word
    if [[ $(echo "${subject}" | wc -w) -eq 1 ]]; then
    echo "${error_msg} The subject has to contain more than 1 word"
    exit 1
    fi
    # Check if the subject is separated from the body with a blank line
    if [[ ${#commit_msg_lines[@]} -gt 1 ]] && [[ -n "${commit_msg_lines[1]}" ]]; then
    echo "${error_msg} Separate subject from body with a blank line"
    exit 1
    fi
    # Check if the subject line is limited to 50 characters
    if [[ "${#subject}" -gt 50 ]]; then
    echo "${error_msg} Limit the subject line to 50 characters (${#commit_msg_lines[0]} characters used)"
    exit 1
    fi
    # Check if the subject line is capitalized
    if [[ ! "${subject}" =~ ^[A-Z] ]]; then
    echo "${error_msg} Capitalize the subject line"
    exit 1
    fi
    # Check if the subject line does not end with a period
    if [[ ! "${subject}" =~ [^\.]$ ]]; then
    echo "${error_msg} Do not end the subject line with a period"
    exit 1
    fi
    # Check if the subject starts with one of the allowed verbs
    local first_word=$(echo "${subject}" | awk '{print $1;}')
    local is_allowed=false
    for verb in "${allowed_subject_verbs[@]}"; do
    if [[ "${verb}" == "${first_word}" ]]; then
    is_allowed=true
    fi
    done
    if [[ "${is_allowed}" == false ]]; then
    echo "${error_msg} Use the imperative mood in the subject line"
    echo "Your subject has to start with one of the following verbs:"
    printf -- ' - %s\n' "${allowed_subject_verbs[@]}"
    exit 1
    fi
    # Check if the body is wrapped at 72 characters (except for url's)
    for line in "${commit_msg_lines[@]}"; do
    if [[ "${line}" =~ ^[[:space:]]*(https?|ftp|file):\/\/[-A-Za-z0-9\+\&\@\#\/\%\?\=\~\_\|\!\:\,\.\;]*[-A-Za-z0-9\+\&\@\#\/\%\=\~\_\|] ]]; then
    continue
    elif [[ "${#line}" -gt 72 ]]; then
    echo "${error_msg} Wrap the body at 72 characters (${#line} characters used)"
    exit 1
    fi
    done
    }
    validate_commit_msg
    # Remove comment lines from the message
    sed -i.bak '/^#/ d' $1
    # Add Jira ticket number from branch to the commit message
    if [ -z "$BRANCHES_TO_SKIP" ]; then
    BRANCHES_TO_SKIP=(master main develop staging test)
    fi
    # Get the current branch name and check if it is excluded
    BRANCH_NAME=$(git symbolic-ref --short HEAD)
    BRANCH_EXCLUDED=$(printf "%s\n" "${BRANCHES_TO_SKIP[@]}" | grep -c "^$BRANCH_NAME$")
    # Trim it down to get the parts we're interested in
    TRIMMED=$(echo $BRANCH_NAME | sed -e 's:^\([^-]*-[^-]*\)-.*:\1:' -e \
    'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/')
    # If it isn't excluded, preprend the trimmed branch identifier to the given message
    if [ -n "$BRANCH_NAME" ] && ! [[ $BRANCH_EXCLUDED -eq 1 ]]; then
    sed -i.bak -e "1s/^/[$TRIMMED] /" $1
    fi
    # Add the ticket url at the end of the commit description
    printf "\n${JIRA_URL}/${TRIMMED}" >> $1
    # Remove trailing blank lines
    sed -i.bak -e :a -e '/^\n*$/{$d;N;ba' -e '}' $1
    EOF
    # Make it the above hook executable
    chmod 755 ~/.git-templates/hooks/commit-msg

    ## Add global .gitignore file
    ## https://gist.github.com/jacobtomlinson/aace65a6920e44348d501da5e13a5a17#file-gitignore_global
    echo "Adding git global ignore file..."
    cat > ~/.git-templates/.gitignore_global<<- "EOF"
    # Compiled source #
    ###################
    *.com
    *.class
    *.dll
    *.exe
    *.o
    *.so
    *.pyc
    *.pyo
    # Packages #
    ############
    # it's better to unpack these files and commit the raw source
    # git has its own built in compression methods
    *.7z
    *.dmg
    *.gz
    *.iso
    *.jar
    *.rar
    *.tar
    *.zip
    *.msi
    # Logs and databases #
    ######################
    *.log
    *.sql
    *.sqlite
    npm-debug.log
    # OS generated files #
    ######################
    .DS_Store
    .DS_Store?
    ._*
    .Spotlight-V100
    .Trashes
    ehthumbs.db
    Thumbs.db
    desktop.ini
    # Temporary files #
    ###################
    *.bak
    *.swp
    *.swo
    *~
    *#
    # IDE files #
    #############
    .vscode
    .idea
    .iml
    *.sublime-workspace
    EOF

    ## Add default commit message
    ## https://gist.github.com/ivanrodjr/e1b5454ec1593ea753776bdc5b44ce9a#file-commit-msg
    echo "Adding default commit message..."
    cat > ~/.git-templates/.git-commit-msg-template.txt <<- "EOF"
    # If applied, this commit will... (max 50 characters long)
    # Body - Explain things in more detail, possibly giving some
    # background about what is being added or the issue being fixed, etc.
    # (Wrap at 72 characters)
    # Fixes #XXXX
    # Provide links to any relevant tickets, articles or other resources
    #------------------------------------------------@---------------------*
    #
    # Remember the seven rules of a great Git commit message:
    # - Separate subject from body with a blank line
    # - Limit the subject line to 50 characters (@)
    # - Capitalize the subject line
    # - Do not end the subject line with a period
    # - Use the imperative mood in the subject line
    # - Wrap the body at 72 characters (*)
    # - Use the body to explain what and why vs. how
    #
    # More info: https://chris.beams.io/posts/git-commit/
    #
    # The allowed first words for the subject are:
    # - Add
    # - Create
    # - Update
    # - Change
    # - Fix
    # - Refactor
    # - Clean up
    # - Remove
    # - Move
    # - Delete
    # - Resolve
    # - Merge
    # - Initial
    # Edit allowed works in commit-msg hook
    EOF

    # # #############
    # # # JAVA
    # # #############
  5. ivanrodjr revised this gist Jun 20, 2021. 2 changed files with 17 additions and 21 deletions.
    26 changes: 8 additions & 18 deletions macos-setup.sh
    Original file line number Diff line number Diff line change
    @@ -65,7 +65,7 @@ echo "Installing system core utilities..."
    brew install coreutils
    brew install openssh
    ###################### uncomment if you understand whats below
    # Uncomment for GNU core utils

    # brew install gnu-sed --with-default-names
    # brew install gnu-tar --with-default-names
    # brew install gnu-indent --with-default-names
    @@ -77,43 +77,32 @@ brew install openssh
    ## There is a conflict between the GNU parallel utility and the shipped parallel on the moreutils package. If you want to install GNU parallel instead of the moreutils’ parallel, use the following commands:
    # brew install moreutils --without-parallel
    # brew install parallel

    ######################
    brew install findutils
    # Install latest Bash
    brew install bash
    echo "Core utilities installation cli complete"
    echo "Core utilities installation complete"

    # 1.2 - Add your preferred packages
    PACKAGES=(
    git
    tree
    vim
    wget
    scrcpy
    hugo
    speedtest-cli
    )
    echo "Installing CLI packages..."
    brew install ${PACKAGES[@]}
    echo "CLI packages installation complete"

    # 1.3 - Add your preferred apps
    # 1.3 - Add your preferred apps
    CASKS=(
    flux
    iterm2
    plex-media-server
    postman
    1password
    the-unarchiver
    appcleaner
    visual-studio-code
    transmission
    spotify
    jetbrains-toolbox
    calibre
    notion
    rectangle
    charles
    )
    echo "Installing apps..."
    brew install --cask ${CASKS[@]}
    @@ -135,15 +124,16 @@ echo "Configuring GIT"
    # brew install git-extras
    ## To increase security of your key this will automatically add it to the keychain
    echo "Creating your SSH key...add a passphrase"
    ssh-keygen -t rsa -b 4096
    ssh-keygen -t ed25519 -f ~/.ssh/github_id_ed25519 -C "[email protected]"
    echo "Adding SSH key to Keychain"
    ssh-add ~/.ssh/id_rsa
    ssh-add ~/.ssh/github_id_ed25519
    echo "Setting SSH to always use keychain for the passphrase"
    cat <<EOT >> ~/.ssh/config
    Host *
    IgnoreUnknown UseKeychain
    UseKeychain yes
    AddKeysToAgent yes
    IdentityFile ~/.ssh/id_rsa
    IdentityFile ~/.ssh/github_id_ed25519
    EOT

    echo "Configuring GPG signing"
    12 changes: 9 additions & 3 deletions oh-my-custom
    Original file line number Diff line number Diff line change
    @@ -17,12 +17,18 @@ echo "source ~/.oh-my-zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlightin
    sed -io 's/^plugins=.*/plugins=(git zsh-autosuggestions zsh-syntax-highlighting)/' ~/.zshrc
    echo "Plugin configuration complete"

    # Install custom theme > Substitute for yours > https://github.com/ohmyzsh/ohmyzsh/wiki/Themes
    echo "Installing custom theme..."
    # Install custom shell theme > Substitute for yours > https://github.com/ohmyzsh/ohmyzsh/wiki/Themes
    ### Powerline10k https://github.com/romkatv/powerlevel10k
    echo "Installing custom shell theme..."
    git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k
    # Enable Powelevel10k as default theme
    sed -io 's#^ZSH_THEME.*#ZSH_THEME="powerlevel10k/powerlevel10k"#' ~/.zshrc
    echo "Theme installation complete"
    ## For starship theme comment above uncomment below
    ### Starship https://starship.rs/
    #brew install starship
    #sed -io 's#^ZSH_THEME.*#\#ZSH_THEME=""#' ~/.zshrc
    #echo 'eval "$(starship init zsh)"'

    echo "Theme installation complete"
    echo "Completed oh-my-zsh setup for $(whoami)"
    source $ZSH/oh-my-zsh.sh
  6. ivanrodjr created this gist Jun 20, 2021.
    388 changes: 388 additions & 0 deletions macos-setup.sh
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,388 @@
    #!/usr/bin/env bash
    #
    # Consolidated setup script for setting up a new MacOS installation.
    #
    # This script tries to be as flexible and as helpful as possible, while keeping the user intervention to a minimum.
    #
    # Reading/Thanks:
    #
    # - https://gist.github.com/MatthewMueller/e22d9840f9ea2fee4716
    # - https://gist.github.com/codeinthehole/26b37efa67041e1307db
    # - https://github.com/mikeprivette/yanmss/blob/master/setup.sh
    # - https://gist.github.com/bradp/bea76b16d3325f5c47d4
    # - https://gist.github.com/ryanhanwu/059e210f8fe15e7eadc4a28e8b3e6b27
    # - https://gist.github.com/rcugut/c7abd2a425bb65da3c61d8341cd4b02d
    # - https://github.com/Homebrew/homebrew-cask-fonts
    # - https://github.com/ohmyzsh/ohmyzsh/wiki/Plugins
    # - https://github.com/ryanoasis/nerd-fonts
    # - https://github.com/ohmyzsh/ohmyzsh/wiki/Themes
    # - https://opensource.com/article/19/5/python-3-default-mac
    # - https://opensource.com/article/19/5/python-3-default-mac
    # - https://github.com/mathiasbynens/dotfiles

    # ## 0 - Either chmod this file or ask for the administrator password upfront:
    sudo -v
    echo "Starting setup for $(whoami)"

    # # # Notes:
    # # #
    # # # - If installing full Xcode, it's better to install that first from the app
    # # # store before running the bootstrap script. Otherwise, Homebrew can't access
    # # # the Xcode libraries as the agreement hasn't been accepted yet.

    # # ###############################################################################
    # # # 0 - For Xcode and CLI
    # # ###############################################################################

    # # Install command line tools. When finished press [Enter]
    xcode-select --install
    read -p "Press [Enter] when apple command line tools installation is completed."

    # # ###############################################################################
    # # # 1 - MAIN COMPONENTS
    # # ###############################################################################

    # # Check for Homebrew, install if we don't have it
    if test ! $(which brew); then
    echo "Installing homebrew..."
    /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
    fi
    # Update homebrew recipes
    echo "Updating homebrew recipes"
    brew update

    # # Install and set zsh as default shell in case we are not on big sur or above
    if test ! $(which zsh); then
    echo "Setting ZSH as shell..."
    echo "Installing zsh as default shell..."
    brew install zsh
    chsh -s /bin/zsh OR sh -c "echo $(which zsh) >> /etc/shells" && chsh -s $(which zsh)
    echo "zsh installed and set as default shell"
    fi

    ## Install any system or core utility e.g. GNU core utilities (those that come with OS X are outdated)
    echo "Installing system core utilities..."
    brew install coreutils
    brew install openssh
    ###################### uncomment if you understand whats below
    # Uncomment for GNU core utils
    # brew install gnu-sed --with-default-names
    # brew install gnu-tar --with-default-names
    # brew install gnu-indent --with-default-names
    # brew install gnu-which --with-default-names
    # brew install gnu-grep --with-default-names
    ## Install GNU `find`, `locate`, `updatedb`, and `xargs`, g-prefixed
    ## Installs default moreutils
    # brew install moreutils
    ## There is a conflict between the GNU parallel utility and the shipped parallel on the moreutils package. If you want to install GNU parallel instead of the moreutils’ parallel, use the following commands:
    # brew install moreutils --without-parallel
    # brew install parallel
    ######################
    brew install findutils
    # Install latest Bash
    brew install bash
    echo "Core utilities installation cli complete"

    # 1.2 - Add your preferred packages
    PACKAGES=(
    git
    tree
    vim
    wget
    scrcpy
    hugo
    speedtest-cli
    )
    echo "Installing CLI packages..."
    brew install ${PACKAGES[@]}
    echo "CLI packages installation complete"

    # 1.3 - Add your preferred apps
    CASKS=(
    flux
    iterm2
    plex-media-server
    postman
    1password
    the-unarchiver
    appcleaner
    visual-studio-code
    transmission
    spotify
    jetbrains-toolbox
    calibre
    notion
    rectangle
    charles
    )
    echo "Installing apps..."
    brew install --cask ${CASKS[@]}
    # # To install apps in a dir other than "/Applications"
    # brew install --cask --appdir="/Applications" ${CASKS[@]}
    echo "Apps installation complete"

    ###############################################################################
    # 2 - Development
    ###############################################################################

    # # ## Uncomment the ones you need or use...if any.
    # # Python and Ruby should be already installed

    # # #############
    # # # GIT
    # # #############
    echo "Configuring GIT"
    # brew install git-extras
    ## To increase security of your key this will automatically add it to the keychain
    echo "Creating your SSH key...add a passphrase"
    ssh-keygen -t rsa -b 4096
    echo "Adding SSH key to Keychain"
    ssh-add ~/.ssh/id_rsa
    echo "Setting SSH to always use keychain for the passphrase"
    cat <<EOT >> ~/.ssh/config
    Host *
    UseKeychain yes
    AddKeysToAgent yes
    IdentityFile ~/.ssh/id_rsa
    EOT

    echo "Configuring GPG signing"
    # Setup GPG - Does 50% of the signing
    brew install gpg2 gnupg pinentry-mac
    # Make the gnupg dir#
    mkdir ~/.gnupg
    # Write our configuration to it
    echo 'pinentry-program $(brew --prefix)/bin/pinentry-mac' > ~/.gnupg/gpg-agent.conf
    # This tells gpg to use the gpg-agent
    echo 'use-agent' > ~/.gnupg/gpg.conf
    export GPG_TTY=`tty`
    chmod 700 ~/.gnupg
    # When the script is done go here to complete the gpg setup
    # https://gist.github.com/troyfontaine/18c9146295168ee9ca2b30c00bd1b41e#step-7-create-your-gpg-key

    # # #############
    # # # JAVA
    # # #############
    echo "Installing Java and setting up the environment..."
    JAVA_VERSION=11
    brew tap AdoptOpenJDK/openjdk
    ## brew install --cask <version> | For version https://github.com/AdoptOpenJDK/homebrew-openjdk
    echo "Installing Java $JAVA_VERSION..."
    brew install --cask adoptopenjdk$JAVA_VERSION

    # Set JAVA_HOME
    echo "Setting JAVA_HOME environment variable..."
    echo export "JAVA_HOME=\$(/usr/libexec/java_home)" >> ~/.zshrc

    # # https://www.mindissoftware.com/post/2020/05/jenv-setup/
    echo "Installing jenv..."
    brew install jenv
    echo "Configuring jenv..."
    echo 'export PATH="$HOME/.jenv/bin:$PATH"' >> ~/.zshrc
    echo 'eval "$(jenv init -)"' >> ~/.zshrc
    echo "Unsetting the JAVA_TOOL_OPTIONS environment variable..."
    unset JAVA_TOOL_OPTIONS

    # # #############
    # # # Node
    # # #############

    # # ## NODE > Uncomment your preffered option
    # # ## 1 . Install complete node
    # # # brew install node
    # # OR Install with yarn package manager
    # # brew install yarn
    # # ## 3. NPM new home (Optional)
    # # # Normally, with Homebrew, your user should own the entire `/usr/local` folder, if not:
    # # # sudo chown -R `whoami` /usr/local
    # # # mkdir -p /usr/local/npm_packages
    # # ## This is the root dir where all globally installed node packages will go
    # # export NPM_PACKAGES="/usr/local/npm_packages"
    # # export NODE_PATH="$NPM_PACKAGES/lib/node_modules:$NODE_PATH"
    # # ## Add to PATH
    # # #export PATH="$NPM_PACKAGES/bin:$PATH"

    # # #############
    # # # Deno
    # # #############

    # # brew install deno

    # # #############
    # # # Scala
    # # #############

    # # brew install scala

    # # #############
    # # # Golang
    # # #############

    # # brew install golang
    # # export GOPATH="${HOME}/.go"
    # # export GOROOT="$(brew --prefix golang)/libexec"
    # # export PATH="$PATH:${GOPATH}/bin:${GOROOT}/bin"

    # # #############
    # # # Rust
    # # #############

    # # brew install rustup
    # # rustup-init

    # # #############
    # # # Docker
    # # #############

    # # # brew install --cask docker

    # # ###############################################################################
    # # # 3 - Customization & Mac OS Configuration
    # # ###############################################################################

    # Get your desired fonts from: https://github.com/Homebrew/homebrew-cask-fonts/tree/master/Casks And add below
    brew tap homebrew/cask-fonts
    FONTS=(
    font-inconsolata
    font-fira-code
    font-fira-code-nerd-font
    font-jetbrains-mono
    font-jetbrains-mono-nerd-font
    )

    echo "Installing FONTS..."
    brew install ${FONTS[@]}

    echo "Cleaning up the cellar..."
    brew cleanup

    echo "Configuring MacOS..."
    echo ""
    # FIND MORE CONFIGS HERE :
    # https://gist.github.com/bradp/bea76b16d3325f5c47d4#file-setup-sh-L137
    # https://gist.github.com/MatthewMueller/e22d9840f9ea2fee4716

    echo "Disabling OS X Gate Keeper"
    #"(You'll be able to install any app you want from here on, not just Mac App Store apps)"
    sudo spctl --master-disable
    sudo defaults write /var/db/SystemPolicy-prefs.plist enabled -string no
    defaults write com.apple.LaunchServices LSQuarantine -bool false

    echo "Expanding the save panel by default"
    defaults write NSGlobalDomain NSNavPanelExpandedStateForSaveMode -bool true
    defaults write NSGlobalDomain PMPrintingExpandedStateForPrint -bool true
    defaults write NSGlobalDomain PMPrintingExpandedStateForPrint2 -bool true

    echo "Disable smart quotes and smart dashes as they are annoying when typing code"
    defaults write NSGlobalDomain NSAutomaticQuoteSubstitutionEnabled -bool false
    defaults write NSGlobalDomain NSAutomaticDashSubstitutionEnabled -bool false

    echo "Enabling full keyboard access for all controls (e.g. enable Tab in modal dialogs)"
    defaults write NSGlobalDomain AppleKeyboardUIMode -int 3

    echo "Showing all filename extensions in Finder by default"
    defaults write NSGlobalDomain AppleShowAllExtensions -bool true

    echo "Disabling the warning when changing a file extension"
    defaults write com.apple.finder FXEnableExtensionChangeWarning -bool false

    echo "Use column view in all Finder windows by default"
    defaults write com.apple.finder FXPreferredViewStyle Clmv

    echo "Avoiding the creation of .DS_Store files on network volumes"
    defaults write com.apple.desktopservices DSDontWriteNetworkStores -bool true

    echo "Setting the icon size of Dock items to 36 pixels for optimal size/screen-realestate"
    defaults write com.apple.dock tilesize -int 36

    echo "Speeding up Mission Control animations and grouping windows by application"
    defaults write com.apple.dock expose-animation-duration -float 0.1
    defaults write com.apple.dock "expose-group-by-app" -bool true

    echo "Setting Dock to auto-hide and removing the auto-hiding delay"
    defaults write com.apple.dock autohide -bool true
    defaults write com.apple.dock autohide-delay -float 0
    defaults write com.apple.dock autohide-time-modifier -float 0

    echo "Setting email addresses to copy as '[email protected]' instead of 'Foo Bar <[email protected]>' in Mail.app"
    defaults write com.apple.mail AddressesIncludeNameOnPasteboard -bool false

    echo "Preventing Time Machine from prompting to use new hard drives as backup volume"
    defaults write com.apple.TimeMachine DoNotOfferNewDisksForBackup -bool true

    echo "Speeding up wake from sleep to 24 hours from an hour"
    # http://www.cultofmac.com/221392/quick-hack-speeds-up-retina-macbooks-wake-from-sleep-os-x-tips/
    sudo pmset -a standbydelay 86400

    echo "Disable annoying backswipe in Chrome"
    defaults write com.google.Chrome AppleEnableSwipeNavigateWithScrolls -bool false

    echo "Setting screenshots location to ~/Desktop"
    defaults write com.apple.screencapture location -string "$HOME/Desktop"

    echo "Setting screenshot format to PNG"
    defaults write com.apple.screencapture type -string "png"

    echo "Enabling the Develop menu and the Web Inspector in Safari"
    defaults write com.apple.Safari IncludeDevelopMenu -bool true
    defaults write com.apple.Safari WebKitDeveloperExtrasEnabledPreferenceKey -bool true
    defaults write com.apple.Safari "com.apple.Safari.ContentPageGroupIdentifier.WebKit2DeveloperExtrasEnabled" -bool true

    echo "Don't prompt for confirmation before downloading in Transmission"
    defaults write org.m0k.transmission DownloadAsk -bool false

    echo "Trash original torrent files"
    defaults write org.m0k.transmission DeleteOriginalTorrent -bool true

    echo "Hide the donate message"
    defaults write org.m0k.transmission WarningDonate -bool false

    echo "Hide the legal disclaimer"
    defaults write org.m0k.transmission WarningLegal -bool false

    echo "Disable 'natural' (Lion-style) scrolling"
    defaults write NSGlobalDomain com.apple.swipescrolldirection -bool false

    echo "Don’t rearrange Spaces automatically based on most recent use"
    defaults write com.apple.dock mru-spaces -bool false

    echo "Show Library dir in Finder"
    chflags nohidden ~/Library

    echo "Show Hidden Files in Finder"
    defaults write com.apple.finder AppleShowAllFiles YES

    echo "Show Path Bar in Finder"
    defaults write com.apple.finder ShowPathbar -bool true

    echo "Show Status Bar in Finder"
    defaults write com.apple.finder ShowStatusBar -bool true

    echo "Require password as soon as screensaver or sleep mode starts"
    defaults write com.apple.screensaver askForPassword -int 1
    defaults write com.apple.screensaver askForPasswordDelay -int 0

    echo "Enable tap-to-click"
    defaults write com.apple.driver.AppleBluetoothMultitouch.trackpad Clicking -bool true
    defaults -currentHost write NSGlobalDomain com.apple.mouse.tapBehavior -int 1
    echo ""

    # ###############################################################################
    # # 4 - CREATE DIR STRUCTURE - Create any addditional dirs
    # ###############################################################################

    echo "Creating directory structure..."
    [[ ! -d Workspace ]] && mkdir Workspace
    echo "Directory structure created"

    echo "Setup for $(whoami) COMPLETE"
    killall Finder

    # ###############################################################################
    # # 5 - Install oh-my-zsh
    # ###############################################################################

    # Install oh-my-zsh
    # After installation finishes execute oh-my-custom for personalisation
    echo "Installing oh-my-zsh..."
    /bin/bash -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
    28 changes: 28 additions & 0 deletions oh-my-custom
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,28 @@
    #!/usr/bin/env bash

    echo ""
    echo "Starting oh-my-zsh setup for $(whoami)"
    # Install oh-my-zsh plugins
    echo "Installing oh-my-zsh plugins..."
    # Add oh-my-zsh plugins from: https://github.com/ohmyzsh/ohmyzsh/wiki/Plugins in the list below:
    git clone git://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:=~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
    git clone git://github.com/zsh-users/zsh-syntax-highlighting ${ZSH_CUSTOM:=~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
    echo "Plugin installation complete"

    # Configure oh-my-zsh plugins
    echo "Configuring plugins..."
    # Add zsh-syntax-highlighting.zsh to the end of the .zshrc file
    echo "source ~/.oh-my-zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh" >> ~/.zshrc
    # Add the plugins you want to enable below
    sed -io 's/^plugins=.*/plugins=(git zsh-autosuggestions zsh-syntax-highlighting)/' ~/.zshrc
    echo "Plugin configuration complete"

    # Install custom theme > Substitute for yours > https://github.com/ohmyzsh/ohmyzsh/wiki/Themes
    echo "Installing custom theme..."
    git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k
    # Enable Powelevel10k as default theme
    sed -io 's#^ZSH_THEME.*#ZSH_THEME="powerlevel10k/powerlevel10k"#' ~/.zshrc
    echo "Theme installation complete"

    echo "Completed oh-my-zsh setup for $(whoami)"
    source $ZSH/oh-my-zsh.sh