Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: NixOS/nix
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: 512753f8247b
Choose a base ref
...
head repository: NixOS/nix
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: a118293bd017
Choose a head ref
  • 2 commits
  • 10 files changed
  • 2 contributors

Commits on Apr 14, 2020

  1. add NIX_USER_CONF_FILES

    Motivation: maintain project-level configuration files.
    
    Document the whole situation a bit better so that it corresponds to the
    implementation, and add NIX_USER_CONF_FILES that allows overriding
    which user files Nix will load during startup.
    zimbatm committed Apr 14, 2020

    Verified

    This commit was signed with the committer’s verified signature. The key has expired.
    grahamc Graham Christensen
    Copy the full SHA
    895516c View commit details

Commits on Apr 15, 2020

  1. Merge pull request #3458 from zimbatm/nix-user-conf-dir

    NIX_USER_CONF_FILES
    edolstra authored Apr 15, 2020

    Verified

    This commit was signed with the committer’s verified signature.
    vcunat Vladimír Čunát
    Copy the full SHA
    a118293 View commit details
36 changes: 20 additions & 16 deletions doc/manual/command-ref/conf-file.xml
Original file line number Diff line number Diff line change
@@ -19,26 +19,30 @@

<refsection><title>Description</title>

<para>Nix reads settings from two configuration files:</para>
<para>By default Nix reads settings from the following places:</para>

<para>The system-wide configuration file
<filename><replaceable>sysconfdir</replaceable>/nix/nix.conf</filename>
(i.e. <filename>/etc/nix/nix.conf</filename> on most systems), or
<filename>$NIX_CONF_DIR/nix.conf</filename> if
<envar>NIX_CONF_DIR</envar> is set. Values loaded in this file are not forwarded to the Nix daemon. The
client assumes that the daemon has already loaded them.
</para>

<itemizedlist>
<para>User-specific configuration files:</para>

<listitem>
<para>The system-wide configuration file
<filename><replaceable>sysconfdir</replaceable>/nix/nix.conf</filename>
(i.e. <filename>/etc/nix/nix.conf</filename> on most systems), or
<filename>$NIX_CONF_DIR/nix.conf</filename> if
<envar>NIX_CONF_DIR</envar> is set.</para>
</listitem>
<para>
If <envar>NIX_USER_CONF_FILES</envar> is set, then each path separated by
<literal>:</literal> will be loaded in reverse order.
</para>

<listitem>
<para>The user configuration file
<filename>$XDG_CONFIG_HOME/nix/nix.conf</filename>, or
<filename>~/.config/nix/nix.conf</filename> if
<envar>XDG_CONFIG_HOME</envar> is not set.</para>
</listitem>
<para>
Otherwise it will look for <filename>nix/nix.conf</filename> files in
<envar>XDG_CONFIG_DIRS</envar> and <envar>XDG_CONFIG_HOME</envar>.

</itemizedlist>
The default location is <filename>$HOME/.config/nix.conf</filename> if
those environment variables are unset.
</para>

<para>The configuration files consist of
<literal><replaceable>name</replaceable> =
13 changes: 10 additions & 3 deletions doc/manual/command-ref/env-common.xml
Original file line number Diff line number Diff line change
@@ -33,7 +33,7 @@

will cause Nix to look for paths relative to
<filename>/home/eelco/Dev</filename> and
<filename>/etc/nixos</filename>, in that order. It is also
<filename>/etc/nixos</filename>, in this order. It is also
possible to match paths against a prefix. For example, the value

<screen>
@@ -59,7 +59,7 @@ nixpkgs=https://github.com/NixOS/nixpkgs-channels/archive/nixos-15.09.tar.gz</sc
15.09 channel.</para>

<para>A following shorthand can be used to refer to the official channels:

<screen>nixpkgs=channel:nixos-15.09</screen>
</para>

@@ -137,12 +137,19 @@ $ mount -o bind /mnt/otherdisk/nix /nix</screen>

<varlistentry><term><envar>NIX_CONF_DIR</envar></term>

<listitem><para>Overrides the location of the Nix configuration
<listitem><para>Overrides the location of the system Nix configuration
directory (default
<filename><replaceable>prefix</replaceable>/etc/nix</filename>).</para></listitem>

</varlistentry>

<varlistentry><term><envar>NIX_USER_CONF_FILES</envar></term>

<listitem><para>Overrides the location of the user Nix configuration files
to load from (defaults to the XDG spec locations). The variable is treated
as a list separated by the <literal>:</literal> token.</para></listitem>

</varlistentry>

<varlistentry><term><envar>TMPDIR</envar></term>

5 changes: 4 additions & 1 deletion src/libmain/shared.cc
Original file line number Diff line number Diff line change
@@ -260,7 +260,10 @@ void printVersion(const string & programName)
cfg.push_back("signed-caches");
#endif
std::cout << "Features: " << concatStringsSep(", ", cfg) << "\n";
std::cout << "Configuration file: " << settings.nixConfDir + "/nix.conf" << "\n";
std::cout << "System configuration file: " << settings.nixConfDir + "/nix.conf" << "\n";
std::cout << "User configuration files: " <<
concatStringsSep(":", settings.nixUserConfFiles)
<< "\n";
std::cout << "Store directory: " << settings.nixStore << "\n";
std::cout << "State directory: " << settings.nixStateDir << "\n";
}
23 changes: 20 additions & 3 deletions src/libstore/globals.cc
Original file line number Diff line number Diff line change
@@ -31,6 +31,7 @@ Settings::Settings()
, nixLogDir(canonPath(getEnv("NIX_LOG_DIR").value_or(NIX_LOG_DIR)))
, nixStateDir(canonPath(getEnv("NIX_STATE_DIR").value_or(NIX_STATE_DIR)))
, nixConfDir(canonPath(getEnv("NIX_CONF_DIR").value_or(NIX_CONF_DIR)))
, nixUserConfFiles(getUserConfigFiles())
, nixLibexecDir(canonPath(getEnv("NIX_LIBEXEC_DIR").value_or(NIX_LIBEXEC_DIR)))
, nixBinDir(canonPath(getEnv("NIX_BIN_DIR").value_or(NIX_BIN_DIR)))
, nixManDir(canonPath(NIX_MAN_DIR))
@@ -77,11 +78,27 @@ void loadConfFile()
~/.nix/nix.conf or the command line. */
globalConfig.resetOverriden();

auto files = settings.nixUserConfFiles;
for (auto file = files.rbegin(); file != files.rend(); file++) {
globalConfig.applyConfigFile(*file);
}
}

std::vector<Path> getUserConfigFiles()
{
// Use the paths specified in NIX_USER_CONF_FILES if it has been defined
auto nixConfFiles = getEnv("NIX_USER_CONF_FILES");
if (nixConfFiles.has_value()) {
return tokenizeString<std::vector<string>>(nixConfFiles.value(), ":");
}

// Use the paths specified by the XDG spec
std::vector<Path> files;
auto dirs = getConfigDirs();
// Iterate over them in reverse so that the ones appearing first in the path take priority
for (auto dir = dirs.rbegin(); dir != dirs.rend(); dir++) {
globalConfig.applyConfigFile(*dir + "/nix/nix.conf");
for (auto & dir : dirs) {
files.insert(files.end(), dir + "/nix/nix.conf");
}
return files;
}

unsigned int Settings::getDefaultCores()
8 changes: 7 additions & 1 deletion src/libstore/globals.hh
Original file line number Diff line number Diff line change
@@ -53,9 +53,12 @@ public:
/* The directory where state is stored. */
Path nixStateDir;

/* The directory where configuration files are stored. */
/* The directory where system configuration files are stored. */
Path nixConfDir;

/* A list of user configuration files to load. */
std::vector<Path> nixUserConfFiles;

/* The directory where internal helper programs are stored. */
Path nixLibexecDir;

@@ -378,6 +381,9 @@ void initPlugins();

void loadConfFile();

// Used by the Settings constructor
std::vector<Path> getUserConfigFiles();

extern const string nixVersion;

}
1 change: 1 addition & 0 deletions src/libutil/util.hh
Original file line number Diff line number Diff line change
@@ -16,6 +16,7 @@
#include <sstream>
#include <optional>
#include <future>
#include <iterator>

#ifndef HAVE_STRUCT_DIRENT_D_TYPE
#define DT_UNKNOWN 0
3 changes: 3 additions & 0 deletions tests/common.sh.in
Original file line number Diff line number Diff line change
@@ -11,6 +11,7 @@ export NIX_LOCALSTATE_DIR=$TEST_ROOT/var
export NIX_LOG_DIR=$TEST_ROOT/var/log/nix
export NIX_STATE_DIR=$TEST_ROOT/var/nix
export NIX_CONF_DIR=$TEST_ROOT/etc
unset NIX_USER_CONF_FILES
export _NIX_TEST_SHARED=$TEST_ROOT/shared
if [[ -n $NIX_STORE ]]; then
export _NIX_TEST_NO_SANDBOX=1
@@ -21,6 +22,8 @@ export NIX_REMOTE=$NIX_REMOTE_
unset NIX_PATH
export TEST_HOME=$TEST_ROOT/test-home
export HOME=$TEST_HOME
unset XDG_CONFIG_HOME
unset XDG_CONFIG_DIRS
unset XDG_CACHE_HOME
mkdir -p $TEST_HOME

18 changes: 18 additions & 0 deletions tests/config.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
source common.sh

# Test that files are loaded from XDG by default
export XDG_CONFIG_HOME=/tmp/home
export XDG_CONFIG_DIRS=/tmp/dir1:/tmp/dir2
files=$(nix-build --verbose --version | grep "User config" | cut -d ':' -f2- | xargs)
[[ $files == "/tmp/home/nix/nix.conf:/tmp/dir1/nix/nix.conf:/tmp/dir2/nix/nix.conf" ]]

# Test that setting NIX_USER_CONF_FILES overrides all the default user config files
export NIX_USER_CONF_FILES=/tmp/file1.conf:/tmp/file2.conf
files=$(nix-build --verbose --version | grep "User config" | cut -d ':' -f2- | xargs)
[[ $files == "/tmp/file1.conf:/tmp/file2.conf" ]]

# Test that it's possible to load the config from a custom location
here=$(readlink -f "$(dirname "${BASH_SOURCE[0]}")")
export NIX_USER_CONF_FILES=$here/config/nix-with-substituters.conf
var=$(nix show-config | grep '^substituters =' | cut -d '=' -f 2 | xargs)
[[ $var == https://example.com ]]
2 changes: 2 additions & 0 deletions tests/config/nix-with-substituters.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
experimental-features = nix-command
substituters = https://example.com
1 change: 1 addition & 0 deletions tests/local.mk
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
nix_tests = \
init.sh hash.sh lang.sh add.sh simple.sh dependencies.sh \
config.sh \
gc.sh \
gc-concurrent.sh \
gc-auto.sh \