diff --git a/bin/git-browse b/bin/git-browse
index 8302543..f8ab94b 100755
--- a/bin/git-browse
+++ b/bin/git-browse
@@ -1,54 +1,97 @@
#!/usr/bin/env bash
-if [[ $1 == "" ]]
-then
- branch=$(git rev-parse --abbrev-ref HEAD 2&> /dev/null)
+remote=${1:-""}
+branch=""
+filename=${2:-""}
+line1=${3:-""}
+line2=${4:-""}
+
+# get remote name
+if [[ $remote == "" ]]; then
+ branch=$(git rev-parse --abbrev-ref HEAD 2 &>/dev/null)
remote=$(git config branch."${branch}".remote || echo "origin")
-else
- remote=$1
fi
-if [[ $remote == "" ]]
-then
+if [[ $remote == "" ]]; then
echo "Remote not found"
exit 1
fi
+# get remote url
remote_url=$(git remote get-url $remote)
-if [[ $? -ne 0 ]]
-then
+if [[ $? -ne 0 ]]; then
exit $?
fi
-if [[ $remote_url = git@* ]]
-then
+if [[ $remote_url = git@* ]]; then
url=$(echo $remote_url | sed -E -e 's/:/\//' -e 's/\.git$//' -e 's/.*@(.*)/http:\/\/\1/')
-elif [[ $remote_url = http* ]]
-then
+elif [[ $remote_url = http* ]]; then
url=${remote_url%.git}
fi
-case "$OSTYPE" in
- darwin*)
- # MacOS
- open $url
- ;;
- msys)
- # Git-Bash on Windows
- start $url
- ;;
- linux*)
- # Handle WSL on Windows
- if uname -a | grep -i -q Microsoft && command -v powershell.exe
- then
- powershell.exe -NoProfile start $url
- else
- xdg-open $url
+# construct urls
+commit_hash=$(git log -n1 --format=format:"%H" "${filename}" 2>/dev/null)
+commit_or_branch=${commit_hash:-${branch}}
+
+if [[ $remote_url =~ gitlab ]]; then
+ # construct gitlab urls
+ # https://gitlab.com///-/blob//#L-
+ if [[ -n ${filename} ]]; then
+ url="${url}/-/blob/${commit_hash:-${branch}}/${filename}"
+ if [[ -n "${line1}" ]]; then
+ url="${url}#L${line1}"
+ if [[ -n "${line2}" ]]; then
+ url="${url}-${line2}"
+ fi
fi
- ;;
- *)
- # fall back to xdg-open for BSDs, etc.
+ fi
+elif [[ $remote_url =~ github ]]; then
+ # construct github urls
+ # https://github.com///blob//#L-L
+ if [[ -n "${filename}" ]]; then
+ url="${url}/blob/${commit_hash:-${branch}}/${filename}"
+ if [[ -n "${line1}" ]]; then
+ url="${url}#L${line1}"
+ if [[ -n "${line2}" ]]; then
+ url="${url}-L${line2}"
+ fi
+ fi
+ fi
+elif [[ $remote_url =~ bitbucket ]]; then
+ # construct bitbucket urls
+ # https://bitbucket.org///src//#lines-:
+ if [[ -n ${filename} ]]; then
+ url=${url}/blob/${commit_hash:-${branch}}/${filename}
+ if [[ -n "${line1}" ]]; then
+ url="${url}#lines-${line1}"
+ if [[ -n "${line2}" ]]; then
+ url="${url}:${line2}"
+ fi
+ fi
+ fi
+fi
+
+# open url
+case "$OSTYPE" in
+darwin*)
+ # MacOS
+ open $url
+ ;;
+msys)
+ # Git-Bash on Windows
+ start $url
+ ;;
+linux*)
+ # Handle WSL on Windows
+ if uname -a | grep -i -q Microsoft && command -v powershell.exe; then
+ powershell.exe -NoProfile start $url
+ else
xdg-open $url
- ;;
+ fi
+ ;;
+*)
+ # fall back to xdg-open for BSDs, etc.
+ xdg-open $url
+ ;;
esac
diff --git a/man/git-browse.1 b/man/git-browse.1
index 0cda218..4dfc9be 100644
--- a/man/git-browse.1
+++ b/man/git-browse.1
@@ -1,13 +1,13 @@
.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
-.TH "GIT\-BROWSE" "1" "March 2020" "" "Git Extras"
+.TH "GIT\-BROWSE" "1" "June 2022" "" "Git Extras"
.
.SH "NAME"
\fBgit\-browse\fR \-
.
.SH "SYNOPSIS"
-\fBgit\-browse\fR [remote_name]
+\fBgit\-browse\fR [remote_name] [file_name] [line_1] [line_2]
.
.SH "DESCRIPTION"
Opens the current git repository website in your default web browser\.
@@ -18,12 +18,39 @@ Opens the current git repository website in your default web browser\.
.P
The name of the remote you wish to browse to\. Defaults to the first remote if not specified\.
.
+.P
+
+.
+.P
+The name of the file you wish to browse to\.
+.
+.P
+
+.
+.P
+The line number of the file you wish to browse to\.
+.
+.P
+
+.
+.P
+The line range (from to ) of the file you wish to browse to\.
+.
.SH "EXAMPLES"
$ git browse
.
.P
$ git browse upstream
.
+.P
+$ git browse upstream bin/git\-browse
+.
+.P
+$ git browse upstream bin/git\-browse 42
+.
+.P
+$ git browse upstream bin/git\-browse 1 42
+.
.SH "AUTHOR"
Written by Mark Pitman <\fIhttps://github\.com/mapitman\fR>
.
diff --git a/man/git-browse.html b/man/git-browse.html
index 103937f..f037192 100644
--- a/man/git-browse.html
+++ b/man/git-browse.html
@@ -76,7 +76,7 @@
SYNOPSIS
-git-browse [remote_name]
+git-browse [remote_name] [file_name] [line_1] [line_2]
DESCRIPTION
@@ -89,12 +89,31 @@
The name of the remote you wish to browse to. Defaults to
the first remote if not specified.
+<file_name>
+
+The name of the file you wish to browse to.
+
+<line_1>
+
+The line number of the file you wish to browse to.
+
+<line_2>
+
+The line range (from <line_1> to <line_2>) of the file you wish to
+browse to.
+
EXAMPLES
$ git browse
$ git browse upstream
+ $ git browse upstream bin/git-browse
+
+ $ git browse upstream bin/git-browse 42
+
+ $ git browse upstream bin/git-browse 1 42
+
AUTHOR
Written by Mark Pitman <https://github.com/mapitman>
@@ -110,7 +129,7 @@ the first remote if not specified.
diff --git a/man/git-browse.md b/man/git-browse.md
index ca2cc9a..5f2f262 100644
--- a/man/git-browse.md
+++ b/man/git-browse.md
@@ -3,7 +3,7 @@ git-browse(1) --
## SYNOPSIS
-`git-browse` [remote_name]
+`git-browse` [remote_name] [file_name] [line_1] [line_2]
## DESCRIPTION
@@ -16,12 +16,31 @@ Opens the current git repository website in your default web browser.
The name of the remote you wish to browse to. Defaults to
the first remote if not specified.
+<file_name>
+
+The name of the file you wish to browse to.
+
+<line_1>
+
+The line number of the file you wish to browse to.
+
+<line_2>
+
+The line range (from <line_1> to <line_2>) of the file you wish to
+browse to.
+
## EXAMPLES
$ git browse
$ git browse upstream
+ $ git browse upstream bin/git-browse
+
+ $ git browse upstream bin/git-browse 42
+
+ $ git browse upstream bin/git-browse 1 42
+
## AUTHOR
Written by Mark Pitman <>