@@ -645,7 +645,11 @@ impl SyncGitHub {
645645 let id = actual_ruleset. id . unwrap_or ( 0 ) ;
646646 ruleset_diffs. push ( RulesetDiff {
647647 name : ruleset_name,
648- operation : RulesetDiffOperation :: Update ( id, expected_ruleset) ,
648+ operation : RulesetDiffOperation :: Update (
649+ id,
650+ actual_ruleset,
651+ expected_ruleset,
652+ ) ,
649653 } ) ;
650654 }
651655 } else {
@@ -1617,6 +1621,182 @@ fn log_branch_protection(
16171621 Ok ( ( ) )
16181622}
16191623
1624+ fn log_ruleset (
1625+ current : & api:: Ruleset ,
1626+ new : Option < & api:: Ruleset > ,
1627+ mut result : impl Write ,
1628+ ) -> std:: fmt:: Result {
1629+ macro_rules! log {
1630+ ( $str: literal, $field: expr, $new_field: expr) => {
1631+ let old = $field;
1632+ let new_val = $new_field;
1633+ if Some ( old) != new_val {
1634+ if let Some ( n) = new_val {
1635+ writeln!( result, " {}: {:?} => {:?}" , $str, old, n) ?;
1636+ } else {
1637+ writeln!( result, " {}: {:?}" , $str, old) ?;
1638+ }
1639+ }
1640+ } ;
1641+ }
1642+
1643+ // Log basic ruleset properties
1644+ log ! ( "Target" , & current. target, new. map( |n| & n. target) ) ;
1645+ log ! (
1646+ "Source Type" ,
1647+ & current. source_type,
1648+ new. map( |n| & n. source_type)
1649+ ) ;
1650+ log ! (
1651+ "Enforcement" ,
1652+ & current. enforcement,
1653+ new. map( |n| & n. enforcement)
1654+ ) ;
1655+
1656+ // Log branch conditions
1657+ if let Some ( ref_name) = & current. conditions . ref_name {
1658+ let new_ref_name = new. and_then ( |n| n. conditions . ref_name . as_ref ( ) ) ;
1659+ if !ref_name. include . is_empty ( ) {
1660+ log ! (
1661+ "Include Branches" ,
1662+ & ref_name. include,
1663+ new_ref_name. map( |r| & r. include)
1664+ ) ;
1665+ }
1666+ if !ref_name. exclude . is_empty ( ) {
1667+ log ! (
1668+ "Exclude Branches" ,
1669+ & ref_name. exclude,
1670+ new_ref_name. map( |r| & r. exclude)
1671+ ) ;
1672+ }
1673+ }
1674+
1675+ // Log bypass actors
1676+ if let Some ( bypass_actors) = & current. bypass_actors
1677+ && !bypass_actors. is_empty ( )
1678+ {
1679+ let new_bypass = new. and_then ( |n| n. bypass_actors . as_ref ( ) ) ;
1680+ log ! ( "Bypass Actors" , bypass_actors, new_bypass) ;
1681+ }
1682+
1683+ // Log individual rules
1684+ for rule in & current. rules {
1685+ match rule {
1686+ api:: RulesetRule :: Creation => {
1687+ writeln ! ( result, " Rule: Creation" ) ?;
1688+ }
1689+ api:: RulesetRule :: Update => {
1690+ writeln ! ( result, " Rule: Update" ) ?;
1691+ }
1692+ api:: RulesetRule :: Deletion => {
1693+ writeln ! ( result, " Rule: Deletion" ) ?;
1694+ }
1695+ api:: RulesetRule :: RequiredLinearHistory => {
1696+ writeln ! ( result, " Rule: Required Linear History" ) ?;
1697+ }
1698+ api:: RulesetRule :: RequiredSignatures => {
1699+ writeln ! ( result, " Rule: Required Signatures" ) ?;
1700+ }
1701+ api:: RulesetRule :: NonFastForward => {
1702+ writeln ! ( result, " Rule: Non-Fast-Forward" ) ?;
1703+ }
1704+ api:: RulesetRule :: MergeQueue { parameters } => {
1705+ writeln ! ( result, " Rule: Merge Queue" ) ?;
1706+ writeln ! (
1707+ result,
1708+ " Timeout: {} minutes" ,
1709+ parameters. check_response_timeout_minutes
1710+ ) ?;
1711+ writeln ! (
1712+ result,
1713+ " Grouping Strategy: {:?}" ,
1714+ parameters. grouping_strategy
1715+ ) ?;
1716+ writeln ! (
1717+ result,
1718+ " Merge Method: {:?}" ,
1719+ parameters. merge_method
1720+ ) ?;
1721+ writeln ! (
1722+ result,
1723+ " Max Entries to Build: {}" ,
1724+ parameters. max_entries_to_build
1725+ ) ?;
1726+ writeln ! (
1727+ result,
1728+ " Max Entries to Merge: {}" ,
1729+ parameters. max_entries_to_merge
1730+ ) ?;
1731+ writeln ! (
1732+ result,
1733+ " Min Entries to Merge: {}" ,
1734+ parameters. min_entries_to_merge
1735+ ) ?;
1736+ writeln ! (
1737+ result,
1738+ " Min Wait Time: {} minutes" ,
1739+ parameters. min_entries_to_merge_wait_minutes
1740+ ) ?;
1741+ }
1742+ api:: RulesetRule :: PullRequest { parameters } => {
1743+ writeln ! ( result, " Rule: Pull Request" ) ?;
1744+ writeln ! (
1745+ result,
1746+ " Dismiss Stale Reviews: {}" ,
1747+ parameters. dismiss_stale_reviews_on_push
1748+ ) ?;
1749+ writeln ! (
1750+ result,
1751+ " Require Code Owner Review: {}" ,
1752+ parameters. require_code_owner_review
1753+ ) ?;
1754+ writeln ! (
1755+ result,
1756+ " Require Last Push Approval: {}" ,
1757+ parameters. require_last_push_approval
1758+ ) ?;
1759+ writeln ! (
1760+ result,
1761+ " Required Approving Review Count: {}" ,
1762+ parameters. required_approving_review_count
1763+ ) ?;
1764+ writeln ! (
1765+ result,
1766+ " Required Review Thread Resolution: {}" ,
1767+ parameters. required_review_thread_resolution
1768+ ) ?;
1769+ }
1770+ api:: RulesetRule :: RequiredStatusChecks { parameters } => {
1771+ writeln ! ( result, " Rule: Required Status Checks" ) ?;
1772+ writeln ! (
1773+ result,
1774+ " Strict Policy: {}" ,
1775+ parameters. strict_required_status_checks_policy
1776+ ) ?;
1777+ if !parameters. required_status_checks . is_empty ( ) {
1778+ let checks: Vec < _ > = parameters
1779+ . required_status_checks
1780+ . iter ( )
1781+ . map ( |c| & c. context )
1782+ . collect ( ) ;
1783+ writeln ! ( result, " Checks: {:?}" , checks) ?;
1784+ }
1785+ }
1786+ api:: RulesetRule :: RequiredDeployments { parameters } => {
1787+ writeln ! ( result, " Rule: Required Deployments" ) ?;
1788+ writeln ! (
1789+ result,
1790+ " Environments: {:?}" ,
1791+ parameters. required_deployment_environments
1792+ ) ?;
1793+ }
1794+ }
1795+ }
1796+
1797+ Ok ( ( ) )
1798+ }
1799+
16201800#[ derive( Debug ) ]
16211801enum BranchProtectionDiffOperation {
16221802 Create ( api:: BranchProtection ) ,
@@ -1637,8 +1817,8 @@ impl RulesetDiff {
16371817 RulesetDiffOperation :: Create ( ruleset) => {
16381818 sync. upsert_ruleset ( RulesetOp :: CreateForRepo , org, repo_name, ruleset) ?;
16391819 }
1640- RulesetDiffOperation :: Update ( id, ruleset ) => {
1641- sync. upsert_ruleset ( RulesetOp :: UpdateRuleset ( * id) , org, repo_name, ruleset ) ?;
1820+ RulesetDiffOperation :: Update ( id, _ , new_ruleset ) => {
1821+ sync. upsert_ruleset ( RulesetOp :: UpdateRuleset ( * id) , org, repo_name, new_ruleset ) ?;
16421822 }
16431823 RulesetDiffOperation :: Delete ( id) => {
16441824 debug ! (
@@ -1657,12 +1837,8 @@ impl std::fmt::Display for RulesetDiff {
16571837 fn fmt ( & self , f : & mut std:: fmt:: Formatter < ' _ > ) -> std:: fmt:: Result {
16581838 writeln ! ( f, " {}" , self . name) ?;
16591839 match & self . operation {
1660- RulesetDiffOperation :: Create ( _) => {
1661- writeln ! ( f, " Creating ruleset with merge queue enabled" )
1662- }
1663- RulesetDiffOperation :: Update ( _, _) => {
1664- writeln ! ( f, " Updating ruleset" )
1665- }
1840+ RulesetDiffOperation :: Create ( ruleset) => log_ruleset ( ruleset, None , f) ,
1841+ RulesetDiffOperation :: Update ( _, old, new) => log_ruleset ( old, Some ( new) , f) ,
16661842 RulesetDiffOperation :: Delete ( _) => {
16671843 writeln ! ( f, " Deleting ruleset" )
16681844 }
@@ -1673,7 +1849,7 @@ impl std::fmt::Display for RulesetDiff {
16731849#[ derive( Debug ) ]
16741850enum RulesetDiffOperation {
16751851 Create ( api:: Ruleset ) ,
1676- Update ( i64 , api:: Ruleset ) ,
1852+ Update ( i64 , api:: Ruleset , api :: Ruleset ) , // id, old, new
16771853 Delete ( i64 ) ,
16781854}
16791855
0 commit comments