feat: open website at file & line number or range

Ported from
f544dadf88/git/bin/git-browse

Closes #980
This commit is contained in:
Peter Benjamin 2022-06-09 19:26:55 -07:00
parent fdf89cd93f
commit 006549d661
No known key found for this signature in database
4 changed files with 146 additions and 38 deletions

View file

@ -1,54 +1,97 @@
#!/usr/bin/env bash #!/usr/bin/env bash
if [[ $1 == "" ]] remote=${1:-""}
then branch=""
branch=$(git rev-parse --abbrev-ref HEAD 2&> /dev/null) 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") remote=$(git config branch."${branch}".remote || echo "origin")
else
remote=$1
fi fi
if [[ $remote == "" ]] if [[ $remote == "" ]]; then
then
echo "Remote not found" echo "Remote not found"
exit 1 exit 1
fi fi
# get remote url
remote_url=$(git remote get-url $remote) remote_url=$(git remote get-url $remote)
if [[ $? -ne 0 ]] if [[ $? -ne 0 ]]; then
then
exit $? exit $?
fi fi
if [[ $remote_url = git@* ]] if [[ $remote_url = git@* ]]; then
then
url=$(echo $remote_url | sed -E -e 's/:/\//' -e 's/\.git$//' -e 's/.*@(.*)/http:\/\/\1/') url=$(echo $remote_url | sed -E -e 's/:/\//' -e 's/\.git$//' -e 's/.*@(.*)/http:\/\/\1/')
elif [[ $remote_url = http* ]] elif [[ $remote_url = http* ]]; then
then
url=${remote_url%.git} url=${remote_url%.git}
fi fi
case "$OSTYPE" in # construct urls
darwin*) commit_hash=$(git log -n1 --format=format:"%H" "${filename}" 2>/dev/null)
# MacOS commit_or_branch=${commit_hash:-${branch}}
open $url
;; if [[ $remote_url =~ gitlab ]]; then
msys) # construct gitlab urls
# Git-Bash on Windows # https://gitlab.com/<user_or_group>/<repo>/-/blob/<commit_or_branch>/<filename>#L<line1>-<line2>
start $url if [[ -n ${filename} ]]; then
;; url="${url}/-/blob/${commit_hash:-${branch}}/${filename}"
linux*) if [[ -n "${line1}" ]]; then
# Handle WSL on Windows url="${url}#L${line1}"
if uname -a | grep -i -q Microsoft && command -v powershell.exe if [[ -n "${line2}" ]]; then
then url="${url}-${line2}"
powershell.exe -NoProfile start $url fi
else
xdg-open $url
fi fi
;; fi
*) elif [[ $remote_url =~ github ]]; then
# fall back to xdg-open for BSDs, etc. # construct github urls
# https://github.com/<user_or_org>/<repo>/blob/<commit_or_branch>/<filename>#L<line1>-L<line2>
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/<user_or_org>/<repo>/src/<commit_or_branch>/<filename>#lines-<line1>:<line2>
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 xdg-open $url
;; fi
;;
*)
# fall back to xdg-open for BSDs, etc.
xdg-open $url
;;
esac esac

View file

@ -1,13 +1,13 @@
.\" generated with Ronn/v0.7.3 .\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.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" .SH "NAME"
\fBgit\-browse\fR \- \fBgit\-browse\fR \-
. .
.SH "SYNOPSIS" .SH "SYNOPSIS"
\fBgit\-browse\fR [remote_name] \fBgit\-browse\fR [remote_name] [file_name] [line_1] [line_2]
. .
.SH "DESCRIPTION" .SH "DESCRIPTION"
Opens the current git repository website in your default web browser\. 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 .P
The name of the remote you wish to browse to\. Defaults to the first remote if not specified\. The name of the remote you wish to browse to\. Defaults to the first remote if not specified\.
. .
.P
<file_name>
.
.P
The name of the file you wish to browse to\.
.
.P
<line_1>
.
.P
The line number of the file you wish to browse to\.
.
.P
<line_2>
.
.P
The line range (from <line_1> to <line_2>) of the file you wish to browse to\.
.
.SH "EXAMPLES" .SH "EXAMPLES"
$ git browse $ git browse
. .
.P .P
$ git browse upstream $ 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" .SH "AUTHOR"
Written by Mark Pitman <\fIhttps://github\.com/mapitman\fR> Written by Mark Pitman <\fIhttps://github\.com/mapitman\fR>
. .

View file

@ -76,7 +76,7 @@
<h2 id="SYNOPSIS">SYNOPSIS</h2> <h2 id="SYNOPSIS">SYNOPSIS</h2>
<p><code>git-browse</code> [remote_name]</p> <p><code>git-browse</code> [remote_name] [file_name] [line_1] [line_2]</p>
<h2 id="DESCRIPTION">DESCRIPTION</h2> <h2 id="DESCRIPTION">DESCRIPTION</h2>
@ -89,12 +89,31 @@
<p>The name of the remote you wish to browse to. Defaults to <p>The name of the remote you wish to browse to. Defaults to
the first remote if not specified.</p> the first remote if not specified.</p>
<p>&lt;file_name&gt;</p>
<p>The name of the file you wish to browse to.</p>
<p>&lt;line_1&gt;</p>
<p>The line number of the file you wish to browse to.</p>
<p>&lt;line_2&gt;</p>
<p>The line range (from &lt;line_1&gt; to &lt;line_2&gt;) of the file you wish to
browse to.</p>
<h2 id="EXAMPLES">EXAMPLES</h2> <h2 id="EXAMPLES">EXAMPLES</h2>
<p> $ git browse</p> <p> $ git browse</p>
<p> $ git browse upstream</p> <p> $ git browse upstream</p>
<p> $ git browse upstream bin/git-browse</p>
<p> $ git browse upstream bin/git-browse 42</p>
<p> $ git browse upstream bin/git-browse 1 42</p>
<h2 id="AUTHOR">AUTHOR</h2> <h2 id="AUTHOR">AUTHOR</h2>
<p>Written by Mark Pitman &lt;<a href="https://github.com/mapitman" data-bare-link="true">https://github.com/mapitman</a>&gt;</p> <p>Written by Mark Pitman &lt;<a href="https://github.com/mapitman" data-bare-link="true">https://github.com/mapitman</a>&gt;</p>
@ -110,7 +129,7 @@ the first remote if not specified.</p>
<ol class='man-decor man-foot man foot'> <ol class='man-decor man-foot man foot'>
<li class='tl'></li> <li class='tl'></li>
<li class='tc'>March 2020</li> <li class='tc'>June 2022</li>
<li class='tr'>git-browse(1)</li> <li class='tr'>git-browse(1)</li>
</ol> </ol>

View file

@ -3,7 +3,7 @@ git-browse(1) -- <View the web page for the current repository>
## SYNOPSIS ## SYNOPSIS
`git-browse` [remote_name] `git-browse` [remote_name] [file_name] [line_1] [line_2]
## DESCRIPTION ## 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 name of the remote you wish to browse to. Defaults to
the first remote if not specified. the first remote if not specified.
&lt;file_name&gt;
The name of the file you wish to browse to.
&lt;line_1&gt;
The line number of the file you wish to browse to.
&lt;line_2&gt;
The line range (from &lt;line_1&gt; to &lt;line_2&gt;) of the file you wish to
browse to.
## EXAMPLES ## EXAMPLES
$ git browse $ git browse
$ git browse upstream $ 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 ## AUTHOR
Written by Mark Pitman &lt;<https://github.com/mapitman>&gt; Written by Mark Pitman &lt;<https://github.com/mapitman>&gt;