Update to 4.0.0 (#1503408)
This commit is contained in:
parent
db5091e8c0
commit
a663cb8c0c
1
.gitignore
vendored
1
.gitignore
vendored
@ -4,3 +4,4 @@ modules-3.2.8.tar.bz2
|
||||
/modules-3.2.9b.tar.bz2
|
||||
/modules-3.2.9c.tar.bz2
|
||||
/modules-3.2.10.tar.bz2
|
||||
/modules-4.0.0.tar.bz2
|
||||
|
237
createmodule.py
237
createmodule.py
@ -1,237 +0,0 @@
|
||||
#!/usr/bin/python
|
||||
#
|
||||
# createmodule.py - Takes the name of a environment init script and
|
||||
# produces a modulefile that duplicates the changes made by the init script
|
||||
#
|
||||
# Copyright (C) 2012 by Orion E. Poplawski <orion@cora.nwra.com>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
from __future__ import print_function
|
||||
|
||||
from optparse import OptionParser
|
||||
import os,sys,re
|
||||
from subprocess import *
|
||||
|
||||
# Handle options
|
||||
usage = "Usage: %prog [-p prefix] <initscript> [args]"
|
||||
parser = OptionParser()
|
||||
parser.set_usage(usage)
|
||||
parser.add_option('-p', '--prefix', action='store', type='string', dest='prefix', help='Specify path prefix')
|
||||
parser.add_option('--noprefix', action='store_true', dest='noprefix', default=False, help='Do not generate a prefix')
|
||||
(options, args) = parser.parse_args()
|
||||
|
||||
# Need a script name
|
||||
if not args:
|
||||
parser.print_usage()
|
||||
exit(1)
|
||||
|
||||
# Return environment after a command
|
||||
def getenv(cmd = ':'):
|
||||
env = {}
|
||||
p = Popen(cmd + ";env", shell=True, stdout=PIPE, stderr=PIPE)
|
||||
(stdout, stderr) = p.communicate()
|
||||
if p.returncode != 0:
|
||||
print("EROR: Could not execute initscript:")
|
||||
print("%s returned exit code %d" % (cmd, p.returncode))
|
||||
print(stderr)
|
||||
exit(1)
|
||||
if stderr != '':
|
||||
print("WARNING: initscript sent the following to stderr:")
|
||||
print(stderr)
|
||||
# Parse the output key=value pairs
|
||||
skip = False
|
||||
for line in stdout.splitlines():
|
||||
if skip:
|
||||
if line == '}':
|
||||
skip = False
|
||||
continue
|
||||
try:
|
||||
(var,value) = line.split('=',1)
|
||||
except ValueError:
|
||||
print("ERROR: Could not parse output line:")
|
||||
print(line)
|
||||
exit(1)
|
||||
# Exported functions - not handled
|
||||
if value.find('() {') == 0:
|
||||
skip = True
|
||||
else:
|
||||
env[var] = value
|
||||
return env
|
||||
|
||||
#Record initial environment
|
||||
env1=getenv()
|
||||
|
||||
#Record environment after sourcing the initscript
|
||||
env2=getenv(". " + " ".join(args))
|
||||
|
||||
# Initialize our variables for storing modifications
|
||||
chdir = None
|
||||
appendpath = {}
|
||||
prependpath = {}
|
||||
unhandled = {}
|
||||
setenv = {}
|
||||
unsetenv = []
|
||||
pathnames = []
|
||||
|
||||
# Function to nomalize all paths in a list of paths and remove duplicate items
|
||||
def normpaths(paths):
|
||||
newpaths = []
|
||||
for path in paths:
|
||||
normpath = os.path.normpath(path)
|
||||
if normpath not in newpaths and normpath != '.':
|
||||
newpaths.append(os.path.normpath(path))
|
||||
return newpaths
|
||||
|
||||
# Start with existing keys and look for changes
|
||||
for key in env1.keys():
|
||||
# Test for delete
|
||||
if key not in env2:
|
||||
unsetenv.append(key)
|
||||
continue
|
||||
# No change
|
||||
if env1[key] == env2[key]:
|
||||
del env2[key]
|
||||
continue
|
||||
#Working directory change
|
||||
if key == 'PWD':
|
||||
chdir=os.path.normpath(env2[key])
|
||||
pathnames.append(chdir)
|
||||
del env2[key]
|
||||
continue
|
||||
# Determine modifcations to beginning and end of the string
|
||||
try:
|
||||
(prepend,append) = env2[key].split(env1[key])
|
||||
except ValueError:
|
||||
continue
|
||||
if prepend:
|
||||
presep = prepend[-1:]
|
||||
prependpaths = prepend.strip(presep).split(presep)
|
||||
# LICENSE variables often include paths outside install directory
|
||||
if 'LICENSE' not in key:
|
||||
pathnames += prependpaths
|
||||
if presep not in prependpath:
|
||||
prependpath[presep] = {}
|
||||
newpath = presep.join(normpaths(prependpaths))
|
||||
if newpath:
|
||||
prependpath[presep][key] = newpath
|
||||
else:
|
||||
unhandled[key] = env2[key]
|
||||
if append:
|
||||
appsep = append[0:1]
|
||||
appendpaths = append.strip(appsep).split(appsep)
|
||||
# LICENSE variables often include paths outside install directory
|
||||
if 'LICENSE' not in key:
|
||||
pathnames += appendpaths
|
||||
if appsep not in appendpath:
|
||||
appendpath[appsep] = {}
|
||||
newpath = appsep.join(normpaths(appendpaths))
|
||||
if newpath:
|
||||
appendpath[appsep][key] = newpath
|
||||
else:
|
||||
unhandled[key] = env2[key]
|
||||
del env2[key]
|
||||
|
||||
# We're left with new keys in env2
|
||||
for key in env2.keys():
|
||||
# Use prepend-path for new paths
|
||||
if (re.search('(DIRS|FILES|PATH)$',key)) or (':' in env2[key]):
|
||||
prependpaths = env2[key].strip(':').split(':')
|
||||
# MANPATH can have system defaults added it it wasn't previously set
|
||||
# LICENSE variables often include paths outside install directory
|
||||
if key != 'MANPATH' and 'LICENSE' not in key:
|
||||
pathnames += prependpaths
|
||||
if ':' not in prependpath:
|
||||
prependpath[':'] = {}
|
||||
prependpath[':'][key] = ':'.join(normpaths(prependpaths))
|
||||
continue
|
||||
# Set new variables
|
||||
setenv[key] = os.path.normpath(env2[key])
|
||||
if 'LICENSE' not in key:
|
||||
pathnames.append(setenv[key])
|
||||
|
||||
# Report unhandled keys
|
||||
for key in unhandled.keys():
|
||||
print("Unhandled change of", key, file=sys.stderr)
|
||||
print("Before <%s>" % env1[key], file=sys.stderr)
|
||||
print("After <%s>" % unhandled[key], file=sys.stderr)
|
||||
for sepkey in appendpath.keys():
|
||||
appendpath[sepkey].pop(key, None)
|
||||
for sepkey in prependpath.keys():
|
||||
prependpath[sepkey].pop(key, None)
|
||||
|
||||
# Determine a prefix
|
||||
prefix=None
|
||||
if options.prefix:
|
||||
prefix = options.prefix
|
||||
elif not options.noprefix:
|
||||
prefix = os.path.commonprefix(pathnames).rstrip('/')
|
||||
if prefix == '':
|
||||
prefix = None
|
||||
|
||||
# Print out the modulefile
|
||||
print("#%Module 1.0")
|
||||
|
||||
# Prefix
|
||||
if prefix is not None:
|
||||
print("\nset prefix " + prefix + "\n")
|
||||
|
||||
# Chdir
|
||||
if chdir is not None:
|
||||
print("chdir\t" + chdir)
|
||||
|
||||
# Function to format output line with tabs and substituting prefix
|
||||
def formatline(item, key, value=None):
|
||||
print(item, end=' ')
|
||||
print("\t"*(2-(len(item)+1)/8), end=' ')
|
||||
print(key, end=' ')
|
||||
if value is not None:
|
||||
print("\t"*(3-(len(key)+1)/8), end=' ')
|
||||
if prefix is not None:
|
||||
print(value.replace(prefix,'$prefix'))
|
||||
else:
|
||||
print(value)
|
||||
|
||||
# Paths first, grouped by variable name
|
||||
for sepkey in prependpath.keys():
|
||||
pathkeys = prependpath[sepkey].keys()
|
||||
pathkeys.sort()
|
||||
for key in pathkeys:
|
||||
if sepkey == ":":
|
||||
formatline("prepend-path",key,prependpath[sepkey][key])
|
||||
else:
|
||||
formatline("prepend-path --delim %s" % sepkey,key,prependpath[sepkey][key])
|
||||
|
||||
for sepkey in appendpath.keys():
|
||||
pathkeys = appendpath[sepkey].keys()
|
||||
pathkeys.sort()
|
||||
for key in pathkeys:
|
||||
if sepkey == ":":
|
||||
formatline("append-path",key,appendpath[sepkey][key])
|
||||
else:
|
||||
formatline("append-path --delim %s" % sepkey,key,appendpath[sepkey][key])
|
||||
|
||||
# Setenv
|
||||
setenvkeys = list(setenv.keys())
|
||||
setenvkeys.sort()
|
||||
if setenvkeys:
|
||||
print()
|
||||
for key in setenvkeys:
|
||||
formatline("setenv",key,setenv[key])
|
||||
|
||||
# Unsetenv
|
||||
unsetenv.sort()
|
||||
if unsetenv:
|
||||
print()
|
||||
for key in unsetenv:
|
||||
formatline("unsetenv",key)
|
207
createmodule.sh
207
createmodule.sh
@ -1,207 +0,0 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# createmodule.sh - Takes the name of a environment init script and
|
||||
# produces a modulefile that duplicates the changes made by the init script
|
||||
#
|
||||
# Copyright (C) 2010-2012 by Orion E. Poplawski <orion@cora.nwra.com>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
usage="Usage: $0 [-p prefix] <initscript> [args]"
|
||||
|
||||
usage() {
|
||||
echo $usage 1>&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
while getopts "p:" opt
|
||||
do
|
||||
case $opt in
|
||||
p) prefix=$OPTARG; shift 2;;
|
||||
*) usage;;
|
||||
esac
|
||||
done
|
||||
|
||||
# Need a script name
|
||||
[ -z "$1" ] && usage
|
||||
|
||||
# Need to be a readable script
|
||||
if [ ! -r "$1" ]
|
||||
then
|
||||
echo "ERROR: Cannot read $1" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
#Will print out array assignment list
|
||||
printenvarray () {
|
||||
env | while read x
|
||||
do
|
||||
key=${x%%=*}
|
||||
value=`printenv "$key"`
|
||||
if [ $? -eq 0 ]
|
||||
then
|
||||
echo [$key]="'$value'"
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
#Apparently we need to declare the associative arrays
|
||||
declare -A env1 env2
|
||||
|
||||
#Record starting environment
|
||||
eval env1=(`printenvarray`)
|
||||
|
||||
#Source the environment script
|
||||
. "$@"
|
||||
|
||||
#Record ending environment
|
||||
eval env2=(`printenvarray`)
|
||||
|
||||
#Print out the modulefile
|
||||
echo "#%Module 1.0"
|
||||
|
||||
#Prefix
|
||||
[ -n "$prefix" ] && echo -e "\nset prefix $prefix\n"
|
||||
|
||||
# dedup - remove duplicate entries from a list
|
||||
#Subshell so we can sort the output
|
||||
(
|
||||
dedup() {
|
||||
list=`mktemp`
|
||||
[ -n "$2" ] && sep=$2 || sep=:
|
||||
echo $1 | sed -r -e 's,[^/]+/\.\./,,g' -e 's,[^/]+/\.\./,,g' -e "s/\\$sep/\n/g" |
|
||||
while read x
|
||||
do
|
||||
grep -Fx ${x} $list && continue
|
||||
if [ -n "$prefix" ]
|
||||
then
|
||||
echo $x | sed -e s,$prefix,\$prefix,
|
||||
else
|
||||
echo $x
|
||||
fi
|
||||
echo $x >> $list
|
||||
done | tr '\n' $sep | sed -e "s/\\$sep\$//"
|
||||
rm $list
|
||||
}
|
||||
|
||||
#Keys that changed
|
||||
for key in "${!env1[@]}"
|
||||
do
|
||||
if [ "${env1[$key]}" != "${env2[$key]}" ]
|
||||
then
|
||||
#Working directory change
|
||||
if [ "$key" = PWD ]
|
||||
then
|
||||
if [ -n "$prefix" ]
|
||||
then
|
||||
echo -e "chdir\t\t${env2[PWD]}" | sed -e s,$prefix,\$prefix,g
|
||||
else
|
||||
echo -e "chdir\t\t${env2[PWD]}"
|
||||
fi
|
||||
#Test for delete
|
||||
elif [ -z "${env2[$key]}" ]
|
||||
then
|
||||
echo -e "unsetenv\t${key}\t${env2[$key]}"
|
||||
#Test for prepend
|
||||
elif [ "${env2[$key]%${env1[$key]}}" != "${env2[$key]}" ]
|
||||
then
|
||||
added=${env2[$key]%${env1[$key]}}
|
||||
sep=${added: -1}
|
||||
added=${added%$sep}
|
||||
added=$(dedup $added $sep)
|
||||
if [ $sep = : ]
|
||||
then
|
||||
echo -e "prepend-path\t$key\t${added}"
|
||||
else
|
||||
echo -e "prepend-path\t--delim $sep\t$key\t${added}"
|
||||
fi
|
||||
#Test for prepend plus : added at end (MANPATH)
|
||||
elif [ "${key: -4}" = PATH -a "${env2[$key]%${env1[$key]}:}" != "${env2[$key]}" ]
|
||||
then
|
||||
added=$(dedup ${env2[$key]%${env1[$key]}:})
|
||||
echo -e "prepend-path\t$key\t${added}"
|
||||
#Test for append
|
||||
elif [ "${env2[$key]#${env1[$key]}}" != "${env2[$key]}" ]
|
||||
then
|
||||
added=${env2[$key]#${env1[$key]}}
|
||||
sep=${added:0:1}
|
||||
added=${added#$sep}
|
||||
added=$(dedup $added $sep)
|
||||
if [ $sep = : ]
|
||||
then
|
||||
echo -e "append-path\t$key\t${added}"
|
||||
else
|
||||
echo -e "append-path\t--delim $sep\t$key\t${added}"
|
||||
fi
|
||||
#Test for prepend plus append
|
||||
elif [ "${env2[$key]%${env1[$key]}*}" != "${env2[$key]}" ]
|
||||
then
|
||||
prepended=${env2[$key]%${env1[$key]}*}
|
||||
presep=${prepended: -1}
|
||||
prepended=${prepended%$presep}
|
||||
prepended=$(dedup $prepended $presep)
|
||||
appended=${env2[$key]#*${env1[$key]}}
|
||||
appsep=${appended:0:1}
|
||||
appended=${appended#$appsep}
|
||||
appended=$(dedup $appended $appsep)
|
||||
if [ $presep != $appsep -o -z "$prepended" -o -z "$appended" ]
|
||||
then
|
||||
#Unhandled
|
||||
echo "Unhandled change of $key" 1>&2
|
||||
echo "Before <${env1[$key]}>" 1>&2
|
||||
echo "After <${env2[$key]}>" 1>&2
|
||||
else
|
||||
if [ $presep = : ]
|
||||
then
|
||||
echo -e "prepend-path\t$key\t${prepended}"
|
||||
echo -e "append-path\t$key\t${appended}"
|
||||
else
|
||||
echo -e "prepend-path\t--delim $presep\t$key\t${prepended}"
|
||||
echo -e "append-path\t--delim $appsep\t$key\t${appended}"
|
||||
fi
|
||||
fi
|
||||
else
|
||||
#Unhandled
|
||||
echo "Unhandled change of $key" 1>&2
|
||||
echo "Before <${env1[$key]}>" 1>&2
|
||||
echo "After <${env2[$key]}>" 1>&2
|
||||
fi
|
||||
fi
|
||||
#Delete keys we have handled
|
||||
unset env1[$key]
|
||||
unset env2[$key]
|
||||
done
|
||||
|
||||
#New keys
|
||||
for key in "${!env2[@]}"
|
||||
do
|
||||
if [ "$key" = OLDPWD ]
|
||||
then
|
||||
continue
|
||||
fi
|
||||
#Use prepend-path for new paths
|
||||
if [ "${key: -4}" = PATH -o "${key: -4}" = DIRS -o "${key: -4}" = FILES ]
|
||||
then
|
||||
# TODO - Need to handle stripping of default MANPATH
|
||||
echo -e "prepend-path\t${key}\t"$(dedup ${env2[$key]})
|
||||
else
|
||||
if [ -n "$prefix" ]
|
||||
then
|
||||
echo -e "setenv\t\t${key}\t${env2[$key]}" | sed -e s,$prefix,\$prefix,g
|
||||
else
|
||||
echo -e "setenv\t\t${key}\t${env2[$key]}"
|
||||
fi
|
||||
fi
|
||||
done
|
||||
) | sort
|
@ -1,24 +0,0 @@
|
||||
diff -up modules-3.2.10/ModuleCmd_Load.c.unload_from_modulefile modules-3.2.10/ModuleCmd_Load.c
|
||||
--- modules-3.2.10/ModuleCmd_Load.c.unload_from_modulefile 2014-07-08 10:43:41.615212949 +0200
|
||||
+++ modules-3.2.10/ModuleCmd_Load.c 2014-07-08 13:49:21.674701003 +0200
|
||||
@@ -126,7 +126,7 @@ int ModuleCmd_Load( Tcl_Interp *interp,
|
||||
** Set up the flags controling the Tcl callback functions
|
||||
**/
|
||||
|
||||
- /* avoid changes when invoked as a subcommand */
|
||||
+ /* avoid changes when invoked as a subcommand and loading */
|
||||
if (!(g_flags & M_SUBCMD)) {
|
||||
if( load) {
|
||||
g_flags |= M_LOAD;
|
||||
@@ -136,6 +136,11 @@ int ModuleCmd_Load( Tcl_Interp *interp,
|
||||
g_flags &= ~M_LOAD;
|
||||
}
|
||||
g_flags |= M_SUBCMD;
|
||||
+ } else {
|
||||
+ if (!load) {
|
||||
+ g_flags |= M_REMOVE;
|
||||
+ g_flags &= ~M_LOAD;
|
||||
+ }
|
||||
}
|
||||
|
||||
/**
|
@ -1,11 +0,0 @@
|
||||
--- modules-3.2.7/init/Makefile.in.bindir 2009-09-22 12:13:52.000000000 -0600
|
||||
+++ modules-3.2.7/init/Makefile.in 2009-09-23 12:19:50.797470155 -0600
|
||||
@@ -404,7 +404,7 @@
|
||||
sed -e "/@$(if $(subst 0,,$(WANTS_VERSIONING)),NOT,)VERSIONING\@/d; \
|
||||
s,@$(if $(subst 0,,$(WANTS_VERSIONING)),,NOT)VERSIONING\@,,g; \
|
||||
s,@prefix\@,${prefix},g; \
|
||||
- s,@bindir\@,${exec_prefix}/bin,g; \
|
||||
+ s,@bindir\@,${bindir},g; \
|
||||
s,@VERSION\@,@VERSION@,g; \
|
||||
s,@BASEPREFIX\@,@BASEPREFIX@,g;" < $< > $@
|
||||
|
@ -1,12 +0,0 @@
|
||||
diff -up modules-3.2.10/init/bash_completion.in.avail modules-3.2.10/init/bash_completion.in
|
||||
--- modules-3.2.10/init/bash_completion.in.avail 2012-10-25 13:33:34.000000000 -0600
|
||||
+++ modules-3.2.10/init/bash_completion.in 2013-01-15 12:05:37.247309733 -0700
|
||||
@@ -56,7 +56,7 @@ _module() {
|
||||
unuse) COMPREPLY=( $(IFS=: compgen -W "${MODULEPATH}" -- "$cur") );;
|
||||
use|*-a*) ;; # let readline handle the completion
|
||||
-u|--userlvl) COMPREPLY=( $(compgen -W "novice expert advanced" -- "$cur") );;
|
||||
- display|help|show|whatis)
|
||||
+ av*|disp*|help|show|whatis)
|
||||
COMPREPLY=( $(compgen -W "$(_module_avail)" -- "$cur") );;
|
||||
*) if test $COMP_CWORD -gt 2
|
||||
then
|
@ -1,11 +0,0 @@
|
||||
--- modules-3.2.9/utility.c 2011-11-28 22:27:13.000000000 +0100
|
||||
+++ modules-3.2.9-new/utility.c 2012-06-13 15:17:41.570629148 +0200
|
||||
@@ -727,7 +727,7 @@ int Output_Modulefile_Changes( Tcl_Inter
|
||||
output_unset_variable( (char*) key);
|
||||
} else {
|
||||
val = EMGetEnv(interp, key);
|
||||
- if(val && *val)
|
||||
+ if(val)
|
||||
output_set_variable(interp, (char*) key, val);
|
||||
null_free((void *)&val);
|
||||
}
|
@ -1,43 +0,0 @@
|
||||
diff -up modules-3.2.10/ModuleCmd_Avail.c.format modules-3.2.10/ModuleCmd_Avail.c
|
||||
--- modules-3.2.10/ModuleCmd_Avail.c.format 2012-12-13 15:17:27.000000000 -0700
|
||||
+++ modules-3.2.10/ModuleCmd_Avail.c 2013-12-23 10:03:34.630492517 -0700
|
||||
@@ -257,7 +257,7 @@ int ModuleCmd_Avail( Tcl_Interp *interp,
|
||||
**/
|
||||
|
||||
if( sw_format & SW_LONG)
|
||||
- fprintf( stderr, long_header);
|
||||
+ fprintf( stderr, "%s", long_header);
|
||||
|
||||
/**
|
||||
** If a module category is specified check whether it is part
|
||||
diff -up modules-3.2.10/ModuleCmd_Display.c.format modules-3.2.10/ModuleCmd_Display.c
|
||||
--- modules-3.2.10/ModuleCmd_Display.c.format 2012-11-01 16:02:19.000000000 -0600
|
||||
+++ modules-3.2.10/ModuleCmd_Display.c 2013-12-23 10:03:34.630492517 -0700
|
||||
@@ -161,13 +161,13 @@ int ModuleCmd_Display( Tcl_Interp *inter
|
||||
|
||||
g_current_module = modulename;
|
||||
|
||||
- fprintf( stderr, local_line);
|
||||
+ fprintf( stderr, "%s", local_line);
|
||||
fprintf( stderr, "%s:\n\n", modulefile);
|
||||
|
||||
result = CallModuleProcedure( disp_interp, &cmdbuf, modulefile,
|
||||
"ModulesDisplay", 0);
|
||||
|
||||
- fprintf( stderr, local_line);
|
||||
+ fprintf( stderr, "%s", local_line);
|
||||
|
||||
/**
|
||||
** Remove the Tcl interpreter that has been used for printing ...
|
||||
diff -up modules-3.2.10/ModuleCmd_List.c.format modules-3.2.10/ModuleCmd_List.c
|
||||
--- modules-3.2.10/ModuleCmd_List.c.format 2012-11-01 16:02:19.000000000 -0600
|
||||
+++ modules-3.2.10/ModuleCmd_List.c 2013-12-23 10:15:35.457029928 -0700
|
||||
@@ -122,7 +122,7 @@ int ModuleCmd_List( Tcl_Interp *interp,
|
||||
**/
|
||||
|
||||
if( sw_format & SW_LONG ) {
|
||||
- fprintf( stderr, long_header);
|
||||
+ fprintf( stderr, "%s", long_header);
|
||||
}
|
||||
if( sw_format & (SW_TERSE | SW_LONG | SW_HUMAN) )
|
||||
fprintf( stderr, "Currently Loaded Modulefiles:\n");
|
@ -1,21 +0,0 @@
|
||||
diff -up modules-3.2.10/modules_def.h.implicit modules-3.2.10/modules_def.h
|
||||
--- modules-3.2.10/modules_def.h.implicit 2012-11-01 10:58:27.000000000 -0600
|
||||
+++ modules-3.2.10/modules_def.h 2016-12-04 10:20:40.981094031 -0700
|
||||
@@ -616,6 +616,9 @@ extern int ModuleCmd_Load( Tcl_Interp*
|
||||
/** ModuleCmd_Purge.c **/
|
||||
extern int ModuleCmd_Purge( Tcl_Interp*, int, char*[]);
|
||||
|
||||
+/** ModuleCmd_Refresh.c **/
|
||||
+extern int ModuleCmd_Refresh( Tcl_Interp*, int, char*[]);
|
||||
+
|
||||
/** ModuleCmd_Switch.c **/
|
||||
extern int ModuleCmd_Switch( Tcl_Interp*, int, char*[]);
|
||||
|
||||
@@ -736,6 +739,7 @@ extern int IsLoaded( Tcl_Interp*, char
|
||||
extern int IsLoaded_ExactMatch( Tcl_Interp*, char*, char **, char*);
|
||||
extern int Update_LoadedList( Tcl_Interp*, char*, char*);
|
||||
extern int check_magic( char*, char*, int);
|
||||
+extern void regex_quote( const char*, char*, int);
|
||||
extern char *xstrtok_r(char *, const char *, char **);
|
||||
extern char *xstrtok(char *, const char *);
|
||||
extern void chk4spch( char*);
|
@ -1,27 +0,0 @@
|
||||
diff -up modules-3.2.10/doc/module.1.in.py3 modules-3.2.10/doc/module.1.in
|
||||
--- modules-3.2.10/doc/module.1.in.py3 2015-01-28 09:55:01.172781681 -0700
|
||||
+++ modules-3.2.10/doc/module.1.in 2015-01-28 09:55:51.045510021 -0700
|
||||
@@ -107,11 +107,8 @@ And the python
|
||||
.I module
|
||||
command is defined with:
|
||||
|
||||
- import os;
|
||||
- if os.environ.has_key('PYTHONPATH'):
|
||||
- os.environ['PYTHONPATH'] +=':'+os.environ['MODULESHOME']+"/init";
|
||||
- else:
|
||||
- os.environ['PYTHONPATH'] = os.environ['MODULESHOME']+"/init";
|
||||
+ import os, sys;
|
||||
+ sys.path.insert(0, '@INITPATH@')
|
||||
|
||||
from python import module;
|
||||
|
||||
diff -up modules-3.2.10/init/python.py.in.py3 modules-3.2.10/init/python.py.in
|
||||
--- modules-3.2.10/init/python.py.in.py3 2015-01-28 09:55:01.173781675 -0700
|
||||
+++ modules-3.2.10/init/python.py.in 2015-01-28 09:56:08.570414569 -0700
|
||||
@@ -27,5 +27,5 @@ def module(*args):
|
||||
@VERSIONING@ (output, error) = subprocess.Popen(['@BASEPREFIX@/Modules/%s/bin/modulecmd' % os.environ['MODULE_VERSION'], 'python'] +
|
||||
@NOTVERSIONING@ (output, error) = subprocess.Popen(['@bindir@/modulecmd', 'python'] +
|
||||
args, stdout=subprocess.PIPE).communicate()
|
||||
- exec output
|
||||
+ exec(output)
|
||||
|
@ -1,27 +0,0 @@
|
||||
diff -up modules-3.2.10/cmdModule.c.tcl86 modules-3.2.10/cmdModule.c
|
||||
--- modules-3.2.10/cmdModule.c.tcl86 2012-11-01 16:02:19.000000000 -0600
|
||||
+++ modules-3.2.10/cmdModule.c 2014-05-27 15:25:50.531554880 -0600
|
||||
@@ -56,7 +56,11 @@ static void *UseId[] = { &UseId, Id };
|
||||
/** MACROS **/
|
||||
/** ************************************************************************ **/
|
||||
|
||||
-/** not applicable **/
|
||||
+/** For Tcl < 8.6 compatibility **/
|
||||
+#if (TCL_MAJOR_VERSION < 8) || (TCL_MAJOR_VERSION == 8) && (TCL_MINOR_VERSION < 6)
|
||||
+#define Tcl_GetErrorLine(interp) (interp->errorLine)
|
||||
+#define Tcl_SetErrorLine(interp,lineNum) (interp->errorLine = lineNum)
|
||||
+#endif
|
||||
|
||||
/** ************************************************************************ **/
|
||||
/** LOCAL DATA **/
|
||||
@@ -640,8 +644,8 @@ int Execute_TclFile( Tcl_Interp *interp
|
||||
case TCL_OK: gotPartial = 0;
|
||||
continue; /** while **/
|
||||
|
||||
- case TCL_ERROR: interp->errorLine = ((linenum-1)-gotPartial) +
|
||||
- interp->errorLine;
|
||||
+ case TCL_ERROR: Tcl_SetErrorLine(interp, ((linenum-1)-gotPartial) +
|
||||
+ Tcl_GetErrorLine(interp));
|
||||
/* FALLTHROUGH */
|
||||
|
||||
case TCL_LEVEL0_RETURN:
|
@ -1,10 +0,0 @@
|
||||
diff -up modules-3.2.10/modulefiles/modules.in.versioning modules-3.2.10/modulefiles/modules.in
|
||||
--- modules-3.2.10/modulefiles/modules.in.versioning 2012-10-25 13:33:34.000000000 -0600
|
||||
+++ modules-3.2.10/modulefiles/modules.in 2013-01-15 11:30:22.046031158 -0700
|
||||
@@ -26,5 +26,5 @@ setenv MODULESHOME $prefix
|
||||
prepend-path PATH @bindir@
|
||||
prepend-path MANPATH @mandir@
|
||||
|
||||
-module use @VERSIONPATH@
|
||||
+@VERSIONING@module use @VERSIONPATH@
|
||||
|
@ -1,43 +1,15 @@
|
||||
%global macrosdir %(d=%{_rpmconfigdir}/macros.d; [ -d $d ] || d=%{_sysconfdir}/rpm; echo $d)
|
||||
|
||||
Name: environment-modules
|
||||
Version: 3.2.10
|
||||
Release: 23%{?dist}
|
||||
Version: 4.0.0
|
||||
Release: 1%{?dist}
|
||||
Summary: Provides dynamic modification of a user's environment
|
||||
|
||||
Group: System Environment/Base
|
||||
License: GPLv2+
|
||||
URL: http://modules.sourceforge.net/
|
||||
Source0: http://downloads.sourceforge.net/modules/modules-%{version}.tar.bz2
|
||||
Source1: modules.sh
|
||||
Source2: createmodule.sh
|
||||
Source3: createmodule.py
|
||||
Source4: macros.%{name}
|
||||
Patch0: environment-modules-3.2.7-bindir.patch
|
||||
# Comment out stray module use in modules file when not using versioning
|
||||
# https://bugzilla.redhat.com/show_bug.cgi?id=895555
|
||||
Patch1: environment-modules-versioning.patch
|
||||
# Fix module clear command
|
||||
# https://bugzilla.redhat.com/show_bug.cgi?id=895551
|
||||
Patch2: environment-modules-clear.patch
|
||||
# Patch from modules list to add completion to avail command
|
||||
Patch3: environment-modules-avail.patch
|
||||
# Fix -Werror=format-security
|
||||
# https://bugzilla.redhat.com/show_bug.cgi?id=1037053
|
||||
# https://sourceforge.net/p/modules/patches/13/
|
||||
Patch4: environment-modules-format.patch
|
||||
# Support Tcl 8.6
|
||||
# https://sourceforge.net/p/modules/feature-requests/14/
|
||||
Patch5: environment-modules-tcl86.patch
|
||||
# python 3 support
|
||||
# https://sourceforge.net/p/modules/patches/15/
|
||||
# https://bugzilla.redhat.com/show_bug.cgi?id=1184979
|
||||
Patch6: environment-modules-py3-and-doc-fix.patch
|
||||
# Fix unload from loaded modulefile
|
||||
# https://bugzilla.redhat.com/show_bug.cgi?id=1117334
|
||||
Patch7: environment-modules-3.2.10-unload-from-module.patch
|
||||
# Fix build with -Werror=implicit-function-declaration
|
||||
Patch8: environment-modules-implicit.patch
|
||||
|
||||
BuildRequires: tcl-devel, tclx-devel, libX11-devel
|
||||
BuildRequires: dejagnu
|
||||
@ -72,91 +44,136 @@ suite of different applications.
|
||||
NOTE: You will need to get a new shell after installing this package to
|
||||
have access to the module alias.
|
||||
|
||||
%package compat
|
||||
Summary: Environment Modules compatibility version
|
||||
Requires: environment-modules = %{version}-%{release}
|
||||
|
||||
%description compat
|
||||
The Environment Modules package provides for the dynamic modification of
|
||||
a user's environment via modulefiles.
|
||||
|
||||
This package provides Environment Modules compatibility version (3.2).
|
||||
|
||||
|
||||
%prep
|
||||
%setup -q -n modules-%{version}
|
||||
%patch0 -p1 -b .bindir
|
||||
%patch1 -p1 -b .versioning
|
||||
%patch2 -p1 -b .clear
|
||||
%patch3 -p1 -b .avail
|
||||
%patch4 -p1 -b .format
|
||||
%patch5 -p1 -b .tcl86
|
||||
%patch6 -p1 -b .py3
|
||||
%patch7 -p1 -b .unload-from-module
|
||||
%patch8 -p1 -b .implicit
|
||||
|
||||
|
||||
%build
|
||||
%configure --disable-versioning \
|
||||
--prefix=%{_datadir} \
|
||||
--exec-prefix=%{_datadir}/Modules \
|
||||
--with-man-path=$(manpath) \
|
||||
--with-module-path=%{_sysconfdir}/modulefiles:%{_datadir}/modulefiles
|
||||
# --with-debug=42 --with-log-facility-debug=stderr
|
||||
%configure --prefix=%{_datadir}/Modules \
|
||||
--bindir=%{_datadir}/Modules/bin \
|
||||
--libexecdir=%{_datadir}/Modules/libexec \
|
||||
--docdir=%{_docdir}/%{name} \
|
||||
--enable-dotmodulespath \
|
||||
--with-modulepath=%{_datadir}/Modules/modulefiles:%{_sysconfdir}/modulefiles:%{_datadir}/modulefiles \
|
||||
--with-quarantine-vars=LD_LIBRARY_PATH
|
||||
make %{?_smp_mflags}
|
||||
|
||||
|
||||
%install
|
||||
make install DESTDIR=$RPM_BUILD_ROOT
|
||||
mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/profile.d
|
||||
touch %{buildroot}%{_sysconfdir}/profile.d/modules.{csh,sh}
|
||||
cp -p %SOURCE1 $RPM_BUILD_ROOT%{_datadir}/Modules/init/modules.sh
|
||||
cp -p %SOURCE2 %SOURCE3 $RPM_BUILD_ROOT%{_datadir}/Modules/bin
|
||||
%if 0%{?fedora} >= 22
|
||||
sed -i -e 1s,/usr/bin/python,/usr/bin/python3, \
|
||||
$RPM_BUILD_ROOT%{_datadir}/Modules/bin/createmodule.py
|
||||
%endif
|
||||
mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/modulefiles \
|
||||
$RPM_BUILD_ROOT%{_datadir}/modulefiles
|
||||
# Install the rpm config file
|
||||
install -Dpm 644 %{SOURCE4} %{buildroot}/%{macrosdir}/macros.%{name}
|
||||
# Prep for man alternatives
|
||||
mv $RPM_BUILD_ROOT%{_mandir}/man1/module{,-c}.1
|
||||
mv $RPM_BUILD_ROOT%{_mandir}/man4/modulefile{,-c}.4
|
||||
make install DESTDIR=%{buildroot}
|
||||
|
||||
mkdir -p %{buildroot}%{_sysconfdir}/modulefiles
|
||||
mkdir -p %{buildroot}%{_datadir}/modulefiles
|
||||
mkdir -p %{buildroot}%{_sysconfdir}/profile.d
|
||||
mkdir -p %{buildroot}%{_bindir}
|
||||
|
||||
# Set up for alternatives.
|
||||
touch %{buildroot}%{_sysconfdir}/profile.d/modules.{csh,sh}
|
||||
touch %{buildroot}%{_bindir}/modulecmd
|
||||
mv %{buildroot}%{_mandir}/man1/module{,-c}.1
|
||||
mv %{buildroot}%{_mandir}/man4/modulefile{,-c}.4
|
||||
|
||||
# Major utilities go to regular bin dir.
|
||||
mv %{buildroot}%{_datadir}/Modules/bin/envml %{buildroot}%{_bindir}/
|
||||
|
||||
# Rename compat docs to find them in files section.
|
||||
mv compat/ChangeLog ChangeLog-compat
|
||||
mv compat/NEWS NEWS-compat
|
||||
|
||||
mv {doc/build/,}NEWS.txt
|
||||
mv {doc/build/,}MIGRATING.txt
|
||||
mv {doc/build/,}diff_v3_v4.txt
|
||||
mv {doc/,}example.txt
|
||||
rm -f %{buildroot}%{_docdir}/%{name}/{COPYING.GPLv2,ChangeLog-compat,INSTALL.txt,NEWS-compat}
|
||||
|
||||
cp -p contrib/scripts/createmodule.sh %{buildroot}%{_datadir}/Modules/bin
|
||||
cp -p contrib/scripts/createmodule.py %{buildroot}%{_datadir}/Modules/bin
|
||||
sed -i -e 1s,/usr/bin/python,/usr/bin/python3, \
|
||||
%{buildroot}%{_datadir}/Modules/bin/createmodule.py
|
||||
|
||||
install -Dpm 644 %{SOURCE4} %{buildroot}/%{macrosdir}/macros.%{name}
|
||||
|
||||
%check
|
||||
make test
|
||||
|
||||
|
||||
%post
|
||||
# Cleanup from pre-alternatives
|
||||
[ ! -L %{_bindir}/modules.sh ] && rm -f %{_sysconfdir}/profile.d/modules.sh
|
||||
[ ! -L %{_mandir}/man1/module.1.gz ] && rm -f %{_mandir}/man1/module.1.gz
|
||||
[ ! -L %{_mandir}/man4/modulefile.4.gz ] && rm -f %{_mandir}/man4/modulefile.4.gz
|
||||
%{_sbindir}/update-alternatives --install %{_sysconfdir}/profile.d/modules.sh modules.sh %{_datadir}/Modules/init/modules.sh 40 \
|
||||
--slave %{_sysconfdir}/profile.d/modules.csh modules.csh %{_datadir}/Modules/init/csh \
|
||||
--slave %{_mandir}/man1/module.1.gz module.1.gz %{_mandir}/man1/module-c.1.gz \
|
||||
--slave %{_mandir}/man4/modulefile.4.gz modulefile.4.gz %{_mandir}/man4/modulefile-c.4.gz
|
||||
[ ! -L %{_sysconfdir}/profile.d/modules.sh ] && rm -f %{_sysconfdir}/profile.d/modules.sh
|
||||
[ ! -L %{_sysconfdir}/profile.d/modules.csh ] && rm -f %{_sysconfdir}/profile.d/modules.csh
|
||||
[ ! -L %{buildroot}%{_bindir}/modulecmd ] && rm -f %{_bindir}/modulecmd
|
||||
|
||||
# Migration from version 3.x to 4
|
||||
if [ "$(readlink /etc/alternatives/modules.sh)" = '%{_datadir}/Modules/init/modules.sh' ]; then
|
||||
%{_sbindir}/update-alternatives --remove modules.sh %{_datadir}/Modules/init/modules.sh
|
||||
fi
|
||||
|
||||
%{_sbindir}/update-alternatives \
|
||||
--install %{_sysconfdir}/profile.d/modules.sh modules.sh %{_datadir}/Modules/init/profile.sh 40 \
|
||||
--slave %{_sysconfdir}/profile.d/modules.csh modules.csh %{_datadir}/Modules/init/profile.csh \
|
||||
--slave %{_bindir}/modulecmd modulecmd %{_datadir}/Modules/libexec/modulecmd.tcl
|
||||
|
||||
%post compat
|
||||
%{_sbindir}/update-alternatives \
|
||||
--install %{_sysconfdir}/profile.d/modules.sh modules.sh %{_datadir}/Modules/init/profile-compat.sh 10 \
|
||||
--slave %{_sysconfdir}/profile.d/modules.csh modules.csh %{_datadir}/Modules/init/profile-compat.csh \
|
||||
--slave %{_bindir}/modulecmd modulecmd %{_datadir}/Modules/libexec/modulecmd-compat
|
||||
|
||||
%postun
|
||||
if [ $1 -eq 0 ] ; then
|
||||
%{_sbindir}/update-alternatives --remove modules.sh %{_datadir}/Modules/init/modules.sh
|
||||
fi
|
||||
|
||||
%postun compat
|
||||
if [ $1 -eq 0 ] ; then
|
||||
%{_sbindir}/update-alternatives --remove modules.sh %{_datadir}/Modules/init/profile-compat.sh
|
||||
fi
|
||||
|
||||
|
||||
%files
|
||||
%license LICENSE.GPL
|
||||
%doc README TODO
|
||||
%license COPYING.GPLv2
|
||||
%doc ChangeLog README NEWS.txt MIGRATING.txt diff_v3_v4.txt example.txt
|
||||
%{_sysconfdir}/modulefiles
|
||||
%ghost %{_sysconfdir}/profile.d/modules.csh
|
||||
%ghost %{_sysconfdir}/profile.d/modules.sh
|
||||
%{_bindir}/modulecmd
|
||||
%ghost %{_bindir}/modulecmd
|
||||
%{_bindir}/envml
|
||||
%dir %{_datadir}/Modules
|
||||
%{_datadir}/Modules/bin/
|
||||
%{_datadir}/Modules/bin
|
||||
%dir %{_datadir}/Modules/libexec
|
||||
%{_datadir}/Modules/libexec/modulecmd.tcl
|
||||
%dir %{_datadir}/Modules/init
|
||||
%config(noreplace) %{_datadir}/Modules/init/*
|
||||
%config(noreplace) %{_datadir}/Modules/init/.modulespath
|
||||
%{_datadir}/Modules/modulefiles
|
||||
%{_datadir}/modulefiles
|
||||
%ghost %{_mandir}/man1/module.1.gz
|
||||
%ghost %{_mandir}/man4/modulefile.4.gz
|
||||
%{_mandir}/man1/module-c.1.gz
|
||||
%{_mandir}/man4/modulefile-c.4.gz
|
||||
%{macrosdir}/macros.%{name}
|
||||
|
||||
%files compat
|
||||
%doc ChangeLog-compat NEWS-compat
|
||||
%{_datadir}/Modules/libexec/modulecmd-compat
|
||||
%{_mandir}/man1/module-compat.1.gz
|
||||
%{_mandir}/man4/modulefile-compat.4.gz
|
||||
|
||||
|
||||
%changelog
|
||||
* Mon Nov 20 2017 Jan Synáček <jsynacek@redhat.com> - 4.0.0-1
|
||||
- Update to 4.0.0 (#1503408)
|
||||
|
||||
* Wed Aug 02 2017 Fedora Release Engineering <releng@fedoraproject.org> - 3.2.10-23
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild
|
||||
|
||||
|
@ -1,7 +0,0 @@
|
||||
shell=`/bin/basename \`/bin/ps -p $$ -ocomm=\``
|
||||
if [ -f /usr/share/Modules/init/$shell ]
|
||||
then
|
||||
. /usr/share/Modules/init/$shell
|
||||
else
|
||||
. /usr/share/Modules/init/sh
|
||||
fi
|
Loading…
Reference in New Issue
Block a user