From 866e84ec491042883fdab247dd0f5a38bd56b7cf Mon Sep 17 00:00:00 2001 From: Norman Feske Date: Wed, 25 Jan 2023 13:59:56 +0100 Subject: [PATCH] depot_query: supplement url to scanned user The 'scan' query for depot users used to list the names of depot users. However, the URL and existence of a pubkey is useful to know when assembling a GUI menu from this list. Issue #4744 --- repos/gems/src/app/depot_query/main.cc | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/repos/gems/src/app/depot_query/main.cc b/repos/gems/src/app/depot_query/main.cc index c1455eed2a..4a6b07544b 100644 --- a/repos/gems/src/app/depot_query/main.cc +++ b/repos/gems/src/app/depot_query/main.cc @@ -235,6 +235,8 @@ class Depot_query::Dependencies struct Depot_query::Main { + using Url = String<256>; + Env &_env; Heap _heap { _env.ram(), _env.rm() }; @@ -331,6 +333,7 @@ struct Depot_query::Main void _query_blueprint(Directory::Path const &, Xml_generator &); void _collect_source_dependencies(Archive::Path const &, Dependencies &, Recursion_limit); void _collect_binary_dependencies(Archive::Path const &, Dependencies &, Recursion_limit); + void _scan_user(Archive::User const &, Xml_generator &); void _query_user(Archive::User const &, Xml_generator &); void _gen_index_node_rec(Xml_generator &, Xml_node const &, unsigned) const; void _gen_index_for_arch(Xml_generator &, Xml_node const &) const; @@ -402,8 +405,7 @@ struct Depot_query::Main query.for_each_sub_node("scan", [&] (Xml_node node) { if (node.attribute_value("users", false)) { for_each_subdir_name(_heap, _depot_dir, [&] (auto name) { - xml.node("user", [&] () { - xml.attribute("name", name); }); }); } }); }); + _scan_user(name, xml); }); } }); }); _gen_versioned_report(_blueprint_reporter, version, [&] (Xml_generator &xml) { query.for_each_sub_node("blueprint", [&] (Xml_node node) { @@ -690,6 +692,24 @@ void Depot_query::Main::_collect_binary_dependencies(Archive::Path const &path, } +void Depot_query::Main::_scan_user(Archive::User const &user, Xml_generator &xml) +{ + xml.node("user", [&] () { + + Directory user_dir(_root, Directory::Path("depot/", user)); + + xml.attribute("name", user); + xml.attribute("known_pubkey", user_dir.file_exists("pubkey") ? "yes" : "no"); + + if (user_dir.file_exists("download")) { + File_content download(_heap, user_dir, "download", File_content::Limit{4*1024}); + download.for_each_line([&] (Url const &url) { + xml.node("url", [&] () { xml.append_sanitized(url.string()); }); }); + } + }); +} + + void Depot_query::Main::_query_user(Archive::User const &user, Xml_generator &xml) { xml.attribute("name", user);