Skip to content

Commit

Permalink
fix: use keyset pagination by default for /projects > 50000
Browse files Browse the repository at this point in the history
Workaround for https://gitlab.com/gitlab-org/gitlab/-/issues/218504.
Remove this in 13.1
  • Loading branch information
max-wittig committed Jun 8, 2020
1 parent ef6181b commit f86ef3b
Showing 1 changed file with 25 additions and 5 deletions.
30 changes: 25 additions & 5 deletions gitlab/__init__.py
Expand Up @@ -16,13 +16,12 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""Wrapper for the GitLab API."""

from __future__ import print_function
from __future__ import absolute_import
import importlib
import time
import warnings

import requests
import requests.utils

import gitlab.config
from gitlab.const import * # noqa
Expand All @@ -43,6 +42,8 @@
"must update your GitLab URL to use https:// to avoid issues."
)

ALLOWED_KEYSET_ENDPOINTS = ["/projects"]


def _sanitize(value):
if isinstance(value, dict):
Expand Down Expand Up @@ -618,7 +619,7 @@ def http_list(self, path, query_data=None, as_list=None, **kwargs):
Args:
path (str): Path or full URL to query ('/projects' or
'http://whatever/v4/api/projecs')
'http://whatever/v4/api/projects')
query_data (dict): Data to send as query parameters
**kwargs: Extra options to send to the server (e.g. sudo, page,
per_page)
Expand All @@ -642,10 +643,22 @@ def http_list(self, path, query_data=None, as_list=None, **kwargs):
get_all = kwargs.pop("all", False)
url = self._build_url(path)

order_by = kwargs.get("order_by")
pagination = kwargs.get("pagination")
page = kwargs.get("page")
if (
path in ALLOWED_KEYSET_ENDPOINTS
and (not order_by or order_by == "id")
and (not pagination or pagination == "keyset")
and not page
):
kwargs["pagination"] = "keyset"
kwargs["order_by"] = "id"

if get_all is True and as_list is True:
return list(GitlabList(self, url, query_data, **kwargs))

if "page" in kwargs or as_list is True:
if page or as_list is True:
# pagination requested, we return a list
return list(GitlabList(self, url, query_data, get_next=False, **kwargs))

Expand Down Expand Up @@ -781,7 +794,14 @@ def _query(self, url, query_data=None, **kwargs):
query_data = query_data or {}
result = self._gl.http_request("get", url, query_data=query_data, **kwargs)
try:
self._next_url = result.links["next"]["url"]
links = result.links
if links:
next_url = links["next"]["url"]
else:
next_url = requests.utils.parse_header_links(result.headers["links"])[
0
]["url"]
self._next_url = next_url
except KeyError:
self._next_url = None
self._current_page = result.headers.get("X-Page")
Expand Down

0 comments on commit f86ef3b

Please sign in to comment.