Skip to content

Commit cc32d82

Browse files
committed
feat: patch upstream PR - make parsePackagesFromUsePackage consider :pin
nix-community#501 Thanks, @yunhao94
1 parent ddbea4d commit cc32d82

3 files changed

Lines changed: 66 additions & 5 deletions

File tree

README.org

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,14 @@ For example, =emacsWithPackagesFromUsePackage= adds packages which are required
138138
# `use-package-always-ensure` to `t` in your config.
139139
alwaysEnsure = true;
140140

141+
# By default emacsWithPackagesFromUsePackage will prefer to pull in
142+
# packages from MELPA.
143+
# Setting `alwaysPin` to `gnu` emulates `use-package-always-pin`
144+
# and pulls in all use-package references from GNU ELPA.
145+
# Note that this is NOT recommended unless you've actually set
146+
# `use-package-always-pin` to `"gnu"` in your config.
147+
alwaysPin = "gnu";
148+
141149
# For Org mode babel files, by default only code blocks with
142150
# `:tangle yes` are considered. Setting `alwaysTangle` to `true`
143151
# will include all code blocks missing the `:tangle` argument,

elisp.nix

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ in
1414
defaultInitFile ? false,
1515
# emulate `use-package-always-ensure` behavior (defaulting to false)
1616
alwaysEnsure ? false,
17+
# emulate `use-package-always-pin` behavior (defaulting to false)
18+
alwaysPin ? false,
1719
# emulate `#+PROPERTY: header-args:emacs-lisp :tangle yes`
1820
alwaysTangle ? false,
1921
extraEmacsPackages ? epkgs: [ ],
@@ -47,6 +49,7 @@ let
4749
isOrgModeFile
4850
alwaysTangle
4951
alwaysEnsure
52+
alwaysPin
5053
;
5154
};
5255
emacsPackages = (pkgs.emacsPackagesFor package).overrideScope (
@@ -61,7 +64,22 @@ in
6164
emacsWithPackages (
6265
epkgs:
6366
let
64-
usePkgs = map (name: epkgs.${name} or (mkPackageError name)) packages;
67+
pkgArchives = {
68+
"gnu" = "elpaPackages";
69+
"gnu-devel" = "elpaDevelPackages";
70+
"nongnu" = "nongnuPackages";
71+
"nongnu-devel" = "nongnuDevelPackages";
72+
"melpa" = "melpaPackages";
73+
"melpa-stable" = "melpaStablePackages";
74+
};
75+
usePkgs = map (
76+
pkg:
77+
if pkg.archive != null then
78+
epkgs.${pkgArchives.${pkg.archive}}.${pkg.name}
79+
or (mkPackageError "${pkgArchives.${pkg.archive}}.${pkg.name}")
80+
else
81+
epkgs.${pkg.name} or (mkPackageError pkg.name)
82+
) packages;
6583
extraPkgs = extraEmacsPackages epkgs;
6684
defaultInitFilePkg =
6785
if !((builtins.isBool defaultInitFile) || (lib.isDerivation defaultInitFile)) then

parse.nix

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,14 +68,23 @@ let
6868
# (use-package paredit-mode
6969
# :ensure paredit
7070
# :hook (emacs-lisp-mode lisp-mode lisp-interaction-mode))
71+
#
72+
# (use-package evil
73+
# :ensure t
74+
# :pin nongnu)
7175
# ''
72-
# => [ "direnv" "paredit" ]
76+
# => [
77+
# { name = "direnv"; archive = null }
78+
# { name = "paredit"; archive = null }
79+
# { name = "evil"; archive = "nongnu" }
80+
# ]
7381
parsePackagesFromUsePackage =
7482
{
7583
configText,
76-
alwaysEnsure ? false,
7784
isOrgModeFile ? false,
7885
alwaysTangle ? false,
86+
alwaysEnsure ? false,
87+
alwaysPin ? false,
7988
}:
8089
let
8190
readFunction =
@@ -133,6 +142,26 @@ let
133142
else
134143
[ ];
135144

145+
getArchive =
146+
item:
147+
let
148+
pinValue = getKeywordValue ":pin" item;
149+
packageArchives = [
150+
"gnu"
151+
"gnu-devel"
152+
"nongnu"
153+
"nongnu-devel"
154+
"melpa"
155+
"melpa-stable"
156+
];
157+
in
158+
if builtins.elem pinValue packageArchives then
159+
pinValue
160+
else if builtins.elem alwaysPin packageArchives then
161+
alwaysPin
162+
else
163+
null;
164+
136165
recurse =
137166
item:
138167
if builtins.isList item && item != [ ] then
@@ -142,8 +171,14 @@ let
142171
if builtins.elem packageManager [ "use-package" ] then
143172
if !(isDisabled item) then
144173
[
145-
packageManager
146-
(getName item)
174+
{
175+
name = packageManager;
176+
archive = null;
177+
}
178+
{
179+
name = (getName item);
180+
archive = (getArchive item);
181+
}
147182
]
148183
++ map recurse item
149184
else

0 commit comments

Comments
 (0)