aboutsummaryrefslogtreecommitdiff
path: root/src/zen/cmds/builds_cmd.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/zen/cmds/builds_cmd.cpp')
-rw-r--r--src/zen/cmds/builds_cmd.cpp61
1 files changed, 30 insertions, 31 deletions
diff --git a/src/zen/cmds/builds_cmd.cpp b/src/zen/cmds/builds_cmd.cpp
index 820ca9c45..a98bec250 100644
--- a/src/zen/cmds/builds_cmd.cpp
+++ b/src/zen/cmds/builds_cmd.cpp
@@ -4,6 +4,7 @@
#include <zencore/basicfile.h>
#include <zencore/compactbinarybuilder.h>
+#include <zencore/except_fmt.h>
#include <zencore/filesystem.h>
#include <zencore/fmtutils.h>
#include <zencore/logging.h>
@@ -467,10 +468,12 @@ BuildsCommand::OnParentOptionsParsed(const ZenCliOptions& /*GlobalOptions*/)
{
using namespace builds_impl;
- signal(SIGINT, SignalCallbackHandler);
+ // Held in member variables so the handlers stay installed through the
+ // subcommand's Run() and are restored when BuildsCommand is destroyed.
+ m_SigIntGuard.emplace(SIGINT, SignalCallbackHandler);
#if ZEN_PLATFORM_WINDOWS
- signal(SIGBREAK, SignalCallbackHandler);
-#endif // ZEN_PLATFORM_WINDOWS
+ m_SigBreakGuard.emplace(SIGBREAK, SignalCallbackHandler);
+#endif
// Validate output options
if (m_Configuration.Verbose && m_Configuration.Quiet)
@@ -601,7 +604,9 @@ BuildsSubCmdBase::ParseStorageOptions(std::string& BuildId,
}
if (!ParseBuildStorageUrl(m_Config.Url, Resolved.Host, Resolved.Namespace, Resolved.Bucket, BuildId))
{
- throw OptionParseException("'--url' ('{}') is malformed, it does not match the Cloud Artifact URL format", SubOpts.help());
+ throw OptionParseException(
+ fmt::format("'--url' ('{}') is malformed, it does not match the Cloud Artifact URL format", m_Config.Url),
+ SubOpts.help());
}
}
@@ -826,39 +831,27 @@ BuildsSubCmdBase::CreateBuildStorage(const std::filesystem::path& ZenFolderDef
Oid
BuildsSubCmdBase::ParseBuildId(const std::string& BuildIdStr, cxxopts::Options& SubOpts)
{
- if (BuildIdStr.length() != Oid::StringLength)
+ const Oid BuildId = Oid::TryFromHexString(BuildIdStr);
+ if (BuildId == Oid::Zero)
{
throw OptionParseException(
- fmt::format("'--build-id' ('{}') is malformed, it must be {} characters long", BuildIdStr, Oid::StringLength),
+ fmt::format("'--build-id' ('{}') is malformed, expected {} hex characters", BuildIdStr, Oid::StringLength),
SubOpts.help());
}
- else if (Oid BuildId = Oid::FromHexString(BuildIdStr); BuildId == Oid::Zero)
- {
- throw OptionParseException(fmt::format("'--build-id' ('{}') is invalid", BuildIdStr), SubOpts.help());
- }
- else
- {
- return BuildId;
- }
+ return BuildId;
}
Oid
BuildsSubCmdBase::ParseBuildPartId(const std::string& BuildPartIdStr, cxxopts::Options& SubOpts)
{
- if (BuildPartIdStr.length() != Oid::StringLength)
+ const Oid BuildPartId = Oid::TryFromHexString(BuildPartIdStr);
+ if (BuildPartId == Oid::Zero)
{
throw OptionParseException(
- fmt::format("'--build-id' ('{}') is malformed, it must be {} characters long", BuildPartIdStr, Oid::StringLength),
+ fmt::format("'--build-part-id' ('{}') is malformed, expected {} hex characters", BuildPartIdStr, Oid::StringLength),
SubOpts.help());
}
- else if (Oid BuildPartId = Oid::FromHexString(BuildPartIdStr); BuildPartId == Oid::Zero)
- {
- throw OptionParseException(fmt::format("'--build-id' ('{}') is malformed", BuildPartIdStr), SubOpts.help());
- }
- else
- {
- return BuildPartId;
- }
+ return BuildPartId;
}
std::vector<Oid>
@@ -2217,12 +2210,11 @@ BuildsTestSubCmd::Run(const ZenCliOptions& /*GlobalOptions*/)
const ResolvedStorage Resolved = ParseStorageOptions(TestBuildId, {}, Opts, m_TestSystemRootDir, m_TestStoragePath);
StorageInstance Storage = CreateBuildStorage(m_Path / ZenFolderName, {}, Opts, StorageStats, StorageCacheStats, Auth, Resolved);
- m_BuildId = Oid::NewOid().ToString();
- m_BuildPartId = Oid::NewOid().ToString();
- m_CreateBuild = true;
-
- const Oid BuildId = Oid::FromHexString(m_BuildId);
- const Oid BuildPartId = Oid::FromHexString(m_BuildPartId);
+ const Oid BuildId = Oid::NewOid();
+ const Oid BuildPartId = Oid::NewOid();
+ m_BuildId = BuildId.ToString();
+ m_BuildPartId = BuildPartId.ToString();
+ m_CreateBuild = true;
auto MakeMetaData = [](const Oid& BuildId) -> CbObject {
CbObjectWriter BuildMetaDataWriter;
@@ -2577,7 +2569,14 @@ BuildsTestSubCmd::Run(const ZenCliOptions& /*GlobalOptions*/)
case 1:
{
(void)SetFileReadOnly(FilePath, false);
- (void)RemoveFile(FilePath);
+ std::error_code Ec;
+ const bool Removed = RemoveFile(FilePath, Ec);
+ if (!Removed || Ec)
+ {
+ throw zen::runtime_error("ScrambleDir: failed to delete '{}'. Reason: '{}'",
+ FilePath,
+ Ec ? Ec.message() : "file no longer present");
+ }
}
break;
default: