Lazygitに投げたPRまとめ

この2年ほど、LazygitにちまちまとPull Requestを投げています。 マージされたものもなんだかんだでほどほどの数になったので、それぞれについて振り返ってみます。

ちなみに私は英語が大の苦手であるため、PRに書かれている英語はGoogle翻訳とパッションによって構成されています。

Lazygitとは

Lazygitは Jesse Duffield氏 (@jesseduffield) によって開発されているGo製のTUI Gitクライアントです。

github.com

競合するOSSTigGitUI がありますが、画面レイアウトやデフォルトのキーバインディングがこれらに比べよく手に馴染むことからLazygitを選択しています。

一方で結構バグが多く、ちょっとだめな感じがかわいらしさと愛嬌を感じます。

1. fix a bug related to inserting and deleting wide characters by Ryooooooga · Pull Request #10 · jesseduffield/gocui · GitHub

github.com

Lazygitに対する最初のコントリビューションは、Lazygit本体ではなくGocuiに対するものでした。

Gocui はLazygitが使用しているTUIフレームワークです。

現在Lazygitが使用しているGocui (jesseduffield/gocui) は jroimartin/gocui のフォークです。jesseduffield/gocui は開発の停滞しているフォーク元に対しワイド文字の対応などを加えたものであり、同じく Jesse Duffield氏 によってメンテされています。紆余曲折を経て、中身はフォーク元とはほぼ別物になっています。ちなみにアクティブなブランチはmasterではなく awesome なのでGocuiにPRを投げる場合は注意しましょう。

上記のPRはLazygit上での日本語入力を改善するものです。当時のLazygitは日本語入力時の動作におかしなところがあった (入力の末尾がワイド文字の場合にbackspaceが動作しない、入力位置がおかしくなる、など) ためそれを修正しました。

2. Fix command escaping #1168 by Ryooooooga · Pull Request #1173 · jesseduffield/lazygit · GitHub

github.com

特定のバージョン以降でコミットメッセージに含まれる $` が正しくエスケープされなくなったため、シェルエスケープ関数 (OSCommand#Quote()) とその使用箇所を修正したものです。

Lazygitはコマンドの実行時に内部で str.ToArgv という関数を利用しているのですがその動作が端的に言ってあたまおかしく、また、OSCommand#Quote()の結果がstr.ToArgvで正しく解析できること、Bashスクリプトとして正しくなること、さらにWindows上でも動作することを保証しなければならなかったため、変更の行数の少なさとは裏腹に調査と実装にかなり骨を折りました。

3. Improve command execution with strange file names. by Ryooooooga · Pull Request #1177 · jesseduffield/lazygit · GitHub

github.com

#1173 の実装中に、ファイル名が - で始まるファイルに対する操作が正しく行えないことに気付いたためそれを修正しました。

また、非ASCII文字のファイル名が正しく表示されない問題もついでに直しています。

4. Fix a placeholder for remote name edit box by Ryooooooga · Pull Request #1178 · jesseduffield/lazygit · GitHub

github.com

プレースホルダーの展開に失敗していることに気がついたため、修正しました。

テキストテンプレート中に空白を含むのはGoの text/template 的には合法ですが、これを含むLazygitの多くでは text/template ではなく単に{{.placeholder}}{{placeholder}}という文字列を置換するだけの軽量の関数 (ResolvePlaceholderString) が使用されています。

5. the patch panel would crash if the filename contained an odd number of double quotes by Ryooooooga · Pull Request #1434 · jesseduffield/lazygit · GitHub

6. Fix submodule command escaping #1436 by Ryooooooga · Pull Request #1437 · jesseduffield/lazygit · GitHub

7. Fix stash submodule #1436 by Ryooooooga · Pull Request #1440 · jesseduffield/lazygit · GitHub

8. Fix crash on remove tracked files #1480 by Ryooooooga · Pull Request #1481 · jesseduffield/lazygit · GitHub

9. Improved command execution by Ryooooooga · Pull Request #1501 · jesseduffield/lazygit · GitHub

ひたすらコマンドのQuoteが足りない箇所にQuoteを足していきました。ちなみに #1501 で1箇所エンバグがありました。ごめんなさい。

10. Fix staged renamed file with unstaged in file pane #1408 by Ryooooooga · Pull Request #1438 · jesseduffield/lazygit · GitHub

github.com

-> を名前に含むファイルを正しく扱えないのを修正しました。

11. Fix panic during merge conflict #1375 by Ryooooooga · Pull Request #1446 · jesseduffield/lazygit · GitHub

github.com

異常なコンフリクトマーカー (<<<<<<<, =======, >>>>>>>) を含むファイルで発生するnilアクセスによるクラッシュを修正しました。

12. Make os.editCommand customizable using template by Ryooooooga · Pull Request #1413 · jesseduffield/lazygit · GitHub

github.com

editCommandTemplate という設定項目を追加し、選択されている行をvimなどのエディタで開けるようにしました。本当は openCommand と同様に editCommand の役割を変更するつもりでしたが、後方互換性のために項目を新設することになりました。

13. Fix open command in Windows #1403 by Ryooooooga · Pull Request #1448 · jesseduffield/lazygit · GitHub

github.com

Windows上でファイルやリンクが正しく開けないのを修正しました。

14. Change not to use cat command #1299 by Ryooooooga · Pull Request #1449 · jesseduffield/lazygit · GitHub

github.com

Windows上で一部のコマンドが動作しないのを修正しました。

15. Fix deletion of unmerged branches in languages other than English by Ryooooooga · Pull Request #1463 · jesseduffield/lazygit · GitHub

github.com

一部の動作がGitのエラーメッセージに依存しており、英語以外のロケールで動作しないのを修正しました。

16. Save patch files in TempDir #1318 by Ryooooooga · Pull Request #1494 · jesseduffield/lazygit · GitHub

github.com

行単位で変更をステージングする際にconfigディレクトリ以下に.patchファイルが作成されるのが鬱陶しかったため、$TMPDIR 以下に作成するように変更しました。

17. Fix open link command in Windows #470 by Ryooooooga · Pull Request #1504 · jesseduffield/lazygit · GitHub

github.com

Linux上でファイルを開くためのコード周りに汚い特殊化が必要なのを取り除くための修正です。

18. CI tests on Windows by Ryooooooga · Pull Request #1503 · jesseduffield/lazygit · GitHub

github.com

CIをWindows上で動かすものです。

19. Fix rendering of view titles containing multi-byte char by Ryooooooga · Pull Request #15 · jesseduffield/gocui · GitHub

github.com

RuneWidth(s) を使用すべき箇所で len(s) を使用している非CJK語圏あるあるの修正です。

20. Improve backward compatibility by Ryooooooga · Pull Request #1529 · jesseduffield/lazygit · GitHub

github.com

古いGitでコミット一覧が表示されないのを修正するものです。

これの検証のためにGitのDockerイメージを作りました。

ryooooooga.hateblo.jp

21. Fix multibyte initial characters by Ryooooooga · Pull Request #1540 · jesseduffield/lazygit · GitHub

github.com

コミット一覧に表示されるcommit authorのイニシャルがマルチバイト文字を考慮されていなかったためその修正です。

22. Support `merge.conflictStyle diff3` #940 by Ryooooooga · Pull Request #1447 · jesseduffield/lazygit · GitHub

github.com

マージコンフリクトリソルバーの diff3 形式への対応です。難産でした。

23. Fix permissions issue with temp dir #1318 by Ryooooooga · Pull Request #1852 · jesseduffield/lazygit · GitHub

github.com

#1494 がマルチユーザを考慮していなかったため発生した権限関係の不具合の修正です。

24. Fix an error when pressing enter on the first commit in the commits panel by Ryooooooga · Pull Request #1483 · jesseduffield/lazygit · GitHub

github.com

最初のコミットの詳細が閲覧できないことの修正です。途中、私がJesse氏の指摘を正しく理解できなかったため放置してしまい、マージまでに半年以上かかってしまいました。

25. Fix diff of renamed files by Ryooooooga · Pull Request #1859 · jesseduffield/lazygit · GitHub

github.com

リネームされたファイルのdiffが正しく表示されなかったため、それを修正しました。

26. Support open/edit files in merge conflict panel by Ryooooooga · Pull Request #1857 · jesseduffield/lazygit · GitHub

github.com

マージコンフリクトの位置を外部エディタで開けるようにしました。コンフリクト解消のときにかなり便利です。

27. Fix line wrapping when combining wide characters with eraseInLineFromCursor. by Ryooooooga · Pull Request #18 · jesseduffield/gocui · GitHub

github.com

日本語を含むファイルのdiffを delta で表示した際に表示が崩れるバグの修正です。これも RuneWidth() を正しく使えていないことが原因でした。

28. fix not to trim renamed file names by Ryooooooga · Pull Request #1876 · jesseduffield/lazygit · GitHub

github.com

空白文字を含むファイル名を正しく扱えないのを修正します。気付いたから直しましたが、そのようなファイル名が現実に使用されることはほぼないでしょう。

29. Improve default editCommandTemplate by Ryooooooga · Pull Request #1891 · jesseduffield/lazygit · GitHub

github.com

#1775 の筋の悪さにキレながら投げたPRです。

30. Display Nerdfont icons by Ryooooooga · Pull Request #1894 · jesseduffield/lazygit · GitHub

github.com

Nerd Fontsでファイル等にアイコンを表示する変更です。

https://user-images.githubusercontent.com/10097437/164868948-a6784456-1b33-4c3c-8409-fd7f9b864561.png

Jesse氏にも気に入ってもらえたようで良かったです。

31. Fix a crash that occurred when pressing enter on an empty commit, reflog, or stash panel by Ryooooooga · Pull Request #1914 · jesseduffield/lazygit · GitHub

github.com

[#1483] でエンバグした不具合に気付いたためそれを修正しました。結果的にGoの nil != nil 問題について詳しくなりました。

32. Add Japanese translation by Ryooooooga · Pull Request #1913 · jesseduffield/lazygit · GitHub

github.com

日本語ローカライゼーションの追加です。翻訳の質は良好だと思うのですが、Twitterで検索すると良くない反応が多いです。草。

ちなみに私は責任をとってLazygitを日本語で使用しています。

33. add ability to edit hunk by Ryooooooga · Pull Request #1912 · jesseduffield/lazygit · GitHub

github.com

git add -e のようにエディタからステージングパッチを編集できるようにしました。稀に便利です。

34. Fix the prompt height and appStatus width calculation when using multi byte characters by Ryooooooga · Pull Request #1920 · jesseduffield/lazygit · GitHub

35. fix subtitle collision by Ryooooooga · Pull Request #20 · jesseduffield/gocui · GitHub

日本語ローカライズの過程で気がついたワイド文字の表示に関する不具合の修正です。

36. Fix copying of the commit author to the clipboard by Ryooooooga · Pull Request #1923 · jesseduffield/lazygit · GitHub

github.com

commit authorの名前に | が含まれているとコミッタ名のコピーがうまく機能しなくなるバグの修正です。そんなことが現実にあるのかはわかりません。

37. Accept named colors for authorColors #1879 by Ryooooooga · Pull Request #1910 · jesseduffield/lazygit · GitHub

github.com

設定の gui.authorColors#rrggbb 形式の文字列のみでなく、red, black などの名前を使用できるようにするものです。

38. Improve loading speed of commits and reflog when `log.showSignature=true` by Ryooooooga · Pull Request #1911 · jesseduffield/lazygit · GitHub

github.com

Gitの log.showSignaturetrue であった場合、コミットの読み込みが低速であることに気がついたため、それを改善するものです。

39. WIP: Fix ambiguous refname by Ryooooooga · Pull Request #1944 · jesseduffield/lazygit · GitHub

github.com

ブランチと同名のファイル・ディレクトリが存在しているときにコミットの読み込みに失敗するバグの修正です。

(test/ディレクトリが存在している状態で) testという名前のブランチを作成したときに発覚しました。

タイトルにWIPをつけたまま数日放置していたらそのままマージされて笑いました (実際にはマージ準備はすでに整っており、WIPを外し忘れていただけだったので問題はありませんでしたが)。

40. Fix linter errors by Ryooooooga · Pull Request #1945 · jesseduffield/lazygit · GitHub

github.com

golangci-lintの更新でCIが落ちるようになったため修正しました。

41. add ability to customize time format in commit log by Ryooooooga · Pull Request #1948 · jesseduffield/lazygit · GitHub

github.com

コミット一覧の時刻形式を変更するための設定項目を追加します。

RFC822 (02 Jan 06 15:04 MST) 形式は日本人には読みにくすぎます。

42. Localize panel titles by Ryooooooga · Pull Request #1936 · jesseduffield/lazygit · GitHub

github.com

パネルのタイトルがローカライズされないのを修正します。

43. add missing `keybinding.branches.renameBranch` to Config.md by Ryooooooga · Pull Request #2002 · jesseduffield/lazygit · GitHub

44. docs(Config.md): fix docs on specifying config file by Ryooooooga · Pull Request #2022 · jesseduffield/lazygit · GitHub

軽微なドキュメントの変更です。

45. Change not to run `Generate Sponsors` action on the fork repository by Ryooooooga · Pull Request #2039 · jesseduffield/lazygit · GitHub

github.com

forkリポジトリでCIが落ちるのを修正しました。

46. fix subtitle collision by Ryooooooga · Pull Request #20 · jesseduffield/gocui · GitHub

github.com

ワイド文字のクリック判定がおかしいのを修正しました。

47. Add `notARepository: quit` by Ryooooooga · Pull Request #2098 · jesseduffield/lazygit · GitHub

github.com

Gitリポジトリ外でLazygitを起動した場合に終了するオプションを追加しました。

48. improve integration test portability by Ryooooooga · Pull Request #2124 · jesseduffield/lazygit · GitHub

github.com

インテグレーションテストがgit configの一部の項目の設定値に関わらず動作するように修正しました。

49. fix initial scroll position of edit box by Ryooooooga · Pull Request #2123 · jesseduffield/lazygit · GitHub

50. fix initial origin of editor box by Ryooooooga · Pull Request #2146 · jesseduffield/lazygit · GitHub

51. fix initial origin of commit message panel by Ryooooooga · Pull Request #2221 · jesseduffield/lazygit · GitHub

入力ボックスの初期スクロール位置がおかしいのを修正しました。

52. Ignore stderr when loading git status by Ryooooooga · Pull Request #2081 · jesseduffield/lazygit · GitHub

github.com

git status コマンドが警告を出力する場合に先頭のファイルが表示されないバグを修正しました。

53. Add Ctrl+W keybind to delete word like shell by Ryooooooga · Pull Request #16 · jesseduffield/gocui · GitHub

54. add support for emacs keybindings by Ryooooooga · Pull Request #2183 · jesseduffield/lazygit · GitHub

入力ボックス内で C-W, C-KなどのEmacsキーバインディングが使用できるようにしました。 便利。

55. Fix an issue where long inputs containing wide characters cause blank spaces on the right side. by Ryooooooga · Pull Request #17 · jesseduffield/gocui · GitHub

github.com

ワイド文字を含む文字列で横方向のスクロール位置がおかしくなるのを修正しました。例に漏れずこれも RuneWidth() を使用している箇所でインデックスを使用していました。

56. fix: improve hard tab rendering by Ryooooooga · Pull Request #21 · jesseduffield/gocui · GitHub

github.com

ハードタブが常に4幅で表示されるのを修正しました。

57. Support ANSI reset sequence by Ryooooooga · Pull Request #22 · jesseduffield/gocui · GitHub

github.com

ANSIエスケープシーケンスの解釈が不完全で表示が崩れるのを修正しました。

58. Navigate by word using alt+left/right. by Ryooooooga · Pull Request #19 · jesseduffield/gocui · GitHub

59. navigate by word in the editor by Ryooooooga · Pull Request #2204 · jesseduffield/lazygit · GitHub

入力ボックス内で、alt+←/→ によってワード単位でカーソルを移動できるようにしました。

60. Allow `OSCommand.Quote` to be invoked within a custom command by Ryooooooga · Pull Request #2193 · jesseduffield/lazygit · GitHub

github.com

カスタムコマンドのテンプレート内でシェルエスケープをする quote 関数を使用できるようにしました。

61. fix stash with empty message by Ryooooooga · Pull Request #2218 · jesseduffield/lazygit · GitHub

github.com

Stashメッセージが空のStashが無視されるのを修正しました。

62. add stash icon by Ryooooooga · Pull Request #2219 · jesseduffield/lazygit · GitHub

github.com

StashパネルにNerdfontsのアイコンを表示するようにしました。

63. allow nil in keybindings by Ryooooooga · Pull Request #23 · jesseduffield/gocui · GitHub

64. allow `null` in keybindings by Ryooooooga · Pull Request #2222 · jesseduffield/lazygit · GitHub

キーバインディングを無効化できるようにしました。

65. rename stash by Ryooooooga · Pull Request #2220 · jesseduffield/lazygit · GitHub

github.com

Stashのメッセージを変更するコマンドを追加しました。

66. Ignore OSC sequence by Ryooooooga · Pull Request #24 · jesseduffield/gocui · GitHub

67. bump gocui by Ryooooooga · Pull Request #2276 · jesseduffield/lazygit · GitHub

OSCのエスケープシーケンスを無視して解釈するように変更しました。

68. fix ambiguous branch name by Ryooooooga · Pull Request #2224 · jesseduffield/lazygit · GitHub

github.com

head@ といった特殊な名前をブランチ名として用いても正しく動作するように修正しました。そんなことをする人がいるのかはわかりません。

69. fix goroutine leak by Ryooooooga · Pull Request #25 · jesseduffield/gocui · GitHub

github.com

ゴルーチンリークを修正しました。が、致命的なゴルーチンリークを根本的に解消できているわけではないので性能に対する寄与はありません。

70. fix diff scroll #2309 by Ryooooooga · Pull Request #2326 · jesseduffield/lazygit · GitHub

github.com

diffが全文読み込まれないのを修正しました。

まとめ

日本語・ワイド文字対応や、コマンド実行系の改善を中心にLazygitにコントリビュートしています。

この通り、Lazygitは未だ多くのバグが存在しており、特にWindows周りのissueも多くが放置されているのでコントリビュートのチャンスが豊富です。