Skip to content

Commit 41ce4fd

Browse files
committed
fix: address code review feedback on ruleset sync
- Use jq --arg for safe ruleset name matching (no injection risk) - Bail early if rulesets API call fails (don't treat errors as missing) - Compare full ruleset config (name, enforcement, target, conditions, rules) instead of just enforcement field - Only log APPLIED on successful API calls
1 parent 4fa8b71 commit 41ce4fd

1 file changed

Lines changed: 33 additions & 17 deletions

File tree

scripts/sync-repo-settings.sh

Lines changed: 33 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -387,34 +387,50 @@ sync_rulesets() {
387387
return
388388
fi
389389

390-
# Check if the ruleset already exists
391-
local existing
392-
existing=$(gh api "repos/$OWNER/$repo/rulesets" --jq ".[] | select(.name == \"$ruleset_name\") | .id" 2>/dev/null || echo "")
390+
# List rulesets — bail if the API call itself fails
391+
local rulesets_json existing
392+
if ! rulesets_json=$(gh api "repos/$OWNER/$repo/rulesets" 2>/dev/null); then
393+
log "WARN: Could not list rulesets for $repo"
394+
echo ""
395+
return
396+
fi
397+
existing=$(echo "$rulesets_json" | jq -r --arg name "$ruleset_name" '.[] | select(.name == $name) | .id' | head -n1)
398+
399+
local desired_ruleset
400+
desired_ruleset=$(echo "$effective" | jq '.rulesets.copilot_code_review')
393401

394402
if [ -n "$existing" ]; then
395-
# Verify enforcement is active
396-
local current_enforcement
397-
current_enforcement=$(gh api "repos/$OWNER/$repo/rulesets/$existing" --jq '.enforcement' 2>/dev/null || echo "")
398-
if [ "$current_enforcement" != "active" ]; then
399-
changes="- Copilot review ruleset: enforcement \`$current_enforcement\` -> \`active\`\n"
403+
# Compare full ruleset config, not just enforcement
404+
local current_ruleset desired_normalized current_normalized
405+
current_ruleset=$(gh api "repos/$OWNER/$repo/rulesets/$existing" 2>/dev/null || echo "")
406+
desired_normalized=$(echo "$desired_ruleset" | jq -cS '{name, enforcement, target, conditions, rules}')
407+
current_normalized=$(echo "$current_ruleset" | jq -cS '{name, enforcement, target, conditions, rules}')
408+
if [ "$current_normalized" != "$desired_normalized" ]; then
409+
changes="- Copilot review ruleset: configuration drift detected\n"
400410
if [ "$MODE" = "--apply" ]; then
401-
gh api -X PUT "repos/$OWNER/$repo/rulesets/$existing" \
402-
--input <(echo "$effective" | jq '.rulesets.copilot_code_review') \
403-
> /dev/null 2>&1 || log "WARN: Could not update ruleset for $repo"
404-
log "APPLIED ruleset enforcement for $repo"
411+
if gh api -X PUT "repos/$OWNER/$repo/rulesets/$existing" \
412+
--input <(echo "$desired_ruleset") \
413+
> /dev/null 2>&1; then
414+
log "APPLIED Copilot review ruleset for $repo"
415+
else
416+
log "WARN: Could not update ruleset for $repo"
417+
fi
405418
else
406-
log "DRIFT detected in ruleset enforcement for $repo"
419+
log "DRIFT detected in Copilot review ruleset for $repo"
407420
fi
408421
else
409422
log "OK: Copilot review ruleset for $repo"
410423
fi
411424
else
412425
changes="- Copilot review ruleset: **missing** -> will be created\n"
413426
if [ "$MODE" = "--apply" ]; then
414-
gh api -X POST "repos/$OWNER/$repo/rulesets" \
415-
--input <(echo "$effective" | jq '.rulesets.copilot_code_review') \
416-
> /dev/null 2>&1 || log "WARN: Could not create ruleset for $repo"
417-
log "APPLIED Copilot review ruleset for $repo"
427+
if gh api -X POST "repos/$OWNER/$repo/rulesets" \
428+
--input <(echo "$desired_ruleset") \
429+
> /dev/null 2>&1; then
430+
log "APPLIED Copilot review ruleset for $repo"
431+
else
432+
log "WARN: Could not create ruleset for $repo"
433+
fi
418434
else
419435
log "DRIFT detected: missing Copilot review ruleset for $repo"
420436
fi

0 commit comments

Comments
 (0)