#!/usr/bin/env bash

# Opens the GitHub page for a repo/branch in your browser.
# https://github.com/paulirish/git-open/
#
# git open
# git open [remote] [branch]


# are we in a git repo?
if ! git rev-parse --is-inside-work-tree &>/dev/null; then
  echo "Not a git repository." 1>&2
  exit 1
fi

is_issue=0

# If the first argument is 'issue', we want to load the issue page
if [[ "$1" == 'issue' ]]; then
  is_issue=1

  # Allow the user to provide other args, aka `git open issue upstream 79`
  shift
fi

# assume remote origin if not provided
remote=${1:-"origin"}

# @TODO ls-remote will also expand "insteadOf" items `giturl=$(git ls-remote --get-url $remote)``
giturl=$(git config --get "remote.${remote}.url")

if [[ -z "$giturl" ]]; then
  echo "Git remote is not set for $remote" 1>&2
  exit 1
fi

# Initial case examples: 'git@example.com:user/project', 'https://example.com:8080/scm/user/project.git/'
# Trim "/" and ".git" from the end of the url
giturl=${giturl%/} giturl=${giturl%.git}

# Trim before last '@' and protocol (*://) from beginning
uri=${giturl##*@} uri=${uri##*://}

# Trims before first ':' or '/' to get path
urlpath=${uri#*[/:]}

# Trims after first ':' or '/' to remove path
server=${uri%%[/:]*}

# Get current branch
branch=${2:-$(git symbolic-ref -q --short HEAD)}

# Split arguments on '/'
IFS='/' pathargs=($urlpath)

if (( is_issue )); then
  # For issues, take the numbers and preprend 'issues/'
  providerBranchRef="issues/${branch//[^0-9]/}"
else
  # Make # and % characters url friendly
  #   github.com/paulirish/git-open/pull/24
  branch=${branch//%/%25} branch=${branch//#/%23}
  providerBranchRef="tree/$branch"
fi

if [[ "$server" == 'bitbucket.org' ]]; then
  # Bitbucket, see https://github.com/paulirish/git-open/issues/80 for why ?at is needed.
  providerBranchRef="src?at=$branch"
elif [[ ${pathargs[0]} == 'scm' ]]; then
  # Bitbucket server, which starts with 'scm'
  # Replace the first element, 'scm', with 'projects'. Keep the first argument, the string 'repos', and finally the rest of the arguments.
  pathargs=('projects' ${pathargs[1]} 'repos' "${pathargs[@]:2}")
  IFS='/' urlpath="${pathargs[*]}"
  providerBranchRef="browse?at=$branch"
fi

# @TODO: support non-https?
openurl="https://$server/$urlpath"

# simplify URL for master
if [[ $branch != "master" ]]; then
    openurl="$openurl/$providerBranchRef"
fi

# get current open browser command
case $( uname -s ) in
  Darwin)  open='open';;
  MINGW*)  open='start';;
  CYGWIN*) open='cygstart';;
  MSYS*)   open='powershell.exe –NoProfile Start';;
  *)       open='xdg-open';;
esac

# Allow printing the url if BROWSER=echo
if [[ $BROWSER != "echo" ]]; then
  exec &>/dev/null
fi

# open it in a browser
${BROWSER:-$open} "$openurl"
