From 628613e2ecf23695ce00841bbef9664c87dca4d2 Mon Sep 17 00:00:00 2001 From: Matej Marusak Date: Sep 18 2017 05:30:15 +0000 Subject: [PATCH 1/5] list_projects: Add missing filter options Pagure updated API to allow better filtering of projects, this commit updates libpagure accordingly. Signed-off-by: Matej Marusak --- diff --git a/libpagure/libpagure.py b/libpagure/libpagure.py index c1c9a47..3c84687 100644 --- a/libpagure/libpagure.py +++ b/libpagure/libpagure.py @@ -492,12 +492,22 @@ class Pagure(object): return return_value['tags'] - def list_projects(self, tags=None, username=None, fork=None): + def list_projects(self, tags=None, pattern=None, username=None, owner=None, + namespace=None, fork=None, short=None, page=None, + per_page=None): """ Lisk all projects on this Pagure instance. :param tags: filters the tags of the project + :param pattern: filters the projects by the pattern string :param username: filters the username of the project administrators + :param owner: filters the projects by ownership + :param namespace: filters the projects by namespace :param fork: filters whether it is a fork (True) or not (False) + :param short: whether to return the entrie JSON or just a sub-set + :param page: specifies that pagination should be turned on and that + this specific page should be displayed + :param per_page: the number of projects to return per page. + The maximum is 100 :return: """ request_url = "{}/api/0/projects".format(self.instance) @@ -505,10 +515,22 @@ class Pagure(object): payload = {} if tags is not None: payload['tags'] = tags + if pattern is not None: + payload['pattern'] = pattern if username is not None: payload['username'] = username + if owner is not None: + payload['owner'] = owner + if namespace is not None: + payload['namespace'] = namespace if fork is not None: payload['fork'] = fork + if short is not None: + payload['short'] = short + if page is not None: + payload['page'] = str(page) + if per_page is not None: + payload['per_page'] = str(per_page) return_value = self._call_api(request_url, params=payload) From 4f44691562bbd8ce4613fd254e019df6546b6d0c Mon Sep 17 00:00:00 2001 From: Matej Marusak Date: Sep 18 2017 05:30:45 +0000 Subject: [PATCH 2/5] Add support for listing repository branches Signed-off-by: Matej Marusak --- diff --git a/libpagure/libpagure.py b/libpagure/libpagure.py index 3c84687..8e45297 100644 --- a/libpagure/libpagure.py +++ b/libpagure/libpagure.py @@ -577,3 +577,19 @@ class Pagure(object): method='POST') return return_value['message'] + + def project_branches(self): + """ + List all branches associated with a repository. + :return: + """ + if self.username is None: + request_url = "{}/api/0/{}/git/branches".format( + self.instance, self.repo) + else: + request_url = "{}/api/0/fork/{}/{}/git/branches".format( + self.instance, self.username, self.repo) + + return_value = self._call_api(request_url) + + return return_value['branches'] From 3294b031d26b936cb9880b6638f3c52d2b70507d Mon Sep 17 00:00:00 2001 From: Matej Marusak Date: Sep 18 2017 13:20:02 +0000 Subject: [PATCH 3/5] Support namespaces Each repository can be prefixed with namespace. This commit make it possible to access such repositories. Signed-off-by: Matej Marusak --- diff --git a/libpagure/libpagure.py b/libpagure/libpagure.py index 8e45297..9522f9d 100644 --- a/libpagure/libpagure.py +++ b/libpagure/libpagure.py @@ -28,6 +28,7 @@ class Pagure(object): pagure_token=None, pagure_repository=None, fork_username=None, + namespace=None, instance_url="https://pagure.io", insecure=False): """ @@ -42,6 +43,7 @@ class Pagure(object): self.token = pagure_token self.repo = pagure_repository self.username = fork_username + self.namespace = namespace self.instance = instance_url self.session = requests.session() self.insecure = insecure @@ -85,9 +87,32 @@ class Pagure(object): LOG.error(output) if 'error_code' in output: raise APIError(output['error']) - return output + def create_basic_url(self): + """ Create URL prefix for API calls based on type of repo. + + Repo may be forked and may be in namespace. That makes total 4 + different types of URL. + + :return: + """ + if self.username is None: + if self.namespace is None: + request_url = "{}/api/0/{}/".format( + self.instance, self.repo) + else: + request_url = "{}/api/0/{}/{}/".format( + self.instance, self.namespace, self.repo) + else: + if self.namespace is None: + request_url = "{}/api/0/fork/{}/{}/".format( + self.instance, self.username, self.repo) + else: + request_url = "{}/api/0/fork/{}/{}/{}/".format( + self.instance, self.username, self.namespace, self.repo) + return request_url + def api_version(self): """ Get Pagure API version. @@ -116,12 +141,8 @@ class Pagure(object): :param pattern: filters the starting letters of the return value :return: """ - if self.username is None: - request_url = "{}/api/0/{}/tags".format( - self.instance, self.repo) - else: - request_url = "{}/api/0/fork/{}/{}/tags".format( - self.instance, self.username, self.repo) + request_url = "{}tags".format(self.create_basic_url()) + params = None if pattern: params = {'pattern': pattern} @@ -160,12 +181,8 @@ class Pagure(object): :param author: filters the author of the requests :return: """ - if self.username is None: - request_url = "{}/api/0/{}/pull-requests".format( - self.instance, self.repo) - else: - request_url = "{}/api/0/fork/{}/{}/pull-requests".format( - self.instance, self.username, self.repo) + request_url = "{}pull-requests".format(self.create_basic_url()) + payload = {} if status is not None: payload['status'] = status @@ -183,13 +200,8 @@ class Pagure(object): :param request_id: the id of the request :return: """ - if self.username is None: - request_url = "{}/api/0/{}/pull-request/{}".format( - self.instance, self.repo, request_id) - else: - request_url = "{}/api/0/fork/{}/{}/pull-request/{}".format( - self.instance, self.username, self.repo, - request_id) + request_url = "{}pull-request/{}".format(self.create_basic_url(), + request_id) return_value = self._call_api(request_url) return return_value @@ -200,13 +212,8 @@ class Pagure(object): :param request_id: the id of the request :return: """ - if self.username is None: - request_url = "{}/api/0/{}/pull-request/{}/merge".format( - self.instance, self.repo, request_id) - else: - request_url = "{}/api/0/fork/{}/{}/pull-request/{}/merge".format( - self.instance, self.username, self.repo, - request_id) + request_url = "{}pull-request/{}/merge".format(self.create_basic_url(), + request_id) return_value = self._call_api(request_url, method='POST') @@ -218,13 +225,8 @@ class Pagure(object): :param request_id: the id of the request :return: """ - if self.username is None: - request_url = "{}/api/0/{}/pull-request/{}/close".format( - self.instance, self.repo, request_id) - else: - request_url = "{}/api/0/fork/{}/{}/pull-request/{}/close".format( - self.instance, self.username, self.repo, - request_id) + request_url = "{}pull-request/{}/close".format(self.create_basic_url(), + request_id) return_value = self._call_api(request_url, method='POST') @@ -241,13 +243,8 @@ class Pagure(object): :param row: which line of code to comment on :return: """ - if self.username is None: - request_url = "{}/api/0/{}/pull-request/{}/comment".format( - self.instance, self.repo, request_id) - else: - request_url = "{}/api/0/fork/{}/{}/pull-request/{}/comment".format( - self.instance, self.username, self.repo, - request_id) + request_url = ("{}pull-request/{}/comment" + .format(self.create_basic_url(), request_id)) payload = {'comment': body} if commit is not None: @@ -276,13 +273,8 @@ class Pagure(object): :param commit: which commit to flag on :return: """ - if self.username is None: - request_url = "{}/api/0/{}/pull-request/{}/flag".format( - self.instance, self.repo, request_id) - else: - request_url = "{}/api/0/fork/{}/{}/pull-request/{}/flag".format( - self.instance, self.username, self.repo, - request_id) + request_url = "{}pull-request/{}/flag".format(self.create_basic_url(), + request_id) payload = {'username': username, 'percent': percent, 'comment': comment, 'url': url} @@ -304,12 +296,7 @@ class Pagure(object): :param private: whether create this issue as private :return: """ - if self.username is None: - request_url = "{}/api/0/{}/new_issue".format( - self.instance, self.repo) - else: - request_url = "{}/api/0/fork/{}/{}/new_issue".format( - self.instance, self.username, self.repo) + request_url = "{}new_issue".format(self.create_basic_url()) payload = {'title': title, 'issue_content': content} if private: @@ -340,12 +327,7 @@ class Pagure(object): Y-M-D :return: """ - if self.username is None: - request_url = "{}/api/0/{}/issues".format( - self.instance, self.repo) - else: - request_url = "{}/api/0/fork/{}/{}/issues".format( - self.instance, self.username, self.repo) + request_url = "{}issues".format(self.create_basic_url()) payload = {} if status is not None: @@ -375,13 +357,7 @@ class Pagure(object): :param issue_id: the id of the issue :return: """ - if self.username is None: - request_url = "{}/api/0/{}/issue/{}".format( - self.instance, self.repo, issue_id) - else: - request_url = "{}/api/0/fork/{}/{}/issue/{}".format( - self.instance, self.username, self.repo, - issue_id) + request_url = "{}issue/{}".format(self.create_basic_url(), issue_id) return_value = self._call_api(request_url) @@ -394,13 +370,8 @@ class Pagure(object): :param comment_id: the id of the comment :return: """ - if self.username is None: - request_url = "{}/api/0/{}/issue/{}/comment/{}".format( - self.instance, self.repo, issue_id, comment_id) - else: - request_url = "{}/api/0/fork/{}/{}/issue/{}/comment/{}".format( - self.instance, self.username, self.repo, - issue_id, comment_id) + request_url = "{}issue/{}/comment/{}".format(self.create_basic_url(), + issue_id, comment_id) return_value = self._call_api(request_url) @@ -415,13 +386,8 @@ class Pagure(object): has been closed (like wontfix, fixed, duplicate, ...) :return: """ - if self.username is None: - request_url = "{}/api/0/{}/issue/{}/status".format( - self.instance, self.repo, issue_id) - else: - request_url = "{}/api/0/fork/{}/{}/issue/{}/status".format( - self.instance, self.username, self.repo, - issue_id) + request_url = "{}issue/{}/status".format(self.create_basic_url(), + issue_id) payload = {'status': new_status} if close_status is not None: @@ -440,12 +406,8 @@ class Pagure(object): (set None to remove milestone) :return: """ - if self.username is None: - request_url = "{}/api/0/{}/issue/{}/milestone".format( - self.instance, self.repo, issue_id) - else: - request_url = "{}/api/0/fork/{}/{}/issue/{}/milestone".format( - self.instance, self.username, self.repo, issue_id) + request_url = "{}issue/{}/milestone".format(self.create_basic_url(), + issue_id) payload = {} if milestone is None else {'milestone': milestone} @@ -461,13 +423,8 @@ class Pagure(object): :param body: the comment body :return: """ - if self.username is None: - request_url = "{}/api/0/{}/issue/{}/comment".format( - self.instance, self.repo, issue_id) - else: - request_url = "{}/api/0/fork/{}/{}/issue/{}/comment".format( - self.instance, self.username, self.repo, - issue_id) + request_url = "{}issue/{}/comment".format(self.create_basic_url(), + issue_id) payload = {'comment': body} @@ -481,12 +438,7 @@ class Pagure(object): List all git tags made to the project. :return: """ - if self.username is None: - request_url = "{}/api/0/{}/git/tags".format( - self.instance, self.repo) - else: - request_url = "{}/api/0/fork/{}/{}/git/tags".format( - self.instance, self.username, self.repo) + request_url = "{}git/tags".format(self.create_basic_url()) return_value = self._call_api(request_url) @@ -583,12 +535,7 @@ class Pagure(object): List all branches associated with a repository. :return: """ - if self.username is None: - request_url = "{}/api/0/{}/git/branches".format( - self.instance, self.repo) - else: - request_url = "{}/api/0/fork/{}/{}/git/branches".format( - self.instance, self.username, self.repo) + request_url = "{}git/branches".format(self.create_basic_url()) return_value = self._call_api(request_url) From d95bd999ff343533e8e25f34cbef5019f4579b20 Mon Sep 17 00:00:00 2001 From: Matej Marusak Date: Sep 18 2017 13:20:02 +0000 Subject: [PATCH 4/5] new_project: Enable creating private repos Signed-off-by: Matej Marusak --- diff --git a/libpagure/libpagure.py b/libpagure/libpagure.py index 9522f9d..01e97d7 100644 --- a/libpagure/libpagure.py +++ b/libpagure/libpagure.py @@ -501,7 +501,7 @@ class Pagure(object): return return_value def new_project(self, name, description, namespace=None, url=None, - avatar_email=None, create_readme=False): + avatar_email=None, create_readme=False, private=False): """ Create a new project on the pagure instance :param name: the name of the new project. @@ -511,6 +511,7 @@ class Pagure(object): :param avatar_email: An email address for the avatar of the project. :param create_readme: Boolean to specify if there should be a readme added to the project on creation. + :param private: boolean to specify if the project is private :return: """ request_url = "{}/api/0/new".format(self.instance) @@ -524,6 +525,7 @@ class Pagure(object): payload['avatar_email'] = avatar_email if create_readme is not None: payload['create_readme'] = create_readme + payload['private'] = private return_value = self._call_api(request_url, data=payload, method='POST') From 8d897756f3bbc7141708aa996fc3febf37cf3687 Mon Sep 17 00:00:00 2001 From: Matej Marusak Date: Sep 18 2017 13:20:02 +0000 Subject: [PATCH 5/5] new_project: create_readme is never None Signed-off-by: Matej Marusak --- diff --git a/libpagure/libpagure.py b/libpagure/libpagure.py index 01e97d7..e883b11 100644 --- a/libpagure/libpagure.py +++ b/libpagure/libpagure.py @@ -523,8 +523,7 @@ class Pagure(object): payload['url'] = url if avatar_email is not None: payload['avatar_email'] = avatar_email - if create_readme is not None: - payload['create_readme'] = create_readme + payload['create_readme'] = create_readme payload['private'] = private return_value = self._call_api(request_url, data=payload,