🐟

fish functionで実装したgit-openをhttps://に対応させる

2023/07/20に公開

https://zenn.dev/ito_shigeru/articles/cad7180c6ee7bd

以前、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

改良前は、

  1. git@より後を取り出す
  2. 末尾の .git を取り除く
  3. github.com:github.com/に置き換える

というロジックでした。

このロジックではhttps://だった場合、

  1. git@より後を取り出す

が空文字を返すため2番目3番目のコマンドが意図した通りに動いていませんでした。

動くようにする

改良後は次のようなロジックにしました。

  1. 末尾の .git を取り除く
  2. github.com:github.com/に置き換える
  3. git@https://に置き換える

URLから特定の文字列で取り出す処理は取り出せなかった時に空文字になってしまい、空文字が返って来た時のロジックを実装する必要があり手間でした。
そこで取り出すのではなく置換処理に変えることで置換できなかった場合でも空文字が帰らないようにしました。

それに合わせて、openコマンドに渡す文字列も変更しています。

Discussion