Skip to content
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
caf382a
initial support for --list-prs
migueldiascosta Feb 12, 2018
97264cd
use GITHUB_MAX_PER_PAGE in list_prs
migueldiascosta Feb 12, 2018
e417d6d
add separate state, sort and direction options in list_prs
migueldiascosta Feb 12, 2018
4760cd7
use choice options for state, sort and direction in list_prs
migueldiascosta Feb 13, 2018
386c8d0
remove whitespace
migueldiascosta Feb 13, 2018
b0672d9
add 'all' to github_list_pr_states
migueldiascosta Feb 14, 2018
2011af5
add test for list_prs
migueldiascosta Feb 14, 2018
4bca96d
ammend list_prs docstring
migueldiascosta Mar 20, 2018
1120e8a
define constants for github list pr states, orders and directions
migueldiascosta Mar 20, 2018
2a5daf0
consolidate --list-prs options
migueldiascosta Mar 20, 2018
6e91f57
pass options to list_prs and unpack there
migueldiascosta Mar 21, 2018
d5f38b7
use constants for default values in list_prs
migueldiascosta Mar 21, 2018
d430ec0
fix typo in comment
migueldiascosta Apr 4, 2018
6c2ba90
use constants for open/created/desc + mention incorrect value in erro…
boegel Nov 19, 2018
a8475bb
Merge pull request #2 from boegel/list_prs
migueldiascosta Nov 20, 2018
ceb3e42
sync with develop
migueldiascosta Nov 20, 2018
dcb0be2
appease the Hound
boegel Nov 20, 2018
4ece0b2
Merge pull request #3 from boegel/list_prs
migueldiascosta Nov 21, 2018
f08ca16
add test_list_prs to test.framework.options
migueldiascosta Nov 21, 2018
11e8630
ensure ordered output in message printed by --list-prs, drop unused G…
boegel Nov 21, 2018
ced495c
Merge pull request #4 from boegel/list_prs
migueldiascosta Nov 22, 2018
73df71c
remove trailing whitespace
migueldiascosta Nov 22, 2018
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion easybuild/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@
from easybuild.tools.docs import list_software
from easybuild.tools.filetools import adjust_permissions, cleanup, write_file
from easybuild.tools.github import check_github, find_easybuild_easyconfig, install_github_token
from easybuild.tools.github import new_pr, merge_pr, update_pr
from easybuild.tools.github import list_prs, new_pr, merge_pr, update_pr
from easybuild.tools.hooks import START, END, load_hooks, run_hook
from easybuild.tools.modules import modules_tool
from easybuild.tools.options import parse_external_modules_metadata, process_software_build_specs, use_color
Expand Down Expand Up @@ -284,6 +284,14 @@ def main(args=None, logfile=None, do_build=None, testing=False, modtool=None):
elif options.install_github_token:
install_github_token(options.github_user, silent=build_option('silent'))

elif options.list_prs:
parameters = {
'direction': options.list_prs_direction,
'sort': options.list_prs_order,
'state': options.list_prs_state,
}
print list_prs(parameters)

elif options.merge_pr:
merge_pr(options.merge_pr)

Expand All @@ -303,6 +311,7 @@ def main(args=None, logfile=None, do_build=None, testing=False, modtool=None):
options.install_github_token,
options.list_installed_software,
options.list_software,
options.list_prs,
options.merge_pr,
options.review_pr,
options.terse,
Expand Down
26 changes: 26 additions & 0 deletions easybuild/tools/github.py
Original file line number Diff line number Diff line change
Expand Up @@ -958,6 +958,32 @@ def not_eligible(msg):
return res


def list_prs(parameters):
"""
List PRs

:param parameters: Selection parameters for PRs, see https://developer.github.com/v3/pulls/#parameters
"""

if 'per_page' not in parameters:
parameters.update({'per_page': GITHUB_MAX_PER_PAGE})

pr_target_account = build_option('pr_target_account')
pr_target_repo = build_option('pr_target_repo')

pr_url = lambda g: g.repos[pr_target_account][pr_target_repo].pulls
status, pr_data = github_api_get_request(pr_url, None, **parameters)
if status != HTTP_STATUS_OK:
raise EasyBuildError("Failed to get PR data from %s/%s (parameters: %s, status: %d %s)",
pr_target_account, pr_target_repo, parameters, status, pr_data)

lines = []
for pr in pr_data:
lines.append("PR #%s: %s" % (pr['number'], pr['title']))

return '\n'.join(lines)


def merge_pr(pr):
"""
Merge specified pull request
Expand Down
8 changes: 8 additions & 0 deletions easybuild/tools/options.py
Original file line number Diff line number Diff line change
Expand Up @@ -550,6 +550,10 @@ def informative_options(self):

def github_options(self):
"""GitHub integration configuration options."""
github_list_pr_states = ['open', 'closed', 'all']
github_list_pr_orders = ['created', 'updated', 'popularity', 'long-running']
github_list_pr_directions = ['asc', 'desc']

descr = ("GitHub integration options", "Integration with GitHub")

opts = OrderedDict({
Expand All @@ -562,6 +566,10 @@ def github_options(self):
'github-user': ("GitHub username", str, 'store', None),
'github-org': ("GitHub organization", str, 'store', None),
'install-github-token': ("Install GitHub token (requires --github-user)", None, 'store_true', False),
'list-prs': ("List pull requests", None, 'store_true', None),
'list-prs-state': ("State for listing pull requests", 'choice', 'store', 'open', github_list_pr_states),
'list-prs-order': ("Order for sorting pull requests", 'choice', 'store', 'created', github_list_pr_orders),
'list-prs-direction': ("Direction for sorting pull requests", 'choice', 'store', 'desc', github_list_pr_directions),
'merge-pr': ("Merge pull request", int, 'store', None, {'metavar': 'PR#'}),
'new-pr': ("Open a new pull request", None, 'store_true', False),
'pr-branch-name': ("Branch name to use for new PRs; '<timestamp>_new_pr_<name><version>' if unspecified",
Expand Down
19 changes: 19 additions & 0 deletions test/framework/github.py
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,25 @@ def test_read(self):
except (IOError, OSError):
pass

def test_list_prs(self):
"""Test fetch_easyconfigs_from_pr function."""
if self.github_token is None:
print "Skipping test_list_prs, no GitHub token available?"
return

parameters = {'state': 'closed', 'sort': 'created', 'direction': 'asc', 'per_page': 1}

init_config(build_options={'pr_target_account': GITHUB_USER,
'pr_target_repo': GITHUB_REPO})

expected = "PR #1: a pr"

try:
output = gh.list_prs(parameters)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Given all the parsing magic we have, I would test --list-prs directly via a test in test/framework/options.py?

self.assertEqual(expected, output)
except Exception as err:
print err

def test_fetch_easyconfigs_from_pr(self):
"""Test fetch_easyconfigs_from_pr function."""
if self.github_token is None:
Expand Down