Skip to content

Commit 44ef603

Browse files
committed
fix: use keyset pagination by default for /projects > 50000
Workaround for https://gitlab.com/gitlab-org/gitlab/-/issues/218504. Remove this in 13.1
1 parent ef6181b commit 44ef603

File tree

1 file changed

+16
-4
lines changed

1 file changed

+16
-4
lines changed

gitlab/__init__.py

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,12 @@
1616
# along with this program. If not, see <http://www.gnu.org/licenses/>.
1717
"""Wrapper for the GitLab API."""
1818

19-
from __future__ import print_function
20-
from __future__ import absolute_import
2119
import importlib
2220
import time
2321
import warnings
2422

2523
import requests
24+
import requests.utils
2625

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

45+
ALLOWED_KEYSET_ENDPOINTS = ["/projects"]
46+
4647

4748
def _sanitize(value):
4849
if isinstance(value, dict):
@@ -618,7 +619,7 @@ def http_list(self, path, query_data=None, as_list=None, **kwargs):
618619
619620
Args:
620621
path (str): Path or full URL to query ('/projects' or
621-
'http://whatever/v4/api/projecs')
622+
'http://whatever/v4/api/projects')
622623
query_data (dict): Data to send as query parameters
623624
**kwargs: Extra options to send to the server (e.g. sudo, page,
624625
per_page)
@@ -642,6 +643,12 @@ def http_list(self, path, query_data=None, as_list=None, **kwargs):
642643
get_all = kwargs.pop("all", False)
643644
url = self._build_url(path)
644645

646+
# use keyset pagination automatically, if all=True
647+
order_by = kwargs.get("order_by")
648+
if path in ALLOWED_KEYSET_ENDPOINTS and (not order_by or order_by == "id"):
649+
kwargs["pagination"] = "keyset"
650+
kwargs["order_by"] = "id"
651+
645652
if get_all is True and as_list is True:
646653
return list(GitlabList(self, url, query_data, **kwargs))
647654

@@ -781,7 +788,12 @@ def _query(self, url, query_data=None, **kwargs):
781788
query_data = query_data or {}
782789
result = self._gl.http_request("get", url, query_data=query_data, **kwargs)
783790
try:
784-
self._next_url = result.links["next"]["url"]
791+
links = result.links
792+
if links:
793+
next_url = links["next"]["url"]
794+
else:
795+
next_url = requests.utils.parse_header_links(result.headers["links"])[0]["url"]
796+
self._next_url = next_url
785797
except KeyError:
786798
self._next_url = None
787799
self._current_page = result.headers.get("X-Page")

0 commit comments

Comments
 (0)