diff options
author | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2016-01-31 10:19:14 +0100 |
---|---|---|
committer | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2016-01-31 10:28:48 +0100 |
commit | 9e7c1a4bbdbe6129dd9dc385776612c307d3d1bb (patch) | |
tree | 4c213493e9c6fa1045df1b4192061602e31c78eb | |
parent | 4fa08f3edb413e65816441acfb6c3befee730a06 (diff) |
Use the daemon when we don't have write access to the Nix database
-rw-r--r-- | doc/manual/release-notes/release-notes.xml | 1 | ||||
-rw-r--r-- | doc/manual/release-notes/rl-1.12.xml | 24 | ||||
-rw-r--r-- | src/libstore/local-store.cc | 8 | ||||
-rw-r--r-- | src/libstore/local-store.hh | 6 | ||||
-rw-r--r-- | src/libstore/remote-store.cc | 10 | ||||
-rw-r--r-- | src/libstore/store-api.cc | 20 | ||||
-rw-r--r-- | tests/dump-db.sh | 1 |
7 files changed, 57 insertions, 13 deletions
diff --git a/doc/manual/release-notes/release-notes.xml b/doc/manual/release-notes/release-notes.xml index 0aa3e8717..8c2deb394 100644 --- a/doc/manual/release-notes/release-notes.xml +++ b/doc/manual/release-notes/release-notes.xml @@ -12,6 +12,7 @@ </partintro> --> +<xi:include href="rl-1.12.xml" /> <xi:include href="rl-1.11.xml" /> <xi:include href="rl-1.10.xml" /> <xi:include href="rl-1.9.xml" /> diff --git a/doc/manual/release-notes/rl-1.12.xml b/doc/manual/release-notes/rl-1.12.xml new file mode 100644 index 000000000..d6864b3f5 --- /dev/null +++ b/doc/manual/release-notes/rl-1.12.xml @@ -0,0 +1,24 @@ +<section xmlns="http://docbook.org/ns/docbook" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:xi="http://www.w3.org/2001/XInclude" + version="5.0" + xml:id="ssec-relnotes-1.12"> + +<title>Release 1.12 (TBA)</title> + +<para>This release has the following new features:</para> + +<itemizedlist> + + <listitem> + <para>It is no longer necessary to set the + <envar>NIX_REMOTE</envar> environment variable if you need to use + the Nix daemon. Nix will use the daemon automatically if you don’t + have write access to the Nix database.</para> + </listitem> + +</itemizedlist> + +<para>This release has contributions from TBD.</para> + +</section> diff --git a/src/libstore/local-store.cc b/src/libstore/local-store.cc index 9199b1206..55bd3e70e 100644 --- a/src/libstore/local-store.cc +++ b/src/libstore/local-store.cc @@ -397,9 +397,15 @@ int LocalStore::getSchema() } +bool LocalStore::haveWriteAccess() +{ + return access(settings.nixDBPath.c_str(), R_OK | W_OK) == 0; +} + + void LocalStore::openDB(bool create) { - if (access(settings.nixDBPath.c_str(), R_OK | W_OK)) + if (!haveWriteAccess()) throw SysError(format("Nix database directory ‘%1%’ is not writable") % settings.nixDBPath); /* Open the Nix database. */ diff --git a/src/libstore/local-store.hh b/src/libstore/local-store.hh index ebdf19bf1..5b27f9072 100644 --- a/src/libstore/local-store.hh +++ b/src/libstore/local-store.hh @@ -253,6 +253,12 @@ private: int getSchema(); +public: + + static bool haveWriteAccess(); + +private: + void openDB(bool create); void makeStoreWritable(); diff --git a/src/libstore/remote-store.cc b/src/libstore/remote-store.cc index 262e4650b..679210d4c 100644 --- a/src/libstore/remote-store.cc +++ b/src/libstore/remote-store.cc @@ -50,14 +50,8 @@ void RemoteStore::openConnection(bool reserveSpace) if (initialised) return; initialised = true; - string remoteMode = getEnv("NIX_REMOTE"); - - if (remoteMode == "daemon") - /* Connect to a daemon that does the privileged work for - us. */ - connectToDaemon(); - else - throw Error(format("invalid setting for NIX_REMOTE, ‘%1%’") % remoteMode); + /* Connect to a daemon that does the privileged work for us. */ + connectToDaemon(); from.fd = fdSocket; to.fd = fdSocket; diff --git a/src/libstore/store-api.cc b/src/libstore/store-api.cc index a73ebd824..f5035d323 100644 --- a/src/libstore/store-api.cc +++ b/src/libstore/store-api.cc @@ -311,10 +311,22 @@ std::shared_ptr<StoreAPI> store; std::shared_ptr<StoreAPI> openStore(bool reserveSpace) { - if (getEnv("NIX_REMOTE") == "") - return std::shared_ptr<StoreAPI>(new LocalStore(reserveSpace)); - else - return std::shared_ptr<StoreAPI>(new RemoteStore()); + enum { mDaemon, mLocal, mAuto } mode; + + mode = getEnv("NIX_REMOTE") == "daemon" ? mDaemon : mAuto; + + if (mode == mAuto) { + if (LocalStore::haveWriteAccess()) + mode = mLocal; + else if (pathExists(settings.nixDaemonSocketFile)) + mode = mDaemon; + else + mode = mLocal; + } + + return mode == mDaemon + ? (std::shared_ptr<StoreAPI>) std::make_shared<RemoteStore>() + : std::make_shared<LocalStore>(reserveSpace); } diff --git a/tests/dump-db.sh b/tests/dump-db.sh index 234b7ac02..57c8c4016 100644 --- a/tests/dump-db.sh +++ b/tests/dump-db.sh @@ -9,6 +9,7 @@ deps="$(nix-store -qR $TEST_ROOT/result)" nix-store --dump-db > $TEST_ROOT/dump rm -rf $NIX_DB_DIR +mkdir $NIX_DB_DIR nix-store --load-db < $TEST_ROOT/dump |