ci,marge_queue: encapsulate GitLab module queries

For testing and an eventual use of tenacity, it is practical to encapsulate
calls to the GitLab module in methods.

Signed-off-by: Sergi Blanch Torne <sergi.blanch.torne@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/37395>
This commit is contained in:
Sergi Blanch Torne 2025-09-15 22:08:20 +02:00 committed by Marge Bot
parent e2acf0934b
commit b80a93dac0

View file

@ -18,6 +18,7 @@ from dateutil import parser
from typing import Optional from typing import Optional
import gitlab import gitlab
from gitlab.base import RESTObjectList
from gitlab.v4.objects import Project, ProjectMergeRequest from gitlab.v4.objects import Project, ProjectMergeRequest
from gitlab_common import read_token, pretty_duration from gitlab_common import read_token, pretty_duration
@ -56,11 +57,7 @@ class MargeMergeRequest:
self.assigned_at = self.__find_last_assign_to_marge() self.assigned_at = self.__find_last_assign_to_marge()
def __find_last_assign_to_marge(self) -> Optional[datetime]: def __find_last_assign_to_marge(self) -> Optional[datetime]:
for note in self.mr.notes.list( for note in self.__get_mr_notes_iterator():
iterator=True,
order_by="updated_at",
sort="desc"
): # start with the most recent
if note.body.startswith(ASSIGNED_TO_MARGE): if note.body.startswith(ASSIGNED_TO_MARGE):
return parser.parse(note.created_at) return parser.parse(note.created_at)
@ -81,6 +78,11 @@ class MargeMergeRequest:
def title(self) -> str: def title(self) -> str:
return self.mr.title return self.mr.title
def __get_mr_notes_iterator(self) -> RESTObjectList:
return self.mr.notes.list(
iterator=True, order_by="updated_at", sort="desc"
) # start with the most recent
@dataclass @dataclass
class MargeQueue: class MargeQueue:
@ -126,12 +128,7 @@ class MargeQueue:
def get_merge_queue(project: Project) -> MargeQueue: def get_merge_queue(project: Project) -> MargeQueue:
queue = MargeQueue() queue = MargeQueue()
for mr in project.mergerequests.list( for mr in __get_project_marge_merge_requests(project):
assignee_id=MARGE_BOT_USER_ID,
scope="all",
state="opened",
get_all=True,
):
marge_merge_request = MargeMergeRequest(mr) marge_merge_request = MargeMergeRequest(mr)
queue.append(marge_merge_request) queue.append(marge_merge_request)
for mr in queue.sorted_queue: for mr in queue.sorted_queue:
@ -152,12 +149,31 @@ def get_merge_queue(project: Project) -> MargeQueue:
return queue return queue
def __get_gitlab_object(token: str) -> gitlab.Gitlab:
return gitlab.Gitlab(url="https://gitlab.freedesktop.org", private_token=token, retry_transient_errors=True)
def __get_gitlab_project(gl: gitlab.Gitlab) -> Project:
return gl.projects.get("mesa/mesa")
def __get_project_marge_merge_requests(
project: Project
) -> list[ProjectMergeRequest]:
return project.mergerequests.list(
assignee_id=MARGE_BOT_USER_ID,
scope="all",
state="opened",
get_all=True,
)
def main(): def main():
args = parse_args() args = parse_args()
token = read_token(args.token) token = read_token(args.token)
gl = gitlab.Gitlab(url="https://gitlab.freedesktop.org", private_token=token, retry_transient_errors=True) gl = __get_gitlab_object(token)
project = gl.projects.get("mesa/mesa") project = __get_gitlab_project(gl)
while True: while True:
n_mrs = get_merge_queue(project).n_merge_requests_enqueued n_mrs = get_merge_queue(project).n_merge_requests_enqueued