Compare commits

...

16 commits

Author SHA1 Message Date
Adrian Miranda 63c0e77aaf
fix: handle browser paths safely (#234)
Some checks failed
CI / basics (push) Has been cancelled
2026-05-24 21:06:15 -04:00
Prabhu Jayakumar 41ebfcebe1
Add support for bitbucket repos cloned with ssh (#174) 2026-02-24 08:09:33 -08:00
Sam Saccone f4832493a0
tests: add test for open.default.remote configuration (#226)
Co-authored-by: Sam Bo <agent@openclaw.ai>
2026-02-14 07:21:58 -08:00
Simon Olofsson 477b196a1d
README: Add Bash section for Oh-My-Bash (#214) 2026-01-14 12:57:31 -08:00
sixther a223125abc
Added support for cnb.cool. (#217)
Co-authored-by: ericdduan <ericdduan@tencent.com>
2025-03-19 12:07:49 -07:00
Rob Loach 2a66fcd7e3
Add oh-my-bash support (#213)
Some checks failed
CI / basics (push) Has been cancelled
2024-10-03 18:17:24 -07:00
Paul Irish ce881820db make shellcheck happy. #170
Some checks failed
CI / basics (push) Has been cancelled
2024-08-05 17:08:25 -07:00
Paul Irish a7d09090c2 add a test for new --file option. ref #170 2024-08-05 17:06:40 -07:00
Paul Irish 866c39dbf4 add npmignore to avoid publishing bats-assert/support 2024-08-05 16:57:16 -07:00
Paul Irish 64cf066704 3.1.0 2024-08-05 16:54:16 -07:00
Paul Irish a437297494 package: repo fix 2024-08-05 16:54:03 -07:00
Brian Wellington dd22397400
Add --file option. (#170) 2024-08-05 16:52:18 -07:00
Sandro 5d1f938b47
Use absolute PATH to powershell.exe (#204)
Some checks failed
CI / basics (push) Has been cancelled
2024-07-05 07:03:11 -07:00
Majid Alaeinia d086ab0077
readme: zsh: Consider sourcing ~/.zshrc (#209) 2024-02-21 11:26:09 -08:00
Sandro 281dad270e
Add gitea support (#184) 2023-05-02 11:29:10 -07:00
Paul Irish f772364eb8 adjust http preservation test 2022-07-18 15:29:03 -07:00
8 changed files with 152 additions and 12 deletions

5
.npmignore Normal file
View file

@ -0,0 +1,5 @@
node_modules/
sandboxrepo
git-open.1
bats-assert
bats-support

View file

@ -92,8 +92,9 @@ for testing before adding it to your `.zshrc`.
#### [Oh-My-Zsh](http://ohmyz.sh/)
1. `git clone https://github.com/paulirish/git-open.git $ZSH_CUSTOM/plugins/git-open`
1. Add `git-open` to your plugin list - edit `~/.zshrc` and change
2. Add `git-open` to your plugin list - edit `~/.zshrc` and change
`plugins=(...)` to `plugins=(... git-open)`
3. `source ~/.zshrc`
#### [Zgen](https://github.com/tarjoilija/zgen)
@ -106,6 +107,15 @@ check for updates to the git repository.
`zplug "paulirish/git-open", as:plugin`
### Bash
#### [Oh-My-Bash](https://github.com/ohmybash/oh-my-bash)
1. `git clone https://github.com/paulirish/git-open.git $OSH_CUSTOM/plugins/git-open`
2. Add `git-open` to your plugin list - edit `~/.bashrc` and change
`plugins=(...)` to `plugins=(... git-open)`
3. `source ~/.bashrc`
## Supported remote repositories
git-open can automatically guess the corresponding repository page for remotes
@ -120,6 +130,7 @@ git-open can automatically guess the corresponding repository page for remotes
- Visual Studio Team Services
- Team Foundation Server (on-premises)
- AWS Code Commit
- cnb.cool
## Configuration

View file

@ -19,6 +19,7 @@ git open [remote] [branch]
c,commit! open current commit
i,issue! open issues page
s,suffix= append this suffix
f,file= append this file
p,print! just print the url
"
@ -32,12 +33,14 @@ is_issue=0
protocol="https"
print_only=0
suffix_flag=""
file_flag=""
while test $# != 0; do
case "$1" in
--commit) is_commit=1;;
--issue) is_issue=1;;
--suffix=*) suffix_flag="$1";;
--file=*) file_flag="$1";;
--print) print_only=1;;
--) shift; break ;;
esac
@ -49,6 +52,10 @@ IFS='=' read -ra suffix_flag <<< "$suffix_flag"
function join_by { local IFS="$1"; shift; echo "$*"; }
suffix=$(join_by "=" "${suffix_flag[@]:1}")
# parse file from file=value
IFS='=' read -ra file_flag <<< "$file_flag"
file=$(join_by "=" "${file_flag[@]:1}")
# are we in a git repo?
if ! git rev-parse --is-inside-work-tree &>/dev/null; then
echo "Not a git repository." 1>&2
@ -168,6 +175,7 @@ function getConfig() {
domain=$(getConfig "domain")
protocol=$(getConfig "protocol")
forge=$(getConfig "forge")
# Remote ref to open
remote_ref=${upstream_branch:-${branch:-$(git describe --tags --exact-match 2>/dev/null || git rev-parse HEAD)}}
@ -183,7 +191,11 @@ else
# Make # and % characters url friendly
# github.com/paulirish/git-open/pull/24
remote_ref=${remote_ref//%/%25} remote_ref=${remote_ref//#/%23}
providerBranchRef="/tree/$remote_ref"
if [[ $forge == 'gitea' ]]; then
providerBranchRef="/src/branch/$remote_ref"
else
providerBranchRef="/tree/$remote_ref"
fi
fi
if [[ "$domain" == 'bitbucket.org' ]]; then
@ -200,6 +212,15 @@ elif [[ "${#pathargs[@]}" -ge 3 && ${pathargs[${#pathargs[@]} - 3]} == 'scm' ]];
pathargs=(${pathPref[@]} 'projects' ${pathargs[${#pathargs[@]} - 2]} 'repos' "${pathargs[@]:${#pathargs[@]} - 1}")
IFS='/' urlpath="${pathargs[*]}"
providerBranchRef="/browse?at=$remote_ref"
elif [[ "$domain" == *"bitbucket"* ]] && [[ $gitprotocol == 'ssh' ]]; then
# bitbucket repo cloned with ssh will not have /scm/ segment in url path
# e.g. /ppp/test-repo.git
# Build the repo url starting with 'projects' and then keep the first argument, the string 'repos', and finally the rest of the arguments.
# shellcheck disable=SC2206
pathargs=('projects' ${pathargs[${#pathargs[@]} - 2]} 'repos' "${pathargs[@]:${#pathargs[@]} - 1}")
IFS='/' urlpath="${pathargs[*]}"
providerBranchRef="/browse?at=$remote_ref"
elif [[ "${#pathargs[@]}" -ge '2' && ${pathargs[${#pathargs[@]} - 2]} == '_git' ]]; then
# Visual Studio Team Services and Team Foundation Server always have /_git/ as the second to last segment in the url path
if (( is_issue )); then
@ -234,18 +255,35 @@ elif [[ "$domain" =~ amazonaws\.com$ ]]; then
# Replace branch ref.
# Ex. /tree/foobar -> foobar/--/
providerBranchRef="${providerBranchRef##*/}/--/"
elif [[ "$domain" =~ cnb\.cool$ ]]; then
# cnb.cool
# Replace URL path.
# Ex. repos/example -> repos/example/-
urlpath="$urlpath/-"
if [[ $remote_ref = "master" ]]; then
# repos/example/tree/master -> repos/example/-/tree/master
urlpath="$urlpath$providerBranchRef"
fi
fi
openurl="$protocol://$domain/$urlpath"
if (( is_commit )); then
sha=$(git rev-parse HEAD)
openurl="$openurl/commit/$sha"
elif [[ $remote_ref != "master" ]]; then
elif [[ $remote_ref != "master" || "$file" ]]; then
# simplify URL for master
openurl="$openurl$providerBranchRef"
fi
if [ "$file" ]; then
absfile=$(git ls-tree --full-name --name-only "$branch" "$file")
if [[ -z "$absfile" ]]; then
echo "File $file is not in repository" 1>&2
exit 1
fi
openurl="$openurl/$absfile"
fi
if [ "$suffix" ]; then
openurl="$openurl/$suffix"
fi
@ -258,15 +296,28 @@ case $( uname -s ) in
CYGWIN*) open='cygstart';;
*) # Try to detect WSL (Windows Subsystem for Linux)
if uname -r | grep -q -i Microsoft; then
open='powershell.exe -NoProfile Start'
open='/mnt/c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe -NoProfile Start'
else
open='xdg-open'
fi;;
esac
if (( print_only )); then
BROWSER="echo"
printf '%s\n' "$openurl"
exit 0
fi
# open it in a browser
${BROWSER:-$open} "$openurl"
if [[ -n "$BROWSER" ]]; then
if [[ -x "$BROWSER" ]]; then
"$BROWSER" "$openurl"
exit $?
fi
if command -v -- "$BROWSER" >/dev/null 2>&1; then
"$BROWSER" "$openurl"
exit $?
fi
fi
"$open" "$openurl"

View file

@ -118,6 +118,20 @@ git config open.default.remote upstream
This is equivalent to always typing `git open upstream`.
### Gitea options
To configure Gitea support you need to set the following option.
`open.[gitdomain].forge`
The git forge present at the git domain. This only needs to be set for Gitea because it uses another branch URL format.
**Example**
```sh
git config [--global] "open.https://gitea.internal.biz.forge" "gitea"
```
### GitLab options
To configure GitLab support (or other unique hosting situations) you may need to set some options.

6
git-open.plugin.sh Executable file
View file

@ -0,0 +1,6 @@
# This plugin is MIT licensed to match the git-open license.
#
# Make git-open easy to install and keep up to date if you're using a
# Bash framework like oh-my-bash.
export PATH="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )":${PATH}

4
package-lock.json generated
View file

@ -1,12 +1,12 @@
{
"name": "git-open",
"version": "3.0.0",
"version": "3.1.0",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "git-open",
"version": "3.0.0",
"version": "3.1.0",
"license": "MIT",
"bin": {
"git-home": "git-open",

View file

@ -1,6 +1,6 @@
{
"name": "git-open",
"version": "3.0.0",
"version": "3.1.0",
"description": "Type `git open` to open the GitHub/GitLab/Bitbucket homepage for a repository.",
"author": "Paul Irish (http://paulirish.com/)",
"license": "MIT",
@ -10,7 +10,7 @@
},
"repository": {
"type": "git",
"url": "https://github.com/paulirish/git-open.git"
"url": "git+https://github.com/paulirish/git-open.git"
},
"contributors": [
"Paul Irish (http://paulirish.com/)",

View file

@ -183,6 +183,19 @@ setup() {
assert_output "https://gist.github.com/2d84a6db1b41b4020685"
}
@test "gh: --file option" {
run ../git-open -f readme.txt
assert_output "https://github.com/paulirish/git-open/tree/master/readme.txt"
# and now a new file in a subdirectory.
mkdir -p subdir
touch subdir/howdy.txt
git add subdir
git commit -am add-in-howdy
run ../git-open -f subdir/howdy.txt
assert_output "https://github.com/paulirish/git-open/tree/master/subdir/howdy.txt"
}
@test "basic: # and % in branch names are URL encoded" {
# https://github.com/paulirish/git-open/pull/24
git checkout -B "issue-#42"
@ -230,10 +243,19 @@ setup() {
@test "basic: http url scheme is preserved" {
git remote set-url origin "http://github.com/user/repo.git"
run ../git-open
# ignore any local config like: `url.https://github.com/.insteadof=http://github.com/`
GIT_CONFIG_NOSYSTEM=1 run ../git-open
assert_output "http://github.com/user/repo"
}
@test "basic: open.default.remote configuration" {
git remote set-url origin "git@github.com:paulirish/git-open.git"
git remote add upstream "git@github.com:upstreamorg/repo.git"
git config --local open.default.remote upstream
run ../git-open
assert_output "https://github.com/upstreamorg/repo"
}
##
## SSH config
##
@ -472,6 +494,13 @@ setup() {
assert_output "https://mybb.domain.com/root/context/projects/~first.last/repos/rrr/browse?at=refs/heads/develop"
}
@test "bitbucket: Selfhosted Bitbucket Server with ssh:// clone urls" {
# https://github.com/paulirish/git-open/pull/174
git remote set-url origin "ssh://git@bitbucket.domain.com/ppp/rrr.git"
run ../git-open
assert_output "https://bitbucket.domain.com/projects/ppp/repos/rrr"
}
##
## GitLab
@ -612,6 +641,30 @@ setup() {
assert_output "Issue feature does not supported on AWS Code Commit."
}
##
## cnb.cool
##
@test "cnb: https url" {
git remote set-url origin "https://cnb.cool/repos/repo"
git checkout -B "master"
run ../git-open
assert_output "https://cnb.cool/repos/repo/-/tree/master"
}
@test "cnb: branch " {
git remote set-url origin "https://cnb.cool/repos/repo"
git checkout -B "mybranch"
run ../git-open
assert_output "https://cnb.cool/repos/repo/-/tree/mybranch"
}
@test "cnb: issue" {
git remote set-url origin "https://cnb.cool/repos/repo"
git checkout -B "issues/10"
run ../git-open "--issue"
assert_output "https://cnb.cool/repos/repo/-/issues/10"
}
teardown() {
cd ..