Skip to content
Snippets Groups Projects
Commit f1900f6a authored by Brett Viren's avatar Brett Viren
Browse files

Add a 'print' view allowing genreation of arbitrary strings based on format...

Add a 'print' view allowing genreation of arbitrary strings based on format using package/spec parameters.
parent 2d1430da
No related branches found
No related tags found
No related merge requests found
...@@ -38,11 +38,12 @@ ...@@ -38,11 +38,12 @@
the union of the hierarchies of the installed packages in the DAG the union of the hierarchies of the installed packages in the DAG
where installed files are referenced via symlinks. where installed files are referenced via symlinks.
- hardlink :: like the symlink view but hardlinks are used - hardlink :: like the symlink view but hardlinks are used.
- statlink :: a view producing a status report of a symlink or - statlink :: a view producing a status report of a symlink or
hardlink view. hardlink view.
- format :: a view printing one string per spec following a given format.
The file system view concept is imspired by Nix, implemented by The file system view concept is imspired by Nix, implemented by
brett.viren@gmail.com ca 2016. brett.viren@gmail.com ca 2016.
...@@ -64,6 +65,7 @@ ...@@ -64,6 +65,7 @@
import os import os
import re import re
import sys
import argparse import argparse
import spack import spack
...@@ -86,6 +88,9 @@ def setup_parser(sp): ...@@ -86,6 +88,9 @@ def setup_parser(sp):
ssp = sp.add_subparsers(metavar='ACTION', dest='action') ssp = sp.add_subparsers(metavar='ACTION', dest='action')
specs_opts = dict(metavar='spec', nargs='+',
help="Seed specs of the packages to view.")
# The action parameterizes the command but in keeping with Spack # The action parameterizes the command but in keeping with Spack
# patterns we make it a subcommand. # patterns we make it a subcommand.
file_system_view_actions = [ file_system_view_actions = [
...@@ -102,9 +107,15 @@ def setup_parser(sp): ...@@ -102,9 +107,15 @@ def setup_parser(sp):
for act in file_system_view_actions: for act in file_system_view_actions:
act.add_argument('path', nargs=1, act.add_argument('path', nargs=1,
help="Path to file system view directory.") help="Path to file system view directory.")
act.add_argument('specs', metavar='spec', nargs='+', act.add_argument('specs', **specs_opts)
help="Seed specs of the packages to view.")
# The formatted print action.
act = ssp.add_parser('print',
help="Print a string to stdout based on given format")
act.add_argument('format', nargs=1,
help="Format describing per-package printout.")
act.add_argument('specs', **specs_opts)
## Other VIEW ACTIONS might be added here. ## Other VIEW ACTIONS might be added here.
## Some ideas are the following (and some are redundant with existing cmds) ## Some ideas are the following (and some are redundant with existing cmds)
## A JSON view that dumps a DAG to a JSON file ## A JSON view that dumps a DAG to a JSON file
...@@ -170,6 +181,39 @@ def flatten(seeds, descend=True): ...@@ -170,6 +181,39 @@ def flatten(seeds, descend=True):
flat.update(spec.normalized().traverse()) flat.update(spec.normalized().traverse())
return flat return flat
def spec2dict(spec):
'Convert info in a spec into a simple dictionary.'
# Expclitly convert instead of just returning spec.__dict__ as
# some things need processing or are properties.
#
pkg = spec.package
ret = dict(name = spec.name,
short = spec.short_spec,
cshort = spec.cshort_spec, # color
root = spec.root,
prefix = spec.prefix,
version = spec.version,
variants = spec.variants,
namespace = spec.namespace,
compiler = spec.compiler,
architecture = spec.architecture,
dependencies = ','.join(spec.dependencies.keys()),
dependents = ','.join(spec.dependents.keys()),
external = spec.external or "False",
hash = spec.dag_hash(),
# package related:
url = pkg.url,
stage = pkg.stage.path,
installed = pkg.installed,
installed_dependents = ','.join([s.name for s in pkg.installed_dependents]),
build_log = pkg.build_log_path,
rpath = ':'.join(pkg.rpath),
# ...
)
return ret
### Action-specific helpers ### Action-specific helpers
...@@ -270,6 +314,20 @@ def visitor_statlink(specs, args): ...@@ -270,6 +314,20 @@ def visitor_statlink(specs, args):
visitor_status = visitor_statlink visitor_status = visitor_statlink
visitor_check = visitor_statlink visitor_check = visitor_statlink
def visitor_print(specs, args):
'Print a string for each spec using args.format.'
fmt = args.format[0]
for spec in specs:
kwds = spec2dict(spec)
try:
string = fmt.format(**kwds)
except KeyError:
tty.error("Format error, use keywords: %s" % (', '.join(kwds.keys()), ))
raise
# argparser escapes these
string = string.replace(r'\n', '\n').replace(r'\t', '\t')
sys.stdout.write(string)
# Finally, the actual "view" command. There should be no need to # Finally, the actual "view" command. There should be no need to
# modify anything below when new actions are added. # modify anything below when new actions are added.
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment