From 76b82020d4c14e3fcf2718dbb0dbea1f9924470d Mon Sep 17 00:00:00 2001 From: Norman Feske Date: Sun, 25 Feb 2018 14:27:29 +0100 Subject: [PATCH] depot_query: handle missing user info gracefully This patch handles the case where the pubkey or download location for a queries depot user is missing. --- repos/gems/src/app/depot_query/main.cc | 35 ++++++++++++++++---------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/repos/gems/src/app/depot_query/main.cc b/repos/gems/src/app/depot_query/main.cc index 030e59fb2..ba76c6c0d 100644 --- a/repos/gems/src/app/depot_query/main.cc +++ b/repos/gems/src/app/depot_query/main.cc @@ -298,7 +298,12 @@ struct Depot_query::Main if (_user_reporter.constructed()) { _user_reporter->generate([&] (Xml_generator &xml) { + + /* query one user only */ + bool first = true; query.for_each_sub_node("user", [&] (Xml_node node) { + if (!first) return; + first = false; _query_user(node.attribute_value("name", Archive::User()), xml); }); }); } @@ -542,23 +547,27 @@ void Depot_query::Main::_collect_binary_dependencies(Archive::Path const &path, void Depot_query::Main::_query_user(Archive::User const &user, Xml_generator &xml) { - Directory user_dir(_root, Directory::Path("depot/", user)); - xml.attribute("name", user); - File_content download(_heap, user_dir, "download", File_content::Limit{4*1024}); - typedef String<256> Url; - download.for_each_line([&] (Url const &url) { - xml.node("url", [&] () { xml.append_sanitized(url.string()); }); }); + try { + Directory user_dir(_root, Directory::Path("depot/", user)); - File_content pubkey(_heap, user_dir, "pubkey", File_content::Limit{8*1024}); - xml.node("pubkey", [&] () { - typedef String<80> Line; - pubkey.for_each_line([&] (Line const &line) { - xml.append_sanitized(line.string()); - xml.append("\n"); + File_content download(_heap, user_dir, "download", File_content::Limit{4*1024}); + typedef String<256> Url; + download.for_each_line([&] (Url const &url) { + xml.node("url", [&] () { xml.append_sanitized(url.string()); }); }); + + File_content pubkey(_heap, user_dir, "pubkey", File_content::Limit{8*1024}); + xml.node("pubkey", [&] () { + typedef String<80> Line; + pubkey.for_each_line([&] (Line const &line) { + xml.append_sanitized(line.string()); + xml.append("\n"); + }); }); - }); + } + catch (Directory::Nonexistent_file) { + warning("incomplete or missing depot-user info for '", user, "'"); } }