#!/bin/bash
#
# Git commit-msg hook
#
# 在每次 git commit 时自动执行以下操作：
# 1. 检查并追加 Signed-off-by 字段（使用 git config 中的 user.name 和 user.email）
# 2. 检查并生成 Change-Id 字段（与 Gerrit 兼容）
#
# 安装方式：
#   cp hooks/commit-msg .git/hooks/commit-msg
#   chmod +x .git/hooks/commit-msg
#

set -e

COMMIT_MSG_FILE="$1"

# 检查 commit message 文件是否存在
if [ ! -f "$COMMIT_MSG_FILE" ]; then
    echo "ERROR: commit message file not found: $COMMIT_MSG_FILE"
    exit 1
fi

# ---------------------------------------------------------------------------
# 1. 追加 Signed-off-by
# ---------------------------------------------------------------------------
add_signed_off_by() {
    local msg_file="$1"

    # 获取提交者信息
    local name=$(git config user.name)
    local email=$(git config user.email)

    if [ -z "$name" ] || [ -z "$email" ]; then
        echo "WARNING: git config user.name or user.email not set, skip Signed-off-by"
        return
    fi

    local sob="Signed-off-by: ${name} <${email}>"

    # 检查是否已存在 Signed-off-by
    if grep -q "^Signed-off-by:" "$msg_file"; then
        return
    fi

    # 追加 Signed-off-by
    echo "${sob}" >> "$msg_file"
    echo "[commit-msg] Added: ${sob}"
}

# ---------------------------------------------------------------------------
# 2. 追加 Change-Id
# ---------------------------------------------------------------------------
add_change_id() {
    local msg_file="$1"

    # 检查是否已存在 Change-Id
    if grep -q "^Change-Id:" "$msg_file"; then
        return
    fi

    # 生成 Change-Id（与 Gerrit commit-msg hook 兼容的方式）
    # Change-Id 格式：I + 40位十六进制字符
    local raw_id="I$(head -c 20 /dev/urandom | sha1sum | head -c 40)"
    local change_id="Change-Id: ${raw_id}"

    # 确保 Change-Id 前有空行（如果文件末尾不是空行）
    local last_char=$(tail -c 1 "$msg_file")
    if [ -n "$last_char" ]; then
        echo "" >> "$msg_file"
    fi

    echo "${change_id}" >> "$msg_file"
    echo "[commit-msg] Added: ${change_id}"
}

# ---------------------------------------------------------------------------
# 执行
# ---------------------------------------------------------------------------
add_signed_off_by "$COMMIT_MSG_FILE"
add_change_id "$COMMIT_MSG_FILE"
