Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
97 changes: 25 additions & 72 deletions scripts/labels-test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -17,36 +17,28 @@ FAILURES=0

# --- Test helpers ---

GH_CALLS_FILE=$(mktemp)
export GH_CALLS_FILE
trap 'rm -f "${GH_CALLS_FILE}"' EXIT
FORGE_CALLS_FILE=$(mktemp)
export FORGE_CALLS_FILE
trap 'rm -f "${FORGE_CALLS_FILE}"' EXIT

setup_test() {
true > "${GH_CALLS_FILE}"
export GH_EXIT_CODE=0
export GH_STDERR=""
export REPO_FULL_NAME="test-org/test-repo"
unset REPO 2>/dev/null || true
true > "${FORGE_CALLS_FILE}"
}

get_gh_call() {
get_forge_call() {
local index="${1:-0}"
sed -n "$((index + 1))p" "${GH_CALLS_FILE}"
sed -n "$((index + 1))p" "${FORGE_CALLS_FILE}"
}

get_gh_call_count() {
wc -l < "${GH_CALLS_FILE}" | tr -d ' '
get_forge_call_count() {
wc -l < "${FORGE_CALLS_FILE}" | tr -d ' '
}

# Stub gh that records calls and returns configured exit/stderr.
gh() {
echo "$*" >> "${GH_CALLS_FILE}"
if [[ ${GH_EXIT_CODE} -ne 0 ]]; then
echo "${GH_STDERR}" >&2
return ${GH_EXIT_CODE}
fi
# Stub forge_create_label that records calls.
forge_create_label() {
echo "$*" >> "${FORGE_CALLS_FILE}"
}
export -f gh 2>/dev/null || true
export -f forge_create_label 2>/dev/null || true

run_test() {
local test_name="$1"
Expand All @@ -63,81 +55,42 @@ run_test() {
fi
}

# Source the lib under test (after defining gh stub).
# Source the lib under test (after defining forge_create_label stub).
# shellcheck source=lib/labels.lib.sh
source "${SCRIPT_DIR}/lib/labels.lib.sh"

# --- Tests ---

# Test 1: Mandatory label emits gh label create with correct args.
# Test 1: Mandatory label delegates to forge_create_label with correct args.
setup_test
forge_ensure_label "ready-for-review"
run_test "mandatory-label-creates" \
"label create ready-for-review --repo test-org/test-repo" \
"$(get_gh_call 0)"
"ready-for-review Triggers review agent dispatch 0E8A16" \
"$(get_forge_call 0)"

# Test 2: Non-mandatory label is a no-op.
setup_test
forge_ensure_label "question"
run_test "non-mandatory-is-noop" \
"0" \
"$(get_gh_call_count)"
"$(get_forge_call_count)"

# Test 3: "already exists" error produces no warning.
setup_test
GH_EXIT_CODE=1
GH_STDERR='label with name "ready-for-review" already exists; use `--force` to update'
stderr_output=$(forge_ensure_label "ready-for-review" 2>&1 >/dev/null)
run_test "already-exists-silent" \
"" \
"${stderr_output}"

# Test 4: Other errors produce a warning.
setup_test
GH_EXIT_CODE=1
GH_STDERR="HTTP 403: Resource not accessible by integration"
stderr_output=$(forge_ensure_label "ready-for-review" 2>&1 >/dev/null)
run_test "other-error-warns" \
"Warning:" \
"${stderr_output}"

# Test 5: Defaults are applied when no description/color provided.
# Test 3: Defaults are applied when no description/color provided.
setup_test
forge_ensure_label "ready-to-code"
run_test "defaults-applied-description" \
"--description" \
"$(get_gh_call 0)"
"Triggers code agent dispatch" \
"$(get_forge_call 0)"
run_test "defaults-applied-color" \
"--color" \
"$(get_gh_call 0)"
"0E8A16" \
"$(get_forge_call 0)"

# Test 6: Explicit description/color overrides defaults.
# Test 4: Explicit description/color overrides defaults.
setup_test
forge_ensure_label "ready-for-review" "Custom desc" "FF0000"
run_test "explicit-overrides-default" \
"--description Custom desc --color FF0000" \
"$(get_gh_call 0)"

# Test 7: Uses REPO when REPO_FULL_NAME is unset.
setup_test
unset REPO_FULL_NAME
export REPO="triage-org/triage-repo"
forge_ensure_label "ready-for-triage"
run_test "falls-back-to-REPO" \
"--repo triage-org/triage-repo" \
"$(get_gh_call 0)"

# Test 8: No --force flag in the gh call.
setup_test
forge_ensure_label "ready-for-review"
gh_call=$(get_gh_call 0)
if [[ "${gh_call}" == *"--force"* ]]; then
echo "FAIL: no-force-flag"
echo " gh call contains --force: '${gh_call}'"
FAILURES=$((FAILURES + 1))
else
echo "PASS: no-force-flag"
fi
"ready-for-review Custom desc FF0000" \
"$(get_forge_call 0)"

echo ""
if [ ${FAILURES} -gt 0 ]; then
Expand Down
5 changes: 5 additions & 0 deletions scripts/lib/github-triage-ops.lib.sh
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,11 @@ tracker_create_label() {
--force 2>/dev/null || true
}

# Alias used by labels.lib.sh (forge_ensure_label delegates to forge_create_label).
forge_create_label() {
tracker_create_label "$@"
}

# --- Comments ---

tracker_post_comment() {
Expand Down
5 changes: 5 additions & 0 deletions scripts/lib/gitlab-triage-ops.lib.sh
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,11 @@ tracker_create_label() {
--data-urlencode "color=#${color}" > /dev/null 2>/dev/null || true
}

# Alias used by labels.lib.sh (forge_ensure_label delegates to forge_create_label).
forge_create_label() {
tracker_create_label "$@"
}

# --- Bot identity (for sticky-comment author filtering) ---

_GITLAB_BOT_USERNAME=""
Expand Down
5 changes: 5 additions & 0 deletions scripts/lib/jira-triage-ops.lib.sh
Original file line number Diff line number Diff line change
Expand Up @@ -230,6 +230,11 @@ tracker_create_label() {
:
}

# Alias used by labels.lib.sh (forge_ensure_label delegates to forge_create_label).
forge_create_label() {
tracker_create_label "$@"
}

# --- Components ---

# Set components on a Jira issue. Accepts a JSON array of component objects
Expand Down
27 changes: 6 additions & 21 deletions scripts/lib/labels.lib.sh
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
# labels.lib.sh — Mandatory label management for fullsend agent scripts.
#
# Provides forge_ensure_label() which creates mandatory dispatch labels
# without --force, preserving admin customizations. Non-mandatory labels
# are silently skipped (no-op).
# by delegating to forge_create_label(). Non-mandatory labels are silently
# skipped (no-op).

# shellcheck shell=bash

Expand Down Expand Up @@ -42,23 +42,8 @@ forge_ensure_label() {
fi
fi

local create_args=("${name}" --repo "${REPO_FULL_NAME:-${REPO}}")
[[ -n "${description}" ]] && create_args+=(--description "${description}")
[[ -n "${color}" ]] && create_args+=(--color "${color}")

local err
if ! err=$(gh label create "${create_args[@]}" 2>&1); then
case "${err}" in
*already\ exists*) ;;
*)
err="${err//$'\n'/ }"
err="${err//::/:}"
err="${err//%0A/}"
err="${err//%0a/}"
err="${err//%0D/}"
err="${err//%0d/}"
echo "Warning: gh label create ${name}: ${err}" >&2
;;
esac
fi
# forge_create_label uses upsert semantics (--force on GitHub, 409-ignore
# on GitLab). This intentionally overwrites any admin-customized
Comment thread
ggallen marked this conversation as resolved.
# description/color — mandatory labels are agent-managed.
forge_create_label "${name}" "${description}" "${color}"
}
Comment thread
ggallen marked this conversation as resolved.
Comment thread
ggallen marked this conversation as resolved.
Comment thread
ggallen marked this conversation as resolved.
Comment thread
ggallen marked this conversation as resolved.
27 changes: 6 additions & 21 deletions scripts/post-code.sh
Original file line number Diff line number Diff line change
Expand Up @@ -1916,8 +1916,8 @@ esac
# labels.lib.sh — Mandatory label management for fullsend agent scripts.
#
# Provides forge_ensure_label() which creates mandatory dispatch labels
# without --force, preserving admin customizations. Non-mandatory labels
# are silently skipped (no-op).
# by delegating to forge_create_label(). Non-mandatory labels are silently
# skipped (no-op).

# shellcheck shell=bash

Expand Down Expand Up @@ -1956,25 +1956,10 @@ forge_ensure_label() {
fi
fi

local create_args=("${name}" --repo "${REPO_FULL_NAME:-${REPO}}")
[[ -n "${description}" ]] && create_args+=(--description "${description}")
[[ -n "${color}" ]] && create_args+=(--color "${color}")

local err
if ! err=$(gh label create "${create_args[@]}" 2>&1); then
case "${err}" in
*already\ exists*) ;;
*)
err="${err//$'\n'/ }"
err="${err//::/:}"
err="${err//%0A/}"
err="${err//%0a/}"
err="${err//%0D/}"
err="${err//%0d/}"
echo "Warning: gh label create ${name}: ${err}" >&2
;;
esac
fi
# forge_create_label uses upsert semantics (--force on GitHub, 409-ignore
# on GitLab). This intentionally overwrites any admin-customized
# description/color — mandatory labels are agent-managed.
forge_create_label "${name}" "${description}" "${color}"
}
# END bundled: lib/labels.lib.sh

Expand Down
42 changes: 21 additions & 21 deletions scripts/post-triage.sh
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,11 @@ tracker_create_label() {
--force 2>/dev/null || true
}

# Alias used by labels.lib.sh (forge_ensure_label delegates to forge_create_label).
forge_create_label() {
tracker_create_label "$@"
}

# --- Comments ---

tracker_post_comment() {
Expand Down Expand Up @@ -401,6 +406,11 @@ tracker_create_label() {
--data-urlencode "color=#${color}" > /dev/null 2>/dev/null || true
}

# Alias used by labels.lib.sh (forge_ensure_label delegates to forge_create_label).
forge_create_label() {
tracker_create_label "$@"
}

# --- Bot identity (for sticky-comment author filtering) ---

_GITLAB_BOT_USERNAME=""
Expand Down Expand Up @@ -742,6 +752,11 @@ tracker_create_label() {
:
}

# Alias used by labels.lib.sh (forge_ensure_label delegates to forge_create_label).
forge_create_label() {
tracker_create_label "$@"
}

# --- Components ---

# Set components on a Jira issue. Accepts a JSON array of component objects
Expand Down Expand Up @@ -918,8 +933,8 @@ esac
# labels.lib.sh — Mandatory label management for fullsend agent scripts.
#
# Provides forge_ensure_label() which creates mandatory dispatch labels
# without --force, preserving admin customizations. Non-mandatory labels
# are silently skipped (no-op).
# by delegating to forge_create_label(). Non-mandatory labels are silently
# skipped (no-op).

# shellcheck shell=bash

Expand Down Expand Up @@ -958,25 +973,10 @@ forge_ensure_label() {
fi
fi

local create_args=("${name}" --repo "${REPO_FULL_NAME:-${REPO}}")
[[ -n "${description}" ]] && create_args+=(--description "${description}")
[[ -n "${color}" ]] && create_args+=(--color "${color}")

local err
if ! err=$(gh label create "${create_args[@]}" 2>&1); then
case "${err}" in
*already\ exists*) ;;
*)
err="${err//$'\n'/ }"
err="${err//::/:}"
err="${err//%0A/}"
err="${err//%0a/}"
err="${err//%0D/}"
err="${err//%0d/}"
echo "Warning: gh label create ${name}: ${err}" >&2
;;
esac
fi
# forge_create_label uses upsert semantics (--force on GitHub, 409-ignore
# on GitLab). This intentionally overwrites any admin-customized
# description/color — mandatory labels are agent-managed.
forge_create_label "${name}" "${description}" "${color}"
Comment thread
ggallen marked this conversation as resolved.
}
# END bundled: lib/labels.lib.sh

Expand Down
15 changes: 15 additions & 0 deletions scripts/pre-triage.sh
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,11 @@ tracker_create_label() {
--force 2>/dev/null || true
}

# Alias used by labels.lib.sh (forge_ensure_label delegates to forge_create_label).
forge_create_label() {
tracker_create_label "$@"
}

# --- Comments ---

tracker_post_comment() {
Expand Down Expand Up @@ -397,6 +402,11 @@ tracker_create_label() {
--data-urlencode "color=#${color}" > /dev/null 2>/dev/null || true
}

# Alias used by labels.lib.sh (forge_ensure_label delegates to forge_create_label).
forge_create_label() {
tracker_create_label "$@"
}

# --- Bot identity (for sticky-comment author filtering) ---

_GITLAB_BOT_USERNAME=""
Expand Down Expand Up @@ -738,6 +748,11 @@ tracker_create_label() {
:
}

# Alias used by labels.lib.sh (forge_ensure_label delegates to forge_create_label).
forge_create_label() {
tracker_create_label "$@"
}

# --- Components ---

# Set components on a Jira issue. Accepts a JSON array of component objects
Expand Down
Loading