@@ -73,54 +73,82 @@ func runAbortCommand(_ *cobra.Command, args []string) error {
7373
7474// normalizeAbortOperation はユーザー入力をサポートする操作名に変換します
7575func normalizeAbortOperation (op string ) (string , error ) {
76+ // 文字列の正規化処理
77+ // - `strings.TrimSpace` で前後の空白を除去
78+ // - `strings.ToLower` で大文字小文字を統一
79+ // - `strings.ReplaceAll` でアンダースコアをハイフンに置換
80+ // これにより、ユーザー入力のバリエーション(例: " ReBase", "cherrypick")を
81+ // 受け付けやすくしています。
7682 normalized := strings .ToLower (strings .TrimSpace (op ))
83+ // 入力の区切り文字を統一するため、アンダースコアをハイフンに置換します。
84+ // 例: "cherry_pick" -> "cherry-pick" として扱うことで、
85+ // ユーザーがアンダースコア/ハイフンどちらを使っても同一操作として扱えるようにします。
7786 normalized = strings .ReplaceAll (normalized , "_" , "-" )
7887
88+ // switch 文で受け付ける操作名を決定します。
89+ // - 複数の case を列挙することで同義の入力を一つの正規形にまとめています。
90+ // - 成功時は正規化された操作名(例: "rebase")を返し、エラー時は説明付きで返します。
7991 switch normalized {
8092 case "merge" :
8193 return "merge" , nil
8294 case "rebase" :
8395 return "rebase" , nil
8496 case "cherry" , "cherry-pick" , "cherrypick" :
97+ // "cherry" を許容して "cherry-pick" に統一
8598 return "cherry-pick" , nil
8699 case "revert" :
87100 return "revert" , nil
88101 default :
102+ // サポート外の操作の場合はエラーを返す
89103 return "" , fmt .Errorf ("サポートされていない操作です: %s" , op )
90104 }
91105}
92106
93107// detectAbortOperation は現在のGitディレクトリから進行中の操作を判定します
94108func detectAbortOperation () (string , error ) {
109+ // getGitDir で .git ディレクトリの絶対パスを取得します。
110+ // エラーがあれば検出不能としてそのまま返します。
95111 gitDir , err := getGitDir ()
96112 if err != nil {
97113 return "" , err
98114 }
99115
116+ // rebase は 2 種類の作業ディレクトリを持つため両方を確認します。
117+ // - rebase-apply: 非対話的/メールベースの rebase で使われる場合がある
118+ // - rebase-merge: 対話的 rebase 等で使われる場合がある
100119 rebaseDirs := []string {"rebase-apply" , "rebase-merge" }
101120 for _ , dir := range rebaseDirs {
121+ // filepath.Join は複数のパス要素を OS に依存しない形で結合します。
102122 if pathExists (filepath .Join (gitDir , dir )) {
123+ // 見つかった時点で rebase が進行中と判定
103124 return "rebase" , nil
104125 }
105126 }
106127
128+ // CHERRY_PICK_HEAD が存在すればチェリーピック中
107129 if pathExists (filepath .Join (gitDir , "CHERRY_PICK_HEAD" )) {
108130 return "cherry-pick" , nil
109131 }
110132
133+ // REVERT_HEAD が存在すればリバート中
111134 if pathExists (filepath .Join (gitDir , "REVERT_HEAD" )) {
112135 return "revert" , nil
113136 }
114137
138+ // MERGE_HEAD が存在すればマージ中
115139 if pathExists (filepath .Join (gitDir , "MERGE_HEAD" )) {
116140 return "merge" , nil
117141 }
118142
143+ // どの操作も検出できない場合はエラーを返して引数による指定を促す
119144 return "" , fmt .Errorf ("中止できる操作が検出されませんでした。引数で操作を指定してください" )
120145}
121146
122147// abortOperation は指定された操作を実際に中止します
123148func abortOperation (operation string ) error {
149+ // 実際の Git コマンドを実行する箇所。
150+ // gitcmd.RunWithIO は呼び出し元の標準入出力に接続してコマンドを実行するため、
151+ // ユーザー対話やエラー出力がそのまま端末に表示されます。
124152 switch operation {
125153 case "merge" :
126154 return gitcmd .RunWithIO ("merge" , "--abort" )
@@ -131,12 +159,15 @@ func abortOperation(operation string) error {
131159 case "revert" :
132160 return gitcmd .RunWithIO ("revert" , "--abort" )
133161 default :
162+ // 想定外の操作名が来た場合は明示的にエラーを返す
134163 return fmt .Errorf ("未対応の操作です: %s" , operation )
135164 }
136165}
137166
138167// abortOperationLabel は日本語の表示名を返します
139168func abortOperationLabel (operation string ) string {
169+ // 表示用に日本語ラベルを返すヘルパー関数
170+ // switch 文で対応する日本語を返し、未対応の文字列はそのまま返します。
140171 switch operation {
141172 case "merge" :
142173 return "マージ"
@@ -153,29 +184,45 @@ func abortOperationLabel(operation string) string {
153184
154185// getGitDir は現在のリポジトリの .git ディレクトリへの絶対パスを返します
155186func getGitDir () (string , error ) {
187+ // git rev-parse --git-dir はリポジトリの .git ディレクトリのパスを返します。
188+ // - 絶対パスが返る場合と相対パスが返る場合がある(サブモジュール等)ため、
189+ // 相対パスだった場合はカレントディレクトリと結合して絶対パスに直します。
156190 output , err := gitcmd .Run ("rev-parse" , "--git-dir" )
157191 if err != nil {
158192 return "" , fmt .Errorf ("Gitディレクトリの取得に失敗しました: %w" , err )
159193 }
160194
195+ // gitcmd.Run の返す値は出力(末尾に改行が含まれることがある)なので
196+ // strings.TrimSpace で余分な空白や改行を削除します。
161197 dir := strings .TrimSpace (string (output ))
198+
199+ // filepath.IsAbs で絶対パスかどうか判定します。
200+ // - 絶対パスならそのまま返す
162201 if filepath .IsAbs (dir ) {
163202 return dir , nil
164203 }
165204
205+ // 相対パスの場合は現在の作業ディレクトリを取得して結合します。
206+ // - os.Getwd は現在のカレントワーキングディレクトリの絶対パスを返します。
166207 cwd , err := os .Getwd ()
167208 if err != nil {
168209 return "" , fmt .Errorf ("カレントディレクトリの取得に失敗しました: %w" , err )
169210 }
170211
212+ // filepath.Join で OS に依存しない形でパス結合
171213 return filepath .Join (cwd , dir ), nil
172214}
173215
174216// pathExists はファイルまたはディレクトリの存在を確認します
175217func pathExists (path string ) bool {
218+ // 空文字列は存在しないとみなす
176219 if path == "" {
177220 return false
178221 }
222+
223+ // os.Stat はファイル情報を返し、存在しない場合はエラーを返す。
224+ // - 存在する場合: err == nil
225+ // - 存在しない場合: err != nil(詳細を判定するには os.IsNotExist(err) を利用可能)
179226 _ , err := os .Stat (path )
180227 return err == nil
181228}
0 commit comments