Compare commits
36
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b78b5fa4a0 | ||
|
|
7aa2bd5bf4 | ||
|
|
57f3b72d3a | ||
|
|
0d1ca254d0 | ||
|
|
3166ae7993 | ||
|
|
2b71762384 | ||
|
|
1261ffee91 | ||
|
|
f5c9303ced | ||
|
|
8d663335eb | ||
|
|
72400b2c29 | ||
|
|
1d38ffc372 | ||
|
|
10d2c4e7e4 | ||
|
|
b646623a39 | ||
|
|
af2303526d | ||
|
|
11f8b1c1ce | ||
|
|
94c0367dd8 | ||
|
|
24c6d8dfc5 | ||
|
|
8fb1ed5919 | ||
|
|
829b688827 | ||
|
|
9e69b0d8b9 | ||
|
|
9bdfdfe14e | ||
|
|
b41fc9e6e8 | ||
|
|
5e7a4c55ed | ||
|
|
22076437f3 | ||
|
|
0d7b515a65 | ||
|
|
eafc8897e6 | ||
|
|
415f12bae5 | ||
|
|
06f1b13c21 | ||
|
|
a0653a7fb0 | ||
|
|
dff5f07952 | ||
|
|
b905de5833 | ||
|
|
ecf333d27a | ||
|
|
e413a1408e | ||
|
|
06ae8792e7 | ||
|
|
f856c78a4a | ||
|
|
31e84945d5 |
@@ -1,35 +0,0 @@
|
||||
image: nixos/unstable
|
||||
sources:
|
||||
- https://git.sr.ht/~rycee/home-manager
|
||||
secrets:
|
||||
- 01ad357c-3214-4f73-bb7e-2441e440cc51
|
||||
- 7d16ccc0-1c4f-4fd6-91c1-c54fc0f5807f
|
||||
- bd5f26ee-78b8-4a6f-9d68-8d8f53a068f1
|
||||
environment:
|
||||
NIX_CONFIG: "experimental-features = nix-command flakes"
|
||||
packages:
|
||||
- nixos.cachix
|
||||
- nixos.jq
|
||||
tasks:
|
||||
- setup: |
|
||||
cachix use rycee
|
||||
- build: |
|
||||
cd ./home-manager
|
||||
gitBranch="$(git show -s --pretty=%D HEAD | sed '{ s/.*, //; s!origin/!!; }')"
|
||||
[[ $gitBranch == master || $gitBranch == release-??.?? ]] || exit 0
|
||||
nix build -L .#docs-html
|
||||
cachix push rycee ./result
|
||||
- deploy: |
|
||||
cd ./home-manager
|
||||
gitBranch="$(git show -s --pretty=%D HEAD | sed '{ s/.*, //; s!origin/!!; }')"
|
||||
[[ $gitBranch == master || $gitBranch == release-??.?? ]] || exit 0
|
||||
|
||||
if [[ $gitBranch == master ]]; then
|
||||
dirName="unstable"
|
||||
else
|
||||
dirName="$(jq -r .release < release.json)"
|
||||
fi
|
||||
|
||||
rsync --delete -r --info=stats \
|
||||
"result/share/doc/home-manager/" \
|
||||
"hm-web:/srv/www/home-manager.dev/manual/$dirName"
|
||||
@@ -1,24 +0,0 @@
|
||||
# http://editorconfig.org
|
||||
root = true
|
||||
|
||||
[*]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
end_of_line = lf
|
||||
charset = utf-8
|
||||
trim_trailing_whitespace = true
|
||||
insert_final_newline = true
|
||||
|
||||
# The JSON files contain newlines inconsistently
|
||||
[*.json]
|
||||
insert_final_newline = unset
|
||||
|
||||
# Makefiles always use tabs for indentation
|
||||
[Makefile]
|
||||
indent_style = tab
|
||||
|
||||
[*.md]
|
||||
trim_trailing_whitespace = false
|
||||
|
||||
[*.plist]
|
||||
insert_final_newline = false
|
||||
@@ -1,61 +0,0 @@
|
||||
# This file contains a list of commits that are not likely what you
|
||||
# are looking for in a blame, such as mass reformatting or renaming.
|
||||
#
|
||||
# $ git config blame.ignoreRevsFile .git-blame-ignore-revs
|
||||
|
||||
# Treewide nixfmt-rfc-style
|
||||
cba2f9ce95c8d10b66cacf05a275e3ad71959638
|
||||
|
||||
# Treewide remove with lib
|
||||
0b491b460f52e87e23eb17bbf59c6ae64b7664c1
|
||||
95711f926676018d279ba09fe7530d03b5d5b3e2
|
||||
5e193cdcab61b5e7096ef3c132fdc0149e14f2d9
|
||||
55cf1f16324e694c991e846ad5fc897f0f75ac64
|
||||
a710f337d6f541f5ba50bc2d5daa6c34e9ee5834
|
||||
10dca990ae02aaf41ff12c5b18dd3dcf258c0d04
|
||||
d7f451d7b13bbe075abecfd345f8b149a000216a
|
||||
65413f297f8c4c42a99270c15bce7bda1bfea724
|
||||
b5976017741653251258112f7e6ee5d8b9e3a832
|
||||
e0be70bcf94be20f8f0f6d215d909b614ab6ebeb
|
||||
e30c6a41bc8548738341d10c0b17f8fead8e55ee
|
||||
b5142d46a3f912ef99e9cec3e51d757fbeaf14ea
|
||||
56374cc64d58451b359bb4e8502387d3a96e7c7b
|
||||
32531e457215000b739da6cd40acfb080823f396
|
||||
34d524f3edcf3a04c00ad2c09c24ec9d35d937f9
|
||||
439a125afef8c97308ec0c6db75d38e15d92208d
|
||||
5031c6d2978109336637977c165f82aa49fa16a7
|
||||
b34b56689dcc75294e14e8c95db4e054a4e9573f
|
||||
234613d77c939ff2e2c0f2c476a56d80930e5b8b
|
||||
e3baf274f47678df6289c7482353cb6d38b7be5d
|
||||
c90cd85b04ff3348978b05ba73ffc8e1b74b9fce
|
||||
2d731a33b193209cb88b874e508ea912765f7d99
|
||||
20fd9686b85dc64657a176466e23d0f3a5e1f760
|
||||
96dee79b178d295b716052feca3ee46abc085abe
|
||||
97d7946b5e107dd03cc82f21165251d4e0159655
|
||||
0dfec9deb275854a56c97c356c40ef72e3a2e632
|
||||
4b2d3b03becc184f2d1485e109c6a55f94d5f886
|
||||
|
||||
# Treewide remove lib.mdDoc
|
||||
9f9e277b60a6e6915ad3a129e06861044b50fdf2
|
||||
|
||||
# Treewide replace usage of literalExample
|
||||
bd11e2c5e67385970e59e55ba7a4c35d1ffaee4d
|
||||
|
||||
# Treewide nix fmt change
|
||||
b4752b0eda6302b92a6d5dd554c83f188bc3ae6d
|
||||
9136120c369d91144910a985262e3c3b8e8872d6
|
||||
|
||||
# Treewide remove noops
|
||||
f2f1076c1f789595c2a2b18b76466fbd691025dd
|
||||
|
||||
# Treewide statix cleanup
|
||||
01ea51d7065e0ab06a09df9db4d1c17f6eb2675f
|
||||
74d8d470345b9324f89e14d675c14b92dc4a091d
|
||||
5209a256fd507322b0dd09ade7bc61923da948cf
|
||||
11ad9d2e42ebf6d00db4d7bae252f1c6b7dd36a4
|
||||
74b0e979375b0ed469e2394820aa50ba2114800b
|
||||
de90ee24082bb8dd44145f5c733b807467856820
|
||||
|
||||
# Deadnix cleanup
|
||||
71402c5df34df5ee7b6c10d738018f9f0c8bde2b
|
||||
a93d80bcec089abf80894c25ee3934b7e196bbd9
|
||||
@@ -1,38 +0,0 @@
|
||||
name: "✨ Feature Request"
|
||||
description: "Suggest an improvement to Home Manager"
|
||||
title: "[Feature Request] "
|
||||
labels: ["feature request"]
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
Thank you for contributing to Home Manager!
|
||||
|
||||
Before you open a new issue, please search the existing issues to see if your feature has already been requested or discussed.
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: "## 🔧 Existing Module Improvement"
|
||||
- type: input
|
||||
id: existing-module-name
|
||||
attributes:
|
||||
label: Module Name
|
||||
description: "What is the name of the module?"
|
||||
placeholder: "e.g., programs.git"
|
||||
- type: textarea
|
||||
id: existing-module-feature
|
||||
attributes:
|
||||
label: Requested Feature
|
||||
description: "Please describe the new feature or improvement in detail."
|
||||
- type: textarea
|
||||
id: existing-module-limitation
|
||||
attributes:
|
||||
label: Current Limitations
|
||||
description: "Why can't your goal be achieved with the current implementation? Please be specific."
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: "---"
|
||||
- type: textarea
|
||||
id: additional-context
|
||||
attributes:
|
||||
label: Additional Context
|
||||
description: Add any other context, screenshots, or configuration examples about the feature request here.
|
||||
@@ -1,50 +0,0 @@
|
||||
name: Bug Report
|
||||
description: File a bug/issue
|
||||
title: 'bug: '
|
||||
labels: [bug, triage]
|
||||
|
||||
body:
|
||||
- type: checkboxes
|
||||
attributes:
|
||||
label: Are you following the right branch?
|
||||
description: |
|
||||
You should follow the branch of Home Manager that corresponds to your
|
||||
version of Nixpkgs; see [the README](https://github.com/nix-community/home-manager#releases) for details.
|
||||
options:
|
||||
- label: My Nixpkgs and Home Manager versions are in sync
|
||||
required: true
|
||||
- type: checkboxes
|
||||
attributes:
|
||||
label: Is there an existing issue for this?
|
||||
description: |
|
||||
Please search to see if an issue already exists for the bug you encountered.
|
||||
options:
|
||||
- label: I have searched the existing issues
|
||||
required: true
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Issue description
|
||||
description: |
|
||||
Please describe the issue.
|
||||
|
||||
For support and help please use the IRC channel #home-manager at irc.oftc.net or
|
||||
Matrix room <https://matrix.to/#/#hm:rycee.net> instead.
|
||||
validations:
|
||||
required: false
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Maintainer CC
|
||||
description: |
|
||||
Please @ people who are in the `meta.maintainers` list of the offending module.
|
||||
validations:
|
||||
required: false
|
||||
- type: textarea
|
||||
id: system
|
||||
attributes:
|
||||
label: System information
|
||||
description: |
|
||||
Please run `nix-shell -p nix-info --run "nix-info -m"` and paste the result.
|
||||
render: markdown
|
||||
validations:
|
||||
required: true
|
||||
|
||||
@@ -1,37 +0,0 @@
|
||||
name: "✨ New Module Request"
|
||||
description: "Suggest an addition to Home Manager"
|
||||
title: "[New Module Request] "
|
||||
labels: ["new module request"]
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
Thank you for contributing to Home Manager!
|
||||
|
||||
Before you open a new issue, please search the existing issues to see if your feature has already been requested or discussed.
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: "## ➕ New Program or Service"
|
||||
- type: input
|
||||
id: new-program-name
|
||||
attributes:
|
||||
label: Program/Service Name
|
||||
description: "What is the name of the program or service you would like to add?"
|
||||
placeholder: "e.g., my-cool-cli-tool"
|
||||
- type: input
|
||||
id: new-program-repo
|
||||
attributes:
|
||||
label: Upstream Repository
|
||||
description: "Please provide a link to the source code repository."
|
||||
placeholder: "https://github.com/user/repo"
|
||||
- type: textarea
|
||||
id: new-program-docs
|
||||
attributes:
|
||||
label: Configuration Documentation
|
||||
description: "Please provide links to any relevant documentation for configuring this program."
|
||||
placeholder: "e.g., man page, project wiki, configuration file examples, etc."
|
||||
- type: textarea
|
||||
id: new-program-reason
|
||||
attributes:
|
||||
label: Reason for Addition
|
||||
description: "**Why do you want this program or service added to Home Manager?"
|
||||
@@ -1,49 +0,0 @@
|
||||
### Description
|
||||
|
||||
<!--
|
||||
|
||||
Please provide a brief description of your change.
|
||||
|
||||
-->
|
||||
|
||||
### Checklist
|
||||
|
||||
<!--
|
||||
|
||||
Please go through the following checklist before opening a non-WIP
|
||||
pull-request.
|
||||
|
||||
Also make sure to read the guidelines found at
|
||||
|
||||
https://nix-community.github.io/home-manager/#sec-guidelines
|
||||
|
||||
-->
|
||||
|
||||
- [ ] Change is backwards compatible.
|
||||
|
||||
- [ ] Code formatted with `nix fmt` or
|
||||
`nix-shell -A dev --run treefmt`.
|
||||
|
||||
- [ ] Code tested through `nix build .#test-all`
|
||||
or a targeted `nix run .#tests -- <pattern>`.
|
||||
|
||||
- [ ] Test cases updated/added. See [example](https://github.com/nix-community/home-manager/commit/f3fbb50b68df20da47f9b0def5607857fcc0d021#diff-b61a6d542f9036550ba9c401c80f00ef).
|
||||
|
||||
- [ ] Commit messages are formatted like
|
||||
|
||||
```
|
||||
{component}: {description}
|
||||
|
||||
{long description}
|
||||
```
|
||||
|
||||
See [CONTRIBUTING](https://nix-community.github.io/home-manager/#sec-commit-style) for more information and [recent commit messages](https://github.com/nix-community/home-manager/commits/master) for examples.
|
||||
|
||||
- If this PR adds a new module
|
||||
|
||||
- [ ] Added myself as module maintainer. See [example](https://github.com/nix-community/home-manager/blob/a51598236f23c89e59ee77eb8e0614358b0e896c/modules/programs/lesspipe.nix#L11).
|
||||
- [ ] Generate a news entry. See [News](https://nix-community.github.io/home-manager/index.xhtml#sec-news)
|
||||
- [ ] Basic tests added. See [Tests](https://nix-community.github.io/home-manager/index.xhtml#sec-tests)
|
||||
|
||||
- If this PR adds an exciting new feature or contains a breaking change.
|
||||
- [ ] Generate a news entry. See [News](https://nix-community.github.io/home-manager/index.xhtml#sec-news)
|
||||
@@ -1,30 +0,0 @@
|
||||
version: 2
|
||||
updates:
|
||||
- package-ecosystem: "github-actions"
|
||||
directory: "/"
|
||||
target-branch: "master"
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
commit-message:
|
||||
prefix: "ci:"
|
||||
- package-ecosystem: "github-actions"
|
||||
directory: "/"
|
||||
target-branch: "release-26.05"
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
commit-message:
|
||||
prefix: "ci:"
|
||||
- package-ecosystem: "nix"
|
||||
directory: "/"
|
||||
target-branch: "master"
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
commit-message:
|
||||
prefix: "flake:"
|
||||
- package-ecosystem: "nix"
|
||||
directory: "/"
|
||||
target-branch: "release-26.05"
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
commit-message:
|
||||
prefix: "flake:"
|
||||
@@ -1,744 +0,0 @@
|
||||
"release":
|
||||
- base-branch:
|
||||
- '^release-.*'
|
||||
"ai":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/programs/aiac.nix
|
||||
- modules/programs/aichat.nix
|
||||
- modules/programs/aider-chat.nix
|
||||
- modules/programs/claude-code/**/*
|
||||
- modules/programs/codex.nix
|
||||
- modules/programs/fabric-ai.nix
|
||||
- modules/programs/antigravity-cli.nix
|
||||
- modules/programs/mcp.nix
|
||||
- modules/programs/mistral-vibe.nix
|
||||
- modules/programs/mods.nix
|
||||
- modules/programs/opencode.nix
|
||||
- modules/services/local-ai.nix
|
||||
- modules/services/ollama.nix
|
||||
"audio":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/programs/beets.nix
|
||||
- modules/programs/cava.nix
|
||||
- modules/programs/cavalier.nix
|
||||
- modules/programs/cmus.nix
|
||||
- modules/programs/ncmpcpp.nix
|
||||
- modules/programs/ncspot.nix
|
||||
- modules/programs/pianobar.nix
|
||||
- modules/programs/pyradio.nix
|
||||
- modules/programs/radio-active.nix
|
||||
- modules/programs/radio-cli.nix
|
||||
- modules/programs/rmpc.nix
|
||||
- modules/programs/spotify-player.nix
|
||||
- modules/programs/timidity.nix
|
||||
- modules/services/amberol.nix
|
||||
- modules/services/easyeffects.nix
|
||||
- modules/services/fluidsynth.nix
|
||||
- modules/services/librespot.nix
|
||||
- modules/services/listenbrainz-mpd.nix
|
||||
- modules/services/mopidy.nix
|
||||
- modules/services/mpd-discord-rpc.nix
|
||||
- modules/services/mpd-mpris.nix
|
||||
- modules/services/mpd.nix
|
||||
- modules/services/mpdris2-rs.nix
|
||||
- modules/services/mpdris2.nix
|
||||
- modules/services/mpdscribble.nix
|
||||
- modules/services/mpris-proxy.nix
|
||||
- modules/services/pasystray.nix
|
||||
- modules/services/playerctld.nix
|
||||
- modules/services/pulseeffects.nix
|
||||
- modules/services/rescrobbled.nix
|
||||
- modules/services/spotifyd.nix
|
||||
- tests/modules/services/mpd/**/*
|
||||
"automation":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/services/autotiling.nix
|
||||
- modules/services/caffeine.nix
|
||||
- modules/services/darkman.nix
|
||||
- modules/services/devilspie2.nix
|
||||
- modules/services/espanso.nix
|
||||
- modules/services/keynav.nix
|
||||
- modules/services/skhd.nix
|
||||
"backup":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/programs/borgmatic.nix
|
||||
- modules/programs/rclone.nix
|
||||
- modules/services/borgmatic.nix
|
||||
- modules/services/restic.nix
|
||||
- tests/modules/programs/borgmatic/**/*
|
||||
- tests/modules/services/borgmatic/**/*
|
||||
"bars":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/programs/ashell.nix
|
||||
- modules/programs/eww.nix
|
||||
- modules/programs/hyprpanel/default.nix
|
||||
- modules/programs/i3bar-river.nix
|
||||
- modules/programs/sketchybar.nix
|
||||
- modules/programs/tray-tui.nix
|
||||
- modules/programs/waybar.nix
|
||||
- modules/programs/xmobar.nix
|
||||
- modules/programs/yambar.nix
|
||||
- modules/services/polybar.nix
|
||||
- modules/services/taffybar.nix
|
||||
- tests/modules/programs/ashell/**/*
|
||||
- tests/modules/programs/i3bar-river/**/*
|
||||
- tests/modules/programs/waybar/**/*
|
||||
- tests/modules/services/polybar/**/*
|
||||
"browsers":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/misc/mozilla-messaging-hosts.nix
|
||||
- modules/programs/amfora.nix
|
||||
- modules/programs/chawan.nix
|
||||
- modules/programs/chromium.nix
|
||||
- modules/programs/firefox/**/*
|
||||
- modules/programs/firefoxpwa.nix
|
||||
- modules/programs/floorp.nix
|
||||
- modules/programs/librewolf.nix
|
||||
- modules/programs/nyxt.nix
|
||||
- modules/programs/qutebrowser.nix
|
||||
- modules/programs/w3m.nix
|
||||
- tests/modules/programs/chromium/**/*
|
||||
- tests/modules/programs/firefox/**/*
|
||||
- tests/modules/programs/qutebrowser/**/*
|
||||
"calendar":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/*/vdirsyncer*.nix
|
||||
- modules/accounts/calendar.nix
|
||||
- modules/programs/khal/**/*
|
||||
- modules/programs/pimsync/**/*
|
||||
- modules/programs/qcal.nix
|
||||
- modules/programs/vdirsyncer/**/*
|
||||
- modules/services/pimsync.nix
|
||||
- tests/modules/programs/khal/**/*
|
||||
"clipboard":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/services/clipcat.nix
|
||||
- modules/services/cliphist.nix
|
||||
- modules/services/clipman.nix
|
||||
- modules/services/clipmenu.nix
|
||||
- modules/services/clipse.nix
|
||||
- modules/services/copyq.nix
|
||||
- modules/services/parcellite.nix
|
||||
- modules/services/pbgopy.nix
|
||||
- modules/services/wl-clip-persist.nix
|
||||
- tests/modules/services/clipman/**/*
|
||||
- tests/modules/services/copyq/**/*
|
||||
- tests/modules/services/wl-clip-persist/**/*
|
||||
"cli-tools":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/programs/aliae.nix
|
||||
- modules/programs/amoco.nix
|
||||
- modules/programs/antidote.nix
|
||||
- modules/programs/atool.nix
|
||||
- modules/programs/atuin.nix
|
||||
- modules/programs/autojump.nix
|
||||
- modules/programs/bashmount.nix
|
||||
- modules/programs/bat.nix
|
||||
- modules/programs/bottom.nix
|
||||
- modules/programs/boxxy.nix
|
||||
- modules/programs/broot.nix
|
||||
- modules/programs/btop.nix
|
||||
- modules/programs/carapace.nix
|
||||
- modules/programs/clock-rs.nix
|
||||
- modules/programs/delta.nix
|
||||
- modules/programs/diff-highlight.nix
|
||||
- modules/programs/diff-so-fancy.nix
|
||||
- modules/programs/difftastic.nix
|
||||
- modules/programs/dircolors.nix
|
||||
- modules/programs/direnv.nix
|
||||
- modules/programs/eza.nix
|
||||
- modules/programs/fastfetch.nix
|
||||
- modules/programs/fd.nix
|
||||
- modules/programs/fzf.nix
|
||||
- modules/programs/goto.nix
|
||||
- modules/programs/grep.nix
|
||||
- modules/programs/hstr.nix
|
||||
- modules/programs/htop.nix
|
||||
- modules/programs/hwatch.nix
|
||||
- modules/programs/hyfetch.nix
|
||||
- modules/programs/infat.nix
|
||||
- modules/programs/inori.nix
|
||||
- modules/programs/jq*.nix
|
||||
- modules/programs/keychain.nix
|
||||
- modules/programs/less.nix
|
||||
- modules/programs/lesspipe.nix
|
||||
- modules/programs/lsd.nix
|
||||
- modules/programs/man.nix
|
||||
- modules/programs/mc.nix
|
||||
- modules/programs/mcfly.nix
|
||||
- modules/programs/navi.nix
|
||||
- modules/programs/nix-your-shell.nix
|
||||
- modules/programs/nom.nix
|
||||
- modules/programs/parallel.nix
|
||||
- modules/programs/patdiff.nix
|
||||
- modules/programs/pay-respects.nix
|
||||
- modules/programs/pazi.nix
|
||||
- modules/programs/pet.nix
|
||||
- modules/programs/pistol.nix
|
||||
- modules/programs/pls.nix
|
||||
- modules/programs/readline.nix
|
||||
- modules/programs/riff.nix
|
||||
- modules/programs/ripgrep*.nix
|
||||
- modules/programs/scmpuff.nix
|
||||
- modules/programs/screen.nix
|
||||
- modules/programs/script-directory.nix
|
||||
- modules/programs/sesh.nix
|
||||
- modules/programs/sherlock.nix
|
||||
- modules/programs/skim.nix
|
||||
- modules/programs/superfile.nix
|
||||
- modules/programs/tealdeer.nix
|
||||
- modules/programs/television.nix
|
||||
- modules/programs/tmate.nix
|
||||
- modules/programs/tmux.nix
|
||||
- modules/programs/topgrade.nix
|
||||
- modules/programs/translate-shell.nix
|
||||
- modules/programs/ty.nix
|
||||
- modules/programs/uv.nix
|
||||
- modules/programs/vivid.nix
|
||||
- modules/programs/watson.nix
|
||||
- modules/programs/z-lua.nix
|
||||
- modules/programs/zellij.nix
|
||||
- modules/programs/zk.nix
|
||||
- modules/programs/zoxide.nix
|
||||
- modules/programs/zplug.nix
|
||||
- tests/modules/programs/fzf/**/*
|
||||
- tests/modules/programs/tmux/**/*
|
||||
"contacts":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/accounts/contacts.nix
|
||||
- modules/programs/abook.nix
|
||||
- modules/programs/khard.nix
|
||||
- tests/modules/programs/abook/**/*
|
||||
- tests/modules/programs/khard/**/*
|
||||
"containers":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/programs/distrobox.nix
|
||||
- modules/programs/docker-cli.nix
|
||||
- modules/services/colima.nix
|
||||
- modules/services/podman/**/*
|
||||
- modules/services/podman/linux/**/*
|
||||
"desktop-ui":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/programs/desktoppr.nix
|
||||
- modules/programs/gnome-shell.nix
|
||||
- modules/programs/hyprshot.nix
|
||||
- modules/programs/quickshell.nix
|
||||
- modules/programs/satty.nix
|
||||
- modules/programs/swappy.nix
|
||||
- modules/services/avizo.nix
|
||||
- modules/services/blanket.nix
|
||||
- modules/services/flameshot.nix
|
||||
- modules/services/gromit-mpx.nix
|
||||
- modules/services/linux-wallpaperengine.nix
|
||||
- modules/services/picom.nix
|
||||
- modules/services/random-background.nix
|
||||
- modules/services/volnoti.nix
|
||||
- modules/services/wob.nix
|
||||
- modules/services/wpaperd.nix
|
||||
"desktop-utilities":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/programs/autorandr.nix
|
||||
- modules/programs/bluetuith.nix
|
||||
- modules/services/autorandr.nix
|
||||
- modules/services/blueman-applet.nix
|
||||
- modules/services/gnome-keyring.nix
|
||||
- modules/services/lxqt-policykit-agent.nix
|
||||
- modules/services/network-manager-applet.nix
|
||||
- modules/services/polkit-gnome.nix
|
||||
- modules/services/redshift-gammastep/**/*
|
||||
- modules/services/sctd.nix
|
||||
- modules/services/snixembed.nix
|
||||
- modules/services/status-notifier-watcher.nix
|
||||
- modules/services/systembus-notify.nix
|
||||
- modules/services/tailscale-systray.nix
|
||||
- modules/services/trayscale.nix
|
||||
- modules/services/udiskie.nix
|
||||
- modules/services/unclutter.nix
|
||||
- modules/services/xembed-sni-proxy.nix
|
||||
"dev-tools":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/programs/amber.nix
|
||||
- modules/programs/awscli.nix
|
||||
- modules/programs/bacon.nix
|
||||
- modules/programs/bun.nix
|
||||
- modules/programs/cargo.nix
|
||||
- modules/programs/darcs.nix
|
||||
- modules/programs/earthly.nix
|
||||
- modules/programs/eclipse.nix
|
||||
- modules/programs/gcc.nix
|
||||
- modules/programs/go.nix
|
||||
- modules/programs/gradle.nix
|
||||
- modules/programs/granted.nix
|
||||
- modules/programs/grype.nix
|
||||
- modules/programs/java.nix
|
||||
- modules/programs/jetbrains-remote.nix
|
||||
- modules/programs/k9s.nix
|
||||
- modules/programs/kraftkit.nix
|
||||
- modules/programs/kubecolor.nix
|
||||
- modules/programs/kubeswitch.nix
|
||||
- modules/programs/lazydocker.nix
|
||||
- modules/programs/lazysql.nix
|
||||
- modules/programs/matplotlib.nix
|
||||
- modules/programs/mercurial.nix
|
||||
- modules/programs/mergiraf.nix
|
||||
- modules/programs/mise.nix
|
||||
- modules/programs/mr.nix
|
||||
- modules/programs/mypy.nix
|
||||
- modules/programs/nh.nix
|
||||
- modules/programs/nix-index.nix
|
||||
- modules/programs/nix-init.nix
|
||||
- modules/programs/nix-search-tv.nix
|
||||
- modules/programs/npm.nix
|
||||
- modules/programs/numbat.nix
|
||||
- modules/programs/nvchecker.nix
|
||||
- modules/programs/opam.nix
|
||||
- modules/programs/openstackclient.nix
|
||||
- modules/programs/pgcli.nix
|
||||
- modules/programs/piston-cli.nix
|
||||
- modules/programs/poetry.nix
|
||||
- modules/programs/pyenv.nix
|
||||
- modules/programs/pylint.nix
|
||||
- modules/programs/pywal.nix
|
||||
- modules/programs/rbenv.nix
|
||||
- modules/programs/rizin.nix
|
||||
- modules/programs/ruff.nix
|
||||
- modules/programs/sagemath.nix
|
||||
- modules/programs/sbt.nix
|
||||
- modules/programs/sftpman.nix
|
||||
- modules/programs/smug.nix
|
||||
- modules/programs/sqls.nix
|
||||
- modules/programs/tex-fmt.nix
|
||||
- modules/programs/texlive.nix
|
||||
- modules/programs/tirith.nix
|
||||
- modules/programs/vim-vint.nix
|
||||
- modules/programs/visidata.nix
|
||||
- modules/programs/yarn/default.nix
|
||||
- modules/services/lorri.nix
|
||||
- tests/modules/programs/go/**/*
|
||||
- tests/modules/programs/java/**/*
|
||||
"editors":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/programs/amp.nix
|
||||
- modules/programs/anvil-editor.nix
|
||||
- modules/programs/cudatext.nix
|
||||
- modules/programs/emacs.nix
|
||||
- modules/programs/formiko.nix
|
||||
- modules/programs/fresh-editor.nix
|
||||
- modules/programs/helix.nix
|
||||
- modules/programs/kakoune.nix
|
||||
- modules/programs/lapce.nix
|
||||
- modules/programs/micro.nix
|
||||
- modules/programs/ne.nix
|
||||
- modules/programs/neovide.nix
|
||||
- modules/programs/neovim.nix
|
||||
- modules/programs/retext.nix
|
||||
- modules/programs/vim.nix
|
||||
- modules/programs/vscode/**/*
|
||||
- modules/programs/zed-editor.nix
|
||||
- modules/services/emacs.nix
|
||||
- tests/modules/programs/emacs/**/*
|
||||
- tests/modules/programs/helix/**/*
|
||||
- tests/modules/programs/neovim/**/*
|
||||
- tests/modules/programs/vim/**/*
|
||||
"file-manager":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/programs/joshuto.nix
|
||||
- modules/programs/lf.nix
|
||||
- modules/programs/nnn.nix
|
||||
- modules/programs/ranger.nix
|
||||
- modules/programs/vifm.nix
|
||||
- modules/programs/xplr.nix
|
||||
- modules/programs/yazi.nix
|
||||
- tests/modules/programs/lf/**/*
|
||||
- tests/modules/programs/nnn/**/*
|
||||
- tests/modules/programs/ranger/**/*
|
||||
- tests/modules/programs/yazi/**/*
|
||||
"gaming":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/programs/am2rlauncher.nix
|
||||
- modules/programs/kodi.nix
|
||||
- modules/programs/lutris.nix
|
||||
- modules/programs/mangohud.nix
|
||||
- modules/programs/prismlauncher.nix
|
||||
- modules/programs/retroarch.nix
|
||||
- modules/programs/sm64ex.nix
|
||||
- modules/programs/ttyper.nix
|
||||
- modules/programs/vinegar.nix
|
||||
- modules/services/ludusavi.nix
|
||||
"git":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/programs/gh.nix
|
||||
- modules/programs/gh-dash.nix
|
||||
- modules/programs/git*.nix
|
||||
- modules/programs/jjui.nix
|
||||
- modules/programs/jujutsu.nix
|
||||
- modules/programs/lazygit.nix
|
||||
- modules/programs/lazyworktree.nix
|
||||
- modules/programs/radicle.nix
|
||||
- modules/programs/sapling.nix
|
||||
- modules/services/git-sync.nix
|
||||
- modules/services/radicle.nix
|
||||
- tests/modules/programs/gh/**/*
|
||||
- tests/modules/programs/gh-dash/**/*
|
||||
- tests/modules/programs/git/**/*
|
||||
"mail":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/*/mbsync*
|
||||
- modules/programs/aerc/**/*
|
||||
- modules/programs/afew.nix
|
||||
- modules/programs/alot/**/*
|
||||
- modules/programs/astroid/**/*
|
||||
- modules/programs/getmail*
|
||||
- modules/programs/getmail/**/*
|
||||
- modules/programs/himalaya.nix
|
||||
- modules/programs/lieer.nix
|
||||
- modules/programs/mbsync/**/*
|
||||
- modules/programs/meli.nix
|
||||
- modules/programs/msmtp*
|
||||
- modules/programs/msmtp/**/*
|
||||
- modules/programs/mu.nix
|
||||
- modules/programs/mujmap.nix
|
||||
- modules/programs/neomutt*
|
||||
- modules/programs/neomutt/**/*
|
||||
- modules/programs/notmuch/**/*
|
||||
- modules/programs/offlineimap/**/*
|
||||
- modules/programs/thunderbird.nix
|
||||
- modules/services/getmail.nix
|
||||
- modules/services/imapnotify/**/*
|
||||
- modules/services/lieer.nix
|
||||
- modules/services/muchsync.nix
|
||||
- modules/services/protonmail-bridge.nix
|
||||
- tests/modules/programs/aerc/*
|
||||
- tests/modules/programs/alot/*
|
||||
- tests/modules/programs/himalaya/*
|
||||
- tests/modules/programs/mbsync/*
|
||||
- tests/modules/programs/mujmap/*
|
||||
- tests/modules/programs/neomutt/*
|
||||
- tests/modules/programs/thunderbird/*
|
||||
"messaging":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/programs/abaddon.nix
|
||||
- modules/programs/algia.nix
|
||||
- modules/programs/discocss.nix
|
||||
- modules/programs/discord.nix
|
||||
- modules/programs/element-desktop.nix
|
||||
- modules/programs/gurk-rs.nix
|
||||
- modules/programs/halloy.nix
|
||||
- modules/programs/havoc.nix
|
||||
- modules/programs/hexchat.nix
|
||||
- modules/programs/iamb.nix
|
||||
- modules/programs/irssi.nix
|
||||
- modules/programs/nheko.nix
|
||||
- modules/programs/pidgin.nix
|
||||
- modules/programs/senpai.nix
|
||||
- modules/programs/tiny.nix
|
||||
- modules/programs/vesktop.nix
|
||||
- modules/programs/zapzap.nix
|
||||
- modules/services/pantalaimon.nix
|
||||
- tests/modules/programs/gurk-rs/**/*
|
||||
- tests/modules/programs/irssi/**/*
|
||||
- tests/modules/programs/nheko/**/*
|
||||
"monitoring":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/services/activitywatch.nix
|
||||
- modules/services/batsignal.nix
|
||||
- modules/services/cbatticon.nix
|
||||
- modules/services/conky.nix
|
||||
- modules/services/glance.nix
|
||||
- modules/services/poweralertd.nix
|
||||
"notification":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/programs/noti.nix
|
||||
- modules/services/dunst.nix
|
||||
- modules/services/fnott.nix
|
||||
- modules/services/mako.nix
|
||||
- modules/services/notify-osd.nix
|
||||
- modules/services/swaync.nix
|
||||
- modules/services/twmn.nix
|
||||
- tests/modules/services/dunst/**/*
|
||||
- tests/modules/services/mako/**/*
|
||||
"productivity":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/programs/anki/**/*
|
||||
- modules/programs/aphorme.nix
|
||||
- modules/programs/calibre.nix
|
||||
- modules/programs/comodoro.nix
|
||||
- modules/programs/foliate.nix
|
||||
- modules/programs/info.nix
|
||||
- modules/programs/joplin-desktop.nix
|
||||
- modules/programs/jrnl.nix
|
||||
- modules/programs/ledger.nix
|
||||
- modules/programs/newsboat.nix
|
||||
- modules/programs/obsidian.nix
|
||||
- modules/programs/onlyoffice.nix
|
||||
- modules/programs/pandoc.nix
|
||||
- modules/programs/papis.nix
|
||||
- modules/programs/pubs.nix
|
||||
- modules/programs/sioyek.nix
|
||||
- modules/programs/taskwarrior.nix
|
||||
- modules/programs/todoman.nix
|
||||
- modules/programs/zathura.nix
|
||||
- modules/services/comodoro.nix
|
||||
- modules/services/rsibreak.nix
|
||||
- modules/services/safeeyes.nix
|
||||
- modules/services/taskwarrior-sync.nix
|
||||
- modules/services/tomat.nix
|
||||
"password-manager":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/programs/browserpass.nix
|
||||
- modules/programs/keepassxc.nix
|
||||
- modules/programs/password-store.nix
|
||||
- modules/programs/rbw.nix
|
||||
- modules/programs/rofi-pass.nix
|
||||
- modules/services/pass-secret-service.nix
|
||||
- modules/services/proton-pass-agent.nix
|
||||
- tests/modules/programs/keepassxc/**/*
|
||||
- tests/modules/programs/password-store/**/*
|
||||
- tests/modules/programs/rofi-pass/**/*
|
||||
"photo":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/programs/ahoviewer.nix
|
||||
- modules/programs/feh.nix
|
||||
- modules/programs/gallery-dl.nix
|
||||
- modules/programs/imv.nix
|
||||
- modules/programs/pqiv.nix
|
||||
- modules/programs/swayimg.nix
|
||||
- modules/programs/wallust.nix
|
||||
"shell":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/lib/zsh.nix
|
||||
- modules/programs/bash.nix
|
||||
- modules/programs/fish.nix
|
||||
- modules/programs/intelli-shell.nix
|
||||
- modules/programs/ion.nix
|
||||
- modules/programs/nushell.nix
|
||||
- modules/programs/oh-my-posh.nix
|
||||
- modules/programs/powerline-go.nix
|
||||
- modules/programs/sheldon.nix
|
||||
- modules/programs/starship.nix
|
||||
- modules/programs/zsh/**/*
|
||||
- tests/modules/programs/bash/**/*
|
||||
- tests/modules/programs/fish/**/*
|
||||
- tests/modules/programs/nushell/**/*
|
||||
- tests/modules/programs/zsh/**/*
|
||||
"sync":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/programs/acd-cli.nix
|
||||
- modules/programs/airlift.nix
|
||||
- modules/programs/alistral.nix
|
||||
- modules/programs/onedrive.nix
|
||||
- modules/programs/rtorrent.nix
|
||||
- modules/services/davmail.nix
|
||||
- modules/services/dropbox.nix
|
||||
- modules/services/etesync-dav.nix
|
||||
- modules/services/kdeconnect.nix
|
||||
- modules/services/megasync.nix
|
||||
- modules/services/nextcloud-client.nix
|
||||
- modules/services/owncloud-client.nix
|
||||
- modules/services/pizauth.nix
|
||||
- modules/services/syncthing.nix
|
||||
- modules/services/unison.nix
|
||||
- tests/modules/services/dropbox/**/*
|
||||
- tests/modules/services/syncthing/**/*
|
||||
"system":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/programs/anup.nix
|
||||
- modules/programs/command-not-found/**/*
|
||||
- modules/programs/gpg.nix
|
||||
- modules/programs/home-manager.nix
|
||||
- modules/programs/mullvad-vpn.nix
|
||||
- modules/programs/opkssh.nix
|
||||
- modules/programs/ssh.nix
|
||||
- modules/services/gpg-agent.nix
|
||||
- modules/services/home-manager*.nix
|
||||
- modules/services/kbfs.nix
|
||||
- modules/services/keybase.nix
|
||||
- modules/services/macos-remap-keys/**/*
|
||||
- modules/services/nix-gc.nix
|
||||
- modules/services/ssh-agent.nix
|
||||
- modules/services/ssh-tpm-agent.nix
|
||||
- modules/services/yubikey-agent.nix
|
||||
- tests/modules/services/home-manager*/**/*
|
||||
"system-tools":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/programs/andcli.nix
|
||||
- modules/programs/aria2.nix
|
||||
- modules/programs/aria2p.nix
|
||||
- modules/programs/trippy.nix
|
||||
- modules/services/arrpc.nix
|
||||
- modules/services/cachix-agent.nix
|
||||
- modules/services/fusuma.nix
|
||||
- modules/services/grobi.nix
|
||||
- modules/services/hound.nix
|
||||
- modules/services/jankyborders.nix
|
||||
- modules/services/opensnitch-ui.nix
|
||||
- modules/services/osmscout-server.nix
|
||||
- modules/services/plan9port.nix
|
||||
- modules/services/psd.nix
|
||||
- modules/services/pueue.nix
|
||||
- modules/services/recoll.nix
|
||||
- modules/services/signaturepdf.nix
|
||||
- modules/services/tahoe-lafs.nix
|
||||
- modules/services/tldr-update.nix
|
||||
"terminal":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/programs/alacritty.nix
|
||||
- modules/programs/foot.nix
|
||||
- modules/programs/ghostty.nix
|
||||
- modules/programs/gnome-terminal.nix
|
||||
- modules/programs/kitty.nix
|
||||
- modules/programs/macchina/**/*
|
||||
- modules/programs/ptyxis.nix
|
||||
- modules/programs/rio.nix
|
||||
- modules/programs/terminator.nix
|
||||
- modules/programs/termite.nix
|
||||
- modules/programs/urxvt.nix
|
||||
- modules/programs/waveterm.nix
|
||||
- modules/programs/wezterm.nix
|
||||
- modules/services/shpool.nix
|
||||
- tests/modules/programs/alacritty/**/*
|
||||
- tests/modules/programs/foot/**/*
|
||||
- tests/modules/programs/ghostty/**/*
|
||||
- tests/modules/programs/kitty/**/*
|
||||
"video":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/programs/animdl.nix
|
||||
- modules/programs/anime-downloader.nix
|
||||
- modules/programs/aperture.nix
|
||||
- modules/programs/asciinema.nix
|
||||
- modules/programs/freetube.nix
|
||||
- modules/programs/mpv.nix
|
||||
- modules/programs/mpvpaper.nix
|
||||
- modules/programs/obs-studio.nix
|
||||
- modules/programs/streamlink.nix
|
||||
- modules/programs/twitch-tui.nix
|
||||
- modules/programs/yt-dlp.nix
|
||||
- modules/services/jellyfin-mpv-shim.nix
|
||||
- modules/services/plex-mpv-shim.nix
|
||||
- tests/modules/programs/mpv/**/*
|
||||
"remote-desktop":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/programs/looking-glass-client.nix
|
||||
- modules/services/remmina.nix
|
||||
- modules/services/wayvnc.nix
|
||||
"wayland":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/programs/ashell.nix
|
||||
- modules/programs/anyrun.nix
|
||||
- modules/services/awww.nix
|
||||
- modules/programs/bemenu.nix
|
||||
- modules/programs/fuzzel.nix
|
||||
- modules/programs/hyprlock.nix
|
||||
- modules/programs/kickoff.nix
|
||||
- modules/programs/onagre.nix
|
||||
- modules/programs/sway-easyfocus.nix
|
||||
- modules/programs/swaylock.nix
|
||||
- modules/programs/swayr.nix
|
||||
- modules/programs/tofi.nix
|
||||
- modules/programs/waybar.nix
|
||||
- modules/programs/waylogout.nix
|
||||
- modules/programs/wayprompt.nix
|
||||
- modules/programs/wleave.nix
|
||||
- modules/programs/wlogout.nix
|
||||
- modules/programs/wofi.nix
|
||||
- modules/programs/workstyle.nix
|
||||
- modules/programs/yofi.nix
|
||||
- modules/programs/vicinae/**/*
|
||||
- modules/programs/i3bar-river.nix
|
||||
- modules/services/fnott.nix
|
||||
- modules/services/hypridle.nix
|
||||
- modules/services/hyprlauncher.nix
|
||||
- modules/services/hyprpaper.nix
|
||||
- modules/services/hyprpolkitagent.nix
|
||||
- modules/services/hyprshell.nix
|
||||
- modules/services/hyprsunset.nix
|
||||
- modules/services/kanshi.nix
|
||||
- modules/services/mako.nix
|
||||
- modules/services/shikane.nix
|
||||
- modules/services/swayidle.nix
|
||||
- modules/services/swaync.nix
|
||||
- modules/services/swayosd.nix
|
||||
- modules/services/walker.nix
|
||||
- modules/services/way-displays.nix
|
||||
- modules/services/wlsunset.nix
|
||||
- modules/services/wluma.nix
|
||||
- modules/services/wpaperd.nix
|
||||
- tests/modules/programs/ashell/**/*
|
||||
- tests/modules/programs/i3bar-river/**/*
|
||||
- tests/modules/programs/swaylock/**/*
|
||||
- tests/modules/programs/vicinae/**/*
|
||||
- tests/modules/programs/waybar/**/*
|
||||
"window-managers":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/programs/aerospace.nix
|
||||
- modules/programs/i3bar-river.nix
|
||||
- modules/programs/i3blocks.nix
|
||||
- modules/programs/i3status-rust.nix
|
||||
- modules/programs/i3status.nix
|
||||
- modules/services/window-managers/**/*
|
||||
"x11":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- modules/programs/i3blocks.nix
|
||||
- modules/programs/i3status-rust.nix
|
||||
- modules/programs/i3status.nix
|
||||
- modules/programs/rofi.nix
|
||||
- modules/programs/tint2.nix
|
||||
- modules/programs/xmobar.nix
|
||||
- modules/programs/yambar.nix
|
||||
- modules/services/betterlockscreen.nix
|
||||
- modules/services/dunst.nix
|
||||
- modules/services/dwm-status.nix
|
||||
- modules/services/picom.nix
|
||||
- modules/services/polybar.nix
|
||||
- modules/services/screen-locker.nix
|
||||
- modules/services/stalonetray.nix
|
||||
- modules/services/sxhkd.nix
|
||||
- modules/services/taffybar.nix
|
||||
- modules/services/trayer.nix
|
||||
- modules/services/xcape.nix
|
||||
- modules/services/xembed-sni-proxy.nix
|
||||
- modules/services/xidlehook.nix
|
||||
- modules/services/xscreensaver.nix
|
||||
- modules/services/xsettingsd.nix
|
||||
- modules/services/xsuspender.nix
|
||||
- tests/modules/programs/i3blocks/**/*
|
||||
- tests/modules/programs/i3status-rust/**/*
|
||||
- tests/modules/programs/i3status/**/*
|
||||
- tests/modules/programs/rofi/**/*
|
||||
- tests/modules/services/picom/**/*
|
||||
- tests/modules/services/polybar/**/*
|
||||
@@ -1,45 +0,0 @@
|
||||
# Based on
|
||||
# https://github.com/NixOS/nixpkgs/blob/2566f9dc/.github/workflows/backport.yml
|
||||
name: Backport
|
||||
on:
|
||||
pull_request_target:
|
||||
types:
|
||||
- closed
|
||||
- labeled
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
pull-requests: write
|
||||
|
||||
jobs:
|
||||
backport:
|
||||
name: Backport Pull Request
|
||||
if: >
|
||||
vars.CI_APP_ID
|
||||
&& github.event.pull_request.merged == true
|
||||
&& (
|
||||
github.event.action != 'labeled'
|
||||
|| startsWith(github.event.label.name, 'backport')
|
||||
)
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Create GitHub App token
|
||||
uses: actions/create-github-app-token@v3
|
||||
if: vars.CI_APP_ID
|
||||
id: app-token
|
||||
with:
|
||||
app-id: ${{ vars.CI_APP_ID }}
|
||||
private-key: ${{ secrets.CI_APP_PRIVATE_KEY }}
|
||||
- uses: actions/checkout@v7
|
||||
with:
|
||||
token: ${{ steps.app-token.outputs.token || secrets.GITHUB_TOKEN }}
|
||||
ref: ${{ github.event.pull_request.base.sha }}
|
||||
- name: Create backport PRs
|
||||
id: backport
|
||||
uses: korthout/backport-action@v4
|
||||
with:
|
||||
# See https://github.com/korthout/backport-action#inputs
|
||||
github_token: ${{ steps.app-token.outputs.token || secrets.GITHUB_TOKEN }}
|
||||
branch_name: backport/${target_branch}/${pull_number}
|
||||
copy_labels_pattern: .*
|
||||
@@ -1,15 +0,0 @@
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
jobs:
|
||||
triage:
|
||||
runs-on: ubuntu-latest
|
||||
if: github.repository_owner == 'nix-community'
|
||||
steps:
|
||||
- uses: mschilde/auto-label-merge-conflicts@master
|
||||
with:
|
||||
CONFLICT_LABEL_NAME: "merge conflict"
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
MAX_RETRIES: 5
|
||||
WAIT_MS: 10000
|
||||
@@ -1,30 +0,0 @@
|
||||
name: GitHub Pages
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
workflow_dispatch:
|
||||
jobs:
|
||||
publish:
|
||||
if: github.event_name != 'schedule' || github.repository_owner == 'nix-community'
|
||||
strategy:
|
||||
matrix:
|
||||
os: [ubuntu-latest]
|
||||
runs-on: ${{ matrix.os }}
|
||||
steps:
|
||||
- uses: actions/checkout@v7
|
||||
- uses: cachix/install-nix-action@v31
|
||||
with:
|
||||
nix_path: nixpkgs=channel:nixpkgs-unstable
|
||||
- uses: cachix/cachix-action@v17
|
||||
with:
|
||||
name: nix-community
|
||||
authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}'
|
||||
- run: |
|
||||
nix-build -A docs.html
|
||||
cp -r result/share/doc/home-manager public
|
||||
- name: Deploy
|
||||
uses: peaceiris/actions-gh-pages@v4
|
||||
with:
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
publish_dir: ./public
|
||||
@@ -1,35 +0,0 @@
|
||||
name: "Label PR"
|
||||
|
||||
on:
|
||||
- pull_request_target
|
||||
|
||||
# WARNING:
|
||||
# When extending this action, be aware that $GITHUB_TOKEN allows some write
|
||||
# access to the GitHub API. This means that it should not evaluate user input in
|
||||
# a way that allows code injection.
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
pull-requests: write
|
||||
issues: write
|
||||
|
||||
jobs:
|
||||
labels:
|
||||
runs-on: ubuntu-latest
|
||||
if: github.repository_owner == 'nix-community'
|
||||
steps:
|
||||
- name: Get changed files count
|
||||
id: count
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
PR_NUMBER: ${{ github.event.pull_request.number }}
|
||||
run: |
|
||||
COUNT=$(gh api "repos/${{ github.repository }}/pulls/$PR_NUMBER/files" --paginate --jq '.[].filename' | grep -c '^modules/' || true)
|
||||
echo "Found $COUNT changed module files."
|
||||
echo "count=$COUNT" >> "$GITHUB_OUTPUT"
|
||||
|
||||
- uses: actions/labeler@v6
|
||||
if: steps.count.outputs.count <= 10
|
||||
with:
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
sync-labels: true
|
||||
@@ -1,81 +0,0 @@
|
||||
name: Tag Module Maintainers
|
||||
on:
|
||||
pull_request_target:
|
||||
types: [opened, ready_for_review, reopened, synchronize]
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.event_name == 'pull_request' && github.head_ref || github.run_id }}
|
||||
cancel-in-progress: true
|
||||
permissions:
|
||||
contents: read
|
||||
pull-requests: write
|
||||
jobs:
|
||||
tag-maintainers:
|
||||
runs-on: ubuntu-latest
|
||||
if: |
|
||||
github.event.pull_request.draft == false &&
|
||||
github.event.pull_request.state == 'open'
|
||||
steps:
|
||||
- name: Create GitHub App token
|
||||
uses: actions/create-github-app-token@v3
|
||||
if: vars.CI_APP_ID
|
||||
id: app-token
|
||||
with:
|
||||
app-id: ${{ vars.CI_APP_ID }}
|
||||
private-key: ${{ secrets.CI_APP_PRIVATE_KEY }}
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v7
|
||||
with:
|
||||
ref: ${{ github.event.pull_request.base.sha }}
|
||||
- name: Get Nixpkgs revision from flake.lock
|
||||
id: get-nixpkgs
|
||||
run: |
|
||||
echo "rev=$(jq -r '.nodes.nixpkgs.locked.rev' flake.lock)" >> "$GITHUB_OUTPUT"
|
||||
- name: Install Nix
|
||||
uses: cachix/install-nix-action@v31
|
||||
with:
|
||||
nix_path: nixpkgs=https://github.com/NixOS/nixpkgs/archive/${{ steps.get-nixpkgs.outputs.rev }}.tar.gz
|
||||
extra_nix_config: |
|
||||
experimental-features = nix-command flakes
|
||||
- name: Get changed files
|
||||
id: changed-files
|
||||
env:
|
||||
GH_TOKEN: ${{ steps.app-token.outputs.token || secrets.GITHUB_TOKEN }}
|
||||
PR_NUMBER: ${{ github.event.pull_request.number }}
|
||||
run: |
|
||||
CHANGED_FILES=$(gh pr diff "$PR_NUMBER" --name-only | grep '^modules/' | grep -v '^modules/\(po\|.*\/news\)/' || true)
|
||||
echo "Changed files:"
|
||||
echo "$CHANGED_FILES"
|
||||
echo "changed_files<<EOF" >> "$GITHUB_OUTPUT"
|
||||
echo "$CHANGED_FILES" >> "$GITHUB_OUTPUT"
|
||||
echo "EOF" >> "$GITHUB_OUTPUT"
|
||||
- name: Extract Maintainers
|
||||
id: extract-maintainers
|
||||
env:
|
||||
CHANGED_FILES: ${{ steps.changed-files.outputs.changed_files }}
|
||||
PR_AUTHOR: ${{ github.event.pull_request.user.login }}
|
||||
run: |
|
||||
echo "Extracting maintainers from changed files..."
|
||||
MAINTAINERS=$(lib/python/extract-maintainers.py \
|
||||
--changed-files "$CHANGED_FILES" \
|
||||
--pr-author "$PR_AUTHOR")
|
||||
echo "maintainers=$MAINTAINERS" >> "$GITHUB_OUTPUT"
|
||||
echo "Found maintainers: $MAINTAINERS"
|
||||
- name: Manage Reviewers
|
||||
env:
|
||||
GH_TOKEN: ${{ steps.app-token.outputs.token || secrets.GITHUB_TOKEN }}
|
||||
OWNER: ${{ github.repository_owner }}
|
||||
REPO: ${{ github.event.repository.name }}
|
||||
PR_NUMBER: ${{ github.event.pull_request.number }}
|
||||
PR_AUTHOR: ${{ github.event.pull_request.user.login }}
|
||||
MAINTAINERS: ${{ steps.extract-maintainers.outputs.maintainers }}
|
||||
CHANGED_FILES: ${{ steps.changed-files.outputs.changed_files }}
|
||||
BOT_NAME: ${{ steps.app-token.outputs.app-slug || 'github-actions' }}
|
||||
run: |
|
||||
./lib/python/manage-reviewers.py \
|
||||
--owner "$OWNER" \
|
||||
--repo "$REPO" \
|
||||
--pr-number "$PR_NUMBER" \
|
||||
--pr-author "$PR_AUTHOR" \
|
||||
--current-maintainers "$MAINTAINERS" \
|
||||
--changed-files "$CHANGED_FILES" \
|
||||
--bot-user-name "$BOT_NAME"
|
||||
@@ -1,128 +0,0 @@
|
||||
name: Test
|
||||
on:
|
||||
pull_request:
|
||||
schedule:
|
||||
- cron: "30 2 * * *"
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.event_name == 'pull_request' && github.head_ref || github.run_id }}
|
||||
cancel-in-progress: true
|
||||
permissions: {}
|
||||
jobs:
|
||||
changes:
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 5
|
||||
outputs:
|
||||
docs: ${{ steps.changes.outputs.docs }}
|
||||
format: ${{ steps.changes.outputs.format }}
|
||||
hm: ${{ steps.changes.outputs.hm }}
|
||||
parse: ${{ steps.changes.outputs.parse }}
|
||||
tests: ${{ steps.changes.outputs.tests }}
|
||||
steps:
|
||||
- uses: actions/checkout@v7
|
||||
- uses: dorny/paths-filter@v4
|
||||
id: changes
|
||||
with:
|
||||
filters: |
|
||||
tests:
|
||||
- 'flake.lock'
|
||||
- 'flake.nix'
|
||||
- 'modules/**'
|
||||
- 'nix-darwin/**'
|
||||
- 'nixos/**'
|
||||
- 'tests/**'
|
||||
docs:
|
||||
- '**.md'
|
||||
- 'docs/**'
|
||||
- 'flake.lock'
|
||||
- 'flake.nix'
|
||||
- 'modules/**'
|
||||
format:
|
||||
- '**/*.nix'
|
||||
hm:
|
||||
- 'flake.lock'
|
||||
- 'flake.nix'
|
||||
- 'home-manager/**'
|
||||
parse:
|
||||
- '**/*.nix'
|
||||
- 'flake.lock'
|
||||
tests:
|
||||
needs: changes
|
||||
timeout-minutes: 15
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os: [ubuntu-latest, macos-latest]
|
||||
runs-on: ${{ matrix.os }}
|
||||
steps:
|
||||
- uses: actions/checkout@v7
|
||||
- name: Get Nixpkgs revision from flake.lock
|
||||
id: get-nixpkgs
|
||||
run: |
|
||||
echo "rev=$(jq -r '.nodes.nixpkgs.locked.rev' flake.lock)" >> "$GITHUB_OUTPUT"
|
||||
- uses: cachix/install-nix-action@v31
|
||||
if: github.event_name == 'schedule' || needs.changes.outputs.docs == 'true' || needs.changes.outputs.tests == 'true' || needs.changes.outputs.hm == 'true' || needs.changes.outputs.parse == 'true' || needs.changes.outputs.format == 'true'
|
||||
with:
|
||||
nix_path: nixpkgs=https://github.com/NixOS/nixpkgs/archive/${{ steps.get-nixpkgs.outputs.rev }}.tar.gz
|
||||
extra_nix_config: |
|
||||
sandbox = true
|
||||
- name: Build docs
|
||||
if: github.event_name == 'schedule' || needs.changes.outputs.docs == 'true'
|
||||
run: nix build --show-trace .#docs-jsonModuleMaintainers
|
||||
- name: Parse Nix files with nix and Lix
|
||||
if: >-
|
||||
matrix.os == 'ubuntu-latest' &&
|
||||
(github.event_name == 'schedule' || needs.changes.outputs.parse == 'true')
|
||||
run: nix build --show-trace --keep-going .#ci-parse .#ci-parse-lix
|
||||
- name: Format Check
|
||||
if: >-
|
||||
matrix.os == 'ubuntu-latest' &&
|
||||
(github.event_name == 'schedule' || needs.changes.outputs.format == 'true')
|
||||
run: nix fmt -- --ci
|
||||
- name: Test init --switch with locked inputs
|
||||
if: github.event_name == 'schedule' || needs.changes.outputs.hm == 'true'
|
||||
run: |
|
||||
# Copy lock file to home directory for consistent testing
|
||||
mkdir -p ~/.config/home-manager
|
||||
cp flake.lock ~/.config/home-manager/
|
||||
nix run .#home-manager -- init --switch --override-input home-manager .
|
||||
- name: Uninstall
|
||||
if: github.event_name == 'schedule' || needs.changes.outputs.hm == 'true'
|
||||
run: yes | nix run . -- uninstall
|
||||
- name: Generate Job Summary
|
||||
if: github.event_name == 'pull_request'
|
||||
shell: bash
|
||||
run: |
|
||||
echo "### Test Job Summary" >> "$GITHUB_STEP_SUMMARY"
|
||||
echo "" >> "$GITHUB_STEP_SUMMARY"
|
||||
echo "A summary of tasks triggered by file changes in this PR:" >> "$GITHUB_STEP_SUMMARY"
|
||||
echo "" >> "$GITHUB_STEP_SUMMARY"
|
||||
|
||||
if [[ "${{ needs.changes.outputs.docs }}" == "true" ]]; then
|
||||
echo "- ✅ **Docs Build:** Triggered" >> "$GITHUB_STEP_SUMMARY"
|
||||
else
|
||||
echo "- ☑️ **Docs Build:** Skipped (no relevant files changed)" >> "$GITHUB_STEP_SUMMARY"
|
||||
fi
|
||||
|
||||
if [[ "${{ needs.changes.outputs.format }}" == "true" ]]; then
|
||||
echo "- ✅ **Format Check:** Triggered" >> "$GITHUB_STEP_SUMMARY"
|
||||
else
|
||||
echo "- ☑️ **Format Check:** Skipped (no relevant files changed)" >> "$GITHUB_STEP_SUMMARY"
|
||||
fi
|
||||
|
||||
if [[ "${{ needs.changes.outputs.parse }}" == "true" ]]; then
|
||||
echo "- ✅ **Nix Parse (nix + Lix):** Triggered" >> "$GITHUB_STEP_SUMMARY"
|
||||
else
|
||||
echo "- ☑️ **Nix Parse (nix + Lix):** Skipped (no relevant files changed)" >> "$GITHUB_STEP_SUMMARY"
|
||||
fi
|
||||
|
||||
if [[ "${{ needs.changes.outputs.hm }}" == "true" ]]; then
|
||||
echo "- ✅ **Home Manager Tests:** Triggered" >> "$GITHUB_STEP_SUMMARY"
|
||||
else
|
||||
echo "- ☑️ **Home Manager Tests:** Skipped (no relevant files changed)" >> "$GITHUB_STEP_SUMMARY"
|
||||
fi
|
||||
|
||||
if [[ "${{ needs.changes.outputs.tests }}" == "true" ]]; then
|
||||
echo "- ✅ **General Tests:** Triggered" >> "$GITHUB_STEP_SUMMARY"
|
||||
else
|
||||
echo "- ☑️ **General Tests:** Skipped (no relevant files changed)" >> "$GITHUB_STEP_SUMMARY"
|
||||
fi
|
||||
@@ -1,286 +0,0 @@
|
||||
name: Update maintainers list
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
paths:
|
||||
- lib/maintainers.nix
|
||||
schedule:
|
||||
# Update every Monday at 9 AM UTC
|
||||
- cron: "0 9 * * 1"
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
create_pr:
|
||||
description: "Create PR even if no changes"
|
||||
required: false
|
||||
default: false
|
||||
type: boolean
|
||||
jobs:
|
||||
update-maintainers:
|
||||
runs-on: ubuntu-latest
|
||||
if: github.repository_owner == 'nix-community' || github.event_name == 'workflow_dispatch'
|
||||
permissions:
|
||||
contents: write
|
||||
pull-requests: write
|
||||
issues: write
|
||||
env:
|
||||
pr_branch: update/maintainers-${{ github.ref_name }}
|
||||
steps:
|
||||
- name: Create GitHub App token
|
||||
uses: actions/create-github-app-token@v3
|
||||
if: vars.CI_APP_ID
|
||||
id: app-token
|
||||
with:
|
||||
app-id: ${{ vars.CI_APP_ID }}
|
||||
private-key: ${{ secrets.CI_APP_PRIVATE_KEY }}
|
||||
- name: Get GitHub App user info
|
||||
id: user-info
|
||||
if: vars.CI_APP_ID
|
||||
env:
|
||||
GH_TOKEN: ${{ steps.app-token.outputs.token }}
|
||||
slug: ${{ steps.app-token.outputs.app-slug }}
|
||||
run: |
|
||||
name="$slug[bot]"
|
||||
id=$(gh api "/users/$name" --jq .id)
|
||||
{
|
||||
echo "id=$id"
|
||||
echo "name=$name"
|
||||
echo "email=$id+$name@users.noreply.github.com"
|
||||
} >> "$GITHUB_OUTPUT"
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v7
|
||||
with:
|
||||
token: ${{ steps.app-token.outputs.token || github.token }}
|
||||
- name: Get Nixpkgs revision from flake.lock
|
||||
id: get-nixpkgs
|
||||
run: |
|
||||
echo "rev=$(jq -r '.nodes.nixpkgs.locked.rev' flake.lock)" >> "$GITHUB_OUTPUT"
|
||||
- name: Install Nix
|
||||
uses: cachix/install-nix-action@v31
|
||||
with:
|
||||
nix_path: nixpkgs=https://github.com/NixOS/nixpkgs/archive/${{ steps.get-nixpkgs.outputs.rev }}.tar.gz
|
||||
- name: Setup Git
|
||||
env:
|
||||
name: ${{ steps.user-info.outputs.name || 'github-actions[bot]' }}
|
||||
email: ${{ steps.user-info.outputs.email || '41898282+github-actions[bot]@users.noreply.github.com' }}
|
||||
run: |
|
||||
git config user.name "$name"
|
||||
git config user.email "$email"
|
||||
- name: Save old maintainers
|
||||
id: old-maintainers
|
||||
run: |
|
||||
echo "📄 Saving old maintainers file for comparison..."
|
||||
echo "old_maintainers=$(nix eval --file all-maintainers.nix --apply 'builtins.attrNames' --json 2>/dev/null || echo '[]')" >> "$GITHUB_OUTPUT"
|
||||
- name: Generate updated maintainers list
|
||||
run: |
|
||||
echo "::group::📋 Generating updated generated/all-maintainers.nix..."
|
||||
./lib/python/generate-all-maintainers.py
|
||||
echo "::endgroup::"
|
||||
echo "::group::🎨 Formatting with nixfmt..."
|
||||
nix fmt all-maintainers.nix
|
||||
echo "::endgroup::"
|
||||
- name: Check for changes and compare maintainers
|
||||
id: check-changes
|
||||
env:
|
||||
old_maintainers: ${{ steps.old-maintainers.outputs.old_maintainers }}
|
||||
run: |
|
||||
if git diff --quiet all-maintainers.nix; then
|
||||
echo "No changes to all-maintainers.nix"
|
||||
echo "has_changes=false" >> "$GITHUB_OUTPUT"
|
||||
echo "maintainer_changes=No changes detected" >> "$GITHUB_OUTPUT"
|
||||
else
|
||||
echo "Changes detected in all-maintainers.nix"
|
||||
echo "has_changes=true" >> "$GITHUB_OUTPUT"
|
||||
# Get change statistics
|
||||
added=$(git diff --numstat all-maintainers.nix | cut -f1)
|
||||
removed=$(git diff --numstat all-maintainers.nix | cut -f2)
|
||||
echo "changes_summary=+$added -$removed lines" >> "$GITHUB_OUTPUT"
|
||||
|
||||
# Compare old and new maintainers using nix eval
|
||||
echo "🔍 Comparing maintainers..."
|
||||
|
||||
# Extract maintainer names from new file
|
||||
new_maintainers=$(nix eval --file all-maintainers.nix --apply 'builtins.attrNames' --json)
|
||||
|
||||
# Compare using nix eval
|
||||
comparison=$(nix eval --expr "
|
||||
let
|
||||
old = builtins.fromJSON ''$old_maintainers'';
|
||||
new = builtins.fromJSON ''$new_maintainers'';
|
||||
oldSet = builtins.listToAttrs (map (name: { name = name; value = true; }) old);
|
||||
newSet = builtins.listToAttrs (map (name: { name = name; value = true; }) new);
|
||||
added = builtins.filter (name: !(oldSet ? \${name})) new;
|
||||
removed = builtins.filter (name: !(newSet ? \${name})) old;
|
||||
in {
|
||||
added = added;
|
||||
removed = removed;
|
||||
total_old = builtins.length old;
|
||||
total_new = builtins.length new;
|
||||
}
|
||||
" --json)
|
||||
|
||||
# Format comparison output
|
||||
added_count=$(echo "$comparison" | jq '.added | length')
|
||||
removed_count=$(echo "$comparison" | jq '.removed | length')
|
||||
total_old=$(echo "$comparison" | jq '.total_old')
|
||||
total_new=$(echo "$comparison" | jq '.total_new')
|
||||
|
||||
maintainer_summary="**Added:** $added_count maintainers"
|
||||
maintainer_summary="$maintainer_summary\n**Removed:** $removed_count maintainers"
|
||||
maintainer_summary="$maintainer_summary\n**Total:** $total_old → $total_new maintainers"
|
||||
|
||||
if [ "$added_count" -gt 0 ]; then
|
||||
added_names=$(echo "$comparison" | jq -r '.added | join(", ")')
|
||||
maintainer_summary="$maintainer_summary\n\n**✅ Added:** $added_names"
|
||||
fi
|
||||
|
||||
if [ "$removed_count" -gt 0 ]; then
|
||||
removed_names=$(echo "$comparison" | jq -r '.removed | join(", ")')
|
||||
maintainer_summary="$maintainer_summary\n\n**❌ Removed:** $removed_names"
|
||||
fi
|
||||
|
||||
echo "maintainer_changes<<EOF" >> "$GITHUB_OUTPUT"
|
||||
echo -e "$maintainer_summary" >> "$GITHUB_OUTPUT"
|
||||
echo "EOF" >> "$GITHUB_OUTPUT"
|
||||
fi
|
||||
- name: Validate generated file
|
||||
if: steps.check-changes.outputs.has_changes == 'true'
|
||||
run: |
|
||||
echo "🔍 Validating generated all-maintainers.nix..."
|
||||
if nix-instantiate --eval ./all-maintainers.nix --strict > /dev/null; then
|
||||
echo "✅ Generated file has valid Nix syntax"
|
||||
else
|
||||
echo "❌ Generated file has invalid Nix syntax"
|
||||
exit 1
|
||||
fi
|
||||
- name: Create update branch
|
||||
run: |
|
||||
git branch -D "$pr_branch" || echo "Nothing to delete"
|
||||
git switch -c "$pr_branch"
|
||||
- name: Get info on the current PR
|
||||
id: open_pr_info
|
||||
env:
|
||||
GH_TOKEN: ${{ steps.app-token.outputs.token || github.token }}
|
||||
run: |
|
||||
# Query for info about the already open update PR
|
||||
info=$(
|
||||
gh api graphql -F owner='{owner}' -F repo='{repo}' -F branch="$pr_branch" -f query='
|
||||
query($owner:String!, $repo:String!, $branch:String!) {
|
||||
repository(owner: $owner, name: $repo) {
|
||||
pullRequests(first: 1, states: OPEN, headRefName: $branch) {
|
||||
nodes {
|
||||
number
|
||||
url
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
' | jq --raw-output '
|
||||
.data.repository.pullRequests.nodes[]
|
||||
| to_entries[]
|
||||
| "\(.key)=\(.value)"
|
||||
'
|
||||
)
|
||||
if [[ -n "$info" ]]; then
|
||||
echo "PR info:"
|
||||
echo "$info"
|
||||
echo "$info" >> "$GITHUB_OUTPUT"
|
||||
else
|
||||
echo "No PR is currently open"
|
||||
fi
|
||||
- name: Fetch current PR's branch
|
||||
if: steps.open_pr_info.outputs.number
|
||||
run: |
|
||||
git fetch origin "$pr_branch"
|
||||
git branch --set-upstream-to "origin/$pr_branch"
|
||||
- name: Create Pull Request
|
||||
id: create-pr
|
||||
if: steps.check-changes.outputs.has_changes == 'true' || github.event.inputs.create_pr == 'true'
|
||||
env:
|
||||
GH_TOKEN: ${{ steps.app-token.outputs.token || github.token }}
|
||||
title: "maintainers: update all-maintainers.nix"
|
||||
commit_body: |
|
||||
Automated update of the master maintainers list combining:
|
||||
- Home Manager specific maintainers from modules/lib/maintainers.nix
|
||||
- Nixpkgs maintainers referenced in Home Manager modules
|
||||
|
||||
${{ steps.check-changes.outputs.maintainer_changes }}
|
||||
|
||||
Generated by: lib/python/generate-all-maintainers.py
|
||||
pr_url: ${{ steps.open_pr_info.outputs.url }}
|
||||
pr_num: ${{ steps.open_pr_info.outputs.number }}
|
||||
pr_body: |
|
||||
## 📋 Summary
|
||||
|
||||
This PR updates the master maintainers list (`all-maintainers.nix`) which combines:
|
||||
- **Home Manager specific maintainers** from `modules/lib/maintainers.nix`
|
||||
- **Nixpkgs maintainers** referenced in Home Manager modules
|
||||
|
||||
## 🔄 Changes
|
||||
|
||||
**Statistics:** ${{ steps.check-changes.outputs.changes_summary || 'No content changes (format/comment updates only)' }}
|
||||
|
||||
${{ steps.check-changes.outputs.maintainer_changes }}
|
||||
|
||||
The updated list includes all maintainers needed for review assignments across the Home Manager project.
|
||||
|
||||
## 🤖 Automation
|
||||
|
||||
- **Generated by:** `lib/python/generate-all-maintainers.py`
|
||||
- **Trigger:** ${{ github.event_name == 'schedule' && 'Scheduled weekly update' || 'Manual workflow dispatch' }}
|
||||
- **Validation:** File syntax verified with `nix eval`
|
||||
|
||||
---
|
||||
🤖 *This PR was automatically created by the [update-maintainers workflow](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }})*
|
||||
run: |
|
||||
# Commit the changes
|
||||
git add all-maintainers.nix
|
||||
git commit -m "$title" -m "$commit_body"
|
||||
|
||||
echo "Pushing to remote branch $pr_branch"
|
||||
git push --force --set-upstream origin "$pr_branch"
|
||||
|
||||
if [ -z "$pr_num" ]; then
|
||||
echo "Creating new pull request."
|
||||
PR_URL=$(
|
||||
gh pr create \
|
||||
--title "$title" \
|
||||
--body "$pr_body"
|
||||
)
|
||||
else
|
||||
PR_URL=$pr_url
|
||||
echo "Pull request already exists: $PR_URL"
|
||||
gh pr edit "$pr_num" --body "$pr_body"
|
||||
fi
|
||||
|
||||
echo "pr_url=$PR_URL" >> "$GITHUB_OUTPUT"
|
||||
- name: Summary
|
||||
env:
|
||||
has_changes: ${{ steps.check-changes.outputs.has_changes }}
|
||||
changes: ${{ steps.check-changes.outputs.changes_summary }}
|
||||
pr_url: ${{ steps.create-pr.outputs.pr_url}}
|
||||
pr_num: ${{ steps.open_pr_info.outputs.number }}
|
||||
run: |
|
||||
if [[ "$has_changes" == "true" ]]; then
|
||||
if [[ -n "$pr_num" ]]; then
|
||||
echo "✅ Successfully updated PR with new changes."
|
||||
echo "$changes"
|
||||
echo "🔗 PR URL: $pr_url"
|
||||
echo "### ✅ PR Updated" >> "$GITHUB_STEP_SUMMARY"
|
||||
echo "[$pr_url]($pr_url)" >> "$GITHUB_STEP_SUMMARY"
|
||||
elif [[ -n "$pr_url" ]]; then
|
||||
echo "✅ Successfully created PR with maintainer updates."
|
||||
echo "$changes"
|
||||
echo "🔗 PR URL: $pr_url"
|
||||
echo "### ✅ PR Created" >> "$GITHUB_STEP_SUMMARY"
|
||||
echo "[$pr_url]($pr_url)" >> "$GITHUB_STEP_SUMMARY"
|
||||
else
|
||||
echo "❌ Failed to create or update pull request."
|
||||
echo "### ❌ PR Operation Failed" >> "$GITHUB_STEP_SUMMARY"
|
||||
echo "A pull request was intended but the URL was not captured. Please check the logs." >> "$GITHUB_STEP_SUMMARY"
|
||||
fi
|
||||
else
|
||||
echo "ℹ️ No changes detected - maintainers list is up to date."
|
||||
echo "### ℹ️ No Changes" >> "$GITHUB_STEP_SUMMARY"
|
||||
echo "The maintainers list is up-to-date. No PR was created." >> "$GITHUB_STEP_SUMMARY"
|
||||
fi
|
||||
@@ -1,52 +0,0 @@
|
||||
name: Validate maintainers.nix
|
||||
on:
|
||||
pull_request:
|
||||
paths:
|
||||
- "modules/lib/maintainers.nix"
|
||||
- "flake.lock"
|
||||
- "all-maintainers.nix"
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
run_tests:
|
||||
description: 'Run validation tests'
|
||||
required: false
|
||||
default: true
|
||||
type: boolean
|
||||
jobs:
|
||||
validate-maintainers:
|
||||
runs-on: ubuntu-latest
|
||||
if: github.repository_owner == 'nix-community'
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v7
|
||||
- name: Get Nixpkgs revision from flake.lock
|
||||
id: get-nixpkgs
|
||||
run: |
|
||||
echo "rev=$(jq -r '.nodes.nixpkgs.locked.rev' flake.lock)" >> "$GITHUB_OUTPUT"
|
||||
- name: Install Nix
|
||||
uses: cachix/install-nix-action@v31
|
||||
with:
|
||||
nix_path: nixpkgs=https://github.com/NixOS/nixpkgs/archive/${{ steps.get-nixpkgs.outputs.rev }}.tar.gz
|
||||
- name: Validate Nix syntax
|
||||
run: ./lib/python/validate-maintainers-syntax.py
|
||||
- name: Validate maintainer entries
|
||||
run: ./lib/python/validate-maintainer-entries.py
|
||||
- name: Check for duplicate maintainers
|
||||
run: ./lib/python/check-duplicate-maintainers.py
|
||||
- name: Test generation
|
||||
if: inputs.run_tests == true
|
||||
run: |
|
||||
echo "🔍 Testing all-maintainers.nix generation..."
|
||||
./lib/python/generate-all-maintainers.py
|
||||
|
||||
echo "🔍 Validating generated file..."
|
||||
if nix eval --file ./all-maintainers.nix --json > /dev/null; then
|
||||
echo "✅ Generated file has valid Nix syntax"
|
||||
else
|
||||
echo "❌ Generated file has invalid Nix syntax"
|
||||
exit 1
|
||||
fi
|
||||
- name: Summary
|
||||
run: |
|
||||
echo "✅ All validation checks passed!"
|
||||
echo "📋 The maintainers.nix file is ready for merge"
|
||||
@@ -1,3 +1 @@
|
||||
/result*
|
||||
/tests/flake.lock
|
||||
.DS_Store
|
||||
|
||||
+25
-8
@@ -1,20 +1,37 @@
|
||||
image: nixos/nix:latest
|
||||
|
||||
variables:
|
||||
NIX_PATH: "nixpkgs=channel:nixos-unstable"
|
||||
|
||||
stages:
|
||||
- test
|
||||
- deploy
|
||||
|
||||
Run tests:
|
||||
stage: test
|
||||
script:
|
||||
- nix-shell tests -A run.files-text
|
||||
only:
|
||||
- release-19.09
|
||||
|
||||
pages:
|
||||
stage: deploy
|
||||
script:
|
||||
- nix-build -A docs.html
|
||||
- mkdir -p ~/.config/nixpkgs
|
||||
- echo '{ manual.html.enable = true; }' > ~/.config/nixpkgs/home.nix
|
||||
- nix-shell . -A install
|
||||
- mkdir public
|
||||
- cp -r ./result/share/doc/home-manager/* public/
|
||||
- cp -r ~/.nix-profile/share/doc/home-manager/* public/
|
||||
artifacts:
|
||||
paths:
|
||||
- public
|
||||
rules:
|
||||
- if: $CI_COMMIT_BRANCH == "master"
|
||||
when: always
|
||||
only:
|
||||
- master
|
||||
|
||||
Deploy NUR:
|
||||
stage: deploy
|
||||
variables:
|
||||
HM_BRANCH: $CI_COMMIT_REF_NAME
|
||||
HM_COMMIT_SHA: $CI_COMMIT_SHA
|
||||
trigger:
|
||||
project: rycee/nur-expressions
|
||||
branch: master
|
||||
only:
|
||||
- release-19.09
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
Noah Biewesch <dev@noahbiewesch.com> <90870942+trueNAHO@users.noreply.github.com>
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
language: nix
|
||||
|
||||
os:
|
||||
- linux
|
||||
- osx
|
||||
|
||||
before_script:
|
||||
- mkdir -m 0755 -p /nix/var/nix/{profiles,gcroots}/per-user/$USER
|
||||
|
||||
script:
|
||||
- nix-shell . -A install
|
||||
- nix-shell tests -A run.all
|
||||
+158
-5
@@ -1,8 +1,161 @@
|
||||
# Contributing
|
||||
Contributing
|
||||
============
|
||||
|
||||
Home Manager contribution guidelines live in the manual:
|
||||
Thanks for wanting to contribute to Home Manager! These are some
|
||||
guidelines to make the process as smooth as possible for both you and
|
||||
the Home Manager developers.
|
||||
|
||||
- [`docs/manual/contributing.md`](docs/manual/contributing.md)
|
||||
- <https://nix-community.github.io/home-manager/#ch-contributing>
|
||||
If you are only looking to report a problem then it is sufficient to
|
||||
read through the following section on reporting issues. If you instead
|
||||
want to directly contribute improvements and additions then please
|
||||
have a look at everything here.
|
||||
|
||||
Read those docs before changing modules, tests, news entries, or release notes.
|
||||
Reporting an issue
|
||||
------------------
|
||||
|
||||
If you notice a problem with Home Manager and want to report it then
|
||||
have a look among the already [open issues][], if you find one
|
||||
matching yours then feel free to comment on it to add any additional
|
||||
information you may have.
|
||||
|
||||
If no matching issue exists then go to the [new issue][] page and
|
||||
write a description of your problem. Include as much information as
|
||||
you can, ideally also include relevant excerpts from your Home Manager
|
||||
configuration.
|
||||
|
||||
Contributing code
|
||||
-----------------
|
||||
|
||||
If you want to contribute code to improve Home Manager then please
|
||||
follow these guidelines.
|
||||
|
||||
### Fork and create a pull request ###
|
||||
|
||||
If you have not previously forked Home Manager then you need to do
|
||||
that first. Have a look at GitHub's "[Fork A Repo][]" for instructions
|
||||
on how to do this.
|
||||
|
||||
Once you have a fork of Home Manager you should create a branch
|
||||
starting at the most recent `master`. Give your branch a reasonably
|
||||
descriptive name. Perform your changes on this branch and when you are
|
||||
happy with the result push the branch to GitHub and
|
||||
[create a pull request][].
|
||||
|
||||
Assuming your clone is at `$HOME/devel/home-manager` then you can make
|
||||
the `home-manager` command use it by either
|
||||
|
||||
1. overriding the default path by using the `-I` command line option:
|
||||
|
||||
home-manager -I home-manager=$HOME/devel/home-manager
|
||||
|
||||
or
|
||||
|
||||
2. changing the default path by ensuring your configuration includes
|
||||
|
||||
programs.home-manager.enable = true;
|
||||
programs.home-manager.path = "$HOME/devel/home-manager";
|
||||
|
||||
and running `home-manager switch` to activate the change.
|
||||
Afterwards, `home-manager build` and `home-manager switch` will
|
||||
use your cloned repository.
|
||||
|
||||
The first option is good if you only temporarily want to use your
|
||||
clone.
|
||||
|
||||
### Commits ###
|
||||
|
||||
The commits in your pull request should be reasonably self-contained,
|
||||
that is, each commit should make sense in isolation. In particular,
|
||||
you will be asked to amend any commit that introduces syntax errors or
|
||||
similar problems even if they are fixed in a later commit.
|
||||
|
||||
The commit messages should follow the format
|
||||
|
||||
{component}: {description}
|
||||
|
||||
{long description}
|
||||
|
||||
where `{component}` refers to the code component (or module) your
|
||||
change affects, `{description}` is a brief description of your change,
|
||||
and `{long description}` is an optional clarifying description. Note,
|
||||
`{description}` should start with a lower case letter. As a rare
|
||||
exception, if there is no clear component, or your change affects many
|
||||
components, then the `{component}` part is optional.
|
||||
|
||||
When adding a new module, say `foo.nix`, we use the fixed commit
|
||||
format `foo: add module`. You can, of course, still include a long
|
||||
description if you wish.
|
||||
|
||||
In addition to the above commit message guidelines, try to follow the
|
||||
[seven rules][] as much as possible.
|
||||
|
||||
### Style guidelines ###
|
||||
|
||||
The code in Home Manager should follow the [Nixpkgs syntax
|
||||
guidelines][]. Note, we prefer `lowerCamelCase` for variable and
|
||||
attribute names with the accepted exception of variables directly
|
||||
referencing packages in Nixpkgs which use a hyphenated style. For
|
||||
example, the Home Manager option `services.gpg-agent.enableSshSupport`
|
||||
references the `gpg-agent` package in Nixpkgs.
|
||||
|
||||
### News ###
|
||||
|
||||
Home Manager includes a system for presenting news to the user. When
|
||||
making a change you, therefore, have the option to also include an
|
||||
associated news entry. In general, a news entry should only be added
|
||||
for truly noteworthy news. For example, a bug fix or new option does
|
||||
generally not need a news entry.
|
||||
|
||||
If you do have a change worthy of a news entry then please add one in
|
||||
[`news.nix`][] but you should follow some basic guidelines:
|
||||
|
||||
- The entry timestamp should be in ISO-8601 format having "+00:00" as
|
||||
time zone. For example, "2017-09-13T17:10:14+00:00". A suitable
|
||||
timestamp can be produced by the command
|
||||
|
||||
date --iso-8601=second --universal
|
||||
|
||||
- The entry condition should be as specific as possible. For example,
|
||||
if you are changing or deprecating a specific option then you could
|
||||
restrict the news to those users who actually use this option.
|
||||
|
||||
- Wrap the news message so that it will fit in the typical terminal,
|
||||
that is, at most 80 characters wide. Ideally a bit less.
|
||||
|
||||
- Unlike commit messages, news will be read without any connection to
|
||||
the Home Manager source code. It is therefore important to make the
|
||||
message understandable in isolation and to those who do not have
|
||||
knowledge of the Home Manager internals. To this end it should be
|
||||
written in more descriptive, prose like way.
|
||||
|
||||
- If you refer to an option then write its full attribute path. That
|
||||
is, instead of writing
|
||||
|
||||
> The option 'foo' has been deprecated, please use 'bar' instead.
|
||||
|
||||
it should read
|
||||
|
||||
> The option 'services.myservice.foo' has been deprecated, please
|
||||
> use 'services.myservice.bar' instead.
|
||||
|
||||
- A new module, say `foo.nix`, should always include a news entry
|
||||
that has a message along the lines of
|
||||
|
||||
> A new module is available: 'services.foo'.
|
||||
|
||||
If the module is platform specific, e.g., a service module using
|
||||
systemd, then a condition like
|
||||
|
||||
```
|
||||
condition = hostPlatform.isLinux;
|
||||
```
|
||||
|
||||
should be added.
|
||||
|
||||
[open issues]: https://github.com/rycee/home-manager/issues
|
||||
[new issue]: https://github.com/rycee/home-manager/issues/new
|
||||
[Fork A Repo]: https://help.github.com/articles/fork-a-repo/
|
||||
[create a pull request]: https://help.github.com/articles/creating-a-pull-request/
|
||||
[seven rules]: https://chris.beams.io/posts/git-commit/#seven-rules
|
||||
[`news.nix`]: https://github.com/rycee/home-manager/blob/master/modules/misc/news.nix
|
||||
[Nixpkgs syntax guidelines]: https://nixos.org/nixpkgs/manual/#sec-syntax
|
||||
|
||||
@@ -0,0 +1,151 @@
|
||||
Frequently Asked Questions (FAQ)
|
||||
================================
|
||||
|
||||
Why is there a collision error when switching generation?
|
||||
---------------------------------------------------------
|
||||
|
||||
Home Manager currently installs packages into the user environment,
|
||||
precisely as if the packages were installed through
|
||||
`nix-env --install`. This means that you will get a collision error if
|
||||
your Home Manager configuration attempts to install a package that you
|
||||
already have installed manually, that is, packages that shows up when
|
||||
you run `nix-env --query`.
|
||||
|
||||
For example, imagine you have the `hello` package installed in your
|
||||
environment
|
||||
|
||||
```console
|
||||
$ nix-env --query
|
||||
hello-2.10
|
||||
```
|
||||
|
||||
and your Home Manager configuration contains
|
||||
|
||||
home.packages = [ pkgs.hello ];
|
||||
|
||||
Then attempting to switch to this configuration will result in an
|
||||
error similar to
|
||||
|
||||
```console
|
||||
$ home-manager switch
|
||||
these derivations will be built:
|
||||
/nix/store/xg69wsnd1rp8xgs9qfsjal017nf0ldhm-home-manager-path.drv
|
||||
[…]
|
||||
Activating installPackages
|
||||
replacing old ‘home-manager-path’
|
||||
installing ‘home-manager-path’
|
||||
building path(s) ‘/nix/store/b5c0asjz9f06l52l9812w6k39ifr49jj-user-environment’
|
||||
Wide character in die at /nix/store/64jc9gd2rkbgdb4yjx3nrgc91bpjj5ky-buildenv.pl line 79.
|
||||
collision between ‘/nix/store/fmwa4axzghz11cnln5absh31nbhs9lq1-home-manager-path/bin/hello’ and ‘/nix/store/c2wyl8b9p4afivpcz8jplc9kis8rj36d-hello-2.10/bin/hello’; use ‘nix-env --set-flag priority NUMBER PKGNAME’ to change the priority of one of the conflicting packages
|
||||
builder for ‘/nix/store/b37x3s7pzxbasfqhaca5dqbf3pjjw0ip-user-environment.drv’ failed with exit code 2
|
||||
error: build of ‘/nix/store/b37x3s7pzxbasfqhaca5dqbf3pjjw0ip-user-environment.drv’ failed
|
||||
```
|
||||
|
||||
The solution is typically to uninstall the package from the
|
||||
environment using `nix-env --uninstall` and reattempt the Home Manager
|
||||
generation switch.
|
||||
|
||||
Why are the session variables not set?
|
||||
--------------------------------------
|
||||
|
||||
Home Manager is only able to set session variables automatically if it
|
||||
manages your Bash or Z shell configuration. If you don't want to let
|
||||
Home Manager manage your shell then you will have to manually source
|
||||
the
|
||||
|
||||
~/.nix-profile/etc/profile.d/hm-session-vars.sh
|
||||
|
||||
file in an appropriate way. In Bash and Z shell this can be done by
|
||||
adding
|
||||
|
||||
```sh
|
||||
. "$HOME/.nix-profile/etc/profile.d/hm-session-vars.sh"
|
||||
```
|
||||
|
||||
to your `.profile` and `.zshrc` files, respectively. The
|
||||
`hm-session-vars.sh` file should work in most Bourne-like shells.
|
||||
|
||||
How do set up a configuration for multiple users/machines?
|
||||
----------------------------------------------------------
|
||||
|
||||
A typical way to prepare a repository of configurations for multiple
|
||||
logins and machines is to prepare one "top-level" file for each unique
|
||||
combination.
|
||||
|
||||
For example, if you have two machines, called "kronos" and "rhea" on
|
||||
which you want to configure your user "jane" then you could create the
|
||||
files
|
||||
|
||||
- `kronos-jane.nix`,
|
||||
- `rhea-jane.nix`, and
|
||||
- `common.nix`
|
||||
|
||||
in your repository. On the kronos and rhea machines you can then make
|
||||
`~jane/.config/nixpkgs/home.nix` be a symbolic link to the
|
||||
corresponding file in your configuration repository.
|
||||
|
||||
The `kronos-jane.nix` and `rhea-jane.nix` files follow the format
|
||||
|
||||
```nix
|
||||
{ ... }:
|
||||
|
||||
{
|
||||
imports = [ ./common.nix ];
|
||||
|
||||
# Various options that are specific for this machine/user.
|
||||
}
|
||||
```
|
||||
|
||||
while the `common.nix` file contains configuration shared across the
|
||||
two logins. Of course, instead of just a single `common.nix` file you
|
||||
can have multiple ones, even one per program or service.
|
||||
|
||||
You can get some inspiration from the [Post your home-manager home.nix
|
||||
file!][1] Reddit thread.
|
||||
|
||||
[1]: https://www.reddit.com/r/NixOS/comments/9bb9h9/post_your_homemanager_homenix_file/
|
||||
|
||||
Why do I get an error message about `ca.desrt.dconf`?
|
||||
-----------------------------------------------------
|
||||
|
||||
You are most likely trying to configure the GTK or Gnome Terminal but
|
||||
the DBus session is not aware of the dconf service. The full error you
|
||||
might get is
|
||||
|
||||
error: GDBus.Error:org.freedesktop.DBus.Error.ServiceUnknown: The name ca.desrt.dconf was not provided by any .service files
|
||||
|
||||
The solution on NixOS is to add
|
||||
|
||||
services.dbus.packages = with pkgs; [ gnome3.dconf ];
|
||||
|
||||
to your system configuration.
|
||||
|
||||
How do I install packages from Nixpkgs unstable?
|
||||
------------------------------------------------
|
||||
|
||||
If you are using a stable version of Nixpkgs but would like to install
|
||||
some particular packages from Nixpkgs unstable then you can import the
|
||||
unstable Nixpkgs and refer to its packages within your configuration.
|
||||
Something like
|
||||
|
||||
```nix
|
||||
{ pkgs, config, ... }:
|
||||
|
||||
let
|
||||
|
||||
pkgsUnstable = import <nixpkgs-unstable> {};
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
home.packages = [
|
||||
pkgsUnstable.foo
|
||||
];
|
||||
|
||||
# …
|
||||
}
|
||||
```
|
||||
|
||||
should work provided you have a Nix channel called `nixpkgs-unstable`.
|
||||
Note, the package will not be affected by any package overrides,
|
||||
overlays, etc.
|
||||
@@ -1,28 +0,0 @@
|
||||
# Common commands
|
||||
#
|
||||
# Contributing manual:
|
||||
# - https://nix-community.github.io/home-manager/#ch-contributing
|
||||
|
||||
# List tests matching a pattern `pattern`
|
||||
list *pattern:
|
||||
nix run .#tests -- -l {{pattern}}
|
||||
|
||||
# Run all tests matching a pattern `pattern`
|
||||
test *pattern:
|
||||
nix run .#tests -- {{pattern}}
|
||||
|
||||
# List integration tests
|
||||
list_integration_tests:
|
||||
nix run .#tests -- -t -l
|
||||
|
||||
# Run integration tests
|
||||
integration_tests:
|
||||
nix run .#tests -- -t integration-test-
|
||||
|
||||
# Create a news entry
|
||||
create-news-entry:
|
||||
modules/misc/news/create-news-entry.sh
|
||||
|
||||
# format codebase with treefmt
|
||||
format:
|
||||
treefmt
|
||||
@@ -1,6 +1,6 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2017-2026 Home Manager contributors
|
||||
Copyright (c) 2017-2019 Robert Helgesson and Home Manager contributors
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
||||
-255
@@ -1,255 +0,0 @@
|
||||
# Maintaining Home Manager
|
||||
|
||||
This file is intended as a reference for Home Manager's core maintainers,
|
||||
although it may be interesting for anyone curious how we do certain things.
|
||||
|
||||
## Releasing
|
||||
|
||||
Home Manager releases stable versions in sync with NixOS/nixpkgs. A _`YY.05`_
|
||||
version is released in May and a _`YY.11`_ version is released in November.
|
||||
|
||||
We do not need to wait for the release to come out of _"beta"_ before creating a
|
||||
branch, however we _should_ wait before updating links and references on the
|
||||
`master` branch.
|
||||
|
||||
Creating a stable branch may require temporarily disabling branch protection.
|
||||
This can only be done by an "admin" or "owner".
|
||||
|
||||
Once a stable branch is created, its flake inputs should be updated to point to
|
||||
the corresponding stable versions. The branch can be created before these exist,
|
||||
in which case they should be updated when the corresponding stable inputs become
|
||||
available.
|
||||
|
||||
Once a stable version is considered "out of beta", references to Home Manager's
|
||||
stable branch should be updated on the `master` branch to reference the new
|
||||
version.
|
||||
|
||||
### Release Workflow
|
||||
|
||||
The release process involves four phases in a specific order:
|
||||
|
||||
1. **On master - Mark current as stable**: Update all documentation and examples
|
||||
to reflect the current release (e.g., 25.11) as stable, removing "(unstable)"
|
||||
tags
|
||||
2. **Cut the release branch**: Create the new release branch from master (e.g.,
|
||||
`release-25.11`)
|
||||
3. **On release branch - Mark as release branch**: Set `isReleaseBranch: true`
|
||||
in `release.json`
|
||||
4. **On master - Prepare for next**: Bump version to next release (e.g., 26.05)
|
||||
and add "(unstable)" tag back
|
||||
|
||||
**Important**: The `isReleaseBranch` field in `release.json` is managed
|
||||
differently on each branch:
|
||||
|
||||
- On **master**: Always remains `false`
|
||||
- On **release branches**: Set to `true` in a separate commit after cutting the
|
||||
branch from master
|
||||
|
||||
This workflow ensures that the release branch captures a stable snapshot of
|
||||
master, which then moves forward to the next development cycle.
|
||||
|
||||
### Release Preparation Checklist
|
||||
|
||||
#### Step 1: On master - Mark Current as Stable
|
||||
|
||||
**When**: When ready to cut a new release branch (e.g., when preparing to
|
||||
release 25.11)
|
||||
|
||||
Reference commits:
|
||||
|
||||
- `e08e6e2389234000b0447e57abf61d8ccd59a68e` (home-manager: set 25.05 as stable)
|
||||
|
||||
1. **README.md**
|
||||
- Update example release branch references (e.g., `release-24.11` →
|
||||
`release-25.05`)
|
||||
- Update current stable version references (e.g., `24.11` → `25.05`)
|
||||
|
||||
2. **docs/manual/installation/nix-darwin.md**
|
||||
- Update channel version in example commands
|
||||
- Update `home.stateVersion` in examples
|
||||
|
||||
3. **docs/manual/installation/nixos.md**
|
||||
- Update channel version in example commands
|
||||
- Update tarball URLs
|
||||
- Update `home.stateVersion` in examples
|
||||
|
||||
4. **docs/manual/installation/standalone.md**
|
||||
- Update channel version in example commands
|
||||
|
||||
5. **docs/manual/manual.md**
|
||||
- Remove `(unstable)` suffix from version
|
||||
|
||||
6. **docs/manual/nix-flakes/standalone.md**
|
||||
- Update flake references (e.g., `home-manager/release-24.11` →
|
||||
`home-manager/release-25.05`)
|
||||
- Update `$branch` examples
|
||||
|
||||
7. **docs/manual/usage/configuration.md**
|
||||
- Update `home.stateVersion` in example configurations
|
||||
|
||||
8. **docs/release-notes/rl-YYMM.md**
|
||||
- Replace "This is the current unstable branch and the information in this
|
||||
section is therefore not final."
|
||||
- With: "The YY.MM release branch became stable in <Month>, YYYY."
|
||||
|
||||
9. **home-manager/home-manager** script
|
||||
- Update default `home.stateVersion` in generated configurations
|
||||
- Update `home.stateVersion` in uninstall function
|
||||
|
||||
10. **modules/misc/uninstall.nix**
|
||||
- Update `home.stateVersion` in uninstall config
|
||||
|
||||
**Note**: Do NOT change `isReleaseBranch` in `release.json` - keep it as `false`
|
||||
|
||||
#### Step 2: Cut the release branch
|
||||
|
||||
**When**: After Step 1 is merged to master
|
||||
|
||||
1. Create the new release branch from master
|
||||
- Example: `git checkout -b release-25.11 master`
|
||||
2. Push the branch to the repository
|
||||
|
||||
#### Step 3: On the release branch - Mark as Release Branch
|
||||
|
||||
**When**: Immediately after creating the release branch
|
||||
|
||||
Reference commits:
|
||||
|
||||
- `70a787cc5` (release: set release branch)
|
||||
|
||||
1. **release.json**
|
||||
- Change `isReleaseBranch` from `false` to `true`
|
||||
- Do NOT change the `release` field (it's already correct from Step 1)
|
||||
|
||||
2. **flake.nix**
|
||||
- Update the nixpkgs input to track the corresponding stable branch
|
||||
- Example: For `release-25.11`, change from:
|
||||
```nix
|
||||
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
|
||||
```
|
||||
to:
|
||||
```nix
|
||||
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.11";
|
||||
```
|
||||
- Run `nix flake update` to update flake.lock to the stable branch
|
||||
- Commit the flake.nix and flake.lock changes
|
||||
|
||||
**Note**: The release branch should track the stable NixOS release channel
|
||||
(e.g., `nixos-25.11`), while master continues to track `nixpkgs-unstable`.
|
||||
|
||||
#### Step 3.5: On master - Update CI for the New Release Branch
|
||||
|
||||
**When**: After marking the release branch as a release branch (Step 3)
|
||||
|
||||
**Where**: On the **master** branch (CI workflows run from master)
|
||||
|
||||
**What**: Update GitHub Actions workflows to include the new stable branch
|
||||
|
||||
1. **.github/workflows/update-flake.yml** (on master)
|
||||
- Replace the old stable branch with the new release branch in the matrix
|
||||
- Example: When creating `release-25.11`, update the matrix from:
|
||||
|
||||
```yaml
|
||||
strategy:
|
||||
matrix:
|
||||
branch: [master, release-25.05]
|
||||
```
|
||||
|
||||
to:
|
||||
|
||||
```yaml
|
||||
strategy:
|
||||
matrix:
|
||||
branch: [master, release-25.11]
|
||||
```
|
||||
|
||||
- This ensures automated flake.lock updates run on the current stable branch
|
||||
- Note: We only maintain CI for the latest stable release, not older releases
|
||||
|
||||
2. **.github/dependabot.yml** (on master)
|
||||
- Replace the old stable branch with the new release branch
|
||||
- Example: When creating `release-25.11`, update the target-branch from:
|
||||
|
||||
```yaml
|
||||
- package-ecosystem: "github-actions"
|
||||
directory: "/"
|
||||
target-branch: "release-25.05"
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
commit-message:
|
||||
prefix: "ci:"
|
||||
```
|
||||
|
||||
to:
|
||||
|
||||
```yaml
|
||||
- package-ecosystem: "github-actions"
|
||||
directory: "/"
|
||||
target-branch: "release-25.11"
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
commit-message:
|
||||
prefix: "ci:"
|
||||
```
|
||||
|
||||
- This ensures automated dependency updates for GitHub Actions on the current
|
||||
stable branch
|
||||
- Note: We only maintain dependabot for the latest stable release, not older
|
||||
releases
|
||||
|
||||
**Important**: CI workflows are executed from master, so this change must be
|
||||
committed to the master branch.
|
||||
|
||||
#### Step 4: On master - Prepare for Next Release
|
||||
|
||||
**When**: After cutting the release branch, prepare master for the next
|
||||
development cycle
|
||||
|
||||
Reference commits:
|
||||
|
||||
- `9a4a9f1d6e43fe4044f6715ae7cc85ccb1d2fe09` (home-manager: prepare 25.11)
|
||||
|
||||
1. **docs/release-notes/rl-YYMM.md** (CREATE NEW)
|
||||
- Create new release notes file for next version with unstable warning
|
||||
- Example: Create `rl-2605.md` when preparing for 26.05
|
||||
|
||||
2. **docs/manual/manual.md**
|
||||
- Update version to next release with `(unstable)` tag
|
||||
- Example: `25.11` → `26.05 (unstable)`
|
||||
|
||||
3. **docs/release-notes/release-notes.md**
|
||||
- Add new release notes file `rl-YYMM.md` at the top of the chapters list
|
||||
|
||||
4. **home-manager/home-manager** script
|
||||
- Update `--version` output to next version
|
||||
- Example: `echo 25.11-pre` → `echo 26.05-pre`
|
||||
|
||||
5. **modules/misc/version.nix**
|
||||
- Add new version string to `stateVersion` enum list
|
||||
- Example: Add `"26.05"` after `"25.11"`
|
||||
|
||||
6. **release.json**
|
||||
- Update `release` field to next version (e.g., `"25.11"` → `"26.05"`)
|
||||
- **IMPORTANT**: Keep `isReleaseBranch` as `false` on master
|
||||
|
||||
### Version State Changes
|
||||
|
||||
Each release may introduce state version changes that affect the default
|
||||
behavior of Home Manager for users who set `home.stateVersion` to that version.
|
||||
|
||||
State version changes should be documented in the release notes under a "State
|
||||
Version Changes" section, explaining what behavior changes for users who set
|
||||
their state version to the new release.
|
||||
|
||||
### Backporting
|
||||
|
||||
Stable branches get bug fixes and security updates, but usually not new modules
|
||||
or features. When backporting:
|
||||
|
||||
1. Use `git cherry-pick -x <commit>` to preserve the original commit reference
|
||||
2. Test that the backport builds successfully
|
||||
3. Consider whether the change might affect existing stable users
|
||||
4. Update the PR/commit message to indicate it's a backport
|
||||
|
||||
If a user needs a module backported, they should open an issue explaining the
|
||||
use case.
|
||||
@@ -1,21 +0,0 @@
|
||||
.PHONY: all all-tests test test-install format
|
||||
NIXPKGS_REV := nixpkgs-unstable
|
||||
NIX_PATH := nixpkgs=https://github.com/NixOS/nixpkgs/archive/${NIXPKGS_REV}.tar.gz
|
||||
|
||||
all: all-tests test-install
|
||||
|
||||
all-tests:
|
||||
$(MAKE) test TEST=all
|
||||
|
||||
test:
|
||||
ifndef TEST
|
||||
$(error Use 'make test TEST=<test_name>' to run desired test)
|
||||
endif
|
||||
nix-shell --pure tests -I ${NIX_PATH} -A run.${TEST}
|
||||
|
||||
test-install:
|
||||
HOME=$(shell mktemp -d) NIX_PATH=${NIX_PATH} nix-shell . -A install
|
||||
|
||||
format:
|
||||
# added 2026-03-01
|
||||
@echo "run \"nix-shell -A dev --run 'just format'\" instead"
|
||||
@@ -1,124 +1,314 @@
|
||||
Home Manager using Nix
|
||||
======================
|
||||
|
||||
This project provides a basic system for managing a user environment using the
|
||||
[Nix][] package manager together with the Nix libraries found in [Nixpkgs][]. It
|
||||
allows declarative configuration of user specific (non-global) packages and
|
||||
dotfiles.
|
||||
|
||||
Usage
|
||||
-----
|
||||
|
||||
Before attempting to use Home Manager please read [the warning
|
||||
below](#words-of-warning).
|
||||
|
||||
For a systematic overview of Home Manager and its available options, please see:
|
||||
|
||||
- [Home Manager manual][manual]
|
||||
- [Home Manager configuration options][configuration options]
|
||||
- [3rd party Home Manager option
|
||||
search](https://home-manager-options.extranix.com/)
|
||||
|
||||
If you would like to contribute to Home Manager, then please have a look at
|
||||
["Contributing" in the manual][contributing].
|
||||
|
||||
Releases
|
||||
--------
|
||||
|
||||
Home Manager is developed against the `nixpkgs-unstable` branch, which often
|
||||
causes it to contain tweaks for changes/packages not yet released in stable
|
||||
[NixOS][].
|
||||
To avoid breaking users' configurations, Home Manager is released in branches
|
||||
corresponding to NixOS releases (e.g. `release-26.05`). These branches get
|
||||
fixes, but usually not new modules. If you need a module to be backported, then
|
||||
feel free to open an issue.
|
||||
This project provides a basic system for managing a user environment
|
||||
using the [Nix][] package manager together with the Nix libraries
|
||||
found in [Nixpkgs][]. Before attempting to use Home Manager please
|
||||
read the warning below.
|
||||
|
||||
Words of warning
|
||||
----------------
|
||||
|
||||
Unfortunately, it is quite possible to get difficult to understand errors when
|
||||
working with Home Manager. You should therefore be comfortable using the [Nix][]
|
||||
language and the various tools in the Nix ecosystem.
|
||||
This project is under development. I personally use it to manage
|
||||
several user configurations but it may fail catastrophically for you.
|
||||
So beware!
|
||||
|
||||
If you are not very familiar with Nix but still want to use Home Manager then
|
||||
you are strongly encouraged to start with a small and very simple configuration
|
||||
and gradually make it more elaborate as you learn.
|
||||
In some cases Home Manager cannot detect whether it will overwrite a
|
||||
previous manual configuration. For example, the Gnome Terminal module
|
||||
will write to your dconf store and cannot tell whether a configuration
|
||||
that it is about to be overwrite was from a previous Home Manager
|
||||
generation or from manual configuration.
|
||||
|
||||
In some cases Home Manager cannot detect whether it will overwrite a previous
|
||||
manual configuration. For example, the Gnome Terminal module will write to your
|
||||
dconf store and cannot tell whether a configuration that is about to be
|
||||
overwritten was from a previous Home Manager generation or from manual
|
||||
configuration.
|
||||
Home Manager targets [NixOS][] unstable and NixOS version 19.09 (the
|
||||
current stable version), it may or may not work on other Linux
|
||||
distributions and NixOS versions.
|
||||
|
||||
Home Manager targets `nixpkgs-unstable` and NixOS version 26.05 (the current
|
||||
stable version), it may or may not work on other Linux distributions and NixOS
|
||||
versions.
|
||||
Also, the `home-manager` tool does not explicitly support rollbacks at
|
||||
the moment so if your home directory gets messed up you'll have to fix
|
||||
it yourself. See the [rollbacks](#rollbacks) section for instructions
|
||||
on how to manually perform a rollback.
|
||||
|
||||
Now when your expectations have been built up and you are eager to try all this
|
||||
out you can go ahead and read the rest of this text.
|
||||
Now when your expectations have been built up and you are eager to try
|
||||
all this out you can go ahead and read the rest of this text.
|
||||
|
||||
Contact
|
||||
-------
|
||||
|
||||
You can chat with us on IRC in the channel [#home-manager][] on [OFTC][]. There
|
||||
is also a [Matrix room](https://matrix.to/#/#hm:rycee.net), which is bridged to
|
||||
the IRC channel.
|
||||
You can chat with us on IRC in the channel [#home-manager][] on
|
||||
[freenode][]. The [channel logs][] are hosted courtesy of
|
||||
[samueldr][].
|
||||
|
||||
Installation
|
||||
------------
|
||||
|
||||
Home Manager can be used in three primary ways:
|
||||
Currently the easiest way to install Home Manager is as follows:
|
||||
|
||||
1. Using the standalone `home-manager` tool. For platforms other than NixOS and
|
||||
Darwin, this is the only available choice. It is also recommended for people
|
||||
on [NixOS][] or Darwin that want to manage their home directory independently
|
||||
of the system as a whole. See ["Standalone installation" in the
|
||||
manual][manual standalone install] for instructions on how to perform this
|
||||
installation.
|
||||
1. Make sure you have a working Nix installation. If you are not
|
||||
using NixOS then you may here have to run
|
||||
|
||||
1. As a module within a NixOS system configuration. This allows the user
|
||||
profiles to be built together with the system when running `nixos-rebuild`.
|
||||
See ["NixOS module" in the manual][manual nixos install] for a description of
|
||||
this setup.
|
||||
```console
|
||||
$ mkdir -m 0755 -p /nix/var/nix/{profiles,gcroots}/per-user/$USER
|
||||
```
|
||||
|
||||
1. As a module within a [nix-darwin] system configuration. This allows the user
|
||||
profiles to be built together with the system when running `darwin-rebuild`.
|
||||
See ["nix-darwin module" in the manual][manual nix-darwin install] for a
|
||||
description of this setup.
|
||||
since Home Manager uses these directories to manage your profile
|
||||
generations. On NixOS these should already be available.
|
||||
|
||||
Home Manager provides both the channel-based setup and the flake-based one. See
|
||||
[Nix Flakes][manual nix flakes] for a description of the flake-based setup.
|
||||
Also make sure that your user is able to build and install Nix
|
||||
packages. For example, you should be able to successfully run a
|
||||
command like `nix-instantiate '<nixpkgs>' -A hello` without having
|
||||
to switch to the root user. For a multi-user install of Nix this
|
||||
means that your user must be covered by the
|
||||
[`allowed-users`][nixAllowedUsers] Nix option. On NixOS you can
|
||||
control this option using the
|
||||
[`nix.allowedUsers`][nixosAllowedUsers] system option.
|
||||
|
||||
Translations
|
||||
------------
|
||||
2. Add the appropriate Home Manager channel. Typically this is
|
||||
|
||||
Home Manager has basic support for internationalization through
|
||||
[gettext](https://www.gnu.org/software/gettext/). The translations are hosted by
|
||||
[Weblate](https://weblate.org/). If you would like to contribute to the
|
||||
translation effort then start by going to the [Home Manager Weblate
|
||||
project](https://hosted.weblate.org/engage/home-manager/).
|
||||
```console
|
||||
$ nix-channel --add https://github.com/rycee/home-manager/archive/master.tar.gz home-manager
|
||||
$ nix-channel --update
|
||||
```
|
||||
|
||||
<a href="https://hosted.weblate.org/engage/home-manager/">
|
||||
<img src="https://hosted.weblate.org/widgets/home-manager/-/multi-auto.svg" alt="Translation status" />
|
||||
</a>
|
||||
if you are following Nixpkgs master or an unstable channel and
|
||||
|
||||
License
|
||||
-------
|
||||
```console
|
||||
$ nix-channel --add https://github.com/rycee/home-manager/archive/release-19.09.tar.gz home-manager
|
||||
$ nix-channel --update
|
||||
```
|
||||
|
||||
This project is licensed under the terms of the [MIT license](LICENSE).
|
||||
if you follow a Nixpkgs version 19.09 channel.
|
||||
|
||||
[#home-manager]: https://webchat.oftc.net/?channels=home-manager
|
||||
[Nix Flakes]: https://wiki.nixos.org/wiki/Flakes
|
||||
On NixOS you may need to log out and back in for the channel to
|
||||
become available. On non-NixOS you may have to add
|
||||
|
||||
```shell
|
||||
export NIX_PATH=$HOME/.nix-defexpr/channels${NIX_PATH:+:}$NIX_PATH
|
||||
```
|
||||
|
||||
to your shell (see [nix#2033](https://github.com/NixOS/nix/issues/2033)).
|
||||
|
||||
3. Install Home Manager and create the first Home Manager generation:
|
||||
|
||||
```console
|
||||
$ nix-shell '<home-manager>' -A install
|
||||
```
|
||||
|
||||
Once finished, Home Manager should be active and available in your
|
||||
user environment.
|
||||
|
||||
3. If you do not plan on having Home Manager manage your shell
|
||||
configuration then you must source the
|
||||
|
||||
```
|
||||
$HOME/.nix-profile/etc/profile.d/hm-session-vars.sh
|
||||
```
|
||||
|
||||
file in your shell configuration. Unfortunately, in this specific
|
||||
case we currently only support POSIX.2-like shells such as
|
||||
[Bash][] or [Z shell][].
|
||||
|
||||
For example, if you use Bash then add
|
||||
|
||||
```bash
|
||||
. "$HOME/.nix-profile/etc/profile.d/hm-session-vars.sh"
|
||||
```
|
||||
|
||||
to your `~/.profile` file.
|
||||
|
||||
If instead of using channels you want to run Home Manager from a Git
|
||||
checkout of the repository then you can use the
|
||||
`programs.home-manager.path` option to specify the absolute path to
|
||||
the repository.
|
||||
|
||||
Usage
|
||||
-----
|
||||
|
||||
Home Manager is typically managed through the `home-manager` tool.
|
||||
This tool can, for example, apply configurations to your home
|
||||
directory, list user packages installed by the tool, and list the
|
||||
configuration generations.
|
||||
|
||||
As an example, let us expand the initial configuration file from the
|
||||
installation above to install the htop and fortune packages, install
|
||||
Emacs with a few extra packages enabled, install Firefox with the
|
||||
IcedTea plugin enabled, and enable the user gpg-agent service.
|
||||
|
||||
To satisfy the above setup we should elaborate the
|
||||
`~/.config/nixpkgs/home.nix` file as follows:
|
||||
|
||||
```nix
|
||||
{ pkgs, ... }:
|
||||
|
||||
{
|
||||
home.packages = [
|
||||
pkgs.htop
|
||||
pkgs.fortune
|
||||
];
|
||||
|
||||
programs.emacs = {
|
||||
enable = true;
|
||||
extraPackages = epkgs: [
|
||||
epkgs.nix-mode
|
||||
epkgs.magit
|
||||
];
|
||||
};
|
||||
|
||||
programs.firefox = {
|
||||
enable = true;
|
||||
enableIcedTea = true;
|
||||
};
|
||||
|
||||
services.gpg-agent = {
|
||||
enable = true;
|
||||
defaultCacheTtl = 1800;
|
||||
enableSshSupport = true;
|
||||
};
|
||||
|
||||
programs.home-manager = {
|
||||
enable = true;
|
||||
path = "…";
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
To activate this configuration you can then run
|
||||
|
||||
```console
|
||||
$ home-manager switch
|
||||
```
|
||||
|
||||
or if you are not feeling so lucky,
|
||||
|
||||
```console
|
||||
$ home-manager build
|
||||
```
|
||||
|
||||
which will create a `result` link to a directory containing an
|
||||
activation script and the generated home directory files.
|
||||
|
||||
Documentation of available configuration options, including
|
||||
descriptions and usage examples, is available in the [Home Manager
|
||||
manual][configuration options] or offline by running
|
||||
|
||||
```console
|
||||
$ man home-configuration.nix
|
||||
```
|
||||
|
||||
Rollbacks
|
||||
---------
|
||||
|
||||
While the `home-manager` tool does not explicitly support rollbacks at
|
||||
the moment it is relatively easy to perform one manually. The steps to
|
||||
do so are
|
||||
|
||||
1. Run `home-manager generations` to determine which generation you
|
||||
wish to rollback to:
|
||||
|
||||
```console
|
||||
$ home-manager generations
|
||||
2018-01-04 11:56 : id 765 -> /nix/store/kahm1rxk77mnvd2l8pfvd4jkkffk5ijk-home-manager-generation
|
||||
2018-01-03 10:29 : id 764 -> /nix/store/2wsmsliqr5yynqkdyjzb1y57pr5q2lsj-home-manager-generation
|
||||
2018-01-01 12:21 : id 763 -> /nix/store/mv960kl9chn2lal5q8lnqdp1ygxngcd1-home-manager-generation
|
||||
2017-12-29 21:03 : id 762 -> /nix/store/6c0k1r03fxckql4vgqcn9ccb616ynb94-home-manager-generation
|
||||
2017-12-25 18:51 : id 761 -> /nix/store/czc5y6vi1rvnkfv83cs3rn84jarcgsgh-home-manager-generation
|
||||
…
|
||||
```
|
||||
|
||||
2. Copy the Nix store path of the generation you chose, e.g.,
|
||||
|
||||
/nix/store/mv960kl9chn2lal5q8lnqdp1ygxngcd1-home-manager-generation
|
||||
|
||||
for generation 763.
|
||||
|
||||
3. Run the `activate` script inside the copied store path:
|
||||
|
||||
```console
|
||||
$ /nix/store/mv960kl9chn2lal5q8lnqdp1ygxngcd1-home-manager-generation/activate
|
||||
Starting home manager activation
|
||||
…
|
||||
```
|
||||
|
||||
Keeping your ~ safe from harm
|
||||
-----------------------------
|
||||
|
||||
To configure programs and services Home Manager must write various
|
||||
things to your home directory. To prevent overwriting any existing
|
||||
files when switching to a new generation, Home Manager will attempt to
|
||||
detect collisions between existing files and generated files. If any
|
||||
such collision is detected the activation will terminate before
|
||||
changing anything on your computer.
|
||||
|
||||
For example, suppose you have a wonderful, painstakingly created
|
||||
`~/.config/git/config` and add
|
||||
|
||||
```nix
|
||||
{
|
||||
# …
|
||||
|
||||
programs.git = {
|
||||
enable = true;
|
||||
userName = "Jane Doe";
|
||||
userEmail = "jane.doe@example.org";
|
||||
};
|
||||
|
||||
# …
|
||||
}
|
||||
```
|
||||
|
||||
to your configuration. Attempting to switch to the generation will
|
||||
then result in
|
||||
|
||||
```console
|
||||
$ home-manager switch
|
||||
…
|
||||
Activating checkLinkTargets
|
||||
Existing file '/home/jdoe/.gitconfig' is in the way
|
||||
Please move the above files and try again
|
||||
```
|
||||
|
||||
Graphical services
|
||||
------------------
|
||||
|
||||
Home Manager includes a number of services intended to run in a
|
||||
graphical session, for example `xscreensaver` and `dunst`.
|
||||
Unfortunately, such services will not be started automatically unless
|
||||
you let Home Manager start your X session. That is, you have something
|
||||
like
|
||||
|
||||
```nix
|
||||
{
|
||||
# …
|
||||
|
||||
services.xserver.enable = true;
|
||||
|
||||
# …
|
||||
}
|
||||
```
|
||||
|
||||
in your system configuration and
|
||||
|
||||
```nix
|
||||
{
|
||||
# …
|
||||
|
||||
xsession.enable = true;
|
||||
xsession.windowManager.command = "…";
|
||||
|
||||
# …
|
||||
}
|
||||
```
|
||||
|
||||
in your Home Manager configuration.
|
||||
|
||||
[Bash]: https://www.gnu.org/software/bash/
|
||||
[Nix]: https://nixos.org/nix/
|
||||
[NixOS]: https://nixos.org/
|
||||
[Nix]: https://nixos.org/explore.html
|
||||
[Nixpkgs]: https://github.com/NixOS/nixpkgs
|
||||
[OFTC]: https://oftc.net/
|
||||
[configuration options]: https://nix-community.github.io/home-manager/options.xhtml
|
||||
[contributing]: https://nix-community.github.io/home-manager/#ch-contributing
|
||||
[manual nix flakes]: https://nix-community.github.io/home-manager/#ch-nix-flakes
|
||||
[manual nix-darwin install]: https://nix-community.github.io/home-manager/#sec-install-nix-darwin-module
|
||||
[manual nixos install]: https://nix-community.github.io/home-manager/#sec-install-nixos-module
|
||||
[manual standalone install]: https://nix-community.github.io/home-manager/#sec-install-standalone
|
||||
[manual]: https://nix-community.github.io/home-manager/
|
||||
[nix-darwin]: https://github.com/nix-darwin/nix-darwin
|
||||
[rollbacks]: https://nix-community.github.io/home-manager/index.xhtml#sec-usage-rollbacks
|
||||
[Nixpkgs]: https://nixos.org/nixpkgs/
|
||||
[nixAllowedUsers]: https://nixos.org/nix/manual/#conf-allowed-users
|
||||
[nixosAllowedUsers]: https://nixos.org/nixos/manual/options.html#opt-nix.allowedUsers
|
||||
[Z shell]: http://zsh.sourceforge.net/
|
||||
[configuration options]: https://rycee.gitlab.io/home-manager/options.html
|
||||
[#home-manager]: https://webchat.freenode.net/?url=irc%3A%2F%2Firc.freenode.net%2Fhome-manager
|
||||
[freenode]: https://freenode.net/
|
||||
[channel logs]: https://logs.nix.samueldr.com/home-manager/
|
||||
[samueldr]: https://github.com/samueldr/
|
||||
|
||||
-2537
File diff suppressed because it is too large
Load Diff
@@ -1 +0,0 @@
|
||||
attribute = "buildbot"
|
||||
@@ -1,45 +0,0 @@
|
||||
{
|
||||
lib,
|
||||
nix,
|
||||
runCommand,
|
||||
}:
|
||||
let
|
||||
home-manager =
|
||||
with lib.fileset;
|
||||
toSource {
|
||||
root = ../.;
|
||||
fileset = (fileFilter (file: file.hasExt "nix") ../.);
|
||||
};
|
||||
parseLog = "$TMPDIR/nix-parse.log";
|
||||
in
|
||||
runCommand "nix-parse-${nix.name}"
|
||||
{
|
||||
nativeBuildInputs = [
|
||||
nix
|
||||
];
|
||||
}
|
||||
''
|
||||
export NIX_STORE_DIR=$TMPDIR/store
|
||||
export NIX_STATE_DIR=$TMPDIR/state
|
||||
nix-store --init
|
||||
|
||||
cd "${home-manager}"
|
||||
|
||||
# This will only show the first parse error, not all of them. That's fine, because
|
||||
# the other CI jobs will report in more detail. This job is about checking parsing
|
||||
# across different implementations / versions, not about providing the best DX.
|
||||
# Returning all parse errors requires significantly more resources.
|
||||
if ! find . -type f -iname '*.nix' | xargs -P $(nproc) nix-instantiate --parse 2> "${parseLog}" > /dev/null; then
|
||||
cat "${parseLog}" >&2
|
||||
echo "Parse failed in nix-instantiate." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if grep "warning" "${parseLog}"; then
|
||||
cat "${parseLog}" >&2
|
||||
echo "Failing due to warnings in stderr" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
touch $out
|
||||
''
|
||||
+7
-44
@@ -1,50 +1,13 @@
|
||||
{
|
||||
pkgs ? import <nixpkgs> { },
|
||||
}:
|
||||
{ pkgs ? import <nixpkgs> {} }:
|
||||
|
||||
let
|
||||
path = builtins.path {
|
||||
path = ./.;
|
||||
name = "home-manager-source";
|
||||
rec {
|
||||
home-manager = pkgs.callPackage ./home-manager {
|
||||
path = toString ./.;
|
||||
};
|
||||
|
||||
nixpkgs = (
|
||||
import (
|
||||
let
|
||||
lock = builtins.fromJSON (builtins.readFile ./flake.lock);
|
||||
n = lock.nodes.nixpkgs.locked;
|
||||
in
|
||||
fetchTarball {
|
||||
url = "https://github.com/${n.owner}/${n.repo}/archive/${n.rev}.tar.gz";
|
||||
sha256 = n.narHash;
|
||||
}
|
||||
) { }
|
||||
);
|
||||
in
|
||||
rec {
|
||||
docs =
|
||||
let
|
||||
releaseInfo = pkgs.lib.importJSON ./release.json;
|
||||
in
|
||||
with import ./docs {
|
||||
inherit pkgs;
|
||||
inherit (releaseInfo) release isReleaseBranch;
|
||||
};
|
||||
{
|
||||
|
||||
inherit manPages jsonModuleMaintainers;
|
||||
inherit (manual) html htmlOpenTool;
|
||||
inherit (options) json;
|
||||
};
|
||||
|
||||
home-manager = pkgs.callPackage ./home-manager { inherit path; };
|
||||
|
||||
install = pkgs.callPackage ./home-manager/install.nix { inherit home-manager; };
|
||||
install = pkgs.callPackage ./home-manager/install.nix {
|
||||
inherit home-manager;
|
||||
};
|
||||
|
||||
nixos = import ./nixos;
|
||||
lib = import ./lib { inherit (pkgs) lib; };
|
||||
|
||||
dev = nixpkgs.callPackage ./home-manager/devShell.nix { };
|
||||
|
||||
inherit path;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,72 @@
|
||||
{ pkgs }:
|
||||
|
||||
let
|
||||
|
||||
lib = pkgs.lib;
|
||||
|
||||
nmdSrc = pkgs.fetchFromGitLab {
|
||||
name = "nmd";
|
||||
owner = "rycee";
|
||||
repo = "nmd";
|
||||
rev = "9751ca5ef6eb2ef27470010208d4c0a20e89443d";
|
||||
sha256 = "0rbx10n8kk0bvp1nl5c8q79lz1w0p1b8103asbvwps3gmqd070hi";
|
||||
};
|
||||
|
||||
nmd = import nmdSrc { inherit pkgs; };
|
||||
|
||||
# Make sure the used package is scrubbed to avoid actually
|
||||
# instantiating derivations.
|
||||
scrubbedPkgsModule = {
|
||||
imports = [
|
||||
{
|
||||
_module.args = {
|
||||
pkgs = lib.mkForce (nmd.scrubDerivations "pkgs" pkgs);
|
||||
pkgs_i686 = lib.mkForce { };
|
||||
};
|
||||
}
|
||||
];
|
||||
};
|
||||
|
||||
hmModulesDocs = nmd.buildModulesDocs {
|
||||
modules =
|
||||
import ../modules/modules.nix { inherit lib pkgs; }
|
||||
++ [ scrubbedPkgsModule ];
|
||||
moduleRootPaths = [ ./.. ];
|
||||
mkModuleUrl = path:
|
||||
"https://github.com/rycee/home-manager/blob/master/${path}#blob-path";
|
||||
channelName = "home-manager";
|
||||
docBook.id = "home-manager-options";
|
||||
};
|
||||
|
||||
docs = nmd.buildDocBookDocs {
|
||||
pathName = "home-manager";
|
||||
modulesDocs = [ hmModulesDocs ];
|
||||
documentsDirectory = ./.;
|
||||
chunkToc = ''
|
||||
<toc>
|
||||
<d:tocentry xmlns:d="http://docbook.org/ns/docbook" linkend="book-home-manager-manual"><?dbhtml filename="index.html"?>
|
||||
<d:tocentry linkend="ch-options"><?dbhtml filename="options.html"?></d:tocentry>
|
||||
<d:tocentry linkend="ch-tools"><?dbhtml filename="tools.html"?></d:tocentry>
|
||||
<d:tocentry linkend="ch-release-notes"><?dbhtml filename="release-notes.html"?></d:tocentry>
|
||||
</d:tocentry>
|
||||
</toc>
|
||||
'';
|
||||
};
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
inherit nmdSrc;
|
||||
|
||||
options = {
|
||||
json = hmModulesDocs.json.override {
|
||||
path = "share/doc/home-manager/options.json";
|
||||
};
|
||||
};
|
||||
|
||||
manPages = docs.manPages;
|
||||
|
||||
manual = {
|
||||
inherit (docs) html htmlOpenTool;
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,310 @@
|
||||
<chapter 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="ch-installation">
|
||||
<title>Installing Home Manager</title>
|
||||
<para>
|
||||
Home Manager can be used in three primary ways:
|
||||
<orderedlist>
|
||||
<listitem>
|
||||
<para>
|
||||
Using the standalone <command>home-manager</command> tool. For platforms
|
||||
other than NixOS and Darwin, this is the only available choice. It is also
|
||||
recommended for people on NixOS or Darwin that want to manage their home
|
||||
directory independent of the system as a whole. See
|
||||
<xref linkend="sec-install-standalone"/> for instructions on how to
|
||||
perform this installation.
|
||||
</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>
|
||||
As a module within a NixOS system configuration. This allows the user
|
||||
profiles to be built together with the system when running
|
||||
<command>nixos-rebuild</command>. See
|
||||
<xref linkend="sec-install-nixos-module"/> for a description of this
|
||||
setup.
|
||||
</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>
|
||||
As a module within a
|
||||
<link xlink:href="https://github.com/LnL7/nix-darwin/">nix-darwin</link>
|
||||
system configuration. This allows the user profiles to be built together
|
||||
with the system when running <command>darwin-rebuild</command>. See
|
||||
<xref linkend="sec-install-nix-darwin-module"/> for a description of this
|
||||
setup.
|
||||
</para>
|
||||
</listitem>
|
||||
</orderedlist>
|
||||
</para>
|
||||
<section xml:id="sec-install-standalone">
|
||||
<title>Standalone installation</title>
|
||||
|
||||
<orderedlist>
|
||||
<listitem>
|
||||
<para>
|
||||
Make sure you have a working Nix installation. If you are not using NixOS
|
||||
then it may be necessary to run
|
||||
</para>
|
||||
<screen>
|
||||
<prompt>$</prompt> <userinput>mkdir -m 0755 -p /nix/var/nix/{profiles,gcroots}/per-user/$USER</userinput>
|
||||
</screen>
|
||||
<para>
|
||||
since Home Manager uses these directories to manage your profile
|
||||
generations. On NixOS these should already be available.
|
||||
</para>
|
||||
<para>
|
||||
Also make sure that your user is able to build and install Nix packages.
|
||||
For example, you should be able to successfully run a command like
|
||||
<literal>nix-instantiate '<nixpkgs>' -A hello</literal> without
|
||||
having to switch to the root user. For a multi-user install of Nix this
|
||||
means that your user must be covered by the
|
||||
<link xlink:href="https://nixos.org/nix/manual/#conf-allowed-users"><literal>allowed-users</literal></link>
|
||||
Nix option. On NixOS you can control this option using the
|
||||
<link xlink:href="https://nixos.org/nixos/manual/options.html#opt-nix.allowedUsers"><literal>nix.allowedUsers</literal></link>
|
||||
system option.
|
||||
</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>
|
||||
Add the Home Manager channel that you wish to follow. This is done by
|
||||
running
|
||||
</para>
|
||||
<screen>
|
||||
<prompt>$</prompt> <userinput>nix-channel --add https://github.com/rycee/home-manager/archive/master.tar.gz home-manager</userinput>
|
||||
<prompt>$</prompt> <userinput>nix-channel --update</userinput>
|
||||
</screen>
|
||||
<para>
|
||||
if you are following Nixpkgs master or an unstable channel and
|
||||
</para>
|
||||
<screen>
|
||||
<prompt>$</prompt> <userinput>nix-channel --add https://github.com/rycee/home-manager/archive/release-19.09.tar.gz home-manager</userinput>
|
||||
<prompt>$</prompt> <userinput>nix-channel --update</userinput>
|
||||
</screen>
|
||||
<para>
|
||||
if you follow a Nixpkgs version 19.09 channel.
|
||||
</para>
|
||||
<para>
|
||||
On NixOS you may need to log out and back in for the channel to become
|
||||
available. On non-NixOS you may have to add
|
||||
<programlisting language="bash">
|
||||
export NIX_PATH=$HOME/.nix-defexpr/channels${NIX_PATH:+:}$NIX_PATH
|
||||
</programlisting>
|
||||
to your shell (see
|
||||
<link xlink:href="https://github.com/NixOS/nix/issues/2033">nix#2033</link>).
|
||||
</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>
|
||||
Run the Home Manager installation command and create the first Home
|
||||
Manager generation:
|
||||
</para>
|
||||
<screen>
|
||||
<prompt>$</prompt> <userinput>nix-shell '<home-manager>' -A install</userinput>
|
||||
</screen>
|
||||
<para>
|
||||
Once finished, Home Manager should be active and available in your user
|
||||
environment.
|
||||
</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>
|
||||
If you do not plan on having Home Manager manage your shell configuration
|
||||
then you must source the
|
||||
</para>
|
||||
<programlisting language="bash">
|
||||
$HOME/.nix-profile/etc/profile.d/hm-session-vars.sh
|
||||
</programlisting>
|
||||
<para>
|
||||
file in your shell configuration. Unfortunately, we currently only support
|
||||
POSIX.2-like shells such as
|
||||
<link xlink:href="https://www.gnu.org/software/bash/">Bash</link> or
|
||||
<link xlink:href="http://zsh.sourceforge.net/">Z shell</link>.
|
||||
</para>
|
||||
<para>
|
||||
For example, if you use Bash then add
|
||||
</para>
|
||||
<programlisting language="bash">
|
||||
. "$HOME/.nix-profile/etc/profile.d/hm-session-vars.sh"
|
||||
</programlisting>
|
||||
<para>
|
||||
to your <literal>~/.profile</literal> file.
|
||||
</para>
|
||||
</listitem>
|
||||
</orderedlist>
|
||||
|
||||
<para>
|
||||
If instead of using channels you want to run Home Manager from a Git
|
||||
checkout of the repository then you can use the
|
||||
<literal>programs.home-manager.path</literal> option to specify the absolute
|
||||
path to the repository.
|
||||
</para>
|
||||
</section>
|
||||
<section xml:id="sec-install-nixos-module">
|
||||
<title>NixOS module</title>
|
||||
|
||||
<para>
|
||||
Home Manager provides a NixOS module that allows you to prepare user
|
||||
environments directly from the system configuration file, which often is
|
||||
more convenient than using the <command>home-manager</command> tool. It also
|
||||
opens up additional possibilities, for example, to automatically configure
|
||||
user environments in NixOS declarative containers or on systems deployed
|
||||
through NixOps.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
To make the NixOS module available for use you must <option>import</option>
|
||||
it into your system configuration. This is most conveniently done by adding
|
||||
a Home Manager channel, for example
|
||||
</para>
|
||||
|
||||
<screen>
|
||||
<prompt>#</prompt> <userinput>nix-channel --add https://github.com/rycee/home-manager/archive/master.tar.gz home-manager</userinput>
|
||||
<prompt>#</prompt> <userinput>nix-channel --update</userinput>
|
||||
</screen>
|
||||
|
||||
<para>
|
||||
if you are following Nixpkgs master or an unstable channel and
|
||||
</para>
|
||||
|
||||
<screen>
|
||||
<prompt>#</prompt> <userinput>nix-channel --add https://github.com/rycee/home-manager/archive/release-19.09.tar.gz home-manager</userinput>
|
||||
<prompt>#</prompt> <userinput>nix-channel --update</userinput>
|
||||
</screen>
|
||||
|
||||
<para>
|
||||
if you follow a Nixpkgs version 19.09 channel.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
It is then possible to add
|
||||
</para>
|
||||
|
||||
<programlisting language="nix">
|
||||
imports = [ <home-manager/nixos> ];
|
||||
</programlisting>
|
||||
|
||||
<para>
|
||||
to your system <filename>configuration.nix</filename> file, which will
|
||||
introduce a new NixOS option called <option>home-manager.users</option>
|
||||
whose type is an attribute set that maps user names to Home Manager
|
||||
configurations.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
For example, a NixOS configuration may include the lines
|
||||
</para>
|
||||
|
||||
<programlisting language="nix">
|
||||
users.users.eve.isNormalUser = true;
|
||||
home-manager.users.eve = { pkgs, ... }: {
|
||||
home.packages = [ pkgs.atool pkgs.httpie ];
|
||||
programs.bash.enable = true;
|
||||
};
|
||||
</programlisting>
|
||||
|
||||
<para>
|
||||
and after a <command>nixos-rebuild switch</command> the user eve's
|
||||
environment should include a basic Bash configuration and the packages atool
|
||||
and httpie.
|
||||
</para>
|
||||
|
||||
<note>
|
||||
<para>
|
||||
By default packages will be installed to
|
||||
<filename>$HOME/.nix-profile</filename> but they can be installed to
|
||||
<filename>/etc/profiles</filename> if
|
||||
</para>
|
||||
<programlisting language="nix">
|
||||
home-manager.useUserPackages = true;
|
||||
</programlisting>
|
||||
<para>
|
||||
is added to the system configuration. This is necessary if, for example,
|
||||
you wish to use <command>nixos-rebuild build-vm</command>. This option may
|
||||
become the default value in the future.
|
||||
</para>
|
||||
</note>
|
||||
</section>
|
||||
<section xml:id="sec-install-nix-darwin-module">
|
||||
<title>nix-darwin module</title>
|
||||
|
||||
<para>
|
||||
Home Manager provides a module that allows you to prepare user
|
||||
environments directly from the nix-darwin configuration file, which often is
|
||||
more convenient than using the <command>home-manager</command> tool.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
To make the NixOS module available for use you must <option>import</option>
|
||||
it into your system configuration. This is most conveniently done by adding
|
||||
a Home Manager channel, for example
|
||||
</para>
|
||||
|
||||
<screen>
|
||||
<prompt>#</prompt> <userinput>nix-channel --add https://github.com/rycee/home-manager/archive/master.tar.gz home-manager</userinput>
|
||||
<prompt>#</prompt> <userinput>nix-channel --update</userinput>
|
||||
</screen>
|
||||
|
||||
<para>
|
||||
if you are following Nixpkgs master or an unstable channel and
|
||||
</para>
|
||||
|
||||
<screen>
|
||||
<prompt>#</prompt> <userinput>nix-channel --add https://github.com/rycee/home-manager/archive/release-19.09.tar.gz home-manager</userinput>
|
||||
<prompt>#</prompt> <userinput>nix-channel --update</userinput>
|
||||
</screen>
|
||||
|
||||
<para>
|
||||
if you follow a Nixpkgs version 19.09 channel.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
It is then possible to add
|
||||
</para>
|
||||
|
||||
<programlisting language="nix">
|
||||
imports = [ <home-manager/nix-darwin> ];
|
||||
</programlisting>
|
||||
|
||||
<para>
|
||||
to your nix-darwin <filename>configuration.nix</filename> file, which will
|
||||
introduce a new NixOS option called <option>home-manager</option> whose type
|
||||
is an attribute set that maps user names to Home Manager configurations.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
For example, a nix-darwin configuration may include the lines
|
||||
</para>
|
||||
|
||||
<programlisting language="nix">
|
||||
home-manager.users.eve = { pkgs, ... }: {
|
||||
home.packages = [ pkgs.atool pkgs.httpie ];
|
||||
programs.bash.enable = true;
|
||||
};
|
||||
</programlisting>
|
||||
|
||||
<para>
|
||||
and after a <command>darwin-rebuild --switch</command> the user eve's
|
||||
environment should include a basic Bash configuration and the packages atool
|
||||
and httpie.
|
||||
</para>
|
||||
|
||||
<note>
|
||||
<para>
|
||||
By default user packages will not be ignored in favor of
|
||||
<option>environment.systemPackages</option>, but they will be intalled to
|
||||
<option>/etc/profiles/per-user/$USERNAME</option> if
|
||||
</para>
|
||||
|
||||
<programlisting language="nix">
|
||||
home-manager.useUserPackages = true;
|
||||
</programlisting>
|
||||
|
||||
<para>
|
||||
is added to the nix-darwin configuration. This option may become the default
|
||||
value in the future.
|
||||
</para>
|
||||
</note>
|
||||
</section>
|
||||
</chapter>
|
||||
@@ -0,0 +1,40 @@
|
||||
<refentry xmlns="http://docbook.org/ns/docbook"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:xi="http://www.w3.org/2001/XInclude">
|
||||
<refmeta>
|
||||
<refentrytitle><filename>home-configuration.nix</filename></refentrytitle>
|
||||
<manvolnum>5</manvolnum>
|
||||
<refmiscinfo class="source">Home Manager</refmiscinfo>
|
||||
<!-- <refmiscinfo class="version"><xi:include href="version.txt" parse="text"/></refmiscinfo> -->
|
||||
</refmeta>
|
||||
<refnamediv>
|
||||
<refname><filename>home-configuration.nix</filename></refname>
|
||||
<refpurpose>Home Manager configuration specification</refpurpose>
|
||||
</refnamediv>
|
||||
<refsection>
|
||||
<title>Description</title>
|
||||
<para>
|
||||
The file <filename>~/.config/nixpkgs/home.nix</filename> contains the
|
||||
declarative specification of your Home Manager configuration. The command
|
||||
<command>home-manager</command> takes this file and realises the user
|
||||
environment configuration specified therein.
|
||||
</para>
|
||||
</refsection>
|
||||
<refsection>
|
||||
<title>Options</title>
|
||||
<para>
|
||||
You can use the following options in
|
||||
<filename>home-configuration.nix</filename>:
|
||||
</para>
|
||||
<xi:include href="./nmd-result/home-manager-options.xml" />
|
||||
</refsection>
|
||||
<refsection>
|
||||
<title>See also</title>
|
||||
<para>
|
||||
<citerefentry>
|
||||
<refentrytitle>home-manager</refentrytitle>
|
||||
<manvolnum>1</manvolnum>
|
||||
</citerefentry>
|
||||
</para>
|
||||
</refsection>
|
||||
</refentry>
|
||||
@@ -0,0 +1,497 @@
|
||||
<refentry xmlns="http://docbook.org/ns/docbook"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:xi="http://www.w3.org/2001/XInclude">
|
||||
<refmeta>
|
||||
<refentrytitle><command>home-manager</command>
|
||||
</refentrytitle><manvolnum>1</manvolnum>
|
||||
<refmiscinfo class="source">Home Manager</refmiscinfo>
|
||||
</refmeta>
|
||||
<refnamediv>
|
||||
<refname><command>home-manager</command>
|
||||
</refname><refpurpose>reconfigure a user environment</refpurpose>
|
||||
</refnamediv>
|
||||
<refsynopsisdiv>
|
||||
<cmdsynopsis>
|
||||
<command>home-manager</command> <group choice="req">
|
||||
<arg choice="plain">
|
||||
build
|
||||
</arg>
|
||||
|
||||
<arg choice="plain">
|
||||
edit
|
||||
</arg>
|
||||
|
||||
<arg choice="plain">
|
||||
expire-generations <replaceable>timestamp</replaceable>
|
||||
</arg>
|
||||
|
||||
<arg choice="plain">
|
||||
generations
|
||||
</arg>
|
||||
|
||||
<arg choice="plain">
|
||||
help
|
||||
</arg>
|
||||
|
||||
<arg choice="plain">
|
||||
news
|
||||
</arg>
|
||||
|
||||
<arg choice="plain">
|
||||
packages
|
||||
</arg>
|
||||
|
||||
<arg choice="plain">
|
||||
remove-generations <replaceable>ID …</replaceable>
|
||||
</arg>
|
||||
|
||||
<arg choice="plain">
|
||||
switch
|
||||
</arg>
|
||||
|
||||
<arg choice="plain">
|
||||
uninstall
|
||||
</arg>
|
||||
</group>
|
||||
<sbr />
|
||||
<arg>
|
||||
-A <replaceable>attrPath</replaceable>
|
||||
</arg>
|
||||
|
||||
<arg>
|
||||
-I <replaceable>path</replaceable>
|
||||
</arg>
|
||||
|
||||
<arg>
|
||||
-b <replaceable>ext</replaceable>
|
||||
</arg>
|
||||
|
||||
<arg>
|
||||
<group choice="req">
|
||||
<arg choice="plain">
|
||||
-f
|
||||
</arg>
|
||||
|
||||
<arg choice="plain">
|
||||
--file
|
||||
</arg>
|
||||
</group> <replaceable>path</replaceable>
|
||||
</arg>
|
||||
|
||||
<arg>
|
||||
<group choice="req">
|
||||
<arg choice="plain">
|
||||
-h
|
||||
</arg>
|
||||
|
||||
<arg choice="plain">
|
||||
--help
|
||||
</arg>
|
||||
</group>
|
||||
</arg>
|
||||
|
||||
<arg>
|
||||
<group choice="req">
|
||||
<arg choice="plain">
|
||||
-n
|
||||
</arg>
|
||||
|
||||
<arg choice="plain">
|
||||
--dry-run
|
||||
</arg>
|
||||
</group>
|
||||
</arg>
|
||||
|
||||
<arg>
|
||||
--option <replaceable>name</replaceable> <replaceable>value</replaceable>
|
||||
</arg>
|
||||
|
||||
<arg>
|
||||
--cores <replaceable>number</replaceable>
|
||||
</arg>
|
||||
|
||||
<arg>
|
||||
--max-jobs <replaceable>number</replaceable>
|
||||
</arg>
|
||||
|
||||
<arg>
|
||||
--keep-failed
|
||||
</arg>
|
||||
|
||||
<arg>
|
||||
--keep-going
|
||||
</arg>
|
||||
|
||||
<arg>
|
||||
--show-trace
|
||||
</arg>
|
||||
|
||||
<arg>
|
||||
<group choice="req">
|
||||
<arg choice="plain">
|
||||
-v
|
||||
</arg>
|
||||
|
||||
<arg choice="plain">
|
||||
--verbose
|
||||
</arg>
|
||||
</group>
|
||||
</arg>
|
||||
</cmdsynopsis>
|
||||
</refsynopsisdiv>
|
||||
<refsection>
|
||||
<title>Description</title>
|
||||
<para>
|
||||
This command updates the user environment so that it corresponds to the
|
||||
configuration specified in <filename>~/.config/nixpkgs/home.nix</filename>.
|
||||
</para>
|
||||
<para>
|
||||
All operations using this tool expects a sub-command that indicates the
|
||||
operation to perform. It must be one of
|
||||
<variablelist>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<option>build</option>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Build configuration into a <filename>result</filename> directory.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<option>edit</option>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Open the home configuration using the editor indicated by
|
||||
<envar>EDITOR</envar>.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<option>expire-generations <replaceable>timestamp</replaceable></option>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Remove generations older than <replaceable>timestamp</replaceable> where
|
||||
<replaceable>timestamp</replaceable> is interpreted as in the
|
||||
<option>-d</option> argument of the <citerefentry>
|
||||
<refentrytitle>date</refentrytitle>
|
||||
<manvolnum>1</manvolnum> </citerefentry> tool. For example <literal>-30
|
||||
days</literal> or <literal>2018-01-01</literal>.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<option>generations</option>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
List all home environment generations.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<option>help</option>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Print tool help.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<option>news</option>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Show news entries in a pager.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<option>packages</option>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
List all packages installed in <varname>home-manager-path</varname>.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<option>remove-generations <replaceable>ID …</replaceable></option>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Remove indicated generations. Use the <option>generations</option>
|
||||
sub-command to find suitable generation numbers.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<option>switch</option>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Build and activate the configuration.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<option>uninstall</option>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Remove Home Manager from the user environment. This will
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para>
|
||||
remove all managed files from the home directory,
|
||||
</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>
|
||||
remove packages installed through Home Manager from the user profile,
|
||||
and
|
||||
</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>
|
||||
optionally remove all Home Manager generations and make them
|
||||
available for immediate garbage collection.
|
||||
</para>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
</variablelist>
|
||||
</para>
|
||||
</refsection>
|
||||
<refsection>
|
||||
<title>Options</title>
|
||||
<para>
|
||||
The tool accepts the options
|
||||
</para>
|
||||
<variablelist>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<option>-A <replaceable>attrPath</replaceable></option>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Optional attribute that selects a configuration expression in the
|
||||
configuration file. That is, if <filename>home.nix</filename> contains
|
||||
<programlisting language="nix">
|
||||
{
|
||||
joe-at-work = {pkgs, ...}: { home.packages = [ pkgs.fortune ]; };
|
||||
joe-at-home = {pkgs, ...}: { home.packages = [ pkgs.cowsay ]; };
|
||||
}
|
||||
</programlisting>
|
||||
then the command <command>home-manager switch -A joe-at-work</command>
|
||||
will activate the profile containing the fortune program.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<option>-I <replaceable>path</replaceable></option>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Add a path to the Nix expression search path. For example, to build a
|
||||
Home Manager profile using a specific Nixpkgs run <command>home-manager
|
||||
-I nixpkgs=/absolute/path/to/nixpkgs build</command>. By default
|
||||
<literal><nixpkgs></literal> is used.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<option>-b <replaceable>extension</replaceable></option>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Enable automatic resolution of collisions between unmanaged and managed
|
||||
files. The name of the original file will be suffixed by the given
|
||||
extension. For example,
|
||||
<screen>
|
||||
<prompt>$</prompt> <userinput>home-manager -b bck switch</userinput>
|
||||
</screen>
|
||||
will cause a colliding file <filename>~/.config/foo.conf</filename> to be
|
||||
moved to <filename>~/.config/foo.conf.bck</filename>.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<option>-f <replaceable>path</replaceable></option>
|
||||
</term>
|
||||
<term>
|
||||
<option>--file <replaceable>path</replaceable></option>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Indicates the path to the Home Manager configuration file. If not given,
|
||||
<filename>~/.config/nixpkgs/home.nix</filename> is used.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<option>-h</option>
|
||||
</term>
|
||||
<term>
|
||||
<option>--help</option>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Prints usage information for the <command>home-manager</command> tool.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<option>-n</option>
|
||||
</term>
|
||||
<term>
|
||||
<option>--dry-run</option>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Perform a dry-run of the given operation, only prints what actions would
|
||||
be taken.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<option>--option <replaceable>name</replaceable> <replaceable>value</replaceable></option>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Passed on to <citerefentry>
|
||||
<refentrytitle>nix-build</refentrytitle>
|
||||
<manvolnum>1</manvolnum> </citerefentry>.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<option>--cores <replaceable>number</replaceable></option>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Passed on to <citerefentry>
|
||||
<refentrytitle>nix-build</refentrytitle>
|
||||
<manvolnum>1</manvolnum> </citerefentry>.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<option>--max-jobs <replaceable>number</replaceable></option>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Passed on to <citerefentry>
|
||||
<refentrytitle>nix-build</refentrytitle>
|
||||
<manvolnum>1</manvolnum> </citerefentry>.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<option>--keep-failed</option>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Passed on to <citerefentry>
|
||||
<refentrytitle>nix-build</refentrytitle>
|
||||
<manvolnum>1</manvolnum> </citerefentry>.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<option>--keep-going</option>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Passed on to <citerefentry>
|
||||
<refentrytitle>nix-build</refentrytitle>
|
||||
<manvolnum>1</manvolnum> </citerefentry>.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<option>--show-trace</option>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Passed on to <citerefentry>
|
||||
<refentrytitle>nix-build</refentrytitle>
|
||||
<manvolnum>1</manvolnum> </citerefentry>.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<option>-v</option>
|
||||
</term>
|
||||
<term>
|
||||
<option>--verbose</option>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Activates verbose output.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
</variablelist>
|
||||
</refsection>
|
||||
<refsection>
|
||||
<title>Files</title>
|
||||
<variablelist>
|
||||
<varlistentry>
|
||||
<term>
|
||||
<filename>~/.local/share/home-manager/news-read-ids</filename>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Identifiers of news items that have been shown. Can be deleted to reset
|
||||
the read news indicator.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
</variablelist>
|
||||
</refsection>
|
||||
<refsection>
|
||||
<title>Bugs</title>
|
||||
<para>
|
||||
Please report any bugs on the
|
||||
<link
|
||||
xlink:href="https://github.com/rycee/home-manager/issues">project
|
||||
issue tracker</link>.
|
||||
</para>
|
||||
</refsection>
|
||||
<refsection>
|
||||
<title>See also</title>
|
||||
<para>
|
||||
<citerefentry>
|
||||
<refentrytitle>home-configuration.nix</refentrytitle>
|
||||
<manvolnum>5</manvolnum> </citerefentry>
|
||||
</para>
|
||||
</refsection>
|
||||
</refentry>
|
||||
@@ -0,0 +1,12 @@
|
||||
<reference xmlns="http://docbook.org/ns/docbook"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:xi="http://www.w3.org/2001/XInclude">
|
||||
<title>Home Manager Reference Pages</title>
|
||||
<info>
|
||||
<author><personname>Home Manager contributors</personname></author>
|
||||
<copyright><year>2017–2019</year><holder>Home Manager contributors</holder>
|
||||
</copyright>
|
||||
</info>
|
||||
<xi:include href="man-configuration.xml" />
|
||||
<xi:include href="man-home-manager.xml" />
|
||||
</reference>
|
||||
@@ -0,0 +1,38 @@
|
||||
<book 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="book-home-manager-manual">
|
||||
<info>
|
||||
<title>Home Manager Manual</title>
|
||||
</info>
|
||||
<preface>
|
||||
<title>Preface</title>
|
||||
<para>
|
||||
This manual will eventually describes how to install, use, and extend Home
|
||||
Manager.
|
||||
</para>
|
||||
<para>
|
||||
If you encounter problems or bugs then please report them on the
|
||||
<link xlink:href="https://github.com/rycee/home-manager/issues">Home Manager
|
||||
issue tracker</link>.
|
||||
</para>
|
||||
<note>
|
||||
<para>
|
||||
Commands prefixed with <literal>#</literal> have to be run as root, either
|
||||
requiring to login as root user or temporarily switching to it using
|
||||
<literal>sudo</literal> for example.
|
||||
</para>
|
||||
</note>
|
||||
</preface>
|
||||
<xi:include href="installation.xml" />
|
||||
<appendix xml:id="ch-options">
|
||||
<title>Configuration Options</title>
|
||||
<xi:include href="./nmd-result/home-manager-options.xml" />
|
||||
</appendix>
|
||||
<appendix xml:id="ch-tools">
|
||||
<title>Tools</title>
|
||||
<xi:include href="./man-home-manager.xml" />
|
||||
</appendix>
|
||||
<xi:include href="./release-notes/release-notes.xml" />
|
||||
</book>
|
||||
@@ -0,0 +1,14 @@
|
||||
<appendix 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="ch-release-notes">
|
||||
<title>Release Notes</title>
|
||||
<para>
|
||||
This section lists the release notes for stable versions of Home Manager and
|
||||
the current unstable version.
|
||||
</para>
|
||||
<xi:include href="rl-1909.xml" />
|
||||
<xi:include href="rl-1903.xml" />
|
||||
<xi:include href="rl-1809.xml" />
|
||||
</appendix>
|
||||
@@ -1,3 +1,4 @@
|
||||
# Release 18.09 {#sec-release-18.09}
|
||||
[[sec-release-18.09]]
|
||||
== Release 18.09
|
||||
|
||||
The 18.09 release branch became the stable branch in September, 2018.
|
||||
@@ -0,0 +1,59 @@
|
||||
[[sec-release-19.03]]
|
||||
== Release 19.03
|
||||
|
||||
The 19.03 release branch became the stable branch in April, 2019.
|
||||
|
||||
[[sec-release-19.03-highlights]]
|
||||
=== Highlights
|
||||
:opt-home-file-source: opt-home.file._name__.source
|
||||
|
||||
This release has the following notable changes:
|
||||
|
||||
* The <<{opt-home-file-source}>> option now allows source files to be
|
||||
hidden, that is, having a name starting with the `.` character. It
|
||||
also allows the source file name to contain characters not typically
|
||||
allowed for Nix store paths. For example, your configuration can now
|
||||
contain things such as
|
||||
+
|
||||
[source,nix]
|
||||
----
|
||||
home.file."my file".source = ./. + "/file with spaces!";
|
||||
----
|
||||
|
||||
* The type used for the systemd unit options under
|
||||
<<opt-systemd.user.services>>, <<opt-systemd.user.sockets>>, etc. has
|
||||
been changed to offer more robust merging of configurations. If you
|
||||
don't override values within systemd units then you are not affected
|
||||
by this change. Unfortunately, if you do override unit values you may
|
||||
encounter errors.
|
||||
+
|
||||
In particular, if you get an error saying that a ``unique option'' is
|
||||
``defined multiple times'' then you need to use the
|
||||
https://nixos.org/nixos/manual/#sec-option-definitions-setting-priorities[`mkForce`]
|
||||
function. For example,
|
||||
+
|
||||
[source,nix]
|
||||
----
|
||||
systemd.user.services.foo.Service.ExecStart = "/foo/bar";
|
||||
----
|
||||
+
|
||||
becomes
|
||||
+
|
||||
[source,nix]
|
||||
----
|
||||
systemd.user.services.foo.Service.ExecStart = lib.mkForce "/foo/bar";
|
||||
----
|
||||
+
|
||||
We had to make this change because the old merging was causing too
|
||||
many confusing situations for people.
|
||||
|
||||
[[sec-release-19.03-state-version-changes]]
|
||||
=== State Version Changes
|
||||
|
||||
The state version in this release includes the changes below. These
|
||||
changes are only active if the <<opt-home.stateVersion>> option is set
|
||||
to ``19.03'' or later.
|
||||
|
||||
* There is now an option <<opt-programs.beets.enable>> that defaults
|
||||
to `false`. Before the module would be active if the
|
||||
<<opt-programs.beets.settings>> option was non-empty.
|
||||
@@ -0,0 +1,31 @@
|
||||
[[sec-release-19.09]]
|
||||
== Release 19.09
|
||||
|
||||
The 19.09 release branch became the stable branch in October, 2019.
|
||||
|
||||
[[sec-release-19.09-highlights]]
|
||||
=== Highlights
|
||||
|
||||
This release has the following notable changes:
|
||||
|
||||
* The <<opt-programs.firefox.enableGoogleTalk>> and
|
||||
<<opt-programs.firefox.enableIcedTea>> options are now deprecated
|
||||
and will only work if Firefox ESR 52.x is used.
|
||||
|
||||
* The `home-manager` tool now provides an `uninstall` sub-command that
|
||||
can be used to uninstall Home Manager, if used in the standalone
|
||||
mode. That is, not as a NixOS module.
|
||||
|
||||
[[sec-release-19.09-state-version-changes]]
|
||||
=== State Version Changes
|
||||
|
||||
The state version in this release includes the changes below. These
|
||||
changes are only active if the `home.stateVersion` option is set to
|
||||
"19.09" or later.
|
||||
|
||||
* The <<opt-programs.firefox.package>> option now expects a wrapped
|
||||
Firefox package and defaults to `pkgs.firefox`.
|
||||
|
||||
* The options <<opt-home.keyboard.layout>> and
|
||||
<<opt-home.keyboard.variant>> now default to `null`, which indicates
|
||||
that the system value should be used.
|
||||
@@ -1,314 +0,0 @@
|
||||
{
|
||||
pkgs,
|
||||
|
||||
# Note, this should be "the standard library" + HM extensions.
|
||||
lib ? import ../modules/lib/stdlib-extended.nix pkgs.lib,
|
||||
|
||||
release,
|
||||
isReleaseBranch,
|
||||
}:
|
||||
|
||||
let
|
||||
|
||||
# Recursively replace each derivation in the given attribute set
|
||||
# with the same derivation but with the `outPath` attribute set to
|
||||
# the string `"\${pkgs.attribute.path}"`. This allows the
|
||||
# documentation to refer to derivations through their values without
|
||||
# establishing an actual dependency on the derivation output.
|
||||
#
|
||||
# This is not perfect, but it seems to cover a vast majority of use
|
||||
# cases.
|
||||
#
|
||||
# Caveat: even if the package is reached by a different means, the
|
||||
# path above will be shown and not e.g.
|
||||
# `${config.services.foo.package}`.
|
||||
scrubDerivations =
|
||||
prefixPath: attrs:
|
||||
let
|
||||
scrubDerivation =
|
||||
name: value:
|
||||
let
|
||||
pkgAttrName = prefixPath + "." + name;
|
||||
in
|
||||
if lib.isAttrs value then
|
||||
scrubDerivations pkgAttrName value
|
||||
// lib.optionalAttrs (lib.isDerivation value) {
|
||||
outPath = "\${${pkgAttrName}}";
|
||||
}
|
||||
else
|
||||
value;
|
||||
in
|
||||
lib.mapAttrs scrubDerivation attrs;
|
||||
|
||||
# Make sure the used package is scrubbed to avoid actually
|
||||
# instantiating derivations.
|
||||
scrubbedPkgsModule = {
|
||||
imports = [
|
||||
{
|
||||
_module.args = {
|
||||
pkgs = lib.mkForce (scrubDerivations "pkgs" pkgs);
|
||||
pkgs_i686 = lib.mkForce { };
|
||||
};
|
||||
}
|
||||
];
|
||||
};
|
||||
|
||||
dontCheckDefinitions = {
|
||||
_module.check = false;
|
||||
};
|
||||
|
||||
gitHubDeclaration =
|
||||
user: repo: subpath:
|
||||
let
|
||||
urlRef = if isReleaseBranch then "release-${release}" else "master";
|
||||
in
|
||||
{
|
||||
url = "https://github.com/${user}/${repo}/blob/${urlRef}/${subpath}";
|
||||
name = "<${repo}/${subpath}>";
|
||||
};
|
||||
|
||||
hmPath = toString ./..;
|
||||
|
||||
# Keep submodule option docs visible when wrapped in `either` (and therefore
|
||||
# in `nullOr (either ...)`), which upstream currently omits.
|
||||
docsLib = lib.extend (
|
||||
_self: super:
|
||||
let
|
||||
mergeEitherSubOptions =
|
||||
prefix: leftType: rightType:
|
||||
let
|
||||
getSubOptionsOrEmpty =
|
||||
optionType:
|
||||
let
|
||||
subOptions = optionType.getSubOptions prefix;
|
||||
in
|
||||
if builtins.isAttrs subOptions then subOptions else { };
|
||||
|
||||
mkOptionDecl = options: {
|
||||
_file = "<docs/default.nix>";
|
||||
pos = null;
|
||||
inherit options;
|
||||
};
|
||||
|
||||
optionSets = lib.filter (options: options != { }) [
|
||||
(getSubOptionsOrEmpty leftType)
|
||||
(getSubOptionsOrEmpty rightType)
|
||||
];
|
||||
mergedOptions = lib.foldl' (
|
||||
acc: options:
|
||||
if acc == { } then
|
||||
options
|
||||
else
|
||||
(super.mergeOptionDecls prefix [
|
||||
(mkOptionDecl acc)
|
||||
(mkOptionDecl options)
|
||||
]).options
|
||||
) { } optionSets;
|
||||
in
|
||||
mergedOptions;
|
||||
|
||||
in
|
||||
{
|
||||
types = super.types // {
|
||||
either =
|
||||
leftType: rightType:
|
||||
(super.types.either leftType rightType)
|
||||
// {
|
||||
getSubOptions = prefix: mergeEitherSubOptions prefix leftType rightType;
|
||||
};
|
||||
};
|
||||
}
|
||||
);
|
||||
|
||||
buildOptionsDocs =
|
||||
args@{
|
||||
modules,
|
||||
includeModuleSystemOptions ? true,
|
||||
...
|
||||
}:
|
||||
let
|
||||
# to discourage references from option descriptions and defaults.
|
||||
poisonModule =
|
||||
let
|
||||
poisonAttr = n: {
|
||||
name = n;
|
||||
value = abort ''
|
||||
error: the option documentation has a dependency on the configuration.
|
||||
|
||||
You may, for example, have added an option attribute like
|
||||
|
||||
default = ''${config.some.value};
|
||||
|
||||
Since the default value is included in the Home Manager manual, this
|
||||
would make the manual depend on the user's configuration.
|
||||
|
||||
To avoid this problem in this particular case, consider changing to
|
||||
|
||||
default = ''${config.some.value};
|
||||
defaultText = lib.literalExpression "\\''${config.some.value}";'';
|
||||
};
|
||||
in
|
||||
{ options, ... }:
|
||||
{
|
||||
config = lib.listToAttrs (map poisonAttr (lib.filter (n: n != "_module") (lib.attrNames options)));
|
||||
};
|
||||
|
||||
inherit
|
||||
(
|
||||
(docsLib.evalModules {
|
||||
modules = modules ++ [ poisonModule ];
|
||||
class = "homeManager";
|
||||
})
|
||||
)
|
||||
options
|
||||
;
|
||||
in
|
||||
pkgs.buildPackages.nixosOptionsDoc (
|
||||
{
|
||||
options = if includeModuleSystemOptions then options else removeAttrs options [ "_module" ];
|
||||
transformOptions =
|
||||
opt:
|
||||
opt
|
||||
// {
|
||||
# Clean up declaration sites to not refer to the Home Manager
|
||||
# source tree.
|
||||
declarations = map (
|
||||
decl:
|
||||
if lib.hasPrefix hmPath (toString decl) then
|
||||
gitHubDeclaration "nix-community" "home-manager" (
|
||||
lib.removePrefix "/" (lib.removePrefix hmPath (toString decl))
|
||||
)
|
||||
else if decl == "lib/modules.nix" then
|
||||
# TODO: handle this in a better way (may require upstream
|
||||
# changes to nixpkgs)
|
||||
gitHubDeclaration "NixOS" "nixpkgs" decl
|
||||
else
|
||||
decl
|
||||
) opt.declarations;
|
||||
};
|
||||
}
|
||||
// removeAttrs args [
|
||||
"modules"
|
||||
"includeModuleSystemOptions"
|
||||
]
|
||||
);
|
||||
|
||||
hmOptionsDocs = buildOptionsDocs {
|
||||
modules =
|
||||
import ../modules/modules.nix {
|
||||
lib = docsLib;
|
||||
inherit pkgs;
|
||||
check = false;
|
||||
}
|
||||
++ [ scrubbedPkgsModule ];
|
||||
variablelistId = "home-manager-options";
|
||||
};
|
||||
|
||||
nixosOptionsDocs = buildOptionsDocs {
|
||||
modules = [
|
||||
../nixos
|
||||
scrubbedPkgsModule
|
||||
dontCheckDefinitions
|
||||
];
|
||||
includeModuleSystemOptions = false;
|
||||
variablelistId = "nixos-options";
|
||||
optionIdPrefix = "nixos-opt-";
|
||||
};
|
||||
|
||||
nixDarwinOptionsDocs = buildOptionsDocs {
|
||||
modules = [
|
||||
../nix-darwin
|
||||
scrubbedPkgsModule
|
||||
dontCheckDefinitions
|
||||
];
|
||||
includeModuleSystemOptions = false;
|
||||
variablelistId = "nix-darwin-options";
|
||||
optionIdPrefix = "nix-darwin-opt-";
|
||||
};
|
||||
|
||||
release-config = builtins.fromJSON (builtins.readFile ../release.json);
|
||||
revision = "release-${release-config.release}";
|
||||
# Generate the `man home-configuration.nix` package
|
||||
home-configuration-manual =
|
||||
pkgs.runCommand "home-configuration-reference-manpage"
|
||||
{
|
||||
nativeBuildInputs = [
|
||||
pkgs.buildPackages.installShellFiles
|
||||
pkgs.nixos-render-docs
|
||||
];
|
||||
allowedReferences = [ "out" ];
|
||||
}
|
||||
''
|
||||
# Generate manpages.
|
||||
mkdir -p $out/share/man/man5
|
||||
mkdir -p $out/share/man/man1
|
||||
nixos-render-docs -j $NIX_BUILD_CORES options manpage \
|
||||
--revision ${revision} \
|
||||
--header ${./home-configuration-nix-header.5} \
|
||||
--footer ${./home-configuration-nix-footer.5} \
|
||||
${hmOptionsDocs.optionsJSON}/share/doc/nixos/options.json \
|
||||
$out/share/man/man5/home-configuration.nix.5
|
||||
cp ${./home-manager.1} $out/share/man/man1/home-manager.1
|
||||
'';
|
||||
# Generate the HTML manual pages
|
||||
home-manager-manual = pkgs.callPackage ./home-manager-manual.nix {
|
||||
home-manager-options = {
|
||||
home-manager = {
|
||||
json = hmOptionsDocs.optionsJSON;
|
||||
};
|
||||
nixos = {
|
||||
json = nixosOptionsDocs.optionsJSON;
|
||||
};
|
||||
nix-darwin = {
|
||||
json = nixDarwinOptionsDocs.optionsJSON;
|
||||
};
|
||||
};
|
||||
inherit revision;
|
||||
};
|
||||
html = home-manager-manual;
|
||||
htmlOpenTool = pkgs.callPackage ./html-open-tool.nix { } { inherit html; };
|
||||
in
|
||||
{
|
||||
options = {
|
||||
# TODO: Use `hmOptionsDocs.optionsJSON` directly once upstream
|
||||
# `nixosOptionsDoc` is more customizable.
|
||||
json =
|
||||
pkgs.runCommand "options.json"
|
||||
{
|
||||
meta.description = "List of Home Manager options in JSON format";
|
||||
}
|
||||
''
|
||||
mkdir -p $out/{share/doc,nix-support}
|
||||
cp -a ${hmOptionsDocs.optionsJSON}/share/doc/nixos $out/share/doc/home-manager
|
||||
substitute \
|
||||
${hmOptionsDocs.optionsJSON}/nix-support/hydra-build-products \
|
||||
$out/nix-support/hydra-build-products \
|
||||
--replace-fail \
|
||||
'${hmOptionsDocs.optionsJSON}/share/doc/nixos' \
|
||||
"$out/share/doc/home-manager"
|
||||
'';
|
||||
};
|
||||
|
||||
manPages = home-configuration-manual;
|
||||
|
||||
manual = { inherit html htmlOpenTool; };
|
||||
|
||||
# Unstable, mainly for CI.
|
||||
jsonModuleMaintainers = pkgs.writeText "hm-module-maintainers.json" (
|
||||
let
|
||||
result = lib.evalModules {
|
||||
modules =
|
||||
import ../modules/modules.nix {
|
||||
inherit lib pkgs;
|
||||
check = false;
|
||||
}
|
||||
++ [ scrubbedPkgsModule ];
|
||||
class = "homeManager";
|
||||
};
|
||||
in
|
||||
builtins.toJSON result.config.meta.maintainers
|
||||
);
|
||||
|
||||
# Unstable, for tests.
|
||||
_internal = { inherit docsLib; };
|
||||
}
|
||||
Generated
-45
@@ -1,45 +0,0 @@
|
||||
{
|
||||
"nodes": {
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1779877693,
|
||||
"narHash": "sha256-NOF9NAREhxr50bbBfVcVOq+ArCMSoe8dP79Pk2uyARk=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "4100e830e085863741bc69b156ec4ccd53ab5be0",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "NixOS",
|
||||
"ref": "nixpkgs-unstable",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"nixpkgs": "nixpkgs",
|
||||
"scss-reset": "scss-reset"
|
||||
}
|
||||
},
|
||||
"scss-reset": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1683906868,
|
||||
"narHash": "sha256-cif5Sx8Ca5vxdw/mNAgpulLH15TwmzyJFNM7JURpoaE=",
|
||||
"owner": "andreymatin",
|
||||
"repo": "scss-reset",
|
||||
"rev": "5a7bd491ac82441e6283fb0d5d54644b913b30c7",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "andreymatin",
|
||||
"ref": "1.4.2",
|
||||
"repo": "scss-reset",
|
||||
"type": "github"
|
||||
}
|
||||
}
|
||||
},
|
||||
"root": "root",
|
||||
"version": 7
|
||||
}
|
||||
@@ -1,88 +0,0 @@
|
||||
{
|
||||
description = "Support developing Home Manager documentation";
|
||||
|
||||
inputs = {
|
||||
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
|
||||
scss-reset = {
|
||||
url = "github:andreymatin/scss-reset/1.4.2";
|
||||
flake = false;
|
||||
};
|
||||
};
|
||||
|
||||
outputs =
|
||||
{
|
||||
nixpkgs,
|
||||
scss-reset,
|
||||
...
|
||||
}:
|
||||
let
|
||||
supportedSystems = [
|
||||
"aarch64-darwin"
|
||||
"aarch64-linux"
|
||||
"i686-linux"
|
||||
"x86_64-darwin"
|
||||
"x86_64-linux"
|
||||
];
|
||||
|
||||
# Note, this should be "the standard library" + HM extensions.
|
||||
lib = import ../modules/lib/stdlib-extended.nix nixpkgs.lib;
|
||||
|
||||
forAllSystems = lib.genAttrs supportedSystems;
|
||||
|
||||
flakePkgs = pkgs: {
|
||||
p-build = pkgs.writeShellScriptBin "p-build" ''
|
||||
set -euo pipefail
|
||||
|
||||
export PATH=${
|
||||
lib.makeBinPath [
|
||||
pkgs.coreutils
|
||||
pkgs.rsass
|
||||
]
|
||||
}
|
||||
|
||||
tmpfile=$(mktemp -d)
|
||||
trap "rm -r $tmpfile" EXIT
|
||||
|
||||
ln -s "${scss-reset}/build" "$tmpfile/scss-reset"
|
||||
|
||||
rsass --load-path="$tmpfile" --style compressed \
|
||||
./static/style.scss > ./static/style.css
|
||||
echo "Generated ./static/style.css"
|
||||
'';
|
||||
};
|
||||
|
||||
releaseInfo = lib.importJSON ../release.json;
|
||||
in
|
||||
{
|
||||
devShells = forAllSystems (
|
||||
system:
|
||||
let
|
||||
pkgs = nixpkgs.legacyPackages.${system};
|
||||
fpkgs = flakePkgs pkgs;
|
||||
in
|
||||
{
|
||||
default = pkgs.mkShell {
|
||||
name = "hm-docs";
|
||||
packages = [ fpkgs.p-build ];
|
||||
};
|
||||
}
|
||||
);
|
||||
|
||||
# Expose the docs outputs
|
||||
packages = forAllSystems (
|
||||
system:
|
||||
let
|
||||
pkgs = nixpkgs.legacyPackages.${system};
|
||||
docs = import ./default.nix {
|
||||
inherit pkgs lib;
|
||||
inherit (releaseInfo) isReleaseBranch release;
|
||||
};
|
||||
in
|
||||
{
|
||||
inherit (docs) manPages jsonModuleMaintainers;
|
||||
inherit (docs.manual) html htmlOpenTool;
|
||||
inherit (docs.options) json;
|
||||
}
|
||||
);
|
||||
};
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
.SH "AUTHORS"
|
||||
.PP
|
||||
Home Manager contributors
|
||||
@@ -1,17 +0,0 @@
|
||||
.TH "HOME-CONFIGURATION\&.NIX" "5" "01/01/1980" "Home Manager"
|
||||
.\" disable hyphenation
|
||||
.nh
|
||||
.\" disable justification (adjust text to left margin only)
|
||||
.ad l
|
||||
.\" enable line breaks after slashes
|
||||
.cflags 4 /
|
||||
.SH "NAME"
|
||||
\fIhome\-configuration\&.nix\fP \- Home Manager configuration specification
|
||||
.SH "DESCRIPTION"
|
||||
.sp
|
||||
The file ~/\&.config/home\-manager/home\&.nix contains the declarative specification of your Home Manager configuration\&. The command \fBhome\-manager\fR takes this file and realises the user environment configuration specified therein\&.
|
||||
.SH "OPTIONS"
|
||||
.PP
|
||||
You can use the following options in
|
||||
home\-configuration\&.nix:
|
||||
.PP
|
||||
@@ -1,91 +0,0 @@
|
||||
{
|
||||
stdenv,
|
||||
lib,
|
||||
callPackage,
|
||||
mdbook,
|
||||
python3,
|
||||
revision,
|
||||
home-manager-options,
|
||||
}:
|
||||
let
|
||||
outputPath = "share/doc/home-manager";
|
||||
mdbookOptions = callPackage ./mdbook/options.nix {
|
||||
manpageUrls = ./manual/manpage-urls.json;
|
||||
inherit revision;
|
||||
optionDocs = {
|
||||
home-manager = {
|
||||
title = "Home Manager Configuration Options";
|
||||
path = "home-manager";
|
||||
prefix = "opt-";
|
||||
json = "${home-manager-options.home-manager.json}";
|
||||
};
|
||||
nixos = {
|
||||
title = "NixOS Configuration Options";
|
||||
path = "nixos";
|
||||
prefix = "nixos-opt-";
|
||||
json = "${home-manager-options.nixos.json}";
|
||||
};
|
||||
nix-darwin = {
|
||||
title = "nix-darwin Configuration Options";
|
||||
path = "nix-darwin";
|
||||
prefix = "nix-darwin-opt-";
|
||||
json = "${home-manager-options.nix-darwin.json}";
|
||||
};
|
||||
};
|
||||
};
|
||||
in
|
||||
stdenv.mkDerivation {
|
||||
name = "home-manager-manual";
|
||||
|
||||
nativeBuildInputs = [
|
||||
mdbook
|
||||
python3
|
||||
];
|
||||
|
||||
src = ./.;
|
||||
|
||||
buildPhase = ''
|
||||
runHook preBuild
|
||||
|
||||
mkdir -p source
|
||||
python3 ${./mdbook/convert-markup.py} "$src/manual" source
|
||||
python3 ${./mdbook/convert-markup.py} \
|
||||
--base-depth 1 \
|
||||
"$src/release-notes" \
|
||||
source/release-notes
|
||||
|
||||
cp -r ${mdbookOptions}/options source/options
|
||||
|
||||
python3 ${./mdbook/substitute-summary.py} \
|
||||
source/SUMMARY.md \
|
||||
${mdbookOptions}/summary/home-manager.md \
|
||||
${mdbookOptions}/summary/nixos.md \
|
||||
${mdbookOptions}/summary/nix-darwin.md
|
||||
|
||||
mdbook build source --dest-dir book
|
||||
|
||||
mkdir -p out
|
||||
cp -r book/* out/
|
||||
|
||||
python3 ${./mdbook/legacy-redirects.py} source out
|
||||
|
||||
runHook postBuild
|
||||
'';
|
||||
|
||||
installPhase = ''
|
||||
dest="$out/${outputPath}"
|
||||
mkdir -p "$(dirname "$dest")"
|
||||
mv out "$dest"
|
||||
|
||||
mkdir -p $out/nix-support/
|
||||
echo "doc manual $dest index.html" >> $out/nix-support/hydra-build-products
|
||||
'';
|
||||
|
||||
passthru = {
|
||||
inherit home-manager-options mdbookOptions;
|
||||
};
|
||||
|
||||
meta = {
|
||||
maintainers = [ lib.maintainers.considerate ];
|
||||
};
|
||||
}
|
||||
@@ -1,424 +0,0 @@
|
||||
.Dd January 1, 1980
|
||||
.Dt home-manager 1
|
||||
.Os Home Manager
|
||||
.\" disable hyphenation
|
||||
.nh
|
||||
.\" disable justification (adjust text to left margin only)
|
||||
.ad l
|
||||
.\" enable line breaks after slashes
|
||||
.cflags 4 /
|
||||
.Sh NAME
|
||||
.Nm home-manager
|
||||
.Nd reconfigure a user environment
|
||||
.
|
||||
.
|
||||
.
|
||||
.Sh SYNOPSIS
|
||||
.Nm home-manager
|
||||
.Bro
|
||||
.Cm build
|
||||
.Cm | init Op Fl -switch Ar dir
|
||||
.Cm | instantiate
|
||||
.Cm | edit
|
||||
.Cm | expire-generations Ar timestamp
|
||||
.Cm | generations
|
||||
.Cm | help
|
||||
.Cm | news
|
||||
.Cm | option Oo Fl -recursive Oc Ar option.name
|
||||
.Cm | packages
|
||||
.Cm | remove-generations Ar ID \&...
|
||||
.Cm | switch
|
||||
.Op Fl -rollback
|
||||
.Op Bro Fl c | Fl -specialisation Brc Ar NAME
|
||||
.Cm | uninstall
|
||||
.Brc
|
||||
.Op Fl A Ar attrPath
|
||||
.Op Fl I Ar path
|
||||
.Op Fl -flake Ar flake-uri
|
||||
.Op Fl b Ar ext
|
||||
.Op Bro Fl f | Fl -file Brc Ar path
|
||||
.Op Bro Fl h | Fl -help Brc
|
||||
.Op Fl -version
|
||||
.Op Bro Fl n | Fl -dry-run Brc
|
||||
.Op Fl -option Ar name Ar value
|
||||
.Op Fl -cores Ar number
|
||||
.Op Bro Fl j | Fl -max-jobs Brc Ar number
|
||||
.Op Fl -option
|
||||
.Op Fl -impure
|
||||
.Op Fl -keep-failed
|
||||
.Op Fl -keep-going
|
||||
.Op Bro Fl L | Fl -print-build-logs Brc
|
||||
.Op Fl -log-format
|
||||
.Op Fl -show-trace
|
||||
.Op Fl -(no-)substitute
|
||||
.Op Fl -no-out-link
|
||||
.Op Fl -refresh
|
||||
.Op Bro Fl v | Fl -verbose Brc
|
||||
.
|
||||
.Sh DESCRIPTION
|
||||
.Pp
|
||||
This command updates the user environment so that it corresponds to the configuration specified in
|
||||
$XDG_CONFIG_HOME/home-manager/home.nix
|
||||
or
|
||||
$XDG_CONFIG_HOME/home-manager/flake.nix.
|
||||
.Pp
|
||||
All operations using this tool expects a sub-command that indicates the operation to perform. It must be one of
|
||||
.Pp
|
||||
.Bl -tag -width Ds
|
||||
|
||||
.It Cm build
|
||||
.RS 4
|
||||
Build configuration into a result directory.
|
||||
.RE
|
||||
|
||||
.It Cm init Op Fl -switch Op Ar dir
|
||||
.RS 14
|
||||
Generates an initial home.nix file for the current user. If Nix flakes are
|
||||
enabled, then this command also generates a flake.nix file.
|
||||
.sp
|
||||
If a path
|
||||
.Ar dir
|
||||
is given then the configuration will be generated in that directory. Otherwise, the configuration will be generated in
|
||||
~/.config/home-manager. The output directory will be created if it does not exist.
|
||||
.sp
|
||||
If the
|
||||
.Fl -switch
|
||||
option is given, then the generated configuration is activated.
|
||||
.sp
|
||||
Note, this command will not overwrite any existing files. It is therefore safe to initialize a configuration, edit it, and then re-run the
|
||||
.Cm init
|
||||
command with
|
||||
.Fl -switch
|
||||
enabled to activate the configuration.
|
||||
.RE
|
||||
.Pp
|
||||
|
||||
.It Cm instantiate
|
||||
.RS 15
|
||||
Instantiate the configuration and print the resulting derivation\&.
|
||||
.RE
|
||||
.Pp
|
||||
|
||||
.It Cm edit
|
||||
.RS 16
|
||||
Open the home configuration using the editor indicated by \fBVISUAL\fR or \fBEDITOR\fR\&.
|
||||
.RE
|
||||
.Pp
|
||||
|
||||
.It Cm expire-generations Ar timestamp
|
||||
.RS 4
|
||||
Remove generations older than
|
||||
.Ar timestamp
|
||||
where
|
||||
.Ar timestamp
|
||||
is interpreted as in the
|
||||
.Fl d
|
||||
argument of the
|
||||
\fBdate\fR(1)
|
||||
tool. For example
|
||||
-30 days or 2018-01-01.
|
||||
.RE
|
||||
.PP
|
||||
|
||||
.It Cm generations
|
||||
.RS 4
|
||||
List all home environment generations\&.
|
||||
.RE
|
||||
.Pp
|
||||
|
||||
.It Cm help
|
||||
.RS 4
|
||||
Print tool help.
|
||||
.RE
|
||||
.Pp
|
||||
|
||||
.It Cm news
|
||||
.RS 4
|
||||
Show news entries in a pager.
|
||||
.RE
|
||||
.PP
|
||||
|
||||
.It Cm option Oo Fl -recursive Oc Ar option.name
|
||||
.RS 4
|
||||
Inspect the given option name in the home configuration, like
|
||||
\fBnixos-option\fR(8)\&.
|
||||
.sp
|
||||
If the
|
||||
.Fl -recursive
|
||||
option is given, print all the values at or below the option name recursively\&.
|
||||
.RE
|
||||
.Pp
|
||||
|
||||
.It Cm packages
|
||||
.RS 4
|
||||
List all packages installed in home-manager-path.
|
||||
.RE
|
||||
.Pp
|
||||
|
||||
.It Cm remove-generations Ar ID \&...
|
||||
.RS 4
|
||||
Remove indicated generations. Use the
|
||||
.Cm generations
|
||||
sub-command to find suitable generation numbers.
|
||||
.RE
|
||||
.Pp
|
||||
|
||||
.It Cm switch Oo Fl -rollback Oc Oo Bro Fl c | Fl -specialisation Brc Ar NAME Oc
|
||||
.RS 4
|
||||
Build and activate the configuration\&.
|
||||
.sp
|
||||
If the
|
||||
.Fl -rollback
|
||||
option is given, then the build is not done, instead roll back to and
|
||||
activate the configuration prior to the current configuration\&.
|
||||
.sp
|
||||
If the
|
||||
.Fl -specialisation
|
||||
option is given, then the named specialisation is activated\&.
|
||||
.RE
|
||||
.Pp
|
||||
|
||||
.It Cm uninstall
|
||||
.RS 4
|
||||
Remove Home Manager from the user environment\&. This will
|
||||
.sp
|
||||
.RE
|
||||
.RS 4
|
||||
.Bl -bullet
|
||||
.It
|
||||
remove all managed files from the home directory,
|
||||
.RE
|
||||
.sp
|
||||
.RS 4
|
||||
.It
|
||||
remove packages installed through Home Manager from the user profile, and
|
||||
.RE
|
||||
.sp
|
||||
.RS 4
|
||||
.It
|
||||
remove all Home Manager generations and make them available for immediate garbage collection\&.
|
||||
.RE
|
||||
.El
|
||||
.sp
|
||||
.RE
|
||||
.El
|
||||
.
|
||||
.Sh OPTIONS
|
||||
.Pp
|
||||
The tool accepts the options
|
||||
.Pp
|
||||
.Bl -tag -width Ds
|
||||
.It Cm Fl A Ar attrPath
|
||||
.RS 4
|
||||
Optional attribute that selects a configuration expression in the configuration file. That is, if
|
||||
home.nix contains
|
||||
.sp
|
||||
.if n \{\
|
||||
.RS 4
|
||||
.\}
|
||||
.nf
|
||||
{
|
||||
joe\-at\-work = {pkgs, \&.\&.\&.}: { home\&.packages = [ pkgs\&.fortune ]; };
|
||||
joe\-at\-home = {pkgs, \&.\&.\&.}: { home\&.packages = [ pkgs\&.cowsay ]; };
|
||||
}
|
||||
.fi
|
||||
.if n \{\
|
||||
.RE
|
||||
.\}
|
||||
.sp
|
||||
then the command
|
||||
\fBhome\-manager switch \-A joe\-at\-work\fR
|
||||
will activate the profile containing the fortune program\&.
|
||||
.RE
|
||||
.PP
|
||||
.It Cm Fl I Ar path
|
||||
.RS 4
|
||||
Add a path to the Nix expression search path. For example, to build a Home Manager profile using a specific Nixpkgs run
|
||||
.Cm home-manager Fl I Ar nixpkgs=/absolute/path/to/nixpkgs build.
|
||||
By default
|
||||
.Ar <nixpkgs>
|
||||
is used.
|
||||
.RE
|
||||
.Pp
|
||||
|
||||
.It Cm Fl -flake Ar flake-uri[#name]
|
||||
.RS 4
|
||||
Build Home Manager configuration from the flake, which must contain the output homeConfigurations.name. If no name is specified it will first try username@hostname and then username.
|
||||
.RE
|
||||
.Pp
|
||||
|
||||
.It Cm Fl b Ar extension
|
||||
.RS 4
|
||||
Enable automatic resolution of collisions between unmanaged and managed files\&. The name of the original file will be suffixed by the given extension\&. For example,
|
||||
.sp
|
||||
.if n \{\
|
||||
.RS 4
|
||||
.\}
|
||||
.nf
|
||||
$ \fBhome\-manager \-b bck switch\fR
|
||||
.fi
|
||||
.if n \{\
|
||||
.RE
|
||||
.\}
|
||||
.sp
|
||||
will cause a colliding file
|
||||
~/\&.config/foo\&.conf
|
||||
to be moved to
|
||||
~/\&.config/foo\&.conf\&.bck\&.
|
||||
.RE
|
||||
.Pp
|
||||
|
||||
.It Cm Fl f Ar path, Fl -file Ar path
|
||||
.RS 4
|
||||
Indicates the path to the Home Manager configuration file. If not given,
|
||||
$XDG_CONFIG_HOME/home-manager/home.nix
|
||||
is used.
|
||||
.RE
|
||||
.Pp
|
||||
.It Cm Fl h, Fl -help
|
||||
.RS 4
|
||||
Prints usage information for the
|
||||
\fBhome\-manager\fR
|
||||
tool.
|
||||
.RE
|
||||
.Pp
|
||||
|
||||
.It Cm Fl -version
|
||||
.RS 4
|
||||
Prints the version number of the
|
||||
\fBhome\-manager\fR
|
||||
tool.
|
||||
.RE
|
||||
.Pp
|
||||
.It Cm Fl n, Fl -dry-run
|
||||
.RS 4
|
||||
Perform a dry-run of the given operation, only prints what actions would be taken.
|
||||
.RE
|
||||
.Pp
|
||||
|
||||
.It Cm Fl -option Ar name Ar value
|
||||
.RS 4
|
||||
Passed on to
|
||||
\fBnix-build\fR(1)\&.
|
||||
.RE
|
||||
.Pp
|
||||
|
||||
.It Cm Fl -cores Ar number
|
||||
.RS 4
|
||||
Passed on to
|
||||
\fBnix-build\fR(1)\&.
|
||||
.RE
|
||||
.Pp
|
||||
|
||||
.It Cm Fl j Ar number, Fl -max-jobs Ar number
|
||||
.RS 4
|
||||
Passed on to
|
||||
\fBnix-build\fR(1)\&.
|
||||
.RE
|
||||
.\" TODO
|
||||
.Pp
|
||||
.It Cm Fl -debug
|
||||
.RS 4
|
||||
Passed on to
|
||||
\fBnix-build\fR(1)\&.
|
||||
.RE
|
||||
.Pp
|
||||
.It Cm Fl -impure
|
||||
.RS 4
|
||||
Passed on to
|
||||
\fBnix-build\fR(1)\&.
|
||||
.RE
|
||||
.Pp
|
||||
|
||||
.It Cm Fl -keep-failed
|
||||
.RS 4
|
||||
Passed on to
|
||||
\fBnix-build\fR(1)\&.
|
||||
.RE
|
||||
.Pp
|
||||
|
||||
.It Cm Fl -keep-going
|
||||
.RS 4
|
||||
Passed on to
|
||||
\fBnix-build\fR(1)\&.
|
||||
.RE
|
||||
.Pp
|
||||
|
||||
.It Cm Fl L, Fl -print-build-logs
|
||||
.RS 4
|
||||
Passed on to
|
||||
\fBnix build\fR()
|
||||
when building from a flake\&.
|
||||
.RE
|
||||
.Pp
|
||||
|
||||
.It Cm Fl -log-format Ar format
|
||||
.RS 4
|
||||
Passed on to
|
||||
\fBnix-build\fR(1)\&.
|
||||
.RE
|
||||
.Pp
|
||||
|
||||
.It Cm Fl -show-trace
|
||||
.RS 4
|
||||
Passed on to
|
||||
\fBnix-build\fR(1)\&.
|
||||
.RE
|
||||
.Pp
|
||||
|
||||
.It Cm Fl -(no-)substitute
|
||||
.RS 4
|
||||
Passed on to
|
||||
\fBnix-build\fR(1)\&.
|
||||
.RE
|
||||
.Pp
|
||||
|
||||
.It Cm Fl -no-out-link
|
||||
.RS 4
|
||||
Passed on to
|
||||
\fBnix-build\fR(1)
|
||||
when running
|
||||
\fBhome\-manager build\fR\&.
|
||||
.RE
|
||||
.Pp
|
||||
|
||||
.It Cm Fl -refresh
|
||||
.RS 4
|
||||
Passed on to
|
||||
\fBnix-build\fR(1)
|
||||
.RE
|
||||
.Pp
|
||||
|
||||
.It Cm Fl v, Fl -verbose
|
||||
.RS 4
|
||||
Activates verbose output\&.
|
||||
.RE
|
||||
.El
|
||||
|
||||
.Sh FILES
|
||||
.Pp
|
||||
$XDG_DATA_HOME/home\-manager/news\-read\-ids
|
||||
.RS 4
|
||||
Identifiers of news items that have been shown\&. Can be deleted to reset the read news indicator\&.
|
||||
.RE
|
||||
|
||||
.Sh BUGS
|
||||
.Pp
|
||||
Please report any bugs on the
|
||||
\m[blue]\fBproject issue tracker\fR\m[]\&.
|
||||
|
||||
.Sh SEE ALSO
|
||||
.Pp
|
||||
\fBhome-configuration.nix\fR(5)
|
||||
|
||||
.Sh AUTHOR
|
||||
.Pp
|
||||
\fBHome Manager contributors\fR
|
||||
.RS 4
|
||||
Author.
|
||||
.RE
|
||||
|
||||
.Sh COPYRIGHT
|
||||
.br
|
||||
Copyright \(co 2017\(en2026 Home Manager contributors
|
||||
.br
|
||||
@@ -1,53 +0,0 @@
|
||||
{
|
||||
writeShellScriptBin,
|
||||
makeDesktopItem,
|
||||
symlinkJoin,
|
||||
}:
|
||||
{
|
||||
html,
|
||||
pathName ? "home-manager",
|
||||
projectName ? pathName,
|
||||
name ? "${pathName}-help",
|
||||
}:
|
||||
let
|
||||
helpScript = writeShellScriptBin name ''
|
||||
set -euo pipefail
|
||||
|
||||
if [[ ! -v BROWSER || -z $BROWSER ]]; then
|
||||
for candidate in xdg-open open w3m; do
|
||||
BROWSER="$(type -P $candidate || true)"
|
||||
if [[ -x $BROWSER ]]; then
|
||||
break;
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
if [[ ! -v BROWSER || -z $BROWSER ]]; then
|
||||
echo "$0: unable to start a web browser; please set \$BROWSER"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
manualPath="${html}/share/doc/${pathName}/index.html"
|
||||
if [[ ! -e $manualPath ]]; then
|
||||
manualPath="${html}/share/doc/${pathName}/index.xhtml"
|
||||
fi
|
||||
|
||||
exec "$BROWSER" "$manualPath"
|
||||
'';
|
||||
|
||||
desktopItem = makeDesktopItem {
|
||||
name = "${pathName}-manual";
|
||||
desktopName = "${projectName} Manual";
|
||||
genericName = "View ${projectName} documentation in a web browser";
|
||||
icon = "nix-snowflake";
|
||||
exec = "${helpScript}/bin/${name}";
|
||||
categories = [ "System" ];
|
||||
};
|
||||
in
|
||||
symlinkJoin {
|
||||
inherit name;
|
||||
paths = [
|
||||
helpScript
|
||||
desktopItem
|
||||
];
|
||||
}
|
||||
@@ -1,14 +0,0 @@
|
||||
# Third-Party Tools and Extensions {#ch-3rd-party}
|
||||
|
||||
Here is a collection of tools and extensions that relate to Home
|
||||
Manager. Note, these are maintained outside the regular Home Manager
|
||||
flow so quality and support may vary wildly. If you encounter problems
|
||||
then please raise them in the corresponding project, not as issues in
|
||||
the Home Manager tracker.
|
||||
|
||||
If you have made something interesting related to Home Manager then you
|
||||
are encouraged to create a PR that expands this chapter.
|
||||
|
||||
```{=include=} sections
|
||||
3rd-party/collections.md
|
||||
```
|
||||
Vendored
-11
@@ -1,11 +0,0 @@
|
||||
# Module Collections {#sec-3rd-party-module-collections}
|
||||
|
||||
- [xhmm --- extra Home Manager
|
||||
modules](https://github.com/schuelermine/xhmm)
|
||||
|
||||
A collection of modules maintained by Anselm Schüler.
|
||||
|
||||
- [Stylix --- System-wide colorscheming and
|
||||
typography](https://github.com/danth/stylix/)
|
||||
|
||||
Configure your applications to get coherent color scheme and font.
|
||||
@@ -1,64 +0,0 @@
|
||||
# Summary
|
||||
|
||||
- [Preface](preface.md)
|
||||
- [Introduction to Home Manager](introduction.md)
|
||||
- [Installing Home Manager](installation.md)
|
||||
- [Standalone installation](installation/standalone.md)
|
||||
- [NixOS module](installation/nixos.md)
|
||||
- [nix-darwin module](installation/nix-darwin.md)
|
||||
- [Using Home Manager](usage.md)
|
||||
- [Configuration Example](usage/configuration.md)
|
||||
- [Rollbacks](usage/rollbacks.md)
|
||||
- [Keeping your ~ safe from harm](usage/dotfiles.md)
|
||||
- [Graphical services](usage/graphical.md)
|
||||
- [GPU on non-NixOS systems](usage/gpu-non-nixos.md)
|
||||
- [Modular Services](usage/modular-services.md)
|
||||
- [Updating](usage/updating.md)
|
||||
- [Upgrading to a new Home Manager release](usage/upgrading.md)
|
||||
- [Nix Flakes](nix-flakes.md)
|
||||
- [Prerequisites](nix-flakes/prerequisites.md)
|
||||
- [Standalone setup](nix-flakes/standalone.md)
|
||||
- [NixOS module](nix-flakes/nixos.md)
|
||||
- [nix-darwin module](nix-flakes/nix-darwin.md)
|
||||
- [flake-parts module](nix-flakes/flake-parts.md)
|
||||
- [Writing Home Manager Modules](writing-modules.md)
|
||||
- [Option Types](writing-modules/types.md)
|
||||
- [Contributing](contributing.md)
|
||||
- [Getting started](contributing/getting-started.md)
|
||||
- [Guidelines](contributing/guidelines.md)
|
||||
- [Release Notes](contributing/release-notes.md)
|
||||
- [News](contributing/news.md)
|
||||
- [Tests](contributing/tests.md)
|
||||
- [Home Manager Internals](internals.md)
|
||||
- [Activation](internals/activation.md)
|
||||
- [Third-Party Tools and Extensions](3rd-party.md)
|
||||
- [Module Collections](3rd-party/collections.md)
|
||||
- [Frequently Asked Questions (FAQ)](faq.md)
|
||||
- [Why is there a collision error when switching generation?](faq/collision.md)
|
||||
- [Why are the session variables not set?](faq/session-variables.md)
|
||||
- [How to set up a configuration for multiple users/machines?](faq/multiple-users-machines.md)
|
||||
- [Why do I get an error message about `ca.desrt.dconf` or `dconf.service`?](faq/ca-desrt-dconf.md)
|
||||
- [How do I install packages from Nixpkgs unstable?](faq/unstable.md)
|
||||
- [How do I change the package used by a module?](faq/change-package-module.md)
|
||||
- [Options](options.md)
|
||||
@HOME_MANAGER_OPTIONS@
|
||||
@NIXOS_OPTIONS@
|
||||
@NIX_DARWIN_OPTIONS@
|
||||
- [Release Notes](release-notes/release-notes.md)
|
||||
- [Release 26.11](release-notes/rl-2611.md)
|
||||
- [Release 26.05](release-notes/rl-2605.md)
|
||||
- [Release 25.11](release-notes/rl-2511.md)
|
||||
- [Release 25.05](release-notes/rl-2505.md)
|
||||
- [Release 24.11](release-notes/rl-2411.md)
|
||||
- [Release 24.05](release-notes/rl-2405.md)
|
||||
- [Release 23.11](release-notes/rl-2311.md)
|
||||
- [Release 23.05](release-notes/rl-2305.md)
|
||||
- [Release 22.11](release-notes/rl-2211.md)
|
||||
- [Release 22.05](release-notes/rl-2205.md)
|
||||
- [Release 21.11](release-notes/rl-2111.md)
|
||||
- [Release 21.05](release-notes/rl-2105.md)
|
||||
- [Release 20.09](release-notes/rl-2009.md)
|
||||
- [Release 20.03](release-notes/rl-2003.md)
|
||||
- [Release 19.09](release-notes/rl-1909.md)
|
||||
- [Release 19.03](release-notes/rl-1903.md)
|
||||
- [Release 18.09](release-notes/rl-1809.md)
|
||||
@@ -1,11 +0,0 @@
|
||||
[book]
|
||||
title = "Home Manager Manual"
|
||||
language = "en"
|
||||
src = "."
|
||||
|
||||
[output.html]
|
||||
git-repository-url = "https://github.com/nix-community/home-manager"
|
||||
|
||||
[output.html.fold]
|
||||
enable = true
|
||||
level = 0
|
||||
@@ -1,28 +0,0 @@
|
||||
# Contributing {#ch-contributing}
|
||||
|
||||
Contributions to Home Manager are very welcome. To make the process as
|
||||
smooth as possible for both you and the Home Manager maintainers we
|
||||
provide some guidelines that we ask you to follow. See [Getting
|
||||
started](contributing/getting-started.md#sec-contrib-getting-started) for information on how to set up
|
||||
a suitable development environment and [Guidelines](contributing/guidelines.md#sec-guidelines) for
|
||||
the actual guidelines.
|
||||
|
||||
This text is mainly directed at those who would like to make code
|
||||
contributions to Home Manager. If you just want to report a bug then
|
||||
first look among the already [open
|
||||
issues](https://github.com/nix-community/home-manager/issues), if you
|
||||
find one matching yours then feel free to comment on it to add any
|
||||
additional information you may have. If no matching issue exists then go
|
||||
to the [new
|
||||
issue](https://github.com/nix-community/home-manager/issues/new) page
|
||||
and write a description of your problem. Include as much information as
|
||||
you can, ideally also include relevant excerpts from your Home Manager
|
||||
configuration.
|
||||
|
||||
```{=include=} sections
|
||||
contributing/getting-started.md
|
||||
contributing/guidelines.md
|
||||
contributing/release-notes.md
|
||||
contributing/news.md
|
||||
contributing/tests.md
|
||||
```
|
||||
@@ -1,43 +0,0 @@
|
||||
# Getting started {#sec-contrib-getting-started}
|
||||
|
||||
If you have not previously forked Home Manager then you need to do that
|
||||
first. Have a look at GitHub's [Fork a
|
||||
repo](https://help.github.com/articles/fork-a-repo/) for instructions on
|
||||
how to do this.
|
||||
|
||||
Once you have a fork of Home Manager you should create a branch starting
|
||||
at the most recent `master` branch. Give your branch a reasonably
|
||||
descriptive name. Commit your changes to this branch and when you are
|
||||
happy with the result and it fulfills [Guidelines](guidelines.md#sec-guidelines) then
|
||||
push the branch to GitHub and [create a pull
|
||||
request](https://help.github.com/articles/creating-a-pull-request/).
|
||||
|
||||
Assuming your clone is at `$HOME/devel/home-manager` then you can make
|
||||
the `home-manager` command use it by either
|
||||
|
||||
1. overriding the default path by using the `-I` command line option:
|
||||
|
||||
``` shell
|
||||
$ home-manager -I home-manager=$HOME/devel/home-manager
|
||||
```
|
||||
|
||||
or, if using [flakes](../nix-flakes/standalone.md#sec-flakes-standalone):
|
||||
|
||||
``` shell
|
||||
$ home-manager --override-input home-manager ~/devel/home-manager
|
||||
```
|
||||
|
||||
or
|
||||
|
||||
2. changing the default path by ensuring your configuration includes
|
||||
|
||||
``` nix
|
||||
programs.home-manager.enable = true;
|
||||
programs.home-manager.path = "$HOME/devel/home-manager";
|
||||
```
|
||||
|
||||
and running `home-manager switch` to activate the change.
|
||||
Afterwards, `home-manager build` and `home-manager switch` will use
|
||||
your cloned repository.
|
||||
|
||||
The first option is good if you only temporarily want to use your clone.
|
||||
@@ -1,292 +0,0 @@
|
||||
# Guidelines {#sec-guidelines}
|
||||
|
||||
If your contribution satisfy the following rules then there is a good
|
||||
chance it will be merged without too much trouble. The rules are
|
||||
enforced by the Home Manager maintainers and to a lesser extent the Home
|
||||
Manager CI system.
|
||||
|
||||
If you are uncertain how these rules affect the change you would like to
|
||||
make then feel free to start a discussion in the
|
||||
[#home-manager](https://webchat.oftc.net/?channels=home-manager) IRC
|
||||
channel, ideally before you start developing.
|
||||
|
||||
## Maintain backward compatibility {#sec-guidelines-back-compat}
|
||||
|
||||
Your contribution should not cause another user's existing configuration
|
||||
to break unless there is a very good reason and the change should be
|
||||
announced to the user through an
|
||||
[assertion](https://nixos.org/manual/nixos/stable/index.html#sec-assertions)
|
||||
or similar.
|
||||
|
||||
Remember that Home Manager is used in many different environments and
|
||||
you should consider how your change may effect others. For example,
|
||||
|
||||
- Does your change work for people that do not use NixOS? Consider
|
||||
other GNU/Linux distributions and macOS.
|
||||
|
||||
- Does your change work for people whose configuration is built on one
|
||||
system and deployed on another system?
|
||||
|
||||
## Keep forward compatibility in mind {#sec-guidelines-forward-compat}
|
||||
|
||||
The master branch of Home Manager tracks the unstable channel of
|
||||
Nixpkgs, which may update package versions at any time. It is therefore
|
||||
important to consider how a package update may affect your code and try
|
||||
to reduce the risk of breakage.
|
||||
|
||||
The most effective way to reduce this risk is to follow the advice in
|
||||
[Add only valuable options](#sec-guidelines-valuable-options).
|
||||
|
||||
## Add only valuable options {#sec-guidelines-valuable-options}
|
||||
|
||||
When creating a new module it is tempting to include every option
|
||||
supported by the software. This is *strongly* discouraged. Providing
|
||||
many options increases maintenance burden and risk of breakage
|
||||
considerably. This is why only the most [important software
|
||||
options](https://github.com/NixOS/rfcs/blob/master/rfcs/0042-config-option.md#valuable-options)
|
||||
should be modeled explicitly. Less important options should be
|
||||
expressible through an `extraConfig` escape hatch.
|
||||
|
||||
A good rule of thumb for the first implementation of a module is to only
|
||||
add explicit options for those settings that absolutely must be set for
|
||||
the software to function correctly. It follows that a module for
|
||||
software that provides sensible default values for all settings would
|
||||
require no explicit options at all.
|
||||
|
||||
If the software uses a structured configuration format like a JSON,
|
||||
YAML, INI, TOML, or even a plain list of key/value pairs then consider
|
||||
using a `settings` option as described in [Nix RFC
|
||||
42](https://github.com/NixOS/rfcs/blob/master/rfcs/0042-config-option.md).
|
||||
|
||||
These guidelines describe the minimum option design requirements. Before
|
||||
submitting a module, compare it against the upstream documentation or
|
||||
source code and verify that the generated files, services, environment
|
||||
variables, and command line arguments all match the upstream behavior
|
||||
you intend to expose.
|
||||
|
||||
If a module installs a package, try to make the package option nullable,
|
||||
for example
|
||||
|
||||
``` nix
|
||||
package = lib.mkPackageOption pkgs "xdg-terminal-exec" { nullable = true; };
|
||||
```
|
||||
|
||||
This lets users keep installation outside Home Manager, for example via
|
||||
`apt` or because the program is built into macOS, while still using the
|
||||
module for configuration. Keeping the package non-nullable is fine when
|
||||
the enabled behavior structurally requires the executable or when
|
||||
package-less support would make the module significantly more complex.
|
||||
|
||||
Avoid generating files for empty settings, null packages, or optional
|
||||
features that are not configured.
|
||||
|
||||
If upstream does not use XDG paths by default but supports changing the
|
||||
configuration location with an environment variable, for example
|
||||
`FOO_HOME`, expose a `configDir` option and use it to respect
|
||||
`home.preferXdgDirectories`.
|
||||
|
||||
## Add relevant tests {#sec-guidelines-add-tests}
|
||||
|
||||
If at all possible, make sure to add new tests and expand existing tests
|
||||
so that your change will keep working in the future. See
|
||||
[Tests](tests.md#sec-tests) for more information about the Home Manager test
|
||||
suite.
|
||||
|
||||
All contributed code *must* pass the test suite.
|
||||
|
||||
## Add relevant documentation {#sec-guidelines-module-maintainer}
|
||||
|
||||
Many code changes require changing the documentation as well. The
|
||||
documentation is written in
|
||||
[Nixpkgs-flavoured Markdown](https://nixos.org/manual/nixpkgs/unstable/#sec-contributing-markup).
|
||||
All text is hosted in Home Manager's Git repository.
|
||||
|
||||
The HTML version of the manual containing both the module option
|
||||
descriptions and the documentation of Home Manager can be generated and
|
||||
opened by typing the following in a shell within a clone of the Home
|
||||
Manager Git repository:
|
||||
|
||||
``` shell
|
||||
$ nix-build -A docs.html
|
||||
$ xdg-open ./result/share/doc/home-manager/index.html
|
||||
```
|
||||
|
||||
When you have made changes to a module, it is a good idea to check that
|
||||
the man page version of the module options looks good:
|
||||
|
||||
``` shell
|
||||
$ nix-build -A docs.manPages
|
||||
$ man ./result/share/man/man5/home-configuration.nix.5
|
||||
```
|
||||
|
||||
## Module Auto-importing {#sec-module-auto-importing}
|
||||
|
||||
Home Manager automatically imports all modules from the `modules/programs/` and
|
||||
`modules/services/` directories. This auto-importing behavior follows these
|
||||
rules:
|
||||
|
||||
- **Nix files**: All `.nix` files in these directories are automatically
|
||||
imported
|
||||
- **Directories**: All subdirectories are automatically imported (typically
|
||||
containing a `default.nix` file)
|
||||
- **Exclusions**: Files and directories starting with an underscore (`_`) are
|
||||
excluded from auto-importing
|
||||
|
||||
This allows for flexible module organization:
|
||||
|
||||
```
|
||||
modules/programs/
|
||||
├── git.nix # Single-file module (imported)
|
||||
├── firefox/ # Multi-file module (imported)
|
||||
│ ├── default.nix
|
||||
│ └── addons.nix
|
||||
├── _experimental.nix # Excluded (starts with _)
|
||||
└── _wip/ # Excluded directory (starts with _)
|
||||
└── newfeature.nix
|
||||
```
|
||||
|
||||
When adding a new module, simply place it in the appropriate directory
|
||||
(`programs/` for user programs, `services/` for user services) and it will be
|
||||
automatically discovered and included in the Home Manager module system.
|
||||
|
||||
## Add yourself as a module maintainer {#_add_yourself_as_a_module_maintainer}
|
||||
|
||||
Every new module *must* include a named maintainer using the
|
||||
`meta.maintainers` attribute. If you are a user of a module that
|
||||
currently lacks a maintainer then please consider adopting it.
|
||||
|
||||
If you are present in the nixpkgs maintainer list then you can use that
|
||||
entry. If you are not then you can add yourself to
|
||||
`modules/lib/maintainers.nix` in the Home Manager project.
|
||||
|
||||
As a maintainer you are expected to respond to issues and
|
||||
pull-requests associated with your module.
|
||||
|
||||
Maintainers are encouraged to join the IRC or Matrix channel and
|
||||
participate when they have opportunity.
|
||||
|
||||
## Format your code {#sec-guidelines-code-style}
|
||||
|
||||
Make sure your code is formatted as described in [Code
|
||||
Style](#sec-code-style). To maintain consistency throughout the project
|
||||
you are encouraged to browse through existing code and adopt its style
|
||||
also in new code.
|
||||
|
||||
## Format your commit messages {#sec-guidelines-commit-message-style}
|
||||
|
||||
Similar to [Format your code](#sec-guidelines-code-style) we encourage a
|
||||
consistent commit message format as described in
|
||||
[Commits](#sec-commit-style).
|
||||
|
||||
## Format your news entries {#sec-guidelines-news-style}
|
||||
|
||||
If your contribution includes a change that should be communicated to
|
||||
users of Home Manager then you can add a news entry. The entry must be
|
||||
formatted as described in [News](news.md#sec-news).
|
||||
|
||||
When new modules are added a news entry should be included.
|
||||
|
||||
News entries and release notes serve different purposes. Release notes
|
||||
should be updated separately when a change affects users migrating
|
||||
between stable releases, such as state version default changes, required
|
||||
migration steps, or broad behavior changes. See
|
||||
[Release Notes](release-notes.md#sec-contributing-release-notes) and [News](news.md#sec-news)
|
||||
for more details.
|
||||
|
||||
## Use conditional modules and news {#sec-guidelines-conditional-modules}
|
||||
|
||||
Home Manager includes a number of modules that are only usable on some
|
||||
of the supported platforms. The most common example of platform specific
|
||||
modules are those that define systemd user services, which only works on
|
||||
Linux systems.
|
||||
|
||||
If you add a module that is platform specific then make sure the module
|
||||
guards platform-specific configuration with an appropriate condition, for
|
||||
example `pkgs.stdenv.hostPlatform.isLinux` or
|
||||
`pkgs.stdenv.hostPlatform.isDarwin`. Modules in `modules/programs/` and
|
||||
`modules/services/` are auto-imported, so the platform condition should live
|
||||
in the module behavior and in any platform-specific tests rather than in a
|
||||
separate module discovery call.
|
||||
|
||||
Similarly, if you are adding a news entry then it should be shown only
|
||||
to users that may find it relevant, see [News](news.md#sec-news) for a
|
||||
description of conditional news.
|
||||
|
||||
## Mind the license {#sec-guidelines-licensing}
|
||||
|
||||
The Home Manager project is covered by the MIT license and we can only
|
||||
accept contributions that fall under this license, or are licensed in a
|
||||
compatible way. When you contribute self written code and documentation
|
||||
it is assumed that you are doing so under the MIT license.
|
||||
|
||||
A potential gotcha with respect to licensing are option descriptions.
|
||||
Often it is convenient to copy from the upstream software documentation.
|
||||
When this is done it is important to verify that the license of the
|
||||
upstream documentation allows redistribution under the terms of the MIT
|
||||
license.
|
||||
|
||||
## Commits {#sec-commit-style}
|
||||
|
||||
The commits in your pull request should be reasonably self-contained,
|
||||
that is, each commit should make sense in isolation. In particular, you
|
||||
will be asked to amend any commit that introduces syntax errors or
|
||||
similar problems even if they are fixed in a later commit.
|
||||
|
||||
Keep commits atomic and separated by concern. For example, a new
|
||||
maintainer entry should be a separate first commit, and a shared module
|
||||
should be committed separately from integrations in existing modules.
|
||||
Pull requests should not include merge commits or fixup commits.
|
||||
|
||||
The commit messages should follow the [seven
|
||||
rules](https://chris.beams.io/posts/git-commit/#seven-rules), except for
|
||||
\"Capitalize the subject line\". We also ask you to include the affected
|
||||
code component or module in the first line. That is, a commit message
|
||||
should follow the template
|
||||
|
||||
{component}: {description}
|
||||
|
||||
{long description}
|
||||
|
||||
where `{component}` refers to the code component (or module) your change
|
||||
affects, `{description}` is a very brief description of your change, and
|
||||
`{long description}` is an optional clarifying description. As a rare
|
||||
exception, if there is no clear component, or your change affects many
|
||||
components, then the `{component}` part is optional. See
|
||||
[example_title](#ex-commit-message) for a commit message that fulfills
|
||||
these requirements.
|
||||
|
||||
## Example commit {#ex-commit-message}
|
||||
|
||||
The commit
|
||||
[69f8e47e9e74c8d3d060ca22e18246b7f7d988ef](https://github.com/nix-community/home-manager/commit/69f8e47e9e74c8d3d060ca22e18246b7f7d988ef)
|
||||
contains the commit message
|
||||
|
||||
```
|
||||
|
||||
starship: allow running in Emacs if vterm is used
|
||||
|
||||
The vterm buffer is backed by libvterm and can handle Starship prompts
|
||||
without issues.
|
||||
```
|
||||
|
||||
which ticks all the boxes necessary to be accepted in Home Manager.
|
||||
|
||||
Finally, when adding a new module, say `programs/foo.nix`, we use the
|
||||
fixed commit format `foo: add module`. You can, of course, still include
|
||||
a long description if you wish.
|
||||
|
||||
## Code Style {#sec-code-style}
|
||||
|
||||
The code in Home Manager is formatted by the [treefmt](https://treefmt.com) tool
|
||||
and the formatting is checked in the pull request tests. Run `nix fmt` or
|
||||
`treefmt` (with required formatters which can be found in `treefmt.toml` in your
|
||||
`$PATH`) inside the project repository before submitting your pull request.
|
||||
|
||||
Keep lines at a reasonable width, ideally 80 characters or less. This
|
||||
also applies to string literals.
|
||||
|
||||
We prefer `lowerCamelCase` for variable and attribute names with the
|
||||
accepted exception of variables directly referencing packages in Nixpkgs
|
||||
which use a hyphenated style. For example, the Home Manager option
|
||||
`services.gpg-agent.enableSshSupport` references the `gpg-agent` package
|
||||
in Nixpkgs.
|
||||
@@ -1,81 +0,0 @@
|
||||
# News {#sec-news}
|
||||
|
||||
Home Manager includes a system for presenting news to the user. When
|
||||
making a change you, therefore, have the option to also include an
|
||||
associated news entry. In general, a news entry should only be added for
|
||||
truly noteworthy news. For example, a bug fix or new option does
|
||||
generally not need a news entry.
|
||||
|
||||
Release notes and news entries serve different purposes. A news entry is
|
||||
shown during Home Manager activation and is useful for day-to-day
|
||||
communication about noteworthy changes, such as a new module, a new
|
||||
feature, or a specific deprecation. Release notes are read from the
|
||||
website documentation and should summarize what users need to know before
|
||||
or during a stable-release upgrade. See
|
||||
[Release Notes](release-notes.md#sec-contributing-release-notes) for guidance on changes
|
||||
that affect stable-release upgrades.
|
||||
|
||||
If you do have a change worthy of a news entry then please add one in
|
||||
[`news`](https://github.com/nix-community/home-manager/blob/master/modules/misc/news)
|
||||
but you should follow some basic guidelines:
|
||||
|
||||
- Use the included news entry generator to create a news entry file:
|
||||
|
||||
``` shell
|
||||
$ nix run .#create-news-entry
|
||||
```
|
||||
|
||||
Alternatively, you can directly use the script:
|
||||
|
||||
``` shell
|
||||
$ nix-shell -A dev --run modules/misc/news/create-news-entry.sh
|
||||
```
|
||||
|
||||
This will create a new file inside the `modules/misc/news` directory
|
||||
with some placeholder information that you can edit.
|
||||
|
||||
- The entry condition should be as specific as possible for changes
|
||||
affecting existing functionality. For example, if you are changing
|
||||
or deprecating a specific option then you could restrict the news to
|
||||
those users who actually use this option. Prefer a targeted
|
||||
condition over skipping useful news only to avoid notifying
|
||||
unaffected users.
|
||||
|
||||
- Wrap the news message so that it will fit in the typical terminal,
|
||||
that is, at most 80 characters wide. Ideally a bit less.
|
||||
|
||||
- Unlike commit messages, news will be read without any connection to
|
||||
the Home Manager source code. It is therefore important to make the
|
||||
message understandable in isolation and to those who do not have
|
||||
knowledge of the Home Manager internals. To this end it should be
|
||||
written in more descriptive, prose like way.
|
||||
|
||||
- If you refer to an option then write its full attribute path. That
|
||||
is, instead of writing
|
||||
|
||||
The option 'foo' has been deprecated, please use 'bar' instead.
|
||||
|
||||
it should read
|
||||
|
||||
The option 'services.myservice.foo' has been deprecated, please
|
||||
use 'services.myservice.bar' instead.
|
||||
|
||||
- A new module, say `foo.nix`, should always include a news entry that
|
||||
has a message along the lines of
|
||||
|
||||
A new module is available: 'services.foo'.
|
||||
|
||||
Since this news announces newly available functionality, its
|
||||
condition should not require `config.services.foo.enable`; otherwise
|
||||
users who may want the new module will not see the news.
|
||||
|
||||
If the module is platform specific, e.g., a service module using
|
||||
systemd, then a condition like
|
||||
|
||||
``` nix
|
||||
condition = hostPlatform.isLinux;
|
||||
```
|
||||
|
||||
should be added to avoid showing the news on unsupported platforms.
|
||||
Use the `create-news-entry` generator described above to scaffold
|
||||
this entry as part of your contribution.
|
||||
@@ -1,24 +0,0 @@
|
||||
# Release Notes {#sec-contributing-release-notes}
|
||||
|
||||
Home Manager release notes are published as part of the website documentation in
|
||||
`docs/release-notes/rl-*.md`. They are intended for users migrating from one
|
||||
stable release to another.
|
||||
|
||||
A change should be mentioned in the release notes when it affects migration
|
||||
between stable releases. This includes changes that require user action or
|
||||
awareness during an upgrade, such as:
|
||||
|
||||
- breaking changes;
|
||||
- default changes guarded by `home.stateVersion`;
|
||||
- required migration steps;
|
||||
- broad behavior changes across platform or integration boundaries;
|
||||
- compatibility changes that can affect existing configurations.
|
||||
|
||||
Do not use the presence or absence of a news entry to decide whether a change
|
||||
belongs in the release notes. A change can require a news entry, a release note,
|
||||
both, or neither.
|
||||
|
||||
When preparing a release, review the commits since the previous stable release
|
||||
and update the upcoming release note file with the migration impact. Prefer
|
||||
concise user-facing descriptions that name the affected option paths and explain
|
||||
required action.
|
||||
@@ -1,252 +0,0 @@
|
||||
# Tests {#sec-tests}
|
||||
|
||||
Home Manager includes a basic test suite and it is highly recommended to
|
||||
include at least one test when adding a module. Tests are typically in
|
||||
the form of \"golden tests\" where, for example, a generated
|
||||
configuration file is compared to a known correct file.
|
||||
|
||||
It is relatively easy to create tests by modeling the existing tests,
|
||||
found in the `tests` project directory.
|
||||
|
||||
## Writing Basic Tests {#sec-tests-basic}
|
||||
|
||||
Home Manager tests use the **NMT** framework, which provides
|
||||
a set of assertion functions to verify that modules generate the expected files
|
||||
and configurations. Tests are written as Nix expressions that define both the
|
||||
Home Manager configuration and the test assertions.
|
||||
|
||||
### Test Structure {#sec-tests-structure}
|
||||
|
||||
A basic test file structure looks like:
|
||||
|
||||
```nix
|
||||
{
|
||||
# Home Manager configuration
|
||||
programs.myprogram = {
|
||||
enable = true;
|
||||
settings = {
|
||||
option = "value";
|
||||
};
|
||||
};
|
||||
|
||||
# NMT test script with assertions
|
||||
nmt.script = ''
|
||||
assertFileExists "home-files/.config/myprogram/config.toml"
|
||||
assertFileContent "home-files/.config/myprogram/config.toml" ${./expected-config.toml}
|
||||
'';
|
||||
}
|
||||
```
|
||||
|
||||
### Test Organization {#sec-tests-organization}
|
||||
|
||||
Tests are organized in the `tests` directory structure:
|
||||
|
||||
- `tests/modules/programs/myprogram/default.nix` - Lists all test cases for the module
|
||||
- `tests/modules/programs/myprogram/basic-configuration.nix` - A basic test case
|
||||
- `tests/modules/programs/myprogram/expected-config.toml` - Expected output file
|
||||
|
||||
The `default.nix` file should list all test cases:
|
||||
|
||||
```nix
|
||||
{
|
||||
myprogram-basic-configuration = ./basic-configuration.nix;
|
||||
myprogram-empty-settings = ./empty-settings.nix;
|
||||
}
|
||||
```
|
||||
|
||||
Prefer keeping related assertions in as few test files as practical.
|
||||
Exercising several cases in one evaluation keeps the test suite cheaper
|
||||
to evaluate and reduces maintenance burden. Split cases into separate
|
||||
files when they need incompatible module configuration, platform
|
||||
conditions, expected assertion failures, or otherwise cannot share one
|
||||
evaluation.
|
||||
|
||||
### Common NMT Assertions {#sec-tests-assertions}
|
||||
|
||||
NMT provides several assertion functions:
|
||||
|
||||
- `assertFileExists "path"` - Verify a file was created
|
||||
- `assertPathNotExists "path"` - Verify a file was NOT created
|
||||
- `assertFileContent "path" expected-file` - Compare file contents
|
||||
- `assertFileRegex "path" "regex"` - Check file matches regex
|
||||
|
||||
For a full reference to the functions available in test scripts, you can look at NMT's
|
||||
[bash-lib](https://git.sr.ht/~rycee/nmt/tree/master/item/bash-lib).
|
||||
|
||||
### Practical Examples {#sec-tests-examples}
|
||||
|
||||
Here are some real-world examples of common test patterns:
|
||||
|
||||
**Testing that a configuration file is generated:**
|
||||
```nix
|
||||
{
|
||||
programs.alacritty = {
|
||||
enable = true;
|
||||
settings.font.size = 12;
|
||||
};
|
||||
|
||||
nmt.script = ''
|
||||
assertFileExists "home-files/.config/alacritty/alacritty.yml"
|
||||
assertFileContains "home-files/.config/alacritty/alacritty.yml" "size: 12"
|
||||
'';
|
||||
}
|
||||
```
|
||||
|
||||
**Testing that no files are created when disabled:**
|
||||
```nix
|
||||
{
|
||||
programs.alacritty.enable = false;
|
||||
|
||||
nmt.script = ''
|
||||
assertPathNotExists "home-files/.config/alacritty"
|
||||
'';
|
||||
}
|
||||
```
|
||||
|
||||
**Testing exact file content against expected output:**
|
||||
```nix
|
||||
{
|
||||
programs.fastfetch = {
|
||||
enable = true;
|
||||
settings.display.color = "blue";
|
||||
};
|
||||
|
||||
nmt.script =
|
||||
let
|
||||
configFile = "home-files/.config/fastfetch/config.jsonc";
|
||||
in
|
||||
''
|
||||
assertFileExists "${configFile}"
|
||||
assertFileContent "${configFile}" ${./expected-config.jsonc}
|
||||
'';
|
||||
}
|
||||
```
|
||||
|
||||
**Testing multiple conditions in one test:**
|
||||
```nix
|
||||
{
|
||||
programs.myprogram = {
|
||||
enable = true;
|
||||
configFile = "custom.conf";
|
||||
extraConfig = "debug = true";
|
||||
};
|
||||
|
||||
nmt.script = ''
|
||||
assertFileExists "home-files/.config/myprogram/custom.conf"
|
||||
assertFileRegex "home-files/.config/myprogram/custom.conf" "debug = true"
|
||||
assertFileRegex "home-files/.config/myprogram/custom.conf" "^# Generated by Home Manager"
|
||||
'';
|
||||
}
|
||||
```
|
||||
|
||||
### Platform-Specific Tests {#sec-tests-platform-specific}
|
||||
|
||||
When a module is platform-specific (Linux-only or Darwin-only), the test's `default.nix`
|
||||
file should use `lib.optionalAttrs` to conditionally expose tests based on the platform.
|
||||
This prevents evaluation errors on unsupported platforms during the test suite runs.
|
||||
|
||||
**Linux-only module tests:**
|
||||
```nix
|
||||
{ lib, pkgs, ... }:
|
||||
|
||||
lib.optionalAttrs pkgs.stdenv.hostPlatform.isLinux {
|
||||
rofi-valid-config = ./valid-config.nix;
|
||||
rofi-custom-theme = ./custom-theme.nix;
|
||||
}
|
||||
```
|
||||
|
||||
**Darwin-only module tests:**
|
||||
```nix
|
||||
{ lib, pkgs, ... }:
|
||||
|
||||
lib.optionalAttrs pkgs.stdenv.hostPlatform.isDarwin {
|
||||
sketchybar-basic = ./basic-configuration.nix;
|
||||
sketchybar-lua-config = ./lua-config.nix;
|
||||
}
|
||||
```
|
||||
|
||||
For cross-platform modules that have packages which need to be stubbed on Darwin,
|
||||
add the package names to `tests/darwinScrublist.nix` to prevent build failures
|
||||
during cross-platform test runs.
|
||||
|
||||
On Linux, packages are automatically scrubbed by the test infrastructure,
|
||||
so tests should normally use the module's default package. Use
|
||||
`test.stubs` or `config.lib.test.mkStubPackage` only when the automatic
|
||||
scrubbing does not model the behavior that the test needs, such as a
|
||||
package with additional files or a non-default executable layout.
|
||||
|
||||
## Using the tests command {#sec-tests-command}
|
||||
|
||||
Home Manager provides a convenient `tests` command for discovering and running tests:
|
||||
|
||||
``` shell
|
||||
# List all available tests
|
||||
$ nix run .#tests -- -l
|
||||
|
||||
# List tests matching a pattern
|
||||
$ nix run .#tests -- -l alacritty
|
||||
|
||||
# Run all tests matching a pattern
|
||||
$ nix run .#tests -- alacritty
|
||||
|
||||
# Run a specific test
|
||||
$ nix run .#tests -- test-alacritty-empty-settings
|
||||
|
||||
# List integration tests
|
||||
$ nix run .#tests -- -t -l
|
||||
|
||||
# Run all integration tests
|
||||
$ nix run .#tests -- -t integration-test-
|
||||
|
||||
# Interactive test selection (requires fzf)
|
||||
$ nix run .#tests -- -i
|
||||
|
||||
# Pass additional nix build flags
|
||||
$ nix run .#tests -- alacritty -- --verbose
|
||||
```
|
||||
|
||||
Integration tests are only exposed on Linux. On other platforms, integration
|
||||
test discovery may report no matching tests.
|
||||
|
||||
## Manual test commands {#sec-tests-manual}
|
||||
|
||||
For advanced usage or CI environments, you can also run tests manually using nix build commands.
|
||||
|
||||
The full Home Manager test suite can be run by executing
|
||||
|
||||
``` shell
|
||||
$ nix-build --pure --option allow-import-from-derivation false tests -A build.all
|
||||
```
|
||||
|
||||
in the project root. List all test cases through
|
||||
|
||||
``` shell
|
||||
$ nix run .#tests -- -l
|
||||
```
|
||||
|
||||
and run an individual test, for example `alacritty-empty-settings`,
|
||||
through
|
||||
|
||||
``` shell
|
||||
$ nix-build --pure tests --option allow-import-from-derivation false -A build.alacritty-empty-settings
|
||||
```
|
||||
|
||||
However, those invocations will impurely source the system's Nixpkgs,
|
||||
and may cause failures. To run against the Nixpkgs from the `flake.lock` file,
|
||||
use instead e.g.
|
||||
|
||||
``` shell
|
||||
$ nix build .#test-all
|
||||
```
|
||||
|
||||
or
|
||||
|
||||
``` shell
|
||||
$ nix build .#test-alacritty-empty-settings
|
||||
```
|
||||
|
||||
Some tests may be marked with `enableLegacyIfd`, those may be run by run with e.g.
|
||||
|
||||
``` shell
|
||||
$ nix-build --pure tests --arg enableLegacyIfd true -A build.mytest
|
||||
```
|
||||
@@ -1,10 +0,0 @@
|
||||
# Frequently Asked Questions (FAQ) {#ch-faq}
|
||||
|
||||
```{=include=} sections
|
||||
faq/collision.md
|
||||
faq/session-variables.md
|
||||
faq/multiple-users-machines.md
|
||||
faq/ca-desrt-dconf.md
|
||||
faq/unstable.md
|
||||
faq/change-package-module.md
|
||||
```
|
||||
@@ -1,19 +0,0 @@
|
||||
# Why do I get an error message about `ca.desrt.dconf` or `dconf.service`? {#_why_do_i_get_an_error_message_about_literal_ca_desrt_dconf_literal_or_literal_dconf_service_literal}
|
||||
|
||||
You are most likely trying to configure something that uses dconf but
|
||||
the DBus session is not aware of the dconf service. The full error you
|
||||
might get is
|
||||
|
||||
error: GDBus.Error:org.freedesktop.DBus.Error.ServiceUnknown: The name ca.desrt.dconf was not provided by any .service files
|
||||
|
||||
or
|
||||
|
||||
error: GDBus.Error:org.freedesktop.systemd1.NoSuchUnit: Unit dconf.service not found.
|
||||
|
||||
The solution on NixOS is to add
|
||||
|
||||
``` nix
|
||||
programs.dconf.enable = true;
|
||||
```
|
||||
|
||||
to your system configuration.
|
||||
@@ -1,117 +0,0 @@
|
||||
# How do I change the package used by a module? {#_how_do_i_change_the_package_used_by_a_module}
|
||||
|
||||
By default Home Manager will install the package provided by your chosen
|
||||
`nixpkgs` channel but occasionally you might end up needing to change
|
||||
this package. This can typically be done in two ways.
|
||||
|
||||
1. If the module provides a `package` option, such as
|
||||
`programs.beets.package`, then this is the recommended way to
|
||||
perform the change. For example,
|
||||
|
||||
``` nix
|
||||
programs.beets.package = pkgs.beets.override { pluginOverrides = { beatport.enable = false; }; };
|
||||
```
|
||||
|
||||
See [Nix pill 17](https://nixos.org/guides/nix-pills/nixpkgs-overriding-packages.html)
|
||||
for more information on package overrides. Alternatively, if you want
|
||||
to use the `beets` package from Nixpkgs unstable, then a configuration like
|
||||
|
||||
``` nix
|
||||
{ pkgs, config, ... }:
|
||||
|
||||
let
|
||||
pkgsUnstable = import <nixpkgs-unstable> {};
|
||||
in
|
||||
{
|
||||
programs.beets.package = pkgsUnstable.beets;
|
||||
|
||||
# …
|
||||
}
|
||||
```
|
||||
|
||||
should work OK. With flakes, pass the unstable package set as
|
||||
described in
|
||||
[How do I install packages from Nixpkgs unstable?](unstable.md#_how_do_i_install_packages_from_nixpkgs_unstable)
|
||||
and then use the extra module argument:
|
||||
|
||||
``` nix
|
||||
{ pkgsUnstable, ... }:
|
||||
|
||||
{
|
||||
programs.beets.package = pkgsUnstable.beets;
|
||||
|
||||
# …
|
||||
}
|
||||
```
|
||||
|
||||
2. If no `package` option is available then you can typically change
|
||||
the relevant package using an
|
||||
[overlay](https://nixos.org/nixpkgs/manual/#chap-overlays).
|
||||
|
||||
For example, if you want to use the `programs.skim` module but use
|
||||
the `skim` package from Nixpkgs unstable, then a configuration like
|
||||
|
||||
``` nix
|
||||
{ pkgs, config, ... }:
|
||||
|
||||
let
|
||||
pkgsUnstable = import <nixpkgs-unstable> {};
|
||||
in
|
||||
|
||||
{
|
||||
programs.skim.enable = true;
|
||||
|
||||
nixpkgs.overlays = [
|
||||
(_final: _prev: {
|
||||
skim = pkgsUnstable.skim;
|
||||
})
|
||||
];
|
||||
|
||||
# …
|
||||
}
|
||||
```
|
||||
|
||||
should work OK.
|
||||
|
||||
The same Home Manager overlay works in a flake-based standalone
|
||||
configuration if `pkgsUnstable` is passed to the Home Manager
|
||||
module:
|
||||
|
||||
``` nix
|
||||
{ pkgsUnstable, ... }:
|
||||
|
||||
{
|
||||
programs.skim.enable = true;
|
||||
|
||||
nixpkgs.overlays = [
|
||||
(_final: _prev: {
|
||||
skim = pkgsUnstable.skim;
|
||||
})
|
||||
];
|
||||
|
||||
# …
|
||||
}
|
||||
```
|
||||
|
||||
This also works when Home Manager is used as a NixOS or nix-darwin
|
||||
module without `home-manager.useGlobalPkgs = true`. If
|
||||
`home-manager.useGlobalPkgs = true` is enabled, Home Manager uses
|
||||
the system package set and the `nixpkgs.*` options inside Home
|
||||
Manager are disabled. In that case, put the overlay in the system
|
||||
configuration instead, for example:
|
||||
|
||||
``` nix
|
||||
{ pkgsUnstable, ... }:
|
||||
|
||||
{
|
||||
nixpkgs.overlays = [
|
||||
(_final: _prev: {
|
||||
skim = pkgsUnstable.skim;
|
||||
})
|
||||
];
|
||||
}
|
||||
```
|
||||
|
||||
In a flake-based NixOS or nix-darwin configuration, pass
|
||||
`pkgsUnstable` to `nixosSystem` or `darwinSystem` with
|
||||
`specialArgs`.
|
||||
@@ -1,47 +0,0 @@
|
||||
# Why is there a collision error when switching generation? {#_why_is_there_a_collision_error_when_switching_generation}
|
||||
|
||||
Home Manager currently installs packages into the user environment,
|
||||
precisely as if the packages were installed through `nix-env --install`.
|
||||
This means that you will get a collision error if your Home Manager
|
||||
configuration attempts to install a package that you already have
|
||||
installed manually, that is, packages that shows up when you run
|
||||
`nix-env --query`.
|
||||
|
||||
For example, imagine you have the `hello` package installed in your
|
||||
environment
|
||||
|
||||
``` shell
|
||||
$ nix-env --query
|
||||
hello-2.10
|
||||
```
|
||||
|
||||
and your Home Manager configuration contains
|
||||
|
||||
``` nix
|
||||
home.packages = [ pkgs.hello ];
|
||||
```
|
||||
|
||||
Then attempting to switch to this configuration will result in an error
|
||||
similar to
|
||||
|
||||
``` shell
|
||||
$ home-manager switch
|
||||
these derivations will be built:
|
||||
/nix/store/xg69wsnd1rp8xgs9qfsjal017nf0ldhm-home-manager-path.drv
|
||||
[…]
|
||||
Activating installPackages
|
||||
replacing old ‘home-manager-path’
|
||||
installing ‘home-manager-path’
|
||||
building path(s) ‘/nix/store/b5c0asjz9f06l52l9812w6k39ifr49jj-user-environment’
|
||||
Wide character in die at /nix/store/64jc9gd2rkbgdb4yjx3nrgc91bpjj5ky-buildenv.pl line 79.
|
||||
collision between ‘/nix/store/fmwa4axzghz11cnln5absh31nbhs9lq1-home-manager-path/bin/hello’ and ‘/nix/store/c2wyl8b9p4afivpcz8jplc9kis8rj36d-hello-2.10/bin/hello’; use ‘nix-env --set-flag priority NUMBER PKGNAME’ to change the priority of one of the conflicting packages
|
||||
builder for ‘/nix/store/b37x3s7pzxbasfqhaca5dqbf3pjjw0ip-user-environment.drv’ failed with exit code 2
|
||||
error: build of ‘/nix/store/b37x3s7pzxbasfqhaca5dqbf3pjjw0ip-user-environment.drv’ failed
|
||||
```
|
||||
|
||||
The solution is typically to uninstall the package from the environment
|
||||
using `nix-env --uninstall` and reattempt the Home Manager generation
|
||||
switch.
|
||||
|
||||
You could also opt to uninstall *all* of the packages from your profile
|
||||
with `nix-env --uninstall '*'`.
|
||||
@@ -1,39 +0,0 @@
|
||||
# How to set up a configuration for multiple users/machines? {#_how_to_set_up_a_configuration_for_multiple_users_machines}
|
||||
|
||||
A typical way to prepare a repository of configurations for multiple
|
||||
logins and machines is to prepare one \"top-level\" file for each unique
|
||||
combination.
|
||||
|
||||
For example, if you have two machines, called \"kronos\" and \"rhea\" on
|
||||
which you want to configure your user \"jane\" then you could create the
|
||||
files
|
||||
|
||||
- `kronos-jane.nix`,
|
||||
|
||||
- `rhea-jane.nix`, and
|
||||
|
||||
- `common.nix`
|
||||
|
||||
in your repository. On the kronos and rhea machines you can then make
|
||||
`~jane/.config/home-manager/home.nix` be a symbolic link to the
|
||||
corresponding file in your configuration repository.
|
||||
|
||||
The `kronos-jane.nix` and `rhea-jane.nix` files follow the format
|
||||
|
||||
``` nix
|
||||
{ ... }:
|
||||
|
||||
{
|
||||
imports = [ ./common.nix ];
|
||||
|
||||
# Various options that are specific for this machine/user.
|
||||
}
|
||||
```
|
||||
|
||||
while the `common.nix` file contains configuration shared across the two
|
||||
logins. Of course, instead of just a single `common.nix` file you can
|
||||
have multiple ones, even one per program or service.
|
||||
|
||||
You can get some inspiration from the [Post your home-manager home.nix
|
||||
file!](https://www.reddit.com/r/NixOS/comments/9bb9h9/post_your_homemanager_homenix_file/)
|
||||
Reddit thread.
|
||||
@@ -1,27 +0,0 @@
|
||||
# Why are the session variables not set? {#_why_are_the_session_variables_not_set}
|
||||
|
||||
Home Manager is only able to set session variables automatically if it
|
||||
manages your Bash, Z shell, or fish shell configuration. To enable such
|
||||
management you use [programs.bash.enable](#opt-programs.bash.enable),
|
||||
[programs.zsh.enable](#opt-programs.zsh.enable), or [programs.fish.enable](#opt-programs.fish.enable).
|
||||
|
||||
If you don't want to let Home Manager manage your shell then you will
|
||||
have to manually source the
|
||||
`~/.nix-profile/etc/profile.d/hm-session-vars.sh` file in an appropriate
|
||||
way. In Bash and Z shell this can be done by adding
|
||||
|
||||
``` bash
|
||||
. "$HOME/.nix-profile/etc/profile.d/hm-session-vars.sh"
|
||||
```
|
||||
|
||||
to your `.profile` and `.zshrc` files, respectively. The
|
||||
`hm-session-vars.sh` file should work in most Bourne-like shells. For
|
||||
fish shell, it is possible to source it using [the foreign-env
|
||||
plugin](https://github.com/oh-my-fish/plugin-foreign-env) or using the builtin
|
||||
[babelfish](https://github.com/bouk/babelfish)-translated variables:
|
||||
|
||||
``` bash
|
||||
fenv source "$HOME/.nix-profile/etc/profile.d/hm-session-vars.sh" > /dev/null
|
||||
# or
|
||||
source "$HOME/.nix-profile/etc/profile.d/hm-session-vars.fish"
|
||||
```
|
||||
@@ -1,111 +0,0 @@
|
||||
# How do I install packages from Nixpkgs unstable? {#_how_do_i_install_packages_from_nixpkgs_unstable}
|
||||
|
||||
If you are using a stable version of Nixpkgs but would like to install
|
||||
some particular packages from Nixpkgs unstable -- or some other channel
|
||||
-- then you can import the unstable Nixpkgs and refer to its packages
|
||||
within your configuration.
|
||||
|
||||
With channels, something like
|
||||
|
||||
``` nix
|
||||
{ pkgs, config, ... }:
|
||||
|
||||
let
|
||||
pkgsUnstable = import <nixpkgs-unstable> {};
|
||||
in
|
||||
{
|
||||
home.packages = [
|
||||
pkgsUnstable.foo
|
||||
];
|
||||
# …
|
||||
}
|
||||
```
|
||||
|
||||
should work provided you have a Nix channel called `nixpkgs-unstable`.
|
||||
|
||||
You can add the `nixpkgs-unstable` channel by running
|
||||
|
||||
``` shell
|
||||
$ nix-channel --add https://nixos.org/channels/nixpkgs-unstable nixpkgs-unstable
|
||||
$ nix-channel --update
|
||||
```
|
||||
|
||||
With flakes, add another Nixpkgs input and pass its packages to your
|
||||
Home Manager modules. For example, a standalone Home Manager flake can
|
||||
define the following. Replace 25.11 with the release branch your
|
||||
configuration follows.
|
||||
|
||||
``` nix
|
||||
{
|
||||
inputs = {
|
||||
nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.11";
|
||||
nixpkgs-unstable.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
|
||||
home-manager.url = "github:nix-community/home-manager/release-25.11";
|
||||
};
|
||||
|
||||
outputs =
|
||||
{ nixpkgs, nixpkgs-unstable, home-manager, ... }:
|
||||
let
|
||||
# Replace this with the system of your Home Manager configuration.
|
||||
system = "x86_64-linux";
|
||||
pkgs = nixpkgs.legacyPackages.${system};
|
||||
pkgsUnstable = nixpkgs-unstable.legacyPackages.${system};
|
||||
in
|
||||
{
|
||||
homeConfigurations.jdoe = home-manager.lib.homeManagerConfiguration {
|
||||
inherit pkgs;
|
||||
extraSpecialArgs = { inherit pkgsUnstable; };
|
||||
modules = [ ./home.nix ];
|
||||
};
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
and then use the extra argument in `home.nix`:
|
||||
|
||||
``` nix
|
||||
{ pkgsUnstable, ... }:
|
||||
|
||||
{
|
||||
home.packages = [
|
||||
pkgsUnstable.foo
|
||||
];
|
||||
}
|
||||
```
|
||||
|
||||
When Home Manager is used as a NixOS or nix-darwin module, pass the
|
||||
extra package set with `home-manager.extraSpecialArgs` in the system
|
||||
configuration:
|
||||
|
||||
``` nix
|
||||
outputs =
|
||||
{ nixpkgs, nixpkgs-unstable, home-manager, ... }:
|
||||
let
|
||||
# Replace this with the system of your NixOS or nix-darwin configuration.
|
||||
system = "x86_64-linux";
|
||||
in
|
||||
{
|
||||
nixosConfigurations.hostname = nixpkgs.lib.nixosSystem {
|
||||
inherit system;
|
||||
modules = [
|
||||
home-manager.nixosModules.home-manager
|
||||
({ config, ... }: {
|
||||
home-manager.extraSpecialArgs = {
|
||||
pkgsUnstable = import nixpkgs-unstable {
|
||||
inherit system;
|
||||
config = config.nixpkgs.config;
|
||||
overlays = config.nixpkgs.overlays;
|
||||
};
|
||||
|
||||
# If you use a stock Nixpkgs configuration, you can use:
|
||||
# pkgsUnstable = nixpkgs-unstable.legacyPackages.${system};
|
||||
};
|
||||
})
|
||||
];
|
||||
};
|
||||
};
|
||||
```
|
||||
|
||||
The nix-darwin setup is the same pattern with
|
||||
`darwin.lib.darwinSystem` and
|
||||
`home-manager.darwinModules.home-manager`.
|
||||
@@ -1,35 +0,0 @@
|
||||
# Installing Home Manager {#ch-installation}
|
||||
|
||||
Home Manager can be used in three primary ways:
|
||||
|
||||
1. Using the standalone `home-manager` tool. For platforms other than
|
||||
NixOS and Darwin, this is the only available choice. It is also
|
||||
recommended for people on NixOS or Darwin that want to manage their
|
||||
home directory independently of the system as a whole. See
|
||||
[Standalone installation](installation/standalone.md#sec-install-standalone) for instructions
|
||||
on how to perform this installation.
|
||||
|
||||
2. As a module within a NixOS system configuration. This allows the
|
||||
user profiles to be built together with the system when running
|
||||
`nixos-rebuild`. See [NixOS module](installation/nixos.md#sec-install-nixos-module) for a
|
||||
description of this setup.
|
||||
|
||||
3. As a module within a
|
||||
[nix-darwin](https://github.com/nix-darwin/nix-darwin/) system
|
||||
configuration. This allows the user profiles to be built together
|
||||
with the system when running `darwin-rebuild`. See [nix-darwin
|
||||
module](installation/nix-darwin.md#sec-install-nix-darwin-module) for a description of this
|
||||
setup.
|
||||
|
||||
:::{.note}
|
||||
In this chapter we describe how to install Home Manager in the standard
|
||||
way using channels. If you prefer to use [Nix
|
||||
Flakes](https://wiki.nixos.org/wiki/Flakes) then please see the instructions
|
||||
in [nix flakes](nix-flakes.md#ch-nix-flakes).
|
||||
:::
|
||||
|
||||
```{=include=} sections
|
||||
installation/standalone.md
|
||||
installation/nixos.md
|
||||
installation/nix-darwin.md
|
||||
```
|
||||
@@ -1,128 +0,0 @@
|
||||
# nix-darwin module {#sec-install-nix-darwin-module}
|
||||
|
||||
Home Manager provides a module that allows you to prepare user
|
||||
environments directly from the
|
||||
[nix-darwin](https://github.com/nix-darwin/nix-darwin/) configuration file,
|
||||
which often is more convenient than using the `home-manager` tool.
|
||||
|
||||
To make the nix-darwin module available for use you must `import` it
|
||||
into your system configuration. This is most conveniently done by adding
|
||||
a Home Manager channel. For example, if you are following Nixpkgs master
|
||||
or an unstable channel, you can run
|
||||
|
||||
``` shell
|
||||
$ nix-channel --add https://github.com/nix-community/home-manager/archive/master.tar.gz home-manager
|
||||
$ nix-channel --update
|
||||
```
|
||||
|
||||
and if you follow a Nixpkgs version 26.05 channel, you can run
|
||||
|
||||
``` shell
|
||||
$ nix-channel --add https://github.com/nix-community/home-manager/archive/release-26.05.tar.gz home-manager
|
||||
$ nix-channel --update
|
||||
```
|
||||
|
||||
It is then possible to add
|
||||
|
||||
``` nix
|
||||
imports = [ <home-manager/nix-darwin> ];
|
||||
```
|
||||
|
||||
to your nix-darwin `configuration.nix` file, which will introduce a
|
||||
`home-manager.users` option whose type is an attribute set that maps
|
||||
user names to Home Manager configurations.
|
||||
|
||||
For example, a nix-darwin configuration may include the lines
|
||||
|
||||
``` nix
|
||||
users.users.eve = {
|
||||
name = "eve";
|
||||
home = "/Users/eve";
|
||||
};
|
||||
home-manager.users.eve = { pkgs, ... }: {
|
||||
home.packages = [ pkgs.atool pkgs.httpie ];
|
||||
programs.bash.enable = true;
|
||||
|
||||
# The state version is required and should stay at the version you
|
||||
# originally installed.
|
||||
home.stateVersion = "26.05";
|
||||
};
|
||||
```
|
||||
|
||||
and after a `darwin-rebuild switch` the user eve's environment should
|
||||
include a basic Bash configuration and the packages atool and httpie.
|
||||
|
||||
Home Manager activation runs as part of nix-darwin activation for each
|
||||
configured user.
|
||||
|
||||
If you do not plan on having Home Manager manage your shell
|
||||
configuration then you must add either
|
||||
|
||||
``` bash
|
||||
. "$HOME/.nix-profile/etc/profile.d/hm-session-vars.sh"
|
||||
```
|
||||
|
||||
or
|
||||
|
||||
``` bash
|
||||
. "/etc/profiles/per-user/$USER/etc/profile.d/hm-session-vars.sh"
|
||||
```
|
||||
|
||||
to your shell configuration, depending on whether
|
||||
[home-manager.useUserPackages](#nix-darwin-opt-home-manager.useUserPackages) is enabled. This
|
||||
file can be sourced directly by POSIX.2-like shells such as
|
||||
[Bash](https://www.gnu.org/software/bash/) or [Z
|
||||
shell](http://zsh.sourceforge.net/). [Fish](https://fishshell.com) users
|
||||
can use utilities such as
|
||||
[foreign-env](https://github.com/oh-my-fish/plugin-foreign-env) or
|
||||
[babelfish](https://github.com/bouk/babelfish).
|
||||
|
||||
:::{.note}
|
||||
By default user packages will not be ignored in favor of
|
||||
`environment.systemPackages`, but they will be installed to
|
||||
`/etc/profiles/per-user/$USERNAME` if
|
||||
|
||||
``` nix
|
||||
home-manager.useUserPackages = true;
|
||||
```
|
||||
|
||||
is added to the nix-darwin configuration. This option may become the
|
||||
default value in the future.
|
||||
:::
|
||||
|
||||
:::{.note}
|
||||
By default, Home Manager uses a private `pkgs` instance that is
|
||||
configured via the `home-manager.users.<name>.nixpkgs` options. To
|
||||
instead use the global `pkgs` that is configured via the system level
|
||||
`nixpkgs` options, set
|
||||
|
||||
``` nix
|
||||
home-manager.useGlobalPkgs = true;
|
||||
```
|
||||
|
||||
This saves an extra Nixpkgs evaluation, adds consistency, and removes
|
||||
the dependency on `NIX_PATH`, which is otherwise used for importing
|
||||
Nixpkgs.
|
||||
:::
|
||||
|
||||
:::{.note}
|
||||
Home Manager passes extra module arguments to each
|
||||
`home-manager.users.<name>` module:
|
||||
|
||||
``` nix
|
||||
{ lib, pkgs, osConfig, darwinConfig, osClass, modulesPath, ... }:
|
||||
```
|
||||
|
||||
Here `osConfig` contains the system's nix-darwin configuration and
|
||||
`darwinConfig` is a Darwin-specific alias for the same value. The `lib`
|
||||
argument is Home Manager's extended library. You can pass additional module
|
||||
arguments with `home-manager.extraSpecialArgs`.
|
||||
:::
|
||||
|
||||
:::{.note}
|
||||
Use `home-manager.sharedModules` to add Home Manager modules to every user
|
||||
declared under `home-manager.users`.
|
||||
:::
|
||||
|
||||
Once installed you can see [Using Home Manager](../usage.md#ch-usage) for a more detailed
|
||||
description of Home Manager and how to use it.
|
||||
@@ -1,175 +0,0 @@
|
||||
# NixOS module {#sec-install-nixos-module}
|
||||
|
||||
Home Manager provides a NixOS module that allows you to prepare user
|
||||
environments directly from the system configuration file, which often is
|
||||
more convenient than using the `home-manager` tool. It also opens up
|
||||
additional possibilities, for example, to automatically configure user
|
||||
environments in NixOS declarative containers or on systems deployed
|
||||
through NixOps.
|
||||
|
||||
To make the NixOS module available for use you must `import` it into
|
||||
your system configuration. This is most conveniently done by adding a
|
||||
Home Manager channel to the root user. For example, if you are following
|
||||
Nixpkgs master or an unstable channel, you can run
|
||||
|
||||
``` shell
|
||||
$ sudo nix-channel --add https://github.com/nix-community/home-manager/archive/master.tar.gz home-manager
|
||||
$ sudo nix-channel --update
|
||||
```
|
||||
|
||||
and if you follow a Nixpkgs version 26.05 channel, you can run
|
||||
|
||||
``` shell
|
||||
$ sudo nix-channel --add https://github.com/nix-community/home-manager/archive/release-26.05.tar.gz home-manager
|
||||
$ sudo nix-channel --update
|
||||
```
|
||||
|
||||
It is then possible to add
|
||||
|
||||
``` nix
|
||||
imports = [ <home-manager/nixos> ];
|
||||
```
|
||||
|
||||
to your system `configuration.nix` file, which will introduce a new
|
||||
NixOS option called `home-manager.users` whose type is an attribute set
|
||||
that maps user names to Home Manager configurations.
|
||||
|
||||
Alternatively, home-manager installation can be done declaratively through configuration.nix using the following syntax:
|
||||
```nix
|
||||
{ config, pkgs, lib, ... }:
|
||||
|
||||
let
|
||||
home-manager = builtins.fetchTarball https://github.com/nix-community/home-manager/archive/release-26.05.tar.gz;
|
||||
in
|
||||
{
|
||||
imports =
|
||||
[
|
||||
(import "${home-manager}/nixos")
|
||||
];
|
||||
|
||||
users.users.eve.isNormalUser = true;
|
||||
home-manager.users.eve = { pkgs, ... }: {
|
||||
home.packages = [ pkgs.atool pkgs.httpie ];
|
||||
programs.bash.enable = true;
|
||||
|
||||
# The state version is required and should stay at the version you
|
||||
# originally installed.
|
||||
home.stateVersion = "26.05";
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
For example, a NixOS configuration may include the lines
|
||||
|
||||
``` nix
|
||||
users.users.eve.isNormalUser = true;
|
||||
home-manager.users.eve = { pkgs, ... }: {
|
||||
home.packages = [ pkgs.atool pkgs.httpie ];
|
||||
programs.bash.enable = true;
|
||||
|
||||
# This value determines the Home Manager release that your configuration is
|
||||
# compatible with. This helps avoid breakage when a new Home Manager release
|
||||
# introduces backwards incompatible changes.
|
||||
#
|
||||
# You should not change this value, even if you update Home Manager. If you do
|
||||
# want to update the value, then make sure to first check the Home Manager
|
||||
# release notes.
|
||||
home.stateVersion = "26.05"; # Please read the comment before changing.
|
||||
|
||||
};
|
||||
```
|
||||
|
||||
and after a `sudo nixos-rebuild switch` the user eve's environment
|
||||
should include a basic Bash configuration and the packages atool and
|
||||
httpie.
|
||||
|
||||
:::{.note}
|
||||
If `nixos-rebuild switch` does not result in the environment you expect,
|
||||
then the service to inspect depends on the activation mode.
|
||||
|
||||
By default, Home Manager activates each configured user during boot and
|
||||
system rebuilds through a NixOS system service:
|
||||
|
||||
``` shell
|
||||
$ systemctl status "home-manager-$USER.service"
|
||||
```
|
||||
|
||||
If `home-manager.startAsUserService = true` is set, Home Manager instead
|
||||
activates through the user's systemd service:
|
||||
|
||||
``` shell
|
||||
$ systemctl --user status home-manager.service
|
||||
```
|
||||
:::
|
||||
|
||||
If you do not plan on having Home Manager manage your shell
|
||||
configuration then you must add either
|
||||
|
||||
``` bash
|
||||
. "$HOME/.nix-profile/etc/profile.d/hm-session-vars.sh"
|
||||
```
|
||||
|
||||
or
|
||||
|
||||
``` bash
|
||||
. "/etc/profiles/per-user/$USER/etc/profile.d/hm-session-vars.sh"
|
||||
```
|
||||
|
||||
to your shell configuration, depending on whether
|
||||
[home-manager.useUserPackages](#nixos-opt-home-manager.useUserPackages) is enabled. This file can
|
||||
be sourced directly by POSIX.2-like shells such as
|
||||
[Bash](https://www.gnu.org/software/bash/) or [Z
|
||||
shell](http://zsh.sourceforge.net/). [Fish](https://fishshell.com) users
|
||||
can use utilities such as
|
||||
[foreign-env](https://github.com/oh-my-fish/plugin-foreign-env) or
|
||||
[babelfish](https://github.com/bouk/babelfish).
|
||||
|
||||
:::{.note}
|
||||
By default packages will be installed to `$HOME/.nix-profile` but they
|
||||
can be installed to `/etc/profiles` if
|
||||
|
||||
``` nix
|
||||
home-manager.useUserPackages = true;
|
||||
```
|
||||
|
||||
is added to the system configuration. This is necessary if, for example,
|
||||
you wish to use `nixos-rebuild build-vm`. This option may become the
|
||||
default value in the future.
|
||||
:::
|
||||
|
||||
:::{.note}
|
||||
By default, Home Manager uses a private `pkgs` instance that is
|
||||
configured via the `home-manager.users.<name>.nixpkgs` options. To
|
||||
instead use the global `pkgs` that is configured via the system level
|
||||
`nixpkgs` options, set
|
||||
|
||||
``` nix
|
||||
home-manager.useGlobalPkgs = true;
|
||||
```
|
||||
|
||||
This saves an extra Nixpkgs evaluation, adds consistency, and removes
|
||||
the dependency on `NIX_PATH`, which is otherwise used for importing
|
||||
Nixpkgs.
|
||||
:::
|
||||
|
||||
:::{.note}
|
||||
Home Manager passes extra module arguments to each
|
||||
`home-manager.users.<name>` module:
|
||||
|
||||
``` nix
|
||||
{ lib, pkgs, osConfig, nixosConfig, osClass, modulesPath, ... }:
|
||||
```
|
||||
|
||||
Here `osConfig` contains the system's NixOS configuration and `nixosConfig`
|
||||
is a NixOS-specific alias for the same value. The `lib` argument is Home
|
||||
Manager's extended library. You can pass additional module arguments with
|
||||
`home-manager.extraSpecialArgs`.
|
||||
:::
|
||||
|
||||
:::{.note}
|
||||
Use `home-manager.sharedModules` to add Home Manager modules to every user
|
||||
declared under `home-manager.users`.
|
||||
:::
|
||||
|
||||
Once installed you can see [Using Home Manager](../usage.md#ch-usage) for a more detailed
|
||||
description of Home Manager and how to use it.
|
||||
@@ -1,75 +0,0 @@
|
||||
# Standalone installation {#sec-install-standalone}
|
||||
|
||||
1. Make sure you have a working Nix installation. Specifically, make
|
||||
sure that your user is able to build and install Nix packages. For
|
||||
example, you should be able to successfully run a command like
|
||||
`nix-instantiate '<nixpkgs>' -A hello` without having to switch to
|
||||
the root user. For a multi-user install of Nix this means that your
|
||||
user must be covered by the
|
||||
[`allowed-users`](https://nixos.org/nix/manual/#conf-allowed-users)
|
||||
Nix option. On NixOS you can control this option using the
|
||||
[`nix.settings.allowed-users`](https://nixos.org/manual/nixos/stable/options.html#opt-nix.settings.allowed-users)
|
||||
system option.
|
||||
|
||||
2. Add the appropriate Home Manager channel. If you are following
|
||||
Nixpkgs master or an unstable channel you can run
|
||||
|
||||
``` shell
|
||||
$ nix-channel --add https://github.com/nix-community/home-manager/archive/master.tar.gz home-manager
|
||||
$ nix-channel --update
|
||||
```
|
||||
|
||||
and if you follow a Nixpkgs version 26.05 channel you can run
|
||||
|
||||
``` shell
|
||||
$ nix-channel --add https://github.com/nix-community/home-manager/archive/release-26.05.tar.gz home-manager
|
||||
$ nix-channel --update
|
||||
```
|
||||
|
||||
3. Run the Home Manager installation command and create the first Home
|
||||
Manager generation:
|
||||
|
||||
``` shell
|
||||
$ nix-shell '<home-manager>' -A install
|
||||
```
|
||||
|
||||
Once finished, Home Manager should be active and available in your
|
||||
user environment.
|
||||
|
||||
4. If you do not plan on having Home Manager manage your shell
|
||||
configuration then you must source the
|
||||
|
||||
``` bash
|
||||
$HOME/.nix-profile/etc/profile.d/hm-session-vars.sh
|
||||
```
|
||||
|
||||
file in your shell configuration. Alternatively source
|
||||
|
||||
``` bash
|
||||
/etc/profiles/per-user/$USER/etc/profile.d/hm-session-vars.sh
|
||||
```
|
||||
|
||||
when managing home configuration together with system configuration.
|
||||
|
||||
This file can be sourced directly by POSIX.2-like shells such as
|
||||
[Bash](https://www.gnu.org/software/bash/) or [Z
|
||||
shell](http://zsh.sourceforge.net/). [Fish](https://fishshell.com)
|
||||
users can use utilities such as
|
||||
[foreign-env](https://github.com/oh-my-fish/plugin-foreign-env) or
|
||||
[babelfish](https://github.com/bouk/babelfish).
|
||||
|
||||
For example, if you use Bash then add
|
||||
|
||||
``` bash
|
||||
. "$HOME/.nix-profile/etc/profile.d/hm-session-vars.sh"
|
||||
```
|
||||
|
||||
to your `~/.profile` file.
|
||||
|
||||
If instead of using channels you want to run Home Manager from a Git
|
||||
checkout of the repository then you can use the
|
||||
[home-manager.path](#opt-programs.home-manager.path) option to specify the absolute
|
||||
path to the repository.
|
||||
|
||||
Once installed you can see [Using Home Manager](../usage.md#ch-usage) for a more detailed
|
||||
description of Home Manager and how to use it.
|
||||
@@ -1,11 +0,0 @@
|
||||
# Home Manager Internals {#ch-internals}
|
||||
|
||||
This chapter collects some documentation about the internal workings
|
||||
of Home Manager. The information here is mostly aimed to developers of
|
||||
Home Manager and those who do non-trivial integration with Home
|
||||
Manager.
|
||||
|
||||
|
||||
```{=include=} sections
|
||||
internals/activation.md
|
||||
```
|
||||
@@ -1,40 +0,0 @@
|
||||
# Activation {#sec-internals-activation}
|
||||
|
||||
Activating a Home Manager configuration ensures that the built
|
||||
configuration is introduced into the user's environment. The
|
||||
activation is performed by a suitably named script
|
||||
{command}`activate`. This script is generated as part of the
|
||||
configuration build and is placed in the root of the build output.
|
||||
|
||||
The activation script is implemented in the Bash language and consists
|
||||
of initialization code followed by a number of _activation script
|
||||
blocks_. These blocks are specified using the
|
||||
[home.activation](#opt-home.activation) option. The blocks may have
|
||||
dependencies among themselves and the generated activation script will
|
||||
contain the blocks serialized such that the dependencies are
|
||||
satisfied. A dependency cycle causes a failure when the configuration
|
||||
is built.
|
||||
|
||||
Historically, the activation script has been responsible for creating
|
||||
a new generation of the `home-manager` Nix profile. The more modern
|
||||
way, however, is to let the _activation driver_ – that is, the
|
||||
software calling the activation script – manage the profile. Indeed,
|
||||
in some cases we may not have a `home-manager` profile at all! This is
|
||||
the case when Home Manager is used as a NixOS or nix-darwin module, in
|
||||
these cases the system profile will contain references to the
|
||||
corresponding Home Manager configurations.
|
||||
|
||||
Note, to maintain backwards compatibility, the old activation script
|
||||
behavior is still the default. To choose the new mode of operation you
|
||||
have to call the activation script with the command line option
|
||||
`--driver-version 1`. The old behavior is available using
|
||||
`--driver-version 0`, or simply omit it entirely.
|
||||
|
||||
Unfortunately, driver software need to support both modes of operation
|
||||
for the time being since a user may wish to activate an old generation
|
||||
that contains an activation script that does not support
|
||||
`--driver-version`. To determine whether support is available, check
|
||||
the {file}`gen-version` file in the configuration build output root.
|
||||
If the file is missing then the activation script does not support
|
||||
`--driver-version`. If the file exists and contains the integer 1 or
|
||||
higher, then `--driver-version 1` is supported.
|
||||
@@ -1,32 +0,0 @@
|
||||
# Introduction to Home Manager {#ch-introduction}
|
||||
|
||||
Home Manager is a [Nix](https://nix.dev/)-powered tool for reproducible management of the contents of users' home directories.
|
||||
This includes programs, configuration files, environment variables and, well… arbitrary files.
|
||||
The following example snippet of Nix code:
|
||||
|
||||
```nix
|
||||
programs.git = {
|
||||
enable = true;
|
||||
userEmail = "joe@example.org";
|
||||
userName = "joe";
|
||||
};
|
||||
```
|
||||
|
||||
would make available to a user the `git` executable and man pages and a configuration file `~/.config/git/config`:
|
||||
|
||||
```ini
|
||||
[user]
|
||||
email = "joe@example.org"
|
||||
name = "joe"
|
||||
```
|
||||
|
||||
Since Home Manager is implemented in Nix, it provides several benefits:
|
||||
|
||||
- Contents are reproducible — a home will be the exact same every time it is built, unless of course, an intentional change is made.
|
||||
This also means you can have the exact same home on different hosts.
|
||||
- Significantly faster and more powerful than various backup strategies.
|
||||
- Unlike "dotfiles" repositories, Home Manager supports specifying programs, as well as their configurations.
|
||||
- Supported by <http://cache.nixos.org/>, so that you don't have to build from source.
|
||||
- If you do want to build some programs from source, there is hardly a tool more useful than Nix for that, and the build instructions can be neatly integrated in your Home Manager usage.
|
||||
- Infinitely composable, so that values in different configuration files and build instructions can share a source of truth.
|
||||
- Connects you with the [most extensive](https://repology.org/repositories/statistics/total) and [most up-to-date](https://repology.org/repositories/statistics/newest) software package repository on earth, [Nixpkgs](https://github.com/NixOS/nixpkgs).
|
||||
@@ -1,32 +0,0 @@
|
||||
{
|
||||
"gnunet.conf(5)": "https://docs.gnunet.org/users/configuration.html",
|
||||
"mpd(1)": "https://mpd.readthedocs.io/en/latest/mpd.1.html",
|
||||
"mpd.conf(5)": "https://mpd.readthedocs.io/en/latest/mpd.conf.5.html",
|
||||
"nix.conf(5)": "https://nixos.org/manual/nix/stable/command-ref/conf-file.html",
|
||||
|
||||
"journald.conf(5)": "https://www.freedesktop.org/software/systemd/man/journald.conf.html",
|
||||
"logind.conf(5)": "https://www.freedesktop.org/software/systemd/man/logind.conf.html",
|
||||
"networkd.conf(5)": "https://www.freedesktop.org/software/systemd/man/networkd.conf.html",
|
||||
"systemd.automount(5)": "https://www.freedesktop.org/software/systemd/man/systemd.automount.html",
|
||||
"systemd.exec(5)": "https://www.freedesktop.org/software/systemd/man/systemd.exec.html",
|
||||
"systemd.link(5)": "https://www.freedesktop.org/software/systemd/man/systemd.link.html",
|
||||
"systemd.mount(5)": "https://www.freedesktop.org/software/systemd/man/systemd.mount.html",
|
||||
"systemd.netdev(5)": "https://www.freedesktop.org/software/systemd/man/systemd.netdev.html",
|
||||
"systemd.network(5)": "https://www.freedesktop.org/software/systemd/man/systemd.network.html",
|
||||
"systemd.nspawn(5)": "https://www.freedesktop.org/software/systemd/man/systemd.nspawn.html",
|
||||
"systemd.path(5)": "https://www.freedesktop.org/software/systemd/man/systemd.path.html",
|
||||
"systemd.resource-control(5)": "https://www.freedesktop.org/software/systemd/man/systemd.resource-control.html",
|
||||
"systemd.scope(5)": "https://www.freedesktop.org/software/systemd/man/systemd.scope.html",
|
||||
"systemd.service(5)": "https://www.freedesktop.org/software/systemd/man/systemd.service.html",
|
||||
"systemd.slice(5)": "https://www.freedesktop.org/software/systemd/man/systemd.slice.html",
|
||||
"systemd.socket(5)": "https://www.freedesktop.org/software/systemd/man/systemd.socket.html",
|
||||
"systemd.timer(5)": "https://www.freedesktop.org/software/systemd/man/systemd.timer.html",
|
||||
"systemd.unit(5)": "https://www.freedesktop.org/software/systemd/man/systemd.unit.html",
|
||||
"systemd-system.conf(5)": "https://www.freedesktop.org/software/systemd/man/systemd-system.conf.html",
|
||||
"systemd-user.conf(5)": "https://www.freedesktop.org/software/systemd/man/systemd-user.conf.html",
|
||||
"timesyncd.conf(5)": "https://www.freedesktop.org/software/systemd/man/timesyncd.conf.html",
|
||||
"tmpfiles.d(5)": "https://www.freedesktop.org/software/systemd/man/tmpfiles.d.html",
|
||||
"systemd.time(7)": "https://www.freedesktop.org/software/systemd/man/systemd.time.html",
|
||||
"systemd-fstab-generator(8)": "https://www.freedesktop.org/software/systemd/man/systemd-fstab-generator.html",
|
||||
"systemd-networkd-wait-online.service(8)": "https://www.freedesktop.org/software/systemd/man/systemd-networkd-wait-online.service.html"
|
||||
}
|
||||
@@ -1,35 +0,0 @@
|
||||
# Home Manager Manual {#home-manager-manual}
|
||||
|
||||
## Version 26.11 (unstable)
|
||||
|
||||
|
||||
```{=include=} preface
|
||||
preface.md
|
||||
```
|
||||
|
||||
```{=include=} parts
|
||||
introduction.md
|
||||
installation.md
|
||||
usage.md
|
||||
nix-flakes.md
|
||||
writing-modules.md
|
||||
contributing.md
|
||||
internals.md
|
||||
3rd-party.md
|
||||
faq.md
|
||||
```
|
||||
|
||||
```{=include=} appendix html:into-file=//options.xhtml
|
||||
options.md
|
||||
```
|
||||
|
||||
```{=include=} appendix html:into-file=//nixos-options.xhtml
|
||||
nixos-options.md
|
||||
```
|
||||
|
||||
```{=include=} appendix html:into-file=//nix-darwin-options.xhtml
|
||||
nix-darwin-options.md
|
||||
```
|
||||
```{=include=} appendix html:into-file=//release-notes.xhtml
|
||||
release-notes/release-notes.md
|
||||
```
|
||||
@@ -1,7 +0,0 @@
|
||||
# nix-darwin Configuration Options {#ch-nix-darwin-options}
|
||||
|
||||
```{=include=} options
|
||||
id-prefix: nix-darwin-opt-
|
||||
list-id: nix-darwin-options
|
||||
source: @OPTIONS_JSON@
|
||||
```
|
||||
@@ -1,56 +0,0 @@
|
||||
# Nix Flakes {#ch-nix-flakes}
|
||||
|
||||
Home Manager is compatible with [Nix
|
||||
Flakes](https://wiki.nixos.org/wiki/Flakes). But please be aware that this
|
||||
support is still experimental and may change in backwards
|
||||
incompatible ways.
|
||||
|
||||
Just like in the standard installation you can use the Home Manager
|
||||
flake in three ways:
|
||||
|
||||
1. Using the standalone `home-manager` tool. For platforms other than
|
||||
NixOS and Darwin, this is the only available choice. It is also
|
||||
recommended for people on NixOS or Darwin that want to manage their
|
||||
home directory independently of the system as a whole. See
|
||||
[Standalone setup](nix-flakes/standalone.md#sec-flakes-standalone) for instructions on how
|
||||
to perform this installation.
|
||||
|
||||
2. As a module within a NixOS system configuration. This allows the
|
||||
user profiles to be built together with the system when running
|
||||
`nixos-rebuild`. See [NixOS module](nix-flakes/nixos.md#sec-flakes-nixos-module) for a
|
||||
description of this setup.
|
||||
|
||||
3. As a module within a [nix-darwin](https://github.com/nix-darwin/nix-darwin/)
|
||||
system configuration. This allows the user profiles to be built
|
||||
together with the system when running `darwin-rebuild`. See
|
||||
[nix-darwin module](nix-flakes/nix-darwin.md#sec-flakes-nix-darwin-module) for a
|
||||
description of this setup.
|
||||
|
||||
Advanced users may want Home Manager's `nixpkgs` input to follow the
|
||||
same Nixpkgs input as the rest of their flake. This avoids a second
|
||||
Nixpkgs input and makes Home Manager use the same pinned Nixpkgs source
|
||||
revision as the rest of the configuration:
|
||||
|
||||
``` nix
|
||||
home-manager.inputs.nixpkgs.follows = "nixpkgs";
|
||||
```
|
||||
|
||||
This removes the compatibility assumption between Home Manager and the
|
||||
Nixpkgs revision in Home Manager's own lock file, so use it carefully,
|
||||
especially when tracking unstable branches.
|
||||
|
||||
This does not by itself make Home Manager use the same `pkgs` value as
|
||||
your NixOS or nix-darwin system. In NixOS and nix-darwin module setups,
|
||||
`home-manager.useGlobalPkgs = true` controls that behavior by making
|
||||
Home Manager modules receive the system `pkgs` value. When
|
||||
`home-manager.useGlobalPkgs` is enabled, configure Nixpkgs overlays and
|
||||
configuration at the system level instead of through Home Manager
|
||||
`nixpkgs.*` options.
|
||||
|
||||
```{=include=} sections
|
||||
nix-flakes/prerequisites.md
|
||||
nix-flakes/standalone.md
|
||||
nix-flakes/nixos.md
|
||||
nix-flakes/nix-darwin.md
|
||||
nix-flakes/flake-parts.md
|
||||
```
|
||||
@@ -1,63 +0,0 @@
|
||||
# flake-parts module {#sec-flakes-flake-parts-module}
|
||||
|
||||
When using [flake-parts](https://flake.parts) you may wish to import Home
|
||||
Manager's flake module, `flakeModules.home-manager`.
|
||||
|
||||
```nix
|
||||
{
|
||||
description = "flake-parts configuration";
|
||||
|
||||
inputs = {
|
||||
nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable";
|
||||
home-manager.url = "github:nix-community/home-manager";
|
||||
flake-parts.url = "github:hercules-ci/flake-parts";
|
||||
};
|
||||
|
||||
outputs = inputs@{
|
||||
flake-parts,
|
||||
home-manager,
|
||||
nixpkgs,
|
||||
...
|
||||
}:
|
||||
flake-parts.lib.mkFlake { inherit inputs; } {
|
||||
imports = [
|
||||
# Import home-manager's flake module
|
||||
inputs.home-manager.flakeModules.home-manager
|
||||
];
|
||||
flake = {
|
||||
# Reusable Home Manager module.
|
||||
homeModules.bash= { pkgs, ... }: {
|
||||
programs.bash = {
|
||||
enable = true;
|
||||
shellAliases = {
|
||||
ll = "ls -l";
|
||||
};
|
||||
};
|
||||
home.packages = [ pkgs.hello ];
|
||||
};
|
||||
|
||||
# Concrete Home Manager configuration.
|
||||
homeConfigurations.alice = home-manager.lib.homeManagerConfiguration {
|
||||
pkgs = import nixpkgs { system = "x86_64-linux"; };
|
||||
modules = [
|
||||
inputs.self.homeModules.bash
|
||||
{
|
||||
home.username = "alice";
|
||||
home.homeDirectory = "/home/alice";
|
||||
home.stateVersion = "25.11";
|
||||
}
|
||||
];
|
||||
};
|
||||
};
|
||||
# See flake.parts for more features, such as `perSystem`
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
The flake module defines the `flake.homeModules` and `flake.homeConfigurations`
|
||||
options, allowing them to be properly merged if they are defined in multiple
|
||||
modules.
|
||||
|
||||
If you are only defining `homeModules` and/or `homeConfigurations` once in a
|
||||
single module, flake-parts should work fine without importing
|
||||
`flakeModules.home-manager`.
|
||||
@@ -1,59 +0,0 @@
|
||||
# nix-darwin module {#sec-flakes-nix-darwin-module}
|
||||
|
||||
The flake-based setup of the Home Manager nix-darwin module is similar
|
||||
to that of NixOS. The `flake.nix` would be:
|
||||
|
||||
``` nix
|
||||
{
|
||||
description = "Darwin configuration";
|
||||
|
||||
inputs = {
|
||||
nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable";
|
||||
darwin.url = "github:nix-darwin/nix-darwin";
|
||||
darwin.inputs.nixpkgs.follows = "nixpkgs";
|
||||
home-manager.url = "github:nix-community/home-manager";
|
||||
};
|
||||
|
||||
outputs = inputs@{ nixpkgs, home-manager, darwin, ... }: {
|
||||
darwinConfigurations = {
|
||||
hostname = darwin.lib.darwinSystem {
|
||||
system = "x86_64-darwin";
|
||||
modules = [
|
||||
./configuration.nix
|
||||
home-manager.darwinModules.home-manager
|
||||
{
|
||||
home-manager.useGlobalPkgs = true;
|
||||
home-manager.useUserPackages = true;
|
||||
home-manager.extraSpecialArgs = { inherit inputs; };
|
||||
home-manager.users.jdoe = ./home.nix;
|
||||
}
|
||||
];
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
Use `home-manager.extraSpecialArgs` to pass arguments from your flake to
|
||||
`home.nix` and any imported Home Manager modules. For example, the
|
||||
configuration above makes the complete `inputs` attrset available to modules,
|
||||
so they can declare arguments such as `{ inputs, ... }:`.
|
||||
|
||||
The lower-level mechanism behind this is `_module.args`. Set
|
||||
`_module.args.<name>` from inside a module only when you need to provide a
|
||||
module argument from within the module graph itself. For values that originate
|
||||
outside the module graph, such as flake inputs, prefer
|
||||
`home-manager.extraSpecialArgs`.
|
||||
|
||||
Use `home-manager.sharedModules` for Home Manager modules or settings that
|
||||
should be imported by every user declared in `home-manager.users`.
|
||||
|
||||
The Home Manager configuration is also rebuilt with the nix-darwin
|
||||
generations. The rebuild command here may be
|
||||
`darwin-rebuild switch --flake ~/.config/darwin`.
|
||||
|
||||
You can use the above `flake.nix` as a template in `~/.config/darwin` by
|
||||
|
||||
``` shell
|
||||
$ nix flake new ~/.config/darwin -t github:nix-community/home-manager#nix-darwin
|
||||
```
|
||||
@@ -1,61 +0,0 @@
|
||||
# NixOS module {#sec-flakes-nixos-module}
|
||||
|
||||
To use Home Manager as a NixOS module, a bare-minimum `flake.nix` would
|
||||
be as follows:
|
||||
|
||||
``` nix
|
||||
{
|
||||
description = "NixOS configuration";
|
||||
|
||||
inputs = {
|
||||
nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable";
|
||||
home-manager.url = "github:nix-community/home-manager";
|
||||
};
|
||||
|
||||
outputs = inputs@{ nixpkgs, home-manager, ... }: {
|
||||
nixosConfigurations = {
|
||||
hostname = nixpkgs.lib.nixosSystem {
|
||||
system = "x86_64-linux";
|
||||
modules = [
|
||||
./configuration.nix
|
||||
home-manager.nixosModules.home-manager
|
||||
{
|
||||
home-manager.useGlobalPkgs = true;
|
||||
home-manager.useUserPackages = true;
|
||||
home-manager.extraSpecialArgs = { inherit inputs; };
|
||||
home-manager.users.jdoe = ./home.nix;
|
||||
}
|
||||
];
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
Use `home-manager.extraSpecialArgs` to pass arguments from your flake to
|
||||
`home.nix` and any imported Home Manager modules. For example, the
|
||||
configuration above makes the complete `inputs` attrset available to modules,
|
||||
so they can declare arguments such as `{ inputs, ... }:`.
|
||||
|
||||
The lower-level mechanism behind this is `_module.args`. Set
|
||||
`_module.args.<name>` from inside a module only when you need to provide a
|
||||
module argument from within the module graph itself. For values that originate
|
||||
outside the module graph, such as flake inputs, prefer
|
||||
`home-manager.extraSpecialArgs`.
|
||||
|
||||
Use `home-manager.sharedModules` for Home Manager modules or settings that
|
||||
should be imported by every user declared in `home-manager.users`.
|
||||
|
||||
The Home Manager configuration is then part of the NixOS configuration
|
||||
and is automatically rebuilt with the system when using the appropriate
|
||||
command for the system, such as
|
||||
|
||||
``` shell
|
||||
$ nixos-rebuild switch --flake /etc/nixos
|
||||
```
|
||||
|
||||
You can use the above `flake.nix` as a template in `/etc/nixos` by
|
||||
|
||||
``` shell
|
||||
$ nix flake new /etc/nixos -t github:nix-community/home-manager#nixos
|
||||
```
|
||||
@@ -1,37 +0,0 @@
|
||||
# Prerequisites {#sec-flakes-prerequisites}
|
||||
|
||||
- Install Nix 2.4 or later, or have it in `nix-shell`.
|
||||
|
||||
- Enable experimental features `nix-command` and `flakes`.
|
||||
|
||||
- When using NixOS, add the following to your `configuration.nix`
|
||||
and rebuild your system.
|
||||
|
||||
``` nix
|
||||
nix.settings.experimental-features = "nix-command flakes";
|
||||
```
|
||||
|
||||
- If you are not using NixOS, add the following to `nix.conf`
|
||||
(located at `~/.config/nix/` or `/etc/nix/nix.conf`).
|
||||
|
||||
``` bash
|
||||
experimental-features = nix-command flakes
|
||||
```
|
||||
|
||||
You may need to restart the Nix daemon with, for example,
|
||||
`sudo systemctl restart nix-daemon.service`.
|
||||
|
||||
- Alternatively, you can enable flakes on a per-command basis with
|
||||
the following additional flags to `nix` and `home-manager`:
|
||||
|
||||
``` shell
|
||||
$ nix --extra-experimental-features "nix-command flakes" <sub-commands>
|
||||
$ home-manager --extra-experimental-features "nix-command flakes" <sub-commands>
|
||||
```
|
||||
|
||||
- Prepare your Home Manager configuration (`home.nix`).
|
||||
|
||||
Unlike the channel-based setup, `home.nix` will be evaluated when
|
||||
the flake is built, so it must be present before bootstrap of Home
|
||||
Manager from the flake. See [Configuration Example](../usage/configuration.md#sec-usage-configuration) for
|
||||
introduction about writing a Home Manager configuration.
|
||||
@@ -1,90 +0,0 @@
|
||||
# Standalone setup {#sec-flakes-standalone}
|
||||
|
||||
To prepare an initial Home Manager configuration for your logged in
|
||||
user, you can run the Home Manager `init` command directly from its
|
||||
flake.
|
||||
|
||||
For example, if you are using the unstable version of Nixpkgs or NixOS,
|
||||
then to generate and activate a basic configuration run the command
|
||||
|
||||
``` shell
|
||||
$ nix run home-manager/master -- init --switch
|
||||
```
|
||||
|
||||
For Nixpkgs or NixOS version 26.05 run
|
||||
|
||||
``` shell
|
||||
$ nix run home-manager/release-26.05 -- init --switch
|
||||
```
|
||||
|
||||
This will generate a `flake.nix` and a `home.nix` file in
|
||||
`~/.config/home-manager`, creating the directory if it does not exist.
|
||||
|
||||
If you need to pass additional values from your flake to `home.nix` or any
|
||||
imported Home Manager modules, use `extraSpecialArgs` in the call to
|
||||
`home-manager.lib.homeManagerConfiguration`:
|
||||
|
||||
``` nix
|
||||
{
|
||||
inputs = {
|
||||
nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable";
|
||||
home-manager.url = "github:nix-community/home-manager";
|
||||
};
|
||||
|
||||
outputs = inputs@{ nixpkgs, home-manager, ... }: {
|
||||
homeConfigurations.jdoe = home-manager.lib.homeManagerConfiguration {
|
||||
pkgs = nixpkgs.legacyPackages.x86_64-linux;
|
||||
extraSpecialArgs = { inherit inputs; };
|
||||
modules = [ ./home.nix ];
|
||||
};
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
Any attribute in `extraSpecialArgs` becomes a module argument, so `home.nix`
|
||||
or imported modules can declare arguments such as `{ inputs, ... }:`.
|
||||
|
||||
The lower-level mechanism behind this is `_module.args`. Set
|
||||
`_module.args.<name>` from inside a module only when you need to provide a
|
||||
module argument from within the module graph itself. For values that originate
|
||||
outside the module graph, such as flake inputs, prefer `extraSpecialArgs`.
|
||||
|
||||
If you omit the `--switch` option then the activation will not happen.
|
||||
This is useful if you want to inspect and edit the configuration before
|
||||
activating it.
|
||||
|
||||
``` shell
|
||||
$ nix run home-manager/$branch -- init
|
||||
$ # Edit files in ~/.config/home-manager
|
||||
$ nix run home-manager/$branch -- init --switch
|
||||
```
|
||||
|
||||
Where `$branch` is one of `master` or `release-26.05`.
|
||||
|
||||
After the initial activation has completed successfully then building
|
||||
and activating your flake-based configuration is as simple as
|
||||
|
||||
``` shell
|
||||
$ home-manager switch
|
||||
```
|
||||
|
||||
It is possible to override the default configuration directory, if you
|
||||
want. For example,
|
||||
|
||||
``` shell
|
||||
$ nix run home-manager/$branch -- init --switch ~/hmconf
|
||||
$ # And after the initial activation.
|
||||
$ home-manager switch --flake ~/hmconf
|
||||
```
|
||||
|
||||
::: {.note}
|
||||
The flake inputs are not automatically updated by Home Manager. Update
|
||||
the lock file with `nix flake update` before switching if you want to
|
||||
use newer input revisions.
|
||||
|
||||
If you only want to update specific flake inputs, name them explicitly,
|
||||
for example `nix flake update nixpkgs home-manager`.
|
||||
|
||||
These commands assume that your current directory is the flake. If not,
|
||||
pass the flake path or URI with `--flake <flake-uri>`.
|
||||
:::
|
||||
@@ -1,7 +0,0 @@
|
||||
# NixOS Configuration Options {#ch-nixos-options}
|
||||
|
||||
```{=include=} options
|
||||
id-prefix: nixos-opt-
|
||||
list-id: nixos-options
|
||||
source: @OPTIONS_JSON@
|
||||
```
|
||||
@@ -1,7 +0,0 @@
|
||||
# Home Manager Configuration Options {#ch-options}
|
||||
|
||||
```{=include=} options
|
||||
id-prefix: opt-
|
||||
list-id: home-manager-options
|
||||
source: @OPTIONS_JSON@
|
||||
```
|
||||
@@ -1,20 +0,0 @@
|
||||
# Preface {#preface}
|
||||
|
||||
This manual will eventually describe how to install, use, and extend Home
|
||||
Manager.
|
||||
|
||||
If you encounter problems then please reach out on the IRC channel
|
||||
[#home-manager](https://webchat.oftc.net/?channels=home-manager)
|
||||
hosted by [OFTC](https://oftc.net/).
|
||||
There is also a [Matrix room](https://matrix.to/#/%23hm:rycee.net),
|
||||
which is bridged to the IRC channel.
|
||||
If your problem is caused by a bug in Home Manager then it should
|
||||
be reported on the
|
||||
[Home Manager issue tracker](https://github.com/nix-community/home-manager/issues).
|
||||
|
||||
|
||||
:::{.note}
|
||||
Commands prefixed with `$ sudo` have to be run as root, either
|
||||
requiring to login as root user or temporarily switching to it using
|
||||
`sudo` for example.
|
||||
:::
|
||||
@@ -1,66 +0,0 @@
|
||||
# Using Home Manager {#ch-usage}
|
||||
|
||||
Your use of Home Manager is centered around the configuration file,
|
||||
which is typically found at `~/.config/home-manager/home.nix` in the
|
||||
standard installation or `~/.config/home-manager/flake.nix` in a Nix
|
||||
flake based installation.
|
||||
|
||||
::: {.note}
|
||||
The default configuration used to be placed in `~/.config/nixpkgs`¸ so
|
||||
you may see references to that elsewhere. The old directory still works
|
||||
but Home Manager will print a warning message when used.
|
||||
:::
|
||||
|
||||
This configuration file can be *built* and *activated*.
|
||||
|
||||
Building a configuration produces a directory in the Nix store that
|
||||
contains all files and programs that should be available in your home
|
||||
directory and Nix user profile, respectively. The build step also checks
|
||||
that the configuration is valid and it will fail with an error if you,
|
||||
for example, assign a value to an option that does not exist or assign a
|
||||
value of the wrong type. Some modules also have custom assertions that
|
||||
perform more detailed, module specific, checks.
|
||||
|
||||
Concretely, if your configuration contains
|
||||
|
||||
``` nix
|
||||
programs.emacs.enable = "yes";
|
||||
```
|
||||
|
||||
then building it, for example using `home-manager build`, will result in
|
||||
an error message saying something like
|
||||
|
||||
```console
|
||||
$ home-manager build
|
||||
error: A definition for option `programs.emacs.enable' is not of type `boolean'. Definition values:
|
||||
- In `/home/jdoe/.config/home-manager/home.nix': "yes"
|
||||
(use '--show-trace' to show detailed location information)
|
||||
```
|
||||
|
||||
The message indicates that you must provide a Boolean value for this
|
||||
option, that is, either `true` or `false`. The documentation of each
|
||||
option will state the expected type, for
|
||||
[programs.emacs.enable](#opt-programs.emacs.enable) you will see "Type: boolean". You
|
||||
there also find information about the default value and a description of
|
||||
the option. You can find the complete option documentation in
|
||||
[Home Manager Configuration Options](options.md#ch-options) or directly in the terminal by running
|
||||
|
||||
``` shell
|
||||
man home-configuration.nix
|
||||
```
|
||||
|
||||
Once a configuration is successfully built, it can be activated. The
|
||||
activation performs the steps necessary to make the files, programs, and
|
||||
services available in your user environment. The `home-manager switch`
|
||||
command performs a combined build and activation.
|
||||
|
||||
```{=include=} sections
|
||||
usage/configuration.md
|
||||
usage/rollbacks.md
|
||||
usage/dotfiles.md
|
||||
usage/graphical.md
|
||||
usage/gpu-non-nixos.md
|
||||
usage/modular-services.md
|
||||
usage/updating.md
|
||||
usage/upgrading.md
|
||||
```
|
||||
@@ -1,112 +0,0 @@
|
||||
# Configuration Example {#sec-usage-configuration}
|
||||
|
||||
A fresh install of Home Manager will generate a minimal
|
||||
`~/.config/home-manager/home.nix` file containing something like
|
||||
|
||||
``` nix
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
# Home Manager needs a bit of information about you and the
|
||||
# paths it should manage.
|
||||
home.username = "jdoe";
|
||||
home.homeDirectory = "/home/jdoe";
|
||||
|
||||
# This value determines the Home Manager release that your
|
||||
# configuration is compatible with. This helps avoid breakage
|
||||
# when a new Home Manager release introduces backwards
|
||||
# incompatible changes.
|
||||
#
|
||||
# You can update Home Manager without changing this value. See
|
||||
# the Home Manager release notes for a list of state version
|
||||
# changes in each release.
|
||||
home.stateVersion = "26.05";
|
||||
|
||||
# Let Home Manager install and manage itself.
|
||||
programs.home-manager.enable = true;
|
||||
}
|
||||
```
|
||||
|
||||
You can use this as a base for your further configurations.
|
||||
|
||||
::: {.note}
|
||||
If you are not very familiar with the Nix language and NixOS modules
|
||||
then it is encouraged to start with small and simple changes. As you
|
||||
learn you can gradually grow the configuration with confidence.
|
||||
:::
|
||||
|
||||
As an example, let us expand the initial configuration file to also
|
||||
install the htop and fortune packages, install Emacs with a few extra
|
||||
packages available, and enable the user gpg-agent service.
|
||||
|
||||
To satisfy the above setup we should elaborate the `home.nix` file as
|
||||
follows:
|
||||
|
||||
``` nix
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
# Home Manager needs a bit of information about you and the
|
||||
# paths it should manage.
|
||||
home.username = "jdoe";
|
||||
home.homeDirectory = "/home/jdoe";
|
||||
|
||||
# Packages that should be installed to the user profile.
|
||||
home.packages = [
|
||||
pkgs.htop
|
||||
pkgs.fortune
|
||||
];
|
||||
|
||||
# This value determines the Home Manager release that your
|
||||
# configuration is compatible with. This helps avoid breakage
|
||||
# when a new Home Manager release introduces backwards
|
||||
# incompatible changes.
|
||||
#
|
||||
# You can update Home Manager without changing this value. See
|
||||
# the Home Manager release notes for a list of state version
|
||||
# changes in each release.
|
||||
home.stateVersion = "26.05";
|
||||
|
||||
# Let Home Manager install and manage itself.
|
||||
programs.home-manager.enable = true;
|
||||
|
||||
programs.emacs = {
|
||||
enable = true;
|
||||
extraPackages = epkgs: [
|
||||
epkgs.nix-mode
|
||||
epkgs.magit
|
||||
];
|
||||
};
|
||||
|
||||
services.gpg-agent = {
|
||||
enable = true;
|
||||
defaultCacheTtl = 1800;
|
||||
enableSshSupport = true;
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
- Nixpkgs packages can be installed to the user profile using
|
||||
[home.packages](#opt-home.packages).
|
||||
|
||||
- The option names of a program module typically start with
|
||||
`programs.<package name>`.
|
||||
|
||||
- Similarly, for a service module, the names start with
|
||||
`services.<package name>`. Note in some cases a package has both
|
||||
programs *and* service options -- Emacs is such an example.
|
||||
|
||||
To activate this configuration you can run
|
||||
|
||||
``` shell
|
||||
home-manager switch
|
||||
```
|
||||
|
||||
or if you are not feeling so lucky,
|
||||
|
||||
``` shell
|
||||
home-manager build
|
||||
```
|
||||
|
||||
which will create a `result` link to a directory containing an
|
||||
activation script and the generated home directory files.
|
||||
@@ -1,169 +0,0 @@
|
||||
# Keeping your \~ safe from harm {#sec-usage-dotfiles}
|
||||
|
||||
To configure programs and services Home Manager must write various
|
||||
things to your home directory. To prevent overwriting any existing files
|
||||
when switching to a new generation, Home Manager will attempt to detect
|
||||
collisions between existing files and generated files. If any such
|
||||
collision is detected the activation will terminate before changing
|
||||
anything on your computer.
|
||||
|
||||
For example, suppose you have a wonderful, painstakingly created
|
||||
`~/.config/git/config` and add
|
||||
|
||||
``` nix
|
||||
{
|
||||
# …
|
||||
|
||||
programs.git = {
|
||||
enable = true;
|
||||
userName = "Jane Doe";
|
||||
userEmail = "jane.doe@example.org";
|
||||
};
|
||||
|
||||
# …
|
||||
}
|
||||
```
|
||||
|
||||
to your configuration. Attempting to switch to the generation will then
|
||||
result in
|
||||
|
||||
``` shell
|
||||
$ home-manager switch
|
||||
…
|
||||
Activating checkLinkTargets
|
||||
Existing file '/home/jdoe/.config/git/config' is in the way
|
||||
Please move the above files and try again
|
||||
```
|
||||
|
||||
This error is about a file that Home Manager wants to manage as a
|
||||
symbolic link in your home directory. It is separate from package
|
||||
profile collisions, which usually mention `installPackages` or a
|
||||
`collision between .../bin/...` path. For package collisions, see
|
||||
[Why is there a collision error when switching generation?](../faq/collision.md#_why_is_there_a_collision_error_when_switching_generation).
|
||||
|
||||
## Resolving file collisions {#sec-usage-dotfiles-collisions}
|
||||
|
||||
The safest resolution is to inspect the existing path, move any
|
||||
settings you want Home Manager to manage into your configuration, and
|
||||
remove or move the unmanaged file before switching again.
|
||||
|
||||
For a standalone Home Manager installation, you can ask Home Manager to
|
||||
move unmanaged non-symlink paths out of the way during activation:
|
||||
|
||||
``` shell
|
||||
home-manager switch -b backup
|
||||
```
|
||||
|
||||
With the command above, a colliding `~/.config/git/config` is moved to
|
||||
`~/.config/git/config.backup` before Home Manager links the managed
|
||||
file. If the backup path already exists then activation still aborts, so
|
||||
choose an extension whose backup path does not already exist.
|
||||
|
||||
Standalone activation can also run a custom command for each collision:
|
||||
|
||||
``` shell
|
||||
home-manager switch -B trash-put
|
||||
```
|
||||
|
||||
The command receives the colliding path as an argument and must move or
|
||||
remove that path. If both `-B` and `-b` are set, the custom command takes
|
||||
precedence; the command may still use the
|
||||
`HOME_MANAGER_BACKUP_EXT` environment variable set by `-b`.
|
||||
|
||||
When Home Manager is used as a NixOS or nix-darwin module, configure the
|
||||
corresponding module options instead of passing standalone command line
|
||||
flags:
|
||||
|
||||
``` nix
|
||||
{
|
||||
home-manager.backupFileExtension = "backup";
|
||||
}
|
||||
```
|
||||
|
||||
or
|
||||
|
||||
``` nix
|
||||
{
|
||||
home-manager.backupCommand = "${pkgs.trash-cli}/bin/trash-put";
|
||||
}
|
||||
```
|
||||
|
||||
If both {option}`home-manager.backupCommand` and
|
||||
{option}`home-manager.backupFileExtension` are set, the command takes
|
||||
precedence. The extension is still exported to the command as
|
||||
`HOME_MANAGER_BACKUP_EXT`, so the command can use it when implementing
|
||||
its own backup naming. With
|
||||
{option}`home-manager.backupFileExtension`, Home Manager refuses to
|
||||
replace an existing backup path unless
|
||||
{option}`home-manager.overwriteBackup` is enabled:
|
||||
|
||||
``` nix
|
||||
{
|
||||
home-manager.backupFileExtension = "backup";
|
||||
home-manager.overwriteBackup = true;
|
||||
}
|
||||
```
|
||||
|
||||
::: {.warning}
|
||||
{option}`home-manager.overwriteBackup` allows activation to clobber
|
||||
existing backup files. Only enable it when those backup paths are
|
||||
disposable.
|
||||
:::
|
||||
|
||||
For individual files, many file options also support `force = true`:
|
||||
|
||||
``` nix
|
||||
{
|
||||
home.file.".config/example" = {
|
||||
source = ./example;
|
||||
force = true;
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
This skips the collision check for the affected target and lets Home
|
||||
Manager replace the existing file or link. Use it sparingly; it can
|
||||
silently delete local changes.
|
||||
|
||||
Backup commands and backup extensions are intended for unmanaged
|
||||
non-symlink paths. If the colliding target is an unmanaged symbolic
|
||||
link, move it manually or use `force = true` after checking that the
|
||||
link target is safe to replace.
|
||||
|
||||
## Advanced file behavior {#sec-usage-dotfiles-advanced}
|
||||
|
||||
The notes below apply to {option}`home.file` and to options based on the
|
||||
same file type, such as {option}`xdg.configFile`.
|
||||
|
||||
When a file source is a directory, {option}`home.file.<name>.recursive`
|
||||
changes how the directory is linked. With the default `recursive =
|
||||
false`, the target is one symbolic link to the source directory. With
|
||||
`recursive = true`, Home Manager creates a matching directory tree and
|
||||
links each leaf file into it.
|
||||
|
||||
Recursive directory linking has special overlap behavior. A direct
|
||||
duplicate target, such as two managed files both targeting `foo`, is an
|
||||
error. If a recursively linked directory provides `foo/bar` and another
|
||||
managed file also targets `foo/bar`, Home Manager keeps the recursive
|
||||
file by default and ignores the overlapping regular file.
|
||||
|
||||
The {option}`home.file.<name>.onChange` hook runs after the new files
|
||||
are linked. For recursive file entries, the hook is always run, so it
|
||||
should be written to be safe even when no leaf file actually changed.
|
||||
|
||||
Normally a path assigned to {option}`home.file.<name>.source` is copied
|
||||
or linked through the Nix store. To make Home Manager create a link to a
|
||||
live path outside the store, use
|
||||
`config.lib.file.mkOutOfStoreSymlink`:
|
||||
|
||||
``` nix
|
||||
{ config, ... }:
|
||||
|
||||
{
|
||||
home.file.".config/example".source =
|
||||
config.lib.file.mkOutOfStoreSymlink ./example;
|
||||
}
|
||||
```
|
||||
|
||||
This is useful when the target should follow changes to a mutable file
|
||||
or directory outside the store.
|
||||
@@ -1,203 +0,0 @@
|
||||
# GPU on non-NixOS systems {#sec-usage-gpu-non-nixos}
|
||||
|
||||
To access the GPU, programs need access to OpenGL and Vulkan libraries. While
|
||||
this works transparently on NixOS, it does not on other Linux systems. There are
|
||||
two options:
|
||||
|
||||
1. Recommended: modify the host system slightly so that the graphics libraries
|
||||
can be found where programs from Nixpkgs can find them.
|
||||
2. Wrap programs from Nixpkgs in an environment which tells them where to find
|
||||
graphics libraries.
|
||||
|
||||
The first option is very clean because the needed modifications to the host OS
|
||||
are small. However, it does require root/sudo access to the system, which may
|
||||
not be available. The second approach avoids that. However, it injects libraries
|
||||
from Nixpkgs into the environment of wrapped programs, which can make it
|
||||
impossible to launch programs of the host OS from wrapped programs.
|
||||
|
||||
|
||||
## When sudo is available: fixing the host OS {#sec-usage-gpu-sudo}
|
||||
|
||||
The {option}`targets.genericLinux.gpu` module is automatically enabled whenever
|
||||
the option {option}`targets.genericLinux.enable` is set (unless
|
||||
[NixGL](#sec-usage-gpu-nosudo) is used instead), which is recommended for
|
||||
non-NixOS Linux distributions in any case. The module can also be explicitly
|
||||
enabled by setting {option}`targets.genericLinux.gpu.enable`.
|
||||
|
||||
This module builds a directory containing GPU libraries. When activating the
|
||||
home configuration by `home-manager switch`, the host system is examined: for
|
||||
compatibility with NixOS, these libraries need to be placed in
|
||||
`/run/opengl-driver`. If this directory does not exist, or contains a different
|
||||
set of libraries, the activation script will print a warning such as
|
||||
|
||||
```text
|
||||
Activating checkExistingGpuDrivers
|
||||
GPU drivers require an update, run
|
||||
sudo /nix/store/HASH-non-nixos-gpu/bin/non-nixos-gpu-setup
|
||||
```
|
||||
|
||||
Because the `/run` directory is volatile and disappears on reboot, libraries
|
||||
cannot be simply copied or linked there. The `non-nixos-gpu-setup` script
|
||||
installs a
|
||||
[`tmpfiles.d`](https://www.freedesktop.org/software/systemd/man/latest/tmpfiles.d.html)
|
||||
config which ensures that the drivers are linked to `/run/opengl-driver` on
|
||||
boot. Home Manager will always check and warn you when this setup needs to be
|
||||
refreshed.
|
||||
|
||||
If you ever wish to uninstall these drivers, all you need to do is
|
||||
|
||||
```sh
|
||||
sudo rm /run/opengl-driver
|
||||
sudo rm /etc/tmpfiles.d/non-nixos-gpu.conf
|
||||
```
|
||||
|
||||
|
||||
### GPU offloading {#sec-usage-gpu-offloading}
|
||||
|
||||
You can use the {option}`targets.genericLinux.nixGL.prime.installScript` option.
|
||||
It installs the `prime-offload` script which is configured through options under
|
||||
{option}`targets.genericLinux.nixGL.prime`. This functionality is independent
|
||||
from the rest of NixGL and can be used when
|
||||
{option}`targets.genericLinux.nixGL.packages` is left `null`, which it should be
|
||||
when using drivers from `/run/opengl-driver`.
|
||||
|
||||
|
||||
### Nvidia drivers {#sec-usage-gpu-nvidia}
|
||||
|
||||
If you need to include the proprietary Nvidia drivers, the process is a bit more
|
||||
involved. You need to:
|
||||
|
||||
1. Determine the exact version used by the host system. Example: `550.163.01`
|
||||
|
||||
1. Fetch that version of the drivers from Nvidia and calculate their hash.
|
||||
Example:
|
||||
|
||||
```sh
|
||||
nix store prefetch-file \
|
||||
https://download.nvidia.com/XFree86/Linux-x86_64/550.163.01/NVIDIA-Linux-x86_64-550.163.01.run
|
||||
```
|
||||
|
||||
Attention: the version and architecture are present twice. If you are on an
|
||||
ARM system, replace `x86_64` with `aarch64`.
|
||||
|
||||
1. Put this information into your home configuration. Example:
|
||||
|
||||
```nix
|
||||
targets.genericLinux.gpu.nvidia = {
|
||||
enable = true;
|
||||
version = "550.163.01";
|
||||
sha256 = "sha256-74FJ9bNFlUYBRen7+C08ku5Gc1uFYGeqlIh7l1yrmi4=";
|
||||
};
|
||||
```
|
||||
|
||||
::: {.warning}
|
||||
The Nvidia driver version **must** match the host system. This means that you
|
||||
must pay attention when upgrading the system and update the home configuration
|
||||
as well.
|
||||
:::
|
||||
|
||||
|
||||
## No root access: wrapping programs {#sec-usage-gpu-nosudo}
|
||||
|
||||
The wrapping approach is facilitated by
|
||||
[NixGL](https://github.com/nix-community/nixGL), which can be integrated into
|
||||
Home Manager.
|
||||
|
||||
::: {.warning}
|
||||
|
||||
This approach can cause issues when a wrapped program from Nixpkgs executes a
|
||||
program from the host. For example, Firefox from Nixpkgs must be wrapped by
|
||||
NixGL in order for graphical acceleration to work. If you then download a PDF
|
||||
file and open it in a PDF viewer that is not installed from Nixpkgs but is
|
||||
provided by the host distribution, there may be issues. Because Firefox's
|
||||
environment injects libraries from NixGL, they are inherited by the PDF viewer,
|
||||
and unless they are the same or compatible version as the libraries on the host,
|
||||
the viewer will not work. This problem manifests more often with Vulkan because
|
||||
it needs a larger set of injected libraries than OpenGL.
|
||||
|
||||
The problem typically manifests with errors similar to
|
||||
|
||||
```text
|
||||
/nix/store/HASH-gcc-12.3.0-lib/lib/libstdc++.so.6: version `GLIBCXX_3.4.31' not found
|
||||
```
|
||||
|
||||
:::
|
||||
|
||||
To enable the integration, import NixGL into your home configuration, either as
|
||||
a channel, or as a flake input passed via `extraSpecialArgs`. Then, set the
|
||||
`targets.genericLinux.nixGL.packages` option to the package set provided by
|
||||
NixGL.
|
||||
|
||||
Once integration is enabled, it can be used in two ways: as Nix functions for
|
||||
wrapping programs installed via Home Manager, and as shell commands for running
|
||||
programs installed by other means (such as `nix shell`). In either case, there
|
||||
are several wrappers available. They can be broadly categorized
|
||||
|
||||
- by vendor: as Mesa (for Free drivers of all vendors) and Nvidia (for
|
||||
Nvidia-specific proprietary drivers).
|
||||
- by GPU selection: as primary and secondary (offloading).
|
||||
|
||||
For example, the `mesa` wrapper provides support for running programs on the
|
||||
primary GPU for Intel, AMD and Nouveau drivers, while the `mesaPrime` wrapper
|
||||
does the same for the secondary GPU.
|
||||
|
||||
**Note:** when using Nvidia wrappers together with flakes, your home
|
||||
configuration will not be pure and needs to be built using `home-manager switch
|
||||
--impure`. Otherwise, the build will fail, complaining about missing attribute
|
||||
`currentTime`.
|
||||
|
||||
Wrapper functions are available under `config.lib.nixGL.wrappers`. However, it
|
||||
can be more convenient to use the `config.lib.nixGL.wrap` alias, which can be
|
||||
configured to use any of the wrappers. It is intended to provide a customization
|
||||
point when the same home configuration is used across several machines with
|
||||
different hardware. There is also the `config.lib.nixGL.wrapOffload` alias for
|
||||
two-GPU systems.
|
||||
|
||||
Another convenience is that all wrapper functions are always available. However,
|
||||
when `targets.genericLinux.nixGL.packages` option is unset, they are no-ops.
|
||||
This allows them to be used even when the home configuration is used on NixOS
|
||||
machines. The exception is the `prime-offload` script which ignores
|
||||
`targets.genericLinux.nixGL.packages` and is installed into the environment
|
||||
whenever `targets.genericLinux.nixGL.prime.installScript` is set. This script,
|
||||
which can be used to start a program on a secondary GPU, does not depend on
|
||||
NixGL and is useful on NixOS systems as well.
|
||||
|
||||
Below is an abbreviated example for an Optimus laptop that makes use of both
|
||||
Mesa and Nvidia wrappers, where the latter is used in dGPU offloading mode. It
|
||||
demonstrates how to wrap `mpv` to run on the integrated Intel GPU, wrap FreeCAD
|
||||
to run on the Nvidia dGPU, and how to install the wrapper scripts. It also wraps
|
||||
Xonotic to run on the dGPU, but uses the wrapper function directly for
|
||||
demonstration purposes.
|
||||
|
||||
```nix
|
||||
{ config, lib, pkgs, nixgl, ... }:
|
||||
{
|
||||
targets.genericLinux.nixGL = {
|
||||
packages = nixgl.packages;
|
||||
defaultWrapper = "mesa";
|
||||
offloadWrapper = "nvidiaPrime";
|
||||
installScripts = [ "mesa" "nvidiaPrime" ];
|
||||
};
|
||||
|
||||
programs.mpv = {
|
||||
enable = true;
|
||||
package = config.lib.nixGL.wrap pkgs.mpv;
|
||||
};
|
||||
|
||||
home.packages = [
|
||||
(config.lib.nixGL.wrapOffload pkgs.freecad)
|
||||
(config.lib.nixGL.wrappers.nvidiaPrime pkgs.xonotic)
|
||||
];
|
||||
}
|
||||
```
|
||||
|
||||
The above example assumes a flake-based setup where `nixgl` was passed from the
|
||||
flake. When using channels, the example would instead begin with
|
||||
|
||||
```nix
|
||||
{ config, lib, pkgs, ... }:
|
||||
{
|
||||
targets.genericLinux.nixGL.packages = import <nixgl> { inherit pkgs; };
|
||||
# The rest is the same as above
|
||||
...
|
||||
```
|
||||
@@ -1,32 +0,0 @@
|
||||
# Graphical services {#sec-usage-graphical}
|
||||
|
||||
Home Manager includes a number of services intended to run in a
|
||||
graphical session, for example `xscreensaver` and `dunst`.
|
||||
Unfortunately, such services will not be started automatically unless
|
||||
you let Home Manager start your X session. That is, you have something
|
||||
like
|
||||
|
||||
``` nix
|
||||
{
|
||||
# …
|
||||
|
||||
services.xserver.enable = true;
|
||||
|
||||
# …
|
||||
}
|
||||
```
|
||||
|
||||
in your system configuration and
|
||||
|
||||
``` nix
|
||||
{
|
||||
# …
|
||||
|
||||
xsession.enable = true;
|
||||
xsession.windowManager.command = "…";
|
||||
|
||||
# …
|
||||
}
|
||||
```
|
||||
|
||||
in your Home Manager configuration.
|
||||
@@ -1,119 +0,0 @@
|
||||
# Modular Services {#sec-usage-modular-services}
|
||||
|
||||
Home Manager supports nixpkgs
|
||||
[modular services](https://nixos.org/manual/nixos/unstable/#modular-services)
|
||||
under [](#opt-home.services). This is the Home Manager analog to the
|
||||
NixOS `system.services` namespace: each entry is an abstract service
|
||||
sourced from `<nixpkgs/lib/services/lib.nix>` with the upstream portable
|
||||
systemd module loaded into it, so service modules shipped with packages
|
||||
(e.g. `pkgs.<name>.passthru.services.default`) drop in unchanged --
|
||||
the same module evaluates on NixOS and on Home Manager.
|
||||
|
||||
A minimal example -- run mpd as a user service:
|
||||
|
||||
```nix
|
||||
{ pkgs, ... }: {
|
||||
home.services.mpd = {
|
||||
process.argv = [ "${pkgs.mpd}/bin/mpd" "--no-daemon" ];
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
This produces `~/.config/systemd/user/mpd.service` with `ExecStart` set
|
||||
to the mpd binary and `WantedBy=default.target`.
|
||||
|
||||
Each service exposes the upstream NixOS-style schema: [`process.argv`],
|
||||
`systemd.lib`, `systemd.mainExecStart`, `systemd.service`,
|
||||
`systemd.services`, `systemd.sockets`. Lifted units are translated from
|
||||
NixOS-style attrs (`wantedBy`, `serviceConfig`, `unitConfig`,
|
||||
`environment`, ...) into the section-based INI shape
|
||||
(`{ Unit; Service; Install; }`) that Home Manager's
|
||||
[](#opt-systemd.user.services) consumes. Only common keys are mapped
|
||||
explicitly; uncommon options remain reachable via `unitConfig`,
|
||||
`serviceConfig`, or `socketConfig`.
|
||||
|
||||
Sub-services (nested `services.<sub>` inside another service) and their
|
||||
units are dashed under the parent service name. The empty unit key
|
||||
`""` denotes the service's *primary* unit (lifted to a unit named
|
||||
after the service itself); [`process.argv`] becomes the default
|
||||
`ExecStart` for that unit, which defaults to `WantedBy=default.target`.
|
||||
|
||||
## Reusing upstream package modules {#sec-usage-modular-services-upstream}
|
||||
|
||||
Modular services exposed by packages under
|
||||
`pkgs.<name>.passthru.services.default` can be imported directly.
|
||||
For example, `pkgs.php`'s [`php-fpm`]:
|
||||
|
||||
```nix
|
||||
{ pkgs, ... }: {
|
||||
home.services."php-fpm" = {
|
||||
imports = [ pkgs.php.passthru.services.default ];
|
||||
configData."php-fpm.conf".source = builtins.elemAt config.home.services.php-fpm.process.argv 2;
|
||||
php-fpm.settings.mypool = {
|
||||
listen = "127.0.0.1:9000";
|
||||
# FIXME: required by upstream modular service, but ignored when run as user
|
||||
"user" = "";
|
||||
"pm" = "dynamic";
|
||||
"pm.max_children" = 75;
|
||||
"pm.min_spare_servers" = 5;
|
||||
"pm.max_spare_servers" = 20;
|
||||
};
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
Some packages ship modules written for system services that include
|
||||
directives the user-session manager cannot honour (`DynamicUser`,
|
||||
`AmbientCapabilities`, ...). The unit is still generated with those
|
||||
directives -- user systemd silently ignores what it cannot apply.
|
||||
`WantedBy=multi-user.target` is automatically normalized to
|
||||
`WantedBy=default.target`. Other directives can be overridden per
|
||||
service:
|
||||
|
||||
```nix
|
||||
home.services."tunnel" = {
|
||||
imports = [ pkgs.ghostunnel.passthru.services.default ];
|
||||
# ...
|
||||
systemd.services."tunnel".serviceConfig.DynamicUser = lib.mkForce false;
|
||||
};
|
||||
```
|
||||
|
||||
## Configuration data {#sec-usage-modular-services-configdata}
|
||||
|
||||
Each service can declare configuration files via `configData.<name>`.
|
||||
These are materialized at `$XDG_CONFIG_HOME/home-services/<service>/<name>`
|
||||
(mirroring how NixOS lifts `configData` to `environment.etc`), with the
|
||||
absolute path injected back into `configData.<name>.path` so the service
|
||||
can refer to its files at a stable location:
|
||||
|
||||
```nix
|
||||
{ config, ... }:
|
||||
{
|
||||
home.services.demo = {
|
||||
process.argv = [ "/bin/myapp" "--config" config.home.services.demo.configData."app.toml".path ];
|
||||
configData."app.toml".text = ''
|
||||
port = 1234
|
||||
'';
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
The store paths of all enabled `configData` entries are automatically
|
||||
added to the primary unit's `X-Reload-Triggers`, so `home-manager switch`
|
||||
restarts the service whenever any of its configuration files change. To
|
||||
reload instead of restart, override `X-SwitchMethod`:
|
||||
|
||||
```nix
|
||||
home.services.demo.systemd.services."".unitConfig.X-SwitchMethod = "reload";
|
||||
```
|
||||
|
||||
## Scope notes {#sec-usage-modular-services-scope}
|
||||
|
||||
Home Manager mirrors the surface of nixpkgs' portable systemd module:
|
||||
services and sockets only. Other unit kinds Home Manager supports
|
||||
natively under [](#opt-systemd.user.services) (timers, paths, mounts, ...)
|
||||
are intentionally not modeled on `home.services` until upstream grows them,
|
||||
to keep both surfaces aligned.
|
||||
|
||||
[`process.argv`]: https://nixos.org/manual/nixos/unstable/#service-opt-process.argv
|
||||
[`php-fpm`]: https://nixos.org/manual/nixos/stable/options#opt-_imports_=___pkgs.php.services.default___
|
||||
@@ -1,45 +0,0 @@
|
||||
# Rollbacks {#sec-usage-rollbacks}
|
||||
|
||||
When you perform a `home-manager switch` and discover a problem then
|
||||
it is possible to _roll back_ to the previous version of your
|
||||
configuration using `home-manager switch --rollback`. This will turn
|
||||
the previous configuration into the current configuration.
|
||||
|
||||
::: {.example #ex-rollback-scenario}
|
||||
### Home Manager Rollback
|
||||
|
||||
Imagine you have just updated Nixpkgs and switched to a new Home
|
||||
Manager configuration. You discover that a package update included in
|
||||
your new configuration has a bug that was not present in the previous
|
||||
configuration.
|
||||
|
||||
You can then run `home-manager switch --rollback` to recover your
|
||||
previous configuration, which includes the working version of the
|
||||
package.
|
||||
|
||||
To see what happened above we can observe the list of Home Manager
|
||||
generations before and after the rollback:
|
||||
|
||||
``` shell
|
||||
$ home-manager generations
|
||||
2024-01-04 11:56 : id 765 -> /nix/store/kahm1rxk77mnvd2l8pfvd4jkkffk5ijk-home-manager-generation (current)
|
||||
2024-01-03 10:29 : id 764 -> /nix/store/2wsmsliqr5yynqkdyjzb1y57pr5q2lsj-home-manager-generation
|
||||
2024-01-01 12:21 : id 763 -> /nix/store/mv960kl9chn2lal5q8lnqdp1ygxngcd1-home-manager-generation
|
||||
2023-12-29 21:03 : id 762 -> /nix/store/6c0k1r03fxckql4vgqcn9ccb616ynb94-home-manager-generation
|
||||
2023-12-25 18:51 : id 761 -> /nix/store/czc5y6vi1rvnkfv83cs3rn84jarcgsgh-home-manager-generation
|
||||
…
|
||||
|
||||
$ home-manager switch --rollback
|
||||
Starting home manager activation
|
||||
…
|
||||
|
||||
$ home-manager generations
|
||||
2024-01-04 11:56 : id 765 -> /nix/store/kahm1rxk77mnvd2l8pfvd4jkkffk5ijk-home-manager-generation
|
||||
2024-01-03 10:29 : id 764 -> /nix/store/2wsmsliqr5yynqkdyjzb1y57pr5q2lsj-home-manager-generation (current)
|
||||
2024-01-01 12:21 : id 763 -> /nix/store/mv960kl9chn2lal5q8lnqdp1ygxngcd1-home-manager-generation
|
||||
2023-12-29 21:03 : id 762 -> /nix/store/6c0k1r03fxckql4vgqcn9ccb616ynb94-home-manager-generation
|
||||
2023-12-25 18:51 : id 761 -> /nix/store/czc5y6vi1rvnkfv83cs3rn84jarcgsgh-home-manager-generation
|
||||
…
|
||||
```
|
||||
|
||||
:::
|
||||
@@ -1,84 +0,0 @@
|
||||
# Updating {#sec-updating}
|
||||
|
||||
Updating means moving to a newer revision of the Home Manager branch
|
||||
that your configuration already follows. For example, a configuration
|
||||
using `release-25.11` can update to a newer revision of `release-25.11`
|
||||
without changing release branches.
|
||||
|
||||
If you want to move from one release branch to another, such as
|
||||
`release-25.05` to `release-25.11`, or between a release branch and
|
||||
`master`, see
|
||||
[Upgrading to a new Home Manager release](upgrading.md#sec-upgrade-release).
|
||||
|
||||
## Flake-Based Configurations {#sec-updating-flakes}
|
||||
|
||||
Flake inputs are pinned in `flake.lock`, and Home Manager will keep using
|
||||
the pinned revisions until you update that lock file.
|
||||
|
||||
To update all inputs in the flake:
|
||||
|
||||
``` shell
|
||||
$ nix flake update
|
||||
```
|
||||
|
||||
To update only specific inputs, name them explicitly:
|
||||
|
||||
``` shell
|
||||
$ nix flake update home-manager nixpkgs
|
||||
```
|
||||
|
||||
These commands assume that your current directory is the flake. If not,
|
||||
pass the flake path or URI with `--flake <flake-uri>`.
|
||||
|
||||
After updating the lock file, rebuild with the command for your
|
||||
installation method.
|
||||
|
||||
For a standalone Home Manager flake:
|
||||
|
||||
``` shell
|
||||
$ home-manager switch --flake .
|
||||
```
|
||||
|
||||
For Home Manager as a NixOS module:
|
||||
|
||||
``` shell
|
||||
$ sudo nixos-rebuild switch --flake .
|
||||
```
|
||||
|
||||
For Home Manager as a nix-darwin module:
|
||||
|
||||
``` shell
|
||||
$ darwin-rebuild switch --flake .
|
||||
```
|
||||
|
||||
## Channel-Based Configurations {#sec-updating-channels}
|
||||
|
||||
Channels are mutable references outside the Home Manager configuration
|
||||
itself. Updating a channel moves it to a newer revision of the same
|
||||
channel or branch.
|
||||
|
||||
For a standalone Home Manager channel installation, update the user's
|
||||
channels and then switch:
|
||||
|
||||
``` shell
|
||||
$ nix-channel --update
|
||||
…
|
||||
unpacking channels...
|
||||
$ home-manager switch
|
||||
```
|
||||
|
||||
For Home Manager as a NixOS module, update the root user's Home Manager
|
||||
channel and rebuild the system:
|
||||
|
||||
``` shell
|
||||
$ sudo nix-channel --update home-manager
|
||||
$ sudo nixos-rebuild switch
|
||||
```
|
||||
|
||||
For Home Manager as a nix-darwin module, update the Home Manager channel
|
||||
used by your nix-darwin configuration and rebuild the system:
|
||||
|
||||
``` shell
|
||||
$ nix-channel --update home-manager
|
||||
$ darwin-rebuild switch
|
||||
```
|
||||
@@ -1,202 +0,0 @@
|
||||
# Upgrading to a new Home Manager release {#sec-upgrade-release}
|
||||
|
||||
## Overview {#sec-upgrade-release-overview}
|
||||
|
||||
When moving your configuration to a new Nixpkgs release branch, you
|
||||
should also move Home Manager to the matching release branch. On NixOS
|
||||
this usually means upgrading Home Manager together with NixOS. On
|
||||
standalone and nix-darwin installations, match Home Manager to the
|
||||
Nixpkgs branch used by your configuration. The examples below use 25.11;
|
||||
replace this with the release branch you are upgrading to.
|
||||
|
||||
If your configuration follows `nixos-unstable` or `nixpkgs-unstable`,
|
||||
use Home Manager's `master` branch.
|
||||
|
||||
## Understanding Home Manager Versioning {#sec-upgrade-release-understanding-versioning}
|
||||
|
||||
Home Manager follows NixOS release cycles and provides corresponding branches:
|
||||
|
||||
- **release-\<version\>**: Stable branch for the matching NixOS or
|
||||
Nixpkgs release, such as `release-25.11`.
|
||||
|
||||
- **master**: Development branch (tracks nixpkgs-unstable)
|
||||
|
||||
:::{.note}
|
||||
Use the Home Manager branch that matches the Nixpkgs branch used to
|
||||
evaluate your Home Manager configuration. For stable NixOS
|
||||
configurations, this is normally the same as your NixOS version.
|
||||
:::
|
||||
|
||||
## Flake-Based Installation {#sec-upgrade-release-understanding-flake}
|
||||
|
||||
If you are using Home Manager with Nix flakes, update your `nixpkgs` and
|
||||
`home-manager` inputs together:
|
||||
|
||||
```nix
|
||||
{
|
||||
description = "Home Manager configuration";
|
||||
|
||||
inputs = {
|
||||
# Match the Nixpkgs branch to the release you are using.
|
||||
nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.11";
|
||||
|
||||
home-manager = {
|
||||
# Match the Home Manager branch to the Nixpkgs branch above.
|
||||
url = "github:nix-community/home-manager/release-25.11";
|
||||
};
|
||||
};
|
||||
|
||||
outputs = { nixpkgs, home-manager, ... }: {
|
||||
homeConfigurations."yourusername" = home-manager.lib.homeManagerConfiguration {
|
||||
pkgs = nixpkgs.legacyPackages.x86_64-linux;
|
||||
modules = [ ./home.nix ];
|
||||
};
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
For `nixos-unstable` or `nixpkgs-unstable`, use the `master` branch
|
||||
instead:
|
||||
|
||||
```nix
|
||||
{
|
||||
inputs = {
|
||||
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
|
||||
|
||||
home-manager = {
|
||||
url = "github:nix-community/home-manager";
|
||||
};
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
Then update the lock file and rebuild using the command for your
|
||||
installation method.
|
||||
|
||||
For a standalone Home Manager flake:
|
||||
|
||||
``` shell
|
||||
$ nix flake update
|
||||
$ home-manager switch --flake .
|
||||
```
|
||||
|
||||
For Home Manager as a NixOS module:
|
||||
|
||||
``` shell
|
||||
$ nix flake update
|
||||
$ sudo nixos-rebuild switch --flake .
|
||||
```
|
||||
|
||||
For Home Manager as a nix-darwin module:
|
||||
|
||||
``` shell
|
||||
$ nix flake update
|
||||
$ darwin-rebuild switch --flake .
|
||||
```
|
||||
|
||||
These commands assume that your current directory is the flake. If not,
|
||||
pass the flake path or URI with `--flake <flake-uri>`.
|
||||
|
||||
## Channel-Based Installation {#sec-upgrade-release-understanding-channel}
|
||||
|
||||
For a standalone channel-based installation, first verify your current
|
||||
Home Manager channel:
|
||||
|
||||
``` shell
|
||||
$ nix-channel --list
|
||||
```
|
||||
|
||||
The entry identifies the Home Manager branch currently in use. For
|
||||
example:
|
||||
|
||||
```
|
||||
home-manager https://github.com/nix-community/home-manager/archive/release-25.11.tar.gz
|
||||
```
|
||||
|
||||
Update the Home Manager channel to the branch matching your Nixpkgs
|
||||
release, then switch:
|
||||
|
||||
``` shell
|
||||
$ nix-channel --add https://github.com/nix-community/home-manager/archive/release-25.11.tar.gz home-manager
|
||||
$ nix-channel --update
|
||||
$ home-manager switch
|
||||
```
|
||||
|
||||
When Home Manager is installed as a NixOS module with channels, update
|
||||
the root user's Home Manager channel and rebuild the system:
|
||||
|
||||
``` shell
|
||||
$ sudo nix-channel --add https://github.com/nix-community/home-manager/archive/release-25.11.tar.gz home-manager
|
||||
$ sudo nix-channel --update
|
||||
$ sudo nixos-rebuild switch
|
||||
```
|
||||
|
||||
When Home Manager is installed as a nix-darwin module with channels,
|
||||
update the Home Manager channel used by your nix-darwin configuration
|
||||
and rebuild the system:
|
||||
|
||||
``` shell
|
||||
$ nix-channel --add https://github.com/nix-community/home-manager/archive/release-25.11.tar.gz home-manager
|
||||
$ nix-channel --update
|
||||
$ darwin-rebuild switch
|
||||
```
|
||||
|
||||
## State Version Management {#sec-upgrade-release-state-version}
|
||||
|
||||
:::{.warning}
|
||||
Careful updating your `home.stateVersion` when upgrading Home Manager.
|
||||
:::
|
||||
|
||||
The `stateVersion` should remain set to the Home Manager release you
|
||||
first used for this home configuration.
|
||||
|
||||
```nix
|
||||
{
|
||||
# Example: if this home configuration was first created on 24.11.
|
||||
home.stateVersion = "24.11";
|
||||
}
|
||||
```
|
||||
|
||||
**Why?** The `stateVersion` ensures backward compatibility and
|
||||
prevents breaking changes from affecting your existing configuration.
|
||||
|
||||
**Remember:** Channel or flake input version is not the same as state
|
||||
version. Update Home Manager, keep `home.stateVersion` unchanged, and
|
||||
only change it after reading the release notes and migrating any
|
||||
affected configuration.
|
||||
|
||||
## Troubleshooting {#sec-upgrade-release-state-troubleshooting}
|
||||
|
||||
### Common Issues {#sec-upgrade-release-state-troubleshooting-common-issues}
|
||||
|
||||
Check the [Home Manager Release Notes](../release-notes/release-notes.md#ch-release-notes) for breaking changes.
|
||||
|
||||
1. **Version Mismatch Warning**: If you see warnings about version
|
||||
mismatches, ensure your Home Manager branch matches the Nixpkgs
|
||||
branch used by your configuration. For NixOS stable releases, this
|
||||
usually means matching your NixOS version.
|
||||
|
||||
1. **Module Changes**: Modules are constantly being updated with new
|
||||
features to keep up with changes in upstream packaging or to fix
|
||||
bugs and add features. If you have an unexpected change, check if
|
||||
there was something noted in the release notes or news entries.
|
||||
|
||||
1. **Channel Not Found**: If `nix-channel --list` shows no channels,
|
||||
you might be using a different installation method, such as flakes,
|
||||
or Home Manager may be imported through your system configuration.
|
||||
|
||||
### Verification {#sec-upgrade-release-state-troubleshooting-verification}
|
||||
|
||||
After upgrading, verify the installation:
|
||||
|
||||
``` shell
|
||||
$ home-manager --version
|
||||
```
|
||||
|
||||
This should show the Home Manager version or indicate that it is using
|
||||
the expected release branch.
|
||||
|
||||
## Additional Resources {#sec-upgrade-release-resources}
|
||||
|
||||
- [NixOS Stable Release Notes](https://nixos.org/manual/nixos/stable/release-notes)
|
||||
- [Home Manager Release Notes](../release-notes/release-notes.md#ch-release-notes)
|
||||
@@ -1,13 +0,0 @@
|
||||
# Writing Home Manager Modules {#ch-writing-modules}
|
||||
|
||||
The module system in Home Manager is based entirely on the NixOS module
|
||||
system so we will here only highlight aspects that are specific for Home
|
||||
Manager. For information about the module system as such please refer to
|
||||
the [Writing NixOS
|
||||
Modules](https://nixos.org/nixos/manual/index.html#sec-writing-modules)
|
||||
chapter of the NixOS manual.
|
||||
|
||||
|
||||
```{=include=} sections
|
||||
writing-modules/types.md
|
||||
```
|
||||
@@ -1,368 +0,0 @@
|
||||
# Option Types {#sec-option-types}
|
||||
|
||||
Overall the basic option types are the same in Home Manager as NixOS. A
|
||||
few Home Manager options, however, make use of custom types that are
|
||||
worth describing in more detail. These are the option types `dagOf` and
|
||||
`gvariant` that are used, for example, by
|
||||
[programs.ssh.settings](#opt-programs.ssh.settings) and [dconf.settings](#opt-dconf.settings).
|
||||
|
||||
[]{#sec-option-types-dag}`hm.types.dagOf`
|
||||
|
||||
: Options of this type have attribute sets as values where each member
|
||||
is a node in a [directed acyclic
|
||||
graph](https://en.wikipedia.org/w/index.php?title=Directed_acyclic_graph&oldid=939656095)
|
||||
(DAG). This allows the attribute set entries to express dependency
|
||||
relations among themselves. This can, for example, be used to
|
||||
control the order of match blocks in a OpenSSH client configuration
|
||||
or the order of activation script blocks in
|
||||
[home.activation](#opt-home.activation).
|
||||
|
||||
A number of functions are provided to create DAG nodes. The
|
||||
functions are shown below with examples using an option `foo.bar` of
|
||||
type `hm.types.dagOf types.int`.
|
||||
|
||||
[]{#sec-option-types-dag-entryAnywhere}`hm.dag.entryAnywhere (value: T) : DagEntry<T>`
|
||||
|
||||
: Indicates that `value` can be placed anywhere within the DAG.
|
||||
This is also the default for plain attribute set entries, that
|
||||
is
|
||||
|
||||
``` nix
|
||||
foo.bar = {
|
||||
a = hm.dag.entryAnywhere 0;
|
||||
}
|
||||
```
|
||||
|
||||
and
|
||||
|
||||
``` nix
|
||||
foo.bar = {
|
||||
a = 0;
|
||||
}
|
||||
```
|
||||
|
||||
are equivalent.
|
||||
|
||||
[]{#sec-option-types-dag-entryAfter}`hm.dag.entryAfter (afters: list string) (value: T) : DagEntry<T>`
|
||||
|
||||
: Indicates that `value` must be placed *after* each of the
|
||||
attribute names in the given list. For example
|
||||
|
||||
``` nix
|
||||
foo.bar = {
|
||||
a = 0;
|
||||
b = hm.dag.entryAfter [ "a" ] 1;
|
||||
}
|
||||
```
|
||||
|
||||
would place `b` after `a` in the graph.
|
||||
|
||||
[]{#sec-option-types-dag-entryBefore}`hm.dag.entryBefore (befores: list string) (value: T) : DagEntry<T>`
|
||||
|
||||
: Indicates that `value` must be placed *before* each of the
|
||||
attribute names in the given list. For example
|
||||
|
||||
``` nix
|
||||
foo.bar = {
|
||||
b = hm.dag.entryBefore [ "a" ] 1;
|
||||
a = 0;
|
||||
}
|
||||
```
|
||||
|
||||
would place `b` before `a` in the graph.
|
||||
|
||||
[]{#sec-option-types-dag-entryBetween}`hm.dag.entryBetween (befores: list string) (afters: list string) (value: T) : DagEntry<T>`
|
||||
|
||||
: Indicates that `value` must be placed *before* the attribute
|
||||
names in the first list and *after* the attribute names in the
|
||||
second list. For example
|
||||
|
||||
``` nix
|
||||
foo.bar = {
|
||||
a = 0;
|
||||
c = hm.dag.entryBetween [ "b" ] [ "a" ] 2;
|
||||
b = 1;
|
||||
}
|
||||
```
|
||||
|
||||
would place `c` before `b` and after `a` in the graph.
|
||||
|
||||
There are also a set of functions that generate a DAG from a list.
|
||||
These are convenient when you just want to have a linear list of DAG
|
||||
entries, without having to manually enter the relationship between
|
||||
each entry. Each of these functions take a `tag` as argument and the
|
||||
DAG entries will be named `${tag}-${index}`.
|
||||
|
||||
[]{#sec-option-types-dag-entriesAnywhere}`hm.dag.entriesAnywhere (tag: string) (values: [T]) : Dag<T>`
|
||||
|
||||
: Creates a DAG with the given values with each entry labeled
|
||||
using the given tag. For example
|
||||
|
||||
``` nix
|
||||
foo.bar = hm.dag.entriesAnywhere "a" [ 0 1 ];
|
||||
```
|
||||
|
||||
is equivalent to
|
||||
|
||||
``` nix
|
||||
foo.bar = {
|
||||
a-0 = 0;
|
||||
a-1 = hm.dag.entryAfter [ "a-0" ] 1;
|
||||
}
|
||||
```
|
||||
|
||||
[]{#sec-option-types-dag-entriesAfter}`hm.dag.entriesAfter (tag: string) (afters: list string) (values: [T]) : Dag<T>`
|
||||
|
||||
: Creates a DAG with the given values with each entry labeled
|
||||
using the given tag. The list of values are placed are placed
|
||||
*after* each of the attribute names in `afters`. For example
|
||||
|
||||
``` nix
|
||||
foo.bar =
|
||||
{ b = 0; }
|
||||
// hm.dag.entriesAfter "a" [ "b" ] [ 1 2 ];
|
||||
```
|
||||
|
||||
is equivalent to
|
||||
|
||||
``` nix
|
||||
foo.bar = {
|
||||
b = 0;
|
||||
a-0 = hm.dag.entryAfter [ "b" ] 1;
|
||||
a-1 = hm.dag.entryAfter [ "a-0" ] 2;
|
||||
}
|
||||
```
|
||||
|
||||
[]{#sec-option-types-dag-entriesBefore}`hm.dag.entriesBefore (tag: string) (befores: list string) (values: [T]) : Dag<T>`
|
||||
|
||||
: Creates a DAG with the given values with each entry labeled
|
||||
using the given tag. The list of values are placed *before* each
|
||||
of the attribute names in `befores`. For example
|
||||
|
||||
``` nix
|
||||
foo.bar =
|
||||
{ b = 0; }
|
||||
// hm.dag.entriesBefore "a" [ "b" ] [ 1 2 ];
|
||||
```
|
||||
|
||||
is equivalent to
|
||||
|
||||
``` nix
|
||||
foo.bar = {
|
||||
b = 0;
|
||||
a-0 = 1;
|
||||
a-1 = hm.dag.entryBetween [ "b" ] [ "a-0" ] 2;
|
||||
}
|
||||
```
|
||||
|
||||
[]{#sec-option-types-dag-entriesBetween}`hm.dag.entriesBetween (tag: string) (befores: list string) (afters: list string) (values: [T]) : Dag<T>`
|
||||
|
||||
: Creates a DAG with the given values with each entry labeled
|
||||
using the given tag. The list of values are placed *before* each
|
||||
of the attribute names in `befores` and *after* each of the
|
||||
attribute names in `afters`. For example
|
||||
|
||||
``` nix
|
||||
foo.bar =
|
||||
{ b = 0; c = 3; }
|
||||
// hm.dag.entriesBetween "a" [ "b" ] [ "c" ] [ 1 2 ];
|
||||
```
|
||||
|
||||
is equivalent to
|
||||
|
||||
``` nix
|
||||
foo.bar = {
|
||||
b = 0;
|
||||
c = 3;
|
||||
a-0 = hm.dag.entryAfter [ "c" ] 1;
|
||||
a-1 = hm.dag.entryBetween [ "b" ] [ "a-0" ] 2;
|
||||
}
|
||||
```
|
||||
|
||||
[]{#sec-option-types-gvariant}`hm.types.gvariant`
|
||||
|
||||
: This type is useful for options representing
|
||||
[GVariant](https://docs.gtk.org/glib/struct.Variant.html#description)
|
||||
values. The type accepts all primitive GVariant types as well as
|
||||
arrays, tuples, "maybe" types, and dictionaries.
|
||||
|
||||
Some Nix values are automatically coerced to matching GVariant value
|
||||
but the GVariant model is richer so you may need to use one of the
|
||||
provided constructor functions. Examples assume an option `foo.bar`
|
||||
of type `hm.types.gvariant`.
|
||||
|
||||
[]{#sec-option-types-gvariant-mkBoolean}`hm.gvariant.mkBoolean (v: bool)`
|
||||
|
||||
: Takes a Nix value `v` to a GVariant `boolean` value (GVariant
|
||||
format string `b`). Note, Nix booleans are automatically coerced
|
||||
using this function. That is,
|
||||
|
||||
``` nix
|
||||
foo.bar = hm.gvariant.mkBoolean true;
|
||||
```
|
||||
|
||||
is equivalent to
|
||||
|
||||
``` nix
|
||||
foo.bar = true;
|
||||
```
|
||||
|
||||
[]{#sec-option-types-gvariant-mkString}`hm.gvariant.mkString (v: string)`
|
||||
|
||||
: Takes a Nix value `v` to a GVariant `string` value (GVariant
|
||||
format string `s`). Note, Nix strings are automatically coerced
|
||||
using this function. That is,
|
||||
|
||||
``` nix
|
||||
foo.bar = hm.gvariant.mkString "a string";
|
||||
```
|
||||
|
||||
is equivalent to
|
||||
|
||||
``` nix
|
||||
foo.bar = "a string";
|
||||
```
|
||||
|
||||
[]{#sec-option-types-gvariant-mkObjectpath}`hm.gvariant.mkObjectpath (v: string)`
|
||||
|
||||
: Takes a Nix value `v` to a GVariant `objectpath` value (GVariant
|
||||
format string `o`).
|
||||
|
||||
[]{#sec-option-types-gvariant-mkUchar}`hm.gvariant.mkUchar (v: string)`
|
||||
|
||||
: Takes a Nix value `v` to a GVariant `uchar` value (GVariant
|
||||
format string `y`).
|
||||
|
||||
[]{#sec-option-types-gvariant-mkInt16}`hm.gvariant.mkInt16 (v: int)`
|
||||
|
||||
: Takes a Nix value `v` to a GVariant `int16` value (GVariant
|
||||
format string `n`).
|
||||
|
||||
[]{#sec-option-types-gvariant-mkUint16}`hm.gvariant.mkUint16 (v: int)`
|
||||
|
||||
: Takes a Nix value `v` to a GVariant `uint16` value (GVariant
|
||||
format string `q`).
|
||||
|
||||
[]{#sec-option-types-gvariant-mkInt32}`hm.gvariant.mkInt32 (v: int)`
|
||||
|
||||
: Takes a Nix value `v` to a GVariant `int32` value (GVariant
|
||||
format string `i`). Note, Nix integers are automatically coerced
|
||||
using this function. That is,
|
||||
|
||||
``` nix
|
||||
foo.bar = hm.gvariant.mkInt32 7;
|
||||
```
|
||||
|
||||
is equivalent to
|
||||
|
||||
``` nix
|
||||
foo.bar = 7;
|
||||
```
|
||||
|
||||
[]{#sec-option-types-gvariant-mkUint32}`hm.gvariant.mkUint32 (v: int)`
|
||||
|
||||
: Takes a Nix value `v` to a GVariant `uint32` value (GVariant
|
||||
format string `u`).
|
||||
|
||||
[]{#sec-option-types-gvariant-mkInt64}`hm.gvariant.mkInt64 (v: int)`
|
||||
|
||||
: Takes a Nix value `v` to a GVariant `int64` value (GVariant
|
||||
format string `x`).
|
||||
|
||||
[]{#sec-option-types-gvariant-mkUint64}`hm.gvariant.mkUint64 (v: int)`
|
||||
|
||||
: Takes a Nix value `v` to a GVariant `uint64` value (GVariant
|
||||
format string `t`).
|
||||
|
||||
[]{#sec-option-types-gvariant-mkDouble}`hm.gvariant.mkDouble (v: double)`
|
||||
|
||||
: Takes a Nix value `v` to a GVariant `double` value (GVariant
|
||||
format string `d`). Note, Nix floats are automatically coerced
|
||||
using this function. That is,
|
||||
|
||||
``` nix
|
||||
foo.bar = hm.gvariant.mkDouble 3.14;
|
||||
```
|
||||
|
||||
is equivalent to
|
||||
|
||||
``` nix
|
||||
foo.bar = 3.14;
|
||||
```
|
||||
|
||||
[]{#sec-option-types-gvariant-mkArray}`hm.gvariant.mkArray type elements`
|
||||
|
||||
: Builds a GVariant array containing the given list of elements,
|
||||
where each element is a GVariant value of the given type
|
||||
(GVariant format string `a${type}`). The `type` value can be
|
||||
constructed using
|
||||
|
||||
- `hm.gvariant.type.string` (GVariant format string `s`)
|
||||
|
||||
- `hm.gvariant.type.boolean` (GVariant format string `b`)
|
||||
|
||||
- `hm.gvariant.type.uchar` (GVariant format string `y`)
|
||||
|
||||
- `hm.gvariant.type.int16` (GVariant format string `n`)
|
||||
|
||||
- `hm.gvariant.type.uint16` (GVariant format string `q`)
|
||||
|
||||
- `hm.gvariant.type.int32` (GVariant format string `i`)
|
||||
|
||||
- `hm.gvariant.type.uint32` (GVariant format string `u`)
|
||||
|
||||
- `hm.gvariant.type.int64` (GVariant format string `x`)
|
||||
|
||||
- `hm.gvariant.type.uint64` (GVariant format string `t`)
|
||||
|
||||
- `hm.gvariant.type.double` (GVariant format string `d`)
|
||||
|
||||
- `hm.gvariant.type.variant` (GVariant format string `v`)
|
||||
|
||||
- `hm.gvariant.type.arrayOf type` (GVariant format string
|
||||
`a${type}`)
|
||||
|
||||
- `hm.gvariant.type.maybeOf type` (GVariant format string
|
||||
`m${type}`)
|
||||
|
||||
- `hm.gvariant.type.tupleOf types` (GVariant format string
|
||||
`(${lib.concatStrings types})`)
|
||||
|
||||
- `hm.gvariant.type.dictionaryEntryOf [keyType valueType]`
|
||||
(GVariant format string `{${keyType}${valueType}}`)
|
||||
|
||||
where `type` and `types` are themselves a type and list of
|
||||
types, respectively.
|
||||
|
||||
[]{#sec-option-types-gvariant-mkEmptyArray}`hm.gvariant.mkEmptyArray type`
|
||||
|
||||
: An alias of
|
||||
[`hm.gvariant.mkArray type []`](#sec-option-types-gvariant-mkArray).
|
||||
|
||||
[]{#sec-option-types-gvariant-mkNothing}`hm.gvariant.mkNothing type`
|
||||
|
||||
: Builds a GVariant maybe value (GVariant format string
|
||||
`m${type}`) whose (non-existent) element is of the given type.
|
||||
The `type` value is constructed as described for the
|
||||
[`mkArray`](#sec-option-types-gvariant-mkArray) function above.
|
||||
|
||||
[]{#sec-option-types-gvariant-mkJust}`hm.gvariant.mkJust element`
|
||||
|
||||
: Builds a GVariant maybe value (GVariant format string
|
||||
`m${element.type}`) containing the given GVariant element.
|
||||
|
||||
[]{#sec-option-types-gvariant-mkTuple}`hm.gvariant.mkTuple elements`
|
||||
|
||||
: Builds a GVariant tuple containing the given list of elements,
|
||||
where each element is a GVariant value.
|
||||
|
||||
[]{#sec-option-types-gvariant-mkVariant}`hm.gvariant.mkVariant element`
|
||||
|
||||
: Builds a GVariant variant (GVariant format string `v`) which
|
||||
contains the value of a GVariant element.
|
||||
|
||||
[]{#sec-option-types-gvariant-mkDictionaryEntry}`hm.gvariant.mkDictionaryEntry [key value]`
|
||||
|
||||
: Builds a GVariant dictionary entry containing the given list of
|
||||
elements (GVariant format string `{${key.type}${value.type}}`),
|
||||
where each element is a GVariant value.
|
||||
@@ -1,231 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
from __future__ import annotations
|
||||
|
||||
import argparse
|
||||
import html
|
||||
import re
|
||||
import shutil
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
SIMPLE_ROLES = (
|
||||
"command",
|
||||
"component",
|
||||
"description",
|
||||
"file",
|
||||
"index",
|
||||
"system",
|
||||
"type",
|
||||
)
|
||||
|
||||
HEADING_ANCHOR = re.compile(r"^(#{1,6}\s+)(.*)\s+\{#([^}]+)\}\s*$")
|
||||
INLINE_ANCHOR = re.compile(r"\[\]\{#([^}]+)\}")
|
||||
OPTION_ROLE = re.compile(r"(?<![$`])\{option\}`([^`]*)`")
|
||||
SIMPLE_ROLE = re.compile(r"(?<![$`])\{(" + "|".join(SIMPLE_ROLES) + r")\}`([^`]*)`")
|
||||
OPTION_LINK = re.compile(
|
||||
r"\[(?P<label>[^\]]*)\]\(#(?P<anchor>(?:opt|nixos-opt|nix-darwin-opt)-[^)]+)\)"
|
||||
)
|
||||
LEFTOVER_ROLE = re.compile(
|
||||
r"(?<![$`])\{(" + "|".join(("option", *SIMPLE_ROLES)) + r")\}`[^`]*`"
|
||||
)
|
||||
FENCE = re.compile(r"^\s*(`{3,})(.*)$")
|
||||
FENCE_CLOSE = re.compile(r"^\s*`{3,}\s*$")
|
||||
ADMONITION_OPEN = re.compile(r"^\s*:::\s*\{\.(note|warning|example)\}\s*$")
|
||||
ADMONITION_CLOSE = re.compile(r"^\s*:::\s*$")
|
||||
DEEP_SPLIT_NAMESPACES = {"programs", "services"}
|
||||
|
||||
|
||||
def option_target(anchor: str, current_file: Path, base_depth: int) -> str:
|
||||
if anchor.startswith("nix-darwin-opt-"):
|
||||
option = anchor.removeprefix("nix-darwin-opt-")
|
||||
option = option.replace("<", "_").replace(">", "_")
|
||||
anchor = f"nix-darwin-opt-{option}"
|
||||
base = "options/nix-darwin"
|
||||
elif anchor.startswith("nixos-opt-"):
|
||||
option = anchor.removeprefix("nixos-opt-")
|
||||
option = option.replace("<", "_").replace(">", "_")
|
||||
anchor = f"nixos-opt-{option}"
|
||||
base = "options/nixos"
|
||||
else:
|
||||
option = anchor.removeprefix("opt-")
|
||||
option = option.replace("<", "_").replace(">", "_")
|
||||
anchor = f"opt-{option}"
|
||||
base = "options/home-manager"
|
||||
|
||||
page_parts = option_page_parts(option)
|
||||
prefix = "../" * (base_depth + len(current_file.parent.parts))
|
||||
return f"{prefix}{base}/{'/'.join(page_parts)}.md#{anchor}"
|
||||
|
||||
|
||||
def option_page_parts(option_name: str) -> list[str]:
|
||||
parts = option_name.split(".")
|
||||
namespace = parts[0]
|
||||
if namespace in DEEP_SPLIT_NAMESPACES and len(parts) > 1:
|
||||
return parts[:2]
|
||||
return [namespace]
|
||||
|
||||
|
||||
def option_label(anchor: str) -> str:
|
||||
if anchor.startswith("nix-darwin-opt-"):
|
||||
return anchor.removeprefix("nix-darwin-opt-")
|
||||
if anchor.startswith("nixos-opt-"):
|
||||
return anchor.removeprefix("nixos-opt-")
|
||||
return anchor.removeprefix("opt-")
|
||||
|
||||
|
||||
def markdown_label(value: str) -> str:
|
||||
return value.replace("<", "<").replace(">", ">")
|
||||
|
||||
|
||||
def convert_inline(line: str, current_file: Path, base_depth: int) -> str:
|
||||
line = line.replace("index.xhtml", "index.html")
|
||||
line = INLINE_ANCHOR.sub(
|
||||
lambda match: f'<a id="{html.escape(match.group(1), quote=True)}"></a>',
|
||||
line,
|
||||
)
|
||||
line = OPTION_ROLE.sub(
|
||||
lambda match: (
|
||||
f"[{markdown_label(match.group(1))}]"
|
||||
f"({option_target(f'opt-{match.group(1)}', current_file, base_depth)})"
|
||||
),
|
||||
line,
|
||||
)
|
||||
line = OPTION_LINK.sub(
|
||||
lambda match: (
|
||||
f"[{markdown_label(match.group('label') or option_label(match.group('anchor')))}]"
|
||||
f"({option_target(match.group('anchor'), current_file, base_depth)})"
|
||||
),
|
||||
line,
|
||||
)
|
||||
return SIMPLE_ROLE.sub(lambda match: f"`{match.group(2)}`", line)
|
||||
|
||||
|
||||
def convert_heading(line: str, current_file: Path, base_depth: int) -> str:
|
||||
match = HEADING_ANCHOR.match(line)
|
||||
if match is None:
|
||||
return convert_inline(line, current_file, base_depth)
|
||||
|
||||
prefix, title, anchor = match.groups()
|
||||
return (
|
||||
f'<a id="{html.escape(anchor, quote=True)}"></a>\n'
|
||||
f"{prefix}{convert_inline(title, current_file, base_depth)}"
|
||||
)
|
||||
|
||||
|
||||
def is_include_fence(line: str) -> tuple[bool, str]:
|
||||
match = FENCE.match(line)
|
||||
if match is None:
|
||||
return False, ""
|
||||
|
||||
info = match.group(2).strip()
|
||||
return info.startswith(("{=include=}", "include")), match.group(1)
|
||||
|
||||
|
||||
def convert_markdown(
|
||||
text: str,
|
||||
source: Path,
|
||||
current_file: Path,
|
||||
base_depth: int,
|
||||
) -> str:
|
||||
output: list[str] = []
|
||||
in_code_fence = False
|
||||
code_fence = ""
|
||||
in_include = False
|
||||
include_fence = ""
|
||||
in_admonition = False
|
||||
|
||||
for raw_line in text.splitlines(keepends=True):
|
||||
line = raw_line[:-1] if raw_line.endswith("\n") else raw_line
|
||||
newline = "\n" if raw_line.endswith("\n") else ""
|
||||
|
||||
if in_include:
|
||||
if FENCE_CLOSE.match(line) and len(line.strip()) >= len(include_fence):
|
||||
in_include = False
|
||||
include_fence = ""
|
||||
continue
|
||||
|
||||
if in_code_fence:
|
||||
output.append(raw_line)
|
||||
if FENCE_CLOSE.match(line) and len(line.strip()) >= len(code_fence):
|
||||
in_code_fence = False
|
||||
code_fence = ""
|
||||
continue
|
||||
|
||||
include, fence = is_include_fence(line)
|
||||
if include:
|
||||
in_include = True
|
||||
include_fence = fence
|
||||
continue
|
||||
|
||||
fence_match = FENCE.match(line)
|
||||
if fence_match is not None:
|
||||
in_code_fence = True
|
||||
code_fence = fence_match.group(1)
|
||||
output.append(raw_line)
|
||||
continue
|
||||
|
||||
if in_admonition:
|
||||
if ADMONITION_CLOSE.match(line):
|
||||
in_admonition = False
|
||||
continue
|
||||
converted = convert_inline(line, current_file, base_depth)
|
||||
output.append(f"> {converted}{newline}" if converted else ">\n")
|
||||
continue
|
||||
|
||||
admonition = ADMONITION_OPEN.match(line)
|
||||
if admonition is not None:
|
||||
in_admonition = True
|
||||
output.append(f"> **{admonition.group(1).title()}**\n")
|
||||
continue
|
||||
|
||||
output.append(convert_heading(line, current_file, base_depth) + newline)
|
||||
|
||||
if in_include:
|
||||
raise ValueError(f"{source}: unterminated include block")
|
||||
|
||||
converted = "".join(output)
|
||||
if LEFTOVER_ROLE.search(converted):
|
||||
raise ValueError(f"{source}: unconverted NixOS-render-docs role remains")
|
||||
if "```{=include=}" in converted:
|
||||
raise ValueError(f"{source}: unconverted include block remains")
|
||||
|
||||
return converted
|
||||
|
||||
|
||||
def convert_tree(source: Path, destination: Path, base_depth: int) -> None:
|
||||
for path in source.rglob("*"):
|
||||
if not path.is_file():
|
||||
continue
|
||||
|
||||
target = destination / path.relative_to(source)
|
||||
target.parent.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
if path.suffix == ".md":
|
||||
text = path.read_text(encoding="utf-8")
|
||||
target.write_text(
|
||||
convert_markdown(text, path, path.relative_to(source), base_depth),
|
||||
encoding="utf-8",
|
||||
)
|
||||
else:
|
||||
shutil.copy2(path, target)
|
||||
|
||||
|
||||
def main() -> int:
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("--base-depth", type=int, default=0)
|
||||
parser.add_argument("source", type=Path)
|
||||
parser.add_argument("destination", type=Path)
|
||||
args = parser.parse_args()
|
||||
|
||||
if not args.source.is_dir():
|
||||
print(f"missing source directory: {args.source}", file=sys.stderr)
|
||||
return 1
|
||||
|
||||
args.destination.mkdir(parents=True, exist_ok=True)
|
||||
convert_tree(args.source, args.destination, args.base_depth)
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
raise SystemExit(main())
|
||||
@@ -1,132 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import html
|
||||
import json
|
||||
import re
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
ANCHOR = re.compile(r'<a id="([^"]+)"></a>')
|
||||
SPECIAL_PAGES = {
|
||||
Path("manual.md"): "index.html",
|
||||
Path("preface.md"): "index.html",
|
||||
Path("options.md"): "options/home-manager/index.html",
|
||||
Path("nixos-options.md"): "options/nixos/index.html",
|
||||
Path("nix-darwin-options.md"): "options/nix-darwin/index.html",
|
||||
}
|
||||
OPTION_PREFIXES = {
|
||||
"opt-": "options/home-manager",
|
||||
"nixos-opt-": "options/nixos",
|
||||
"nix-darwin-opt-": "options/nix-darwin",
|
||||
}
|
||||
|
||||
ROUTER = """
|
||||
(function () {
|
||||
var h = location.hash || "", a = h.slice(1), t = __DEFAULT__;
|
||||
var m = __ANCHORS__, p = __PREFIXES__;
|
||||
function o(a) {
|
||||
for (var k in p) {
|
||||
if (a.indexOf(k) !== 0) continue;
|
||||
var s = a.slice(k.length).replace(/[<>]/g, "_").split("."), q = s[0];
|
||||
if ((q === "programs" || q === "services") && s.length > 1) q += "/" + s[1];
|
||||
return p[k] + "/" + q + ".html";
|
||||
}
|
||||
return null;
|
||||
}
|
||||
if (a) t = Object.prototype.hasOwnProperty.call(m, a) ? m[a] : o(a) || t;
|
||||
if (t === null) return;
|
||||
var n = t + (location.search || "") + h;
|
||||
var c = location.pathname.split("/").pop() + location.search + h;
|
||||
if (n !== c) location.replace(n);
|
||||
}());
|
||||
""".strip()
|
||||
|
||||
|
||||
def page_for(source, path):
|
||||
relative = path.relative_to(source)
|
||||
return SPECIAL_PAGES.get(relative, relative.with_suffix(".html").as_posix())
|
||||
|
||||
|
||||
def anchors_for(source, roots):
|
||||
anchors = {}
|
||||
for root in roots:
|
||||
files = [root] if root.is_file() else sorted(root.rglob("*.md"))
|
||||
for path in files:
|
||||
page = page_for(source, path)
|
||||
for anchor in ANCHOR.findall(path.read_text(encoding="utf-8")):
|
||||
anchors.setdefault(anchor, page)
|
||||
return anchors
|
||||
|
||||
|
||||
def script(default, anchors):
|
||||
js = (
|
||||
ROUTER.replace("__DEFAULT__", json.dumps(default))
|
||||
.replace(
|
||||
"__ANCHORS__", json.dumps(anchors, sort_keys=True, separators=(",", ":"))
|
||||
)
|
||||
.replace("__PREFIXES__", json.dumps(OPTION_PREFIXES, separators=(",", ":")))
|
||||
)
|
||||
return "\n".join(
|
||||
[
|
||||
" <script>",
|
||||
" //<![CDATA[",
|
||||
*[f" {line}" for line in js.splitlines()],
|
||||
" //]]>",
|
||||
" </script>",
|
||||
]
|
||||
)
|
||||
|
||||
|
||||
def write_redirect(output, name, destination, anchors=None):
|
||||
escaped = html.escape(destination, quote=True)
|
||||
(output / name).write_text(
|
||||
f"""<!DOCTYPE html>
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
{script(destination, anchors or {})}
|
||||
<meta http-equiv="refresh" content="0; url={escaped}" />
|
||||
<link rel="canonical" href="{escaped}" />
|
||||
<title>Redirecting...</title>
|
||||
</head>
|
||||
<body>
|
||||
<p>Redirecting to <a href="{escaped}">{escaped}</a>.</p>
|
||||
</body>
|
||||
</html>
|
||||
""",
|
||||
encoding="utf-8",
|
||||
)
|
||||
|
||||
|
||||
def inject_root_router(output, anchors):
|
||||
index = output / "index.html"
|
||||
text = index.read_text(encoding="utf-8")
|
||||
index.write_text(text.replace("<head>", f"<head>\n{script(None, anchors)}", 1))
|
||||
|
||||
|
||||
def main():
|
||||
source, output = map(Path, sys.argv[1:])
|
||||
|
||||
manual_roots = [
|
||||
path
|
||||
for path in source.iterdir()
|
||||
if path.name != "options" and (path.is_dir() or path.suffix == ".md")
|
||||
]
|
||||
manual_anchors = anchors_for(source, manual_roots)
|
||||
release_anchors = anchors_for(source, [source / "release-notes"])
|
||||
|
||||
inject_root_router(output, manual_anchors)
|
||||
for name, destination, anchors in [
|
||||
("index.xhtml", "index.html", manual_anchors),
|
||||
("options.html", "options/home-manager/index.html", {}),
|
||||
("options.xhtml", "options/home-manager/index.html", {}),
|
||||
("nixos-options.xhtml", "options/nixos/index.html", {}),
|
||||
("nix-darwin-options.xhtml", "options/nix-darwin/index.html", {}),
|
||||
("release-notes.xhtml", "release-notes/release-notes.html", release_anchors),
|
||||
]:
|
||||
write_redirect(output, name, destination, anchors)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -1,23 +0,0 @@
|
||||
{
|
||||
pkgs,
|
||||
optionDocs,
|
||||
manpageUrls,
|
||||
revision,
|
||||
}:
|
||||
|
||||
pkgs.runCommand "home-manager-mdbook-options"
|
||||
{
|
||||
nativeBuildInputs = [
|
||||
pkgs.buildPackages.nixos-render-docs
|
||||
pkgs.buildPackages.python3
|
||||
];
|
||||
optionDocsJson = builtins.toJSON optionDocs;
|
||||
passAsFile = [ "optionDocsJson" ];
|
||||
}
|
||||
''
|
||||
python3 ${./render-options.py} \
|
||||
"$optionDocsJsonPath" \
|
||||
${manpageUrls} \
|
||||
${revision} \
|
||||
"$out"
|
||||
''
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user