Add spack cd and spack location commands.

- Better shell support for cd'ing into directories
- Fix some csh weirdness with nested aliases.
This commit is contained in:
Todd Gamblin 2014-08-22 11:00:19 -07:00
parent eb5efed421
commit d87a652582
9 changed files with 186 additions and 73 deletions

38
lib/spack/spack/cmd/cd.py Normal file
View file

@ -0,0 +1,38 @@
##############################################################################
# Copyright (c) 2013, Lawrence Livermore National Security, LLC.
# Produced at the Lawrence Livermore National Laboratory.
#
# This file is part of Spack.
# Written by Todd Gamblin, tgamblin@llnl.gov, All rights reserved.
# LLNL-CODE-647188
#
# For details, see https://scalability-llnl.github.io/spack
# Please also see the LICENSE file for our notice and the LGPL.
#
# 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) version 2.1 dated February 1999.
#
# 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 terms and
# conditions of the GNU General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
##############################################################################
import spack.cmd.location
import spack.modules
description="cd to spack directories in the shell."
def setup_parser(subparser):
"""This is for decoration -- spack cd is used through spack's
shell support. This allows spack cd to print a descriptive
help message when called with -h."""
spack.cmd.location.setup_parser(subparser)
def cd(parser, args):
spack.modules.print_help()

View file

@ -0,0 +1,93 @@
##############################################################################
# Copyright (c) 2013, Lawrence Livermore National Security, LLC.
# Produced at the Lawrence Livermore National Laboratory.
#
# This file is part of Spack.
# Written by Todd Gamblin, tgamblin@llnl.gov, All rights reserved.
# LLNL-CODE-647188
#
# For details, see https://scalability-llnl.github.io/spack
# Please also see the LICENSE file for our notice and the LGPL.
#
# 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) version 2.1 dated February 1999.
#
# 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 terms and
# conditions of the GNU General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
##############################################################################
import os
from external import argparse
import llnl.util.tty as tty
from llnl.util.filesystem import join_path
import spack
import spack.cmd
description="Print out locations of various diectories used by Spack"
def setup_parser(subparser):
global directories
directories = subparser.add_mutually_exclusive_group()
directories.add_argument(
'-m', '--module-dir', action='store_true', help="Spack python module directory.")
directories.add_argument(
'-r', '--spack-root', action='store_true', help="Spack installation root.")
directories.add_argument(
'-i', '--install-dir', action='store_true',
help="Install prefix for spec (spec need not be installed).")
directories.add_argument(
'-p', '--package-dir', action='store_true',
help="Directory enclosing a spec's package.py file.")
directories.add_argument(
'-s', '--stage-dir', action='store_true', help="Stage directory for a spec.")
directories.add_argument(
'-b', '--build-dir', action='store_true',
help="Expanded archive directory for a spec (requires it to be staged first).")
subparser.add_argument(
'spec', nargs=argparse.REMAINDER, help="spec of package to fetch directory for.")
def location(parser, args):
if args.module_dir:
print spack.module_path
elif args.spack_root:
print spack.prefix
else:
specs = spack.cmd.parse_specs(args.spec, concretize=True)
if not specs:
tty.die("You must supply a spec.")
if len(specs) != 1:
tty.die("Too many specs. Need only one.")
spec = specs[0]
if args.install_dir:
print spec.prefix
elif args.package_dir:
print join_path(spack.db.root, spec.name)
else:
pkg = spack.db.get(spec)
if args.stage_dir:
print pkg.stage.path
else: # args.build_dir is the default.
if not os.listdir(pkg.stage.path):
tty.die("Build directory does not exist yet. Run this to create it:",
"spack stage " + " ".join(args.spec))
print pkg.stage.expanded_archive_path

View file

@ -41,7 +41,7 @@
from spack.util.compression import extension from spack.util.compression import extension
description = "Manage spack mirrors." description = "Manage mirrors."
def setup_parser(subparser): def setup_parser(subparser):
subparser.add_argument( subparser.add_argument(

View file

@ -37,13 +37,6 @@ def setup_parser(subparser):
help="Do not check downloaded packages against checksum") help="Do not check downloaded packages against checksum")
dir_parser = subparser.add_mutually_exclusive_group() dir_parser = subparser.add_mutually_exclusive_group()
dir_parser.add_argument(
'-d', '--print-stage-dir', action='store_const', dest='print_dir',
const='print_stage', help="Prints out the stage directory for a spec.")
dir_parser.add_argument(
'-b', '--print-build-dir', action='store_const', dest='print_dir',
const='print_build', help="Prints out the expanded archive path for a spec.")
subparser.add_argument( subparser.add_argument(
'specs', nargs=argparse.REMAINDER, help="specs of packages to stage") 'specs', nargs=argparse.REMAINDER, help="specs of packages to stage")
@ -56,23 +49,6 @@ def stage(parser, args):
spack.do_checksum = False spack.do_checksum = False
specs = spack.cmd.parse_specs(args.specs, concretize=True) specs = spack.cmd.parse_specs(args.specs, concretize=True)
if args.print_dir:
if len(specs) != 1:
tty.die("--print-stage-dir and --print-build-dir options only take one spec.")
spec = specs[0]
pkg = spack.db.get(spec)
if args.print_dir == 'print_stage':
print pkg.stage.path
elif args.print_dir == 'print_build':
if not os.listdir(pkg.stage.path):
tty.die("Stage directory is empty. Run this first:",
"spack stage " + " ".join(args.specs))
print pkg.stage.expanded_archive_path
else:
for spec in specs: for spec in specs:
package = spack.db.get(spec) package = spack.db.get(spec)
package.do_stage() package.do_stage()

View file

@ -64,10 +64,10 @@
def print_help(): def print_help():
"""For use by commands to tell user how to activate shell support.""" """For use by commands to tell user how to activate shell support."""
tty.msg("Spack module/dotkit support is not initialized.", tty.msg("This command requires spack's shell integration.",
"", "",
"To use dotkit or modules with Spack, you must first run", "To initialize spack's shell commands, you must run one of",
"one of the commands below. You can copy/paste them.", "the commands below. Choose the right command for your shell.",
"", "",
"For bash and zsh:", "For bash and zsh:",
" . %s/setup-env.sh" % spack.share_path, " . %s/setup-env.sh" % spack.share_path,

View file

@ -45,9 +45,9 @@ set _sp_spec=""
# Figure out what type of module we're running here. # Figure out what type of module we're running here.
set _sp_modtype = "" set _sp_modtype = ""
switch ($_sp_subcommand) switch ($_sp_subcommand)
case "cd": case cd:
shift _sp_args shift _sp_args
cd `spack stage --print-build-dir $_sp_args` cd `spack location $_sp_args`
breaksw breaksw
case use: case use:
case unuse: case unuse:
@ -59,31 +59,37 @@ case unload:
shift _sp_spec shift _sp_spec
set _sp_spec = ($_sp_spec) set _sp_spec = ($_sp_spec)
endif endif
# Translate the parameter into pieces of a command.
# _sp_modtype is an arg to spack module find, and
# _sp_sh_cmd is the equivalent shell command.
switch ($_sp_subcommand)
case use:
case unuse:
set _sp_modtype = dotkit
set _sp_sh_cmd = ( "`alias $_sp_subcommand'" )
breaksw
case load:
case unload:
set _sp_modtype = tcl
set _sp_sh_cmd = ( "`alias module`" $_sp_subcommand )
breaksw
endsw
# Here the user has run use or unuse with a spec. Find a matching # Here the user has run use or unuse with a spec. Find a matching
# spec using 'spack module find', then use the appropriate module # spec using 'spack module find', then use the appropriate module
# tool's commands to add/remove the result from the environment. # tool's commands to add/remove the result from the environment.
# If spack module command comes back with an error, do nothing. switch ($_sp_subcommand)
set _sp_full_spec = "" case "use":
if { set _sp_full_spec = `\spack module find $_sp_modtype $_sp_spec` } then set _sp_full_spec = ( "`\spack $_sp_flags module find dotkit $_sp_spec`" )
$_sp_sh_cmd $_sp_module_args $_sp_full_spec if ( $? == 0 ) then
use $_sp_module_args $_sp_full_spec
endif endif
breaksw breaksw
case "unuse":
set _sp_full_spec = ( "`\spack $_sp_flags module find dotkit $_sp_spec`" )
if ( $? == 0 ) then
unuse $_sp_module_args $_sp_full_spec
endif
breaksw
case "load":
set _sp_full_spec = ( "`\spack $_sp_flags module find tcl $_sp_spec`" )
if ( $? == 0 ) then
module load $_sp_module_args $_sp_full_spec
endif
breaksw
case "unload":
set _sp_full_spec = ( "`\spack $_sp_flags module find tcl $_sp_spec`" )
if ( $? == 0 ) then
module unload $_sp_module_args $_sp_full_spec
endif
breaksw
endsw
breaksw
default: default:
\spack $_sp_args \spack $_sp_args

View file

@ -37,7 +37,7 @@ if ($?SPACK_ROOT) then
# Command aliases point at separate source files # Command aliases point at separate source files
alias spack 'set _sp_args = (\!*); source $_spack_share_dir/csh/spack.csh' alias spack 'set _sp_args = (\!*); source $_spack_share_dir/csh/spack.csh'
alias _spack_pathadd 'set _pa_args = (\!*) && source $_spack_share_dir/csh/spack_pathadd.csh' alias _spack_pathadd 'set _pa_args = (\!*) && source $_spack_share_dir/csh/pathadd.csh'
# Set up modules and dotkit search paths in the user environment # Set up modules and dotkit search paths in the user environment
# TODO: fix SYS_TYPE to something non-LLNL-specific # TODO: fix SYS_TYPE to something non-LLNL-specific

View file

@ -76,7 +76,7 @@ function spack {
# command. # command.
case $_sp_subcommand in case $_sp_subcommand in
"cd") "cd")
cd $(spack stage --print-build-dir "$@") cd $(spack location "$@")
return return
;; ;;
"use"|"unuse"|"load"|"unload") "use"|"unuse"|"load"|"unload")
@ -87,28 +87,28 @@ function spack {
_sp_spec="$@" _sp_spec="$@"
fi fi
# Translate the parameter into pieces of a command.
# _sp_modtype is an arg to spack module find, and
# _sp_sh_cmd is the equivalent shell command.
case $_sp_subcommand in
"use"|"unuse")
_sp_modtype=dotkit
_sp_sh_cmd=$_sp_subcommand
;;
"load"|"unload")
_sp_modtype=tcl
_sp_sh_cmd="module $_sp_subcommand"
;;
esac
# Here the user has run use or unuse with a spec. Find a matching # Here the user has run use or unuse with a spec. Find a matching
# spec using 'spack module find', then use the appropriate module # spec using 'spack module find', then use the appropriate module
# tool's commands to add/remove the result from the environment. # tool's commands to add/remove the result from the environment.
# If spack module command comes back with an error, do nothing. # If spack module command comes back with an error, do nothing.
if _sp_full_spec=$(command spack $_sp_flags module find $_sp_modtype $_sp_spec); then case $_sp_subcommand in
$_sp_sh_cmd $_sp_module_args $_sp_full_spec "use")
fi if _sp_full_spec=$(command spack $_sp_flags module find dotkit $_sp_spec); then
return use $_sp_module_args $_sp_full_spec
fi ;;
"unuse")
if _sp_full_spec=$(command spack $_sp_flags module find dotkit $_sp_spec); then
unuse $_sp_module_args $_sp_full_spec
fi ;;
"load")
if _sp_full_spec=$(command spack $_sp_flags module find dotkit $_sp_spec); then
module load $_sp_module_args $_sp_full_spec
fi ;;
"unload")
if _sp_full_spec=$(command spack $_sp_flags module find dotkit $_sp_spec); then
module unload $_sp_module_args $_sp_full_spec
fi ;;
esac
;; ;;
*) *)
command spack $_sp_flags $_sp_subcommand $_sp_spec command spack $_sp_flags $_sp_subcommand $_sp_spec