sigmavirus24/github3.py

unable to update branch_protections for github repos

ecatmur opened this issue · 1 comments

integrations/terraform-provider-github#1147
google/go-github#2274

Apparently github changed API to deprecate "contexts" and replace it with "checks".

image

However they return both in query and error on update if both are present (nb. anonymized):

Traceback (most recent call last):
  File "main.py", line 64, in <module>
    gh_branch.protection().update(enforce_admins=False)
  File "env/lib/python3.10/site-packages/github3/decorators.py", line 24, in auth_wrapper
    return func(self, *args, **kwargs)
  File "env/lib/python3.10/site-packages/github3/repos/branch.py", line 465, in update
    json = self._json(self._put(self._api, json=edit), 200)
  File "env/lib/python3.10/site-packages/github3/models.py", line 161, in _json
    raise exceptions.error_for(response)
github3.exceptions.UnprocessableEntity: 422 Invalid request.

No subschema in "anyOf" matched.
More than one subschema in "oneOf" matched.
Not all subschemas of "allOf" matched.
For 'anyOf/1', {"url"=>"https://.../branches/master/protection/required_status_checks", "strict"=>true, "contexts"=>["my ci check"], "contexts_url"=>"https://.../branches/master/protection/required_status_checks/contexts", "checks"=>[{"context"=>"my ci check", "app_id"=>nil}]} is not a null.

Our workaround is when making updates to other parameters, to pass in the retrieved required_status_checks with the extra "checks" field stripped, e.g. (yes we should do this with as_dict(), I was in a rush):

    - gh_branch.protection().update(enforce_admins=False)
    + checks = gh_branch.protection().required_status_checks.contexts()
    + gh_branch.protection().update(enforce_admins=False, required_status_checks={"strict": True, "contexts": checks})

Would be happy to review a pull request fixing this. Would be happier if the backwards compatibility of GitHub's API wasn't a blatant lie