aboutsummaryrefslogtreecommitdiff
path: root/nix
diff options
context:
space:
mode:
authorRicardo Wurmus <rekado@elephly.net>2018-06-29 22:51:23 +0200
committerRicardo Wurmus <rekado@elephly.net>2018-06-29 22:51:23 +0200
commitf1728d43460e63b106dd446e70001d8e100eaf6d (patch)
tree9d211fabf9e200743be49e25d108d58ed88d2f60 /nix
parentcda7f4bc8ecf331d623c7d37b01931a46830c648 (diff)
parent373cc3b74a6ad33fddf75c2d773a97b1775bda8e (diff)
downloadpatches-f1728d43460e63b106dd446e70001d8e100eaf6d.tar
patches-f1728d43460e63b106dd446e70001d8e100eaf6d.tar.gz
Merge branch 'master' into core-updates
Diffstat (limited to 'nix')
-rw-r--r--nix/guix-register/guix-register.cc254
-rw-r--r--nix/libstore/schema.sql44
-rw-r--r--nix/libstore/store-api.cc26
-rw-r--r--nix/libstore/store-api.hh4
-rw-r--r--nix/local.mk21
5 files changed, 2 insertions, 347 deletions
diff --git a/nix/guix-register/guix-register.cc b/nix/guix-register/guix-register.cc
deleted file mode 100644
index 16dae62b3d..0000000000
--- 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 <ludo@gnu.org>
- Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012,
- 2013 Eelco Dolstra <eelco.dolstra@logicblox.com>
-
- 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/libstore/schema.sql b/nix/libstore/schema.sql
deleted file mode 100644
index c1b4a689af..0000000000
--- a/nix/libstore/schema.sql
+++ /dev/null
@@ -1,44 +0,0 @@
-create table if not exists ValidPaths (
- id integer primary key autoincrement not null,
- path text unique not null,
- hash text not null,
- registrationTime integer not null,
- deriver text,
- narSize integer
-);
-
-create table if not exists Refs (
- referrer integer not null,
- reference integer not null,
- primary key (referrer, reference),
- foreign key (referrer) references ValidPaths(id) on delete cascade,
- foreign key (reference) references ValidPaths(id) on delete restrict
-);
-
-create index if not exists IndexReferrer on Refs(referrer);
-create index if not exists IndexReference on Refs(reference);
-
--- Paths can refer to themselves, causing a tuple (N, N) in the Refs
--- table. This causes a deletion of the corresponding row in
--- ValidPaths to cause a foreign key constraint violation (due to `on
--- delete restrict' on the `reference' column). Therefore, explicitly
--- get rid of self-references.
-create trigger if not exists DeleteSelfRefs before delete on ValidPaths
- begin
- delete from Refs where referrer = old.id and reference = old.id;
- end;
-
-create table if not exists DerivationOutputs (
- drv integer not null,
- id text not null, -- symbolic output id, usually "out"
- path text not null,
- primary key (drv, id),
- foreign key (drv) references ValidPaths(id) on delete cascade
-);
-
-create index if not exists IndexDerivationOutputs on DerivationOutputs(path);
-
-create table if not exists FailedPaths (
- path text primary key not null,
- time integer not null
-);
diff --git a/nix/libstore/store-api.cc b/nix/libstore/store-api.cc
index 6742d2ed49..9e07c67e97 100644
--- a/nix/libstore/store-api.cc
+++ b/nix/libstore/store-api.cc
@@ -226,32 +226,6 @@ string StoreAPI::makeValidityRegistration(const PathSet & paths,
return s;
}
-
-ValidPathInfo decodeValidPathInfo(std::istream & str, bool hashGiven)
-{
- ValidPathInfo info;
- getline(str, info.path);
- if (str.eof()) { info.path = ""; return info; }
- if (hashGiven) {
- string s;
- getline(str, s);
- info.hash = parseHash(htSHA256, s);
- getline(str, s);
- if (!string2Int(s, info.narSize)) throw Error("number expected");
- }
- getline(str, info.deriver);
- string s; int n;
- getline(str, s);
- if (!string2Int(s, n)) throw Error("number expected");
- while (n--) {
- getline(str, s);
- info.references.insert(s);
- }
- if (!str || str.eof()) throw Error("missing input");
- return info;
-}
-
-
string showPaths(const PathSet & paths)
{
string s;
diff --git a/nix/libstore/store-api.hh b/nix/libstore/store-api.hh
index e957cedebc..2d9dcbd573 100644
--- a/nix/libstore/store-api.hh
+++ b/nix/libstore/store-api.hh
@@ -371,10 +371,6 @@ std::shared_ptr<StoreAPI> openStore(bool reserveSpace = true);
string showPaths(const PathSet & paths);
-ValidPathInfo decodeValidPathInfo(std::istream & str,
- bool hashGiven = false);
-
-
/* Export multiple paths in the format expected by ‘nix-store
--import’. */
void exportPaths(StoreAPI & store, const Paths & paths,
diff --git a/nix/local.mk b/nix/local.mk
index 4452301c63..7d45f200b8 100644
--- a/nix/local.mk
+++ b/nix/local.mk
@@ -22,7 +22,7 @@
#
BUILT_SOURCES += %D%/libstore/schema.sql.hh
-CLEANFILES += $(BUILT_SOURCES)
+CLEANFILES += %D%/libstore/schema.sql.hh
noinst_LIBRARIES = libformat.a libutil.a libstore.a
@@ -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
@@ -163,7 +147,7 @@ noinst_HEADERS = \
$(libformat_headers) $(libutil_headers) $(libstore_headers) \
$(guix_daemon_headers)
-%D%/libstore/schema.sql.hh: %D%/libstore/schema.sql
+%D%/libstore/schema.sql.hh: guix/store/schema.sql
$(AM_V_GEN)$(GUILE) --no-auto-compile -c \
"(use-modules (rnrs io ports)) \
(call-with-output-file \"$@\" \
@@ -216,7 +200,6 @@ CLEANFILES += \
$(nodist_upstartjob_DATA)
EXTRA_DIST += \
- %D%/libstore/schema.sql \
%D%/AUTHORS \
%D%/COPYING \
etc/guix-daemon.service.in \