Skip to content

bin/bump-version --tag の git リポ外エラーハンドリング改善(controlled die 経由化) #50

@ikeisuke

Description

@ikeisuke

背景

v0.3.0 サイクルの PR #26 codex review (P2) で検出された bin/bump-version のエラーハンドリング改善候補。

現状の問題

bin/bump-version --tag を git リポジトリ外(export された tarball や .git を含まないコピー先)で実行すると、以下の git 呼び出しがコマンド置換内で失敗する:

  • assert_no_existing_tag()git tag --list "v${_norm}" (bin/bump-version:170)
  • assert_clean_worktree()git status --porcelain (bin/bump-version:175)

set -e が有効なため、コマンド置換が非ゼロ終了した時点でスクリプト全体が即座にabortし、制御された die(...) を経由せず生の fatal: not a git repository エラーで異常終了する。documented --tag モードが brittle になり、release-packaging(tarball 展開環境でリリース準備など)のシナリオでエラー報告経路が不十分。

推奨対応

各 git 呼び出しを if ガード + 明示的な終了判定に変更し、git リポ外検出時に die "--tag requires a git repository (current directory is not a git worktree)" のような制御されたエラーを返す。

実装例:

assert_clean_worktree() {
  if ! _status=$(git status --porcelain 2>/dev/null); then
    die "--tag requires a git repository"
  fi
  [ -z "$_status" ] || die "working tree has uncommitted changes; commit or stash before --tag"
}

または、_ARG_TAG -eq 1 時の先頭で git rev-parse --git-dir >/dev/null 2>&1 || die "..." を実行してから各アサーションを進める方式。

想定影響範囲

  • bin/bump-versionassert_no_existing_tag / assert_clean_worktree / 可能なら create_git_tag も同様のガードを追加)
  • tests/bump_version.bats(git リポ外で --tag 実行時の制御されたエラーを検証するテストを追加)

参照

  • 分析対象コミット SHA: d370cb487ee6e36c34f0ab67f9c19fc91a75b8d0(cycle/v0.3.0)
  • PR サイクル v0.3.0 #26 codex review (2026-04-21) の P2 指摘
  • 既存の dry-run 時の git リポ外対応は tests/bump_version.bats L54-L67 で検証済み(dry-run は git 操作なし)、本件は --dry-run 非指定時の挙動

サイクル

v0.3.0 サイクルの Operations Phase レビューで検出された後続対応候補。v0.4.0 以降のサイクルで対応予定。docs/release.md--tag は Construction Phase では非推奨運用が明記されているため、v0.3.0 リリース自体には影響なし。

Metadata

Metadata

Assignees

No one assigned

    Labels

    backlogバックログアイテムcycle:v0.3.0サイクル v0.3.0priority:low優先度: 低status:backlogバックログにある未着手の状態type:refactorリファクタリング

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions