summaryrefslogtreecommitdiff
path: root/nix/guix-register/guix-register.cc
diff options
context:
space:
mode:
Diffstat (limited to 'nix/guix-register/guix-register.cc')
-rw-r--r--nix/guix-register/guix-register.cc22
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;
}