@@ -340,3 +340,66 @@ def doInit(argv, bobRoot):
340340 f .write (os .path .abspath (args .project ))
341341 except OSError as e :
342342 raise ParseError ("Cannot create project link: " + str (e ))
343+
344+ def doLsRecipes (argv , bobRoot ):
345+ parser = argparse .ArgumentParser (prog = "bob ls-recipes" , description = "List all known recipes." )
346+ parser .add_argument ('-D' , default = [], action = 'append' , dest = "defines" ,
347+ help = "Override default environment variable" )
348+ parser .add_argument ('-c' , dest = "configFile" , default = [], action = 'append' ,
349+ help = "Use config File" )
350+
351+ group = parser .add_mutually_exclusive_group ()
352+ group .add_argument ('--sandbox' , action = 'store_true' , default = False ,
353+ help = "Enable sandboxing" )
354+ group .add_argument ('--slim-sandbox' , action = 'store_false' , dest = 'sandbox' ,
355+ help = "Enable slim sandboxing" )
356+ group .add_argument ('--dev-sandbox' , action = 'store_true' , dest = 'sandbox' ,
357+ help = "Enable development sandboxing" )
358+ group .add_argument ('--strict-sandbox' , action = 'store_true' , dest = 'sandbox' ,
359+ help = "Enable strict sandboxing" )
360+ group .add_argument ('--no-sandbox' , action = 'store_false' , dest = 'sandbox' ,
361+ help = "Disable sandboxing (default)" )
362+
363+ group = parser .add_mutually_exclusive_group ()
364+ group .add_argument ('--all' , action = 'store_const' , dest = 'mode' , const = 'all' , default = 'all' ,
365+ help = "List all recipes (default)" )
366+ group .add_argument ('--used' , action = 'store_const' , dest = 'mode' , const = 'used' ,
367+ help = "List recipes used for packages" )
368+ group .add_argument ('--orphaned' , action = 'store_const' , dest = 'mode' , const = 'orphaned' ,
369+ help = "List unused recipes" )
370+
371+ parser .add_argument ('--sources' , action = 'store_true' , help = "Show recipe source files" )
372+
373+ args = parser .parse_args (argv )
374+
375+ defines = processDefines (args .defines )
376+
377+ recipes = RecipeSet ()
378+ recipes .setConfigFiles (args .configFile )
379+ recipes .parse (defines )
380+
381+ if args .mode in ('used' , 'orphaned' ):
382+ packages = recipes .generatePackages (lambda s ,m : "unused" , args .sandbox )
383+ used = set (p .getName () for p in packages .queryPackagePath ("//*" ))
384+
385+ if args .mode in ('all' , 'orphaned' ):
386+ # filter virtual root recipe
387+ available = set (r for r in recipes .getRecipes () if r != "" )
388+
389+ if args .sources :
390+ def show (p ):
391+ print (p , * recipes .getRecipe (p ).getSources (), sep = "\t " )
392+ else :
393+ def show (p ):
394+ print (p )
395+
396+ if args .mode == 'all' :
397+ for i in sorted (available ):
398+ show (i )
399+ elif args .mode == 'used' :
400+ for i in sorted (used ):
401+ show (i )
402+ else :
403+ assert args .mode == 'orphaned'
404+ for i in sorted (available - used ):
405+ show (i )
0 commit comments