diff options
Diffstat (limited to 'third_party/nix/src/nix/sigs.cc')
-rw-r--r-- | third_party/nix/src/nix/sigs.cc | 196 |
1 files changed, 90 insertions, 106 deletions
diff --git a/third_party/nix/src/nix/sigs.cc b/third_party/nix/src/nix/sigs.cc index b1825c412c2d..da453d1486fe 100644 --- a/third_party/nix/src/nix/sigs.cc +++ b/third_party/nix/src/nix/sigs.cc @@ -1,149 +1,133 @@ +#include <atomic> #include "command.hh" #include "shared.hh" #include "store-api.hh" #include "thread-pool.hh" -#include <atomic> - using namespace nix; -struct CmdCopySigs : StorePathsCommand -{ - Strings substituterUris; - - CmdCopySigs() - { - mkFlag() - .longName("substituter") - .shortName('s') - .labels({"store-uri"}) - .description("use signatures from specified store") - .arity(1) - .handler([&](std::vector<std::string> ss) { substituterUris.push_back(ss[0]); }); - } +struct CmdCopySigs : StorePathsCommand { + Strings substituterUris; - std::string name() override - { - return "copy-sigs"; - } + CmdCopySigs() { + mkFlag() + .longName("substituter") + .shortName('s') + .labels({"store-uri"}) + .description("use signatures from specified store") + .arity(1) + .handler([&](std::vector<std::string> ss) { + substituterUris.push_back(ss[0]); + }); + } - std::string description() override - { - return "copy path signatures from substituters (like binary caches)"; - } + std::string name() override { return "copy-sigs"; } + + std::string description() override { + return "copy path signatures from substituters (like binary caches)"; + } - void run(ref<Store> store, Paths storePaths) override - { - if (substituterUris.empty()) - throw UsageError("you must specify at least one substituter using '-s'"); + void run(ref<Store> store, Paths storePaths) override { + if (substituterUris.empty()) + throw UsageError("you must specify at least one substituter using '-s'"); - // FIXME: factor out commonality with MixVerify. - std::vector<ref<Store>> substituters; - for (auto & s : substituterUris) - substituters.push_back(openStore(s)); + // FIXME: factor out commonality with MixVerify. + std::vector<ref<Store>> substituters; + for (auto& s : substituterUris) substituters.push_back(openStore(s)); - ThreadPool pool; + ThreadPool pool; - std::string doneLabel = "done"; - std::atomic<size_t> added{0}; + std::string doneLabel = "done"; + std::atomic<size_t> added{0}; - //logger->setExpected(doneLabel, storePaths.size()); + // logger->setExpected(doneLabel, storePaths.size()); - auto doPath = [&](const Path & storePath) { - //Activity act(*logger, lvlInfo, format("getting signatures for '%s'") % storePath); + auto doPath = [&](const Path& storePath) { + // Activity act(*logger, lvlInfo, format("getting signatures for '%s'") % + // storePath); - checkInterrupt(); + checkInterrupt(); - auto info = store->queryPathInfo(storePath); + auto info = store->queryPathInfo(storePath); - StringSet newSigs; + StringSet newSigs; - for (auto & store2 : substituters) { - try { - auto info2 = store2->queryPathInfo(storePath); + for (auto& store2 : substituters) { + try { + auto info2 = store2->queryPathInfo(storePath); - /* Don't import signatures that don't match this - binary. */ - if (info->narHash != info2->narHash || - info->narSize != info2->narSize || - info->references != info2->references) - continue; + /* Don't import signatures that don't match this + binary. */ + if (info->narHash != info2->narHash || + info->narSize != info2->narSize || + info->references != info2->references) + continue; - for (auto & sig : info2->sigs) - if (!info->sigs.count(sig)) - newSigs.insert(sig); - } catch (InvalidPath &) { - } - } + for (auto& sig : info2->sigs) + if (!info->sigs.count(sig)) newSigs.insert(sig); + } catch (InvalidPath&) { + } + } - if (!newSigs.empty()) { - store->addSignatures(storePath, newSigs); - added += newSigs.size(); - } + if (!newSigs.empty()) { + store->addSignatures(storePath, newSigs); + added += newSigs.size(); + } - //logger->incProgress(doneLabel); - }; + // logger->incProgress(doneLabel); + }; - for (auto & storePath : storePaths) - pool.enqueue(std::bind(doPath, storePath)); + for (auto& storePath : storePaths) + pool.enqueue(std::bind(doPath, storePath)); - pool.process(); + pool.process(); - printInfo(format("imported %d signatures") % added); - } + printInfo(format("imported %d signatures") % added); + } }; static RegisterCommand r1(make_ref<CmdCopySigs>()); -struct CmdSignPaths : StorePathsCommand -{ - Path secretKeyFile; - - CmdSignPaths() - { - mkFlag() - .shortName('k') - .longName("key-file") - .label("file") - .description("file containing the secret signing key") - .dest(&secretKeyFile); - } +struct CmdSignPaths : StorePathsCommand { + Path secretKeyFile; - std::string name() override - { - return "sign-paths"; - } + CmdSignPaths() { + mkFlag() + .shortName('k') + .longName("key-file") + .label("file") + .description("file containing the secret signing key") + .dest(&secretKeyFile); + } - std::string description() override - { - return "sign the specified paths"; - } + std::string name() override { return "sign-paths"; } - void run(ref<Store> store, Paths storePaths) override - { - if (secretKeyFile.empty()) - throw UsageError("you must specify a secret key file using '-k'"); + std::string description() override { return "sign the specified paths"; } - SecretKey secretKey(readFile(secretKeyFile)); + void run(ref<Store> store, Paths storePaths) override { + if (secretKeyFile.empty()) + throw UsageError("you must specify a secret key file using '-k'"); - size_t added{0}; + SecretKey secretKey(readFile(secretKeyFile)); - for (auto & storePath : storePaths) { - auto info = store->queryPathInfo(storePath); + size_t added{0}; - auto info2(*info); - info2.sigs.clear(); - info2.sign(secretKey); - assert(!info2.sigs.empty()); + for (auto& storePath : storePaths) { + auto info = store->queryPathInfo(storePath); - if (!info->sigs.count(*info2.sigs.begin())) { - store->addSignatures(storePath, info2.sigs); - added++; - } - } + auto info2(*info); + info2.sigs.clear(); + info2.sign(secretKey); + assert(!info2.sigs.empty()); - printInfo(format("added %d signatures") % added); + if (!info->sigs.count(*info2.sigs.begin())) { + store->addSignatures(storePath, info2.sigs); + added++; + } } + + printInfo(format("added %d signatures") % added); + } }; static RegisterCommand r3(make_ref<CmdSignPaths>()); |