Skip to content

Commit 6d593b0

Browse files
authored
Merge pull request #3093 from migueldiascosta/set_default_module_symlink
also create symlinks for default modules in class module folders
2 parents 29edeca + dfa87cf commit 6d593b0

File tree

3 files changed

+79
-18
lines changed

3 files changed

+79
-18
lines changed

easybuild/framework/easyblock.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2603,8 +2603,12 @@ def _set_module_as_default(self, fake=False):
26032603
if self.dry_run:
26042604
dry_run_msg("Marked %s v%s as default version" % (self.name, version))
26052605
else:
2606-
mod_folderpath = os.path.dirname(self.module_generator.get_module_filepath(fake=fake))
2607-
self.module_generator.set_as_default(mod_folderpath, version)
2606+
mod_dir_path = os.path.dirname(self.module_generator.get_module_filepath(fake=fake))
2607+
if fake:
2608+
mod_symlink_paths = []
2609+
else:
2610+
mod_symlink_paths = ActiveMNS().det_module_symlink_paths(self.cfg)
2611+
self.module_generator.set_as_default(mod_dir_path, version, mod_symlink_paths=mod_symlink_paths)
26082612

26092613
def cleanup_step(self):
26102614
"""

easybuild/tools/module_generator.py

Lines changed: 49 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -415,12 +415,13 @@ def set_alias(self, key, value):
415415
"""
416416
raise NotImplementedError
417417

418-
def set_as_default(self, module_folder_path, module_version):
418+
def set_as_default(self, module_dir_path, module_version, mod_symlink_paths=None):
419419
"""
420420
Set generated module as default module
421421
422-
:param module_folder_path: module folder path, e.g. $HOME/easybuild/modules/all/Bison
422+
:param module_dir_path: module directory path, e.g. $HOME/easybuild/modules/all/Bison
423423
:param module_version: module version, e.g. 3.0.4
424+
:param mod_symlink_paths: list of paths in which symlinks to module files must be created
424425
"""
425426
raise NotImplementedError
426427

@@ -872,18 +873,36 @@ def set_alias(self, key, value):
872873
# quotes are needed, to ensure smooth working of EBDEVEL* modulefiles
873874
return 'set-alias\t%s\t\t%s\n' % (key, quote_str(value, tcl=True))
874875

875-
def set_as_default(self, module_folder_path, module_version):
876+
def set_as_default(self, module_dir_path, module_version, mod_symlink_paths=None):
876877
"""
877878
Create a .version file inside the package module folder in order to set the default version for TMod
878879
879-
:param module_folder_path: module folder path, e.g. $HOME/easybuild/modules/all/Bison
880+
:param module_dir_path: module directory path, e.g. $HOME/easybuild/modules/all/Bison
880881
:param module_version: module version, e.g. 3.0.4
882+
:param mod_symlink_paths: list of paths in which symlinks to module files must be created
881883
"""
882884
txt = self.MODULE_SHEBANG + '\n'
883885
txt += 'set ModulesVersion %s\n' % module_version
884886

885887
# write the file no matter what
886-
write_file(os.path.join(module_folder_path, '.version'), txt)
888+
dot_version_path = os.path.join(module_dir_path, '.version')
889+
write_file(dot_version_path, txt)
890+
891+
# create symlink to .version file in class module folders
892+
if mod_symlink_paths is None:
893+
mod_symlink_paths = []
894+
895+
module_dir_name = os.path.basename(module_dir_path)
896+
for mod_symlink_path in mod_symlink_paths:
897+
mod_symlink_dir = os.path.join(install_path('mod'), mod_symlink_path, module_dir_name)
898+
dot_version_link_path = os.path.join(mod_symlink_dir, '.version')
899+
if os.path.islink(dot_version_link_path):
900+
link_target = resolve_path(dot_version_link_path)
901+
remove_file(dot_version_link_path)
902+
self.log.info("Removed default version marking from %s.", link_target)
903+
elif os.path.exists(dot_version_link_path):
904+
raise EasyBuildError('Found an unexpected file named .version in dir %s', mod_symlink_dir)
905+
symlink(dot_version_path, dot_version_link_path, use_abspath_source=True)
887906

888907
def set_environment(self, key, value, relpath=False):
889908
"""
@@ -1277,24 +1296,38 @@ def set_alias(self, key, value):
12771296
# quotes are needed, to ensure smooth working of EBDEVEL* modulefiles
12781297
return 'set_alias("%s", %s)\n' % (key, quote_str(value))
12791298

1280-
def set_as_default(self, module_folder_path, module_version):
1299+
def set_as_default(self, module_dir_path, module_version, mod_symlink_paths=None):
12811300
"""
12821301
Create a symlink named 'default' inside the package's module folder in order to set the default module version
12831302
1284-
:param module_folder_path: module folder path, e.g. $HOME/easybuild/modules/all/Bison
1303+
:param module_dir_path: module directory path, e.g. $HOME/easybuild/modules/all/Bison
12851304
:param module_version: module version, e.g. 3.0.4
1305+
:param mod_symlink_paths: list of paths in which symlinks to module files must be created
12861306
"""
1287-
default_filepath = os.path.join(module_folder_path, 'default')
1307+
def create_default_symlink(path):
1308+
"""Helper function to create 'default' symlink in specified directory."""
1309+
default_filepath = os.path.join(path, 'default')
12881310

1289-
if os.path.islink(default_filepath):
1290-
link_target = resolve_path(default_filepath)
1291-
remove_file(default_filepath)
1292-
self.log.info("Removed default version marking from %s.", link_target)
1293-
elif os.path.exists(default_filepath):
1294-
raise EasyBuildError('Found an unexpected file named default in dir %s' % module_folder_path)
1311+
if os.path.islink(default_filepath):
1312+
link_target = resolve_path(default_filepath)
1313+
remove_file(default_filepath)
1314+
self.log.info("Removed default version marking from %s.", link_target)
1315+
elif os.path.exists(default_filepath):
1316+
raise EasyBuildError('Found an unexpected file named default in dir %s', module_dir_path)
12951317

1296-
symlink(module_version + self.MODULE_FILE_EXTENSION, default_filepath, use_abspath_source=False)
1297-
self.log.info("Module default version file written to point to %s", default_filepath)
1318+
symlink(module_version + self.MODULE_FILE_EXTENSION, default_filepath, use_abspath_source=False)
1319+
self.log.info("Module default version file written to point to %s", default_filepath)
1320+
1321+
create_default_symlink(module_dir_path)
1322+
1323+
# also create symlinks in class module folders
1324+
if mod_symlink_paths is None:
1325+
mod_symlink_paths = []
1326+
1327+
for mod_symlink_path in mod_symlink_paths:
1328+
mod_dir_name = os.path.basename(module_dir_path)
1329+
mod_symlink_dir = os.path.join(install_path('mod'), mod_symlink_path, mod_dir_name)
1330+
create_default_symlink(mod_symlink_dir)
12981331

12991332
def set_environment(self, key, value, relpath=False):
13001333
"""

test/framework/options.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3956,6 +3956,30 @@ def test_set_default_module(self):
39563956
else:
39573957
self.assertTrue(False, "Uknown module syntax: %s" % get_module_syntax())
39583958

3959+
# make sure default is also set for moduleclass symlink
3960+
toy_mod_symlink_dir = os.path.join(self.test_installpath, 'modules', 'tools', 'toy')
3961+
if get_module_syntax() == 'Lua':
3962+
self.assertEqual(sorted(os.listdir(toy_mod_symlink_dir)), ['0.0-deps.lua', 'default'])
3963+
default_symlink = os.path.join(toy_mod_symlink_dir, 'default')
3964+
mod_symlink = os.path.join(toy_mod_symlink_dir, '0.0-deps.lua')
3965+
self.assertTrue(os.path.islink(default_symlink))
3966+
self.assertTrue(os.path.islink(mod_symlink))
3967+
self.assertEqual(os.readlink(default_symlink), '0.0-deps.lua')
3968+
modfile_path = os.path.join(toy_mod_dir, '0.0-deps.lua')
3969+
self.assertTrue(os.path.samefile(os.readlink(mod_symlink), modfile_path))
3970+
elif get_module_syntax() == 'Tcl':
3971+
self.assertEqual(sorted(os.listdir(toy_mod_symlink_dir)), ['.version', '0.0-deps'])
3972+
version_symlink = os.path.join(toy_mod_symlink_dir, '.version')
3973+
mod_symlink = os.path.join(toy_mod_symlink_dir, '0.0-deps')
3974+
self.assertTrue(os.path.islink(version_symlink))
3975+
self.assertTrue(os.path.islink(mod_symlink))
3976+
versionfile_path = os.path.join(toy_mod_dir, '.version')
3977+
self.assertEqual(os.readlink(version_symlink), versionfile_path)
3978+
modfile_path = os.path.join(toy_mod_dir, '0.0-deps')
3979+
self.assertTrue(os.path.samefile(os.readlink(mod_symlink), modfile_path))
3980+
else:
3981+
self.assertTrue(False, "Uknown module syntax: %s" % get_module_syntax())
3982+
39593983
def test_inject_checksums(self):
39603984
"""Test for --inject-checksums"""
39613985
topdir = os.path.dirname(os.path.abspath(__file__))

0 commit comments

Comments
 (0)