# 通知設計書 10-spacevim#github#CommitRef（エラー）

## 概要

本ドキュメントは、space-vimにおけるGitHub コミットURL生成時のエラー通知（`spacevim#github#CommitRef` 関数内）の通知仕様を定義するものである。

### 本通知の処理概要

`spacevim#github#CommitRef` 関数は、特定の条件でエラーが発生した場合に `echoerr` コマンドを使用してエラーメッセージを表示する。これは成功時の通知（No.9）とは別の通知パスであり、ユーザーに問題の原因を伝えるために使用される。

**業務上の目的・背景**：GitHub URLの生成には複数の前提条件がある。ファイルがGitリポジトリ内にあること、origin remoteが設定されていることなどである。これらの条件が満たされない場合、単に処理を中断するだけでなく、ユーザーに明確なエラーメッセージを表示して問題の原因を伝える必要がある。これにより、ユーザーは適切な対処（Gitリポジトリの初期化、remoteの追加など）を行うことができる。

**通知の送信タイミング**：以下の2つのエラー条件のいずれかが検出された際に通知が送信される。
1. ファイルの絶対パス（abs_path）がプロジェクトルート（root_dir）で始まらない場合
2. origin remoteが設定されていない場合

**通知の受信者**：Vimエディタを操作しているユーザー本人がメッセージの受信者となる。メッセージはVimのコマンドライン領域にエラーとして表示される。

**通知内容の概要**：エラーの原因を示すメッセージが `echoerr` コマンドにより赤色のエラー表示で出力される。

**期待されるアクション**：ユーザーはエラーメッセージを確認し、問題を解決する。例えば、正しいディレクトリでファイルを開き直す、git remote addでorigin remoteを追加するなどの対処を行う。

## 通知種別

アプリ内通知（Vimコマンドラインエラー表示）

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 同期 |
| 優先度 | 高（エラー） |
| リトライ | 無し |

### 送信先決定ロジック

現在Vimエディタを操作しているユーザーのコマンドライン領域にエラーとして直接表示される。特別な送信先決定ロジックは存在しない。

## 通知テンプレート

### アプリ内通知の場合

| 項目 | 内容 |
|-----|------|
| 表示位置 | Vimコマンドライン領域 |
| ハイライト | ErrorMsg（echoerr標準） |
| プレフィックス | なし |
| 形式 | テキスト |

### 本文テンプレート

**パス不一致エラー**:
```
abs_path:{abs_path}, root_dir:{root_dir} mismatches.
```

**origin remote不在エラー**:
```
On origin remote info
```

### 添付ファイル

該当なし

## テンプレート変数

| 変数名 | 説明 | データ取得元 | 必須 |
|--------|------|-------------|-----|
| abs_path | ファイルの絶対パス | expand('%:p') | Yes（パス不一致エラー時） |
| root_dir | プロジェクトルートディレクトリ | clap#path#find_project_root() | Yes（パス不一致エラー時） |

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| 条件分岐 | abs_pathがroot_dirで始まらない | パス検証失敗 | ファイルがプロジェクト外にある場合 |
| 条件分岐 | origin remoteが空 | origin検証失敗 | git remote -vにoriginがない場合 |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| すべての検証が成功 | 正常系の通知（No.9）が表示される |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[CommitRef呼び出し] --> B[プロジェクトルート取得]
    B --> C{root_dirが空?}
    C -->|Yes| D[終了（通知なし）]
    C -->|No| E[abs_path取得]
    E --> F{abs_pathがroot_dirで始まる?}
    F -->|No| G[echoerr 'abs_path:..., root_dir:... mismatches.']
    F -->|Yes| H[git remote -v 実行]
    H --> I{origin remoteあり?}
    I -->|No| J[echoerr 'On origin remote info']
    I -->|Yes| K[正常処理続行]
    G --> L[return 終了]
    J --> L
    K --> M[URL生成・成功通知]
```

## データベース参照・更新仕様

### 参照テーブル一覧

該当なし（エラーメッセージ表示のみ）

### 更新テーブル一覧

該当なし（エラーメッセージ表示のみ）

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| パス不一致エラー | abs_pathがroot_dirで始まらない | ユーザーが正しいディレクトリでファイルを開く |
| origin remote不在エラー | origin remoteが設定されていない | ユーザーがgit remote add originを実行 |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | なし |
| リトライ間隔 | なし |
| リトライ対象エラー | なし |

## 配信設定

### レート制限

| 項目 | 内容 |
|-----|------|
| 1分あたり上限 | 制限なし |
| 1日あたり上限 | 制限なし |

### 配信時間帯

制限なし（Vimが起動している間は常に表示可能）

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

- エラーメッセージにはファイルパス情報が含まれる
- ローカル環境での表示のため特別な保護は不要
- 外部への送信は行わない

## 備考

- `echoerr` コマンドはVimの標準的なエラー表示機能で、メッセージは自動的に赤色でハイライトされる
- エラー発生後は `return` で関数を終了し、後続の処理は実行されない
- 「On origin remote info」のメッセージは「No origin remote info」の誤植の可能性がある（コードレビュー時に要確認）

---

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

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

### 推奨読解順序

#### Step 1: エラー条件を理解する

本エラー通知は、正常処理の前提条件が満たされない場合に発生する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | github.vim | `core/autoload/spacevim/github.vim` | 2つのechoerr呼び出し箇所を確認 |

**読解のコツ**: Vim scriptの `echoerr` コマンドは、メッセージを ErrorMsg ハイライトグループで表示し、`:messages` にも記録される。

#### Step 2: パス不一致エラーを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | github.vim | `core/autoload/spacevim/github.vim` | パス検証とエラー処理（11-17行目） |

**主要処理フロー**:
1. **11行目**: `if abs_path =~ '^'.root_dir` - パス検証条件
2. **13行目**: `let relative_path = abs_path[strlen(root_dir):]` - 相対パス計算（成功時）
3. **14行目**: `else` - 検証失敗時の分岐
4. **15行目**: `echoerr 'abs_path:'.abs_path.', root_dir:'.root_dir.' mismatches.'` - エラーメッセージ
5. **16行目**: `return` - 関数終了

#### Step 3: origin remote不在エラーを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | github.vim | `core/autoload/spacevim/github.vim` | origin検証とエラー処理（22-25行目） |

**主要処理フロー**:
1. **22行目**: `if empty(origin)` - origin存在チェック
2. **23行目**: `echoerr 'On origin remote info'` - エラーメッセージ
3. **24行目**: `return` - 関数終了
4. **25行目**: `endif` - 条件分岐終了

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

```
spacevim#github#CommitRef()
    │
    ├─ [パス検証]
    │      │
    │      ├─ abs_path =~ '^'.root_dir
    │      │      │
    │      │      └─ [失敗時]
    │      │             └─ echoerr 'abs_path:..., root_dir:... mismatches.'
    │      │                    └─ return（関数終了）
    │      │
    │      └─ [成功時] 続行
    │
    └─ [origin検証]
           │
           ├─ empty(origin)
           │      │
           │      └─ [空の場合]
           │             └─ echoerr 'On origin remote info'
           │                    └─ return（関数終了）
           │
           └─ [存在する場合] 続行
```

### データフロー図

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

abs_path ────────────▶ パス検証 ────────▶ [失敗] ───▶ echoerr（パス不一致）
root_dir ─────────────────┘                              │
                                                         ▼
                                                    return（終了）

git remote -v ───────▶ origin検証 ──────▶ [失敗] ───▶ echoerr（origin不在）
                                                         │
                                                         ▼
                                                    return（終了）
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| github.vim | `core/autoload/spacevim/github.vim` | ソース | CommitRef関数の実装（エラー処理含む） |
