Skip to content
Merged
25 changes: 22 additions & 3 deletions easybuild/tools/modules.py
Original file line number Diff line number Diff line change
Expand Up @@ -547,6 +547,7 @@ def mod_exists_via_show(mod_name):

:param mod_name: module name
"""
self.log.info("Checking whether %s exists based on output of 'module show", mod_name)
stderr = self.show(mod_name)
res = False
# Parse the output:
Expand All @@ -555,13 +556,26 @@ def mod_exists_via_show(mod_name):
# - Check first non-whitespace line for something that looks like an absolute path terminated by a colon
mod_exists_regex = r'\s*/.+:\s*'
for line in stderr.split('\n'):
# skip whitespace lines
self.log.debug("Checking line '%s' to determine whether %s exists...", line)
if OUTPUT_MATCHES['whitespace'].search(line):
self.log.debug("Treating line '%s' as whitespace, so skipping it", line)
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

isn't this overly verbose, even for debugging?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

It helped a lot with figuring out the problem reported in #3376, so no.

continue

# if any errors occured, conclude that module doesn't exist
if OUTPUT_MATCHES['error'].search(line):
break
if re.match(mod_exists_regex, line):
res = True

# skip lines that start with 'module-' (like 'module-version'),
# see https://github.com/easybuilders/easybuild-framework/issues/3376
if line.startswith('module- '):
self.log.debug("Skipping line '%s' since it starts with 'module-version'", line)
Comment thread
boegel marked this conversation as resolved.
Outdated
continue

# if line matches pattern that indicates an existing module file, the module file exists
res = bool(re.match(mod_exists_regex, line))
break

return res

if skip_avail:
Expand All @@ -577,10 +591,15 @@ def mod_exists_via_show(mod_name):

mods_exist = []
for (mod_name, visible) in mod_names:
self.log.info("Checking whether %s exists...", mod_name)
if visible:
mod_exists = mod_name in avail_mod_names
# module name may be partial, so also check via 'module show' as fallback
if not mod_exists and maybe_partial:
if mod_exists:
self.log.info("Module %s exists (found in list of available modules)", mod_name)
elif not mod_exists and maybe_partial:
Comment thread
boegel marked this conversation as resolved.
Outdated
self.log.info("Module %s not found in list of available modules, checking via 'module show'...",
Comment thread
boegel marked this conversation as resolved.
mod_name)
mod_exists = mod_exists_via_show(mod_name)
else:
# hidden modules are not visible in 'avail', need to use 'show' instead
Expand Down