@@ -30,7 +30,8 @@ type package = {
30
30
name: str ,
31
31
uuid: str,
32
32
url: str,
33
- method: str
33
+ method: str,
34
+ tags: [ str]
34
35
} ;
35
36
36
37
type source = {
@@ -241,18 +242,31 @@ fn load_one_source_package(&src: source, p: map::hashmap<str, json::json>) {
241
242
}
242
243
} ;
243
244
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
+ }
244
257
vec:: grow ( src. packages , 1 u, {
245
258
// source: _source(src),
246
259
name: name,
247
260
uuid: uuid,
248
261
url: url,
249
- method: method
262
+ method: method,
263
+ tags: tags
250
264
} ) ;
251
- info ( " Loaded package: " + src. name + "/" + name) ;
265
+ log " Loaded package: " + src. name + "/" + name;
252
266
}
253
267
254
268
fn load_source_packages ( & c: cargo , & src: source ) {
255
- info ( "Loading source: " + src. name ) ;
269
+ log "Loading source: " + src. name ;
256
270
let dir = fs:: connect ( c. sourcedir , src. name ) ;
257
271
let pkgfile = fs:: connect ( dir, "packages.json" ) ;
258
272
if !fs:: path_exists ( pkgfile) { ret; }
@@ -618,11 +632,46 @@ fn cmd_init(c: cargo, argv: [str]) {
618
632
run:: run_program ( "cp" , [ srcfile, destsrcfile] ) ;
619
633
}
620
634
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
+
621
668
fn cmd_usage ( ) {
622
669
print ( "Usage: cargo <verb> [args...]" ) ;
623
670
print ( " init Fetch default sources.json" ) ;
624
671
print ( " install [source/]package-name Install by name" ) ;
625
672
print ( " install uuid:[source/]package-uuid Install by uuid" ) ;
673
+ print ( " list [source] List packages" ) ;
674
+ print ( " search <name | '*'> [tags...] Search packages" ) ;
626
675
print ( " sync Sync all sources" ) ;
627
676
print ( " usage This" ) ;
628
677
}
@@ -636,6 +685,8 @@ fn main(argv: [str]) {
636
685
alt argv[ 1 ] {
637
686
"init" { cmd_init ( c, argv) ; }
638
687
"install" { cmd_install ( c, argv) ; }
688
+ "list" { cmd_list ( c, argv) ; }
689
+ "search" { cmd_search ( c, argv) ; }
639
690
"sync" { cmd_sync ( c, argv) ; }
640
691
"usage" { cmd_usage ( ) ; }
641
692
_ { cmd_usage( ) ; }
0 commit comments