Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow --review-pr-filter to override the criteria in find_related_easyconfigs #4388

Draft
wants to merge 2 commits into
base: develop
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
58 changes: 32 additions & 26 deletions easybuild/framework/easyconfig/tools.py
Original file line number Diff line number Diff line change
Expand Up @@ -434,7 +434,7 @@ def stats_to_str(stats, isyeb=False):
return txt


def find_related_easyconfigs(path, ec):
def find_related_easyconfigs(path, ec, filter_related_ecs=None):
"""
Find related easyconfigs for provided parsed easyconfig in specified path.

Expand Down Expand Up @@ -467,25 +467,30 @@ def find_related_easyconfigs(path, ec):
potential_paths = sorted(sum(potential_paths, []), reverse=True) # flatten
_log.debug("found these potential paths: %s" % potential_paths)

parsed_version = LooseVersion(version).version
version_patterns = [version] # exact version match
if len(parsed_version) >= 2:
version_patterns.append(r'%s\.%s\.\w+' % tuple(parsed_version[:2])) # major/minor version match
if parsed_version != parsed_version[0]:
version_patterns.append(r'%s\.[\d-]+\.\w+' % parsed_version[0]) # major version match
version_patterns.append(r'[\w.]+') # any version

regexes = []
for version_pattern in version_patterns:
common_pattern = r'^\S+/%s-%s%%s\.eb$' % (re.escape(name), version_pattern)
regexes.extend([
common_pattern % (toolchain_pattern + versionsuffix),
common_pattern % (toolchain_name_pattern + versionsuffix),
common_pattern % (r'\S*%s' % versionsuffix),
common_pattern % toolchain_pattern,
common_pattern % toolchain_name_pattern,
common_pattern % r'\S*',
])
if filter_related_ecs is not None and filter_related_ecs.pattern.startswith('full:'):
_log.debug("'full:' was specified in --review-pr-filter, ignoring predefined criteria and "
"using only the supplied pattern to find related easyconfigs")
regexes = [r'^\S+/%s-\S*%s\S*\.eb$' % (re.escape(name), str(filter_related_ecs.pattern)[5:])]
else:
parsed_version = LooseVersion(version).version
version_patterns = [version] # exact version match
if len(parsed_version) >= 2:
version_patterns.append(r'%s\.%s\.\w+' % tuple(parsed_version[:2])) # major/minor version match
if parsed_version != parsed_version[0]:
version_patterns.append(r'%s\.[\d-]+(\.\w+)*' % parsed_version[0]) # major version match
version_patterns.append(r'[\w.]+') # any version

regexes = []
for version_pattern in version_patterns:
common_pattern = r'^\S+/%s-%s%%s\.eb$' % (re.escape(name), version_pattern)
regexes.extend([
common_pattern % (toolchain_pattern + versionsuffix),
common_pattern % (toolchain_name_pattern + versionsuffix),
common_pattern % (r'\S*%s' % versionsuffix),
common_pattern % toolchain_pattern,
common_pattern % toolchain_name_pattern,
common_pattern % r'\S*',
])

for regex in regexes:
res = [p for p in potential_paths if re.match(regex, p)]
Expand All @@ -498,7 +503,8 @@ def find_related_easyconfigs(path, ec):
return res


def review_pr(paths=None, pr=None, colored=True, branch='develop', testing=False, max_ecs=None, filter_ecs=None):
def review_pr(paths=None, pr=None, colored=True, branch='develop', testing=False,
max_related_ecs=None, filter_related_ecs=None):
"""
Print multi-diff overview between specified easyconfigs or PR and specified branch.
:param pr: pull request number in easybuild-easyconfigs repo to review
Expand Down Expand Up @@ -526,17 +532,17 @@ def review_pr(paths=None, pr=None, colored=True, branch='develop', testing=False
lines = []
ecs, _ = parse_easyconfigs([(fp, False) for fp in pr_files], validate=False)
for ec in ecs:
files = find_related_easyconfigs(repo_path, ec['ec'])
files = find_related_easyconfigs(repo_path, ec['ec'], filter_related_ecs)
if pr:
pr_msg = "PR#%s" % pr
else:
pr_msg = "new PR"
_log.debug("File in %s %s has these related easyconfigs: %s" % (pr_msg, ec['spec'], files))
if files:
if filter_ecs is not None:
files = [x for x in files if filter_ecs.search(x)]
if max_ecs is not None:
files = files[:max_ecs]
if filter_related_ecs is not None and not filter_related_ecs.pattern.startswith('full:'):
files = [x for x in files if filter_related_ecs.search(os.path.basename(x))]
if max_related_ecs is not None:
files = files[:max_related_ecs]
lines.append(multidiff(ec['spec'], files, colored=colored))
else:
lines.extend(['', "(no related easyconfigs found for %s)\n" % os.path.basename(ec['spec'])])
Expand Down
2 changes: 1 addition & 1 deletion easybuild/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -653,7 +653,7 @@ def main(args=None, logfile=None, do_build=None, testing=False, modtool=None, pr

elif options.review_pr:
print(review_pr(pr=options.review_pr, colored=use_color(options.color), testing=testing,
max_ecs=options.review_pr_max, filter_ecs=options.review_pr_filter))
max_related_ecs=options.review_pr_max, filter_related_ecs=options.review_pr_filter))

elif options.add_pr_labels:
add_pr_labels(options.add_pr_labels)
Expand Down