🐟
fish functionで実装したgit-openを改良する
以前、fishに自前でgit-open
のようにリポジトリを表示する関数を定義にしました。
今回はこれを少し改良してファイルを指定したり現在のブランチに合わせて表示するようにします。
TL;DR
~/.config/fish/functions/git-open.fish
function git-open --description 'open website current git repository'
set -f repository (git remote get-url origin | choose -f @ 1 | choose -f '\.git' 0 | sd ':' '/')
set -f branch (git branch --show-current)
if test -z $argv
open https://$repository/tree/$branch
else
open https://$repository/blob/$branch/$argv
end
end
実装する
改修前
function git-open --description 'open website current git repository'
open https://(git remote get-url origin | choose -f @ 1 | choose -f '\.git' 0 | sd ':' '/')
end
改修前はワンライナーで書いたこともあり、非常にシンプルでした。
引数を渡しても無視してカレントディレクトリのgitリポジトリのページを開きます。
今回はこれに次の機能を追加します。
- カレントブランチのリポジトリを開く
- 引数で渡されたファイルを開く
利用イメージ
$ git-open # カレントブランチでリポジトリのトップページが開く
$ git-open READM.md # カレントブランチでREADME.mdのページが開く
GitHubのURL構造
GitHubのURL構造は次のようになります。
https://github.com/{アカウント名}/{リポジトリ名}/{tree|blob}/{ブランチ名}/{ファイルパス}
関数の中で
- アカウント名/リポジトリ名
- ブランチ名
- ファイルパス
を取得してURLを構築し、open
コマンドに渡します。
情報の取得
アカウント名/リポジトリ名
$ git remote get-url origin | choose -f @ 1 | choose -f '\.git' 0 | sd ':' '/'
前回と同じようにワンライナーでリポジトリ名を取り出します。
ブランチ名
$ git branch --show-current
git-branchには--show-current
というズバリなオプションがあるので、それを使います。
分岐
引数の有無でリポジトリのトップページを開くか、ファイルを開くか分岐させます。
関数に与えられた引数は$argv
に格納されるため、$argv
に値が入っているかどうかで処理を分岐させます。
$argv
に中身が入っているか調べるため、testの-z
オプションを指定します。
-z
は渡された文字列の長さが0ならtrueを返します。
if test -z $argv
# リポジトリのトップページを開く
else
# 引数に渡されたファイルを開く
end
fish変数
fishで変数定義するには set
コマンドを使います。
-f
オプションを指定すると、関数内だけで有効な変数を定義できるため他の関数を汚染しません。
分岐してもGitHubリポジトリやブランチ情報は共通なので、変数に格納しておきます。
set -f repository (git remote get-url origin | choose -f @ 1 | choose -f '\.git' 0 | sd ':' '/')
set -f branch (git branch --show-current)
書いてみる
fishで既存の関数を編集する場合は、funced
で編集します。
funced
を終了すると、自動的に編集結果がfishに反映されます。
$ funced git-open
function git-open --description 'open website current git repository'
set -f repository (git remote get-url origin | choose -f @ 1 | choose -f '\.git' 0 | sd ':' '/')
set -f branch (git branch --show-current)
if test -z $argv
open https://$repository/tree/$branch
else
open https://$repository/blob/$branch/$argv
end
end
使ってみる
$ git branch --show-current
develop
$ git-open README.md # developブランチのREADME.mdのページが表示される
Discussion