diff --git a/repos/gems/recipes/pkg/test-depot_query_index/README b/repos/gems/recipes/pkg/test-depot_query_index/README new file mode 100644 index 000000000..063d9d2df --- /dev/null +++ b/repos/gems/recipes/pkg/test-depot_query_index/README @@ -0,0 +1 @@ +Test for querying index files from a depot diff --git a/repos/gems/recipes/pkg/test-depot_query_index/archives b/repos/gems/recipes/pkg/test-depot_query_index/archives new file mode 100644 index 000000000..db5605472 --- /dev/null +++ b/repos/gems/recipes/pkg/test-depot_query_index/archives @@ -0,0 +1,4 @@ +_/src/init +_/src/report_rom +_/src/depot_query +_/src/vfs diff --git a/repos/gems/recipes/pkg/test-depot_query_index/hash b/repos/gems/recipes/pkg/test-depot_query_index/hash new file mode 100644 index 000000000..42e313b35 --- /dev/null +++ b/repos/gems/recipes/pkg/test-depot_query_index/hash @@ -0,0 +1 @@ +2019-02-20 c7c4dffe693619f1906dd0c3398df4e6cf001ea9 diff --git a/repos/gems/recipes/pkg/test-depot_query_index/runtime b/repos/gems/recipes/pkg/test-depot_query_index/runtime new file mode 100644 index 000000000..abe2550a1 --- /dev/null +++ b/repos/gems/recipes/pkg/test-depot_query_index/runtime @@ -0,0 +1,67 @@ + + + + + + [init -> report_rom] report 'depot_query -> index' + [init -> report_rom] *<index> + [init -> report_rom] <index user="genodelabs" version="19.02"> + [init -> report_rom] <index name="Demos"> + [init -> report_rom] <pkg path="nano3d" info="simple software-rendering demo"/> + [init -> report_rom] </index> + [init -> report_rom] </index> + [init -> report_rom] <missing user="genodelabs" version="19.03"/> + [init -> report_rom] </index> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/repos/gems/run/depot_autopilot.run b/repos/gems/run/depot_autopilot.run index b8d30c156..11c343077 100644 --- a/repos/gems/run/depot_autopilot.run +++ b/repos/gems/run/depot_autopilot.run @@ -652,6 +652,7 @@ set default_test_pkgs { test-block test-block_cache test-clipboard + test-depot_query_index test-ds_ownership test-dynamic_config test-dynamic_config_loader diff --git a/repos/gems/src/app/depot_query/main.cc b/repos/gems/src/app/depot_query/main.cc index f9fb806d7..c61bbb715 100644 --- a/repos/gems/src/app/depot_query/main.cc +++ b/repos/gems/src/app/depot_query/main.cc @@ -170,6 +170,7 @@ struct Depot_query::Main Constructible_reporter _blueprint_reporter { }; Constructible_reporter _dependencies_reporter { }; Constructible_reporter _user_reporter { }; + Constructible_reporter _index_reporter { }; template static void _construct_if(bool condition, Constructible &obj, ARGS &&... args) @@ -226,6 +227,7 @@ struct Depot_query::Main void _collect_source_dependencies(Archive::Path const &, Dependencies &, Recursion_limit); void _collect_binary_dependencies(Archive::Path const &, Dependencies &, Recursion_limit); void _query_user(Archive::User const &, Xml_generator &); + void _query_index(Archive::User const &, Archive::Version const &, bool, Xml_generator &); void _handle_config() { @@ -266,6 +268,9 @@ struct Depot_query::Main _construct_if(query.has_sub_node("user"), _user_reporter, _env, "user", "user"); + _construct_if(query.has_sub_node("index"), + _index_reporter, _env, "index", "index"); + _root.apply_config(config.sub_node("vfs")); /* ignore incomplete queries that may occur at the startup */ @@ -324,6 +329,13 @@ struct Depot_query::Main first = false; _query_user(node.attribute_value("name", Archive::User()), xml); }); }); + + _gen_versioned_report(_index_reporter, version, [&] (Xml_generator &xml) { + query.for_each_sub_node("index", [&] (Xml_node node) { + _query_index(node.attribute_value("user", Archive::User()), + node.attribute_value("version", Archive::Version()), + node.attribute_value("content", false), + xml); }); }); } Main(Env &env) : _env(env) @@ -589,6 +601,38 @@ void Depot_query::Main::_query_user(Archive::User const &user, Xml_generator &xm } +void Depot_query::Main::_query_index(Archive::User const &user, + Archive::Version const &version, + bool const content, Xml_generator &xml) +{ + Directory::Path const index_path("depot/", user, "/index/", version); + if (!_root.file_exists(index_path)) { + xml.node("missing", [&] () { + xml.attribute("user", user); + xml.attribute("version", version); + }); + return; + } + + xml.node("index", [&] () { + xml.attribute("user", user); + xml.attribute("version", version); + + if (content) { + try { + File_content const + file(_heap, _root, index_path, File_content::Limit{16*1024}); + + file.xml([&] (Xml_node node) { + node.with_raw_content([&] (char const *start, size_t lenght) { + xml.append(start, lenght); }); }); + + } catch (Directory::Nonexistent_file) { } + } + }); +} + + void Component::construct(Genode::Env &env) { static Depot_query::Main main(env);