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 0000000000..063d9d2dff
--- /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 0000000000..db5605472c
--- /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 0000000000..42e313b355
--- /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 0000000000..abe2550a1d
--- /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 b8d30c1564..11c3430773 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 f9fb806d7b..c61bbb7155 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);