Skip to content

Commit dfa87cf

Browse files
Merge pull request #10 from boegel/set_default_module_symlink
enhance test_set_default_module to check default in moduleclass symlink path + minor code cleanup/fixes
2 parents 6a07a0d + 72e5fb0 commit dfa87cf

File tree

3 files changed

+63
-31
lines changed

3 files changed

+63
-31
lines changed

easybuild/framework/easyblock.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2603,9 +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-
mod_symlink_paths = ActiveMNS().det_module_symlink_paths(self.cfg)
2608-
self.module_generator.set_as_default(mod_folderpath, version, mod_symlink_paths, fake)
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)
26092612

26102613
def cleanup_step(self):
26112614
"""

easybuild/tools/module_generator.py

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

418-
def set_as_default(self, module_folder_path, module_version, mod_symlink_paths=[], fake=False):
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
424424
:param mod_symlink_paths: list of paths in which symlinks to module files must be created
425425
"""
@@ -873,34 +873,36 @@ def set_alias(self, key, value):
873873
# quotes are needed, to ensure smooth working of EBDEVEL* modulefiles
874874
return 'set-alias\t%s\t\t%s\n' % (key, quote_str(value, tcl=True))
875875

876-
def set_as_default(self, module_folder_path, module_version, mod_symlink_paths=[], fake=False):
876+
def set_as_default(self, module_dir_path, module_version, mod_symlink_paths=None):
877877
"""
878878
Create a .version file inside the package module folder in order to set the default version for TMod
879879
880-
: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
881881
:param module_version: module version, e.g. 3.0.4
882882
:param mod_symlink_paths: list of paths in which symlinks to module files must be created
883883
"""
884884
txt = self.MODULE_SHEBANG + '\n'
885885
txt += 'set ModulesVersion %s\n' % module_version
886886

887887
# write the file no matter what
888-
dot_version_path = os.path.join(module_folder_path, '.version')
888+
dot_version_path = os.path.join(module_dir_path, '.version')
889889
write_file(dot_version_path, txt)
890890

891891
# create symlink to .version file in class module folders
892-
if not fake:
893-
for mod_symlink_path in mod_symlink_paths:
894-
module_name = os.path.basename(module_folder_path)
895-
class_module_folder = os.path.join(install_path('mod'), mod_symlink_path, module_name)
896-
dot_version_link_path = os.path.join(class_module_folder, '.version')
897-
if os.path.islink(dot_version_link_path):
898-
link_target = resolve_path(dot_version_link_path)
899-
remove_file(dot_version_link_path)
900-
self.log.info("Removed default version marking from %s.", link_target)
901-
elif os.path.exists(dot_version_link_path):
902-
raise EasyBuildError('Found an unexpected file named .version in dir %s' % class_module_folder)
903-
symlink(dot_version_path, dot_version_link_path, use_abspath_source=True)
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)
904906

905907
def set_environment(self, key, value, relpath=False):
906908
"""
@@ -1294,35 +1296,38 @@ def set_alias(self, key, value):
12941296
# quotes are needed, to ensure smooth working of EBDEVEL* modulefiles
12951297
return 'set_alias("%s", %s)\n' % (key, quote_str(value))
12961298

1297-
def set_as_default(self, module_folder_path, module_version, mod_symlink_paths=[], fake=False):
1299+
def set_as_default(self, module_dir_path, module_version, mod_symlink_paths=None):
12981300
"""
12991301
Create a symlink named 'default' inside the package's module folder in order to set the default module version
13001302
1301-
: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
13021304
:param module_version: module version, e.g. 3.0.4
13031305
:param mod_symlink_paths: list of paths in which symlinks to module files must be created
13041306
"""
1305-
def create_default_symlink(module_folder_path):
1306-
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')
13071310

13081311
if os.path.islink(default_filepath):
13091312
link_target = resolve_path(default_filepath)
13101313
remove_file(default_filepath)
13111314
self.log.info("Removed default version marking from %s.", link_target)
13121315
elif os.path.exists(default_filepath):
1313-
raise EasyBuildError('Found an unexpected file named default in dir %s' % module_folder_path)
1316+
raise EasyBuildError('Found an unexpected file named default in dir %s', module_dir_path)
13141317

13151318
symlink(module_version + self.MODULE_FILE_EXTENSION, default_filepath, use_abspath_source=False)
13161319
self.log.info("Module default version file written to point to %s", default_filepath)
13171320

1318-
create_default_symlink(module_folder_path)
1321+
create_default_symlink(module_dir_path)
13191322

13201323
# also create symlinks in class module folders
1321-
if not fake:
1322-
for mod_symlink_path in mod_symlink_paths:
1323-
module_name = os.path.basename(module_folder_path)
1324-
module_folder_path = os.path.join(install_path('mod'), mod_symlink_path, module_name)
1325-
create_default_symlink(module_folder_path)
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)
13261331

13271332
def set_environment(self, key, value, relpath=False):
13281333
"""

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)