Add option use-package-always-ensure behavior

When `use-package-always-ensure` is set to `t`, `:ensure` defaults to
`t`. This adds the `alwaysEnsure` argument to
`emacsWithPackagesFromUsePackage` which, if set to true, emulates this
behavior.
This commit is contained in:
talyz 2020-07-18 21:08:54 +02:00
parent a0260daa88
commit e43d9dbe42
No known key found for this signature in database
GPG key ID: 2DED2151F4671A2B
2 changed files with 19 additions and 12 deletions

View file

@ -9,19 +9,25 @@ let
parse = pkgs.callPackage ./parse.nix {};
in {
config,
alwaysEnsure ? false, # emulate `use-package-always-ensure` behavior
extraEmacsPackages ? epkgs: [],
package ? pkgs.emacs,
override ? (epkgs: epkgs)
}:
let
packages = parse.parsePackagesFromUsePackage config;
packages = parse.parsePackagesFromUsePackage config alwaysEnsure;
emacsPackages = pkgs.emacsPackagesGen package;
emacsWithPackages = emacsPackages.emacsWithPackages;
mkPackageError = name:
let
errorFun = if alwaysEnsure then builtins.trace else throw;
in
errorFun "Emacs package ${name}, declared wanted with use-package, not found." null;
in
emacsWithPackages (epkgs:
let
overridden = override epkgs;
usePkgs = builtins.map (name: overridden.${name}) packages;
usePkgs = map (name: overridden.${name} or (mkPackageError name)) packages;
extraPkgs = extraEmacsPackages overridden;
in
[ overridden.use-package ] ++ usePkgs ++ extraPkgs)

View file

@ -70,7 +70,7 @@ let
# :hook (emacs-lisp-mode lisp-mode lisp-interaction-mode))
# ''
# => [ "direnv" "paredit" ]
parsePackagesFromUsePackage = config:
parsePackagesFromUsePackage = config: alwaysEnsure:
let
find = item: list:
if list == [] then [] else
@ -110,22 +110,23 @@ let
getName = item:
let
ensureValue = getKeywordValue ":ensure" item;
usePackageName = builtins.head (builtins.tail item);
in
if ensureValue == [] then
[]
else if builtins.isString ensureValue && !(lib.hasPrefix ":" ensureValue) then
ensureValue
if builtins.isString ensureValue then
if lib.hasPrefix ":" ensureValue then
usePackageName
else
ensureValue
else if ensureValue == true || (ensureValue == null && alwaysEnsure) then
usePackageName
else
builtins.head (builtins.tail item);
[];
recurse = item:
if builtins.isList item && item != [] then
if (builtins.head item) == "use-package" then
if !(isDisabled item) then
if builtins.elem ":ensure" item then
[ (getName item) ] ++ map recurse item
else
map recurse item
[ (getName item) ] ++ map recurse item
else
[]
else