🐟
fish functionで実装したgit-openをhttps://に対応させる
以前、fishでgit-open関数を実装しました。
この実装だと git@
で始まるパターンにしか対応できていませんでした。
最近ghコマンドでリポジトリをクローンすることが増えてきたため、https://
から始まるURLでも動くように改良します。
TL;DR
~/.config/fish/functions/git-open.fish
function git-open --description 'open website current git repository'
# target
# - git@github.com:xxx/xxx.git
# - https://github.com/xxx/xxx.git
set -f repository (git remote get-url origin | choose -f '\.git' 0 | sd 'github.com:' 'github.com/' | sd 'git@' 'https://')
set -f branch (git branch --show-current)
if test -z $argv
open $repository/tree/$branch
else
open $repository/blob/$branch/$argv
end
end
改良編
なぜ動かなかったのか
改良前のコード
~/.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
改良前は、
-
git@
より後を取り出す - 末尾の
.git
を取り除く -
github.com:
をgithub.com/
に置き換える
というロジックでした。
このロジックではhttps://
だった場合、
git@
より後を取り出す
が空文字を返すため2番目3番目のコマンドが意図した通りに動いていませんでした。
動くようにする
改良後は次のようなロジックにしました。
- 末尾の
.git
を取り除く -
github.com:
をgithub.com/
に置き換える -
git@
をhttps://
に置き換える
URLから特定の文字列で取り出す処理は取り出せなかった時に空文字になってしまい、空文字が返って来た時のロジックを実装する必要があり手間でした。
そこで取り出すのではなく置換処理に変えることで置換できなかった場合でも空文字が帰らないようにしました。
それに合わせて、open
コマンドに渡す文字列も変更しています。
Discussion