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
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 -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)
@ -29,6 +41,12 @@ $ git open someremote somebranch
$ git open --issue
# If branches use naming convention of 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
@ -74,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
`plugins=(...)` to `plugins=(... git-open)`
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)
@ -88,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
@ -102,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
@ -130,12 +159,6 @@ from which this plugin was forked.
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:
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
- **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-11-30** - Support for VSTS 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)
[Full changelog](https://github.com/:paulirish/git-open/compare/v2.0.0...v2.1.0)
## [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)
### New features
@ -11,14 +11,14 @@
### 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)
- 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 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))
- 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)
- deps: change markdownlint to markdownlint-cli: [`702b8a6`](https://github.com/:paulirish/git-open/commit/702b8a6), [`5b815cb`](https://github.com/:paulirish/git-open/commit/5b815cb)
- 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)
- 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)
- 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)
- 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)
---

117
git-open
View file

@ -16,7 +16,11 @@ git open [remote] [branch]
https://github.com/paulirish/git-open/
Available options are
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
"
# 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"
# Defaults
is_commit=0
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
shift
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?
if ! git rev-parse --is-inside-work-tree &>/dev/null; then
echo "Not a git repository." 1>&2
@ -42,8 +63,10 @@ if ! git rev-parse --is-inside-work-tree &>/dev/null; then
fi
# choose remote. priority to: provided argument, default in config, detected tracked remote, 'origin'
branch_name=$(git name-rev --name-only HEAD 2>/dev/null)
tracked_remote=$(git config "branch.$branch_name.remote")
branch=${2:-$(git symbolic-ref -q --short HEAD)}
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)
remote=${1:-$default_remote}
remote=${remote:-$tracked_remote}
@ -128,7 +151,7 @@ else
# Resolve sshconfig aliases
if [[ -e "$ssh_config" ]]; then
domain_resolv=$(ssh_resolve "$domain")
if [[ ! -z "$domain_resolv" ]]; then
if [[ -n "$domain_resolv" ]]; then
domain="$domain_resolv"
fi
fi
@ -152,26 +175,31 @@ function getConfig() {
domain=$(getConfig "domain")
protocol=$(getConfig "protocol")
forge=$(getConfig "forge")
# Get current branch / tag / commit
branch=${2:-$(git symbolic-ref -q --short HEAD || git describe --tags --exact-match 2>/dev/null || git rev-parse HEAD)}
# Remote ref to open
remote_ref=${upstream_branch:-${branch:-$(git describe --tags --exact-match 2>/dev/null || git rev-parse HEAD)}}
# Split arguments on '/'
IFS='/' read -r -a pathargs <<<"$urlpath"
if (( is_issue )); then
# For issues, take the numbers and preprend 'issues/'
providerBranchRef="/issues/${branch//[^0-9]/}"
[[ $remote_ref =~ [0-9]+ ]]
providerBranchRef="/issues/${BASH_REMATCH[0]}"
else
# Make # and % characters url friendly
# github.com/paulirish/git-open/pull/24
branch=${branch//%/%25} branch=${branch//#/%23}
providerBranchRef="/tree/$branch"
remote_ref=${remote_ref//%/%25} remote_ref=${remote_ref//#/%23}
if [[ $forge == 'gitea' ]]; then
providerBranchRef="/src/branch/$remote_ref"
else
providerBranchRef="/tree/$remote_ref"
fi
fi
if [[ "$domain" == 'bitbucket.org' ]]; then
# Bitbucket, see https://github.com/paulirish/git-open/issues/80 for why ?at is needed.
providerBranchRef="/src?at=$branch"
providerBranchRef="/src/$remote_ref"
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
# 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
pathargs=(${pathPref[@]} 'projects' ${pathargs[${#pathargs[@]} - 2]} 'repos' "${pathargs[@]:${#pathargs[@]} - 1}")
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
# 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
@ -191,10 +228,10 @@ elif [[ "${#pathargs[@]}" -ge '2' && ${pathargs[${#pathargs[@]} - 2]} == '_git'
urlpath="${urlpath%%/_git/*}/_workitems"
# Handle case for the default repository url
urlpath="${urlpath#_git\/*}"
providerBranchRef="?id=${branch//[^0-9]/}"
providerBranchRef="?id=${remote_ref//[^0-9]/}"
else
# Keep project and repository name, append branch selector.
providerBranchRef="?version=GB$branch"
providerBranchRef="?version=GB$remote_ref"
fi
elif [[ "$domain" =~ amazonaws\.com$ ]]; then
# AWS Code Commit
@ -218,15 +255,39 @@ 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"
# simplify URL for master
if [[ $branch != "master" ]]; then
if (( is_commit )); then
sha=$(git rev-parse HEAD)
openurl="$openurl/commit/$sha"
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
# get current open browser command
case $( uname -s ) in
Darwin) open='open';;
@ -234,17 +295,29 @@ case $( uname -s ) in
MSYS*) open='start';;
CYGWIN*) open='cygstart';;
*) # Try to detect WSL (Windows Subsystem for Linux)
if uname -r | grep -q Microsoft; then
open='powershell.exe Start'
if uname -r | grep -q -i Microsoft; then
open='/mnt/c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe -NoProfile Start'
else
open='xdg-open'
fi;;
esac
# Allow printing the url if BROWSER=echo
if [[ $BROWSER != "echo" ]]; then
exec &>/dev/null
if (( print_only )); then
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

@ -3,7 +3,7 @@
## SYNOPSIS
`git open` [--issue] [remote-name] [branch-name]
`git open` [--issue] [--commit] [--suffix some_suffix] [remote-name] [branch-name]
## DESCRIPTION
@ -14,15 +14,24 @@ git hosting services are supported.
## OPTIONS
`-c`, `--commit`
Open the current commit. See `EXAMPLES` for more information.
Only tested with GitHub & GitLab.
`-i`, `--issue`
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.
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`
Show a short help text.
## EXAMPLES
```sh
@ -50,6 +59,25 @@ git open --issue
If branches use naming convention of `issues/#123`, it opens
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
@ -90,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}

4694
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -1,6 +1,6 @@
{
"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.",
"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/)",
@ -32,20 +32,20 @@
},
"man": "./git-open.1",
"scripts": {
"lint:editorconfig": "eclint check git-open* readme* .travis.yml",
"lint:package": "pjv --recommendations --warnings",
"lint:editorconfig": "eclint check ./git-open *.md *.yml",
"lint:readme": "markdownlint --config markdownlint.json README.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",
"test": "npm run unit && npm run lint:package && npm run lint:man && npm run lint:readme && npm run lint:editorconfig",
"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": {
"eclint": "^2.1.0",
"markdownlint-cli": "^0.13.0",
"marked-man": "^0.2.1",
"package-json-validator": "^0.6.1"
"markdownlint-cli": "^0.32.0",
"marked-man": "^0.7.0"
}
}

View file

@ -35,6 +35,17 @@ setup() {
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
##
@ -65,6 +76,27 @@ setup() {
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" {
git remote set-url origin "git@github.com:user/repo.git"
git tag mytag
@ -128,12 +160,42 @@ setup() {
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" {
git remote set-url origin "git@gist.github.com:2d84a6db1b41b4020685.git"
run ../git-open
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"
@ -181,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
##
@ -311,7 +382,7 @@ setup() {
git commit -m a
git checkout mytag
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" {
@ -327,7 +398,7 @@ setup() {
git checkout -B "devel"
run ../git-open
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" {
@ -336,9 +407,7 @@ setup() {
git remote set-url origin "https://bitbucket.org/guyzmo/git-repo.git"
git checkout -B "bugfix/conftest_fix"
run ../git-open
assert_output --partial "https://bitbucket.org/guyzmo/git-repo/src"
# BB appears to be fine with both literal or URL-encoded forward slash
assert_output --partial "?at=bugfix/conftest_fix"
assert_output "https://bitbucket.org/guyzmo/git-repo/src/bugfix/conftest_fix"
}
@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"
}
@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
@ -475,6 +551,13 @@ setup() {
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
##
@ -558,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 ..