From 006549d6614aa48564b4beaffcb25c36976e5428 Mon Sep 17 00:00:00 2001 From: Peter Benjamin Date: Thu, 9 Jun 2022 19:26:55 -0700 Subject: [PATCH 1/3] feat: open website at file & line number or range Ported from https://github.com/pbnj/dotfiles/blob/f544dadf8833d6687ac5d8dfc14c59d5890498a7/git/bin/git-browse Closes #980 --- bin/git-browse | 109 ++++++++++++++++++++++++++++++-------------- man/git-browse.1 | 31 ++++++++++++- man/git-browse.html | 23 +++++++++- man/git-browse.md | 21 ++++++++- 4 files changed, 146 insertions(+), 38 deletions(-) diff --git a/bin/git-browse b/bin/git-browse index 830254306..f8ab94b52 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 + 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 - ;; - *) - # fall back to xdg-open for BSDs, etc. + 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 0cda218bc..4dfc9bee2 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 103937ffa..f037192b9 100644 --- a/man/git-browse.html +++ b/man/git-browse.html @@ -76,7 +76,7 @@

NAME

SYNOPSIS

-

git-browse [remote_name]

+

git-browse [remote_name] [file_name] [line_1] [line_2]

DESCRIPTION

@@ -89,12 +89,31 @@

OPTIONS

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 @@

SEE ALSO

  1. -
  2. March 2020
  3. +
  4. June 2022
  5. git-browse(1)
diff --git a/man/git-browse.md b/man/git-browse.md index ca2cc9ace..5f2f26216 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 <> From 8a6e39d589873e9b1564bc9d889cf2c296f3eb26 Mon Sep 17 00:00:00 2001 From: Peter Benjamin Date: Thu, 9 Jun 2022 19:32:47 -0700 Subject: [PATCH 2/3] fix(bin/git-browse): fix bitbucket url --- bin/git-browse | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/git-browse b/bin/git-browse index f8ab94b52..aee6d7eb0 100755 --- a/bin/git-browse +++ b/bin/git-browse @@ -62,7 +62,7 @@ elif [[ $remote_url =~ bitbucket ]]; then # construct bitbucket urls # https://bitbucket.org///src//#lines-: if [[ -n ${filename} ]]; then - url=${url}/blob/${commit_hash:-${branch}}/${filename} + url=${url}/src/${commit_hash:-${branch}}/${filename} if [[ -n "${line1}" ]]; then url="${url}#lines-${line1}" if [[ -n "${line2}" ]]; then From 7acc1de7fa3cee109c363099b74bf6eefcb1ea8d Mon Sep 17 00:00:00 2001 From: Peter Benjamin Date: Thu, 9 Jun 2022 19:44:02 -0700 Subject: [PATCH 3/3] fix(bin/git-browse): fix commit hash Retrieving commit hashes with the following command is not very reliable for users who sign their commits with gpg/ssh keys: ``` git log -n1 --format=format:"%H" "${filename}" 2>/dev/null ``` --- bin/git-browse | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/bin/git-browse b/bin/git-browse index aee6d7eb0..06e0c0f06 100755 --- a/bin/git-browse +++ b/bin/git-browse @@ -8,7 +8,7 @@ line2=${4:-""} # get remote name if [[ $remote == "" ]]; then - branch=$(git rev-parse --abbrev-ref HEAD 2 &>/dev/null) + branch="$(git rev-parse --abbrev-ref HEAD 2>/dev/null)" remote=$(git config branch."${branch}".remote || echo "origin") fi @@ -31,14 +31,14 @@ elif [[ $remote_url = http* ]]; then fi # construct urls -commit_hash=$(git log -n1 --format=format:"%H" "${filename}" 2>/dev/null) +commit_hash=$(git rev-parse HEAD 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}" + url="${url}/-/blob/${commit_or_branch}/${filename}" if [[ -n "${line1}" ]]; then url="${url}#L${line1}" if [[ -n "${line2}" ]]; then @@ -50,7 +50,7 @@ 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}" + url="${url}/blob/${commit_or_branch}/${filename}" if [[ -n "${line1}" ]]; then url="${url}#L${line1}" if [[ -n "${line2}" ]]; then @@ -62,7 +62,7 @@ elif [[ $remote_url =~ bitbucket ]]; then # construct bitbucket urls # https://bitbucket.org///src//#lines-: if [[ -n ${filename} ]]; then - url=${url}/src/${commit_hash:-${branch}}/${filename} + url=${url}/src/${commit_or_branch}/${filename} if [[ -n "${line1}" ]]; then url="${url}#lines-${line1}" if [[ -n "${line2}" ]]; then