Skip to content

Commit

Permalink
Merge pull request #4506 from Flamefire/20240412171233_new_pr_hFykoskzEw
Browse files Browse the repository at this point in the history
Improve behavior when using extension with 'nosource:True'
  • Loading branch information
smoors committed Apr 18, 2024
2 parents f0fcdbc + 948ee8d commit 7eee9b1
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 18 deletions.
18 changes: 11 additions & 7 deletions easybuild/framework/extensioneasyblock.py
Original file line number Diff line number Diff line change
Expand Up @@ -126,18 +126,23 @@ def _set_start_dir(self):
elif ext_start_dir is None:
# This may be on purpose, e.g. for Python WHL files which do not get extracted
self.log.debug("Start dir is not set.")
else:
elif self.start_dir:
# non-existing start dir means wrong input from user
warn_msg = "Provided start dir (%s) for extension %s does not exist: %s" % (self.start_dir, self.name,
ext_start_dir)
raise EasyBuildError("Provided start dir (%s) for extension %s does not exist: %s",
self.start_dir, self.name, ext_start_dir)
else:
warn_msg = 'Failed to determine start dir for extension %s: %s' % (self.name, ext_start_dir)
self.log.warning(warn_msg)
print_warning(warn_msg, silent=build_option('silent'))

def run(self, unpack_src=False):
"""Common operations for extensions: unpacking sources, patching, ..."""

# unpack file if desired
if unpack_src:
if self.options.get('nosource', False):
# If no source wanted use the start_dir from the main EC
self.ext_dir = self.master.start_dir
elif unpack_src:
targetdir = os.path.join(self.master.builddir, remove_unwanted_chars(self.name))
self.ext_dir = extract_file(self.src, targetdir, extra_options=self.unpack_options,
change_into_dir=False, cmd=self.src_extract_cmd)
Expand All @@ -146,10 +151,9 @@ def run(self, unpack_src=False):
# because start_dir value is usually a relative path (if it is set)
change_dir(self.ext_dir)

self._set_start_dir()
self._set_start_dir()
if self.start_dir:
change_dir(self.start_dir)
else:
self._set_start_dir()

# patch if needed
EasyBlock.patch_step(self, beginpath=self.ext_dir)
Expand Down
29 changes: 18 additions & 11 deletions test/framework/easyblock.py
Original file line number Diff line number Diff line change
Expand Up @@ -2200,18 +2200,25 @@ def test_extension_set_start_dir(self):
cwd = os.getcwd()
self.assertExists(cwd)

def check_ext_start_dir(expected_start_dir, unpack_src=True):
def check_ext_start_dir(expected_start_dir, unpack_src=True, parent_startdir=None):
"""Check start dir."""
# make sure we're in an existing directory at the start
change_dir(cwd)

eb = EasyBlock(ec['ec'])
if not os.path.exists(eb.builddir):
eb.make_builddir() # Required to exist for samefile
eb.cfg['start_dir'] = parent_startdir

eb.extensions_step(fetch=True, install=False)
# extract sources of the extension
ext = eb.ext_instances[-1]
ext.run(unpack_src=unpack_src)

if expected_start_dir is None:
self.assertIsNone(ext.start_dir)
# Without a start dir we don't change the CWD
self.assertEqual(os.getcwd(), cwd)
else:
self.assertTrue(os.path.isabs(ext.start_dir))
if ext.start_dir != os.sep:
Expand All @@ -2221,14 +2228,8 @@ def check_ext_start_dir(expected_start_dir, unpack_src=True):
else:
abs_expected_start_dir = os.path.join(eb.builddir, expected_start_dir)
self.assertEqual(ext.start_dir, abs_expected_start_dir)
if not os.path.exists(eb.builddir):
eb.make_builddir() # Required to exist for samefile
self.assertTrue(os.path.samefile(ext.start_dir, abs_expected_start_dir))
if unpack_src:
self.assertTrue(os.path.samefile(os.getcwd(), abs_expected_start_dir))
else:
# When not unpacking we don't change the CWD
self.assertEqual(os.getcwd(), cwd)
remove_dir(eb.builddir)

ec['ec']['exts_defaultclass'] = 'DummyExtension'
Expand Down Expand Up @@ -2257,11 +2258,8 @@ def check_ext_start_dir(expected_start_dir, unpack_src=True):
'start_dir': 'nonexistingdir'}),
]
with self.mocked_stdout_stderr():
err_pattern = "Failed to change from .*barbar/barbar-0.0 to nonexistingdir.*"
err_pattern = r"Provided start dir \(nonexistingdir\) for extension barbar does not exist:.*"
self.assertErrorRegex(EasyBuildError, err_pattern, check_ext_start_dir, 'whatever')
stderr = self.get_stderr()
warning_pattern = "WARNING: Provided start dir (nonexistingdir) for extension barbar does not exist"
self.assertIn(warning_pattern, stderr)

# No error when using relative path in non-extracted source for some reason
ec['ec']['exts_list'] = [
Expand Down Expand Up @@ -2291,6 +2289,15 @@ def check_ext_start_dir(expected_start_dir, unpack_src=True):
check_ext_start_dir(os.sep, unpack_src=False)
self.assertFalse(self.get_stderr())

# Go to ECs start dir if nosource is used
ec['ec']['exts_list'] = [
('barbar', '0.0', {
'nosource': True}),
]
with self.mocked_stdout_stderr():
check_ext_start_dir(self.test_prefix, parent_startdir=self.test_prefix)
self.assertFalse(self.get_stderr())

def test_prepare_step(self):
"""Test prepare step (setting up build environment)."""
test_easyconfigs = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'easyconfigs', 'test_ecs')
Expand Down

0 comments on commit 7eee9b1

Please sign in to comment.