# 機能設計書 34-git_repo_name

## 概要

本ドキュメントは、Oh My Zshの`git_repo_name`関数の機能設計について記載する。この関数は、現在のGitリポジトリのルートディレクトリ名を取得して出力する機能を提供する。

### 本機能の処理概要

**業務上の目的・背景**：複数のプロジェクトを同時に扱う開発者にとって、現在作業中のリポジトリ名をプロンプトで確認できることは作業効率向上に寄与する。特にディレクトリ構造が深い場合や、類似した名前のプロジェクトが複数ある場合に、現在のリポジトリを即座に識別できることは重要である。

**機能の利用シーン**：開発者がターミナルで作業する際、プロンプトに現在のGitリポジトリ名を表示したいケースで利用される。複数のマイクロサービスやモノレポ内のサブプロジェクトを扱う場合に特に有用である。

**主要な処理内容**：
1. `git rev-parse --show-toplevel`コマンドを実行してリポジトリのルートパスを取得
2. 取得したパスからディレクトリ名（末尾コンポーネント）を抽出
3. ディレクトリ名を標準出力に出力

**関連システム・外部連携**：Gitコマンドラインツールと連携し、リポジトリ情報を取得する。

**権限による制御**：特になし。Gitリポジトリへの読み取りアクセス権があれば実行可能。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | ターミナルプロンプト | 結果表示画面 | プロンプト変数（$PROMPT、$RPROMPT等）に組み込んで使用 |

## 機能種別

データ取得・出力処理

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| なし | - | - | この関数は引数を受け取らない | - |

### 入力データソース

- **Gitリポジトリ**: カレントディレクトリまたはその親ディレクトリにある`.git`ディレクトリ

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| リポジトリ名 | string | リポジトリルートディレクトリの名前（パスの末尾コンポーネント） |

### 出力先

標準出力

## 処理フロー

### 処理シーケンス

```
1. git rev-parse --show-toplevelを実行
   └─ __git_prompt_git関数を使用してGIT_OPTIONAL_LOCKS=0環境変数付きで実行
2. 結果の判定
   └─ コマンド成功かつパスが空でない場合のみ次のステップへ
3. パスからディレクトリ名を抽出
   └─ ZSHの:t修飾子を使用してパスの末尾コンポーネントを取得
4. ディレクトリ名を出力
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B[git rev-parse --show-toplevel実行]
    B --> C{コマンド成功?}
    C -->|Yes| D{パスが空でない?}
    C -->|No| F[終了]
    D -->|Yes| E[パスの末尾をrepo_pathに格納]
    D -->|No| F
    E --> G[ディレクトリ名を出力]
    G --> F
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-34-1 | Gitリポジトリ必須 | Gitリポジトリ外で実行した場合は何も出力しない | 常時 |
| BR-34-2 | ルートディレクトリ名のみ | フルパスではなくディレクトリ名のみを返す | 常時 |
| BR-34-3 | サブディレクトリ対応 | サブディレクトリからでもリポジトリルートの名前を返す | 常時 |

### 計算ロジック

ZSHの変数展開修飾子`:t`（tail）を使用してパスの最後のコンポーネントを抽出する。

```zsh
${repo_path:t}
```

## データベース操作仕様

### 操作別データベース影響一覧

該当なし（データベースを使用しない）

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | 暗黙のエラー | Gitリポジトリが存在しない | 何も出力しない（正常終了） |
| - | 暗黙のエラー | パスが取得できない | 何も出力しない（正常終了） |

### リトライ仕様

リトライは実装されていない

## トランザクション仕様

該当なし

## パフォーマンス要件

プロンプト表示に使用されるため、可能な限り高速に実行される必要がある。`GIT_OPTIONAL_LOCKS=0`環境変数を設定することで、gitコマンドがロックを取得しないようにしている。

## セキュリティ考慮事項

- `__git_prompt_git`ラッパー関数を使用して`GIT_OPTIONAL_LOCKS=0`を設定
- 標準エラー出力は`/dev/null`にリダイレクトしてエラーメッセージを非表示

## 備考

- 使用例: `$(git_repo_name)` をプロンプト変数に埋め込む

---

## コードリーディングガイド

本機能を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

この関数で使用されるローカル変数と、ZSH変数展開修飾子の理解が重要。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | git.zsh | `lib/git.zsh` | ローカル変数`repo_path`の使用方法を確認 |

**読解のコツ**: ZSHの変数展開修飾子`:t`（tail）はパスの最後のコンポーネントを抽出する。これはbasenameコマンドと同等の動作である。

#### Step 2: エントリーポイントを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | git.zsh | `lib/git.zsh` | `git_repo_name`関数の定義（362-367行目） |

**主要処理フロー**:
1. **360-361行目**: 関数コメント（目的と使用例）
2. **362行目**: 関数定義開始
3. **363行目**: ローカル変数`repo_path`の宣言
4. **364行目**: git rev-parse --show-toplevelでルートパスを取得し、空でない場合に処理継続
5. **365行目**: `:t`修飾子でディレクトリ名を出力
6. **366-367行目**: if文終了と関数定義終了

#### Step 3: ヘルパー関数を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | git.zsh | `lib/git.zsh` | `__git_prompt_git`関数（10-12行目） |

**主要処理フロー**:
- **11行目**: `GIT_OPTIONAL_LOCKS=0`を設定してgitコマンドを実行

### プログラム呼び出し階層図

```
git_repo_name()
    │
    └─ __git_prompt_git rev-parse --show-toplevel
           │
           └─ command git rev-parse --show-toplevel (GIT_OPTIONAL_LOCKS=0環境変数付き)
```

### データフロー図

```
[入力]               [処理]                         [出力]

なし ───────▶ git rev-parse --show-toplevel ───▶ /full/path/to/repo
                                                      │
                                                      ▼
                                              ${repo_path:t}で末尾を抽出
                                                      │
                                                      ▼
                                                   "repo"
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| git.zsh | `lib/git.zsh` | ソース | git_repo_name関数の定義元 |
| oh-my-zsh.sh | `oh-my-zsh.sh` | ソース | lib/git.zshを読み込むメインスクリプト |
