11# SPDX-License-Identifier: GPL-3.0-or-later
22
33import argparse
4+ import os
45
56from ..layers import Layers , updateLayers
67from ..tty import NORMAL , setVerbosity
78from ..utils import EventLoopWrapper
89from .build .status import PackagePrinter
9- from .helpers import processDefines
10+ from .helpers import processDefines , dumpYaml , dumpJson , dumpFlat
1011
1112def 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+
57113def 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