Skip to content

Commit c52a2c4

Browse files
author
Matthias Koeppe
committed
sage --package dependencies: Support --format=rst, improve --format=plain; use in sage-spkg-info
1 parent d50f837 commit c52a2c4

File tree

3 files changed

+71
-43
lines changed

3 files changed

+71
-43
lines changed

build/bin/sage-spkg-info

Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,14 @@ if [ -n "$OUTPUT_RST" ]; then
1616
issue () { echo ":issue:\`$1\`"; }
1717
code () { echo "\`\`$*\`\`"; }
1818
tab () { echo ".. tab:: $1"; }
19+
FORMAT=rst
1920
else
2021
ref () { echo "$1"; }
2122
spkg () { echo "$1"; }
2223
issue () { echo "https://github.com/sagemath/sage/issues/$1"; }
2324
code () { echo "$1"; }
2425
tab () { echo "$1:"; }
26+
FORMAT=plain
2527
fi
2628
if ! props=$(sage-package properties --format=shell $PKG_BASE 2> /dev/null); then
2729
echo >&2 "sage-spkg-info: unknown package $PKG_BASE"
@@ -49,24 +51,7 @@ echo
4951
echo "Dependencies"
5052
echo "------------"
5153
echo
52-
eval $(sage-package properties --format=shell :all:)
53-
for dep in $(sage-package dependencies $PKG_BASE); do
54-
case "$dep" in
55-
# Suppress dependencies on source files, e.g. of the form $(SAGE_ROOT)/..., $(SAGE_SRC)/...
56-
*/*) ;;
57-
# Suppress FORCE
58-
FORCE) ;;
59-
# Dependencies like $(BLAS)
60-
\$\(*) echo "- $dep";;
61-
# Looks like a package
62-
*) if eval test -r "\$path_$dep/SPKG.rst"; then
63-
# This RST label is set in src/doc/bootstrap
64-
echo "- $(spkg $dep)"
65-
else
66-
echo "- $dep"
67-
fi;;
68-
esac
69-
done
54+
${SAGE_PACKAGE-sage-package} dependencies --format=$FORMAT $PKG_BASE
7055
echo
7156
echo "Version Information"
7257
echo "-------------------"

build/sage_bootstrap/app.py

Lines changed: 58 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,9 @@ def properties(self, *package_classes, **kwds):
9494
pc = PackageClass(*package_classes)
9595
for package_name in pc.names:
9696
package = Package(package_name)
97-
if format == 'plain':
98-
print("{0}:".format(package_name))
97+
if len(pc.names) > 1:
98+
if format == 'plain':
99+
print("{0}:".format(package_name))
99100
for p in props:
100101
value = getattr(package, p)
101102
if value is None:
@@ -112,36 +113,73 @@ def dependencies(self, *package_classes, **kwds):
112113
"""
113114
Find the dependencies given package names
114115
115-
$ sage --package dependencies maxima --runtime --order-only
116-
ecl
117-
info
116+
$ sage --package dependencies maxima --runtime --order-only --format=shell
117+
order_only_deps_maxima='info'
118+
runtime_deps_maxima='ecl'
118119
"""
119120
types = kwds.pop('types', None)
120121
format = kwds.pop('format', 'plain')
121122
log.debug('Looking up dependencies')
122123
pc = PackageClass(*package_classes)
123-
if format == 'plain':
124+
if format in ['plain', 'rst']:
124125
if types is None:
125-
types = ['order_only', 'runtime']
126-
deps = []
127-
for package_name in pc.names:
128-
package = Package(package_name)
129-
for t in types:
130-
deps.extend(getattr(package, 'dependencies_' + t))
131-
for dep in sorted(set(deps)):
132-
print(dep)
126+
typesets = [['order_only', 'runtime']]
127+
else:
128+
typesets = [[t] for t in types]
133129
elif format == 'shell':
134130
if types is None:
135131
types = ['order_only', 'optional', 'runtime', 'check']
136-
for package_name in pc.names:
137-
package = Package(package_name)
138-
for t in types:
132+
typesets = [[t] for t in types]
133+
else:
134+
raise ValueError('format must be one of "plain", "rst", and "shell"')
135+
136+
if format == 'plain':
137+
indent1 = " "
138+
indent2 = " "
139+
elif format == 'rst':
140+
indent1 = ""
141+
indent2 = " "
142+
143+
for package_name in pc.names:
144+
package = Package(package_name)
145+
if len(pc.names) > 1:
146+
if format == 'plain':
147+
print("{0}:".format(package_name))
148+
elif format == 'rst':
149+
print("\n{0}\n{1}\n".format(package_name, "~" * len(package_name)))
150+
151+
for typeset in typesets:
152+
if len(typesets) > 1:
153+
if format == 'plain':
154+
print(indent1 + "{0}: ".format('/'.join(typeset)))
155+
elif format == 'rst':
156+
print("\n" + indent1 + ".. tab:: {0}\n".format('/'.join(typeset)))
157+
158+
deps = []
159+
for t in typeset:
160+
deps.extend(getattr(package, 'dependencies_' + t))
161+
deps = sorted(set(deps))
162+
163+
if format in ['plain', 'rst']:
164+
for dep in deps:
165+
if '/' in dep:
166+
# Suppress dependencies on source files, e.g. of the form $(SAGE_ROOT)/..., $(SAGE_SRC)/...
167+
continue
168+
if dep == 'FORCE':
169+
# Suppress FORCE
170+
continue
171+
if dep.startswith('$('):
172+
# Dependencies like $(BLAS)
173+
print(indent2 + "- {0}".format(dep))
174+
elif format == 'rst' and Package(dep).has_file('SPKG.rst'):
175+
# This RST label is set in src/doc/bootstrap
176+
print(indent2 + "- :ref:`spkg_{0}`".format(dep))
177+
else:
178+
print(indent2 + "- {0}".format(dep))
179+
elif format == 'shell':
139180
# We single-quote the values because dependencies
140181
# may contain Makefile variable substitutions
141-
deps = getattr(package, 'dependencies_' + t)
142182
print("{0}_deps_{1}='{2}'".format(t, package_name, ' '.join(deps)))
143-
else:
144-
raise ValueError('format must be one of "plain" and "shell"')
145183

146184
def name(self, tarball_filename):
147185
"""

build/sage_bootstrap/cmdline.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -102,14 +102,19 @@
102102
epilog_dependencies = \
103103
"""
104104
Print the list of packages that are dependencies of given package.
105-
By default, list the build, order-only, and runtime dependencies.
105+
By default, list a summary of the build, order-only, and runtime
106+
dependencies.
106107
107108
EXAMPLE:
108109
110+
$ sage --package dependencies maxima openblas
111+
maxima:
112+
- ecl
113+
- info
114+
openblas:
115+
- gfortran
109116
$ sage --package dependencies maxima --runtime
110-
ecl
111-
$ sage --package dependencies maxima --order-only
112-
info
117+
- ecl
113118
"""
114119

115120

@@ -323,7 +328,7 @@ def make_parser():
323328
help='list the check dependencies')
324329
parser_dependencies.add_argument(
325330
'--format', type=str, default='plain',
326-
help='output format (one of plain and shell; default: plain)')
331+
help='output format (one of plain, rst, and shell; default: plain)')
327332

328333
parser_name = subparsers.add_parser(
329334
'name', epilog=epilog_name,

0 commit comments

Comments
 (0)