# Prepare 功能 - 准备下一个开发版本

## 用途

准备 Combo SDK for Unity 下一个开发版本，执行流程：
1. 检查当前版本是否已是 `-dev`（是则拒绝执行）
2. 计算新版本号（minor + 1，添加 `-dev` 后缀）
3. 调用 `references/version.md` 更新版本号
4. 执行 git 提交（非 main 分支时）
5. 通过 `glab` 创建 Merge Request

**注意**：本功能不生成 CHANGELOG，仅更新版本号。

## 输入

- `TARGET_VERSION`（可选）：用户指定的目标版本号

## 执行步骤

### 步骤零：验证输入和文件

1. **验证版本号格式**（如果用户提供）：
   - 检查用户提供的版本号是否符合 `x.x.x` 格式
   - 如果格式不正确，提示用户：`"错误：版本号格式不正确，请使用 x.x.x 格式（例如：2.20.0）"`
   - 终止执行

2. **检查 Version.cs 文件是否存在**：
   - 检查 `Combo/Plugins/Windows/ComboSDK/Runtime/Version.cs` 文件
   - 如果文件不存在，提示用户并终止执行

### 步骤一：检查当前版本状态

1. 读取当前 `Combo/Plugins/Windows/ComboSDK/Runtime/Version.cs` 中的 `SDKVersion`
2. **检查当前版本是否已带有 `-dev` 后缀**：
   - **如果当前版本已包含 `-dev` 后缀**：
     - 提示用户："当前版本已经是开发版本（x.x.x-dev），无需再次 Prepare。"
     - 建议用户：
       - 如果要发布正式版，请使用 `bump` 命令
       - 如果要手动指定新版本号，请明确提供版本号
     - **结束执行，不继续后续步骤**
   - **如果当前版本不包含 `-dev` 后缀**：继续执行步骤二

### 步骤二：确定新版本号

1. **检查用户是否提供了目标版本号**
   - 如果用户已指定版本号：使用该版本号，并自动添加 `-dev` 后缀
     - 如果用户输入的不是完整的三段式版本号（如 `2.20`），自动补全为 `x.y.0` 格式（如 `2.20.0`）
     - 然后添加 `-dev` 后缀，例如：`2.20` → `2.20.0-dev`
   - 如果用户未指定版本号：
     1. 读取当前 `Combo/Plugins/Windows/ComboSDK/Runtime/Version.cs` 中的 `SDKVersion`
     2. 解析当前版本号 `x.y.z`
     3. 计算新版本号为 `x.(y+1).0-dev`
     4. 例如：当前版本是 `2.18.0`，则新版本号为 `2.19.0-dev`

2. 将确定的版本号记为 `NEW_VERSION`

### 步骤三：更新版本号

调用 `references/version.md`，传入 `NEW_VERSION`

### 步骤四：Git 提交

进行 git 提交，执行以下步骤：

1. **获取当前分支名称**
   - 执行命令：`git branch --show-current`
   - 获取当前分支名称，记为 `CURRENT_BRANCH`
   - **如果命令失败**，提示用户：`"错误：无法获取当前分支名称，请检查 git 仓库状态。"` 并终止执行

2. **处理版本号用于提交信息**
   - 从 `NEW_VERSION` 中移除 `-dev` 后缀，得到纯净版本号
   - 确保版本号格式为 `x.y.z`（例如：`2.19.0` 而不是 `2.19`）
   - 将处理后的版本号记为 `CLEAN_VERSION`
   - 例如：`2.19.0-dev` → `2.19.0`，`2.19-dev` → `2.19.0`

3. **判断分支并执行相应操作**
   - **如果 `CURRENT_BRANCH` 是 `main` 分支，或是 `release-` 开头的分支（如 `release-2.19`）**：
     1. 执行 `git checkout -b prepare-CLEAN_VERSION` 创建新分支
        - **如果创建失败**，提示用户：`"错误：无法创建分支 prepare-CLEAN_VERSION，请检查该分支是否已存在。"` 并终止执行
     2. 执行 `git add Combo/Plugins/Windows/ComboSDK/Runtime/Version.cs`
     3. 执行 `git add Combo/Plugins/Windows/SeayooAccount/Runtime/Constants.cs`
     4. 执行 `git add Combo/Runtime/Version.cs`
     5. 执行 `git add package.json`
     6. 执行 `git commit -m "Prepare for next release CLEAN_VERSION"`
        - **如果提交失败**，提示用户：`"错误：git commit 失败，请检查是否有未暂存的更改。"` 并终止执行
     7. 执行 `git push`
        - **如果推送失败**，提示用户：`"错误：git push 失败，请检查网络连接和远程仓库权限。"` 并终止执行
   - **其他分支**：
     1. 执行 `git add Combo/Plugins/Windows/ComboSDK/Runtime/Version.cs`
     2. 执行 `git add Combo/Plugins/Windows/SeayooAccount/Runtime/Constants.cs`
     3. 执行 `git add Combo/Runtime/Version.cs`
     4. 执行 `git add package.json`
     5. 执行 `git commit -m "Prepare for next release CLEAN_VERSION"`
        - **如果提交失败**，提示用户：`"错误：git commit 失败，请检查是否有未暂存的更改。"` 并终止执行
     6. 执行 `git push`
        - **如果推送失败**，提示用户：`"错误：git push 失败，请检查网络连接和远程仓库权限。"` 并终止执行

### 步骤五：创建 Merge Request

1. **确定目标分支**
   - 解析 `CLEAN_VERSION` 的补丁版本号（`x.y.z` 中的 `z`）
   - **如果 `z` 等于 `0`**（如 `2.19.0`）：`MR_TARGET_BRANCH` = `main`
   - **如果 `z` 不等于 `0`**（如 `2.19.1`）：`MR_TARGET_BRANCH` = `release-x.y`（如 `release-2.19`）

2. **创建 Merge Request**
   - 执行 `glab mr create --title "Prepare for next release CLEAN_VERSION" --target-branch MR_TARGET_BRANCH --assignee @me --yes`
   - **如果创建失败**，提示用户：`"错误：创建 MR 失败，请检查 glab 配置和网络连接。"`（git 操作已完成，不受影响）
   - 创建成功后，输出 MR 链接

## 执行要求

1. 严格按照步骤顺序执行
2. 仅更新版本号，不生成 CHANGELOG
3. 新版本号必须带有 `-dev` 后缀
4. **Git 操作规则**：
   - 在 `main` 分支或 `release-` 开头的分支上时，先创建 `prepare-CLEAN_VERSION` 分支，然后在新分支上执行 git add/commit/push
   - 在其他分支上直接执行 git add/commit/push
   - 执行 git 操作前必须先确认当前分支名称
5. **MR 创建规则**：
   - git push 成功后自动创建 MR
   - MR 标题复用 commit message
   - MR 自动 assign 给当前用户
   - 目标分支根据 CLEAN_VERSION 补丁位决定：`z=0` → `main`，`z≠0` → `release-x.y`

## 示例

### 示例 1（用户未指定版本号）

假设当前 `Combo/Plugins/Windows/ComboSDK/Runtime/Version.cs` 中的 `SDKVersion` 是 "2.18.0"

执行流程：
1. 读取当前版本号 "2.18.0"（不包含 -dev）
2. 计算新版本号：2.19.0-dev
3. 调用 `version.md` 更新版本号为 2.19.0-dev
4. 非 main 分支时执行 git 提交
5. 创建 MR → `main`（z=0）

### 示例 2（当前版本已是 -dev，提示用户）

假设当前 `Combo/Plugins/Windows/ComboSDK/Runtime/Version.cs` 中的 `SDKVersion` 是 "2.19.0-dev"

执行流程：
1. 读取当前版本号 "2.19.0-dev"（已包含 -dev 后缀）
2. 提示用户："当前版本已经是开发版本（2.19.0-dev），无需再次 Prepare。"
3. **结束执行，不进行任何修改**

### 示例 3（用户指定版本号）

输入：`TARGET_VERSION=2.20.0`

执行流程：
1. 用户指定版本号 2.20.0
2. 自动添加 `-dev` 后缀 → 2.20.0-dev
3. 调用 `version.md` 更新版本号为 2.20.0-dev
4. 执行 git 提交
5. 创建 MR → `main`（z=0）

### 示例 4（用户指定简写版本号）

输入：`TARGET_VERSION=2.20`

执行流程：
1. 用户指定版本号 2.20
2. 自动补全为 2.20.0，添加 `-dev` 后缀 → 2.20.0-dev
3. 调用 `version.md` 更新版本号为 2.20.0-dev
4. 执行 git 提交
5. 创建 MR → `main`（z=0）

### 示例 5（非 main 分支，执行 git 提交）

假设当前在 `feature/login` 分支，当前版本号是 "2.18.0"

执行流程：
1-2. 计算新版本号 2.19.0-dev，调用 `version.md` 更新
3. 执行 `git branch --show-current` 得到 `feature/login`
4. 非 main 分支，执行：
   - `git add Combo/Plugins/Windows/ComboSDK/Runtime/Version.cs`
   - `git add Combo/Plugins/Windows/SeayooAccount/Runtime/Constants.cs`
   - `git add Combo/Runtime/Version.cs`
   - `git add package.json`
   - `git commit -m "Prepare for next release 2.19.0"`
   - `git push`
5. 创建 MR：`feature/login` → `main`（z=0）

### 示例 6（main 分支，自动创建分支）

假设当前在 `main` 分支，prepare 2.19.0

执行流程：
1-2. 计算新版本号，调用 `version.md` 更新
3. 执行 `git branch --show-current` 得到 `main`
4. 执行 `git checkout -b prepare-2.19.0` 创建新分支
5. 执行：
   - `git add Combo/Plugins/Windows/ComboSDK/Runtime/Version.cs`
   - `git add Combo/Plugins/Windows/SeayooAccount/Runtime/Constants.cs`
   - `git add Combo/Runtime/Version.cs`
   - `git add package.json`
   - `git commit -m "Prepare for next release 2.19.0"`
   - `git push`
6. 创建 MR：`prepare-2.19.0` → `main`（z=0）

### 示例 7（补丁版本，MR 目标为 release 分支）

假设当前在 `hotfix-2.19.1` 分支，prepare 2.19.2

执行流程：
1-2. 计算新版本号 2.19.2-dev，调用 `version.md` 更新
3. 执行 git 提交
4. 创建 MR：`hotfix-2.19.1` → `release-2.19`（z=2）
