#!/bin/bash # Opens the BitBucket/GitHub page for a repo/branch in your browser. # # git open # git open [remote] [branch] # are we in a git repo? git rev-parse --is-inside-work-tree &>/dev/null if [[ $? != 0 ]]; then echo "Not a git repository." 1>&2 exit 1 fi # assume origin if not provided # fallback to upstream if neither is present. remote="origin" if [ -n "$1" ]; then if [ "$1" == "issue" ]; then currentBranch=$(git symbolic-ref -q --short HEAD) regex='^issue' if [[ $currentBranch =~ $regex ]]; then issue=${currentBranch#*#} else echo "'git open issue' expect branch naming to be issues/#123" 1>&2 exit 1 fi else remote="$1" fi fi remote_url="remote.${remote}.url" giturl=$(git config --get "$remote_url") if [ -z "$giturl" ]; then echo "$remote_url not set." 1>&2 exit 1 fi # get current branch if [ -z "$2" ]; then branch=$(git symbolic-ref -q --short HEAD) else branch="$2" fi # Make # and % characters url friendly # github.com/paulirish/git-open/pull/24 branch=${branch//%/%25} && branch=${branch//#/%23} # URL normalization # GitHub gists if grep -q gist.github <<<$giturl; then giturl=${giturl/git\@gist.github\.com\:/https://gist.github.com/} providerUrlDifference=tree # GitHub elif grep -q github <<<$giturl; then giturl=${giturl/git\@github\.com\:/https://github.com/} # handle SSH protocol (links like ssh://git@github.com/user/repo) giturl=${giturl/#ssh\:\/\/git\@github\.com\//https://github.com/} providerUrlDifference=tree # Bitbucket elif grep -q bitbucket <<<$giturl; then giturl=${giturl/git\@bitbucket\.org\:/https://bitbucket.org/} # handle SSH protocol (change ssh://https://bitbucket.org/user/repo to https://bitbucket.org/user/repo) giturl=${giturl/#ssh\:\/\/git\@/https://} rev="$(git rev-parse HEAD)" git_pwd="$(git rev-parse --show-prefix)" providerUrlDifference="src/${rev}/${git_pwd}" branch="?at=${branch}" # Atlassian Bitbucket Server elif grep -q "/scm/" <<<$giturl; then re='(.*)/scm/(.*)/(.*)\.git' if [[ $giturl =~ $re ]]; then giturl=${BASH_REMATCH[1]}/projects/${BASH_REMATCH[2]}/repos/${BASH_REMATCH[3]} providerUrlDifference=browse branch="?at=refs%2Fheads%2F${branch}" fi # GitLab else # custom GitLab gitlab_domain=$(git config --get gitopen.gitlab.domain) gitlab_ssh_domain=$(git config --get gitopen.gitlab.ssh.domain) gitlab_ssh_domain=${gitlab_ssh_domain:-$gitlab_domain} gitlab_ssh_port=$(git config --get gitopen.gitlab.ssh.port) gitlab_protocol=$(git config --get gitopen.gitlab.protocol) if [ -z "$gitlab_protocol" ]; then gitlab_protocol=https fi if [ -n "$gitlab_domain" ]; then if egrep -q "${gitlab_domain}|${gitlab_ssh_domain}" <<<$giturl; then # Handle GitLab's default SSH notation (like git@gitlab.domain.com:user/repo) giturl=${giturl/git\@${gitlab_ssh_domain}\:/${gitlab_protocol}://${gitlab_domain}/} # handle SSH protocol (links like ssh://git@gitlab.domain.com/user/repo) giturl=${giturl/#ssh\:\/\//${gitlab_protocol}://} # remove git@ from the domain giturl=${giturl/git\@${gitlab_ssh_domain}/${gitlab_domain}/} # remove SSH port if [ -n "$gitlab_ssh_port" ]; then giturl=${giturl/\/:${gitlab_ssh_port}\///} fi providerUrlDifference=tree fi # hosted GitLab elif grep -q gitlab <<<$giturl; then giturl=${giturl/git\@gitlab\.com\:/https://gitlab.com/} providerUrlDifference=tree fi fi giturl=${giturl%\.git} if [ -n "$issue" ]; then giturl="${giturl}/issues/${issue}" elif [ -n "$branch" ]; then giturl="${giturl}/${providerUrlDifference}/${branch}" fi # simplify URL for master giturl=${giturl/tree\/master/} # 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=${BROWSER:-xdg-open};; esac # open it in a browser $open "$giturl" &> /dev/null exit $?