sigmavirus24 / github3.py

Hi, I'm a library for interacting with GItHub's REST API in a convenient and ergonomic way. I work on Python 3.6+.
https://github3.readthedocs.io
BSD 3-Clause "New" or "Revised" License
1.21k stars 402 forks source link

unable to update branch_protections for github repos #1112

Open ecatmur opened 1 year ago

ecatmur commented 1 year ago

https://github.com/integrations/terraform-provider-github/issues/1147 https://github.com/google/go-github/issues/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})
sigmavirus24 commented 1 year ago

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