diff options
Diffstat (limited to 'nix/guix-register')
-rw-r--r-- | nix/guix-register/guix-register.cc | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/nix/guix-register/guix-register.cc b/nix/guix-register/guix-register.cc index 0a028f0cfe..8f9c3c86ab 100644 --- a/nix/guix-register/guix-register.cc +++ b/nix/guix-register/guix-register.cc @@ -62,6 +62,10 @@ static const struct argp_option options[] = { 0, 0, 0, 0, 0 } }; + +/* Prefix of the store being populated. */ +static std::string prefix; + /* Parse a single option. */ static error_t parse_opt (int key, char *arg, struct argp_state *state) @@ -70,8 +74,8 @@ parse_opt (int key, char *arg, struct argp_state *state) { case 'p': { - string prefix = canonPath (arg); - settings.nixStore = prefix + NIX_STORE_DIR; + prefix = canonPath (arg); + settings.nixStore = NIX_STORE_DIR; settings.nixDataDir = prefix + NIX_DATA_DIR; settings.nixLogDir = prefix + NIX_LOG_DIR; settings.nixStateDir = prefix + NIX_STATE_DIR; @@ -128,15 +132,25 @@ register_validity (LocalStore *store, std::istream &input, ValidPathInfo info = decodeValidPathInfo (input, hashGiven); if (info.path == "") break; + + /* Rewrite the input to refer final name, as if we were in a chroot + under PREFIX. */ + std::string final_prefix (NIX_STORE_DIR "/"); + info.path = final_prefix + baseNameOf (info.path); + + /* Keep its real path to canonicalize it and compute its hash. */ + std::string real_path; + real_path = prefix + "/" + settings.nixStore + "/" + baseNameOf (info.path); + if (!store->isValidPath (info.path) || reregister) { /* !!! races */ if (canonicalise) - canonicalisePathMetaData (info.path, -1); + canonicalisePathMetaData (real_path, -1); if (!hashGiven) { - HashResult hash = hashPath (htSHA256, info.path); + HashResult hash = hashPath (htSHA256, real_path); info.hash = hash.first; info.narSize = hash.second; } |