feat: add source-dir and repo-url inputs for external repo support

Allow changelog generation from upstream repositories instead of only
the current working directory. Supports packaging repos that contain
only rpm spec files while the source lives in an external git repo.

- source-dir: point at an existing local checkout
- repo-url: action clones a bare copy automatically
- source-dir takes precedence if both are set

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-27 10:36:00 +03:00
parent 22e2e34724
commit 328101f247
3 changed files with 109 additions and 3 deletions

View File

@@ -9,6 +9,12 @@
# RELEASE — release suffix, default "1"
# TAG_PATTERN — glob for release tags, default "v*"
# EXCLUDE_PATTERNS — newline-separated grep -E patterns to drop
# SOURCE_DIR — path to an external git checkout to read history from
# REPO_URL — URL of a remote repo to clone (bare) for history
#
# If SOURCE_DIR or REPO_URL is set, commits are collected from that
# repository instead of the current working directory. SOURCE_DIR
# takes precedence over REPO_URL.
#
# Collects commits since the previous matching tag, drops filtered
# lines (bump-version chore commits, merges, etc.), and writes a
@@ -22,6 +28,35 @@ AUTHOR="${CHANGELOG_AUTHOR:-Gitea Actions <actions@git.lair.cafe>}"
RELEASE="${RELEASE:-1}"
TAG_PATTERN="${TAG_PATTERN:-v*}"
EXCLUDE_PATTERNS="${EXCLUDE_PATTERNS:-$'^- chore: bump version\n^- Merge'}"
SOURCE_DIR="${SOURCE_DIR:-}"
REPO_URL="${REPO_URL:-}"
# Resolve the git directory to collect commits from.
# Priority: SOURCE_DIR > REPO_URL > current working directory.
CLEANUP_DIR=""
GIT_ARGS=()
if [ -n "$SOURCE_DIR" ]; then
if [ ! -d "$SOURCE_DIR/.git" ] && ! git -C "$SOURCE_DIR" rev-parse --git-dir >/dev/null 2>&1; then
printf 'error: source-dir is not a git repository: %s\n' "$SOURCE_DIR" >&2
exit 1
fi
GIT_ARGS=(-C "$SOURCE_DIR")
printf 'Using source-dir for commit history: %s\n' "$SOURCE_DIR"
elif [ -n "$REPO_URL" ]; then
CLONE_DIR=$(mktemp -d)
CLEANUP_DIR="$CLONE_DIR"
printf 'Cloning %s (bare) for commit history…\n' "$REPO_URL"
git clone --bare --filter=blob:none "$REPO_URL" "$CLONE_DIR/repo.git"
GIT_ARGS=(-C "$CLONE_DIR/repo.git")
fi
cleanup() {
if [ -n "$CLEANUP_DIR" ] && [ -d "$CLEANUP_DIR" ]; then
rm -rf "$CLEANUP_DIR"
fi
}
trap cleanup EXIT
if [ ! -f "$SPEC" ]; then
echo "error: spec file not found: $SPEC" >&2
@@ -34,10 +69,10 @@ if ! grep -q '^%changelog' "$SPEC"; then
fi
# Find the previous release tag (exclude the current tag at HEAD).
PREV_TAG=$(git describe --tags --abbrev=0 --match="$TAG_PATTERN" HEAD^ 2>/dev/null || echo "")
PREV_TAG=$(git "${GIT_ARGS[@]}" describe --tags --abbrev=0 --match="$TAG_PATTERN" HEAD^ 2>/dev/null || echo "")
if [ -n "$PREV_TAG" ]; then
RAW=$(git log --no-merges --pretty=format:'- %s' "${PREV_TAG}..HEAD")
RAW=$(git "${GIT_ARGS[@]}" log --no-merges --pretty=format:'- %s' "${PREV_TAG}..HEAD")
# Build a combined grep -E pattern from the exclude list; drop blanks.
COMBINED=""