Skip to content

Commit 9834321

Browse files
author
Elly Jones
committed
cargo: Add list and search.
In aid of search, add a new field to the packages.json format, called "tags", whose value is a list of strings. Search accepts a list of tags, all of which must match for the package to be shown. Signed-off-by: Elly Jones <[email protected]>
1 parent af564ca commit 9834321

File tree

1 file changed

+55
-4
lines changed

1 file changed

+55
-4
lines changed

src/cargo/cargo.rs

Lines changed: 55 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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

3637
type 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, 1u, _j); }
251+
_ { }
252+
}
253+
}
254+
}
255+
_ { }
256+
}
244257
vec::grow(src.packages, 1u, {
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

254268
fn 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) > 0u {
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) <= 2u || 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) < 3u {
652+
cmd_usage();
653+
ret;
654+
}
655+
let n = 0;
656+
let name = argv[2];
657+
let tags = vec::slice(argv, 3u, 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+
621668
fn 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

Comments
 (0)