Skip to content

Commit 0379efa

Browse files
author
Gauvain Pocentek
committed
Support group and global MR listing
Closes #553
1 parent 3461904 commit 0379efa

File tree

3 files changed

+70
-2
lines changed

3 files changed

+70
-2
lines changed

docs/gl_objects/mrs.rst

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,48 @@ Merge requests
55
You can use merge requests to notify a project that a branch is ready for
66
merging. The owner of the target projet can accept the merge request.
77

8+
Merge requests are linked to projects, but they can be listed globally or for
9+
groups.
10+
11+
Group and global listing
12+
========================
13+
14+
Reference
15+
---------
16+
17+
* v4 API:
18+
19+
+ :class:`gitlab.v4.objects.GroupMergeRequest`
20+
+ :class:`gitlab.v4.objects.GroupMergeRequestManager`
21+
+ :attr:`gitlab.v4.objects.Group.mergerequests`
22+
+ :class:`gitlab.v4.objects.MergeRequest`
23+
+ :class:`gitlab.v4.objects.MergeRequestManager`
24+
+ :attr:`gitlab.Gtilab.mergerequests`
25+
26+
* GitLab API: https://docs.gitlab.com/ce/api/merge_requests.html
27+
28+
Examples
29+
--------
30+
31+
List the merge requests available on the GitLab server::
32+
33+
mrs = gl.mergerequests.list()
34+
35+
List the merge requests for a group::
36+
37+
group = gl.groups.get('mygroup')
38+
mrs = group.mergerequests.list()
39+
40+
To edit or delete a merge request, create a ``ProjectMergeRequest`` object
41+
first::
42+
43+
mr = group.mergerequests.list()[0] # pick the first MR
44+
project = gl.projects.get(mr.project_id, lazy=True)
45+
editable_mr = project.mergerequests.get(mr.iid)
46+
47+
Project merge requests
48+
======================
49+
850
Reference
951
---------
1052

gitlab/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ def __init__(self, url, private_token=None, oauth_token=None, email=None,
114114
self.ldapgroups = objects.LDAPGroupManager(self)
115115
self.licenses = objects.LicenseManager(self)
116116
self.namespaces = objects.NamespaceManager(self)
117+
self.mergerequests = objects.MergeRequestManager(self)
117118
self.notificationsettings = objects.NotificationSettingsManager(self)
118119
self.projects = objects.ProjectManager(self)
119120
self.runners = objects.RunnerManager(self)

gitlab/v4/objects.py

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -710,8 +710,16 @@ class GroupMergeRequest(RESTObject):
710710
pass
711711

712712

713-
class GroupMergeRequestManager(RESTManager):
714-
pass
713+
class GroupMergeRequestManager(ListMixin, RESTManager):
714+
_path = '/groups/%(group_id)s/merge_requests'
715+
_obj_cls = GroupMergeRequest
716+
_from_parent_attrs = {'group_id': 'id'}
717+
_list_filters = ('state', 'order_by', 'sort', 'milestone', 'view',
718+
'labels', 'created_after', 'created_before',
719+
'updated_after', 'updated_before', 'scope', 'author_id',
720+
'assignee_id', 'my_reaction_emoji', 'source_branch',
721+
'target_branch', 'search')
722+
_types = {'labels': types.ListAttribute}
715723

716724

717725
class GroupMilestone(SaveMixin, ObjectDeleteMixin, RESTObject):
@@ -842,6 +850,7 @@ class Group(SaveMixin, ObjectDeleteMixin, RESTObject):
842850
('epics', 'GroupEpicManager'),
843851
('issues', 'GroupIssueManager'),
844852
('members', 'GroupMemberManager'),
853+
('mergerequests', 'GroupMergeRequestManager'),
845854
('milestones', 'GroupMilestoneManager'),
846855
('notificationsettings', 'GroupNotificationSettingsManager'),
847856
('projects', 'GroupProjectManager'),
@@ -1040,6 +1049,22 @@ class LicenseManager(RetrieveMixin, RESTManager):
10401049
_optional_get_attrs = ('project', 'fullname')
10411050

10421051

1052+
class MergeRequest(RESTObject):
1053+
pass
1054+
1055+
1056+
class MergeRequestManager(ListMixin, RESTManager):
1057+
_path = '/merge_requests'
1058+
_obj_cls = MergeRequest
1059+
_from_parent_attrs = {'group_id': 'id'}
1060+
_list_filters = ('state', 'order_by', 'sort', 'milestone', 'view',
1061+
'labels', 'created_after', 'created_before',
1062+
'updated_after', 'updated_before', 'scope', 'author_id',
1063+
'assignee_id', 'my_reaction_emoji', 'source_branch',
1064+
'target_branch', 'search')
1065+
_types = {'labels': types.ListAttribute}
1066+
1067+
10431068
class Snippet(UserAgentDetailMixin, SaveMixin, ObjectDeleteMixin, RESTObject):
10441069
_short_print_attr = 'title'
10451070

0 commit comments

Comments
 (0)