This commit is contained in:
parent
774c6d0198
commit
9671d21408
5 changed files with 55 additions and 10 deletions
|
|
@ -505,9 +505,54 @@ fn get_metadata_section(str filename) -> option::t[vec[u8]] {
|
|||
ret option::none[vec[u8]];
|
||||
}
|
||||
|
||||
fn get_exported_metadata(&session::session sess,
|
||||
&str path,
|
||||
&vec[u8] data) -> hashmap[str,str] {
|
||||
auto meta_items = ebml::get_doc(ebml::new_doc(data),
|
||||
metadata::tag_meta_export);
|
||||
auto mm = common::new_str_hash[str]();
|
||||
|
||||
fn metadata_matches(&vec[u8] data,
|
||||
for each (ebml::doc m in ebml::tagged_docs(meta_items,
|
||||
metadata::tag_meta_item)) {
|
||||
|
||||
auto kd = ebml::get_doc(m, metadata::tag_meta_item_key);
|
||||
auto vd = ebml::get_doc(m, metadata::tag_meta_item_value);
|
||||
|
||||
auto k = str::unsafe_from_bytes(ebml::doc_data(kd));
|
||||
auto v = str::unsafe_from_bytes(ebml::doc_data(vd));
|
||||
|
||||
log #fmt("metadata in %s: %s = %s", path, k, v);
|
||||
|
||||
if (!mm.insert(k,v)) {
|
||||
sess.warn(#fmt("Duplicate metadata item in %s: %s", path, k));
|
||||
}
|
||||
}
|
||||
ret mm;
|
||||
}
|
||||
|
||||
fn metadata_matches(hashmap[str,str] mm,
|
||||
&vec[@ast::meta_item] metas) -> bool {
|
||||
log #fmt("matching %u metadata requirements against %u metadata items",
|
||||
vec::len(metas), mm.size());
|
||||
for (@ast::meta_item mi in metas) {
|
||||
alt (mm.find(mi.node.key)) {
|
||||
case (some(?v)) {
|
||||
if (v == mi.node.value) {
|
||||
log #fmt("matched '%s': '%s'",
|
||||
mi.node.key, mi.node.value);
|
||||
} else {
|
||||
log #fmt("missing '%s': '%s' (got '%s')",
|
||||
mi.node.key, mi.node.value, v);
|
||||
ret false;
|
||||
}
|
||||
}
|
||||
case (none) {
|
||||
log #fmt("missing '%s': '%s'",
|
||||
mi.node.key, mi.node.value);
|
||||
ret false;
|
||||
}
|
||||
}
|
||||
}
|
||||
ret true;
|
||||
}
|
||||
|
||||
|
|
@ -547,7 +592,8 @@ fn find_library_crate(&session::session sess,
|
|||
|
||||
alt (get_metadata_section(path)) {
|
||||
case (option::some(?cvec)) {
|
||||
if (!metadata_matches(cvec, metas)) {
|
||||
auto mm = get_exported_metadata(sess, path, cvec);
|
||||
if (!metadata_matches(mm, metas)) {
|
||||
log #fmt("skipping %s, metadata doesn't match", path);
|
||||
cont;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue