Skip to content

Commit ea27e2d

Browse files
committed
layers: add an ls sub-command
The 'bob layers ls' command lists all known layers. For each layer, the directory and the managed/unmanaged disposition is printed at least. For managed layers, the SCM properties are shown additonally. Because this command might be convenient for scripting, add different output formats. We support the same formats as 'bob show' here. Fixes #631.
1 parent 4cd3248 commit ea27e2d

File tree

1 file changed

+61
-3
lines changed

1 file changed

+61
-3
lines changed

pym/bob/cmds/layers.py

Lines changed: 61 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
# SPDX-License-Identifier: GPL-3.0-or-later
22

33
import argparse
4+
import os
45

56
from ..layers import Layers, updateLayers
67
from ..tty import NORMAL, setVerbosity
78
from ..utils import EventLoopWrapper
89
from .build.status import PackagePrinter
9-
from .helpers import processDefines
10+
from .helpers import processDefines, dumpYaml, dumpJson, dumpFlat
1011

1112
def addDefaultArgs(parser):
1213
parser.add_argument('-lc', dest="layerConfig", default=[], action='append',
@@ -54,10 +55,65 @@ def doLayersUpdate(argv):
5455
updateLayers(loop, defines, args.verbose, args.attic, args.layerConfig)
5556

5657

58+
def lsFlat(layers):
59+
ret = []
60+
for name, layer in sorted(layers.items()):
61+
ret.append("[" + name + "]")
62+
ret.extend(dumpFlat(layer))
63+
ret.append("")
64+
65+
return "\n".join(ret)
66+
67+
def doLayersLs(argv):
68+
parser = argparse.ArgumentParser(prog="bob layers update",
69+
description='List layers and their SCMs')
70+
addDefaultArgs(parser)
71+
72+
ex = parser.add_mutually_exclusive_group()
73+
ex.add_argument('--indent', type=int, default=4,
74+
help="Number of spaces to indent (default: 4)")
75+
ex.add_argument('--no-indent', action='store_const', const=None,
76+
dest='indent', help="No indent. Compact format.")
77+
parser.add_argument('--format', choices=['yaml', 'json', 'flat'],
78+
default="yaml", help="Output format")
79+
80+
args = parser.parse_args(argv)
81+
defines = processDefines(args.defines)
82+
83+
layers = Layers(defines, False)
84+
layers.setLayerConfig(args.layerConfig)
85+
layers.collect(None, False)
86+
87+
ls = {}
88+
for layer in layers:
89+
workspace = layer.getWorkspace()
90+
# Unmanaged layers have absolute paths to the project root directory.
91+
# Try to convert them to something readable.
92+
if os.path.isabs(workspace):
93+
cwd = os.getcwd()
94+
if workspace.startswith(cwd):
95+
workspace = workspace[len(cwd)+1:]
96+
97+
l = { "disposition" : "managed" if layer.isManaged() else "unmanaged",
98+
"path" : workspace }
99+
if layer.isManaged():
100+
l["scm"] = layer.getScm().getProperties(False, True)
101+
102+
ls[layer.getName()] = l
103+
104+
if args.format == 'yaml':
105+
print(dumpYaml(ls, args.indent))
106+
elif args.format == 'json':
107+
print(dumpJson(ls, args.indent))
108+
else:
109+
assert args.format == 'flat'
110+
print(lsFlat(ls))
111+
112+
57113
def doLayers(argv, bobRoot):
58114
parser = argparse.ArgumentParser(prog="bob layers", description='Handle layers')
59-
parser.add_argument('action', type=str, choices=['update', 'status'],
60-
help="Action: [update, status]")
115+
parser.add_argument('action', type=str, choices=['ls', 'update', 'status'],
116+
help="Command action")
61117
parser.add_argument('args', nargs=argparse.REMAINDER,
62118
help="Arguments for action")
63119

@@ -66,3 +122,5 @@ def doLayers(argv, bobRoot):
66122
doLayersStatus(args.args)
67123
elif args.action == "update":
68124
doLayersUpdate(args.args)
125+
elif args.action == "ls":
126+
doLayersLs(args.args)

0 commit comments

Comments
 (0)