2323 - libdd-trace-protobuf
2424 - libdd-trace-stats
2525 - libdd-trace-utils
26- main_start_sha :
26+ main_start_ref :
2727 description : >
28- Optional commit on main to cut the release from (full or short SHA). Leave empty for
29- latest main. Must be an ancestor of origin/main.
28+ Optional git ref to cut the release from: commit SHA (short or full), branch name,
29+ tag, or refs/... (e.g. main, v1.2.3, origin/main). Leave empty to use latest
30+ origin/main.
3031 required : false
3132 type : string
3233 default : ' '
@@ -151,26 +152,64 @@ jobs:
151152 git config --global user.name "$GIT_USER_NAME"
152153 git config --global user.email "$GIT_USER_EMAIL"
153154
154- - name : Optionally checkout main at specific SHA
155+ - name : Optionally checkout at a specific git ref
155156 env :
156- MAIN_START_SHA : ${{ inputs.main_start_sha }}
157+ MAIN_START_REF : ${{ inputs.main_start_ref }}
157158 run : |
158- git fetch origin "${{ env.MAIN_BRANCH }}"
159- if [ -n "${MAIN_START_SHA// }" ]; then
160- SHA=$(echo "$MAIN_START_SHA" | tr -d '[:space:]')
161- if ! echo "$SHA" | grep -qE '^[0-9a-fA-F]{7,40}$'; then
162- echo "Error: main_start_sha must be a 7–40 character hex commit SHA." >&2
159+ set -euo pipefail
160+ git fetch origin "${{ env.MAIN_BRANCH }}" --tags --prune
161+
162+ resolve_to_commit() {
163+ local r="$1"
164+ local c=""
165+ # Already a commit or resolvable locally
166+ c=$(git rev-parse -q --verify "${r}^{commit}" 2>/dev/null) || true
167+ if [ -n "$c" ]; then
168+ echo "$c"
169+ return 0
170+ fi
171+ # Remote branch: origin/<name>
172+ c=$(git rev-parse -q --verify "origin/${r}^{commit}" 2>/dev/null) || true
173+ if [ -n "$c" ]; then
174+ echo "$c"
175+ return 0
176+ fi
177+ # Tag
178+ c=$(git rev-parse -q --verify "refs/tags/${r}^{commit}" 2>/dev/null) || true
179+ if [ -n "$c" ]; then
180+ echo "$c"
181+ return 0
182+ fi
183+ return 1
184+ }
185+
186+ if [ -n "${MAIN_START_REF// }" ]; then
187+ REF=$(echo "$MAIN_START_REF" | tr -d '[:space:]')
188+ if [ -z "$REF" ]; then
189+ echo "Error: main_start_ref is whitespace-only." >&2
163190 exit 1
164191 fi
165- if ! git merge-base --is-ancestor "$SHA" "origin/${{ env.MAIN_BRANCH }}"; then
166- echo "Error: main_start_sha must be an ancestor of origin/${{ env.MAIN_BRANCH }}." >&2
192+ # Try to fetch the ref from origin (branches, tags, and SHA objects)
193+ git fetch origin "$REF" 2>/dev/null || true
194+
195+ COMMIT=""
196+ COMMIT=$(resolve_to_commit "$REF") || true
197+ if [ -z "$COMMIT" ]; then
198+ # e.g. short SHA or ref only present after full fetch
199+ git fetch origin "$REF:$REF" 2>/dev/null || true
200+ COMMIT=$(resolve_to_commit "$REF") || true
201+ fi
202+ if [ -z "$COMMIT" ]; then
203+ echo "Error: could not resolve git ref to a commit: $REF" >&2
204+ echo "Try a full SHA, a branch/tag name on origin, or refs/heads/... / refs/tags/..." >&2
167205 exit 1
168206 fi
169- git checkout "$SHA "
170- echo "Release cut from ${{ env.MAIN_BRANCH }} at $SHA (not tip). "
207+ git checkout "$COMMIT "
208+ echo "Release cut from ref '$REF' -> $COMMIT ($(git log -1 --oneline)) "
171209 else
172210 git checkout "${{ env.MAIN_BRANCH }}"
173- echo "Release cut from origin/${{ env.MAIN_BRANCH }} tip."
211+ git reset --hard "origin/${{ env.MAIN_BRANCH }}"
212+ echo "Release cut from origin/${{ env.MAIN_BRANCH }} tip ($(git rev-parse --short HEAD))."
174213 fi
175214
176215 - name : Create ephemeral release branch
@@ -180,7 +219,7 @@ jobs:
180219 EPHEMERAL_BRANCH="release/${{ inputs.crate }}/$TIMESTAMP"
181220 git checkout -b "$EPHEMERAL_BRANCH"
182221 git push origin "$EPHEMERAL_BRANCH"
183- echo "Ephemeral release branch created: $EPHEMERAL_BRANCH from ${{ env.MAIN_BRANCH }} branch ($(git rev-parse --short HEAD))"
222+ echo "Ephemeral release branch created: $EPHEMERAL_BRANCH branch ($(git rev-parse --short HEAD))"
184223 echo "ephemeral_branch=$EPHEMERAL_BRANCH" >> "$GITHUB_OUTPUT"
185224 echo "timestamp=$TIMESTAMP" >> "$GITHUB_OUTPUT"
186225
0 commit comments