# バッチ設計書 15-clean-git-blame-ignore-revs-file

## 概要

本ドキュメントは、Prettierプロジェクトにおける `clean-git-blame-ignore-revs-file.js` バッチの設計仕様を定義します。このバッチは、`.git-blame-ignore-revs`ファイルから不要なリビジョンを削除してクリーンアップするスクリプトです。

### 本バッチの処理概要

このバッチは、gitのblame表示から除外するリビジョンを管理する`.git-blame-ignore-revs`ファイルをメンテナンスします。実際のファイル変更を伴わないリビジョン（package.jsonやyarn.lockのみの変更）を特定し、ファイルから削除します。

**業務上の目的・背景**：`.git-blame-ignore-revs`ファイルは、コードフォーマット変更などの「意味のない」コミットをgit blameから除外するために使用されます。しかし、package.jsonやyarn.lockのみを変更したコミットは除外対象として不適切な場合があります。このスクリプトは、そのような不要なリビジョンを自動的に検出して削除することで、ファイルの品質を維持します。

**バッチの実行タイミング**：`.git-blame-ignore-revs`ファイルのメンテナンス時、または定期的なリポジトリクリーンアップ時に手動で実行します。

**主要な処理内容**：
1. `.git-blame-ignore-revs`ファイルを読み込む
2. 各リビジョンについて、`git show`で変更されたファイル一覧を取得
3. 変更ファイルがpackage.jsonとyarn.lockのみの場合、削除対象としてマーク
4. 削除対象のリビジョンを除外してファイルを更新

**前後の処理との関連**：このバッチは単独で実行されます。git blameの表示に影響を与えますが、他のバッチとの直接的な依存関係はありません。

**影響範囲**：`.git-blame-ignore-revs`ファイルが更新されます。git blameコマンドの出力に影響を与えます。

## バッチ種別

クリーンアップ / メンテナンス

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時（メンテナンス時） |
| 実行時刻 | N/A |
| 実行曜日 | N/A |
| 実行日 | N/A |
| トリガー | 手動実行 |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| gitリポジトリ | 実行ディレクトリがgitリポジトリ内であること |
| Node.js環境 | Node.js実行環境が利用可能であること |
| nano-spawn | 依存パッケージがインストール済みであること |
| .git-blame-ignore-revs | ファイルが存在すること |

### 実行可否判定

`.git-blame-ignore-revs`ファイルが存在する場合に実行可能です。

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| なし | - | - | - | コマンドライン引数は受け取りません |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| .git-blame-ignore-revs | テキスト | リビジョンハッシュのリスト（コメント行含む） |
| gitリポジトリ | git | 各リビジョンの変更ファイル情報 |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| .git-blame-ignore-revs | テキスト | クリーンアップされたリビジョンリスト |

### 出力ファイル仕様

| 項目 | 内容 |
|-----|------|
| ファイル名 | .git-blame-ignore-revs |
| 出力先 | プロジェクトルート |
| 文字コード | UTF-8 |
| 形式 | 行区切りのリビジョンハッシュ |

## 処理フロー

### 処理シーケンス

```
1. ファイル読み込み
   └─ .git-blame-ignore-revsを読み込む
   └─ 行単位で分割

2. 各行の処理
   └─ 空行とコメント行（#で始まる行）はスキップ
   └─ リビジョンハッシュとして処理

3. 変更ファイルの確認
   └─ git show --name-only --pretty= <rev>を実行
   └─ 変更されたファイル一覧を取得

4. 削除判定
   └─ 変更ファイルがすべてIGNORED_FILES（package.json, yarn.lock）に含まれる場合
   └─ 削除対象としてマーク

5. ファイル更新
   └─ 削除対象のリビジョンがある場合のみ
   └─ 削除対象を除外した内容でファイルを上書き
```

### フローチャート

```mermaid
flowchart TD
    A[バッチ開始] --> B[.git-blame-ignore-revs読み込み]
    B --> C[行単位で分割]
    C --> D[各行をループ]
    D --> E{空行 or コメント?}
    E -->|はい| F[スキップ]
    E -->|いいえ| G[git showで変更ファイル取得]
    G --> H{変更がpackage.json/yarn.lockのみ?}
    H -->|はい| I[削除対象に追加]
    H -->|いいえ| J[保持]
    F --> K{次の行?}
    I --> K
    J --> K
    K -->|あり| D
    K -->|なし| L{削除対象あり?}
    L -->|あり| M[ファイル更新]
    L -->|なし| N[変更なし]
    M --> O[バッチ終了]
    N --> O
```

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

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

データベース操作はありません。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | ファイル読み込みエラー | .git-blame-ignore-revsが存在しない | ファイルを作成 |
| - | git実行エラー | リビジョンがリポジトリに存在しない | 該当リビジョンを手動で削除 |

### リトライ仕様

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

### 障害時対応

1. ファイルが存在しない場合は作成するか、スクリプトの実行をスキップ
2. 無効なリビジョンがある場合は手動でファイルを編集

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

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | ファイル全体 |
| コミットタイミング | 全処理完了後 |
| ロールバック条件 | なし |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 数十〜数百リビジョン |
| 目標処理時間 | 数秒〜数十秒 |
| メモリ使用量上限 | 制限なし |

## 排他制御

同時実行の制限はありませんが、同時に実行すると競合する可能性があります。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| なし | - | ログ出力は実装されていません |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| なし | - | - |

## 備考

- shebang (`#!/usr/bin/env node`) により直接実行可能です
- IGNORED_FILESは現在 `package.json` と `yarn.lock` が設定されています
- コメント行（#で始まる行）は保持されます
- nano-spawnパッケージを使用してgitコマンドを非同期実行しています
- ES Modules形式で実装されています
- 削除対象がない場合、ファイルは更新されません
