Compare commits

...

47 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
Paul Irish 17491478e6 3.0.0 2022-07-18 15:17:02 -07:00
Paul Irish 0b626514bb
move to github actions (#192) 2022-07-18 14:19:56 -07:00
Paul Irish 1a93477f70 update dependencies 2022-07-18 13:30:29 -07:00
Sowmiya M f11ced9a4f
Remove unused code and fix double-negation (#153) 2022-07-18 13:30:13 -07:00
Paul Irish 0b6b0a2b40 package-lock.json update 2022-07-18 13:10:50 -07:00
ratijas ca0214c0d6
Fix broken links in changelog (#172) 2022-07-18 12:46:58 -07:00
kazufusa 8ac94bf7c3
gitlab: fix issue ID parsing (#183) 2022-07-18 12:46:28 -07:00
John Meyer 0296983a28
WSL: do not load PowerShell profile (#190) 2022-07-18 12:37:31 -07:00
Dave Wikoff 14fdf5c96e Merge branch 'pull-165' into master 2020-08-21 15:09:30 -07:00
Dave Wikoff ca8b2348f2 Fix bitbucket tests 2020-08-21 15:02:54 -07:00
Heechul Ryu c908a50824 Delete the comment for issue #80 2020-07-08 11:10:29 +01:00
Heechul Ryu 0189caeb4b Open bitbucket with the right branch
replace from `?at` to `/` for `providerBranchRef`
2020-07-08 11:10:29 +01:00
Dave Wikoff 3e8c908dcd
Merge pull request #166 from glostis/fix-suffix
Fix suffix with `=` in it
2020-07-07 14:46:30 -07:00
Guillaume Lostis 3bd3524de2 Fix shellcheck 2020-06-19 14:02:31 +02:00
Guillaume Lostis 1d55c4ee50 Fix formatting to pass shellcheck 2020-06-19 12:35:48 +02:00
Guillaume Lostis 91170cd5c8 Fix handling of suffix with = in it 2020-06-19 12:11:53 +02:00
Guillaume Lostis 9a35780c09 Add test for suffix with = in it 2020-06-19 12:11:29 +02:00
Dave Wikoff d9a0d19ce2
Merge pull request #149 from rec/documentation
Document flags to git-open
2019-12-22 13:55:37 -05:00
Dave Wikoff 849298fece
Detect WSL case insensitively (#158)
Detect WSL case insensitively
2019-12-22 13:32:17 -05:00
Víctor ad8fac9309
Detect WSL case insensitively
My `uname -r` is `4.19.81-microsoft-standard`
2019-11-26 10:54:37 +01:00
Frank Fesevur fcbbf918f7
Merge pull request #154 from dineshba/master
Add suffix flag
2019-09-16 07:56:38 +02:00
Dinesh 8b909f81dc Add suffix flag
Co-authored-by: Sowmiya <sowmiyamuthuraman@gmail.com>
2019-09-07 23:08:13 +05:30
Tom Ritchford d52366d8c9 Document flags to git-open 2019-07-29 15:18:33 +02:00
Dave Wikoff 08fa2abd7e
Add a --commit option (#144)
Add a --commit option
2019-07-09 12:21:32 -04:00
Domenico Gemoli 0564817aef Adding a --commit option.
I've only tested this with gitlab seeing as I needed it there. If this could be useful I can integrate any feedback you might have to get this proposal merged.
2019-07-08 23:34:13 +02:00
Dave Wikoff 44382bf541
Merge pull request #143 from arunvelsriram/print-option
Add option to print the url
2019-07-06 13:17:10 -04:00
Arunvel Sriram 8239d0a785 Add option to print the url 2019-07-03 21:32:34 +05:30
Dave Wikoff 7eeee771ce
default to upstream branch (#140)
default to upstream branch
2019-06-02 13:35:38 -04:00
Love F 3d1ad212b2 default to upstream branch 2019-06-02 14:24:41 +02:00
Paul Irish 4eed00f282
Fix shellcheck on travis (#134) 2018-12-03 18:24:29 -08:00
Paul Irish 556dbe91f2
readme: add 2.1.0 release to mini changelog 2018-12-03 11:09:06 -08:00
11 changed files with 4217 additions and 909 deletions

33
.github/workflows/ci.yml vendored Normal file
View file

@ -0,0 +1,33 @@
name: CI
on:
push:
branches: [master]
pull_request: # run on all PRs, not just PRs to a particular branch
jobs:
basics:
runs-on: ubuntu-latest
steps:
- name: git clone
uses: actions/checkout@v3
with:
fetch-depth: 100
- uses: actions/setup-node@v3
with:
node-version: latest
- run: npm ci
- name: Setup BATS
uses: mig4/setup-bats@v1
with:
bats-version: 0.4.0 # This is the version i have locally. looks like an upgrade is in order, though…
- run: git submodule update --init
name: pull in bats assertion libs
- run: npm run lint
- run: npm run shellcheck
- run: npm run unit

5
.npmignore Normal file
View file

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

View file

@ -1,23 +0,0 @@
language: node_js
node_js: "node"
addons:
apt:
sources:
- debian-sid # Grab ShellCheck from the Debian repo
packages:
- shellcheck
cache:
directories:
- node_modules
before_install:
- git clone --depth 1 https://github.com/sstephenson/bats.git
install:
- npm install
script:
- npm run lint:package
- npm run lint:readme
- npm run lint:editorconfig
- npm run lint:man
- shellcheck git-open
- npm run man
- ./bats/bin/bats test/*.bats

View file

@ -8,8 +8,20 @@ Type `git open` to open the repo website (GitHub, GitLab, Bitbucket) in your bro
```sh ```sh
git open [remote-name] [branch-name] git open [remote-name] [branch-name]
# Open the page for this branch on the repo website
git open --commit
git open -c
# Open the current commit in the repo website
git open --issue git open --issue
git open -i
# If this branch is named like issue/#123, this will open the corresponding
# issue in the repo website
git open --print
git open -p
# Only print the url at the terminal, but don't open it
``` ```
(`git open` works with these [hosted repo providers](#supported-remote-repositories), `git open --issue` currently only works with GitHub, Visual Studio Team Services and Team Foundation Server) (`git open` works with these [hosted repo providers](#supported-remote-repositories), `git open --issue` currently only works with GitHub, Visual Studio Team Services and Team Foundation Server)
@ -29,6 +41,12 @@ $ git open someremote somebranch
$ git open --issue $ git open --issue
# If branches use naming convention of issues/#123, # If branches use naming convention of issues/#123,
# opens https://github.com/TRACKED_REMOTE_USER/CURRENT_REPO/issues/123 # opens https://github.com/TRACKED_REMOTE_USER/CURRENT_REPO/issues/123
$ git open --print
# prints https://github.com/TRACKED_REMOTE_USER/CURRENT_REPO/tree/CURRENT_BRANCH
$ git open --suffix pulls
# opens https://github.com/TRACKED_REMOTE_USER/CURRENT_REPO/pulls
``` ```
## Installation ## Installation
@ -74,8 +92,9 @@ for testing before adding it to your `.zshrc`.
#### [Oh-My-Zsh](http://ohmyz.sh/) #### [Oh-My-Zsh](http://ohmyz.sh/)
1. `git clone https://github.com/paulirish/git-open.git $ZSH_CUSTOM/plugins/git-open` 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)` `plugins=(...)` to `plugins=(... git-open)`
3. `source ~/.zshrc`
#### [Zgen](https://github.com/tarjoilija/zgen) #### [Zgen](https://github.com/tarjoilija/zgen)
@ -88,6 +107,15 @@ check for updates to the git repository.
`zplug "paulirish/git-open", as:plugin` `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 ## Supported remote repositories
git-open can automatically guess the corresponding repository page for remotes git-open can automatically guess the corresponding repository page for remotes
@ -102,6 +130,7 @@ git-open can automatically guess the corresponding repository page for remotes
- Visual Studio Team Services - Visual Studio Team Services
- Team Foundation Server (on-premises) - Team Foundation Server (on-premises)
- AWS Code Commit - AWS Code Commit
- cnb.cool
## Configuration ## Configuration
@ -130,12 +159,6 @@ from which this plugin was forked.
Please provide examples of the URLs you are parsing with each PR. Please provide examples of the URLs you are parsing with each PR.
You can run `git-open` in `echo` mode, which doesn't open your browser, but just prints the URL to stdout:
```sh
env BROWSER='echo' ./git-open
```
### Testing: ### Testing:
You'll need to install [bats](https://github.com/sstephenson/bats#installing-bats-from-source), the Bash automated testing system. It's also available as `brew install bats` You'll need to install [bats](https://github.com/sstephenson/bats#installing-bats-from-source), the Bash automated testing system. It's also available as `brew install bats`
@ -163,7 +186,9 @@ Copyright Jason McCreary & Paul Irish. Licensed under MIT.
## Changelog ## Changelog
- **2017-12-01** - 2.0 shipped. Breaking change: [Gitlab configuration](https://github.com/paulirish/git-open#configuration) handled differently.
- **2018-12-03** - [2.1.0 shipped](https://github.com/paulirish/git-open/releases/tag/v2.1.0).
- **2017-12-01** - [2.0 shipped](https://github.com/paulirish/git-open/releases/tag/v2.0.0). Breaking change: [Gitlab configuration](https://github.com/paulirish/git-open#configuration) handled differently.
- **2017-12-01** - Configuration for custom remote added - **2017-12-01** - Configuration for custom remote added
- **2017-11-30** - Support for VSTS Added - **2017-11-30** - Support for VSTS Added
- **2017-10-31** - `--issue` and `-h` added - **2017-10-31** - `--issue` and `-h` added

View file

@ -1,5 +1,5 @@
## [Version 2.1.0](https://github.com/:paulirish/git-open/releases/tag/v2.1.0) (2018-12-3) ## [Version 2.1.0](https://github.com/paulirish/git-open/releases/tag/v2.1.0) (2018-12-3)
[Full changelog](https://github.com/:paulirish/git-open/compare/v2.0.0...v2.1.0) [Full changelog](https://github.com/paulirish/git-open/compare/v2.0.0...v2.1.0)
### New features ### New features
@ -11,14 +11,14 @@
### Bug fixes ### Bug fixes
- Fix bug with open -i on default VSTS project repo: [`67b72ac`](https://github.com/:paulirish/git-open/commit/67b72ac), [`aea6e3e`](https://github.com/:paulirish/git-open/commit/aea6e3e) - Fix bug with open -i on default VSTS project repo: [`67b72ac`](https://github.com/paulirish/git-open/commit/67b72ac), [`aea6e3e`](https://github.com/paulirish/git-open/commit/aea6e3e)
- Use ls-remote --get-url to get remote url: [`740222b`](https://github.com/:paulirish/git-open/commit/740222b) - Use ls-remote --get-url to get remote url: [`740222b`](https://github.com/paulirish/git-open/commit/740222b)
- Fix shellcheck: [`775361b`](https://github.com/:paulirish/git-open/commit/775361b) - Fix shellcheck: [`775361b`](https://github.com/paulirish/git-open/commit/775361b)
- Fix incompatability with bash < 4: [`895240f`](https://github.com/:paulirish/git-open/commit/895240f) - Fix incompatability with bash < 4: [`895240f`](https://github.com/paulirish/git-open/commit/895240f)
- Swap uppercase/lowercase for ssh feature: [`995e915`](https://github.com/:paulirish/git-open/commit/995e915) ([#123](https://github.com/:paulirish/git-open/issues/123)) - Swap uppercase/lowercase for ssh feature: [`995e915`](https://github.com/paulirish/git-open/commit/995e915) ([#123](https://github.com/paulirish/git-open/issues/123))
- Remove openopt, allow spaces in $BROWSER: [`96c80ff`](https://github.com/:paulirish/git-open/commit/96c80ff) - Remove openopt, allow spaces in $BROWSER: [`96c80ff`](https://github.com/paulirish/git-open/commit/96c80ff)
- readme: One liner install for oh-my-zsh: [`29434cd`](https://github.com/:paulirish/git-open/commit/29434cd) - readme: One liner install for oh-my-zsh: [`29434cd`](https://github.com/paulirish/git-open/commit/29434cd)
- deps: change markdownlint to markdownlint-cli: [`702b8a6`](https://github.com/:paulirish/git-open/commit/702b8a6), [`5b815cb`](https://github.com/:paulirish/git-open/commit/5b815cb) - deps: change markdownlint to markdownlint-cli: [`702b8a6`](https://github.com/paulirish/git-open/commit/702b8a6), [`5b815cb`](https://github.com/paulirish/git-open/commit/5b815cb)
--- ---

117
git-open
View file

@ -16,7 +16,11 @@ git open [remote] [branch]
https://github.com/paulirish/git-open/ https://github.com/paulirish/git-open/
Available options are Available options are
c,commit! open current commit
i,issue! open issues page i,issue! open issues page
s,suffix= append this suffix
f,file= append this file
p,print! just print the url
" "
# https://github.com/koalaman/shellcheck/wiki/SC1090 # https://github.com/koalaman/shellcheck/wiki/SC1090
@ -24,17 +28,34 @@ i,issue! open issues page
SUBDIRECTORY_OK='Yes' . "$(git --exec-path)/git-sh-setup" SUBDIRECTORY_OK='Yes' . "$(git --exec-path)/git-sh-setup"
# Defaults # Defaults
is_commit=0
is_issue=0 is_issue=0
protocol="https" protocol="https"
print_only=0
suffix_flag=""
file_flag=""
while test $# != 0; do while test $# != 0; do
case "$1" in case "$1" in
--commit) is_commit=1;;
--issue) is_issue=1;; --issue) is_issue=1;;
--suffix=*) suffix_flag="$1";;
--file=*) file_flag="$1";;
--print) print_only=1;;
--) shift; break ;; --) shift; break ;;
esac esac
shift shift
done done
# parse suffix from suffix=value
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? # are we in a git repo?
if ! git rev-parse --is-inside-work-tree &>/dev/null; then if ! git rev-parse --is-inside-work-tree &>/dev/null; then
echo "Not a git repository." 1>&2 echo "Not a git repository." 1>&2
@ -42,8 +63,10 @@ if ! git rev-parse --is-inside-work-tree &>/dev/null; then
fi fi
# choose remote. priority to: provided argument, default in config, detected tracked remote, 'origin' # choose remote. priority to: provided argument, default in config, detected tracked remote, 'origin'
branch_name=$(git name-rev --name-only HEAD 2>/dev/null) branch=${2:-$(git symbolic-ref -q --short HEAD)}
tracked_remote=$(git config "branch.$branch_name.remote") upstream_branch_full_name=$(git config "branch.$branch.merge")
upstream_branch=${upstream_branch_full_name#"refs/heads/"}
tracked_remote=$(git config "branch.$branch.remote")
default_remote=$(git config open.default.remote) default_remote=$(git config open.default.remote)
remote=${1:-$default_remote} remote=${1:-$default_remote}
remote=${remote:-$tracked_remote} remote=${remote:-$tracked_remote}
@ -128,7 +151,7 @@ else
# Resolve sshconfig aliases # Resolve sshconfig aliases
if [[ -e "$ssh_config" ]]; then if [[ -e "$ssh_config" ]]; then
domain_resolv=$(ssh_resolve "$domain") domain_resolv=$(ssh_resolve "$domain")
if [[ ! -z "$domain_resolv" ]]; then if [[ -n "$domain_resolv" ]]; then
domain="$domain_resolv" domain="$domain_resolv"
fi fi
fi fi
@ -152,26 +175,31 @@ function getConfig() {
domain=$(getConfig "domain") domain=$(getConfig "domain")
protocol=$(getConfig "protocol") protocol=$(getConfig "protocol")
forge=$(getConfig "forge")
# Get current branch / tag / commit # Remote ref to open
branch=${2:-$(git symbolic-ref -q --short HEAD || git describe --tags --exact-match 2>/dev/null || git rev-parse HEAD)} remote_ref=${upstream_branch:-${branch:-$(git describe --tags --exact-match 2>/dev/null || git rev-parse HEAD)}}
# Split arguments on '/' # Split arguments on '/'
IFS='/' read -r -a pathargs <<<"$urlpath" IFS='/' read -r -a pathargs <<<"$urlpath"
if (( is_issue )); then if (( is_issue )); then
# For issues, take the numbers and preprend 'issues/' # For issues, take the numbers and preprend 'issues/'
providerBranchRef="/issues/${branch//[^0-9]/}" [[ $remote_ref =~ [0-9]+ ]]
providerBranchRef="/issues/${BASH_REMATCH[0]}"
else else
# Make # and % characters url friendly # Make # and % characters url friendly
# github.com/paulirish/git-open/pull/24 # github.com/paulirish/git-open/pull/24
branch=${branch//%/%25} branch=${branch//#/%23} remote_ref=${remote_ref//%/%25} remote_ref=${remote_ref//#/%23}
providerBranchRef="/tree/$branch" if [[ $forge == 'gitea' ]]; then
providerBranchRef="/src/branch/$remote_ref"
else
providerBranchRef="/tree/$remote_ref"
fi
fi fi
if [[ "$domain" == 'bitbucket.org' ]]; then if [[ "$domain" == 'bitbucket.org' ]]; then
# Bitbucket, see https://github.com/paulirish/git-open/issues/80 for why ?at is needed. providerBranchRef="/src/$remote_ref"
providerBranchRef="/src?at=$branch"
elif [[ "${#pathargs[@]}" -ge 3 && ${pathargs[${#pathargs[@]} - 3]} == 'scm' ]]; then elif [[ "${#pathargs[@]}" -ge 3 && ${pathargs[${#pathargs[@]} - 3]} == 'scm' ]]; then
# Bitbucket server always has /scm/ as the third to last segment in the url path, e.g. /scm/ppp/test-repo.git # Bitbucket server always has /scm/ as the third to last segment in the url path, e.g. /scm/ppp/test-repo.git
# Anything before the 'scm' is part of the server's root context # Anything before the 'scm' is part of the server's root context
@ -183,7 +211,16 @@ elif [[ "${#pathargs[@]}" -ge 3 && ${pathargs[${#pathargs[@]} - 3]} == 'scm' ]];
# shellcheck disable=SC2206 # shellcheck disable=SC2206
pathargs=(${pathPref[@]} 'projects' ${pathargs[${#pathargs[@]} - 2]} 'repos' "${pathargs[@]:${#pathargs[@]} - 1}") pathargs=(${pathPref[@]} 'projects' ${pathargs[${#pathargs[@]} - 2]} 'repos' "${pathargs[@]:${#pathargs[@]} - 1}")
IFS='/' urlpath="${pathargs[*]}" IFS='/' urlpath="${pathargs[*]}"
providerBranchRef="/browse?at=$branch" 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 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 # 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 if (( is_issue )); then
@ -191,10 +228,10 @@ elif [[ "${#pathargs[@]}" -ge '2' && ${pathargs[${#pathargs[@]} - 2]} == '_git'
urlpath="${urlpath%%/_git/*}/_workitems" urlpath="${urlpath%%/_git/*}/_workitems"
# Handle case for the default repository url # Handle case for the default repository url
urlpath="${urlpath#_git\/*}" urlpath="${urlpath#_git\/*}"
providerBranchRef="?id=${branch//[^0-9]/}" providerBranchRef="?id=${remote_ref//[^0-9]/}"
else else
# Keep project and repository name, append branch selector. # Keep project and repository name, append branch selector.
providerBranchRef="?version=GB$branch" providerBranchRef="?version=GB$remote_ref"
fi fi
elif [[ "$domain" =~ amazonaws\.com$ ]]; then elif [[ "$domain" =~ amazonaws\.com$ ]]; then
# AWS Code Commit # AWS Code Commit
@ -218,15 +255,39 @@ elif [[ "$domain" =~ amazonaws\.com$ ]]; then
# Replace branch ref. # Replace branch ref.
# Ex. /tree/foobar -> foobar/--/ # Ex. /tree/foobar -> foobar/--/
providerBranchRef="${providerBranchRef##*/}/--/" 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 fi
openurl="$protocol://$domain/$urlpath" openurl="$protocol://$domain/$urlpath"
# simplify URL for master if (( is_commit )); then
if [[ $branch != "master" ]]; then sha=$(git rev-parse HEAD)
openurl="$openurl/commit/$sha"
elif [[ $remote_ref != "master" || "$file" ]]; then
# simplify URL for master
openurl="$openurl$providerBranchRef" openurl="$openurl$providerBranchRef"
fi 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
# get current open browser command # get current open browser command
case $( uname -s ) in case $( uname -s ) in
Darwin) open='open';; Darwin) open='open';;
@ -234,17 +295,29 @@ case $( uname -s ) in
MSYS*) open='start';; MSYS*) open='start';;
CYGWIN*) open='cygstart';; CYGWIN*) open='cygstart';;
*) # Try to detect WSL (Windows Subsystem for Linux) *) # Try to detect WSL (Windows Subsystem for Linux)
if uname -r | grep -q Microsoft; then if uname -r | grep -q -i Microsoft; then
open='powershell.exe Start' open='/mnt/c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe -NoProfile Start'
else else
open='xdg-open' open='xdg-open'
fi;; fi;;
esac esac
# Allow printing the url if BROWSER=echo if (( print_only )); then
if [[ $BROWSER != "echo" ]]; then printf '%s\n' "$openurl"
exec &>/dev/null exit 0
fi fi
# open it in a browser # 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

@ -3,7 +3,7 @@
## SYNOPSIS ## SYNOPSIS
`git open` [--issue] [remote-name] [branch-name] `git open` [--issue] [--commit] [--suffix some_suffix] [remote-name] [branch-name]
## DESCRIPTION ## DESCRIPTION
@ -14,15 +14,24 @@ git hosting services are supported.
## OPTIONS ## OPTIONS
`-c`, `--commit`
Open the current commit. See `EXAMPLES` for more information.
Only tested with GitHub & GitLab.
`-i`, `--issue` `-i`, `--issue`
Open the current issue. When the name of the current branch matches the right pattern, Open the current issue. When the name of the current branch matches the right pattern,
it will open the webpage with that issue. See `EXAMPLES` for more information. it will open the webpage with that issue. See `EXAMPLES` for more information.
This only works on GitHub, GitLab, Visual Studio Team Services and Team Foundation Server at the moment. This only works on GitHub, GitLab, Visual Studio Team Services and Team Foundation Server at the moment.
`-s`, `--suffix` some_suffix
Append the given suffix to the url
`-p`, `--print`
Just print the URL. Do not open it in browser.
`-h` `-h`
Show a short help text. Show a short help text.
## EXAMPLES ## EXAMPLES
```sh ```sh
@ -50,6 +59,25 @@ git open --issue
If branches use naming convention of `issues/#123`, it opens If branches use naming convention of `issues/#123`, it opens
https://github.com/TRACKED_REMOTE_USER/CURRENT_REPO/issues/123 https://github.com/TRACKED_REMOTE_USER/CURRENT_REPO/issues/123
```sh
git open --suffix pulls
```
It opens the URL https://github.com/TRACKED_REMOTE_USER/CURRENT_REPO/pulls
```sh
git open --print
```
It prints the URL https://github.com/TRACKED_REMOTE_USER/CURRENT_REPO/
```sh
git open --commit
```
Supposing that the current sha is `2ddc8d4548d0cee3d714dcf0068dbec5b168a9b2`, it opens
https://github.com/TRACKED_REMOTE_USER/CURRENT_REPO/commit/2ddc8d4548d0cee3d714dcf0068dbec5b168a9b2
## SUPPORTED GIT HOSTING SERVICES ## SUPPORTED GIT HOSTING SERVICES
@ -90,6 +118,20 @@ git config open.default.remote upstream
This is equivalent to always typing `git open 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 ### GitLab options
To configure GitLab support (or other unique hosting situations) you may need to set some 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}

4694
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -1,6 +1,6 @@
{ {
"name": "git-open", "name": "git-open",
"version": "2.1.0", "version": "3.1.0",
"description": "Type `git open` to open the GitHub/GitLab/Bitbucket homepage for a repository.", "description": "Type `git open` to open the GitHub/GitLab/Bitbucket homepage for a repository.",
"author": "Paul Irish (http://paulirish.com/)", "author": "Paul Irish (http://paulirish.com/)",
"license": "MIT", "license": "MIT",
@ -10,7 +10,7 @@
}, },
"repository": { "repository": {
"type": "git", "type": "git",
"url": "https://github.com/paulirish/git-open.git" "url": "git+https://github.com/paulirish/git-open.git"
}, },
"contributors": [ "contributors": [
"Paul Irish (http://paulirish.com/)", "Paul Irish (http://paulirish.com/)",
@ -32,20 +32,20 @@
}, },
"man": "./git-open.1", "man": "./git-open.1",
"scripts": { "scripts": {
"lint:editorconfig": "eclint check git-open* readme* .travis.yml", "lint:editorconfig": "eclint check ./git-open *.md *.yml",
"lint:package": "pjv --recommendations --warnings",
"lint:readme": "markdownlint --config markdownlint.json README.md", "lint:readme": "markdownlint --config markdownlint.json README.md",
"lint:man": "markdownlint --config markdownlint.json git-open.1.md", "lint:man": "markdownlint --config markdownlint.json git-open.1.md",
"man": "marked-man --version \"git-open $npm_package_version\" --manual \"Git manual\" --section 1 git-open.1.md > git-open.1", "man": "marked-man --version \"git-open $npm_package_version\" --manual \"Git manual\" --section 1 git-open.1.md > git-open.1",
"test": "npm run unit && npm run lint:package && npm run lint:man && npm run lint:readme && npm run lint:editorconfig",
"unit": "bats test/", "unit": "bats test/",
"watch": "find . -maxdepth 2 -iname '*bats' -o -iname 'git-open' | entr bats test/" "shellcheck": "shellcheck ./git-open",
"lint": "npm run lint:readme && npm run lint:man && npm run lint:editorconfig",
"test": "npm run unit && npm run lint",
"watch": "find . -maxdepth 2 -iname '*bats' -o -iname 'git-open' | entr bats test/",
"prepublishOnly": "npm run man && npm run test"
}, },
"dependencies": {},
"devDependencies": { "devDependencies": {
"eclint": "^2.1.0", "eclint": "^2.1.0",
"markdownlint-cli": "^0.13.0", "markdownlint-cli": "^0.32.0",
"marked-man": "^0.2.1", "marked-man": "^0.7.0"
"package-json-validator": "^0.6.1"
} }
} }

View file

@ -35,6 +35,17 @@ setup() {
assert_output --partial "usage: git open" assert_output --partial "usage: git open"
} }
##
## Print
##
@test "print url" {
git remote set-url origin "git@github.com:user/repo.git"
git checkout -B "master"
BROWSER="assert_failure" run ../git-open -p
assert_output "https://github.com/user/repo"
}
## ##
## url handling ## url handling
## ##
@ -65,6 +76,27 @@ setup() {
assert_output "https://github.com/user/repo/tree/mybranch" assert_output "https://github.com/user/repo/tree/mybranch"
} }
@test "gh: upstream branch" {
git remote set-url origin "git@github.com:user/repo.git"
git remote add upstreamRemote "git@github.com:user/upstream-repo.git"
git checkout -B "mybranch"
git config --local "branch.mybranch.merge" "refs/heads/myupstream/mybranch"
git config --local "branch.mybranch.remote" "upstreamRemote"
run ../git-open
assert_output "https://github.com/user/upstream-repo/tree/myupstream/mybranch"
}
@test "gh: upstream branch from param" {
git remote set-url origin "git@github.com:user/repo.git"
git remote add upstreamRemote "git@github.com:user/upstream-repo.git"
git checkout -B "mybranch"
git config --local "branch.mybranch.merge" "refs/heads/upstreamBranch"
git config --local "branch.mybranch.remote" "upstreamRemote"
git checkout master
run ../git-open upstreamRemote mybranch
assert_output "https://github.com/user/upstream-repo/tree/upstreamBranch"
}
@test "gh: tag" { @test "gh: tag" {
git remote set-url origin "git@github.com:user/repo.git" git remote set-url origin "git@github.com:user/repo.git"
git tag mytag git tag mytag
@ -128,12 +160,42 @@ setup() {
assert_output "https://github.com/paulirish/git-open/issues/38" assert_output "https://github.com/paulirish/git-open/issues/38"
} }
@test "gh: git open --commit" {
git remote set-url origin "github.com:paulirish/git-open.git"
sha=$(git rev-parse HEAD)
run ../git-open "--commit"
assert_output "https://github.com/paulirish/git-open/commit/${sha}"
}
@test "gh: git open --suffix anySuffix" {
run ../git-open "--suffix" "anySuffix"
assert_output "https://github.com/paulirish/git-open/anySuffix"
}
@test "gh: git open --suffix anySuffix?hello=world" {
run ../git-open "--suffix" "anySuffix?hello=world"
assert_output "https://github.com/paulirish/git-open/anySuffix?hello=world"
}
@test "gh: gist" { @test "gh: gist" {
git remote set-url origin "git@gist.github.com:2d84a6db1b41b4020685.git" git remote set-url origin "git@gist.github.com:2d84a6db1b41b4020685.git"
run ../git-open run ../git-open
assert_output "https://gist.github.com/2d84a6db1b41b4020685" 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" { @test "basic: # and % in branch names are URL encoded" {
# https://github.com/paulirish/git-open/pull/24 # https://github.com/paulirish/git-open/pull/24
git checkout -B "issue-#42" git checkout -B "issue-#42"
@ -181,10 +243,19 @@ setup() {
@test "basic: http url scheme is preserved" { @test "basic: http url scheme is preserved" {
git remote set-url origin "http://github.com/user/repo.git" 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" 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 ## SSH config
## ##
@ -311,7 +382,7 @@ setup() {
git commit -m a git commit -m a
git checkout mytag git checkout mytag
run ../git-open run ../git-open
assert_output "https://bitbucket.org/paulirish/crbug-extension/src?at=mytag" assert_output "https://bitbucket.org/paulirish/crbug-extension/src/mytag"
} }
@test "bitbucket: non-origin remote" { @test "bitbucket: non-origin remote" {
@ -327,7 +398,7 @@ setup() {
git checkout -B "devel" git checkout -B "devel"
run ../git-open run ../git-open
refute_output --partial "//kisom" refute_output --partial "//kisom"
assert_output "https://bitbucket.org/kisom/consbri/src?at=devel" assert_output "https://bitbucket.org/kisom/consbri/src/devel"
} }
@test "bitbucket: open source view with a slash/branch" { @test "bitbucket: open source view with a slash/branch" {
@ -336,9 +407,7 @@ setup() {
git remote set-url origin "https://bitbucket.org/guyzmo/git-repo.git" git remote set-url origin "https://bitbucket.org/guyzmo/git-repo.git"
git checkout -B "bugfix/conftest_fix" git checkout -B "bugfix/conftest_fix"
run ../git-open run ../git-open
assert_output --partial "https://bitbucket.org/guyzmo/git-repo/src" assert_output "https://bitbucket.org/guyzmo/git-repo/src/bugfix/conftest_fix"
# BB appears to be fine with both literal or URL-encoded forward slash
assert_output --partial "?at=bugfix/conftest_fix"
} }
@test "bitbucket: ssh:// clone urls" { @test "bitbucket: ssh:// clone urls" {
@ -425,6 +494,13 @@ setup() {
assert_output "https://mybb.domain.com/root/context/projects/~first.last/repos/rrr/browse?at=refs/heads/develop" 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 ## GitLab
@ -475,6 +551,13 @@ setup() {
assert_output "https://git.example.com:7000/XXX/YYY" assert_output "https://git.example.com:7000/XXX/YYY"
} }
@test "gitlab: issue" {
git remote set-url origin "git@gitlab.example.com:user/repo"
git checkout -B "10-bump-up-to-v2.0"
run ../git-open "--issue"
assert_output "https://gitlab.example.com/user/repo/issues/10"
}
## ##
## Visual Studio Team Services ## Visual Studio Team Services
## ##
@ -558,6 +641,30 @@ setup() {
assert_output "Issue feature does not supported on AWS Code Commit." 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() { teardown() {
cd .. cd ..