🐟

fish functionで実装したgit-openを改良する

2023/02/01に公開

https://zenn.dev/ito_shigeru/articles/884085795d9fd2

以前、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を返します。
https://fishshell.com/docs/current/cmds/test.html

if test -z $argv
  # リポジトリのトップページを開く
else
  # 引数に渡されたファイルを開く
end

fish変数

fishで変数定義するには set コマンドを使います。
https://fishshell.com/docs/current/cmds/set.html

-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に反映されます。
https://fishshell.com/docs/current/cmds/funced.html

$ 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