From a3f3fadffe6babe087f7f2274b3563c16705df15 Mon Sep 17 00:00:00 2001 From: Haikel Guemar Date: Oct 10 2017 07:15:51 +0000 Subject: Add create-issue command Resolves #17 --- diff --git a/pag/app.py b/pag/app.py index 4e5f9b1..2134a4b 100644 --- a/pag/app.py +++ b/pag/app.py @@ -33,6 +33,7 @@ __all__ = [ ] from .commands import create +from .commands import createissue from .commands import clone from .commands import fork from .commands import remote diff --git a/pag/client.py b/pag/client.py index b5504f5..6d989b5 100644 --- a/pag/client.py +++ b/pag/client.py @@ -1,3 +1,5 @@ +import re + import bs4 import fedora.client @@ -54,6 +56,39 @@ class Pagure(fedora.client.OpenIdBaseClient): response, data)) return repo_url(name) + def create_issue(self, repo, title, description, private=False): + if not self.is_logged_in: + raise PagureException('Not logged in.') + + url = self.base_url + '/' + repo + '/new_issue' + response = self._session.get(url) + if not bool(response): + raise PagureException("Couldn't get form to get " + "csrf token %r" % response) + + soup = bs4.BeautifulSoup(response.text, "html.parser") + data = { + 'csrf_token' : soup.find(id='csrf_token').attrs['value'], + 'title': title, + 'issue_content': description, + 'private': private + } + + response = self._session.post(url, data=data) + if not bool(response): + del data['csrf_token'] + raise PagureException('Bad status code from pagure when ' + 'forking project: %r. Sent %r' % ( + response, data)) + + soup = bs4.BeautifulSoup(response.text, "html.parser") + response_title = soup.title.string + match = re.match(r'Issue #(?P\d+):.*', response_title) + issue_id = match.group('issue_id') + issue_url = self.base_url + '/' + repo + '/issue/' + issue_id + return issue_url + + def fork(self, name): if not self.is_logged_in: raise PagureException('Not logged in.') diff --git a/pag/commands/createissue.py b/pag/commands/createissue.py new file mode 100644 index 0000000..b0a074a --- /dev/null +++ b/pag/commands/createissue.py @@ -0,0 +1,28 @@ +import getpass + +import click + +from pag.app import app +from pag.utils import ( + configured, + assert_local_repo, + in_git_repo +) +from pag.client import client + +@app.command('create-issue') +@click.option('-t', '--title', prompt=True) +@click.option('-d', '--description', prompt=True) +@click.option('-p', '--private', is_flag=True) +@configured +@assert_local_repo +def createissue(conf, title, description, private): + name = in_git_repo() + + click.echo("Trying to create issue for %r in pagure.io" % name) + if not client.is_logged_in: + password = getpass.getpass("Fas password for %r" % conf['username']) + client.login(username=conf['username'], password=password) + + message = client.create_issue(name, title, description, private) + click.echo("Created issue %s" % message)