home-manager: point <home-manager> to project root

Before this path would point to the modules path. Using the project
root instead makes it possible to set `<home-manager>` to point to a
downloadable archive of Home Manager. This should make it
significantly easier to install and keep Home Manager up to date.

To match this change we also deprecate the Home Manager option

    programs.home-manager.modulesPath

and instead ask users to use

    programs.home-manager.path
This commit is contained in:
Robert Helgesson 2017-10-21 20:51:28 +02:00
parent 5605e46acb
commit bf3a8c6383
No known key found for this signature in database
GPG key ID: C3DB11069E65DC86
6 changed files with 96 additions and 21 deletions

View file

@ -1,2 +1,14 @@
# Simply defer to the home-manager script derivation. { pkgs ? import <nixpkgs> {} }:
import ./home-manager
rec {
home-manager = import ./home-manager {
inherit pkgs;
path = ./.;
};
install =
pkgs.runCommand
"home-manager-install"
{ propagatedBuildInputs = [ home-manager ]; }
"";
}

View file

@ -1,14 +1,14 @@
{ pkgs { pkgs
# Extra path to the Home Manager modules. If set then this path will # Extra path to Home Manager. If set then this path will be tried
# be tried before `$HOME/.config/nixpkgs/home-manager/modules` and # before `$HOME/.config/nixpkgs/home-manager` and
# `$HOME/.nixpkgs/home-manager/modules`. # `$HOME/.nixpkgs/home-manager`.
, modulesPath ? null , path ? null
}: }:
let let
modulesPathStr = if modulesPath == null then "" else modulesPath; pathStr = if path == null then "" else path;
in in
@ -24,8 +24,7 @@ pkgs.stdenv.mkDerivation {
--subst-var-by bash "${pkgs.bash}" \ --subst-var-by bash "${pkgs.bash}" \
--subst-var-by coreutils "${pkgs.coreutils}" \ --subst-var-by coreutils "${pkgs.coreutils}" \
--subst-var-by less "${pkgs.less}" \ --subst-var-by less "${pkgs.less}" \
--subst-var-by MODULES_PATH '${modulesPathStr}' \ --subst-var-by HOME_MANAGER_PATH '${pathStr}'
--subst-var-by HOME_MANAGER_EXPR_PATH "${./home-manager.nix}"
''; '';
meta = with pkgs.stdenv.lib; { meta = with pkgs.stdenv.lib; {

View file

@ -40,13 +40,13 @@ function setConfigFile() {
exit 1 exit 1
} }
function setHomeManagerModulesPath() { function setHomeManagerNixPath() {
local modulesPath local path
for modulesPath in "@MODULES_PATH@" \ for path in "@HOME_MANAGER_PATH@" \
"$HOME/.config/nixpkgs/home-manager/modules" \ "$HOME/.config/nixpkgs/home-manager" \
"$HOME/.nixpkgs/home-manager/modules" ; do "$HOME/.nixpkgs/home-manager" ; do
if [[ -e "$modulesPath" ]] ; then if [[ -e "$path" || "$path" =~ ^https?:// ]] ; then
export NIX_PATH="$NIX_PATH${NIX_PATH:+:}home-manager=$modulesPath" export NIX_PATH="$NIX_PATH${NIX_PATH:+:}home-manager=$path"
return return
fi fi
done done
@ -54,7 +54,7 @@ function setHomeManagerModulesPath() {
function doBuildAttr() { function doBuildAttr() {
setConfigFile setConfigFile
setHomeManagerModulesPath setHomeManagerNixPath
local extraArgs="$*" local extraArgs="$*"
@ -67,7 +67,7 @@ function doBuildAttr() {
fi fi
nix-build \ nix-build \
"@HOME_MANAGER_EXPR_PATH@" \ "<home-manager/home-manager/home-manager.nix>" \
$extraArgs \ $extraArgs \
--argstr confPath "$HOME_MANAGER_CONFIG" \ --argstr confPath "$HOME_MANAGER_CONFIG" \
--argstr confAttr "$HOME_MANAGER_CONFIG_ATTRIBUTE" --argstr confAttr "$HOME_MANAGER_CONFIG_ATTRIBUTE"

View file

@ -9,7 +9,7 @@ with pkgs.lib;
let let
env = import <home-manager> { env = import <home-manager/modules> {
configuration = configuration =
let let
conf = import confPath; conf = import confPath;

View file

@ -370,6 +370,46 @@ in
chosen version. chosen version.
''; '';
} }
{
time = "2017-10-23T22:54:33+00:00";
condition = config.programs.home-manager.modulesPath != null;
message = ''
The 'programs.home-manager.modulesPath' option is now
deprecated and will be removed on November 24, 2017. Please
use the option 'programs.home-manager.path' instead.
'';
}
{
time = "2017-10-23T23:10:29+00:00";
condition = !config.programs.home-manager.enable;
message = ''
Unfortunately, due to some internal restructuring it is no
longer possible to install the home-manager command when
having
home-manager = import ./home-manager { inherit pkgs; };
in the '~/.config/nixpkgs/config.nix' package override
section. Attempting to use the above override will now
result in the error "cannot coerce a set to a string".
To resolve this please delete the override from the
'config.nix' file and either link the Home Manager overlay
$ ln -s ~/.config/nixpkgs/home-manager/overlay.nix \
~/.config/nixpkgs/overlays/home-manager.nix
or add
programs.home-manager.enable = true;
to your Home Manager configuration. The latter is
recommended as the home-manager tool then is updated
automatically whenever you do a switch.
'';
}
]; ];
}; };
} }

View file

@ -16,6 +16,19 @@ in
programs.home-manager = { programs.home-manager = {
enable = mkEnableOption "Home Manager"; enable = mkEnableOption "Home Manager";
path = mkOption {
type = types.nullOr types.str;
default = null;
example = "$HOME/devel/home-manager";
description = ''
The default path to use for Home Manager. If this path does
not exist then
<filename>$HOME/.config/nixpkgs/home-manager</filename> and
<filename>$HOME/.nixpkgs/home-manager</filename> will be
attempted.
'';
};
modulesPath = mkOption { modulesPath = mkOption {
type = types.nullOr types.str; type = types.nullOr types.str;
default = null; default = null;
@ -25,17 +38,28 @@ in
path does not exist then path does not exist then
<filename>$HOME/.config/nixpkgs/home-manager/modules</filename> <filename>$HOME/.config/nixpkgs/home-manager/modules</filename>
and <filename>$HOME/.nixpkgs/home-manager/modules</filename> and <filename>$HOME/.nixpkgs/home-manager/modules</filename>
will be attempted. will be attempted. DEPRECATED: Use
<varname>programs.home-manager.path</varname> instead.
''; '';
}; };
}; };
}; };
config = mkIf cfg.enable { config = mkIf cfg.enable {
assertions = [{
assertion = cfg.path == null || cfg.modulesPath == null;
message = "Cannot simultaneously use "
+ "'programs.home-manager.path' and "
+ "'programs.home-manager.modulesPath'.";
}];
home.packages = [ home.packages = [
(import ../../home-manager { (import ../../home-manager {
inherit pkgs; inherit pkgs;
inherit (cfg) modulesPath; path =
if cfg.modulesPath != null
then "$(dirname ${cfg.modulesPath})"
else cfg.path;
}) })
]; ];