• Timothy Andrew's avatar
    Support wildcard matches for protected branches at the model level. · f51af496
    Timothy Andrew authored
    1. The main implementation is in the `ProtectedBranch` model. The
       wildcard is converted to a Regex and compared. This has been tested
       thoroughly.
    
        - While `Project#protected_branch?` is the main entry point,
          `project#open_branches` and
          `project#developers_can_push_to_protected_branch?`
          have also been modified to work with wildcard protected branches.
    
        - The regex is memoized (within the `ProtectedBranch` instance)
    
    2. Improve the performance of `Project#protected_branch?`
    
        -  This method is called from `Project#open_branches` once _per branch_
           in the project, to check if that branch is protected or not.
    
        -  Before, `#protected_branch?` was making a database call every
           time it was invoked (in the above case, that amounts to once
           per branch), which is expensive.
    
        -  This commit caches the list of protected branches in memory, which
           reduces the number of database calls down to 1.
    
        -  A downside to this approach is that `#protected_branch?` _could_
           return a stale value (due to the caching), but this is
           an acceptable tradeoff.
    
    3. Remove the (now) unused `Project#protected_branch_names` method.
    
        - This was previously used to check for protected branch status.
    f51af496