Files
2025-11-29 18:23:35 +08:00

181 lines
7.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# プルリクエスト作成コマンド
現在のブランチからプルリクエストを作成します。
## 使用方法
```bash
/pr-create [タイトル] [説明]
```
## 処理手順
1. 現在のブランチの変更をpushまだpushされていない場合
2. PRテンプレートを読み込み存在する場合
3. コミット履歴から適切なタイトルと説明を生成
4. ドラフトPRとして作成
5. PR URLを表示
## 実装
### ステップ1: ブランチの状態確認
```bash
# 現在のブランチ名を取得
CURRENT_BRANCH=$(git branch --show-current)
echo "🌿 現在のブランチ: $CURRENT_BRANCH"
# リモートブランチとの同期状態を確認
git fetch origin
# pushが必要かチェック
UNPUSHED_COMMITS=$(git rev-list --count origin/$CURRENT_BRANCH..$CURRENT_BRANCH 2>/dev/null || echo "new")
if [ "$UNPUSHED_COMMITS" = "new" ] || [ "$UNPUSHED_COMMITS" -gt 0 ]; then
echo "📤 リモートブランチにpushします..."
git push -u origin $CURRENT_BRANCH
else
echo "✅ ブランチは既にpushされています"
fi
```
### ステップ2: PRテンプレートの確認
```bash
# PRテンプレートが存在するかチェック
PR_TEMPLATE_FILE=""
if [ -f ".github/PULL_REQUEST_TEMPLATE.md" ]; then
PR_TEMPLATE_FILE=".github/PULL_REQUEST_TEMPLATE.md"
echo "📋 PRテンプレートを発見: $PR_TEMPLATE_FILE"
elif [ -f ".github/pull_request_template.md" ]; then
PR_TEMPLATE_FILE=".github/pull_request_template.md"
echo "📋 PRテンプレートを発見: $PR_TEMPLATE_FILE"
else
echo "📝 PRテンプレートが見つかりません。デフォルトの形式を使用します。"
fi
```
### ステップ3: PRタイトルと説明の生成
```bash
# コミット履歴からタイトルを生成(引数で指定されていない場合)
if [ -z "$1" ]; then
# 最新のコミットメッセージをタイトルに使用
PR_TITLE=$(git log -1 --pretty=format:"%s")
echo "💡 コミットメッセージからタイトルを生成: $PR_TITLE"
else
PR_TITLE="$1"
echo "📝 指定されたタイトル: $PR_TITLE"
fi
# PRの説明を生成
if [ -z "$2" ]; then
echo "📝 PR説明を生成中..."
# mainブランチからの変更履歴を取得
COMMITS=$(git log --oneline master..$CURRENT_BRANCH 2>/dev/null || git log --oneline main..$CURRENT_BRANCH 2>/dev/null || git log --oneline -5)
# 変更されたファイルの一覧を取得
CHANGED_FILES=$(git diff --name-only master..$CURRENT_BRANCH 2>/dev/null || git diff --name-only main..$CURRENT_BRANCH 2>/dev/null || git diff --name-only HEAD~5..HEAD)
if [ -n "$PR_TEMPLATE_FILE" ]; then
echo "📋 PRテンプレートをベースに説明を生成します"
# PRテンプレートをベースとして使用
PR_BODY=$(cat "$PR_TEMPLATE_FILE")
# テンプレート内の特定のプレースホルダーを置換
# 概要セクションに変更内容を自動挿入
if echo "$PR_BODY" | grep -q "## 概要\|## Overview\|## Summary"; then
# 概要セクションの後に変更内容を挿入
PR_BODY=$(echo "$PR_BODY" | sed '/## 概要\|## Overview\|## Summary/a\\n**このPRの主な変更:**')
if [ -n "$COMMITS" ]; then
COMMIT_LIST=""
echo "$COMMITS" | while read commit; do
COMMIT_LIST="$COMMIT_LIST- $commit\n"
done
PR_BODY="$PR_BODY\n$COMMIT_LIST"
fi
fi
# 変更されたファイルの情報を追加(テンプレートに該当セクションがない場合)
if ! echo "$PR_BODY" | grep -q "変更.*ファイル\|Changed.*Files\|Files.*Changed"; then
if [ -n "$CHANGED_FILES" ]; then
PR_BODY="$PR_BODY\n\n## 変更されたファイル\n"
echo "$CHANGED_FILES" | while read file; do
PR_BODY="$PR_BODY- $file\n"
done
fi
fi
else
echo "📝 デフォルト形式でPR説明を生成します"
# PRテンプレートがない場合のデフォルト形式
PR_BODY="## 概要\n\nこの変更の目的と概要を記述してください\n\n"
if [ -n "$COMMITS" ]; then
PR_BODY="$PR_BODY## 変更一覧\n"
echo "$COMMITS" | while read commit; do
PR_BODY="$PR_BODY- $commit\n"
done
PR_BODY="$PR_BODY\n"
fi
if [ -n "$CHANGED_FILES" ]; then
PR_BODY="$PR_BODY## 変更されたファイル\n"
echo "$CHANGED_FILES" | while read file; do
PR_BODY="$PR_BODY- $file\n"
done
PR_BODY="$PR_BODY\n"
fi
PR_BODY="$PR_BODY## テスト計画\n- [ ] 手動テスト実行\n- [ ] 自動テスト確認\n\n## チェックリスト\n- [ ] コードレビュー準備完了\n- [ ] ドキュメント更新(必要に応じて)\n- [ ] 破壊的変更の確認"
fi
else
PR_BODY="$2"
echo "📝 指定された説明を使用"
fi
```
### ステップ4: PRの作成
```bash
# ドラフトPRとして作成
echo "🚀 ドラフトPRを作成中..."
# PRを作成HEREDOCを使用して適切にフォーマット
# bodyにHTMLコメントが含まれる場合の対応
PR_BODY_FILE=$(mktemp)
echo -e "$PR_BODY" > "$PR_BODY_FILE"
gh pr create --draft --title "$PR_TITLE" --body-file "$PR_BODY_FILE"
rm -f "$PR_BODY_FILE"
if [ $? -eq 0 ]; then
echo "✅ ドラフトPRが正常に作成されました"
# PR URLを取得して表示
PR_URL=$(gh pr view --json url -q .url)
echo "🔗 PR URL: $PR_URL"
echo ""
echo "📋 次のステップ:"
echo "1. PRの内容を確認・編集"
echo "2. レビュアーを追加"
echo "3. 準備ができたらドラフト状態を解除"
echo "4. 必要に応じてラベルやマイルストーンを設定"
else
echo "❌ PR作成に失敗しました"
echo "💡 トラブルシューティング:"
echo "- GitHub CLIの認証状態を確認: gh auth status"
echo "- リポジトリの権限を確認"
echo "- ブランチが正しくpushされているか確認"
fi
```
## 重要なルール
- **必ずドラフト状態で作成**: コードレビューの準備ができるまでドラフト状態を維持
- **PRテンプレートをベースに使用**: `.github/PULL_REQUEST_TEMPLATE.md` が存在する場合は、その構造を基本として使用し、変更内容を自動で挿入
- **適切なpush**: `git push -u origin <branch_name>` のように `--set-upstream` を指定
- **意味のあるタイトル**: コミットメッセージや機能の概要を反映
## PRテンプレート活用の詳細
- **テンプレートがある場合**: テンプレートの構造を維持し、概要セクションに変更内容を自動挿入
- **テンプレートがない場合**: デフォルトの構造(概要、変更一覧、テスト計画、チェックリスト)を使用
- **多言語対応**: 英語・日本語の一般的なセクション名に対応Overview/概要、Summary/概要、Changed Files/変更されたファイル)
## 注意事項
- PRテンプレートの既存構造を尊重し、必要な項目は自動補完します
- コミットメッセージは意味のある内容にしてください
- 破壊的変更がある場合は説明に明記してください
- レビュアーの追加は手動で行ってください