# バッチ設計書 3-upgrade.sh

## 概要

本ドキュメントは、Oh My Zshを最新バージョンにアップグレードするシェルスクリプト`upgrade.sh`のバッチ設計書である。このスクリプトはGitリポジトリからpullを実行し、変更ログを表示する。

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

このバッチはOh My Zshフレームワークの更新処理を実行し、GitHubリポジトリから最新のコードを取得する。更新完了後に変更ログを表示し、ユーザーに更新内容を通知する。

**業務上の目的・背景**：Oh My Zshは継続的に開発されており、新機能の追加、バグ修正、セキュリティパッチが定期的にリリースされる。このスクリプトは、ユーザーが最新の機能とセキュリティ修正を簡単に取得できるようにし、フレームワークの保守性を向上させる。

**バッチの実行タイミング**：ユーザーによる手動実行（`omz update`コマンド）、または`check_for_upgrade.sh`（No.4）からの自動呼び出し。

**主要な処理内容**：
1. Zsh以外のシェルからの実行を防止
2. $ZSH変数の設定確認
3. 冗長性モード（verbose_mode）と対話モード（interactive）の解析
4. カラー出力の設定
5. リモートURLの更新（古いrobbyrussell URLの移行）
6. Git設定の最適化（line endings、fsckエラー無視、autostash）
7. 現在のブランチとコミットの保存
8. git pull --rebaseによる更新実行
9. 更新結果の判定（既に最新/更新あり/エラー）
10. 変更ログの表示（interactiveモード時）
11. Git設定の復元
12. 元のブランチへのチェックアウト

**前後の処理との関連**：`check_for_upgrade.sh`（No.4）から呼び出される。更新後は`changelog.sh`（No.5）を使用して変更ログを表示できる。

**影響範囲**：Oh My Zshリポジトリ（$ZSH）、Git設定（一時的な変更）

## バッチ種別

アップグレード処理 / バージョン管理

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時/自動（check_for_upgradeから呼び出し） |
| 実行時刻 | 任意 |
| 実行曜日 | 該当なし |
| 実行日 | 該当なし |
| トリガー | 手動実行（omz update）または自動呼び出し |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| Zshで実行 | スクリプトはZshシェルで実行される必要がある |
| Oh My Zshインストール済み | $ZSHディレクトリが存在すること |
| Gitインストール済み | gitコマンドが利用可能であること |
| インターネット接続 | GitHubへのアクセスが可能であること |

### 実行可否判定

1. `$ZSH_VERSION`が設定されていない場合、`exec zsh "$0" "$@"`でZshを起動
2. ソースとして読み込まれた場合（`$ZSH_EVAL_CONTEXT`が`*:file`）はエラー
3. `$ZSH`が未設定の場合、スクリプトの親ディレクトリを使用

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| -v | オプション | No | default | 冗長性モード（default/minimal/silent） |
| -i | フラグ | No | false | 対話モード（変更ログを自動表示） |

### Git設定

| 設定項目 | 値 | 説明 |
|---------|-----|------|
| oh-my-zsh.remote | 設定値またはorigin | リモート名 |
| oh-my-zsh.branch | 設定値またはmaster | ブランチ名 |
| oh-my-zsh.lastVersion | 更新前のコミットハッシュ | 変更ログ用に保存 |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| $ZSH | ディレクトリ | Oh My Zshリポジトリ |
| GitHubリポジトリ | Git | ohmyzsh/ohmyzsh（または設定されたリモート） |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| 標準出力 | テキスト | 進捗メッセージ、成功メッセージ、変更ログ |
| Git設定 | git config | oh-my-zsh.lastVersion（更新前コミット） |

### 出力ファイル仕様

該当なし（Git操作のみ）

## 処理フロー

### 処理シーケンス

```
1. シェル検証
   ├─ $ZSH_VERSIONの確認
   └─ $ZSH_EVAL_CONTEXTの確認（ソース実行防止）

2. 変数初期化
   ├─ $ZSHの設定
   └─ verbose_mode、interactiveのデフォルト設定

3. オプション解析
   └─ -v（verbose）と-i（interactive）の処理

4. カラー設定
   ├─ TTY判定
   ├─ TrueColorサポート検出
   └─ カラー変数の設定

5. リモートURL更新
   ├─ 古いrobbyrussell URLの検出
   └─ ohmyzsh URLへの更新

6. Git設定
   ├─ core.eol = lf
   ├─ core.autocrlf = false
   ├─ fsck.zeroPaddedFilemode = ignore
   └─ rebase.autoStash = true（元の値を保存）

7. ブランチ情報取得
   ├─ remote取得
   ├─ branch取得
   ├─ last_head（現在のHEAD）保存
   └─ last_commit（更新前コミット）保存

8. 更新ブランチへチェックアウト

9. git pull --rebase実行
   ├─ 成功時: 更新判定
   │   ├─ HEAD == last_commit: 既に最新
   │   └─ HEAD != last_commit: 更新あり
   └─ 失敗時: エラーメッセージ表示

10. 変更ログ表示（interactiveモード、更新あり時）

11. 元のブランチへチェックアウト

12. Git設定復元
    └─ rebase.autoStashを元の値に戻す
```

### フローチャート

```mermaid
flowchart TD
    A[バッチ開始] --> B{Zshで実行?}
    B -->|No| C[exec zsh]
    B -->|Yes| D{ソース実行?}
    D -->|Yes| E[エラー終了]
    D -->|No| F[変数初期化]
    F --> G[オプション解析]
    G --> H[カラー設定]
    H --> I[リモートURL更新]
    I --> J[Git設定]
    J --> K[ブランチ情報取得]
    K --> L[更新ブランチへチェックアウト]
    L --> M[git pull --rebase]
    M --> N{pull成功?}
    N -->|No| O[エラーメッセージ]
    N -->|Yes| P{HEAD更新?}
    P -->|No| Q[既に最新メッセージ]
    P -->|Yes| R[更新完了メッセージ]
    R --> S{interactive && verbose=default?}
    S -->|Yes| T[変更ログ表示]
    S -->|No| U[元のブランチへチェックアウト]
    Q --> U
    O --> U
    T --> U
    U --> V[Git設定復元]
    V --> W[終了]
```

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

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

該当なし（本スクリプトはデータベース操作を行わない）

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| 1 | 実行環境エラー | ソースとして実行された | スクリプトを直接実行 |
| 1 | Git操作エラー | git checkoutまたはgit pullが失敗 | ネットワーク確認、手動でgit pullを試行 |
| - | 冗長性エラー | 無効な-vオプション値 | 警告メッセージ表示、処理は継続 |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | 0（自動リトライなし） |
| リトライ間隔 | 該当なし |
| リトライ対象エラー | 該当なし |

### 障害時対応

1. pull失敗時：「There was an error updating. Try again later?」メッセージを表示
2. 手動リカバリ：$ZSHディレクトリでgit fetch && git rebaseを実行

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

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | Git操作全体（rebase.autoStashで変更保護） |
| コミットタイミング | git pullの完了時 |
| ロールバック条件 | 元のブランチへのチェックアウトで部分的復元 |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 1回の実行 |
| 目標処理時間 | ネットワーク状況に依存（通常10秒〜1分） |
| メモリ使用量上限 | 通常のGit操作範囲 |

## 排他制御

- スクリプト実行中は他のGit操作を避ける
- `rebase.autoStash = true`により、未コミットの変更は自動的にstashされる

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 進捗ログ | 更新開始時 | "Updating Oh My Zsh" |
| 成功ログ | 更新完了時 | "Hooray! Oh My Zsh has been updated!" |
| 成功ログ | 既に最新時 | "Oh My Zsh is already at the latest version." |
| 情報ログ | 更新後 | "You can see the changelog with `omz changelog`" |
| エラーログ | pull失敗時 | "There was an error updating. Try again later?" |

## 監視・アラート

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

## 備考

- `set +u`でnounsetを無効化し、未定義変数のエラーを回避
- 古いrobbyrussell GitHubアカウントのURLを自動的にohmyzsh組織に移行
- TrueColorサポートとハイパーリンクサポートを検出し、対応ターミナルで拡張表示
- verbose_mode=silentの場合、Powerlevel9kのインスタントプロンプトとの互換性を確保
- 更新後、oh-my-zsh.lastVersionに更新前のコミットを保存（変更ログ表示用）
