From 9cdfac225f0dc986ce449cbe8ef72faa39025971 Mon Sep 17 00:00:00 2001 From: zousar Date: Mon, 14 Apr 2025 21:51:39 -0600 Subject: Add a list-container subcommand to zen builds command --- src/zen/cmds/builds_cmd.cpp | 71 +++++++++++++++++++++- src/zen/cmds/builds_cmd.h | 6 +- src/zenutil/filebuildstorage.cpp | 22 ++++++- src/zenutil/include/zenutil/buildstorage.h | 1 + .../include/zenutil/jupiter/jupitersession.h | 2 + src/zenutil/jupiter/jupiterbuildstorage.cpp | 52 ++++++++++++++++ src/zenutil/jupiter/jupitersession.cpp | 15 +++++ 7 files changed, 165 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/zen/cmds/builds_cmd.cpp b/src/zen/cmds/builds_cmd.cpp index cdcd79f58..2d24db956 100644 --- a/src/zen/cmds/builds_cmd.cpp +++ b/src/zen/cmds/builds_cmd.cpp @@ -8906,12 +8906,28 @@ BuildsCommand::BuildsCommand() m_Options.add_option("", "v", "verb", - "Verb for build - list, upload, download, diff, fetch-blob, validate-part", + "Verb for build - list-container, list, upload, download, diff, fetch-blob, validate-part", cxxopts::value(m_Verb), ""); m_Options.parse_positional({"verb"}); m_Options.positional_help("verb"); + // list-container + AddSystemOptions(m_ListContainerOptions); + AddCloudOptions(m_ListContainerOptions); + AddFileOptions(m_ListContainerOptions); + AddOutputOptions(m_ListContainerOptions); + AddZenFolderOptions(m_ListContainerOptions); + m_ListContainerOptions.add_options()("h,help", "Print help"); + m_ListContainerOptions.add_option("", + "", + "result-path", + "Path to json or compactbinary to write query result to", + cxxopts::value(m_ListResultPath), + ""); + m_ListContainerOptions.parse_positional({"query-path", "result-path"}); + m_ListContainerOptions.positional_help("query-path result-path"); + // list AddSystemOptions(m_ListOptions); AddCloudOptions(m_ListOptions); @@ -9206,7 +9222,7 @@ BuildsCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv) { throw zen::OptionParseException(fmt::format("url is not compatible with the storage-path option\n{}", m_Options.help())); } - if (m_Namespace.empty() || m_Bucket.empty()) + if (ToLower(m_Verb) != "list-container" && (m_Namespace.empty() || m_Bucket.empty())) { throw zen::OptionParseException( fmt::format("namespace and bucket options are required for url option\n{}", m_Options.help())); @@ -9596,6 +9612,57 @@ BuildsCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv) try { + if (SubOption == &m_ListContainerOptions) + { + if (!m_ListResultPath.empty()) + { + ZEN_CONSOLE("Running {}: {}", GetRunningExecutablePath(), ZEN_CFG_VERSION_BUILD_STRING_FULL); + } + + BuildStorage::Statistics StorageStats; + BuildStorageCache::Statistics StorageCacheStats; + + const std::filesystem::path ZenFolderPath = m_ZenFolderPath.empty() + ? MakeSafeAbsolutePath(std::filesystem::current_path()) / ZenFolderName + : MakeSafeAbsolutePath(m_ZenFolderPath); + CreateDirectories(ZenFolderPath); + auto _ = MakeGuard([ZenFolderPath]() { + if (CleanDirectory(ZenFolderPath, {})) + { + std::error_code DummyEc; + RemoveDir(ZenFolderPath, DummyEc); + } + }); + + StorageInstance Storage = CreateBuildStorage(StorageStats, StorageCacheStats, ZenTempFolderPath(ZenFolderPath)); + + CbObject Response = Storage.BuildStorage->ListContainers(); + ZEN_ASSERT(ValidateCompactBinary(Response.GetView(), CbValidateMode::All) == CbValidateError::None); + if (m_ListResultPath.empty()) + { + ExtendableStringBuilder<1024> SB; + CompactBinaryToJson(Response.GetView(), SB); + ZEN_CONSOLE("{}", SB.ToView()); + } + else + { + std::filesystem::path ListResultPath = MakeSafeAbsolutePath(m_ListResultPath); + if (ToLower(ListResultPath.extension().string()) == ".cbo") + { + MemoryView ResponseView = Response.GetView(); + WriteFile(ListResultPath, IoBuffer(IoBuffer::Wrap, ResponseView.GetData(), ResponseView.GetSize())); + } + else + { + ExtendableStringBuilder<1024> SB; + CompactBinaryToJson(Response.GetView(), SB); + WriteFile(ListResultPath, IoBuffer(IoBuffer::Wrap, SB.Data(), SB.Size())); + } + } + + return 0; + } + if (SubOption == &m_ListOptions) { if (!m_ListResultPath.empty()) diff --git a/src/zen/cmds/builds_cmd.h b/src/zen/cmds/builds_cmd.h index 7e1e7d0ca..3da1922c9 100644 --- a/src/zen/cmds/builds_cmd.h +++ b/src/zen/cmds/builds_cmd.h @@ -84,6 +84,9 @@ private: std::string m_Verb; // list, upload, download + cxxopts::Options m_ListContainerOptions{"list-container", "List available build containers"}; + std::string m_ListContainerResultPath; + cxxopts::Options m_ListOptions{"list", "List available builds"}; std::string m_ListQueryPath; std::string m_ListResultPath; @@ -114,7 +117,8 @@ private: cxxopts::Options m_MultiTestDownloadOptions{"multi-test-download", "Test multiple sequenced downloads with verify"}; std::vector m_BuildIds; - cxxopts::Options* m_SubCommands[8] = {&m_ListOptions, + cxxopts::Options* m_SubCommands[9] = {&m_ListContainerOptions, + &m_ListOptions, &m_UploadOptions, &m_DownloadOptions, &m_DiffOptions, diff --git a/src/zenutil/filebuildstorage.cpp b/src/zenutil/filebuildstorage.cpp index f335a03a3..b77eb1d11 100644 --- a/src/zenutil/filebuildstorage.cpp +++ b/src/zenutil/filebuildstorage.cpp @@ -35,6 +35,26 @@ public: virtual ~FileBuildStorage() {} + virtual CbObject ListContainers() override + { + ZEN_TRACE_CPU("FileBuildStorage::ListContainers"); + + SimulateLatency(0, 0); + + Stopwatch ExecutionTimer; + auto _ = MakeGuard([&]() { m_Stats.TotalExecutionTimeUs += ExecutionTimer.GetElapsedTimeUs(); }); + m_Stats.TotalRequestCount++; + + CbObjectWriter Writer; + Writer.BeginArray("results"); + { + } + Writer.EndArray(); // results + Writer.Save(); + SimulateLatency(Writer.GetSaveSize(), 0); + return Writer.Save(); + } + virtual CbObject ListBuilds(CbObject Query) override { ZEN_TRACE_CPU("FileBuildStorage::ListBuilds"); @@ -66,7 +86,7 @@ public: } } } - Writer.EndArray(); // builds + Writer.EndArray(); // results Writer.Save(); SimulateLatency(Writer.GetSaveSize(), 0); return Writer.Save(); diff --git a/src/zenutil/include/zenutil/buildstorage.h b/src/zenutil/include/zenutil/buildstorage.h index 05e3ca22d..0785acd62 100644 --- a/src/zenutil/include/zenutil/buildstorage.h +++ b/src/zenutil/include/zenutil/buildstorage.h @@ -25,6 +25,7 @@ public: virtual ~BuildStorage() {} + virtual CbObject ListContainers() = 0; virtual CbObject ListBuilds(CbObject Query) = 0; virtual CbObject PutBuild(const Oid& BuildId, const CbObject& MetaData) = 0; virtual CbObject GetBuild(const Oid& BuildId) = 0; diff --git a/src/zenutil/include/zenutil/jupiter/jupitersession.h b/src/zenutil/include/zenutil/jupiter/jupitersession.h index c2886ca4c..32bfd50f4 100644 --- a/src/zenutil/include/zenutil/jupiter/jupitersession.h +++ b/src/zenutil/include/zenutil/jupiter/jupitersession.h @@ -102,6 +102,8 @@ public: std::vector Filter(std::string_view Namespace, std::string_view BucketId, const std::vector& ChunkHashes); + JupiterResult ListBuildNamespaces(); + JupiterResult ListBuildBuckets(std::string_view Namespace); JupiterResult ListBuilds(std::string_view Namespace, std::string_view BucketId, const IoBuffer& Payload); JupiterResult PutBuild(std::string_view Namespace, std::string_view BucketId, const Oid& BuildId, const IoBuffer& Payload); JupiterResult GetBuild(std::string_view Namespace, std::string_view BucketId, const Oid& BuildId); diff --git a/src/zenutil/jupiter/jupiterbuildstorage.cpp b/src/zenutil/jupiter/jupiterbuildstorage.cpp index 24e062c7b..b2fabb43f 100644 --- a/src/zenutil/jupiter/jupiterbuildstorage.cpp +++ b/src/zenutil/jupiter/jupiterbuildstorage.cpp @@ -35,6 +35,58 @@ public: } virtual ~JupiterBuildStorage() {} + virtual CbObject ListContainers() override + { + ZEN_TRACE_CPU("Jupiter::ListContainers"); + + Stopwatch ExecutionTimer; + auto _ = MakeGuard([&]() { m_Stats.TotalExecutionTimeUs += ExecutionTimer.GetElapsedTimeUs(); }); + JupiterResult ListResult = m_Session.ListBuildNamespaces(); + AddStatistic(ListResult); + if (!ListResult.Success) + { + throw std::runtime_error(fmt::format("Failed listing containers: {} ({})", ListResult.Reason, ListResult.ErrorCode)); + } + CbObject NamespaceResponse = PayloadToCbObject("Failed listing containers"sv, ListResult.Response); + + CbObjectWriter Response; + Response.BeginArray("results"sv); + for (CbFieldView NamespaceField : NamespaceResponse["namespaces"]) + { + std::string_view Namespace = NamespaceField.AsString(); + if (!Namespace.empty()) + { + Response.BeginObject(); + Response.AddString("name", Namespace); + + JupiterResult BucketsResult = m_Session.ListBuildBuckets(Namespace); + AddStatistic(BucketsResult); + if (!BucketsResult.Success) + { + throw std::runtime_error( + fmt::format("Failed listing containers: {} ({})", BucketsResult.Reason, BucketsResult.ErrorCode)); + } + CbObject BucketResponse = PayloadToCbObject("Failed listing containers"sv, BucketsResult.Response); + + Response.BeginArray("items"); + for (CbFieldView BucketField : BucketResponse["buckets"]) + { + std::string_view Bucket = BucketField.AsString(); + if (!Bucket.empty()) + { + Response.AddString(Bucket); + } + } + Response.EndArray(); + + Response.EndObject(); + } + } + Response.EndArray(); + + return Response.Save(); + } + virtual CbObject ListBuilds(CbObject Query) override { ZEN_TRACE_CPU("Jupiter::ListBuilds"); diff --git a/src/zenutil/jupiter/jupitersession.cpp b/src/zenutil/jupiter/jupitersession.cpp index 1f71c29b7..d3076d36b 100644 --- a/src/zenutil/jupiter/jupitersession.cpp +++ b/src/zenutil/jupiter/jupitersession.cpp @@ -356,6 +356,21 @@ JupiterSession::CacheTypeExists(std::string_view Namespace, std::string_view Typ return Result; } +JupiterResult +JupiterSession::ListBuildNamespaces() +{ + HttpClient::Response Response = m_HttpClient.Get(fmt::format("/api/v2/builds"), {HttpClient::Accept(ZenContentType::kJSON)}); + return detail::ConvertResponse(Response, "JupiterSession::ListBuildNamespaces"sv); +} + +JupiterResult +JupiterSession::ListBuildBuckets(std::string_view Namespace) +{ + HttpClient::Response Response = + m_HttpClient.Get(fmt::format("/api/v2/builds/{}", Namespace), {HttpClient::Accept(ZenContentType::kJSON)}); + return detail::ConvertResponse(Response, "JupiterSession::ListBuildBuckets"sv); +} + JupiterResult JupiterSession::ListBuilds(std::string_view Namespace, std::string_view BucketId, const IoBuffer& Payload) { -- cgit v1.2.3 From 2b0c494dece513477c94444c94250cc19a117873 Mon Sep 17 00:00:00 2001 From: zousar Date: Tue, 15 Apr 2025 00:23:59 -0600 Subject: Fix list-container positional args to remove query-path --- src/zen/cmds/builds_cmd.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/zen/cmds/builds_cmd.cpp b/src/zen/cmds/builds_cmd.cpp index 2d24db956..40cd8fa74 100644 --- a/src/zen/cmds/builds_cmd.cpp +++ b/src/zen/cmds/builds_cmd.cpp @@ -8925,8 +8925,8 @@ BuildsCommand::BuildsCommand() "Path to json or compactbinary to write query result to", cxxopts::value(m_ListResultPath), ""); - m_ListContainerOptions.parse_positional({"query-path", "result-path"}); - m_ListContainerOptions.positional_help("query-path result-path"); + m_ListContainerOptions.parse_positional({"result-path"}); + m_ListContainerOptions.positional_help("result-path"); // list AddSystemOptions(m_ListOptions); -- cgit v1.2.3 From 6646a12bbffd349ad234a4265e339797e815493b Mon Sep 17 00:00:00 2001 From: zousar Date: Tue, 22 Apr 2025 15:57:02 -0600 Subject: Replace container with namespaces --- src/zen/cmds/builds_cmd.cpp | 28 +++++++++++++-------- src/zen/cmds/builds_cmd.h | 7 +++--- src/zenutil/filebuildstorage.cpp | 5 ++-- src/zenutil/include/zenutil/buildstorage.h | 2 +- src/zenutil/jupiter/jupiterbuildstorage.cpp | 39 ++++++++++++++++------------- 5 files changed, 46 insertions(+), 35 deletions(-) (limited to 'src') diff --git a/src/zen/cmds/builds_cmd.cpp b/src/zen/cmds/builds_cmd.cpp index 40cd8fa74..bdf349888 100644 --- a/src/zen/cmds/builds_cmd.cpp +++ b/src/zen/cmds/builds_cmd.cpp @@ -8913,20 +8913,26 @@ BuildsCommand::BuildsCommand() m_Options.positional_help("verb"); // list-container - AddSystemOptions(m_ListContainerOptions); - AddCloudOptions(m_ListContainerOptions); - AddFileOptions(m_ListContainerOptions); - AddOutputOptions(m_ListContainerOptions); - AddZenFolderOptions(m_ListContainerOptions); - m_ListContainerOptions.add_options()("h,help", "Print help"); - m_ListContainerOptions.add_option("", + AddSystemOptions(m_ListNamespacesOptions); + AddCloudOptions(m_ListNamespacesOptions); + AddFileOptions(m_ListNamespacesOptions); + AddOutputOptions(m_ListNamespacesOptions); + AddZenFolderOptions(m_ListNamespacesOptions); + m_ListNamespacesOptions.add_options()("h,help", "Print help"); + m_ListNamespacesOptions.add_option("", + "", + "recursive", + "Enable fetch of buckets within namespaces also", + cxxopts::value(m_ListNamespacesRecursive), + ""); + m_ListNamespacesOptions.add_option("", "", "result-path", "Path to json or compactbinary to write query result to", cxxopts::value(m_ListResultPath), ""); - m_ListContainerOptions.parse_positional({"result-path"}); - m_ListContainerOptions.positional_help("result-path"); + m_ListNamespacesOptions.parse_positional({"result-path"}); + m_ListNamespacesOptions.positional_help("result-path"); // list AddSystemOptions(m_ListOptions); @@ -9612,7 +9618,7 @@ BuildsCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv) try { - if (SubOption == &m_ListContainerOptions) + if (SubOption == &m_ListNamespacesOptions) { if (!m_ListResultPath.empty()) { @@ -9636,7 +9642,7 @@ BuildsCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv) StorageInstance Storage = CreateBuildStorage(StorageStats, StorageCacheStats, ZenTempFolderPath(ZenFolderPath)); - CbObject Response = Storage.BuildStorage->ListContainers(); + CbObject Response = Storage.BuildStorage->ListNamespaces(m_ListNamespacesRecursive); ZEN_ASSERT(ValidateCompactBinary(Response.GetView(), CbValidateMode::All) == CbValidateError::None); if (m_ListResultPath.empty()) { diff --git a/src/zen/cmds/builds_cmd.h b/src/zen/cmds/builds_cmd.h index 3da1922c9..f44e758ae 100644 --- a/src/zen/cmds/builds_cmd.h +++ b/src/zen/cmds/builds_cmd.h @@ -84,8 +84,9 @@ private: std::string m_Verb; // list, upload, download - cxxopts::Options m_ListContainerOptions{"list-container", "List available build containers"}; - std::string m_ListContainerResultPath; + cxxopts::Options m_ListNamespacesOptions{"list-namespaces", "List available build namespaces"}; + std::string m_ListNamespacesResultPath; + bool m_ListNamespacesRecursive = false; cxxopts::Options m_ListOptions{"list", "List available builds"}; std::string m_ListQueryPath; @@ -117,7 +118,7 @@ private: cxxopts::Options m_MultiTestDownloadOptions{"multi-test-download", "Test multiple sequenced downloads with verify"}; std::vector m_BuildIds; - cxxopts::Options* m_SubCommands[9] = {&m_ListContainerOptions, + cxxopts::Options* m_SubCommands[9] = {&m_ListNamespacesOptions, &m_ListOptions, &m_UploadOptions, &m_DownloadOptions, diff --git a/src/zenutil/filebuildstorage.cpp b/src/zenutil/filebuildstorage.cpp index b77eb1d11..badfb4840 100644 --- a/src/zenutil/filebuildstorage.cpp +++ b/src/zenutil/filebuildstorage.cpp @@ -35,9 +35,10 @@ public: virtual ~FileBuildStorage() {} - virtual CbObject ListContainers() override + virtual CbObject ListNamespaces(bool bRecursive) override { - ZEN_TRACE_CPU("FileBuildStorage::ListContainers"); + ZEN_TRACE_CPU("FileBuildStorage::ListNamespaces"); + ZEN_UNUSED(bRecursive); SimulateLatency(0, 0); diff --git a/src/zenutil/include/zenutil/buildstorage.h b/src/zenutil/include/zenutil/buildstorage.h index 0785acd62..5422c837c 100644 --- a/src/zenutil/include/zenutil/buildstorage.h +++ b/src/zenutil/include/zenutil/buildstorage.h @@ -25,7 +25,7 @@ public: virtual ~BuildStorage() {} - virtual CbObject ListContainers() = 0; + virtual CbObject ListNamespaces(bool bRecursive = false) = 0; virtual CbObject ListBuilds(CbObject Query) = 0; virtual CbObject PutBuild(const Oid& BuildId, const CbObject& MetaData) = 0; virtual CbObject GetBuild(const Oid& BuildId) = 0; diff --git a/src/zenutil/jupiter/jupiterbuildstorage.cpp b/src/zenutil/jupiter/jupiterbuildstorage.cpp index b2fabb43f..6ada72e1e 100644 --- a/src/zenutil/jupiter/jupiterbuildstorage.cpp +++ b/src/zenutil/jupiter/jupiterbuildstorage.cpp @@ -35,9 +35,9 @@ public: } virtual ~JupiterBuildStorage() {} - virtual CbObject ListContainers() override + virtual CbObject ListNamespaces(bool bRecursive) override { - ZEN_TRACE_CPU("Jupiter::ListContainers"); + ZEN_TRACE_CPU("Jupiter::ListNamespaces"); Stopwatch ExecutionTimer; auto _ = MakeGuard([&]() { m_Stats.TotalExecutionTimeUs += ExecutionTimer.GetElapsedTimeUs(); }); @@ -45,9 +45,9 @@ public: AddStatistic(ListResult); if (!ListResult.Success) { - throw std::runtime_error(fmt::format("Failed listing containers: {} ({})", ListResult.Reason, ListResult.ErrorCode)); + throw std::runtime_error(fmt::format("Failed listing namespaces: {} ({})", ListResult.Reason, ListResult.ErrorCode)); } - CbObject NamespaceResponse = PayloadToCbObject("Failed listing containers"sv, ListResult.Response); + CbObject NamespaceResponse = PayloadToCbObject("Failed listing namespaces"sv, ListResult.Response); CbObjectWriter Response; Response.BeginArray("results"sv); @@ -59,25 +59,28 @@ public: Response.BeginObject(); Response.AddString("name", Namespace); - JupiterResult BucketsResult = m_Session.ListBuildBuckets(Namespace); - AddStatistic(BucketsResult); - if (!BucketsResult.Success) + if (bRecursive) { - throw std::runtime_error( - fmt::format("Failed listing containers: {} ({})", BucketsResult.Reason, BucketsResult.ErrorCode)); - } - CbObject BucketResponse = PayloadToCbObject("Failed listing containers"sv, BucketsResult.Response); + JupiterResult BucketsResult = m_Session.ListBuildBuckets(Namespace); + AddStatistic(BucketsResult); + if (!BucketsResult.Success) + { + throw std::runtime_error( + fmt::format("Failed listing namespaces: {} ({})", BucketsResult.Reason, BucketsResult.ErrorCode)); + } + CbObject BucketResponse = PayloadToCbObject("Failed listing namespaces"sv, BucketsResult.Response); - Response.BeginArray("items"); - for (CbFieldView BucketField : BucketResponse["buckets"]) - { - std::string_view Bucket = BucketField.AsString(); - if (!Bucket.empty()) + Response.BeginArray("items"); + for (CbFieldView BucketField : BucketResponse["buckets"]) { - Response.AddString(Bucket); + std::string_view Bucket = BucketField.AsString(); + if (!Bucket.empty()) + { + Response.AddString(Bucket); + } } + Response.EndArray(); } - Response.EndArray(); Response.EndObject(); } -- cgit v1.2.3 From 45e81401ecf98b035bb3b022af0e2de9f5cffccf Mon Sep 17 00:00:00 2001 From: zousar Date: Tue, 22 Apr 2025 16:22:02 -0600 Subject: Replacing list-container with list-namespaces --- src/zen/cmds/builds_cmd.cpp | 6 +++--- src/zen/cmds/builds_cmd.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/zen/cmds/builds_cmd.cpp b/src/zen/cmds/builds_cmd.cpp index bdf349888..571050654 100644 --- a/src/zen/cmds/builds_cmd.cpp +++ b/src/zen/cmds/builds_cmd.cpp @@ -8906,13 +8906,13 @@ BuildsCommand::BuildsCommand() m_Options.add_option("", "v", "verb", - "Verb for build - list-container, list, upload, download, diff, fetch-blob, validate-part", + "Verb for build - list-namespaces, list, upload, download, diff, fetch-blob, validate-part", cxxopts::value(m_Verb), ""); m_Options.parse_positional({"verb"}); m_Options.positional_help("verb"); - // list-container + // list-namespaces AddSystemOptions(m_ListNamespacesOptions); AddCloudOptions(m_ListNamespacesOptions); AddFileOptions(m_ListNamespacesOptions); @@ -9228,7 +9228,7 @@ BuildsCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv) { throw zen::OptionParseException(fmt::format("url is not compatible with the storage-path option\n{}", m_Options.help())); } - if (ToLower(m_Verb) != "list-container" && (m_Namespace.empty() || m_Bucket.empty())) + if (ToLower(m_Verb) != "list-namespaces" && (m_Namespace.empty() || m_Bucket.empty())) { throw zen::OptionParseException( fmt::format("namespace and bucket options are required for url option\n{}", m_Options.help())); diff --git a/src/zen/cmds/builds_cmd.h b/src/zen/cmds/builds_cmd.h index f44e758ae..6489a7564 100644 --- a/src/zen/cmds/builds_cmd.h +++ b/src/zen/cmds/builds_cmd.h @@ -14,7 +14,7 @@ class BuildsCommand : public CacheStoreCommand { public: static constexpr char Name[] = "builds"; - static constexpr char Description[] = "Manage builds - list, upload, download, diff"; + static constexpr char Description[] = "Manage builds - list, list-namespaces, upload, download, diff"; BuildsCommand(); ~BuildsCommand(); -- cgit v1.2.3 From 4f70ce781de168f78397c8ce03924cf9a3fb8a40 Mon Sep 17 00:00:00 2001 From: zousar Date: Tue, 22 Apr 2025 16:23:24 -0600 Subject: xmake precommit --- src/zen/cmds/builds_cmd.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/zen/cmds/builds_cmd.cpp b/src/zen/cmds/builds_cmd.cpp index 571050654..bc9fa51ac 100644 --- a/src/zen/cmds/builds_cmd.cpp +++ b/src/zen/cmds/builds_cmd.cpp @@ -8926,11 +8926,11 @@ BuildsCommand::BuildsCommand() cxxopts::value(m_ListNamespacesRecursive), ""); m_ListNamespacesOptions.add_option("", - "", - "result-path", - "Path to json or compactbinary to write query result to", - cxxopts::value(m_ListResultPath), - ""); + "", + "result-path", + "Path to json or compactbinary to write query result to", + cxxopts::value(m_ListResultPath), + ""); m_ListNamespacesOptions.parse_positional({"result-path"}); m_ListNamespacesOptions.positional_help("result-path"); -- cgit v1.2.3 From d892428a92a1cc13a01abe714e90a9c2d3eaeb4c Mon Sep 17 00:00:00 2001 From: zousar Date: Tue, 22 Apr 2025 16:27:46 -0600 Subject: Remove list-namespaces from owning command description --- src/zen/cmds/builds_cmd.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/zen/cmds/builds_cmd.h b/src/zen/cmds/builds_cmd.h index 6489a7564..f44e758ae 100644 --- a/src/zen/cmds/builds_cmd.h +++ b/src/zen/cmds/builds_cmd.h @@ -14,7 +14,7 @@ class BuildsCommand : public CacheStoreCommand { public: static constexpr char Name[] = "builds"; - static constexpr char Description[] = "Manage builds - list, list-namespaces, upload, download, diff"; + static constexpr char Description[] = "Manage builds - list, upload, download, diff"; BuildsCommand(); ~BuildsCommand(); -- cgit v1.2.3 From cf6c57b9ffb5eca184c4913c3fca9fabed90e8ba Mon Sep 17 00:00:00 2001 From: zousar Date: Tue, 22 Apr 2025 16:32:27 -0600 Subject: Use SubOption instead of Verb to control flow --- src/zen/cmds/builds_cmd.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/zen/cmds/builds_cmd.cpp b/src/zen/cmds/builds_cmd.cpp index bc9fa51ac..624bb2270 100644 --- a/src/zen/cmds/builds_cmd.cpp +++ b/src/zen/cmds/builds_cmd.cpp @@ -9228,7 +9228,7 @@ BuildsCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv) { throw zen::OptionParseException(fmt::format("url is not compatible with the storage-path option\n{}", m_Options.help())); } - if (ToLower(m_Verb) != "list-namespaces" && (m_Namespace.empty() || m_Bucket.empty())) + if (SubOption != &m_ListNamespacesOptions && (m_Namespace.empty() || m_Bucket.empty())) { throw zen::OptionParseException( fmt::format("namespace and bucket options are required for url option\n{}", m_Options.help())); -- cgit v1.2.3