hotoolong's blog

プログラムのことやエンジニアリングに関することを記事にしています。

ghq list の 代替案

イントロ

普段 ghqとfzfを使ってリポジトリの切り替えをしています。
とても便利なのですが、最近、かなりもっさりしてきて遅いので改善を考えてみました。

改善方法

ボトルネックとしてはghq listがとても遅くなっていました。

簡易改善

ghq root 配下のディレクトリがそこまで多くない場合 git だけを対象とした改善方法をよく見かけました。

ghq list --vcs=git

こちらで改善する場合はこれだけで良さそうです。

今回実施した改善

findに置き換えて改善している記事を見たいのですが、私の場合は動作がもっさりしたままでした。
そこでRUST製のfdを使いことにしました。
バージョン管理がすべてgitで管理してるのでgitの特性から.gitファイルを探すことにしました。

ghq list

fd --type d --min-depth 2 --max-depth 4 --hidden --search-path $i '.git$' | sed -e "s/\/.git\$//"

に変更しています。

このコマンドでは .gitディレクトリを探して .git を削り一覧化しています。
--min-depth 2 --max-depth 4 と しているのは
ghq root を複数設定していてローカルに作成してるリポジトリディレクトリ構造を考慮しています。
利用される方はお好みに合わせて変えるのが良いかと思います。

今回の変更のdiffは以下の様になっています.

gd configs/fish/config.fish
diff --git configs/fish/config.fish configs/fish/config.fish
index 9f2755c..5659e0c 100644
--- configs/fish/config.fish
+++ configs/fish/config.fish
@@ -210,15 +210,20 @@ function fzf_select_ghq_repository
     set fzf_query --query "$query"
   end

-  set -l out (ghq list --vcs=git | \
+  set -l out (
+    for i in (ghq root -all)
+      fd --type d --min-depth 2 --max-depth 4 --hidden --search-path $i '.git$' | \
+      sed -e "s/\/.git\$//"
+    end | \
     fzf $fzf_query \
       --prompt='Select Repository >' \
-      --preview="echo {} | cut -d'/' -f 2- | xargs -I{} gh repo view {} ")
+      --preview="echo {} | awk -F'/' '{ print \$(NF-1)\"/\"\$NF}' | \
+    xargs -I{} gh repo view {}"
+  )
   [ $status != 0 ] && commandline -f repaint && return

   if test -n $out
-    set -l dir_path (ghq list --vcs=git --full-path --exact $out)
-    commandline "cd $dir_path"
+    commandline "cd $out"
     commandline -f execute
   end
 end

これでかなり速度が改善されていて快適になりました。
もっといい方法がありそうなので、何かあればコメントないしはDMなどでご連絡いただけると嬉しいです。

参考URL

scrapbox.io

autopp-tech.hatenablog.com