Skip to content

最後に作業ツリーを元のブランチへ戻す - #10

Merged
5ym merged 5 commits into
masterfrom
restore-branch
Oct 3, 2026
Merged

5ym merged 5 commits into
masterfrom
restore-branch

Conversation

@5ym

@5ym 5ym commented Oct 3, 2026

Copy link
Copy Markdown
Owner

マージ後の最初の実行で、このリポジトリのワークフロー (uses: ./) が落ちた。原因は、終わったときに作業ツリーが pdf ブランチのままで、後処理が action.yml を見つけられないこと。

最後に元のブランチへ戻すようにした。利用側でも、この Action の後に続く step が元の中身で動くようになる。

🤖 Generated with Claude Code

https://claude.ai/code/session_01USCeESvgLneCai7g8399GM

pdf ブランチのまま終わると、uses: ./ で呼んだときに後処理が action.yml を
見つけられず失敗していた。後に続く step も元の中身で動くようになる。

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01USCeESvgLneCai7g8399GM
@claude

claude Bot commented Oct 3, 2026 •

Copy link
Copy Markdown

Claude finished @5ym's task in 18s —— View job


レビュー結果

作業ツリーを元のブランチへ戻す変更で、意図どおり動くと思います。大きな問題はありません。

確認したこと

  • convert 後は quarkdown-pdf-tmp の modified.txt が pdf ブランチ側では消えます。変換対象が無い場合は modified.txt を rm 済みです。どちらの経路でも未追跡ファイルは残らず、git checkout "$SRC" は衝突しないはずです。
  • SRC は check step の output から渡していて、convert step と同じ参照方法です。既存コードと一貫しています。
  • [ -n "$SRC" ] のガードがあるので、check が失敗して output が空の場合も安全です。

要確認 (任意)

  1. 途中の step が失敗したときは、push step がスキップされるため、作業ツリーは pdf ブランチのままです。今回の不具合のうち「後処理が action.yml を見つけられない」点は、失敗時には残ります。気になるなら push step を if: always() にするか、復元だけ別 step にして if: always() && steps.check.outputs.src != '' を付ける方法があります。ただし always() にすると、失敗時にも push が走ります。push を分けるほうが安全です。
  2. SRC は、git branch "$SRC" "origin/$SRC" で作ったローカルブランチか、既存のローカルブランチです。呼び出し前の状態が detached HEAD (例: actions/checkout で SHA 指定) だった場合、戻る先はそのときのコミットではなく SRC の先頭です。通常の push トリガーでは同じ内容なので、実害は小さいと思います。

テストは無く、この repo には CI 上の自動テストもありません。uses: ./ のワークフロー自体が確認になっています。

@claude

claude Bot commented Oct 3, 2026 •

Copy link
Copy Markdown

Claude finished @5ym's task in 20s —— View job


レビュー結果

大きな問題はありません。今回のコミットで、以前の指摘 (途中失敗時に元のブランチへ戻らない点) も解消されています。

確認したこと

  • src を check step の先頭で output に出すようにしたので、check の途中で失敗しても restore working tree が SRC を参照できます。
  • if: always() && steps.check.outputs.src != '' で、push を always() にせず復元だけを失敗時にも走らせています。失敗時に push が走る心配はありません。
  • convert で quarkdown-pdf-tmp に積んだ modified.txt は、pdf ブランチへ戻ると作業ツリーから消えます。git checkout --force で衝突することはありません。

要確認 (任意、動作に影響は小さい)

  1. --force は、step 実行中の未コミットの変更を捨てます。この Action の step 内ではコミットしていない成果物 (失敗時の途中の pdf など) だけが対象です。ただし、利用側が Action 実行前に作業ツリーへ置いたファイルのうち、追跡済みで pdf ブランチ側と差があるものも戻ります。意図どおりなら問題ありません。
  2. check の git branch "$SRC" "origin/$SRC" が失敗した場合は、ローカルに SRC が無いので restore の git checkout も失敗します。ジョブはすでに失敗しているため実害はありませんが、エラーが 2 つ出ます。気になる場合は git rev-parse --verify -q "refs/heads/$SRC" >/dev/null && git checkout ... のようにガードできます。
  3. 以前の指摘どおり、呼び出し前が detached HEAD (SHA 指定の actions/checkout) だった場合、戻る先は SRC の先頭です。通常の push トリガーでは同じ内容です。

テストはなく、uses: ./ のワークフローが確認を兼ねています。

@claude

claude Bot commented Oct 3, 2026 •

Copy link
Copy Markdown

Claude finished @5ym's task in 20s —— View job


レビュー結果

restore working tree を always() の別 step にし、src を check の先頭で output に出す変更です。前回の指摘 (途中失敗時に戻らない) は解消されています。ブロックする問題はありません。

確認したこと

  • push を always() にせず、復元だけを分けているので、失敗時に push が走ることはありません。
  • git checkout --force は追跡ファイルの変更を捨てて戻ります。convert の途中で失敗して quarkdown-pdf-tmp 上に未コミットの pdf が残っていても、戻れます。
  • src が空のとき (check に到達しなかった場合) は != '' のガードで step がスキップされます。

要確認 (任意)

  1. check 内で SRC のブランチが見つからず exit 1 した場合も、src は出力済みなので restore が実行されます。git checkout "$SRC" は存在しない ref で失敗するため、元のエラーに加えて restore step も赤くなります。ジョブはどのみち失敗しているので実害は小さいです。気になるなら run の末尾に || true を付けるか、ブランチの存在確認を通ったあとに output を出す方法があります。ただし後者にすると、確認前に失敗したケースが戻せなくなります。
  2. 戻り先は「action 呼び出し前のブランチ」ではなく source-branch (省略時は github.ref_name) です。source-branch を呼び出し元と別のブランチにした場合や、SHA 指定の detached HEAD から呼んだ場合は、呼び出し前と違う状態になります。PR 本文の「元のブランチ」と挙動がずれるので、意図どおりか確認してください。通常の push トリガーでは一致します。

テストはありません。この repo には自動テストが無く、uses: ./ のワークフロー自体が確認になっています。

@claude

claude Bot commented Oct 3, 2026 •

Copy link
Copy Markdown

Claude finished @5ym's task in 19s —— View job


レビュー結果

大きな問題はありません。前回の指摘 (戻り先が source-branch になる点、途中失敗時に戻らない点) は、この更新で解消されています。

確認したこと

  • init step の先頭で orig (ブランチ名) と orig-sha を記録し、restore working tree が always() で戻します。check や convert の途中で失敗しても戻れます。
  • 呼び出し前が detached HEAD のときは orig が空になり、--detach "$ORIG_SHA" でそのコミットに戻ります。PR 本文の「元のブランチ」と挙動が一致します。
  • push は always() ではないので、失敗時に push が走ることはありません。
  • src の output は SRC の検証後に出すように移したので、存在しないブランチで exit 1 しても restore 側が SRC を参照して二重に失敗することはありません。convert は従来どおり steps.check.outputs.src を使えます。
  • git branch --show-current || true と git rev-parse HEAD は、GITHUB_OUTPUT に書く値が空やエラーになる経路でも安全です。

要確認 (任意、実害は小さい)

  • git checkout --force は、利用側が Action 実行前に作業ツリーへ置いた追跡済みファイルの未コミット変更も捨てます。Action の前後で作業ツリーを書き換える使い方を想定するなら、README などに注記しておくと安全です。

テストはありません。この repo には自動テストが無く、uses: ./ のワークフローが確認を兼ねています。

@5ym
5ym merged commit 4860b5a into master Oct 3, 2026
@5ym
5ym deleted the restore-branch branch October 3, 2026 12:06
@claude

claude Bot commented Oct 3, 2026 •

Copy link
Copy Markdown

Claude finished @5ym's task in 14s —— View job


レビュー結果

大きな問題はありません。この PR はすでにマージ済みで、action.yml の最終形と docs/spec.md の追記を確認しました。

確認したこと

  • init の最初に orig (ブランチ名) と orig-sha を記録しています。restore working tree は always() で動くので、途中で失敗しても呼び出し前の状態に戻れます。
  • ブランチに乗っていない場合 (detached HEAD) は --detach "$ORIG_SHA" で戻ります。PR 本文の「元のブランチへ戻す」と挙動が合っています。
  • push は always() ではないので、失敗時に push が走ることはありません。
  • src の output は SRC の存在確認のあとに出しています。存在しないブランチで exit 1 しても、convert は status != success でスキップされ、復元は orig を参照するだけです。二重に失敗することはありません。
  • docs/spec.md に、作業ツリーを切り替えて戻すこと、未コミットの変更が捨てられることが書かれています。前回までの指摘も反映されています。

要確認 (任意、実害は小さい)

  • init の git branch --show-current || true は、echo "orig=$(...)" の中で使っています。コマンド置換の失敗は echo の終了コードに隠れるので、|| true は実質不要です。害はありません。

テストはありません。この repo には自動テストが無く、uses: ./ のワークフロー自体が確認を兼ねています。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant