elide the 'ErrorInfo' in logError and logWarning calls

This commit is contained in:
Ben Burdette 2020-06-02 08:22:24 -06:00
parent 734283d636
commit d82d230b40
11 changed files with 187 additions and 224 deletions

View file

@ -200,12 +200,11 @@ static int _main(int argc, char * * argv)
} catch (std::exception & e) { } catch (std::exception & e) {
auto msg = chomp(drainFD(5, false)); auto msg = chomp(drainFD(5, false));
logError( logError({
ErrorInfo { .name = "Remote build",
.name = "Remote build", .hint = hintfmt("cannot build on '%s': %s%s",
.hint = hintfmt("cannot build on '%s': %s%s", bestMachine->storeUri, e.what(),
bestMachine->storeUri, e.what(), (msg.empty() ? "" : ": " + msg))
(msg.empty() ? "" : ": " + msg))
}); });
bestMachine->enabled = false; bestMachine->enabled = false;
continue; continue;

View file

@ -62,101 +62,96 @@ int main()
// For completeness sake, show 'info' through 'vomit' levels. // For completeness sake, show 'info' through 'vomit' levels.
// But this is maybe a heavy format for those. // But this is maybe a heavy format for those.
logger->logEI( logger->logEI({ .level = lvlInfo,
ErrorInfo { .level = lvlInfo,
.name = "Info name", .name = "Info name",
.description = "Info description", .description = "Info description",
}); });
logger->logEI( logger->logEI({ .level = lvlTalkative,
ErrorInfo { .level = lvlTalkative,
.name = "Talkative name", .name = "Talkative name",
.description = "Talkative description", .description = "Talkative description",
}); });
logger->logEI( logger->logEI({ .level = lvlChatty,
ErrorInfo { .level = lvlChatty,
.name = "Chatty name", .name = "Chatty name",
.description = "Chatty description", .description = "Chatty description",
}); });
logger->logEI( logger->logEI({ .level = lvlDebug,
ErrorInfo { .level = lvlDebug,
.name = "Debug name", .name = "Debug name",
.description = "Debug description", .description = "Debug description",
}); });
logger->logEI( logger->logEI({ .level = lvlVomit,
ErrorInfo { .level = lvlVomit,
.name = "Vomit name", .name = "Vomit name",
.description = "Vomit description", .description = "Vomit description",
}); });
// Error in a program; no hint and no nix code. // Error in a program; no hint and no nix code.
logError( logError({
ErrorInfo { .name = "name", .name = "name",
.description = "error description", .description = "error description",
}); });
// Warning with name, description, and hint. // Warning with name, description, and hint.
// The hintfmt function makes all the substituted text yellow. // The hintfmt function makes all the substituted text yellow.
logWarning( logWarning({
ErrorInfo { .name = "name", .name = "name",
.description = "error description", .description = "error description",
.hint = hintfmt("there was a %1%", "warning"), .hint = hintfmt("there was a %1%", "warning"),
}); });
// Warning with nix file, line number, column, and the lines of // Warning with nix file, line number, column, and the lines of
// code where a warning occurred. // code where a warning occurred.
SymbolTable testTable; SymbolTable testTable;
auto problem_file = testTable.create("myfile.nix"); auto problem_file = testTable.create("myfile.nix");
logWarning( logWarning({
ErrorInfo { .name = "warning name", .name = "warning name",
.description = "warning description", .description = "warning description",
.hint = hintfmt("this hint has %1% templated %2%!!", .hint = hintfmt("this hint has %1% templated %2%!!",
"yellow", "yellow",
"values"), "values"),
.nixCode = NixCode { .nixCode = NixCode {
.errPos = Pos(problem_file, 40, 13), .errPos = Pos(problem_file, 40, 13),
.prevLineOfCode = std::nullopt, .prevLineOfCode = std::nullopt,
.errLineOfCode = "this is the problem line of code", .errLineOfCode = "this is the problem line of code",
.nextLineOfCode = std::nullopt .nextLineOfCode = std::nullopt
}}); }});
// Error with previous and next lines of code. // Error with previous and next lines of code.
logError( logError({
ErrorInfo { .name = "error name", .name = "error name",
.description = "error with code lines", .description = "error with code lines",
.hint = hintfmt("this hint has %1% templated %2%!!", .hint = hintfmt("this hint has %1% templated %2%!!",
"yellow", "yellow",
"values"), "values"),
.nixCode = NixCode { .nixCode = NixCode {
.errPos = Pos(problem_file, 40, 13), .errPos = Pos(problem_file, 40, 13),
.prevLineOfCode = "previous line of code", .prevLineOfCode = "previous line of code",
.errLineOfCode = "this is the problem line of code", .errLineOfCode = "this is the problem line of code",
.nextLineOfCode = "next line of code", .nextLineOfCode = "next line of code",
}}); }});
// Error without lines of code. // Error without lines of code.
logError( logError({
ErrorInfo { .name = "error name", .name = "error name",
.description = "error without any code lines.", .description = "error without any code lines.",
.hint = hintfmt("this hint has %1% templated %2%!!", .hint = hintfmt("this hint has %1% templated %2%!!",
"yellow", "yellow",
"values"), "values"),
.nixCode = NixCode { .nixCode = NixCode {
.errPos = Pos(problem_file, 40, 13) .errPos = Pos(problem_file, 40, 13)
}}); }});
// Error with only hint and name.. // Error with only hint and name..
logError( logError({
ErrorInfo { .name = "error name", .name = "error name",
.hint = hintfmt("hint %1%", "only"), .hint = hintfmt("hint %1%", "only"),
.nixCode = NixCode { .nixCode = NixCode {
.errPos = Pos(problem_file, 40, 13) .errPos = Pos(problem_file, 40, 13)
}}); }});
return 0; return 0;
} }

View file

@ -1158,10 +1158,9 @@ void DerivationGoal::loadDerivation()
trace("loading derivation"); trace("loading derivation");
if (nrFailed != 0) { if (nrFailed != 0) {
logError( logError({
ErrorInfo { .name = "missing derivation during build",
.name = "missing derivation during build", .hint = hintfmt("cannot build missing derivation '%s'", worker.store.printStorePath(drvPath))
.hint = hintfmt("cannot build missing derivation '%s'", worker.store.printStorePath(drvPath))
}); });
done(BuildResult::MiscFailure); done(BuildResult::MiscFailure);
return; return;
@ -1313,12 +1312,11 @@ void DerivationGoal::repairClosure()
/* Check each path (slow!). */ /* Check each path (slow!). */
for (auto & i : outputClosure) { for (auto & i : outputClosure) {
if (worker.pathContentsGood(i)) continue; if (worker.pathContentsGood(i)) continue;
logError( logError({
ErrorInfo { .name = "Corrupt path in closure",
.name = "Corrupt path in closure", .hint = hintfmt(
.hint = hintfmt( "found corrupted or missing path '%s' in the output closure of '%s'",
"found corrupted or missing path '%s' in the output closure of '%s'", worker.store.printStorePath(i), worker.store.printStorePath(drvPath))
worker.store.printStorePath(i), worker.store.printStorePath(drvPath))
}); });
auto drvPath2 = outputsToDrv.find(i); auto drvPath2 = outputsToDrv.find(i);
if (drvPath2 == outputsToDrv.end()) if (drvPath2 == outputsToDrv.end())
@ -1353,12 +1351,11 @@ void DerivationGoal::inputsRealised()
if (nrFailed != 0) { if (nrFailed != 0) {
if (!useDerivation) if (!useDerivation)
throw Error("some dependencies of '%s' are missing", worker.store.printStorePath(drvPath)); throw Error("some dependencies of '%s' are missing", worker.store.printStorePath(drvPath));
logError( logError({
ErrorInfo { .name = "Dependencies could not be built",
.name = "Dependencies could not be built", .hint = hintfmt(
.hint = hintfmt( "cannot build derivation '%s': %s dependencies couldn't be built",
"cannot build derivation '%s': %s dependencies couldn't be built", worker.store.printStorePath(drvPath), nrFailed)
worker.store.printStorePath(drvPath), nrFailed)
}); });
done(BuildResult::DependencyFailed); done(BuildResult::DependencyFailed);
return; return;
@ -1844,12 +1841,11 @@ HookReply DerivationGoal::tryBuildHook()
} catch (SysError & e) { } catch (SysError & e) {
if (e.errNo == EPIPE) { if (e.errNo == EPIPE) {
logError( logError({
ErrorInfo { .name = "Build hook died",
.name = "Build hook died", .hint = hintfmt(
.hint = hintfmt( "build hook died unexpectedly: %s",
"build hook died unexpectedly: %s", chomp(drainFD(worker.hook->fromHook.readSide.get())))
chomp(drainFD(worker.hook->fromHook.readSide.get())))
}); });
worker.hook = 0; worker.hook = 0;
return rpDecline; return rpDecline;
@ -3692,11 +3688,10 @@ void DerivationGoal::registerOutputs()
/* Apply hash rewriting if necessary. */ /* Apply hash rewriting if necessary. */
bool rewritten = false; bool rewritten = false;
if (!outputRewrites.empty()) { if (!outputRewrites.empty()) {
logWarning( logWarning({
ErrorInfo { .name = "Rewriting hashes",
.name = "Rewriting hashes", .hint = hintfmt("rewriting hashes in '%1%'; cross fingers", path)
.hint = hintfmt("rewriting hashes in '%1%'; cross fingers", path) });
});
/* Canonicalise first. This ensures that the path we're /* Canonicalise first. This ensures that the path we're
rewriting doesn't contain a hard link to /etc/shadow or rewriting doesn't contain a hard link to /etc/shadow or
@ -3875,10 +3870,9 @@ void DerivationGoal::registerOutputs()
if (settings.enforceDeterminism) if (settings.enforceDeterminism)
throw NotDeterministic(hint); throw NotDeterministic(hint);
logError( logError({
ErrorInfo { .name = "Output determinism error",
.name = "Output determinism error", .hint = hint
.hint = hint
}); });
@ -4145,12 +4139,11 @@ void DerivationGoal::handleChildOutput(int fd, const string & data)
{ {
logSize += data.size(); logSize += data.size();
if (settings.maxLogSize && logSize > settings.maxLogSize) { if (settings.maxLogSize && logSize > settings.maxLogSize) {
logError( logError({
ErrorInfo { .name = "Max log size exceeded",
.name = "Max log size exceeded", .hint = hintfmt(
.hint = hintfmt( "%1% killed after writing more than %2% bytes of log output",
"%1% killed after writing more than %2% bytes of log output", getName(), settings.maxLogSize)
getName(), settings.maxLogSize)
}); });
killChild(); killChild();
done(BuildResult::LogLimitExceeded); done(BuildResult::LogLimitExceeded);
@ -4467,12 +4460,11 @@ void SubstitutionGoal::tryNext()
&& !sub->isTrusted && !sub->isTrusted
&& !info->checkSignatures(worker.store, worker.store.getPublicKeys())) && !info->checkSignatures(worker.store, worker.store.getPublicKeys()))
{ {
logWarning( logWarning({
ErrorInfo { .name = "Invalid path signature",
.name = "Invalid path signature", .hint = hintfmt("substituter '%s' does not have a valid signature for path '%s'",
.hint = hintfmt("substituter '%s' does not have a valid signature for path '%s'", sub->getUri(), worker.store.printStorePath(storePath))
sub->getUri(), worker.store.printStorePath(storePath)) });
});
tryNext(); tryNext();
return; return;
} }
@ -4954,12 +4946,11 @@ void Worker::waitForInput()
j->respectTimeouts && j->respectTimeouts &&
after - j->lastOutput >= std::chrono::seconds(settings.maxSilentTime)) after - j->lastOutput >= std::chrono::seconds(settings.maxSilentTime))
{ {
logError( logError({
ErrorInfo { .name = "Silent build timeout",
.name = "Silent build timeout", .hint = hintfmt(
.hint = hintfmt( "%1% timed out after %2% seconds of silence",
"%1% timed out after %2% seconds of silence", goal->getName(), settings.maxSilentTime)
goal->getName(), settings.maxSilentTime)
}); });
goal->timedOut(); goal->timedOut();
} }
@ -4969,12 +4960,11 @@ void Worker::waitForInput()
j->respectTimeouts && j->respectTimeouts &&
after - j->timeStarted >= std::chrono::seconds(settings.buildTimeout)) after - j->timeStarted >= std::chrono::seconds(settings.buildTimeout))
{ {
logError( logError({
ErrorInfo { .name = "Build timeout",
.name = "Build timeout", .hint = hintfmt(
.hint = hintfmt( "%1% timed out after %2% seconds",
"%1% timed out after %2% seconds", goal->getName(), settings.buildTimeout)
goal->getName(), settings.buildTimeout)
}); });
goal->timedOut(); goal->timedOut();
} }
@ -5035,10 +5025,9 @@ bool Worker::pathContentsGood(const StorePath & path)
} }
pathContentsGoodCache.insert_or_assign(path.clone(), res); pathContentsGoodCache.insert_or_assign(path.clone(), res);
if (!res) if (!res)
logError( logError({
ErrorInfo { .name = "Corrupted path",
.name = "Corrupted path", .hint = hintfmt("path '%s' is corrupted or missing!", store.printStorePath(path))
.hint = hintfmt("path '%s' is corrupted or missing!", store.printStorePath(path))
}); });
return res; return res;
} }

View file

@ -599,12 +599,11 @@ struct curlFileTransfer : public FileTransfer
workerThreadMain(); workerThreadMain();
} catch (nix::Interrupted & e) { } catch (nix::Interrupted & e) {
} catch (std::exception & e) { } catch (std::exception & e) {
logError( logError({
ErrorInfo { .name = "File transfer",
.name = "File transfer", .hint = hintfmt("unexpected error in download thread: %s",
.hint = hintfmt("unexpected error in download thread: %s", e.what())
e.what()) });
});
} }
{ {

View file

@ -87,12 +87,11 @@ LocalStore::LocalStore(const Params & params)
struct group * gr = getgrnam(settings.buildUsersGroup.get().c_str()); struct group * gr = getgrnam(settings.buildUsersGroup.get().c_str());
if (!gr) if (!gr)
logError( logError({
ErrorInfo { .name = "'build-users-group' not found",
.name = "'build-users-group' not found", .hint = hintfmt(
.hint = hintfmt( "warning: the group '%1%' specified in 'build-users-group' does not exist",
"warning: the group '%1%' specified in 'build-users-group' does not exist", settings.buildUsersGroup)
settings.buildUsersGroup)
}); });
else { else {
struct stat st; struct stat st;
@ -1242,12 +1241,11 @@ bool LocalStore::verifyStore(bool checkContents, RepairFlag repair)
Path linkPath = linksDir + "/" + link.name; Path linkPath = linksDir + "/" + link.name;
string hash = hashPath(htSHA256, linkPath).first.to_string(Base32, false); string hash = hashPath(htSHA256, linkPath).first.to_string(Base32, false);
if (hash != link.name) { if (hash != link.name) {
logError( logError({
ErrorInfo { .name = "Invalid hash",
.name = "Invalid hash", .hint = hintfmt(
.hint = hintfmt( "link '%s' was modified! expected hash '%s', got '%s'",
"link '%s' was modified! expected hash '%s', got '%s'", linkPath, link.name, hash)
linkPath, link.name, hash)
}); });
if (repair) { if (repair) {
if (unlink(linkPath.c_str()) == 0) if (unlink(linkPath.c_str()) == 0)
@ -1281,11 +1279,10 @@ bool LocalStore::verifyStore(bool checkContents, RepairFlag repair)
auto current = hashSink->finish(); auto current = hashSink->finish();
if (info->narHash != nullHash && info->narHash != current.first) { if (info->narHash != nullHash && info->narHash != current.first) {
logError( logError({
ErrorInfo { .name = "Invalid hash - path modified",
.name = "Invalid hash - path modified", .hint = hintfmt("path '%s' was modified! expected hash '%s', got '%s'",
.hint = hintfmt("path '%s' was modified! expected hash '%s', got '%s'", printStorePath(i), info->narHash.to_string(), current.first.to_string())
printStorePath(i), info->narHash.to_string(), current.first.to_string())
}); });
if (repair) repairPath(i); else errors = true; if (repair) repairPath(i); else errors = true;
} else { } else {
@ -1337,10 +1334,9 @@ void LocalStore::verifyPath(const Path & pathS, const StringSet & store,
if (!done.insert(pathS).second) return; if (!done.insert(pathS).second) return;
if (!isStorePath(pathS)) { if (!isStorePath(pathS)) {
logError( logError({
ErrorInfo { .name = "Nix path not found",
.name = "Nix path not found", .hint = hintfmt("path '%s' is not in the Nix store", pathS)
.hint = hintfmt("path '%s' is not in the Nix store", pathS)
}); });
return; return;
} }
@ -1364,10 +1360,9 @@ void LocalStore::verifyPath(const Path & pathS, const StringSet & store,
auto state(_state.lock()); auto state(_state.lock());
invalidatePath(*state, path); invalidatePath(*state, path);
} else { } else {
logError( logError({
ErrorInfo { .name = "Missing path with referrers",
.name = "Missing path with referrers", .hint = hintfmt("path '%s' disappeared, but it still has valid referrers!", pathS)
.hint = hintfmt("path '%s' disappeared, but it still has valid referrers!", pathS)
}); });
if (repair) if (repair)
try { try {

View file

@ -130,10 +130,9 @@ void LocalStore::optimisePath_(Activity * act, OptimiseStats & stats,
NixOS (example: $fontconfig/var/cache being modified). Skip NixOS (example: $fontconfig/var/cache being modified). Skip
those files. FIXME: check the modification time. */ those files. FIXME: check the modification time. */
if (S_ISREG(st.st_mode) && (st.st_mode & S_IWUSR)) { if (S_ISREG(st.st_mode) && (st.st_mode & S_IWUSR)) {
logWarning( logWarning({
ErrorInfo { .name = "Suspicious file",
.name = "Suspicious file", .hint = hintfmt("skipping suspicious writable file '%1%'", path)
.hint = hintfmt("skipping suspicious writable file '%1%'", path)
}); });
return; return;
} }
@ -198,10 +197,9 @@ void LocalStore::optimisePath_(Activity * act, OptimiseStats & stats,
} }
if (st.st_size != stLink.st_size) { if (st.st_size != stLink.st_size) {
logWarning( logWarning({
ErrorInfo { .name = "Corrupted link",
.name = "Corrupted link", .hint = hintfmt("removing corrupted link '%1%'", linkPath)
.hint = hintfmt("removing corrupted link '%1%'", linkPath)
}); });
unlink(linkPath.c_str()); unlink(linkPath.c_str());
goto retry; goto retry;
@ -237,10 +235,9 @@ void LocalStore::optimisePath_(Activity * act, OptimiseStats & stats,
/* Atomically replace the old file with the new hard link. */ /* Atomically replace the old file with the new hard link. */
if (rename(tempLink.c_str(), path.c_str()) == -1) { if (rename(tempLink.c_str(), path.c_str()) == -1) {
if (unlink(tempLink.c_str()) == -1) if (unlink(tempLink.c_str()) == -1)
logError( logError({
ErrorInfo { .name = "Unlink error",
.name = "Unlink error", .hint = hintfmt("unable to unlink '%1%'", tempLink)
.hint = hintfmt("unable to unlink '%1%'", tempLink)
}); });
if (errno == EMLINK) { if (errno == EMLINK) {
/* Some filesystems generate too many links on the rename, /* Some filesystems generate too many links on the rename,

View file

@ -251,10 +251,9 @@ bool handleJSONLogMessage(const std::string & msg,
} }
} catch (std::exception & e) { } catch (std::exception & e) {
logError( logError({
ErrorInfo { .name = "Json log message",
.name = "Json log message", .hint = hintfmt("bad log message from builder: %s", e.what())
.hint = hintfmt("bad log message from builder: %s", e.what())
}); });
} }

View file

@ -123,10 +123,9 @@ static void getAllExprs(EvalState & state,
if (hasSuffix(attrName, ".nix")) if (hasSuffix(attrName, ".nix"))
attrName = string(attrName, 0, attrName.size() - 4); attrName = string(attrName, 0, attrName.size() - 4);
if (!attrs.insert(attrName).second) { if (!attrs.insert(attrName).second) {
logError( logError({
ErrorInfo { .name = "Name collision",
.name = "Name collision", .hint = hintfmt("warning: name collision in input Nix expressions, skipping '%1%'", path2)
.hint = hintfmt("warning: name collision in input Nix expressions, skipping '%1%'", path2)
}); });
continue; continue;
} }
@ -875,11 +874,10 @@ static void queryJSON(Globals & globals, vector<DrvInfo> & elems)
auto placeholder = metaObj.placeholder(j); auto placeholder = metaObj.placeholder(j);
Value * v = i.queryMeta(j); Value * v = i.queryMeta(j);
if (!v) { if (!v) {
logError( logError({
ErrorInfo { .name = "Invalid meta attribute",
.name = "Invalid meta attribute", .hint = hintfmt("derivation '%s' has invalid meta attribute '%s'",
.hint = hintfmt("derivation '%s' has invalid meta attribute '%s'", i.queryName(), j)
i.queryName(), j)
}); });
placeholder.write(nullptr); placeholder.write(nullptr);
} else { } else {
@ -1131,12 +1129,11 @@ static void opQuery(Globals & globals, Strings opFlags, Strings opArgs)
attrs2["name"] = j; attrs2["name"] = j;
Value * v = i.queryMeta(j); Value * v = i.queryMeta(j);
if (!v) if (!v)
logError( logError({
ErrorInfo { .name = "Invalid meta attribute",
.name = "Invalid meta attribute", .hint = hintfmt(
.hint = hintfmt( "derivation '%s' has invalid meta attribute '%s'",
"derivation '%s' has invalid meta attribute '%s'", i.queryName(), j)
i.queryName(), j)
}); });
else { else {
if (v->type == tString) { if (v->type == tString) {

View file

@ -704,7 +704,7 @@ static void opVerify(Strings opFlags, Strings opArgs)
else throw UsageError("unknown flag '%1%'", i); else throw UsageError("unknown flag '%1%'", i);
if (store->verifyStore(checkContents, repair)) { if (store->verifyStore(checkContents, repair)) {
logWarning(ErrorInfo { logWarning({
.name = "Store consistency", .name = "Store consistency",
.description = "not all errors were fixed" .description = "not all errors were fixed"
}); });
@ -729,14 +729,13 @@ static void opVerifyPath(Strings opFlags, Strings opArgs)
store->narFromPath(path, sink); store->narFromPath(path, sink);
auto current = sink.finish(); auto current = sink.finish();
if (current.first != info->narHash) { if (current.first != info->narHash) {
logError( logError({
ErrorInfo { .name = "Hash mismatch",
.name = "Hash mismatch", .hint = hintfmt(
.hint = hintfmt( "path '%s' was modified! expected hash '%s', got '%s'",
"path '%s' was modified! expected hash '%s', got '%s'", store->printStorePath(path),
store->printStorePath(path), info->narHash.to_string(),
info->narHash.to_string(), current.first.to_string())
current.first.to_string())
}); });
status = 1; status = 1;
} }

View file

@ -99,15 +99,14 @@ struct CmdVerify : StorePathsCommand
if (hash.first != info->narHash) { if (hash.first != info->narHash) {
corrupted++; corrupted++;
act2.result(resCorruptedPath, store->printStorePath(info->path)); act2.result(resCorruptedPath, store->printStorePath(info->path));
logError( logError({
ErrorInfo { .name = "Hash error - path modified",
.name = "Hash error - path modified", .hint = hintfmt(
.hint = hintfmt( "path '%s' was modified! expected hash '%s', got '%s'",
"path '%s' was modified! expected hash '%s', got '%s'", store->printStorePath(info->path),
store->printStorePath(info->path), info->narHash.to_string(),
info->narHash.to_string(), hash.first.to_string())
hash.first.to_string()) });
});
} }
} }
@ -156,11 +155,10 @@ struct CmdVerify : StorePathsCommand
if (!good) { if (!good) {
untrusted++; untrusted++;
act2.result(resUntrustedPath, store->printStorePath(info->path)); act2.result(resUntrustedPath, store->printStorePath(info->path));
logError( logError({
ErrorInfo { .name = "Untrusted path",
.name = "Untrusted path", .hint = hintfmt("path '%s' is untrusted",
.hint = hintfmt("path '%s' is untrusted", store->printStorePath(info->path))
store->printStorePath(info->path))
}); });
} }

View file

@ -39,19 +39,17 @@ std::set<std::string> runResolver(const Path & filename)
throw SysError("statting '%s'", filename); throw SysError("statting '%s'", filename);
if (!S_ISREG(st.st_mode)) { if (!S_ISREG(st.st_mode)) {
logError( logError({
ErrorInfo { .name = "Regular MACH file",
.name = "Regular MACH file", .hint = hintfmt("file '%s' is not a regular file", filename)
.hint = hintfmt("file '%s' is not a regular file", filename)
}); });
return {}; return {};
} }
if (st.st_size < sizeof(mach_header_64)) { if (st.st_size < sizeof(mach_header_64)) {
logError( logError({
ErrorInfo { .name = "File too short",
.name = "File too short", .hint = hintfmt("file '%s' is too short for a MACH binary", filename)
.hint = hintfmt("file '%s' is too short for a MACH binary", filename)
}); });
return {}; return {};
} }
@ -74,20 +72,18 @@ std::set<std::string> runResolver(const Path & filename)
} }
} }
if (mach64_offset == 0) { if (mach64_offset == 0) {
logError( logError({
ErrorInfo { .name = "No mach64 blobs",
.name = "No mach64 blobs", .hint = hintfmt("Could not find any mach64 blobs in file '%1%', continuing...", filename)
.hint = hintfmt("Could not find any mach64 blobs in file '%1%', continuing...", filename)
}); });
return {}; return {};
} }
} else if (magic == MH_MAGIC_64 || magic == MH_CIGAM_64) { } else if (magic == MH_MAGIC_64 || magic == MH_CIGAM_64) {
mach64_offset = 0; mach64_offset = 0;
} else { } else {
logError( logError({
ErrorInfo { .name = "Magic number",
.name = "Magic number", .hint = hintfmt("Object file has unknown magic number '%1%', skipping it...", magic)
.hint = hintfmt("Object file has unknown magic number '%1%', skipping it...", magic)
}); });
return {}; return {};
} }