You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
149 lines
3.9 KiB
149 lines
3.9 KiB
#!/usr/bin/env 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 $?
|
|
|