@@ -30,7 +30,8 @@ type package = {
3030 name: str ,
3131 uuid: str,
3232 url: str,
33- method: str
33+ method: str,
34+ tags: [ str]
3435} ;
3536
3637type source = {
@@ -241,18 +242,31 @@ fn load_one_source_package(&src: source, p: map::hashmap<str, json::json>) {
241242 }
242243 } ;
243244
245+ let tags = [ ] ;
246+ alt p. find ( "tags" ) {
247+ some ( json:: list ( js) ) {
248+ for j in * js {
249+ alt j {
250+ json : : string ( _j) { vec:: grow ( tags, 1 u, _j) ; }
251+ _ { }
252+ }
253+ }
254+ }
255+ _ { }
256+ }
244257 vec:: grow ( src. packages , 1 u, {
245258 // source: _source(src),
246259 name: name,
247260 uuid: uuid,
248261 url: url,
249- method: method
262+ method: method,
263+ tags: tags
250264 } ) ;
251- info ( " Loaded package: " + src. name + "/" + name) ;
265+ log " Loaded package: " + src. name + "/" + name;
252266}
253267
254268fn load_source_packages ( & c: cargo , & src: source ) {
255- info ( "Loading source: " + src. name ) ;
269+ log "Loading source: " + src. name ;
256270 let dir = fs:: connect ( c. sourcedir , src. name ) ;
257271 let pkgfile = fs:: connect ( dir, "packages.json" ) ;
258272 if !fs:: path_exists ( pkgfile) { ret; }
@@ -618,11 +632,46 @@ fn cmd_init(c: cargo, argv: [str]) {
618632 run:: run_program ( "cp" , [ srcfile, destsrcfile] ) ;
619633}
620634
635+ fn print_pkg ( s : source , p : package ) {
636+ let m = s. name + "/" + p. name + " (" + p. uuid + ")" ;
637+ if vec:: len ( p. tags ) > 0 u {
638+ m = m + " [" + str:: connect ( p. tags , ", " ) + "]" ;
639+ }
640+ info ( m) ;
641+ }
642+ fn cmd_list ( c : cargo , argv : [ str ] ) {
643+ for_each_package ( c, { |s, p|
644+ if vec:: len ( argv) <= 2 u || argv[ 2 ] == s. name {
645+ print_pkg ( s, p) ;
646+ }
647+ } ) ;
648+ }
649+
650+ fn cmd_search ( c : cargo , argv : [ str ] ) {
651+ if vec:: len ( argv) < 3 u {
652+ cmd_usage ( ) ;
653+ ret;
654+ }
655+ let n = 0 ;
656+ let name = argv[ 2 ] ;
657+ let tags = vec:: slice ( argv, 3 u, vec:: len ( argv) ) ;
658+ for_each_package ( c, { |s, p|
659+ if ( str:: contains ( p. name , name) || name == "*" ) &&
660+ vec:: all ( tags, { |t| vec:: member ( t, p. tags ) } ) {
661+ print_pkg ( s, p) ;
662+ n += 1 ;
663+ }
664+ } ) ;
665+ info ( #fmt[ "Found %d packages." , n] ) ;
666+ }
667+
621668fn cmd_usage ( ) {
622669 print ( "Usage: cargo <verb> [args...]" ) ;
623670 print ( " init Fetch default sources.json" ) ;
624671 print ( " install [source/]package-name Install by name" ) ;
625672 print ( " install uuid:[source/]package-uuid Install by uuid" ) ;
673+ print ( " list [source] List packages" ) ;
674+ print ( " search <name | '*'> [tags...] Search packages" ) ;
626675 print ( " sync Sync all sources" ) ;
627676 print ( " usage This" ) ;
628677}
@@ -636,6 +685,8 @@ fn main(argv: [str]) {
636685 alt argv[ 1 ] {
637686 "init" { cmd_init ( c, argv) ; }
638687 "install" { cmd_install ( c, argv) ; }
688+ "list" { cmd_list ( c, argv) ; }
689+ "search" { cmd_search ( c, argv) ; }
639690 "sync" { cmd_sync ( c, argv) ; }
640691 "usage" { cmd_usage ( ) ; }
641692 _ { cmd_usage( ) ; }
0 commit comments