Subject: [bug#31755] [PATCH 19/19] Remove 'guix-register' and its traces.

From: Ludovic Courtès <[email-masked]>
Date: Fri, 8 Jun 2018 11:34:51 +0200

* Makefile.am (SH_TESTS): Remove tests/guix-register.sh.
* build-aux/pre-inst-env.in (GUIX_REGISTER): Remove.
* gnu/build/install.scm (directives): Remove outdated comment.
* gnu/build/vm.scm (root-partition-initializer): Update comment.
* gnu/packages/package-management.scm (guix-register): Remove.
* guix/config.scm.in (%sbindir, %guix-register-program): Remove.
* guix/scripts/system.scm (install): Adjust docstring.
* guix/self.scm (make-config.scm): Remove #:guix.  Do not generate
%sbindir and %guix-register-program.
(specification->package): Remove "guix".
* nix/guix-register/guix-register.cc: Remove.
* nix/local.mk (sbin_PROGRAMS, guix_register_SOURCES)
(guix_register_CPPFLAGS, guix_register_LDFLAGS): Remove.
* tests/guix-register.sh: Remove.
---
 .gitignore                          |   1 -
 Makefile.am                         |   7 -
 build-aux/pre-inst-env.in           |   6 +-
 gnu/build/install.scm               |   3 -
 gnu/build/vm.scm                    |   4 +-
 gnu/packages/package-management.scm |  36 ----
 guix/config.scm.in                  |  12 +-
 guix/scripts/system.scm             |   2 +-
 guix/self.scm                       |  21 +--
 nix/guix-register/guix-register.cc  | 254 ----------------------------
 nix/local.mk                        |  16 --
 tests/guix-register.sh              | 191 ---------------------
 12 files changed, 7 insertions(+), 546 deletions(-)
 delete mode 100644 nix/guix-register/guix-register.cc
 delete mode 100644 tests/guix-register.sh

diff --git a/.gitignore b/.gitignore
index 38a55a3b5..976be8355 100644
--- a/.gitignore
+++ b/.gitignore
@@ -69,7 +69,6 @@
 /etc/guix-publish.conf
 /etc/guix-publish.service
 /guix-daemon
-/guix-register
 /guix/config.scm
 /libformat.a
 /libstore.a
diff --git a/Makefile.am b/Makefile.am
index d6403c02e..dbfb21b52 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -405,13 +405,6 @@ SH_TESTS =					\
   tests/guix-graph.sh				\
   tests/guix-lint.sh
 
-if BUILD_DAEMON
-
-SH_TESTS += tests/guix-register.sh
-
-endif BUILD_DAEMON
-
-
 TESTS = $(SCM_TESTS) $(SH_TESTS)
 
 AM_TESTS_ENVIRONMENT = abs_top_srcdir="$(abs_top_srcdir)" GUILE_AUTO_COMPILE=0
diff --git a/build-aux/pre-inst-env.in b/build-aux/pre-inst-env.in
index 14315d40d..286a81591 100644
--- a/build-aux/pre-inst-env.in
+++ b/build-aux/pre-inst-env.in
@@ -1,7 +1,7 @@
 #!/bin/sh
 
 # GNU Guix --- Functional package management for GNU
-# Copyright © 2012, 2013, 2014, 2015, 2017 Ludovic Courtès <[email-masked]>
+# Copyright © 2012, 2013, 2014, 2015, 2017, 2018 Ludovic Courtès <[email-masked]>
 # Copyright © 2017 Eric Bavier <[email-masked]>
 #
 # This file is part of GNU Guix.
@@ -55,10 +55,6 @@ NIX_BUILD_HOOK="$abs_top_builddir/nix/scripts/offload"
 @BUILD_DAEMON_OFFLOAD_FALSE@# No offloading support.
 @BUILD_DAEMON_OFFLOAD_FALSE@unset NIX_BUILD_HOOK
 
-# The 'guix-register' program.
-GUIX_REGISTER="$abs_top_builddir/guix-register"
-export GUIX_REGISTER
-
 # The following variables need only be defined when compiling Guix
 # modules, but we define them to be on the safe side in case of
 # auto-compilation.
diff --git a/gnu/build/install.scm b/gnu/build/install.scm
index 06ecb3995..5a5e70387 100644
--- a/gnu/build/install.scm
+++ b/gnu/build/install.scm
@@ -110,9 +110,6 @@ STORE."
 
     ("/var/guix/gcroots/booted-system" -> "/run/booted-system")
     ("/var/guix/gcroots/current-system" -> "/run/current-system")
-
-    ;; XXX: 'guix-register' creates this symlink with a wrong target, so
-    ;; create it upfront to be sure.
     ("/var/guix/gcroots/profiles" -> "/var/guix/profiles")
 
     (directory "/bin")
diff --git a/gnu/build/vm.scm b/gnu/build/vm.scm
index 803cd5996..73d0191de 100644
--- a/gnu/build/vm.scm
+++ b/gnu/build/vm.scm
@@ -346,7 +346,7 @@ SYSTEM-DIRECTORY is the name of the directory of the 'system' derivation."
     ;; Optionally, register the inputs in the image's store.
     (when register-closures?
       (unless copy-closures?
-        ;; XXX: 'guix-register' wants to palpate the things it registers, so
+        ;; XXX: 'register-closure' wants to palpate the things it registers, so
         ;; bind-mount the store on the target.
         (mkdir-p target-store)
         (mount (%store-directory) target-store "" MS_BIND))
@@ -365,7 +365,7 @@ SYSTEM-DIRECTORY is the name of the directory of the 'system' derivation."
     (display "populating...\n")
     (populate-root-file-system system-directory target)
 
-    ;; 'guix-register' resets timestamps and everything, so no need to do it
+    ;; 'register-closure' resets timestamps and everything, so no need to do it
     ;; once more in that case.
     (unless register-closures?
       (reset-timestamps target))))
diff --git a/gnu/packages/package-management.scm b/gnu/packages/package-management.scm
index b8c14ee5d..8790bd3a2 100644
--- a/gnu/packages/package-management.scm
+++ b/gnu/packages/package-management.scm
@@ -288,42 +288,6 @@ the Nix package manager.")
 ;; Alias for backward compatibility.
 (define-public guix-devel guix)
 
-(define-public guix-register
-  ;; This package is for internal consumption: it allows us to quickly build
-  ;; the 'guix-register' program, which is referred to by (guix config).
-  ;; TODO: Remove this hack when 'guix-register' has been superseded by Scheme
-  ;; code.
-  (package
-    (inherit guix)
-    (properties `((hidden? . #t)))
-    (name "guix-register")
-
-    ;; Use a minimum set of dependencies.
-    (native-inputs
-     (fold alist-delete (package-native-inputs guix)
-           '("po4a" "graphviz" "help2man")))
-    (propagated-inputs
-     `(("gnutls" ,gnutls)
-       ("guile-git" ,guile-git)))
-
-    (arguments
-     (substitute-keyword-arguments (package-arguments guix)
-       ((#:tests? #f #f)
-        #f)
-       ((#:phases phases '%standard-phases)
-        `(modify-phases ,phases
-           (replace 'build
-             (lambda _
-               (invoke "make" "nix/libstore/schema.sql.hh")
-               (invoke "make" "-j" (number->string
-                                    (parallel-job-count))
-                       "guix-register")))
-           (delete 'copy-bootstrap-guile)
-           (replace 'install
-             (lambda _
-               (invoke "make" "install-sbinPROGRAMS")))
-           (delete 'wrap-program)))))))
-
 (define-public guile2.0-guix
   (package
     (inherit guix)
diff --git a/guix/config.scm.in b/guix/config.scm.in
index dfe5fe0db..1d84ddf18 100644
--- a/guix/config.scm.in
+++ b/guix/config.scm.in
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2012, 2013, 2014, 2015, 2016 Ludovic Courtès <[email-masked]>
+;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2018 Ludovic Courtès <[email-masked]>
 ;;; Copyright © 2017 Caleb Ristvedt <[email-masked]>
 ;;;
 ;;; This file is part of GNU Guix.
@@ -26,13 +26,11 @@
             %storedir
             %localstatedir
             %sysconfdir
-            %sbindir
 
             %store-directory
             %state-directory
             %store-database-directory
             %config-directory
-            %guix-register-program
 
             %system
             %libgcrypt
@@ -70,9 +68,6 @@
 (define %sysconfdir
   "@guix_sysconfdir@")
 
-(define %sbindir
-  "@guix_sbindir@")
-
 (define %store-directory
   (or (and=> (getenv "NIX_STORE_DIR") canonicalize-path)
       %storedir))
@@ -91,11 +86,6 @@
   (or (getenv "GUIX_CONFIGURATION_DIRECTORY")
       (string-append %sysconfdir "/guix")))
 
-(define %guix-register-program
-  ;; The 'guix-register' program.
-  (or (getenv "GUIX_REGISTER")
-      (string-append %sbindir "/guix-register")))
-
 (define %system
   "@guix_system@")
 
diff --git a/guix/scripts/system.scm b/guix/scripts/system.scm
index 23c45cc5a..af2adc47e 100644
--- a/guix/scripts/system.scm
+++ b/guix/scripts/system.scm
@@ -198,7 +198,7 @@ TARGET, and register them."
                   bootcfg bootcfg-file)
   "Copy the closure of BOOTCFG, which includes the output of OS-DRV, to
 directory TARGET.  TARGET must be an absolute directory name since that's what
-'guix-register' expects.
+'register-path' expects.
 
 When INSTALL-BOOTLOADER? is true, install bootloader using BOOTCFG."
   (define (maybe-copy to-copy)
diff --git a/guix/self.scm b/guix/self.scm
index f8b8642bf..2b3e8125f 100644
--- a/guix/self.scm
+++ b/guix/self.scm
@@ -88,8 +88,6 @@ GUILE-VERSION (\"2.0\" or \"2.2\"), or #f if none of the packages matches."
       ("gzip"       (ref '(gnu packages compression) 'gzip))
       ("bzip2"      (ref '(gnu packages compression) 'bzip2))
       ("xz"         (ref '(gnu packages compression) 'xz))
-      ("guix"       (ref '(gnu packages package-management)
-                         'guix-register))
       ("guile2.0-json" (ref '(gnu packages guile) 'guile2.0-json))
       ("guile2.0-ssh"  (ref '(gnu packages ssh) 'guile2.0-ssh))
       ("guile2.0-git"  (ref '(gnu packages guile) 'guile2.0-git))
@@ -342,7 +340,6 @@ list of file-name/file-like objects suitable as inputs to 'imported-files'."
                                          #:gzip gzip
                                          #:bzip2 bzip2
                                          #:xz xz
-                                         #:guix guix
                                          #:package-name
                                          %guix-package-name
                                          #:package-version
@@ -387,8 +384,7 @@ list of file-name/file-like objects suitable as inputs to 'imported-files'."
 
 (define %dependency-variables
   ;; (guix config) variables corresponding to dependencies.
-  '(%libgcrypt %libz %xz %gzip %bzip2 %nix-instantiate
-    %sbindir %guix-register-program))
+  '(%libgcrypt %libz %xz %gzip %bzip2 %nix-instantiate))
 
 (define %persona-variables
   ;; (guix config) variables that define Guix's persona.
@@ -410,7 +406,7 @@ list of file-name/file-like objects suitable as inputs to 'imported-files'."
           (string<? (symbol->string (car name+value1))
                     (symbol->string (car name+value2))))))
 
-(define* (make-config.scm #:key libgcrypt zlib gzip xz bzip2 guix
+(define* (make-config.scm #:key libgcrypt zlib gzip xz bzip2
                           (package-name "GNU Guix")
                           (package-version "0")
                           (bug-report-address "[email-masked]")
@@ -426,8 +422,6 @@ list of file-name/file-like objects suitable as inputs to 'imported-files'."
                                %guix-version
                                %guix-bug-report-address
                                %guix-home-page-url
-                               %sbindir
-                               %guix-register-program
                                %libgcrypt
                                %libz
                                %gzip
@@ -445,17 +439,6 @@ list of file-name/file-like objects suitable as inputs to 'imported-files'."
                    (define %guix-bug-report-address #$bug-report-address)
                    (define %guix-home-page-url #$home-page-url)
 
-                   (define %sbindir
-                     ;; This is used to define '%guix-register-program'.
-                     ;; TODO: Use a derivation that builds nothing but the
-                     ;; C++ part.
-                     #+(and guix (file-append guix "/sbin")))
-
-                   (define %guix-register-program
-                     (or (getenv "GUIX_REGISTER")
-                         (and %sbindir
-                              (string-append %sbindir "/guix-register"))))
-
                    (define %gzip
                      #+(and gzip (file-append gzip "/bin/gzip")))
                    (define %bzip2
diff --git a/nix/guix-register/guix-register.cc b/nix/guix-register/guix-register.cc
deleted file mode 100644
index 16dae62b3..000000000
--- a/nix/guix-register/guix-register.cc
+++ /dev/null
@@ -1,254 +0,0 @@
-/* GNU Guix --- Functional package management for GNU
-   Copyright (C) 2013, 2014, 2015 Ludovic Courtès <[email-masked]>
-   Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012,
-     2013 Eelco Dolstra <[email-masked]>
-
-   This file is part of GNU Guix.
-
-   GNU Guix is free software; you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or (at
-   your option) any later version.
-
-   GNU Guix is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.  */
-
-/* This file derives from the implementation of 'nix-store
-   --register-validity', by Eelco Dolstra, as found in the Nix package
-   manager's src/nix-store/nix-store.cc.  */
-
-#include <config.h>
-
-#include <globals.hh>
-#include <local-store.hh>
-
-#include <iostream>
-#include <fstream>
-#include <cstdlib>
-#include <cstdio>
-
-#include <argp.h>
-#include <gcrypt.h>
-
-using namespace nix;
-
-/* Input stream where we read closure descriptions.  */
-static std::istream *input = &std::cin;
-
-
-
-/* Command-line options.  */
-
-const char *argp_program_version =
-  "guix-register (" PACKAGE_NAME ") " PACKAGE_VERSION;
-const char *argp_program_bug_address = PACKAGE_BUGREPORT;
-
-static char doc[] =
-"guix-register -- register a closure as valid in a store\
-\v\
-This program is used internally when populating a store with data \
-from an existing store.  It updates the new store's database with \
-information about which store files are valid, and what their \
-references are.";
-
-#define GUIX_OPT_STATE_DIRECTORY 1
-#define GUIX_OPT_DEDUPLICATE 2
-
-static const struct argp_option options[] =
-  {
-    { "prefix", 'p', "DIRECTORY", 0,
-      "Open the store that lies under DIRECTORY" },
-    { "state-directory", GUIX_OPT_STATE_DIRECTORY, "DIRECTORY", 0,
-      "Use DIRECTORY as the state directory of the target store" },
-    { "no-deduplication", GUIX_OPT_DEDUPLICATE, 0, 0,
-      "Disable automatic deduplication of registered store items" },
-    { 0, 0, 0, 0, 0 }
-  };
-
-
-/* Prefix of the store being populated.  */
-static std::string prefix;
-
-/* Whether to deduplicate the registered store items.  */
-static bool deduplication = true;
-
-/* Parse a single option. */
-static error_t
-parse_opt (int key, char *arg, struct argp_state *state)
-{
-  switch (key)
-    {
-    case 'p':
-      {
-	prefix = canonPath (arg);
-	settings.nixStore = prefix + NIX_STORE_DIR;
-	settings.nixDataDir = prefix + NIX_DATA_DIR;
-	settings.nixLogDir = prefix + NIX_LOG_DIR;
-	settings.nixStateDir = prefix + NIX_STATE_DIR;
-	settings.nixDBPath = settings.nixStateDir + "/db";
-	break;
-      }
-
-    case GUIX_OPT_STATE_DIRECTORY:
-      {
-	string state_dir = canonPath (arg);
-
-	settings.nixStateDir = state_dir;
-	settings.nixDBPath = state_dir + "/db";
-	break;
-      }
-
-    case GUIX_OPT_DEDUPLICATE:
-      deduplication = false;
-      break;
-
-    case ARGP_KEY_ARG:
-      {
-	std::ifstream *file;
-
-	if (state->arg_num >= 2)
-	  /* Too many arguments. */
-	  argp_usage (state);
-
-	file = new std::ifstream ();
-	file->open (arg);
-
-	input = file;
-      }
-      break;
-
-    default:
-      return (error_t) ARGP_ERR_UNKNOWN;
-    }
-
-  return (error_t) 0;
-}
-
-/* Argument parsing.  */
-static struct argp argp = { options, parse_opt, 0, doc };
-
-
-/* Read from INPUT the description of a closure, and register it as valid in
-   STORE.  The expected format on INPUT is that used by #:references-graphs:
-
-     FILE
-     DERIVER
-     NUMBER-OF-REFERENCES
-     REF1
-     ...
-     REFN
-
-   This is really meant as an internal format.  */
-static void
-register_validity (LocalStore *store, std::istream &input,
-		   bool optimize = true,
-		   bool reregister = true, bool hashGiven = false,
-		   bool canonicalise = true)
-{
-  ValidPathInfos infos;
-
-  while (1)
-    {
-      ValidPathInfo info = decodeValidPathInfo (input, hashGiven);
-      if (info.path == "")
-	break;
-
-      if (!prefix.empty ())
-	{
-	  /* Rewrite the input to refer to the 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 (real_path, -1);
-
-	  if (!hashGiven)
-	    {
-	      HashResult hash = hashPath (htSHA256, real_path);
-	      info.hash = hash.first;
-	      info.narSize = hash.second;
-	    }
-	  infos.push_back (info);
-	}
-    }
-
-  store->registerValidPaths (infos);
-
-  /* XXX: When PREFIX is non-empty, store->linksDir points to the original
-     store's '.links' directory, which means 'optimisePath' would try to link
-     to that instead of linking to the target store.  Thus, disable
-     deduplication in this case.  */
-  if (optimize)
-    {
-      /* Make sure deduplication is enabled.  */
-      settings.autoOptimiseStore = true;
-
-      std::string store_dir = settings.nixStore;
-
-      /* 'optimisePath' creates temporary links under 'settings.nixStore' and
-	 this must be the real target store, under PREFIX, to avoid
-	 cross-device links.  Thus, temporarily switch the value of
-	 'settings.nixStore'.  */
-      settings.nixStore = prefix + store_dir;
-      for (auto&& i: infos)
-	store->optimisePath (prefix + i.path);
-      settings.nixStore = store_dir;
-    }
-}
-
-
-int
-main (int argc, char *argv[])
-{
-  /* Initialize libgcrypt, which is indirectly used.  */
-  if (!gcry_check_version (GCRYPT_VERSION))
-    {
-      fprintf (stderr, "error: libgcrypt version mismatch\n");
-      exit (EXIT_FAILURE);
-    }
-
-  /* Tell Libgcrypt that initialization has completed, as per the Libgcrypt
-     1.6.0 manual (although this does not appear to be strictly needed.)  */
-  gcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0);
-
-  /* Honor the environment variables, and initialize the settings.  */
-  settings.processEnvironment ();
-
-  try
-    {
-      argp_parse (&argp, argc, argv, 0, 0, 0);
-
-      /* Instantiate the store.  This creates any missing directories among
-	 'settings.nixStore', 'settings.nixDBPath', etc.  */
-      LocalStore store;
-
-      if (!prefix.empty ())
-	/* Under the --prefix tree, the final name of the store will be
-	   NIX_STORE_DIR.  Set it here so that the database uses file names
-	   prefixed by NIX_STORE_DIR and not PREFIX + NIX_STORE_DIR.  */
-	settings.nixStore = NIX_STORE_DIR;
-
-      register_validity (&store, *input, deduplication);
-    }
-  catch (std::exception &e)
-    {
-      fprintf (stderr, "error: %s\n", e.what ());
-      return EXIT_FAILURE;
-    }
-
-  return EXIT_SUCCESS;
-}
diff --git a/nix/local.mk b/nix/local.mk
index b4c6ba61a..140c78df3 100644
--- a/nix/local.mk
+++ b/nix/local.mk
@@ -120,7 +120,6 @@ libstore_a_CXXFLAGS = $(AM_CXXFLAGS)		\
   $(SQLITE3_CFLAGS) $(LIBGCRYPT_CFLAGS)
 
 bin_PROGRAMS = guix-daemon
-sbin_PROGRAMS = guix-register
 
 guix_daemon_SOURCES =				\
   %D%/nix-daemon/nix-daemon.cc			\
@@ -138,24 +137,9 @@ guix_daemon_LDADD =				\
 guix_daemon_headers =				\
   %D%/nix-daemon/shared.hh
 
-
-guix_register_SOURCES =				\
-  %D%/guix-register/guix-register.cc
-
-guix_register_CPPFLAGS =			\
-  $(libutil_a_CPPFLAGS)				\
-  $(libstore_a_CPPFLAGS)			\
-  -I$(top_srcdir)/%D%/libstore
-
-# XXX: Should we start using shared libs?
-guix_register_LDADD =				\
-  libstore.a libutil.a libformat.a -lz		\
-  $(SQLITE3_LIBS) $(LIBGCRYPT_LIBS)
-
 if HAVE_LIBBZ2
 
 guix_daemon_LDADD += -lbz2
-guix_register_LDADD += -lbz2
 
 endif HAVE_LIBBZ2
 
diff --git a/tests/guix-register.sh b/tests/guix-register.sh
deleted file mode 100644
index 521735b8a..000000000
--- a/tests/guix-register.sh
+++ /dev/null
@@ -1,191 +0,0 @@
-# GNU Guix --- Functional package management for GNU
-# Copyright © 2013, 2014, 2015, 2016 Ludovic Courtès <[email-masked]>
-#
-# This file is part of GNU Guix.
-#
-# GNU Guix is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3 of the License, or (at
-# your option) any later version.
-#
-# GNU Guix is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
-
-#
-# Test the 'guix-register' command-line utility.
-#
-
-guix-register --version
-
-new_store="t-register-$$"
-closure="t-register-closure-$$"
-rm -rf "$new_store"
-
-exit_hook=":"
-trap "chmod -R +w $new_store ; rm -rf $new_store $closure ; \$exit_hook" EXIT
-
-#
-# Registering items in the current store---i.e., without '--prefix'.
-#
-
-new_file="$NIX_STORE_DIR/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-guix-register-$$"
-echo "Fake store file to test registration." > "$new_file"
-
-# Register the file with zero references and no deriver.
-guix-register <<EOF
-$new_file
-
-0
-EOF
-
-# Register an idendical file, and make sure it gets deduplicated.
-new_file2="$new_file-duplicate"
-cat "$new_file" > "$new_file2"
-guix-register <<EOF
-$new_file2
-
-0
-EOF
-
-guile -c "
-  (exit (= (stat:ino (stat \"$new_file\"))
-           (stat:ino (stat \"$new_file2\"))))"
-
-# Make sure both are valid.
-guile -c "
-   (use-modules (guix store))
-   (define s (open-connection))
-   (exit (and (valid-path? s \"$new_file\")
-              (valid-path? s \"$new_file2\")
-              (null? (references s \"$new_file\"))
-              (null? (references s \"$new_file2\"))))"
-
-
-#
-# Registering items in a new store, with '--prefix'.
-#
-
-mkdir -p "$new_store/$storedir"
-new_store_dir="`cd "$new_store/$storedir" ; pwd -P`"
-new_store="`cd "$new_store" ; pwd -P`"
-
-to_copy="`guix build guile-bootstrap`"
-cp -r "$to_copy" "$new_store_dir"
-copied="$new_store_dir/`basename $to_copy`"
-
-# Create a file representing a closure with zero references, and with an empty
-# "deriver" field.  Note that we give the file name as it appears in the
-# original store, and 'guix-register' translates it to match the prefix.
-cat >> "$closure" <<EOF
-$to_copy
-
-0
-EOF
-
-# Register it.
-guix-register -p "$new_store" < "$closure"
-
-# Doing it a second time shouldn't hurt.
-guix-register --prefix "$new_store" "$closure"
-
-# Same, but with the database stored in a different place.
-guix-register -p "$new_store" \
-    --state-directory "$new_store/chbouib" "$closure"
-
-# Register duplicate files.
-cp "$new_file" "$new_file2" "$new_store_dir"
-guix-register -p "$new_store" <<EOF
-$new_file
-
-0
-EOF
-guix-register -p "$new_store" <<EOF
-$new_file2
-
-0
-EOF
-
-copied_duplicate1="$new_store_dir/`basename $new_file`"
-copied_duplicate2="$new_store_dir/`basename $new_file2`"
-
-# Make sure there is indeed deduplication under $new_store and that there are
-# no cross-store hard links.
-guile -c "
-  (exit (and (= (stat:ino (stat \"$copied_duplicate1\"))
-                (stat:ino (stat \"$copied_duplicate2\")))
-             (not (= (stat:ino (stat \"$new_file\"))
-                     (stat:ino (stat \"$copied_duplicate1\"))))))"
-
-# Delete them.
-guix gc -d "$new_file" "$new_file2"
-
-# Now make sure this is recognized as valid.
-
-ls -R "$new_store"
-for state_dir in "$localstatedir/guix" "/chbouib"
-do
-    NIX_STORE_DIR="$new_store_dir"
-    NIX_STATE_DIR="$new_store$state_dir"
-    NIX_LOG_DIR="$new_store$state_dir/log/guix"
-    NIX_DB_DIR="$new_store$state_dir/db"
-    GUIX_DAEMON_SOCKET="$NIX_STATE_DIR/daemon-socket/socket"
-
-    export NIX_IGNORE_SYMLINK_STORE NIX_STORE_DIR NIX_STATE_DIR	\
-	   NIX_LOG_DIR NIX_DB_DIR GUIX_DAEMON_SOCKET
-
-    # Check whether we overflow the limitation on local socket name lengths.
-    if [ `echo "$GUIX_DAEMON_SOCKET" | wc -c` -ge 108 ]
-    then
-	# Mark the test as skipped even though we already did some work so
-	# that the remainder is not silently skipped.
-	exit 77
-    fi
-
-    guix-daemon --disable-chroot &
-    subdaemon_pid=$!
-    exit_hook="kill $subdaemon_pid"
-
-    final_name="$storedir/`basename $to_copy`"
-
-    # At this point the copy in $new_store must be valid, and unreferenced.
-    # The database under $NIX_DB_DIR uses the $final_name, but we can't use
-    # that name in a 'valid-path?' query because 'assertStorePath' would kill
-    # us because of the wrong prefix.  So we just list dead paths instead.
-    guile -c "
-      (use-modules (guix store) (srfi srfi-1) (srfi srfi-34))
-
-      (define s
-        (let loop ((i 5))
-          (guard (c ((nix-connection-error? c)
-                     (if (<= i 0)
-                         (raise c)
-                         (begin
-                           (display \"waiting for daemon socket...\")
-                           (newline)
-                           (sleep 1)
-                           (loop (- i 1))))))
-             (open-connection \"$GUIX_DAEMON_SOCKET\"))))
-
-      (exit (lset= string=?
-                   (pk 1 (list \"$copied\" \"$copied_duplicate1\"
-                               \"$copied_duplicate2\"))
-                   (pk 2 (dead-paths s))))"
-
-    # Kill the daemon so we can access the database below (otherwise we may
-    # get "database is locked" errors.)
-    kill $subdaemon_pid
-    exit_hook=":"
-    while kill -0 $subdaemon_pid ; do sleep 0.5 ; done
-
-    # When 'sqlite3' is available, check the name in the database.
-    if type -P sqlite3
-    then
-	echo "select * from ValidPaths where path=\"$final_name\";" | \
-	    sqlite3 "$NIX_DB_DIR/db.sqlite"
-    fi
-done
-- 
2.17.1