@@ -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