Merge commit 'f9710d1500' into haskell-updates

This commit is contained in:
Wolfgang Walther 2026-05-17 10:48:26 +02:00
commit 2e0690adfb
No known key found for this signature in database
GPG key ID: B39893FA5F65CAE1
1039 changed files with 21022 additions and 14017 deletions

View file

@ -27,7 +27,7 @@ jobs:
steps:
# Use a GitHub App to create the PR so that CI gets triggered
# The App is scoped to Repository > Contents and Pull Requests: write for Nixpkgs
- uses: actions/create-github-app-token@1b10c78c7865c340bc4f6099eb2f838309f1e8c3 # v3.1.1
- uses: actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3.2.0
id: app-token
with:
app-id: ${{ vars.NIXPKGS_CI_APP_ID }}
@ -49,7 +49,7 @@ jobs:
- name: Create backport PRs
id: backport
uses: korthout/backport-action@bf97bcfb53d5250af8b9a15fab0f56158a63b224 # v4.5.1
uses: korthout/backport-action@66065406958f46e82238fd59546f5a99e69e22aa # v4.5.2
with:
# Config README: https://github.com/korthout/backport-action#backport-action
add_author_as_reviewer: true

View file

@ -56,7 +56,7 @@ jobs:
run: npm install @actions/artifact@5.0.3 bottleneck@2.19.5
# Use a GitHub App, because it has much higher rate limits: 12,500 instead of 5,000 req / hour.
- uses: actions/create-github-app-token@1b10c78c7865c340bc4f6099eb2f838309f1e8c3 # v3.1.1
- uses: actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3.2.0
if: github.event_name != 'pull_request' && vars.NIXPKGS_CI_APP_ID
id: app-token
with:

View file

@ -67,7 +67,7 @@ jobs:
# Sandbox is disabled on MacOS by default.
extra_nix_config: sandbox = true
- uses: cachix/cachix-action@1eb2ef646ac0255473d23a5907ad7b04ce94065c # v17
- uses: cachix/cachix-action@5f2d7c5294214f71b873db4b969586b980625e71 # v17
continue-on-error: true
with:
# The nixpkgs-gha cache should not be trusted or used outside of Nixpkgs and its forks' CI.

View file

@ -53,7 +53,7 @@ jobs:
- name: Install dependencies
run: npm install bottleneck@2.19.5
- uses: actions/create-github-app-token@1b10c78c7865c340bc4f6099eb2f838309f1e8c3 # v3.1.1
- uses: actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3.2.0
if: github.event_name != 'pull_request' && vars.NIXPKGS_COMMIT_CHECK_CLIENT_ID
id: app-token
with:
@ -102,7 +102,7 @@ jobs:
sparse-checkout: |
ci/github-script
- uses: actions/create-github-app-token@1b10c78c7865c340bc4f6099eb2f838309f1e8c3 # v3.1.1
- uses: actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3.2.0
if: github.event_name != 'pull_request' && vars.NIXPKGS_MANUAL_EDIT_CHECK_CLIENT_ID
id: app-token
with:
@ -149,7 +149,7 @@ jobs:
- uses: cachix/install-nix-action@8aa03977d8d733052d78f4e008a241fd1dbf36b3 # v31.10.6
- uses: cachix/cachix-action@1eb2ef646ac0255473d23a5907ad7b04ce94065c # v17
- uses: cachix/cachix-action@5f2d7c5294214f71b873db4b969586b980625e71 # v17
continue-on-error: true
with:
# The nixpkgs-gha cache should not be trusted or used outside of Nixpkgs and its forks' CI.

View file

@ -30,7 +30,7 @@ jobs:
ci/github-script
# Use the GitHub App to make sure the reaction happens with the same user who will later merge.
- uses: actions/create-github-app-token@1b10c78c7865c340bc4f6099eb2f838309f1e8c3 # v3.1.1
- uses: actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3.2.0
if: github.event_name != 'pull_request' && vars.NIXPKGS_CI_APP_ID
id: app-token
with:

View file

@ -36,7 +36,7 @@ jobs:
# Use a GitHub App to create the PR so that CI gets triggered
# The App is scoped to Repository > Contents and Pull Requests: write for Nixpkgs
# We only need Pull Requests: write here, but the app is also used for backports.
- uses: actions/create-github-app-token@1b10c78c7865c340bc4f6099eb2f838309f1e8c3 # v3.1.1
- uses: actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3.2.0
id: app-token
with:
app-id: ${{ vars.NIXPKGS_CI_APP_ID }}

View file

@ -186,7 +186,7 @@ jobs:
- name: Install Nix
uses: cachix/install-nix-action@8aa03977d8d733052d78f4e008a241fd1dbf36b3 # v31.10.6
- uses: cachix/cachix-action@1eb2ef646ac0255473d23a5907ad7b04ce94065c # v17
- uses: cachix/cachix-action@5f2d7c5294214f71b873db4b969586b980625e71 # v17
continue-on-error: true
with:
# The nixpkgs-gha cache should not be trusted or used outside of Nixpkgs and its forks' CI.
@ -354,7 +354,7 @@ jobs:
target_url
})
- uses: actions/create-github-app-token@1b10c78c7865c340bc4f6099eb2f838309f1e8c3 # v3.1.1
- uses: actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3.2.0
if: github.event_name == 'pull_request_target' && vars.NIXPKGS_BRANCH_CHECK_CLIENT_ID
id: app-token
with:

View file

@ -72,7 +72,7 @@ jobs:
- uses: cachix/install-nix-action@8aa03977d8d733052d78f4e008a241fd1dbf36b3 # v31.10.6
- uses: cachix/cachix-action@1eb2ef646ac0255473d23a5907ad7b04ce94065c # v17
- uses: cachix/cachix-action@5f2d7c5294214f71b873db4b969586b980625e71 # v17
continue-on-error: true
with:
# The nixpkgs-gha cache should not be trusted or used outside of Nixpkgs and its forks' CI.
@ -102,7 +102,7 @@ jobs:
- uses: cachix/install-nix-action@8aa03977d8d733052d78f4e008a241fd1dbf36b3 # v31.10.6
- uses: cachix/cachix-action@1eb2ef646ac0255473d23a5907ad7b04ce94065c # v17
- uses: cachix/cachix-action@5f2d7c5294214f71b873db4b969586b980625e71 # v17
continue-on-error: true
with:
# The nixpkgs-gha cache should not be trusted or used outside of Nixpkgs and its forks' CI.

View file

@ -26,7 +26,7 @@ jobs:
steps:
# Use a GitHub App to create the PR so that CI gets triggered
# The App is scoped to Repository > Contents and Pull Requests: write for Nixpkgs
- uses: actions/create-github-app-token@1b10c78c7865c340bc4f6099eb2f838309f1e8c3 # v3.1.1
- uses: actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3.2.0
id: app-token
with:
app-id: ${{ vars.NIXPKGS_CI_APP_ID }}

View file

@ -45,8 +45,8 @@ jobs:
# It's fine to reuse this app in the 'eval / compare' job,
# because this job has to run before that one.
- uses: actions/create-github-app-token@1b10c78c7865c340bc4f6099eb2f838309f1e8c3 # v3.1.1
if: vars.NIXPKGS_BRANCH_CHECK_CLIENT_ID
- uses: actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3.2.0
if: vars.NIXPKGS_BRANCH_CHECK_CLIENT_ID && github.actor != 'dependabot[bot]'
id: app-token
with:
client-id: ${{ vars.NIXPKGS_BRANCH_CHECK_CLIENT_ID }}

View file

@ -27,7 +27,7 @@ jobs:
ci/github-script
# Use the GitHub App to make sure the reaction happens with the same user who will later merge.
- uses: actions/create-github-app-token@1b10c78c7865c340bc4f6099eb2f838309f1e8c3 # v3.1.1
- uses: actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3.2.0
if: github.event_name != 'pull_request' && vars.NIXPKGS_CI_APP_ID
id: app-token
with:

View file

@ -19,7 +19,7 @@ jobs:
steps:
# Use a GitHub App to create the PR so that CI gets triggered and to
# request team member lists.
- uses: actions/create-github-app-token@1b10c78c7865c340bc4f6099eb2f838309f1e8c3 # v3.1.1
- uses: actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3.2.0
id: app-token
with:
app-id: ${{ vars.NIXPKGS_CI_APP_ID }}

View file

@ -22,6 +22,7 @@ Lin Jian <me@linj.tech> <75130626+jian-lin@users.noreply.github.com>
Martin Weinelt <hexa@darmstadt.ccc.de> <mweinelt@users.noreply.github.com>
Martin Häcker <spamfaenger@gmx.de> <spamfaenger@gmx.de>
moni <lythe1107@gmail.com> <lythe1107@icloud.com>
Noah Biewesch <dev@noahbiewesch.com> <90870942+trueNAHO@users.noreply.github.com>
quantenzitrone <nix@dev.quantenzitrone.eu>
quantenzitrone <nix@dev.quantenzitrone.eu> <74491719+Quantenzitrone@users.noreply.github.com>
quantenzitrone <nix@dev.quantenzitrone.eu> <74491719+quantenzitrone@users.noreply.github.com>

View file

@ -505,7 +505,7 @@ pkgs/development/interpreters/elixir/ @NixOS/beam
pkgs/development/interpreters/lfe/ @NixOS/beam
# Authelia
pkgs/by-name/au/authelia/ @06kellyjac @dit7ya @nicomem
pkgs/by-name/au/authelia/ @06kellyjac @nicomem
# OctoDNS
pkgs/by-name/oc/octodns/ @anthonyroussel

View file

@ -4,6 +4,7 @@
"requires": true,
"packages": {
"": {
"name": "github-script",
"dependencies": {
"@actions/artifact": "5.0.3",
"@actions/core": "1.11.1",
@ -69,9 +70,9 @@
"license": "MIT"
},
"node_modules/@actions/artifact/node_modules/undici": {
"version": "6.23.0",
"resolved": "https://registry.npmjs.org/undici/-/undici-6.23.0.tgz",
"integrity": "sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g==",
"version": "6.25.0",
"resolved": "https://registry.npmjs.org/undici/-/undici-6.25.0.tgz",
"integrity": "sha512-ZgpWDC5gmNiuY9CnLVXEH8rl50xhRCuLNA97fAUnKi8RRuV4E6KG31pDTsLVUKnohJE0I3XDrTeEydAXRw47xg==",
"license": "MIT",
"engines": {
"node": ">=18.17"
@ -218,7 +219,6 @@
"resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.10.1.tgz",
"integrity": "sha512-Nh5PhEOeY6PrnxNPsEHRr9eimxLwgLlpmguQaHKBinFYA/RU9+kOYVOQqOrTsCL+KSxrLLl1gD8Dk5BFW/7l/w==",
"license": "MIT",
"peer": true,
"dependencies": {
"@azure/abort-controller": "^2.1.2",
"@azure/core-auth": "^1.10.0",
@ -280,7 +280,6 @@
"resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.22.2.tgz",
"integrity": "sha512-MzHym+wOi8CLUlKCQu12de0nwcq9k9Kuv43j4Wa++CsCpJwps2eeBQwD2Bu8snkxTtDKDx4GwjuR9E8yC8LNrg==",
"license": "MIT",
"peer": true,
"dependencies": {
"@azure/abort-controller": "^2.1.2",
"@azure/core-auth": "^1.10.0",
@ -447,6 +446,18 @@
"node": ">=12"
}
},
"node_modules/@nodable/entities": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/@nodable/entities/-/entities-2.1.0.tgz",
"integrity": "sha512-nyT7T3nbMyBI/lvr6L5TyWbFJAI9FTgVRakNoBqCD+PmID8DzFrrNdLLtHMwMszOtqZa8PAOV24ZqDnQrhQINA==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/nodable"
}
],
"license": "MIT"
},
"node_modules/@octokit/auth-token": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz",
@ -461,7 +472,6 @@
"resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.2.2.tgz",
"integrity": "sha512-/g2d4sW9nUDJOMz3mabVQvOGhVa4e/BN/Um7yca9Bb2XTzPPnfTWHWQg+IsEYO7M3Vx+EXvaM/I2pJWIMun1bg==",
"license": "MIT",
"peer": true,
"dependencies": {
"@octokit/auth-token": "^4.0.0",
"@octokit/graphql": "^7.1.0",
@ -870,9 +880,9 @@
"license": "MIT"
},
"node_modules/brace-expansion": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
"integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz",
"integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==",
"license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0"
@ -1078,10 +1088,10 @@
"integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==",
"license": "MIT"
},
"node_modules/fast-xml-parser": {
"version": "5.3.6",
"resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.3.6.tgz",
"integrity": "sha512-QNI3sAvSvaOiaMl8FYU4trnEzCwiRr8XMWgAHzlrWpTSj+QaCSvOf1h82OEP1s4hiAXhnbXSyFWCf4ldZzZRVA==",
"node_modules/fast-xml-builder": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.2.0.tgz",
"integrity": "sha512-00aAWieqff+ZJhsXA4g1g7M8k+7AYoMUUHF+/zFb5U6Uv/P0Vl4QZo84/IcufzYalLuEj9928bXN9PbbFzMF0Q==",
"funding": [
{
"type": "github",
@ -1090,7 +1100,27 @@
],
"license": "MIT",
"dependencies": {
"strnum": "^2.1.2"
"path-expression-matcher": "^1.5.0",
"xml-naming": "^0.1.0"
}
},
"node_modules/fast-xml-parser": {
"version": "5.8.0",
"resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.8.0.tgz",
"integrity": "sha512-6bIM7fsJxeo3uXv7OncQYsBAMPJ7V16Slahl/6M98C/i2q+vB1+4a0MtrvYwDFEUrwDSbAmeLDRXsOBwrL7yAg==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/NaturalIntelligence"
}
],
"license": "MIT",
"dependencies": {
"@nodable/entities": "^2.1.0",
"fast-xml-builder": "^1.2.0",
"path-expression-matcher": "^1.5.0",
"strnum": "^2.3.0",
"xml-naming": "^0.1.0"
},
"bin": {
"fxparser": "src/cli/cli.js"
@ -1288,9 +1318,9 @@
}
},
"node_modules/lodash": {
"version": "4.17.23",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz",
"integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==",
"version": "4.18.1",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz",
"integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==",
"license": "MIT"
},
"node_modules/lru-cache": {
@ -1300,12 +1330,12 @@
"license": "ISC"
},
"node_modules/minimatch": {
"version": "9.0.5",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
"integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
"version": "9.0.9",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz",
"integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==",
"license": "ISC",
"dependencies": {
"brace-expansion": "^2.0.1"
"brace-expansion": "^2.0.2"
},
"engines": {
"node": ">=16 || 14 >=14.17"
@ -1374,6 +1404,21 @@
"integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
"license": "BlueOak-1.0.0"
},
"node_modules/path-expression-matcher": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.5.0.tgz",
"integrity": "sha512-cbrerZV+6rvdQrrD+iGMcZFEiiSrbv9Tfdkvnusy6y0x0GKBXREFg/Y65GhIfm0tnLntThhzCnfKwp1WRjeCyQ==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/NaturalIntelligence"
}
],
"license": "MIT",
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/path-key": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
@ -1440,9 +1485,9 @@
}
},
"node_modules/readdir-glob/node_modules/minimatch": {
"version": "5.1.6",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
"integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
"version": "5.1.9",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz",
"integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==",
"license": "ISC",
"dependencies": {
"brace-expansion": "^2.0.1"
@ -1623,9 +1668,9 @@
}
},
"node_modules/strnum": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.2.tgz",
"integrity": "sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ==",
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/strnum/-/strnum-2.3.0.tgz",
"integrity": "sha512-ums3KNd42PGyx5xaoVTO1mjU1bH3NpY4vsrVlnv9PNGqQj8wd7rJ6nEypLrJ7z5vxK5RP0yMLo6J/Gsm62DI5Q==",
"funding": [
{
"type": "github",
@ -1683,7 +1728,6 @@
"resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz",
"integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==",
"license": "Apache-2.0",
"peer": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
@ -1838,6 +1882,21 @@
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
"license": "ISC"
},
"node_modules/xml-naming": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/xml-naming/-/xml-naming-0.1.0.tgz",
"integrity": "sha512-k8KO9hrMyNk6tUWqUfkTEZbezRRpONVOzUTnc97VnCvyj6Tf9lyUR9EDAIeiVLv56jsMcoXEwjW8Kv5yPY52lw==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/NaturalIntelligence"
}
],
"license": "MIT",
"engines": {
"node": ">=16.0.0"
}
},
"node_modules/zip-stream": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz",

View file

@ -181,9 +181,9 @@ module.exports = async ({ github, context, core, dry }) => {
event: 'REQUEST_CHANGES',
reviewKey,
})
} else {
await dismissReviews({ github, context, core, dry, reviewKey })
}
} else {
await dismissReviews({ github, context, core, dry, reviewKey })
}
let mergedSha, targetSha

View file

@ -197,6 +197,8 @@
- `python3Packages.pikepdf` no longer builds with mupdf support by default, which may be nice in Jupyter and iPython. Build with `withMupdf = true` if this is required.
- `python3Packages.django-mdeditor` has been removed, as it was unmaintained upstream and the latest release was vulnerable to a [critical security vulnerability](https://github.com/NixOS/nixpkgs/issues/515462).
- `vicinae` has been updated to v0.20. This includes, among several other breaking changes, a complete overhaul of the configuration system. For update instructions, see the [upstream configuration documentation](https://docs.vicinae.com/config#migration-from-v0-16-x-to-v0-17-x).
- `percona-server_8_4` has been removed. Please update to `percona-server_8_0`, `mysql84` or `mariadb`.

View file

@ -10,7 +10,9 @@
<!-- To avoid merge conflicts, consider adding your item at an arbitrary place in the list instead. -->
- Create the first release note entry in this section!
- `pqos-wrapper` was removed
as it has been unmaintained since 2022
and not widely used.
## Other Notable Changes {#sec-nixpkgs-release-26.11-notable-changes}

View file

@ -1726,11 +1726,21 @@ let
`from`
: 1\. Function argument
: The "from" option path as list of strings.
Option must not exist in the current module set.
`to`
: 2\. Function argument
: The "to" option path as list of strings.
Option must already exist in the current module set.
# Limitations
- The "to" option must already be declared.
- The "from" option should not be declared, as this function will declare it.
- "to" Options whose types don't support merging at any level of their structure (like `types.raw`,
or `types.attrsOf types.raw` where the attribute values can't merge) are not well-supported
because this function wraps aliased definitions in `mkMerge`.
*/
mkRenamedOptionModule =
from: to:

View file

@ -3,7 +3,7 @@
let
inherit (lib)
any
foldl
foldl'
hasInfix
isAttrs
isList
@ -85,11 +85,12 @@ let
let
allArgs = systemToAttrs systemOrArgs;
# Those two will always be derived from "config", if given, so they should NOT
# be overridden further down with "// args".
# These attributes are derived from other inputs, so they should NOT be
# overridden further down with "// args".
args = removeAttrs allArgs [
"parsed"
"system"
"_withoutFunctions"
];
# TODO: deprecate args.rustc in favour of args.rust after 23.05 is EOL.
@ -692,7 +693,7 @@ let
};
in
assert final.useAndroidPrebuilt -> final.isAndroid;
assert foldl (pass: { assertion, message }: if assertion final then pass else throw message) true (
assert foldl' (pass: { assertion, message }: if assertion final then pass else throw message) true (
final.parsed.abi.assertions or [ ]
);
final;

View file

@ -266,6 +266,22 @@ lib.runTests (
}).parsed.cpu.arch;
expected = "i686";
};
test_equals_reelaborate_overridden_platform = {
expr =
let
base = lib.systems.elaborate "x86_64-linux";
in
lib.systems.equals base (
lib.systems.elaborate (
base
// {
useLLVM = true;
linker = "lld";
}
)
);
expected = false;
};
}
// {
# equals.functionNames must list exactly the function-valued attrs of an

View file

@ -501,8 +501,8 @@ rec {
};
u8 = unsign 8 256;
u16 = unsign 16 65536;
# the biggest int Nix accepts is 2^63 - 1 (9223372036854775808)
# the smallest int Nix accepts is -2^63 (-9223372036854775807)
# the biggest int Nix accepts is 2^63 - 1 (9223372036854775807)
# the smallest int Nix accepts is -2^63 (-9223372036854775808)
u32 = unsign 32 4294967296;
# u64 = unsign 64 18446744073709551616;

View file

@ -1852,13 +1852,6 @@
githubId = 102513;
keys = [ { fingerprint = "B7B7 582E 564E 789B FCB8 71AB 0C6D FE2F B234 534A"; } ];
};
anhdle14 = {
name = "Le Anh Duc";
email = "anhdle14@icloud.com";
github = "anhdle14";
githubId = 9645992;
keys = [ { fingerprint = "AA4B 8EC3 F971 D350 482E 4E20 0299 AFF9 ECBB 5169"; } ];
};
anhduy = {
email = "vo@anhduy.io";
github = "voanhduy1512";
@ -1974,12 +1967,6 @@
githubId = 14838767;
name = "Jacopo Scannella";
};
antoinerg = {
email = "roygobeil.antoine@gmail.com";
github = "antoinerg";
githubId = 301546;
name = "Antoine Roy-Gobeil";
};
anton-4 = {
name = "Anton";
github = "Anton-4";
@ -6989,12 +6976,6 @@
githubId = 40633781;
name = "Sergei S.";
};
dit7ya = {
email = "7rat13@gmail.com";
github = "dit7ya";
githubId = 14034137;
name = "Mostly Void";
};
ditsuke = {
name = "Tushar";
email = "hello@ditsuke.com";
@ -8542,9 +8523,9 @@
email = "evysgarden@protonmail.com";
};
ewok = {
email = "ewok@ewok.ru";
github = "ewok-old";
githubId = 454695;
email = "github@in.ewok.email";
github = "ewok";
githubId = 125148819;
name = "Artur Taranchiev";
};
ewuuwe = {
@ -11582,6 +11563,13 @@
name = "Noah Fontes";
keys = [ { fingerprint = "F5B2 BE1B 9AAD 98FE 2916 5597 3665 FFF7 9D38 7BAA"; } ];
};
implr = {
email = "bartoszstebel@gmail.com";
matrix = "@implr:hackerspace.pl";
github = "implr";
githubId = 2821175;
name = "Bartosz Stebel";
};
imrying = {
email = "philiprying@gmail.com";
github = "imrying";
@ -11952,6 +11940,11 @@
github = "j0xaf";
githubId = 932697;
};
j10ccc = {
name = "popWheat";
github = "j10ccc";
githubId = 49830650;
};
j1nxie = {
email = "rylie@rylie.moe";
name = "Nguyen Pham Quoc An";
@ -13144,6 +13137,13 @@
githubId = 168684553;
name = "João Marques";
};
joibel = {
email = "alan@clucas.org";
github = "Joibel";
githubId = 1827156;
name = "Alan Clucas";
keys = [ { fingerprint = "EBE6 85B9 4904 22E1 EC94 7B17 79C7 9CBD BAF6 4C13"; } ];
};
joinemm = {
email = "joonas@rautiola.co";
github = "joinemm";
@ -16882,6 +16882,11 @@
name = "Marcus";
matrix = "@marker06:matrix.org";
};
markhakansson = {
name = "Mark Håkansson";
github = "markhakansson";
githubId = 44841869;
};
markus1189 = {
email = "markus1189@gmail.com";
github = "markus1189";
@ -18318,12 +18323,6 @@
githubId = 104795;
name = "Marek Mahut";
};
mmai = {
email = "henri.bourcereau@gmail.com";
github = "mmai";
githubId = 117842;
name = "Henri Bourcereau";
};
mmesch = {
github = "MMesch";
githubId = 2597803;
@ -18947,6 +18946,11 @@
githubId = 13910387;
keys = [ { fingerprint = "086E EF20 D54E D348 E5BA 6263 16E9 43E6 596F FB4E"; } ];
};
myul = {
github = "myul";
githubId = 27887735;
name = "myul";
};
myypo = {
email = "nikirsmcgl@gmail.com";
github = "myypo";
@ -19075,12 +19079,6 @@
github = "nagymathev";
githubId = 49335802;
};
naho = {
github = "trueNAHO";
githubId = 90870942;
name = "Noah Pierre Biewesch";
keys = [ { fingerprint = "5FC6 088A FB1A 609D 4532 F919 0C1C 177B 3B64 68E0"; } ];
};
nalbyuites = {
email = "ashijit007@gmail.com";
github = "nalbyuites";
@ -19901,6 +19899,13 @@
github = "Noah765";
githubId = 99338019;
};
noahbiewesch = {
github = "trueNAHO";
githubId = 90870942;
name = "Noah Biewesch";
email = "nix@noahbiewesch.com";
keys = [ { fingerprint = "5FC6 088A FB1A 609D 4532 F919 0C1C 177B 3B64 68E0"; } ];
};
noahfraiture = {
name = "Noahcode";
email = "pro@noahcode.dev";
@ -20235,11 +20240,13 @@
github = "numinit";
githubId = 369111;
keys = [
# >=2025, stays in one place
# SSH
{ fingerprint = "XX/0lMz82MpucPqf0KG+5EJoozzNRi8i/t59byD2kNo"; }
# GPG, >=2025, stays in one place
{ fingerprint = "FD28 F9C9 81C5 D78E 56E8 8311 5C3E B94D 198F 1491"; }
# >=2025, travels with me
# GPG, >=2025, travels with me
{ fingerprint = "C48F 475F 30A9 B192 3213 D5D5 C6E2 4809 77B2 F2F4"; }
# <=2024
# GPG, <=2024
{ fingerprint = "190B DA97 F616 DE35 6899 ED17 F819 F1AF 2FC1 C1FF"; }
];
};
@ -20507,7 +20514,7 @@
name = "Erik Timan";
};
olduser101 = {
email = "nathan.j.gill@outlook.com";
email = "n@ngill.net";
github = "OldUser101";
githubId = 64069240;
matrix = "@olduser101:matrix.org";
@ -21026,6 +21033,12 @@
githubId = 79252025;
name = "Nicolas Benes";
};
panicrune = {
email = "panicrune@tutamail.com";
github = "panicrune";
githubId = 161863235;
name = "panicrune";
};
panky = {
email = "dev@pankajraghav.com";
github = "Panky-codes";
@ -24803,12 +24816,6 @@
name = "Sebastian Rutofski";
keys = [ { fingerprint = "F1D4 8061 2830 3AF6 42DC 3867 C37F 3374 2A95 C547"; } ];
};
sebtm = {
email = "mail@sebastian-sellmeier.de";
github = "SebTM";
githubId = 17243347;
name = "Sebastian Sellmeier";
};
secona = {
email = "secona00+nixpkgs@gmail.com";
github = "secona";
@ -25581,12 +25588,6 @@
githubId = 74881555;
name = "Fofanov Sergey";
};
sitaaax = {
email = "johannes@kle1n.com";
github = "SitAAAx";
githubId = 74413170;
name = "Johannes Klein";
};
sith-lord-vader = {
email = "nixpkgs@xpertsre.rocks";
github = "sith-lord-vader";
@ -26925,12 +26926,6 @@
}
];
};
taliyahwebb = {
email = "taliyahmail@proton.me";
github = "taliyahwebb";
githubId = 161863235;
name = "Taliyah Webb";
};
talkara = {
email = "taito.horiuchi@relexsolutions.com";
github = "talkara";
@ -28231,12 +28226,6 @@
githubId = 16036882;
name = "Thibault Gagnaux";
};
trino = {
email = "muehlhans.hubert@ekodia.de";
github = "hmuehlhans";
githubId = 9870613;
name = "Hubert Mühlhans";
};
tris203 = {
email = "admin@snappeh.com";
github = "tris203";
@ -28951,6 +28940,13 @@
githubId = 123554;
name = "Thibaut Smith";
};
viena = {
name = "Viena";
email = "theviena96@gmail.com";
github = "devnchill";
githubId = 169875752;
keys = [ { fingerprint = "BF79 8CD0 CA25 2106 99E1 ED9E F826 F032 DDDA 5560"; } ];
};
vieta = {
email = "vieta@4d2.org";
github = "yVieta";
@ -29843,6 +29839,12 @@
{ fingerprint = "34DB 8D31 F782 2B61 FF06 9503 8B5C 43DC 9105 2999"; }
];
};
wrench-exile-legacy = {
email = "user@wrench-exile-legacy.site";
github = "wrench-exile-legacy";
githubId = 280737824;
name = "wrench";
};
wrmilling = {
name = "Winston R. Milling";
email = "Winston@Milli.ng";
@ -30887,6 +30889,13 @@
githubId = 873857;
name = "Zack Newman";
};
Zocker1999NET = {
github = "Zocker1999NET";
githubId = 1645646;
name = "Felix Stupp";
email = "felix.stupp@banananet.work";
keys = [ { fingerprint = "73D0 9948 B239 2D68 8A45 DC83 93E1 BD26 F6B0 2FB7"; } ];
};
zodman = {
github = "zodman";
githubId = 44167;

View file

@ -358,7 +358,6 @@ with lib.maintainers;
home-assistant = {
members = [
dotlambda
fab
hexa
];
scope = "Maintain the Home Assistant ecosystem";

View file

@ -1,14 +1,24 @@
# Ad-Hoc Configuration {#ad-hoc-network-config}
You can use [](#opt-networking.localCommands) to
specify shell commands to be run at the end of `network-setup.service`. This
is useful for doing network configuration not covered by the existing NixOS
modules. For instance, to statically configure an IPv6 address:
You can use [](#opt-networking.localCommands) to specify shell commands to be
run after the network interfaces have been created, but not necessarily fully
configured.
This is useful for doing network configuration not covered by the existing
NixOS modules. For example, you can create a network namespace and a pair
of virtual ethernet devices like this:
```nix
{
networking.localCommands = ''
ip -6 addr add 2001:610:685:1::1/64 dev eth0
ip netns add mynet
ip link add name veth-in type veth peer name veth-out
ip link set dev veth-out netns mynet
'';
}
```
::: {.note}
The commands should ideally be idempotent, so it's recommended to perform
cleanups of the state you create (e.g. virtual interfaces), or at least make
sure possible failures are handled.
:::

View file

@ -26,9 +26,16 @@ servers:
```
::: {.note}
Statically configured interfaces are set up by the systemd service
`interface-name-cfg.service`. The default gateway and name server
configuration is performed by `network-setup.service`.
Addresses and routes for statically configured interfaces and the default
gateway are set up by systemd services named
`network-addresses-<interface>.service`. The name servers configuration,
instead, is performed by `network-local-commands.service` using resolvconf.
:::
::: {.note}
If needed, for example if addresses/routes were added/removed,
you can reset the network configuration by running
`systemctl restart networking-scripted.target`
:::
The host name is set using [](#opt-networking.hostName):

View file

@ -74,7 +74,7 @@ The pre-existing `services.ankisyncd` has been marked deprecated and will be dro
- [BenchExec](https://github.com/sosy-lab/benchexec), a framework for reliable benchmarking and resource measurement, available as [programs.benchexec](#opt-programs.benchexec.enable),
as well as related programs
[CPU Energy Meter](https://github.com/sosy-lab/cpu-energy-meter), available as [programs.cpu-energy-meter](#opt-programs.cpu-energy-meter.enable), and
[PQoS Wrapper](https://gitlab.com/sosy-lab/software/pqos-wrapper), available as [programs.pqos-wrapper](#opt-programs.pqos-wrapper.enable).
[PQoS Wrapper](https://gitlab.com/sosy-lab/software/pqos-wrapper), available as `programs.pqos-wrapper`.
- [Bluemap](https://bluemap.bluecolored.de/), a 3D minecraft map renderer. Available as [services.bluemap](#opt-services.bluemap.enable).

View file

@ -306,6 +306,8 @@ See <https://github.com/NixOS/nixpkgs/issues/481673>.
- support for `ecryptfs` in nixpkgs has been removed.
- `services.xserver.cmt` has been removed as the `xf86-input-cmt` package was broken and unmaintained upstream.
- `programs.light` was removed from nixpkgs due to the corresponding package being unmaintained upstream. `brightnessctl` and `programs.acpilight` offer replacements.
- `ceph` has been upgraded to v20. See the [Ceph "tentacle" release notes](https://docs.ceph.com/en/latest/releases/tentacle/#v20-2-0-tentacle) for details and recommended upgrade procedure.
@ -326,6 +328,13 @@ See <https://github.com/NixOS/nixpkgs/issues/481673>.
Note for NetworkManager users: before these changes NetworkManager used to spawn its own wpa_supplicant daemon, but now it relies on `networking.wireless`. So, if you had `networking.wireless.enable = false` in your configuration, you should remove that line.
- Some implementation details of the NixOS network-interfaces module have been changed:
- In the "scripted" backend, `network-setup.service` has been removed and the network configuration services are now part of `network.target`, which is now directly pulled into `multi-user.target`.
- Interface addresses, routes and default gateways are now configured asynchronously as soon as the underlying network devices become available (fixes issue [#154737](https://github.com/NixOS/nixpkgs/issues/154737)).
- In both "networkd" and "scripted" backends, the configuration of name servers is now part of `network-local-commands.service` (fixes issue [#445496](https://github.com/NixOS/nixpkgs/issues/445496)).
- The issue that resulted in a completely unconfigured network if both `resolvconf` was disabled and no default gateway configured, has also been fixed.
- `kratos` has been updated from 1.3.1 to [25.4.0](https://github.com/ory/kratos/releases/tag/v25.4.0). Upstream switched to a new versioning scheme (year.major.minor). Notable breaking changes:
- The `migrate sql` CLI command is now `migrate sql up`

View file

@ -16,7 +16,12 @@
<!-- To avoid merge conflicts, consider adding your item at an arbitrary place in the list instead. -->
- Create the first release note entry in this section!
- `programs.pqos-wrapper` module has been deleted
as the corresponding package has been dropped from nixpkgs.
- `programs.benchexec.enable = true`
no longer sets `programs.pqos-wrapper.enable = true`
as the corresponding module has been deleted.
## Other Notable Changes {#sec-release-26.11-notable-changes}

View file

@ -221,12 +221,12 @@ let
};
}) mountable;
};
passAsFile = [ "filesystems" ];
__structuredAttrs = true;
}
''
(
echo "builtins.fromJSON '''"
jq . < "$filesystemsPath"
printf "%s" "$filesystems" | jq .
echo "'''"
) > $out

View file

@ -209,12 +209,12 @@ let
};
}) mountable;
};
passAsFile = [ "filesystems" ];
__structuredAttrs = true;
}
''
(
echo "builtins.fromJSON '''"
jq . < "$filesystemsPath"
printf "%s" "$filesystems" | jq .
echo "'''"
) > $out

View file

@ -1495,6 +1495,17 @@ class NspawnMachine(BaseMachine):
self.logger.info(f"kill NspawnMachine (pid {self.pid})")
assert self.process is not None
self.process.terminate()
# Wait for the wrapper to finish its context-manager cleanups
# (veth/bridge/netns teardown) before returning, so the driver's
# subsequent vlan teardown does not race against it.
try:
self.process.wait(timeout=30)
except subprocess.TimeoutExpired:
self.logger.error(
f"NspawnMachine {self.name} (pid {self.pid}) did not exit after SIGTERM; sending SIGKILL"
)
self.process.kill()
self.process.wait()
self.process = None
def is_up(self) -> bool:

View file

@ -8,6 +8,7 @@ in
{
imports = [
../../modules/testing/test-instrumentation.nix # !!! should only get added for automated test runs
../../modules/virtualisation/guest-networking-options.nix
{
key = "no-manual";
documentation.nixos.enable = false;

View file

@ -37,93 +37,94 @@ let
in
hostToGuest.${hostPlatform.system} or (throw message);
baseOS = import ../eval-config.nix {
inherit lib;
system = null; # use modularly defined system
inherit (config.node) specialArgs;
modules = [ config.defaults ];
baseModules = (import ../../modules/module-list.nix) ++ [
./nixos-test-base.nix
{
key = "nodes";
_module.args = {
inherit (config) containers;
nodes = config.nodesCompat;
};
}
(
{ options, ... }:
{
key = "nodes.nix-pkgs";
config = optionalAttrs (!config.node.pkgsReadOnly) (
mkIf (!options.nixpkgs.pkgs.isDefined) {
# TODO: switch to nixpkgs.hostPlatform and make sure containers-imperative test still evaluates.
nixpkgs.system = guestSystem;
baseOS =
extraBaseModules:
import ../eval-config.nix {
inherit lib;
system = null; # use modularly defined system
inherit (config.node) specialArgs;
modules = [ config.defaults ];
baseModules =
(import ../../modules/module-list.nix)
++ [
./nixos-test-base.nix
{
key = "nodes";
_module.args = {
inherit (config) containers;
nodes = config.nodesCompat;
};
}
(
{ options, ... }:
{
key = "nodes.nix-pkgs";
config = optionalAttrs (!config.node.pkgsReadOnly) (
mkIf (!options.nixpkgs.pkgs.isDefined) {
# TODO: switch to nixpkgs.hostPlatform and make sure containers-imperative test still evaluates.
nixpkgs.system = guestSystem;
}
);
}
);
}
)
testModuleArgs.config.extraBaseModules
];
};
baseQemuOS = baseOS.extendModules {
modules = [
../../modules/virtualisation/qemu-vm.nix
config.nodeDefaults
)
testModuleArgs.config.extraBaseModules
]
++ extraBaseModules;
};
baseQemuOS = baseOS [
../../modules/virtualisation/qemu-vm.nix
testModuleArgs.config.extraBaseNodeModules
config.nodeDefaults
{
key = "base-qemu";
virtualisation.qemu = {
inherit (testModuleArgs.config.qemu) package forceAccel;
};
virtualisation.host.pkgs = hostPkgs;
}
];
baseNspawnOS = baseOS [
../../modules/virtualisation/nspawn-container
config.containerDefaults
(
{ pkgs, ... }:
{
key = "base-qemu";
virtualisation.qemu = {
inherit (testModuleArgs.config.qemu) package forceAccel;
key = "base-nspawn";
# PAM requires setuid and doesn't work in the build sandbox.
# https://github.com/NixOS/nix/blob/959c244a1265f4048390f3ad21679219d7b27a99/src/libstore/unix/build/linux-derivation-builder.cc#L63
services.openssh.settings.UsePAM = false;
# Networking for tests is statically configured by default.
# dhcpcd times out after blocking for a long time, which slows down tests.
# See https://github.com/NixOS/nixpkgs/pull/478109#discussion_r2867570799
networking.useDHCP = lib.mkDefault false;
# Disable Info manual directory generation to prevent build failures.
#
# Context: 'install-info' (from texinfo) is triggered during system-path
# generation to index manuals, but it requires 'gzip' in the $PATH to
# decompress them.
# When 'networking.useDHCP' is set to false, transitive dependencies
# (like dhcpcd or other network tools) that normally pull 'gzip' into
# the system environment are removed. This leaves 'install-info'
# stranded without 'gzip', causing the 'system-path' derivation to fail.
# Since nspawn containers are typically minimal, disabling 'info'
# is a cleaner fix than explicitly adding 'gzip' to systemPackages.
documentation.info.enable = lib.mkDefault false;
# Gross, insecure hack to make login work. See above.
security.pam.services.login = {
text = ''
auth sufficient ${pkgs.linux-pam}/lib/security/pam_permit.so
account sufficient ${pkgs.linux-pam}/lib/security/pam_permit.so
password sufficient ${pkgs.linux-pam}/lib/security/pam_permit.so
session sufficient ${pkgs.linux-pam}/lib/security/pam_permit.so
'';
};
virtualisation.host.pkgs = hostPkgs;
}
testModuleArgs.config.extraBaseNodeModules
];
};
baseNspawnOS = baseOS.extendModules {
modules = [
../../modules/virtualisation/nspawn-container
config.containerDefaults
(
{ pkgs, ... }:
{
key = "base-nspawn";
# PAM requires setuid and doesn't work in the build sandbox.
# https://github.com/NixOS/nix/blob/959c244a1265f4048390f3ad21679219d7b27a99/src/libstore/unix/build/linux-derivation-builder.cc#L63
services.openssh.settings.UsePAM = false;
# Networking for tests is statically configured by default.
# dhcpcd times out after blocking for a long time, which slows down tests.
# See https://github.com/NixOS/nixpkgs/pull/478109#discussion_r2867570799
networking.useDHCP = lib.mkDefault false;
# Disable Info manual directory generation to prevent build failures.
#
# Context: 'install-info' (from texinfo) is triggered during system-path
# generation to index manuals, but it requires 'gzip' in the $PATH to
# decompress them.
# When 'networking.useDHCP' is set to false, transitive dependencies
# (like dhcpcd or other network tools) that normally pull 'gzip' into
# the system environment are removed. This leaves 'install-info'
# stranded without 'gzip', causing the 'system-path' derivation to fail.
# Since nspawn containers are typically minimal, disabling 'info'
# is a cleaner fix than explicitly adding 'gzip' to systemPackages.
documentation.info.enable = lib.mkDefault false;
# Gross, insecure hack to make login work. See above.
security.pam.services.login = {
text = ''
auth sufficient ${pkgs.linux-pam}/lib/security/pam_permit.so
account sufficient ${pkgs.linux-pam}/lib/security/pam_permit.so
password sufficient ${pkgs.linux-pam}/lib/security/pam_permit.so
session sufficient ${pkgs.linux-pam}/lib/security/pam_permit.so
'';
};
}
)
];
};
)
];
# TODO (lib): Dedup with run.nix, add to lib/options.nix
mkOneUp = opt: f: lib.mkOverride (opt.highestPrio - 1) (f opt.value);

View file

@ -24,10 +24,12 @@ let
'';
# Sadly, systemd-vconsole-setup doesn't support binary keymaps.
vconsoleConf = pkgs.writeText "vconsole.conf" ''
KEYMAP=${cfg.keyMap}
${lib.optionalString (cfg.font != null) "FONT=${cfg.font}"}
'';
vconsoleConf =
withFont:
pkgs.writeText "vconsole.conf" ''
KEYMAP=${cfg.keyMap}
${lib.optionalString (withFont && cfg.font != null) "FONT=${cfg.font}"}
'';
consoleEnv =
kbd:
@ -165,7 +167,7 @@ in
# Let systemd-vconsole-setup.service do the work of setting up the
# virtual consoles. Skip when imperative so localectl can manage it.
environment.etc."vconsole.conf" = lib.mkIf (!i18nCfg.imperativeLocale) {
source = vconsoleConf;
source = vconsoleConf true;
};
# Provide kbd with additional packages.
environment.etc.kbd.source = "${consoleEnv pkgs.kbd}/share";
@ -183,7 +185,7 @@ in
);
boot.initrd.systemd.contents = {
"/etc/vconsole.conf".source = vconsoleConf;
"/etc/vconsole.conf".source = vconsoleConf cfg.earlySetup;
# Add everything if we want full console setup...
"/etc/kbd" = lib.mkIf cfg.earlySetup {
source = "${consoleEnv config.boot.initrd.systemd.package.kbd}/share";
@ -192,9 +194,6 @@ in
"/etc/kbd/keymaps" = lib.mkIf (!cfg.earlySetup) {
source = "${consoleEnv config.boot.initrd.systemd.package.kbd}/share/keymaps";
};
"/etc/kbd/consolefonts" = lib.mkIf (!cfg.earlySetup && cfg.font != null) {
source = "${consoleEnv config.boot.initrd.systemd.package.kbd}/share/consolefonts";
};
};
boot.initrd.systemd.additionalUpstreamUnits = [
"systemd-vconsole-setup.service"
@ -204,7 +203,7 @@ in
"${config.boot.initrd.systemd.package.kbd}/bin/setfont"
"${config.boot.initrd.systemd.package.kbd}/bin/loadkeys"
]
++ lib.optionals (cfg.font != null && lib.hasPrefix builtins.storeDir cfg.font) [
++ lib.optionals (cfg.font != null && cfg.earlySetup && lib.hasPrefix builtins.storeDir cfg.font) [
"${cfg.font}"
]
++ lib.optionals (lib.hasPrefix builtins.storeDir cfg.keyMap) [
@ -226,7 +225,7 @@ in
wantedBy = [ "multi-user.target" ];
restartTriggers =
lib.optionals (!i18nCfg.imperativeLocale) [
vconsoleConf
(config.environment.etc."vconsole.conf".source)
]
++ [
(consoleEnv pkgs.kbd)

View file

@ -76,7 +76,7 @@ let
{
inputs = {
# This is pointing to an unstable release.
# If you prefer a stable release instead, you can this to the latest number shown here: https://nixos.org/download
# If you prefer a stable release instead, you can change the word unstable to the latest number shown here: https://nixos.org/download
# i.e. nixos-24.11
# Use `nix flake update` to update the flake to the latest revision of the chosen release channel.
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";

View file

@ -296,7 +296,6 @@
./programs/pay-respects.nix
./programs/plotinus.nix
./programs/pmount.nix
./programs/pqos-wrapper.nix
./programs/projecteur.nix
./programs/proxychains.nix
./programs/pulseview.nix
@ -1857,7 +1856,6 @@
./services/x11/display-managers/xpra.nix
./services/x11/extra-layouts.nix
./services/x11/fractalart.nix
./services/x11/hardware/cmt.nix
./services/x11/hardware/digimend.nix
./services/x11/hardware/synaptics.nix
./services/x11/hardware/wacom.nix

View file

@ -85,7 +85,6 @@ in
# See <https://github.com/sosy-lab/benchexec/blob/3.18/doc/INSTALL.md#requirements>.
programs = {
cpu-energy-meter.enable = lib.mkDefault true;
pqos-wrapper.enable = lib.mkDefault true;
};
# See <https://github.com/sosy-lab/benchexec/blob/3.18/doc/INSTALL.md#kernel-requirements>.

View file

@ -1,28 +0,0 @@
{
config,
lib,
pkgs,
...
}:
let
cfg = config.programs.pqos-wrapper;
in
{
options.programs.pqos-wrapper = {
enable = lib.mkEnableOption "PQoS Wrapper for BenchExec";
package = lib.mkPackageOption pkgs "pqos-wrapper" { };
};
config = lib.mkIf cfg.enable {
hardware.cpu.x86.msr.enable = true;
security.wrappers.${cfg.package.meta.mainProgram} = {
owner = "nobody";
group = config.hardware.cpu.x86.msr.group;
source = lib.getExe cfg.package;
capabilities = "cap_sys_rawio=eip";
};
};
meta.maintainers = with lib.maintainers; [ lorenzleutgeb ];
}

View file

@ -82,6 +82,10 @@ in
"programs"
"gnome-documents"
] "The corresponding package was removed from nixpkgs.")
(mkRemovedOptionModule [
"programs"
"pqos-wrapper"
] "The corresponding package was removed from nixpkgs.") # added 2026-05-13
(mkRemovedOptionModule
[
"services"
@ -386,6 +390,10 @@ in
as the underlying package isn't being maintained. Working alternatives are
libinput and synaptics.
'')
(mkRemovedOptionModule [ "services" "xserver" "windowManager" "ragnarwm" ] ''
The services.xserver.windowManager.ragnarwm module has been removed
because the corresponding package was removed from nixpkgs.
'')
(mkRemovedOptionModule [
"services"
"xmr-stak"
@ -510,6 +518,9 @@ in
(mkRemovedOptionModule [ "services" "xtreemfs" ] ''
services.xtreemfs has been removed as it was broken and unmaintained upstream
'')
(mkRemovedOptionModule [ "services" "xserver" "cmt" ] ''
services.xserver.cmt has been removed as it was broken and unmaintained upstream
'')
# Do NOT add any option renames here, see top of the file
];
}

View file

@ -12,6 +12,7 @@ let
attrValues
concatStringsSep
escapeShellArg
getExe
hasInfix
hasSuffix
optionalAttrs
@ -36,7 +37,7 @@ let
# Check whether any runner instance label requires a container runtime
# Empty label strings result in the upstream defined defaultLabels, which require docker
# https://gitea.com/gitea/act_runner/src/tag/v0.1.5/internal/app/cmd/register.go#L93-L98
# https://gitea.com/gitea/runner/src/tag/v0.1.5/internal/app/cmd/register.go#L93-L98
hasDockerScheme =
instance: instance.labels == [ ] || any (label: hasInfix ":docker:" label) instance.labels;
wantsContainerRuntime = any hasDockerScheme (attrValues cfg.instances);
@ -53,7 +54,7 @@ let
|| (instance.token != null && instance.tokenFile == null);
in
{
meta.maintainers = [ ];
meta.maintainers = pkgs.gitea-actions-runner.meta.maintainers;
options.services.gitea-actions-runner = with types; {
package = mkPackageOption pkgs "gitea-actions-runner" { };
@ -123,8 +124,8 @@ in
};
settings = mkOption {
description = ''
Configuration for `act_runner daemon`.
See <https://gitea.com/gitea/act_runner/src/branch/main/internal/pkg/config/config.example.yaml> for an example configuration
Configuration for gitea-runner daemon.
See <https://gitea.com/gitea/runner/src/branch/main/internal/pkg/config/config.example.yaml> for an example configuration
'';
type = types.submodule {
@ -252,7 +253,7 @@ in
rm -v "$INSTANCE_DIR/.runner" || true
# perform the registration
${cfg.package}/bin/act_runner register --no-interactive \
${getExe cfg.package} register --no-interactive \
--instance ${escapeShellArg instance.url} \
--token "$TOKEN" \
--name ${escapeShellArg instance.name} \
@ -266,7 +267,7 @@ in
'')
];
ExecStart = "${cfg.package}/bin/act_runner daemon --config ${configFile}";
ExecStart = "${getExe cfg.package} daemon --config ${configFile}";
SupplementaryGroups =
optionals wantsDocker [
"docker"

View file

@ -9,7 +9,7 @@ let
fpm = config.services.phpfpm.pools.roundcube;
localDB = cfg.database.host == "localhost";
user = cfg.database.username;
phpWithPspell = pkgs.php83.withExtensions ({ enabled, all }: [ all.pspell ] ++ enabled);
phpWithPspell = pkgs.php84.withExtensions ({ enabled, all }: [ all.pspell ] ++ enabled);
env = {
ASPELL_CONF = "dict-dir ${pkgs.aspellWithDicts (_: cfg.dicts)}/lib/aspell";
@ -184,28 +184,14 @@ in
${cfg.hostName} = {
forceSSL = lib.mkDefault true;
enableACME = lib.mkDefault true;
root = cfg.package;
root = cfg.package + "/public_html";
locations."/" = {
index = "index.php";
priority = 1100;
extraConfig = ''
add_header Cache-Control 'public, max-age=604800, must-revalidate';
client_max_body_size ${toString cfg.maxAttachmentSize};
'';
};
locations."~ ^/(SQL|bin|config|logs|temp|vendor)/" = {
priority = 3110;
extraConfig = ''
return 404;
'';
};
locations."~ ^/(CHANGELOG.md|INSTALL|LICENSE|README.md|SECURITY.md|UPGRADING|composer.json|composer.lock)" =
{
priority = 3120;
extraConfig = ''
return 404;
'';
};
locations."~* \\.php(/|$)" = {
priority = 3130;
extraConfig = ''
@ -213,6 +199,8 @@ in
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
include ${config.services.nginx.package}/conf/fastcgi.conf;
client_max_body_size ${toString cfg.maxAttachmentSize};
'';
};
};

View file

@ -9,7 +9,7 @@ let
in
{
meta.maintainers = with lib.maintainers; [ sebtm ];
meta.maintainers = [ ];
options = {
services.tp-auto-kbbl = {

View file

@ -119,6 +119,7 @@ let
"smartctl"
"smokeping"
"snmp"
"speedtest"
"sql"
"statsd"
"storagebox"

View file

@ -0,0 +1,51 @@
{
config,
lib,
pkgs,
...
}:
let
cfg = config.services.prometheus.exporters.speedtest;
inherit (lib)
mkOption
types
concatStringsSep
optionalString
;
in
{
port = 9798;
extraOpts = {
serverID = mkOption {
type = types.int;
default = -1;
description = ''
Speedtest.net server ID to run tests against.
-1 picks the closest server to your location.
'';
};
serverFallback = mkOption {
type = types.bool;
default = false;
description = ''
If the configured serverID is unavailable, fall back to the closest available server.
'';
};
};
serviceOpts = {
serviceConfig = {
ExecStart = ''
${pkgs.prometheus-speedtest-exporter}/bin/speedtest_exporter \
-listen-address ${cfg.listenAddress} \
-port ${toString cfg.port} \
-server_id ${toString cfg.serverID} \
${optionalString cfg.serverFallback "-server_fallback"} \
${concatStringsSep " \\\n " cfg.extraFlags}
'';
};
};
}

View file

@ -39,7 +39,7 @@ with lib;
};
package = mkPackageOption pkgs "mullvad" {
example = "mullvad-vpn";
example = "pkgs.mullvad-vpn";
extraDescription = ''
`pkgs.mullvad` only provides the CLI tool, `pkgs.mullvad-vpn` provides both the CLI and the GUI.
'';

View file

@ -76,22 +76,23 @@ in
default = null;
apply = v: if v != null then lib.concatStringsSep "," v else null;
description = ''
Blob MIME types that can be served.
Blob mimetypes that can be served. Wildcards are supported "*/*", "image/*", etc.
Validation is done loosely via content inference. Further validation can be done by
a layer above this proxy, such as an image transformation service. When inference
fails, the blob's type falls back to `application/octet-stream`. When that type is
allowed, blobs failing inference can still be served.
Validation is done loosely via content sniffing. Further validation can be done by a layer
above this proxy, such as an image transformation service. When inference fails, the blob's
type falls back to `application/octet-stream`. When that type is allowed, blobs failing
inference can still be served.
'';
};
PORXIE_BLOB_MAX_SIZE = lib.mkOption {
type = lib.types.nullOr lib.types.str;
default = null;
description = ''
Maximum blob size that can be fetched and served.
Maximum blob size that can be served.
Blobs that exceed this limit will return HTTP 413. The minimum value is 512kb
and the maximum is the system's total memory.
Blobs that exceed this limit will return HTTP 413.
The minimum value is 512kb and the maximum is the system's total memory.
'';
};
PORXIE_BLOB_CACHE_HEADER = lib.mkOption {

View file

@ -108,6 +108,18 @@ in
default = [ ];
description = "Extra arguments passed to the Radicale daemon.";
};
user = mkOption {
type = types.str;
default = "radicale";
description = "User account under which Radicale runs.";
};
group = mkOption {
type = types.str;
default = "radicale";
description = "Group under which Radicale runs.";
};
};
config = mkIf cfg.enable {
@ -155,12 +167,16 @@ in
environment.systemPackages = [ pkg ];
users.users.radicale = {
isSystemUser = true;
group = "radicale";
users.users = mkIf (cfg.user == "radicale") {
radicale = {
group = cfg.group;
isSystemUser = true;
};
};
users.groups.radicale = { };
users.groups = mkIf (cfg.group == "radicale") {
radicale = { };
};
systemd.services.radicale = {
description = "A Simple Calendar and Contact Server";
@ -176,8 +192,8 @@ in
]
++ (map escapeShellArg cfg.extraArgs)
);
User = "radicale";
Group = "radicale";
User = cfg.user;
Group = cfg.group;
StateDirectory = "radicale/collections";
StateDirectoryMode = "0750";
# Hardening

View file

@ -490,7 +490,6 @@ in
meta.maintainers = with lib.maintainers; [
jk
dit7ya
nicomem
connor-grady
];

View file

@ -55,6 +55,7 @@ let
pass-basic-auth = passBasicAuth;
pass-host-header = passHostHeader;
reverse-proxy = reverseProxy;
trusted-proxy-ip = trustedProxyIP;
proxy-prefix = proxyPrefix;
profile-url = profileURL;
oidc-issuer-url = oidcIssuerUrl;
@ -495,6 +496,16 @@ in
'';
};
trustedProxyIP = lib.mkOption {
type = with lib.types; listOf str;
default = [ ];
description = ''
List of IPs or CIDR ranges allowed to supply X-Forwarded-* headers when reverseProxy is enabled.
If not set, OAuth2 Proxy preserves backwards compatibility by trusting all source IPs (0.0.0.0/0, ::/0) and logs a warning at startup.
Configure this to your reverse proxy addresses to prevent forwarded header spoofing.
'';
};
proxyPrefix = lib.mkOption {
type = lib.types.str;
default = "/oauth2";
@ -618,6 +629,13 @@ in
}
];
warnings = lib.mkIf (cfg.reverseProxy && cfg.trustedProxyIP == [ ]) [
''
When config.services.oauth2-proxy.reverseProxy is enabled, configure config.services.oauth2-proxy.trustedProxyIP to the IPs or CIDR range(s) of the reverse proxies that are allowed to send X-Forwarded-* headers.
If you leave it unset, OAuth2 Proxy currently trusts all source IPs for backwards compatibility, which means a client that can reach OAuth2 Proxy directly may be able to spoof forwarded headers.
''
];
users.users.oauth2-proxy = {
description = "OAuth2 Proxy";
isSystemUser = true;

View file

@ -393,7 +393,6 @@ in
};
serviceConfig = {
Type = "notify";
# Use "+" because credentialsFile may not be accessible to User= or Group=.
ExecStartPre = [
(
@ -407,7 +406,6 @@ in
)
];
ExecStart = "${cfg.package}/bin/transmission-daemon -f -g ${cfg.home}/${settingsDir} ${escapeShellArgs cfg.extraFlags}";
ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID";
User = cfg.user;
Group = cfg.group;
# Create rootDir in the host's mount namespace.
@ -513,7 +511,18 @@ in
"quotactl"
];
SystemCallArchitectures = "native";
};
}
// (
if lib.versionAtLeast cfg.package.version "4.1.1" then
{
Type = "notify-reload";
}
else
{
Type = "notify";
ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID";
}
);
};
# It's useful to have transmission in path, e.g. for remote control

View file

@ -15,7 +15,7 @@ in
packages = {
motioneye = lib.mkPackageOption pkgs "motioneye" { };
motion = lib.mkPackageOption pkgs "motion" { };
ffmpeg = lib.mkPackageOption pkgs "ffmpeg" { };
ffmpeg = lib.mkPackageOption pkgs "ffmpeg-headless" { };
};
user = lib.mkOption {

View file

@ -8,6 +8,7 @@
let
inherit (lib)
getExe
hasAttr
mapAttrs
match
mkEnableOption
@ -362,6 +363,15 @@ in
config = mkIf cfg.enable {
environment.systemPackages = [ manage ];
# Some settings options in LaSuite has been renamed in 5.0.0
# Show warnings if those settings are not renamed
# TODO: remove it when the retrocompatibility options will be gone
warnings =
(optional (hasAttr "AI_API_KEY" cfg.settings) "AI_API_KEY has been renamed as OPENAI_SDK_API_KEY in LaSuite Docs")
++ (optional (hasAttr "AI_API_KEY_FILE" cfg.settings) "AI_API_KEY_FILE has been renamed as OPENAI_SDK_API_KEY_FILE in LaSuite Docs")
++ (optional (hasAttr "AI_BASE_URL" cfg.settings) "AI_BASE_URL has been renamed as OPENAI_SDK_BASE_URL in LaSuite Docs");
systemd.services.lasuite-docs-postgresql-setup = mkIf cfg.postgresql.createLocally {
wantedBy = [ "lasuite-docs.target" ];
requiredBy = [ "lasuite-docs.service" ];

View file

@ -1,114 +0,0 @@
{
config,
lib,
pkgs,
...
}:
with lib;
let
cfg = config.services.xserver.cmt;
etcPath = "X11/xorg.conf.d";
in
{
options = {
services.xserver.cmt = {
enable = mkOption {
type = types.bool;
default = false;
description = "Enable chrome multitouch input (cmt). Touchpad drivers that are configured for chromebooks.";
};
models = mkOption {
type = types.enum [
"atlas"
"banjo"
"candy"
"caroline"
"cave"
"celes"
"clapper"
"cyan"
"daisy"
"elan"
"elm"
"enguarde"
"eve"
"expresso"
"falco"
"gandof"
"glimmer"
"gnawty"
"heli"
"kevin"
"kip"
"leon"
"lulu"
"orco"
"pbody"
"peppy"
"pi"
"pit"
"puppy"
"quawks"
"rambi"
"samus"
"snappy"
"spring"
"squawks"
"swanky"
"winky"
"wolf"
"auron_paine"
"auron_yuna"
"daisy_skate"
"nyan_big"
"nyan_blaze"
"veyron_jaq"
"veyron_jerry"
"veyron_mighty"
"veyron_minnie"
"veyron_speedy"
];
example = "banjo";
description = ''
Which models to enable cmt for. Enter the Code Name for your Chromebook.
Code Name can be found at <https://www.chromium.org/chromium-os/developer-information-for-chrome-os-devices>.
'';
};
}; # closes services
}; # closes options
config = mkIf cfg.enable {
services.xserver.modules = [ pkgs.xf86-input-cmt ];
environment.etc = {
"${etcPath}/40-touchpad-cmt.conf" = {
source = "${pkgs.chromium-xorg-conf}/40-touchpad-cmt.conf";
};
"${etcPath}/50-touchpad-cmt-${cfg.models}.conf" = {
source = "${pkgs.chromium-xorg-conf}/50-touchpad-cmt-${cfg.models}.conf";
};
"${etcPath}/60-touchpad-cmt-${cfg.models}.conf" = {
source = "${pkgs.chromium-xorg-conf}/60-touchpad-cmt-${cfg.models}.conf";
};
};
assertions = [
{
assertion = !config.services.libinput.enable;
message = ''
cmt and libinput are incompatible, meaning you cannot enable them both.
To use cmt you need to disable libinput with `services.libinput.enable = false`
If you haven't enabled it in configuration.nix, it's enabled by default on a
different xserver module.
'';
}
];
};
}

View file

@ -34,7 +34,6 @@ in
./openbox.nix
./pekwm.nix
./notion.nix
./ragnarwm.nix
./ratpoison.nix
./sawfish.nix
./smallwm.nix

View file

@ -1,31 +0,0 @@
{
config,
lib,
pkgs,
...
}:
with lib;
let
cfg = config.services.xserver.windowManager.ragnarwm;
in
{
###### interface
options = {
services.xserver.windowManager.ragnarwm = {
enable = mkEnableOption "ragnarwm";
package = mkPackageOption pkgs "ragnarwm" { };
};
};
###### implementation
config = mkIf cfg.enable {
services.displayManager.sessionPackages = [ cfg.package ];
environment.systemPackages = [ cfg.package ];
};
meta.maintainers = with lib.maintainers; [ sigmanificient ];
}

View file

@ -143,6 +143,8 @@ let
"final.target"
"kexec.target"
"systemd-kexec.service"
"soft-reboot.target"
"systemd-soft-reboot.service"
]
++ lib.optional cfg.package.withUtmp "systemd-update-utmp.service"
++ [

View file

@ -1,7 +1,6 @@
{
config,
lib,
pkgs,
...
}:
@ -51,6 +50,9 @@
];
boot.initrd.systemd = {
storePaths = lib.mkIf config.system.etc.overlay.mutable [
"${config.system.nixos-init.package}/bin/clear-etc-opaque"
];
mounts = [
{
where = "/run/nixos-etc-metadata";
@ -131,13 +133,20 @@
before = [ "initrd-fs.target" ];
unitConfig = {
DefaultDependencies = false;
RequiresMountsFor = "/sysroot";
RequiresMountsFor = [
"/sysroot"
# Needed so we can clear stale opaque markers from the
# upperdir based on the contents of the new metadata layer
# before the overlay is mounted.
"/run/nixos-etc-metadata"
];
};
serviceConfig = {
Type = "oneshot";
ExecStart = ''
/bin/mkdir -p -m 0755 /sysroot/.rw-etc/upper /sysroot/.rw-etc/work
'';
ExecStart = [
"/bin/mkdir -p -m 0755 /sysroot/.rw-etc/upper /sysroot/.rw-etc/work"
"${config.system.nixos-init.package}/bin/clear-etc-opaque /run/nixos-etc-metadata /sysroot/.rw-etc/upper"
];
};
};
})

View file

@ -285,6 +285,13 @@ in
tmpMetadataMount=$(TMPDIR="/run" mktemp --directory -t nixos-etc-metadata.XXXXXXXXXX)
mount --type erofs --options ro,nodev,nosuid ${config.system.build.etcMetadataImage} "$tmpMetadataMount"
${lib.optionalString config.system.etc.overlay.mutable ''
# Clear stale opaque markers from the upperdir so that lowerdir
# entries added by the new generation are not hidden.
# See https://github.com/NixOS/nixpkgs/issues/505475
${config.system.nixos-init.package}/bin/clear-etc-opaque "$tmpMetadataMount" /.rw-etc/upper
''}
# There was no previous /etc mounted. This happens when we're called
# directly without an initrd, like with nixos-enter.
if ! mountpoint -q /etc; then

View file

@ -51,6 +51,71 @@ let
(lib.concatStringsSep " ")
];
# Converts an IPv4 address literal to a list of bits
parseAddr.ipv4 =
addr:
let
pad = b: lib.replicate (8 - builtins.length b) 0 ++ b;
toBin = n: pad (lib.toBaseDigits 2 (lib.toInt n));
in
lib.concatMap toBin (builtins.splitVersion addr);
# Converts an IPv6 address literal to a list of bits
parseAddr.ipv6 =
addr:
let
pad = b: lib.replicate (16 - builtins.length b) 0 ++ b;
fromHex = n: (builtins.fromTOML "n = 0x${n}").n;
toBin = n: pad (lib.toBaseDigits 2 (fromHex n));
normal = (lib.network.ipv6.fromString addr).address;
in
lib.concatMap toBin (lib.splitString ":" normal);
# Checks if `addr` is part of the `net` subnet
inSubnet =
v: net: addr:
let
prefix = lib.take net.prefixLength (parseAddr.${v} net.address);
match = lib.zipListsWith (a: b: a == b) prefix (parseAddr.${v} addr);
in
lib.all lib.id match;
# Checks if the netmask of all addresses on interface `iface` includes
# the IP address of `gateway`
#
# Note: this is used to check whether networking.defaultGateway relies on
# the given interface, either explicitly, via the `interface` (optional),
# or explicitly, by using an address in a subnet of this interface.
#
# Configuration of the default gateway is then performed as part of that
# interface setup in `configureAddrs`, below.
isGateway =
v: gateway: iface:
lib.any lib.id (
[ (iface.name == gateway.interface) ]
++ map (net: inSubnet v net gateway.address) iface.${v}.addresses
);
# Checks if `gateway` uses an address from `iface` as default source
#
# Note: this is needed to delay the configuration of the gateway and default
# source until the right interfaces and address have been set up, otherwise
# the commands will fail.
hasSource =
v: gateway: iface:
builtins.elem gateway.source (map (i: i.address) iface.${v}.addresses);
# Interfaces corresponding to the default gateways
gateway4Iface = builtins.filter (isGateway "ipv4" cfg.defaultGateway) interfaces;
gateway6Iface = builtins.filter (isGateway "ipv6" cfg.defaultGateway6) interfaces;
# Interfaces corresponding to the default source addresses
#
# Note: the use of `head` here is safe because these expressions
# are evaluated only when `needsSourceIface`, see `configureAddrs` below.
source4Iface = builtins.head (builtins.filter (hasSource "ipv4" cfg.defaultGateway) interfaces);
source6Iface = builtins.head (builtins.filter (hasSource "ipv6" cfg.defaultGateway6) interfaces);
# warn that these attributes are deprecated (2017-2-2)
# Should be removed in the release after next
bondDeprecation = rec {
@ -118,121 +183,71 @@ let
else
optional (!config.boot.isContainer) (subsystemDevice dev);
hasDefaultGatewaySet =
(cfg.defaultGateway != null && cfg.defaultGateway.address != "")
|| (cfg.enableIPv6 && cfg.defaultGateway6 != null && cfg.defaultGateway6.address != "");
needNetworkSetup =
cfg.resolvconf.enable || cfg.defaultGateway != null || cfg.defaultGateway6 != null;
networkLocalCommands = lib.mkIf needNetworkSetup {
after = [ "network-setup.service" ];
bindsTo = [ "network-setup.service" ];
};
networkSetup = lib.mkIf needNetworkSetup {
description = "Networking Setup";
after = [ "network-pre.target" ];
before = [
"network.target"
"shutdown.target"
];
wants = [ "network.target" ];
# exclude bridges from the partOf relationship to fix container networking bug #47210
partOf = map (i: "network-addresses-${i.name}.service") (
filter (i: !(hasAttr i.name cfg.bridges)) interfaces
);
conflicts = [ "shutdown.target" ];
wantedBy = [ "multi-user.target" ] ++ optional hasDefaultGatewaySet "network-online.target";
unitConfig.ConditionCapability = "CAP_NET_ADMIN";
path = [ pkgs.iproute2 ];
serviceConfig = {
Type = "oneshot";
RemainAfterExit = true;
};
unitConfig.DefaultDependencies = false;
script = ''
${optionalString config.networking.resolvconf.enable ''
# Set the static DNS configuration, if given.
${pkgs.openresolv}/sbin/resolvconf -m 1 -a static <<EOF
${optionalString (cfg.nameservers != [ ] && cfg.domain != null) ''
domain ${cfg.domain}
''}
${optionalString (cfg.search != [ ]) ("search " + concatStringsSep " " cfg.search)}
${flip concatMapStrings cfg.nameservers (ns: ''
nameserver ${ns}
'')}
EOF
''}
# Set the default gateway
${flip concatMapStrings
[
{
version = "-4";
gateway = cfg.defaultGateway;
}
{
version = "-6";
gateway = cfg.defaultGateway6;
}
]
(
{ version, gateway }:
optionalString (gateway != null && gateway.address != "") ''
${optionalString (gateway.interface != null) ''
ip ${version} route replace ${gateway.address} proto static ${
formatIpArgs {
metric = gateway.metric;
dev = gateway.interface;
}
}
''}
ip ${version} route replace default proto static ${
formatIpArgs {
metric = gateway.metric;
via = gateway.address;
window = cfg.defaultGatewayWindowSize;
dev = gateway.interface;
src = gateway.source;
}
}
''
)
}
'';
};
# For each interface <foo>, create a job network-addresses-<foo>.service"
# that performs static address configuration. It has a "wants"
# dependency on <foo>.service, which is supposed to create
# the interface and need not exist (i.e. for hardware
# interfaces). It has a binds-to dependency on the actual
# network device, so it only gets started after the interface
# has appeared, and it's stopped when the interface
# disappears.
# For each interface <foo>, creates a network-addresses-<foo>.service
# job that performs static address configuration.
#
# It has a Wants dependency on <foo>-netdev.service, which creates
# create the interface, or on a device unit (for hardware interfaces).
# It also has a BindsTo dependency on the device unit: so, it only gets
# started after the interface has appeared and it's stopped when the
# interface disappears.
#
# Unless in a container, the job is not made part of network.target, so
# if an interface is not found (e.g. a USB interface not plugged in) it
# will not hang the boot sequence.
#
# If the interface is the default gateway, the job will also set the
# default gateway and delay network-online.target.
configureAddrs =
i:
let
ips = interfaceIps i;
isDefaultGateway4 = cfg.defaultGateway != null && builtins.elem i gateway4Iface;
isDefaultGateway6 = cfg.defaultGateway6 != null && builtins.elem i gateway6Iface;
needsSourceIface4 =
isDefaultGateway4 && cfg.defaultGateway.source != null && i.name != source4Iface.name;
needsSourceIface6 =
isDefaultGateway6 && cfg.defaultGateway6.source != null && i.name != source6Iface.name;
configureGateway =
version: gateway:
optionalString (gateway.address != "") ''
echo -n "setting ${i.name} as default IPv${version} gateway... "
${optionalString (gateway.interface != null) ''
ip -${version} route replace ${gateway.address} proto static ${
formatIpArgs {
metric = gateway.metric;
dev = gateway.interface;
}
}
''}
ip -${version} route replace default proto static ${
formatIpArgs {
metric = gateway.metric;
via = gateway.address;
window = cfg.defaultGatewayWindowSize;
dev = gateway.interface;
src = gateway.source;
}
}
echo "done"
'';
in
nameValuePair "network-addresses-${i.name}" {
description = "Address configuration of ${i.name}";
wantedBy = [
"network-setup.service"
"network.target"
];
# order before network-setup because the routes that are configured
# there may need ip addresses configured
before = [ "network-setup.service" ];
wantedBy =
deviceDependency i.name
++ optional config.boot.isContainer "network.target"
++ optional (isDefaultGateway4 || isDefaultGateway6) "network-online.target";
bindsTo = deviceDependency i.name;
after = [ "network-pre.target" ] ++ (deviceDependency i.name);
partOf = [ "networking-scripted.target" ];
after = [
"network-pre.target"
]
++ optional needsSourceIface4 "network-addresses-${source4Iface.name}.service"
++ optional needsSourceIface6 "network-addresses-${source6Iface.name}.service"
++ deviceDependency i.name;
serviceConfig.Type = "oneshot";
serviceConfig.RemainAfterExit = true;
# Restart rather than stop+start this unit to prevent the
@ -284,6 +299,10 @@ let
fi
''
)}
# Set the default gateway
${optionalString isDefaultGateway4 (configureGateway "4" cfg.defaultGateway)}
${optionalString isDefaultGateway6 (configureGateway "6" cfg.defaultGateway6)}
'';
preStop = ''
state="/run/nixos/network/routes/${i.name}"
@ -311,13 +330,13 @@ let
nameValuePair "${i.name}-netdev" {
description = "Virtual Network Interface ${i.name}";
bindsTo = optional (!config.boot.isContainer) "dev-net-tun.device";
partOf = [ "networking-scripted.target" ];
after = optional (!config.boot.isContainer) "dev-net-tun.device" ++ [ "network-pre.target" ];
wantedBy = [
"network.target"
"network-setup.service"
(subsystemDevice i.name)
];
before = [ "network-setup.service" ];
before = [ "network.target" ];
path = [ pkgs.iproute2 ];
serviceConfig = {
Type = "oneshot";
@ -343,18 +362,21 @@ let
description = "Bridge Interface ${n}";
wantedBy = [
"network.target"
"network-setup.service"
(subsystemDevice n)
];
bindsTo = deps ++ optional v.rstp "mstpd.service";
partOf = [ "network-setup.service" ] ++ optional v.rstp "mstpd.service";
partOf = [
"network.target"
"networking-scripted.target"
]
++ optional v.rstp "mstpd.service";
after = [
"network-pre.target"
]
++ deps
++ optional v.rstp "mstpd.service"
++ map (i: "network-addresses-${i}.service") v.interfaces;
before = [ "network-setup.service" ];
before = [ "network.target" ];
serviceConfig.Type = "oneshot";
serviceConfig.RemainAfterExit = true;
path = [ pkgs.iproute2 ];
@ -448,15 +470,14 @@ let
description = "Open vSwitch Interface ${n}";
wantedBy = [
"network.target"
"network-setup.service"
(subsystemDevice n)
]
++ internalConfigs;
# before = [ "network-setup.service" ];
# should work without internalConfigs dependencies because address/link configuration depends
# on the device, which is created by ovs-vswitchd with type=internal, but it does not...
before = [ "network-setup.service" ] ++ internalConfigs;
partOf = [ "network-setup.service" ]; # shutdown the bridge when network is shutdown
before = [ "network.target" ] ++ internalConfigs;
partOf = [
"network.target"
"networking-scripted.target"
]; # shutdown the bridge when network is shutdown
bindsTo = [ "ovs-vswitchd.service" ]; # requires ovs-vswitchd to be alive at all times
after = [
"network-pre.target"
@ -521,12 +542,12 @@ let
description = "Bond Interface ${n}";
wantedBy = [
"network.target"
"network-setup.service"
(subsystemDevice n)
];
bindsTo = deps;
partOf = [ "networking-scripted.target" ];
after = [ "network-pre.target" ] ++ deps ++ map (i: "network-addresses-${i}.service") v.interfaces;
before = [ "network-setup.service" ];
before = [ "network.target" ];
serviceConfig.Type = "oneshot";
serviceConfig.RemainAfterExit = true;
path = [
@ -570,12 +591,12 @@ let
description = "MACVLAN Interface ${n}";
wantedBy = [
"network.target"
"network-setup.service"
(subsystemDevice n)
];
bindsTo = deps;
partOf = [ "networking-scripted.target" ];
after = [ "network-pre.target" ] ++ deps;
before = [ "network-setup.service" ];
before = [ "network.target" ];
serviceConfig.Type = "oneshot";
serviceConfig.RemainAfterExit = true;
path = [ pkgs.iproute2 ];
@ -602,12 +623,12 @@ let
description = "IPVLAN Interface ${n}";
wantedBy = [
"network.target"
"network-setup.service"
(subsystemDevice n)
];
bindsTo = deps;
partOf = [ "networking-scripted.target" ];
after = [ "network-pre.target" ] ++ deps;
before = [ "network-setup.service" ];
before = [ "network.target" ];
serviceConfig.Type = "oneshot";
serviceConfig.RemainAfterExit = true;
path = [ pkgs.iproute2 ];
@ -647,12 +668,12 @@ let
description = "FOU endpoint ${n}";
wantedBy = [
"network.target"
"network-setup.service"
(subsystemDevice n)
];
bindsTo = deps;
partOf = [ "networking-scripted.target" ];
after = [ "network-pre.target" ] ++ deps;
before = [ "network-setup.service" ];
before = [ "network.target" ];
serviceConfig.Type = "oneshot";
serviceConfig.RemainAfterExit = true;
path = [ pkgs.iproute2 ];
@ -677,12 +698,11 @@ let
description = "IPv6 in IPv4 Tunnel Interface ${n}";
wantedBy = [
"network.target"
"network-setup.service"
(subsystemDevice n)
];
bindsTo = deps;
after = [ "network-pre.target" ] ++ deps;
before = [ "network-setup.service" ];
before = [ "network.target" ];
serviceConfig.Type = "oneshot";
serviceConfig.RemainAfterExit = true;
path = [ pkgs.iproute2 ];
@ -720,12 +740,12 @@ let
description = "IP in IP Tunnel Interface ${n}";
wantedBy = [
"network.target"
"network-setup.service"
(subsystemDevice n)
];
bindsTo = deps;
partOf = [ "networking-scripted.target" ];
after = [ "network-pre.target" ] ++ deps;
before = [ "network-setup.service" ];
before = [ "network.target" ];
serviceConfig.Type = "oneshot";
serviceConfig.RemainAfterExit = true;
path = [ pkgs.iproute2 ];
@ -768,12 +788,12 @@ let
description = "GRE Tunnel Interface ${n}";
wantedBy = [
"network.target"
"network-setup.service"
(subsystemDevice n)
];
bindsTo = deps;
partOf = [ "networking-scripted.target" ];
after = [ "network-pre.target" ] ++ deps;
before = [ "network-setup.service" ];
before = [ "network.target" ];
serviceConfig.Type = "oneshot";
serviceConfig.RemainAfterExit = true;
path = [ pkgs.iproute2 ];
@ -803,13 +823,15 @@ let
description = "VLAN Interface ${n}";
wantedBy = [
"network.target"
"network-setup.service"
(subsystemDevice n)
];
bindsTo = deps;
partOf = [ "network-setup.service" ];
partOf = [
"network.target"
"networking-scripted.target"
];
after = [ "network-pre.target" ] ++ deps;
before = [ "network-setup.service" ];
before = [ "network.target" ];
serviceConfig.Type = "oneshot";
serviceConfig.RemainAfterExit = true;
path = [ pkgs.iproute2 ];
@ -845,13 +867,39 @@ let
// mapAttrs' createGreDevice cfg.greTunnels
// mapAttrs' createVlanDevice cfg.vlans
// {
network-setup = networkSetup;
network-local-commands = networkLocalCommands;
network-local-commands = {
after = [ "network-pre.target" ];
wantedBy = [ "network.target" ];
};
};
services.udev.extraRules = ''
KERNEL=="tun", TAG+="systemd"
'';
# Note: the scripted networking backend consistent of many
# independent services that are linked to the network.target.
# Since there is no daemon (e.g systemd-networkd) that is
# started as part of the system and pulls in network.target.
# Thus, to start these services we link network.target directly
# to multi-user.target, this has the same result.
systemd.targets.network.wantedBy = [ "multi-user.target" ];
# This target serves no purpose during the boot, but can be
# used to quickly reset the network configuration by running
# systemctl restart networking-scripted.target
systemd.targets.networking-scripted = {
description = "NixOS scripted networking setup";
};
services.udev.extraRules = lib.concatStringsSep "\n" (
[ ''KERNEL=="tun", TAG+="systemd"'' ]
# This creates a udev rule to start each service with a WantedBy
# dependency on a device unit. It's needed because if the service
# unit is loaded in stage 2 but its device was already up by
# stage 1, systemd will not automatically start it.
++ lib.forEach (lib.attrNames cfg.interfaces) (
iface:
''ACTION=="add", SUBSYSTEM=="net", KERNEL=="${iface}", ''
+ ''ENV{SYSTEMD_WANTS}="network-addresses-${iface}.service"''
)
);
};

View file

@ -747,10 +747,9 @@ in
default = "";
example = "text=anything; echo You can put $text here.";
description = ''
Shell commands to be executed at the end of the
`network-setup` systemd service. Note that if
you are using DHCP to obtain the network configuration,
interfaces may not be fully configured yet.
Shell commands to be executed after all the network
interfaces have been created, but not necessarily
fully configured.
'';
};
@ -1853,6 +1852,20 @@ in
'';
};
};
networking.localCommands = lib.mkIf config.networking.resolvconf.enable ''
# Set the static DNS configuration, if given.
${pkgs.openresolv}/sbin/resolvconf -m 1 -a static <<EOF
${optionalString (cfg.nameservers != [ ] && cfg.domain != null) ''
domain ${cfg.domain}
''}
${optionalString (cfg.search != [ ]) ("search " + concatStringsSep " " cfg.search)}
${flip concatMapStrings cfg.nameservers (ns: ''
nameserver ${ns}
'')}
EOF
'';
services.mstpd = mkIf needsMstpd { enable = true; };
virtualisation.vswitch = mkIf (cfg.vswitches != { }) { enable = true; };

View file

@ -157,6 +157,14 @@ in
Whether to periodically prune Docker resources. If enabled, a
systemd timer will run `docker system prune -f`
as specified by the `dates` option.
NOTE: by default this does not prune volumes. Anonymous volumes
can be pruned by passing "--volumes" to [autoPrune.flags](#opt-virtualisation.docker.autoPrune.flags).
To prune all volumes (not just anonymous ones) [`autoPrune.allVolumes.enable`](#opt-virtualisation.docker.autoPrune.allVolumes.enable)
must be used.
See [upstream documentation](https://docs.docker.com/reference/cli/docker/system/prune/#description) for further information.
'';
};
@ -206,6 +214,28 @@ in
system was powered down.
'';
};
allVolumes = {
enable = mkOption {
type = types.bool;
default = false;
description = ''
Whether to periodically prune all Docker volumes when auto pruning other docker resources
by running {command}`docker volume prune --force --all`
To prune only anonymous volumes, instead pass `--volumes` to `autoPrune.flags`
'';
};
flags = mkOption {
type = types.listOf types.str;
default = [ ];
example = [ "--filter=label=<label>" ];
description = ''
Any additional flags passed to {command}`docker volume prune --force --all`.
'';
};
};
};
package = mkPackageOption pkgs "docker" { };
@ -312,15 +342,29 @@ in
serviceConfig = {
Type = "oneshot";
ExecStart = utils.escapeSystemdExecArgs (
[
(lib.getExe cfg.package)
"system"
"prune"
"-f"
]
++ cfg.autoPrune.flags
);
ExecStart = [
(utils.escapeSystemdExecArgs (
[
(lib.getExe cfg.package)
"system"
"prune"
"-f"
]
++ cfg.autoPrune.flags
))
]
++ (optionals cfg.autoPrune.allVolumes.enable [
(utils.escapeSystemdExecArgs (
[
(lib.getExe cfg.package)
"volume"
"prune"
"--force"
"--all"
]
++ cfg.autoPrune.allVolumes.flags
))
]);
};
startAt = optional cfg.autoPrune.enable cfg.autoPrune.dates;
@ -342,6 +386,10 @@ in
-> config.hardware.graphics.enable32Bit or false;
message = "Option enableNvidia on x86_64 requires 32-bit support libraries";
}
{
assertion = cfg.autoPrune.allVolumes.enable -> cfg.autoPrune.enable;
message = "Option autoPrune.allVolumes.enable requires autoPrune.enable";
}
];
virtualisation.docker.daemon.settings = {

View file

@ -21,8 +21,6 @@ let
cfg = config.virtualisation;
in
{
imports = [ ../guest-networking-options.nix ];
options = {
virtualisation.cmdline = lib.mkOption {

View file

@ -101,8 +101,17 @@ def ensure_vlan_bridge(vlan: int) -> typing.Generator[str, None, None]:
# releasing this vlan, grab an exclusive lock.
with vlan_lock(vlan):
if bridge_path.exists():
child_intf_count = len(list((bridge_path / "brif").iterdir()))
if child_intf_count == 0:
# The VDE tap is owned by the test driver's vde_plug2tap
# and shares its lifetime with the vlan, not with any
# container. Don't count it when deciding whether the
# bridge is still in use, otherwise the bridge would
# never be deleted as long as vde_plug2tap is alive.
child_intfs = [
p.name
for p in (bridge_path / "brif").iterdir()
if p.name != tap_name
]
if not child_intfs:
logger.info("deleting bridge %s", bridge_name)
run_ip("link", "delete", bridge_name)

View file

@ -399,7 +399,6 @@ in
imports = [
../profiles/qemu-guest.nix
./disk-size-option.nix
./guest-networking-options.nix
(mkRenamedOptionModule
[
"virtualisation"

View file

@ -27,6 +27,12 @@
specialisation.new-generation.configuration = {
environment.etc."newgen".text = "newgen";
# Regression test for https://github.com/NixOS/nixpkgs/issues/505475:
# A symlink in a subdirectory that does not exist in the base generation's
# lowerdir. If something creates that subdirectory at runtime before
# switching (e.g. stage-2-init.sh creating /etc/nixos), overlayfs makes it
# opaque, hiding lowerdir content added by the new generation.
environment.etc."nixos/newlink".source = pkgs.emptyDirectory;
};
specialisation.newer-generation.configuration = {
environment.etc."newergen".text = "newergen";
@ -53,6 +59,13 @@
machine.succeed("stat --format '%F' /etc/modetest2 | tee /dev/stderr | grep -Eq '^regular file$'")
machine.succeed("stat --format '%a' /etc/modetest2 | tee /dev/stderr | grep -Eq '^300$'")
with subtest("/etc/nixos created by stage-2-init is opaque in upperdir"):
# stage-2-init.sh unconditionally runs `install -d /etc/nixos`. Since
# /nixos is not in the lowerdir, overlayfs creates it as an opaque dir
# in the upperdir. Verify this precondition for the regression test below.
machine.succeed("test -d /.rw-etc/upper/nixos")
print(machine.succeed("getfattr -h -d -m 'trusted.overlay' /.rw-etc/upper/nixos 2>&1 || true"))
with subtest("switching to the same generation"):
machine.succeed("/run/current-system/bin/switch-to-configuration test")
@ -77,6 +90,15 @@
assert machine.succeed("cat /etc/newgen") == "newgen"
assert machine.succeed("cat /etc/mutable") == "mutable"
# Regression test for https://github.com/NixOS/nixpkgs/issues/505475:
# The opaque /etc/nixos in the upperdir (created by stage-2-init.sh
# before /nixos existed in the lowerdir) must not hide lowerdir entries
# added by the new generation. The activation script must have cleared
# the stale opaque marker.
print(machine.succeed("ls -la /etc/nixos/"))
machine.succeed("test -L /etc/nixos/newlink")
machine.fail("getfattr -h -n trusted.overlay.opaque /.rw-etc/upper/nixos")
print(machine.succeed("findmnt /etc/mountpoint"))
print(machine.succeed("stat /etc/mountpoint/extra-file"))
print(machine.succeed("findmnt /etc/filemount"))
@ -93,5 +115,23 @@
numOfMetaMounts = len(metaMounts.splitlines())
assert numOfTmpMounts == 0, f"Found {numOfTmpMounts} remaining tmpmounts"
assert numOfMetaMounts == 1, f"Found {numOfMetaMounts} remaining metamounts"
with subtest("stale opaque markers are cleared by initrd on boot (NixOS/nixpkgs#505475)"):
# Simulate the bug precondition: an opaque /pam.d in the upperdir.
# /pam.d is guaranteed to exist as a directory in the metadata layer.
machine.succeed("mkdir -p /.rw-etc/upper/pam.d")
machine.succeed("setfattr -h -n trusted.overlay.opaque -v y /.rw-etc/upper/pam.d")
machine.succeed("getfattr -h -n trusted.overlay.opaque /.rw-etc/upper/pam.d")
# Also create a non-opaque upperdir directory that exists in the
# metadata layer, to ensure clear-etc-opaque tolerates the
# already-clear case.
machine.succeed("mkdir -p /.rw-etc/upper/systemd")
# Reboot and verify the initrd rw-etc service cleared the opaque marker.
machine.shutdown()
machine.start()
machine.wait_for_unit("multi-user.target")
machine.fail("getfattr -h -n trusted.overlay.opaque /.rw-etc/upper/pam.d")
machine.succeed("test -e /etc/pam.d/login")
'';
}

View file

@ -468,6 +468,7 @@ in
dnsdist = import ./dnsdist.nix { inherit pkgs runTest; };
doas = runTest ./doas.nix;
docker = runTestOn [ "aarch64-linux" "x86_64-linux" ] ./docker.nix;
docker-autoprune = runTestOn [ "aarch64-linux" "x86_64-linux" ] ./docker-autoprune.nix;
docker-registry = runTest ./docker-registry.nix;
docker-rootless = runTestOn [ "aarch64-linux" "x86_64-linux" ] ./docker-rootless.nix;
docker-tools = runTestOn [ "x86_64-linux" ] ./docker-tools.nix;
@ -1416,7 +1417,6 @@ in
radicale = runTest ./radicale.nix;
radicle = runTest ./radicle.nix;
radicle-ci-broker = runTest ./radicle-ci-broker.nix;
ragnarwm = runTestOn [ "x86_64-linux" "aarch64-linux" ] ./ragnarwm.nix;
rasdaemon = runTest ./rasdaemon.nix;
rathole = runTest ./rathole.nix;
rauc = runTest ./rauc.nix;
@ -1770,6 +1770,7 @@ in
vector = import ./vector { inherit runTest; };
velocity = runTest ./velocity.nix;
vengi-tools = runTest ./vengi-tools.nix;
veroroute = runTest ./veroroute.nix;
victorialogs = import ./victorialogs { inherit runTest; };
victoriametrics = import ./victoriametrics { inherit runTest; };
victoriatraces = import ./victoriatraces { inherit runTest; };

View file

@ -28,7 +28,7 @@
position = "start-of-file";
}
];
vendorHash = "sha256-MGgFbglyW/1CMhT1b83ETH70gRkz89s/Gp4seR2g7xI=";
vendorHash = "sha256-66WNU+t/frHfbxexYdiXzgXKLxPyLnN6JuKnlG/kSQY=";
};
};
};

View file

@ -0,0 +1,57 @@
# This test validates the docker autoprune service, testing whether
# the default configuration cleans up images, while leaving volumes intact
# and whether the allVolumes option enables cleaning up volumes as well
{ pkgs, ... }:
{
name = "docker";
nodes = {
prune =
{ pkgs, ... }:
{
virtualisation.docker = {
enable = true;
package = pkgs.docker;
autoPrune = {
enable = true;
};
};
};
prunevolumes =
{ pkgs, ... }:
{
virtualisation.docker = {
enable = true;
package = pkgs.docker;
autoPrune = {
enable = true;
allVolumes.enable = true;
};
};
};
};
testScript = ''
start_all()
with subtest("Check whether autoPrune works. Volumes should be left unpruned."):
prune.wait_for_unit("sockets.target")
prune.succeed("docker network create testnetwork")
prune.succeed("docker network list --format json | grep testnetwork")
prune.succeed("docker volume create testvolume")
prune.succeed("docker volume list --format json | grep testvolume")
prune.succeed("systemctl start -v docker-prune")
prune.fail("docker network list --format json | grep testnetwork")
# the volume has been left alone
prune.succeed("docker volume list --format json | grep testvolume")
with subtest("Check whether autoPrune including volumes works"):
prunevolumes.wait_for_unit("sockets.target")
prunevolumes.succeed("docker volume create testvolume")
prunevolumes.succeed("docker volume list --format json | grep testvolume")
prunevolumes.succeed("systemctl start -v docker-prune")
prunevolumes.fail("docker volume list --format json | grep testvolume")
'';
}

View file

@ -77,7 +77,7 @@
machine.send_chars("pgp_p4ssphrase")
machine.wait_until_tty_matches("1", "Passphrases match")
machine.send_chars("\n")
machine.wait_until_tty_matches("1", "public and secret key created")
machine.wait_until_tty_matches("1", "secret key created and signed")
with subtest("Confirm the key is in the keyring"):
machine.wait_until_succeeds(as_alice("gpg --list-secret-keys | grep -q alice@machine"))
@ -92,7 +92,7 @@
# Note: again, this needs a tty because of pinentry
machine.send_chars("ssh-add alice\n")
machine.wait_until_tty_matches("1", "Enter passphrase")
machine.wait_until_tty_matches("1", "passphrase for")
machine.send_chars("ssh_p4ssphrase\n")
machine.wait_until_tty_matches("1", "Please enter")
machine.send_chars("ssh_agent_p4ssphrase")

View file

@ -44,17 +44,13 @@ let
defaultGateway6 = {
address = "fd00:1234:5678:1::1";
interface = "enp1s0";
source = "fd00:1234:5678:1::3";
source = "fd00:1234:5678:1::3"; # implicit dependency on enp2s0
};
interfaces.enp1s0.ipv6.addresses = [
{
address = "fd00:1234:5678:1::2";
prefixLength = 64;
}
{
address = "fd00:1234:5678:1::3";
prefixLength = 128;
}
];
interfaces.enp1s0.ipv4.addresses = [
{
@ -76,6 +72,12 @@ let
prefixLength = 24;
}
];
interfaces.enp2s0.ipv6.addresses = [
{
address = "fd00:1234:5678:1::3";
prefixLength = 128;
}
];
};
};
testScript = ''
@ -108,6 +110,41 @@ let
client.succeed("ip -6 route show default | grep -q 'src fd00:1234:5678:1::3'")
'';
};
dynamicInterface = {
name = "dynamicInterface";
nodes.machine = clientConfig {
networking.interfaces.usb0 = {
ipv6.addresses = lib.singleton {
address = "fd::1";
prefixLength = 127;
};
};
networking.defaultGateway6 = {
address = "fd::";
interface = "usb0";
source = "fd::1";
};
};
testScript = ''
with subtest("Network comes up without usb0"):
machine.wait_for_unit("network.target")
with subtest("multi-user.target does not hang"):
machine.require_unit_state("multi-user.target", "active")
with subtest("usb0 is configured when plugged in"):
machine.succeed("ip link add usb0 type sit local 1.2.3.4")
machine.wait_until_succeeds("ip addr show dev usb0 | grep -q fd::1")
with subtest("Network is now online"):
machine.systemctl("start network-online.target")
machine.require_unit_state("network-online.target", "active")
with subtest("Default gateway is now set"):
machine.succeed("ip -6 route show default | grep -q 'via fd::'")
machine.succeed("ip -6 route show default | grep -q 'src fd::1'")
'';
};
routeType = {
name = "RouteType";
nodes.client = clientConfig {

View file

@ -1737,6 +1737,16 @@ let
enable = true;
tokenFile = "/tmp/faketoken";
};
metricProvider = {
networking = {
# The exporter tries to access Hetzner on startup and crashes.
# Blocking this on the firewall level allows the exporter to start.
extraHosts = "127.0.0.1 api.hetzner.com";
firewall.extraCommands = ''
iptables -A OUTPUT -p tcp --dport 443 -d 127.0.0.1 -j DROP
'';
};
};
exporterTest = ''
succeed(
'echo faketoken > /tmp/faketoken'

View file

@ -1,38 +0,0 @@
{ lib, ... }:
{
name = "ragnarwm";
meta = {
maintainers = with lib.maintainers; [ sigmanificient ];
};
nodes.machine =
{ pkgs, lib, ... }:
{
imports = [
./common/x11.nix
./common/user-account.nix
];
test-support.displayManager.auto.user = "alice";
services.displayManager.defaultSession = lib.mkForce "ragnar";
services.xserver.windowManager.ragnarwm.enable = true;
# Setup the default terminal of Ragnar
environment.systemPackages = [ pkgs.alacritty ];
};
testScript = ''
with subtest("ensure x starts"):
machine.wait_for_x()
machine.wait_for_file("/home/alice/.Xauthority")
machine.succeed("xauth merge ~alice/.Xauthority")
with subtest("ensure we can open a new terminal"):
# Sleeping a bit before the test, as it may help for sending keys
machine.sleep(2)
machine.send_key("meta_l-ret")
machine.wait_for_window(r"alice.*?machine")
machine.sleep(2)
machine.screenshot("terminal")
'';
}

View file

@ -33,6 +33,6 @@
roundcube.wait_for_unit("postgresql.target")
roundcube.wait_for_unit("phpfpm-roundcube.service")
roundcube.wait_for_unit("nginx.service")
roundcube.succeed("curl -sSfL http://roundcube/ | grep 'Keep me logged in'")
t.assertIn("Keep me logged in", roundcube.succeed("curl -sSfL http://roundcube/"))
'';
}

View file

@ -87,24 +87,42 @@ let
# Pre-generate keys for all directory authorities
daKeysets = lib.genAttrs daNames mkDAKeys;
# Read a fingerprint text file from a derivation output
readFP = keys: file: builtins.readFile "${keys}/${file}";
# Script that writes /run/tor/dirauth.conf by reading the DA fingerprints
# from the pre-generated key derivations at runtime. The ${daKeysets.<name>}
# interpolations resolve to store-path strings at evaluation time (the
# derivations become build dependencies of the node closure), but their
# contents are only read when the script runs on the VM, so no
# import-from-derivation is required.
#
# Written into /run/tor (tor's RuntimeDirectory, which systemd bind-mounts
# into the service's chroot at RootDirectory=/run/tor/root) so that tor
# can read the file despite ProtectSystem=strict.
torDirAuthExecStartPre = pkgs.writeShellScript "tor-dirauth-conf" ''
set -eu
{
${lib.concatMapStringsSep "\n" (name: ''
printf 'DirAuthority %s orport=9001 ipv6=[%s]:9001 v3ident=%s %s:80 %s\n' \
${name} \
'${nodeIPv6 name}' \
"$(tr -d '\n' < ${daKeysets.${name}}/v3ident)" \
'${nodeIP name}' \
"$(tr -d '\n' < ${daKeysets.${name}}/relay-fingerprint)"
'') daNames}
} > /run/tor/dirauth.conf
chown tor:tor /run/tor/dirauth.conf
chmod 0400 /run/tor/dirauth.conf
'';
# Build DirAuthority lines from the pre-generated keys.
# Format: nickname orport=PORT v3ident=V3IDENT ip:dirport RELAY_FINGERPRINT
dirAuthorityLines = lib.mapAttrsToList (
name: keys:
"${name} orport=9001 ipv6=[${nodeIPv6 name}]:9001 v3ident=${readFP keys "v3ident"} ${nodeIP name}:80 ${readFP keys "relay-fingerprint"}"
) daKeysets;
# Tor settings shared by all node types
# Tor settings shared by all node types. DirAuthority lines are loaded
# from /run/tor/dirauth.conf, written by torDirAuthExecStartPre before
# tor starts.
commonTorSettings = {
TestingTorNetwork = true;
AssumeReachable = true;
AssumeReachableIPv6 = true;
ControlPort = 9051;
CookieAuthentication = true;
DirAuthority = dirAuthorityLines;
"%include" = "/run/tor/dirauth.conf";
};
# Tor settings shared by non-DA nodes (relays and exits)
@ -277,8 +295,10 @@ let
};
};
# Arti configuration
artiConfig = (pkgs.formats.toml { }).generate "arti.toml" {
# Arti configuration - static parts only. The tor_network section
# embeds fingerprints from the DA key derivations, so it is generated
# at service startup instead (see artiNetworkConfigScript) to avoid IFD.
artiStaticConfig = (pkgs.formats.toml { }).generate "arti.toml" {
proxy.socks_listen = 9150;
storage = {
@ -308,34 +328,36 @@ let
guard-min-filtered-sample-size = 2;
guard-n-primary-guards-to-use = 2;
};
tor_network = {
authorities = {
v3idents = lib.mapAttrsToList (_: keys: readFP keys "v3ident") daKeysets;
uploads = lib.mapAttrsToList (name: _: [
"${nodeIP name}:80"
"[${nodeIPv6 name}]:80"
]) daKeysets;
downloads = lib.mapAttrsToList (name: _: [
"${nodeIP name}:80"
"[${nodeIPv6 name}]:80"
]) daKeysets;
votes = lib.mapAttrsToList (name: _: [
"${nodeIP name}:80"
"[${nodeIPv6 name}]:80"
]) daKeysets;
};
fallback_caches = lib.mapAttrsToList (name: keys: {
rsa_identity = readFP keys "relay-fingerprint";
ed_identity = readFP keys "ed25519-identity";
orports = [
"${nodeIP name}:9001"
"[${nodeIPv6 name}]:9001"
];
}) daKeysets;
};
};
# Emit the tor_network section of the arti config at service startup,
# reading fingerprints from the DA key derivations at runtime. The
# ${daKeysets.<name>} interpolations resolve to store paths at
# evaluation time (build dependencies), but their contents are only
# read by the shell when the script runs - no import-from-derivation.
artiNetworkConfigScript = pkgs.writeShellScript "arti-network-config" ''
set -eu
out=/run/arti/network.toml
daIpPorts='[["${nodeIP "da1"}:80", "[${nodeIPv6 "da1"}]:80"], ["${nodeIP "da2"}:80", "[${nodeIPv6 "da2"}]:80"], ["${nodeIP "da3"}:80", "[${nodeIPv6 "da3"}]:80"]]'
{
echo '[tor_network.authorities]'
printf 'v3idents = ["%s", "%s", "%s"]\n' \
"$(tr -d '\n' < ${daKeysets.da1}/v3ident)" \
"$(tr -d '\n' < ${daKeysets.da2}/v3ident)" \
"$(tr -d '\n' < ${daKeysets.da3}/v3ident)"
echo "uploads = $daIpPorts"
echo "downloads = $daIpPorts"
echo "votes = $daIpPorts"
${lib.concatMapStringsSep "\n" (name: ''
echo
echo '[[tor_network.fallback_caches]]'
printf 'rsa_identity = "%s"\n' "$(tr -d '\n' < ${daKeysets.${name}}/relay-fingerprint)"
printf 'ed_identity = "%s"\n' "$(tr -d '\n' < ${daKeysets.${name}}/ed25519-identity)"
echo 'orports = ["${nodeIP name}:9001", "[${nodeIPv6 name}]:9001"]'
'') daNames}
} > "$out"
'';
# Arti client node
mkArtiClientNode = {
environment.systemPackages = [ pkgs.curl ];
@ -347,7 +369,9 @@ let
wantedBy = [ "multi-user.target" ];
serviceConfig = {
ExecStart = "${lib.getExe pkgs.arti} proxy -c ${artiConfig}";
RuntimeDirectory = "arti";
ExecStartPre = artiNetworkConfigScript;
ExecStart = "${lib.getExe pkgs.arti} proxy -c ${artiStaticConfig} -c /run/arti/network.toml";
DynamicUser = true;
StateDirectory = "arti";
CacheDirectory = "arti";
@ -359,6 +383,18 @@ in
name = "tor";
meta.maintainers = with lib.maintainers; [ jpds ];
defaults =
{ config, ... }:
lib.mkIf config.services.tor.enable {
# Generate /run/tor/dirauth.conf before tor's own `--verify-config`
# ExecStartPre runs. The `+` prefix makes this run as root in the
# full system context so it can write into tor's RuntimeDirectory
# and chown the file to tor:tor.
systemd.services.tor.serviceConfig.ExecStartPre = lib.mkBefore [
"+${torDirAuthExecStartPre}"
];
};
nodes =
lib.genAttrs daNames mkDANode
// lib.genAttrs relayNames mkRelayNode

31
nixos/tests/veroroute.nix Normal file
View file

@ -0,0 +1,31 @@
{ pkgs, ... }:
{
name = "veroroute";
meta.maintainers = with pkgs.lib.maintainers; [ nh2 ];
enableOCR = true;
nodes.machine =
{ ... }:
{
imports = [
./common/x11.nix
];
services.xserver.enable = true;
environment.systemPackages = [
pkgs.veroroute
pkgs.xdotool
];
};
testScript = ''
start_all()
machine.wait_for_x()
machine.execute("veroroute >&2 &")
machine.wait_until_succeeds("xdotool search --pid $(pidof veroroute)")
machine.wait_for_text("File") # menu entry renders correctly
machine.screenshot("screen")
'';
}

View file

@ -14,5 +14,7 @@
machine.wait_for_x()
machine.execute("zoom >&2 &")
machine.wait_for_window("Zoom Workplace")
machine.sleep(20)
machine.wait_for_window("Zoom Workplace")
'';
}

View file

@ -16,9 +16,9 @@ let
inherit tiling_wm;
};
stableVersion = {
version = "2025.3.4.6"; # "Android Studio Panda 4 | 2025.3.4"
sha256Hash = "sha256-Mqf/CayqOLSNYciIK+5+ITAiqLoNHxbABzOA+stQn9M=";
url = "https://edgedl.me.gvt1.com/android/studio/ide-zips/2025.3.4.6/android-studio-panda4-linux.tar.gz";
version = "2025.3.4.7"; # "Android Studio Panda 4 | 2025.3.4 Patch 1"
sha256Hash = "sha256-qujzMvEkr9I8pJXcdwkVpFbadIDI+FngFTWtQvy0ygY=";
url = "https://edgedl.me.gvt1.com/android/studio/ide-zips/2025.3.4.7/android-studio-panda4-patch1-linux.tar.gz";
};
betaVersion = {
version = "2025.3.4.5"; # "Android Studio Panda 4 | 2025.3.4 RC 1"
@ -26,9 +26,9 @@ let
url = "https://edgedl.me.gvt1.com/android/studio/ide-zips/2025.3.4.5/android-studio-panda4-rc1-linux.tar.gz";
};
latestVersion = {
version = "2026.1.1.2"; # "Android Studio Quail 1 | 2026.1.1 Canary 2"
sha256Hash = "sha256-jdbxyK7V4EJI5sCk31oo77lH6uXTM0QjljUgWn5Bl3M=";
url = "https://edgedl.me.gvt1.com/android/studio/ide-zips/2026.1.1.2/android-studio-quail1-canary2-linux.tar.gz";
version = "2026.1.1.5"; # "Android Studio Quail 1 | 2026.1.1 Canary 5"
sha256Hash = "sha256-k4rM0MyTh0wnpsK8m6Hs1nSdwYpqUiQ+z7oiO6hn9YQ=";
url = "https://edgedl.me.gvt1.com/android/studio/ide-zips/2026.1.1.5/android-studio-quail1-canary5-linux.tar.gz";
};
in
{

View file

@ -28,11 +28,12 @@ let
version = attrs.version or old.version;
__intentionallyOverridingVersion = true;
rockspecVersion = old.rockspecVersion;
extraConfig = ''
-- to create a flat hierarchy
lua_modules_path = "lua"
'';
luarocksConfig = (old.luarocksConfig or { }) // {
# to create a flat hierarchy
lua_modules_path = "lua";
# neovim expects C modules to also be in the lua directory
lib_modules_path = "lua";
};
});
finalDrv = toVimPlugin (

View file

@ -446,12 +446,12 @@ final: prev: {
SchemaStore-nvim = buildVimPlugin {
pname = "SchemaStore.nvim";
version = "0-unstable-2026-05-12";
version = "0-unstable-2026-05-14";
src = fetchFromGitHub {
owner = "b0o";
repo = "SchemaStore.nvim";
rev = "afbdf2ae4391bf8639eaf9b0a5296aa4869a2b7f";
hash = "sha256-XOvnccf9KFE4WMwsTMGsLaNN5yMy6pMw3xoEZka94Ww=";
rev = "1c28767e3a7f3c9b7c5cc66e7f16b268c964e2c9";
hash = "sha256-vPqMyuCNI3iTgPCkLH+TtjPO217DDFG0HIIJmUkryww=";
};
meta.homepage = "https://github.com/b0o/SchemaStore.nvim/";
meta.license = getLicenseFromSpdxId "Apache-2.0";
@ -868,12 +868,12 @@ final: prev: {
ale = buildVimPlugin {
pname = "ale";
version = "4.0.0-unstable-2026-05-12";
version = "4.0.0-unstable-2026-05-14";
src = fetchFromGitHub {
owner = "dense-analysis";
repo = "ale";
rev = "78122497f57d17257c77301a08ddb7562f625f7e";
hash = "sha256-HKaQminhMI6H1/sDj/5sh2xlCoZtVL4XJVinMNxKcAo=";
rev = "916c8764ce9d395f788eae9adf207a4bfe8a038e";
hash = "sha256-xuNo4VOHrSnQBv6DZEMR6U3QfoBa46js+RVsE2z7Yv4=";
};
meta.homepage = "https://github.com/dense-analysis/ale/";
meta.license = getLicenseFromSpdxId "BSD-2-Clause";
@ -3904,12 +3904,12 @@ final: prev: {
conform-nvim = buildVimPlugin {
pname = "conform.nvim";
version = "9.1.0-unstable-2026-04-23";
version = "9.1.0-unstable-2026-05-15";
src = fetchFromGitHub {
owner = "stevearc";
repo = "conform.nvim";
rev = "dca1a190aa85f9065979ef35802fb77131911106";
hash = "sha256-pV7Yr2LSBDqKGeYoS4CWHGUSs8Yx4wsVXCXySt9yz0M=";
rev = "18aeab3d63d350dcf44d64c462cc489a3412af40";
hash = "sha256-+NzRZItrF344sp+xt07vKcu+EbHO1wtSGolYtIz0CP4=";
fetchSubmodules = true;
};
meta.homepage = "https://github.com/stevearc/conform.nvim/";
@ -4017,12 +4017,12 @@ final: prev: {
copilot-lua = buildVimPlugin {
pname = "copilot.lua";
version = "2.0.3";
version = "2.0.4";
src = fetchFromGitHub {
owner = "zbirenbaum";
repo = "copilot.lua";
tag = "v2.0.3";
hash = "sha256-sYcKs46PF+j9wvP+UQ+asGUNgZHD5JLnq9KQOube0mA=";
tag = "v2.0.4";
hash = "sha256-+hQ4Og0ZZS/tvs4z5733qRu5+W4D24HgHHPIL5vd0Eo=";
};
meta.homepage = "https://github.com/zbirenbaum/copilot.lua/";
meta.license = getLicenseFromSpdxId "MIT";
@ -4535,12 +4535,12 @@ final: prev: {
ddc-source-lsp = buildVimPlugin {
pname = "ddc-source-lsp";
version = "1.2.0-unstable-2026-03-22";
version = "1.2.0-unstable-2026-05-15";
src = fetchFromGitHub {
owner = "Shougo";
repo = "ddc-source-lsp";
rev = "352f804c08dbc6ce516234bb97309a5b78a1863f";
hash = "sha256-oj+L2dy6FpOYv/j0E/tsSD0BfP9qTtWCKwrLZSsCUsc=";
rev = "1debc85415b3175cd76b6313efda70dbb5bfdfeb";
hash = "sha256-bzAkGV0N6HS+lQg28szTIQwFaHUIzaEmIMOdH/kio+U=";
};
meta.homepage = "https://github.com/Shougo/ddc-source-lsp/";
meta.license = unfree;
@ -5153,12 +5153,12 @@ final: prev: {
diffs-nvim = buildVimPlugin {
pname = "diffs.nvim";
version = "0.3.2";
version = "0.3.3";
src = fetchFromGitHub {
owner = "barrettruth";
repo = "diffs.nvim";
tag = "v0.3.2";
hash = "sha256-DZpDaQ8nV+i2k969TTo19UnBSaK5jQwzP9c/bCsRFAQ=";
tag = "v0.3.3";
hash = "sha256-g/kXdeNT2NLgQ+iPTI1GdlJyzvSHrcJoCLa0tPDj3gM=";
};
meta.homepage = "https://github.com/barrettruth/diffs.nvim/";
meta.license = getLicenseFromSpdxId "MIT";
@ -5349,12 +5349,12 @@ final: prev: {
easy-dotnet-nvim = buildVimPlugin {
pname = "easy-dotnet.nvim";
version = "0-unstable-2026-05-12";
version = "0-unstable-2026-05-15";
src = fetchFromGitHub {
owner = "GustavEikaas";
repo = "easy-dotnet.nvim";
rev = "153be96f0b28090ae5f046dffda189221a387083";
hash = "sha256-gQnO/bPH5FdOIPvet3WUAWrgAnOuxRQUtP+X4qfl8tM=";
rev = "381f691d504ff33a578d833c159bf86c3bec95de";
hash = "sha256-jWaEuCeLZ3E0M91NOSdDs2uTfhnk4O1ZRi/S8Cxw23Q=";
};
meta.homepage = "https://github.com/GustavEikaas/easy-dotnet.nvim/";
meta.license = getLicenseFromSpdxId "MIT";
@ -6584,11 +6584,11 @@ final: prev: {
gitlab-vim = buildVimPlugin {
pname = "gitlab.vim";
version = "1.1.0-unstable-2026-03-17";
version = "1.1.0-unstable-2026-05-13";
src = fetchgit {
url = "https://gitlab.com/gitlab-org/editor-extensions/gitlab.vim";
rev = "cb750761acf8dc17f4f1051d1b4ade6c0aaeb432";
hash = "sha256-rhYz3Z1Dcffvo8E3390gOBcqfFclWJ19wTKwp6L/874=";
rev = "915a6265430a578fa4a1d7f8063e9e6fabca1184";
hash = "sha256-9dmIWXQNUEp0IfZ3nJaA5HYzDVejNZfS/ueorremBNM=";
};
meta.homepage = "https://gitlab.com/gitlab-org/editor-extensions/gitlab.vim";
meta.license = unfree;
@ -6975,12 +6975,12 @@ final: prev: {
guihua-lua = buildVimPlugin {
pname = "guihua.lua";
version = "0.1-unstable-2026-04-28";
version = "0.1-unstable-2026-05-15";
src = fetchFromGitHub {
owner = "ray-x";
repo = "guihua.lua";
rev = "7c364432c2f9153ed068f4eab1989edd9f3fd302";
hash = "sha256-rgxqLQf7psUtXwnFOiDBt6CpMyaAMdz2pg3PKj12IzE=";
rev = "ae1a09035709a5952ae6f2fab742c2097c31a8f2";
hash = "sha256-LSds5HBIex4mGL6zDSEEZT16Jd69kpEuAwQIWy7aDaA=";
};
meta.homepage = "https://github.com/ray-x/guihua.lua/";
meta.license = getLicenseFromSpdxId "MIT";
@ -7227,12 +7227,12 @@ final: prev: {
helpview-nvim = buildVimPlugin {
pname = "helpview.nvim";
version = "2.1.2-unstable-2025-09-26";
version = "2.1.2-unstable-2026-05-14";
src = fetchFromGitHub {
owner = "OXY2DEV";
repo = "helpview.nvim";
rev = "518789535a0cb146224a428edf93a70f98b795db";
hash = "sha256-kKTAbc1Sy2IVyWgeTAkvhgffPxJjBSdctG88eU2Gxn0=";
rev = "0057599e169ea6ffd53fef77f279cb13b61e174a";
hash = "sha256-F3mdFqzMZhdT0ag+d7Ze9Knv4NW9/YBGVjqRYcQpCCI=";
fetchSubmodules = true;
};
meta.homepage = "https://github.com/OXY2DEV/helpview.nvim/";
@ -8208,12 +8208,12 @@ final: prev: {
kitty-scrollback-nvim = buildVimPlugin {
pname = "kitty-scrollback.nvim";
version = "9.1.0";
version = "9.2.0";
src = fetchFromGitHub {
owner = "mikesmithgh";
repo = "kitty-scrollback.nvim";
tag = "v9.1.0";
hash = "sha256-2OIfeY5V9xBQGatoEeZQUB1fUxdupHLBPOITzDriNPo=";
tag = "v9.2.0";
hash = "sha256-M/sd8lUv7leapzI3uD0VNkMAwaFhPmXsktFnHMPJz0U=";
};
meta.homepage = "https://github.com/mikesmithgh/kitty-scrollback.nvim/";
meta.license = getLicenseFromSpdxId "Apache-2.0";
@ -8264,12 +8264,12 @@ final: prev: {
koda-nvim = buildVimPlugin {
pname = "koda.nvim";
version = "2.10.1";
version = "2.10.2";
src = fetchFromGitHub {
owner = "oskarnurm";
repo = "koda.nvim";
tag = "v2.10.1";
hash = "sha256-qUMAudof+WhyBuHJ0O8LcBOPybJAEVXYAmdIcHK2gP4=";
tag = "v2.10.2";
hash = "sha256-Um8lD0/RMvtHQLYyT5xToQzp/6bI4H7xZVnqT8CagR0=";
};
meta.homepage = "https://github.com/oskarnurm/koda.nvim/";
meta.license = getLicenseFromSpdxId "MIT";
@ -9034,12 +9034,12 @@ final: prev: {
lsp-overloads-nvim = buildVimPlugin {
pname = "lsp-overloads.nvim";
version = "2.0.2-unstable-2026-05-10";
version = "2.0.2-unstable-2026-05-15";
src = fetchFromGitHub {
owner = "Issafalcon";
repo = "lsp-overloads.nvim";
rev = "4a9277c52455785096ddc4df13208c67fd696343";
hash = "sha256-eVgWK7kxu8nrALPKpZrmrEhsXMzqLmx9RvcsUXDFODg=";
rev = "1c3c4140437e0317447a9b5cd2285b9488e8c82b";
hash = "sha256-FWld6xCSf4HcNwm+da226UMy4FSIyLaJrgLpfH8lYHk=";
};
meta.homepage = "https://github.com/Issafalcon/lsp-overloads.nvim/";
meta.license = getLicenseFromSpdxId "MIT";
@ -9173,12 +9173,12 @@ final: prev: {
lspsaga-nvim = buildVimPlugin {
pname = "lspsaga.nvim";
version = "0-unstable-2026-05-04";
version = "0-unstable-2026-05-14";
src = fetchFromGitHub {
owner = "nvimdev";
repo = "lspsaga.nvim";
rev = "e6c04f88836d79f2fd7e46fd170e7ee986c789d4";
hash = "sha256-aDf2JgqfxegMwzK8updAsyrwxU7HnSPtJQKzEDSTy14=";
rev = "3e33a6a6c5d379f3d4fae77fae6b53b762a0a30f";
hash = "sha256-hkXvv5NgW+wnbR7wGtAs+aUDv/4o/T5Mv7rGhk1qR3U=";
};
meta.homepage = "https://github.com/nvimdev/lspsaga.nvim/";
meta.license = getLicenseFromSpdxId "MIT";
@ -9454,12 +9454,12 @@ final: prev: {
mason-nvim = buildVimPlugin {
pname = "mason.nvim";
version = "2.2.1-unstable-2026-05-07";
version = "2.2.1-unstable-2026-05-14";
src = fetchFromGitHub {
owner = "mason-org";
repo = "mason.nvim";
rev = "e54f5bf5f12c560da31c17eee5b3e1bd369f3ff9";
hash = "sha256-rWo4W+rF7PYAHbqAaa6YSITFO2sTCiBn/ydIElkJAFw=";
rev = "8e921c2b68571e978db5d4d3fef9c9a7f8755473";
hash = "sha256-I+Epz266R+ZIT95gyxlKl1kCPNNSdF9FduHH87ueiyg=";
};
meta.homepage = "https://github.com/mason-org/mason.nvim/";
meta.license = getLicenseFromSpdxId "Apache-2.0";
@ -9902,12 +9902,12 @@ final: prev: {
mini-files = buildVimPlugin {
pname = "mini.files";
version = "0.17.0-unstable-2026-05-12";
version = "0.17.0-unstable-2026-05-15";
src = fetchFromGitHub {
owner = "nvim-mini";
repo = "mini.files";
rev = "f9f0ccbef0fd24eaddc8675accca83fa1f310c3f";
hash = "sha256-CoaEUky+atHwBGGXdR8yNlPKjsR79iHHdMZzSpzIXqc=";
rev = "5e0f0d264166e71d37ca35d84c54b1887ea76b40";
hash = "sha256-PXRVOf2tGwukhqRkre5Dd2ULMAplH5utK00a2+iUz/o=";
};
meta.homepage = "https://github.com/nvim-mini/mini.files/";
meta.license = getLicenseFromSpdxId "MIT";
@ -10098,12 +10098,12 @@ final: prev: {
mini-nvim = buildVimPlugin {
pname = "mini.nvim";
version = "0.17.0-unstable-2026-05-12";
version = "0.17.0-unstable-2026-05-15";
src = fetchFromGitHub {
owner = "nvim-mini";
repo = "mini.nvim";
rev = "17c448b0f3f29c0857a3436fc64e1d7cb9267ec3";
hash = "sha256-AjAgXk818MQFGHJd1cCflt6Skpi1W9JSfM0cygcgp1Y=";
rev = "18797ed18f347d0d0da27fec28a67979b1207f70";
hash = "sha256-YkE1XwxpWukp19juZB2eIUpomybE0L9sz/+jCc/fx0k=";
};
meta.homepage = "https://github.com/nvim-mini/mini.nvim/";
meta.license = getLicenseFromSpdxId "MIT";
@ -10826,12 +10826,12 @@ final: prev: {
neo-tree-nvim = buildVimPlugin {
pname = "neo-tree.nvim";
version = "3.40.0";
version = "3.41.0";
src = fetchFromGitHub {
owner = "nvim-neo-tree";
repo = "neo-tree.nvim";
tag = "3.40.0";
hash = "sha256-/TNl/IX81qr7Mcoy0dhF3bcsewXEnPSy2n+dm31eyyw=";
tag = "3.41.0";
hash = "sha256-OVYt5QMWHRs/ivFcblHcgbqNkg+xzohG+IifPJBfY3o=";
};
meta.homepage = "https://github.com/nvim-neo-tree/neo-tree.nvim/";
meta.license = getLicenseFromSpdxId "MIT";
@ -10854,12 +10854,12 @@ final: prev: {
neoconf-nvim = buildVimPlugin {
pname = "neoconf.nvim";
version = "1.4.0-unstable-2026-05-12";
version = "1.4.0-unstable-2026-05-15";
src = fetchFromGitHub {
owner = "folke";
repo = "neoconf.nvim";
rev = "978a10c6e26d2a566a2e491d6a2a298568af8b74";
hash = "sha256-lIy0WwPprPyZKHYiX6ZhXJTtQ8cJBQIpVMm8Nr9GSeM=";
rev = "eaed67d3f44a707ef6fe596e64ec8979f0c24a6e";
hash = "sha256-83QOT8lHwdlFyHHz7pEpNk+H+Ri2WV/os3tKgBdy9Pw=";
};
meta.homepage = "https://github.com/folke/neoconf.nvim/";
meta.license = getLicenseFromSpdxId "Apache-2.0";
@ -10938,12 +10938,12 @@ final: prev: {
neogit = buildVimPlugin {
pname = "neogit";
version = "3.0.0-unstable-2026-05-07";
version = "3.0.0-unstable-2026-05-13";
src = fetchFromGitHub {
owner = "NeogitOrg";
repo = "neogit";
rev = "395ac481e197784e410b59b987fadaf9e7481df1";
hash = "sha256-sioCf8OgFMnB64oWjROoVyive6Quj2OaSJLeGrd48vg=";
rev = "99326a1310fb2d616b455d2fd16d01bf00682f06";
hash = "sha256-ZKK4JbeuMGYvUjG1B6vLZTeSMeQTXQGFQAlIMqqN660=";
};
meta.homepage = "https://github.com/NeogitOrg/neogit/";
meta.license = getLicenseFromSpdxId "MIT";
@ -11641,12 +11641,12 @@ final: prev: {
nerdy-nvim = buildVimPlugin {
pname = "nerdy.nvim";
version = "1.6-unstable-2026-01-20";
version = "1.6-unstable-2026-05-13";
src = fetchFromGitHub {
owner = "2KAbhishek";
repo = "nerdy.nvim";
rev = "97b0914dece80204a777f04c94b9980da0f7ac88";
hash = "sha256-/wahSooqgIAKaHw+OfRlhF2bUxjyPwe4OEm9zK9Jcv0=";
rev = "0fe9cc24c08a14ceb002362b07a34e481f870fae";
hash = "sha256-ErtJlYp8uCNYREn7+rIx5b2Pm9lCnZ7dss/+CdP+b2U=";
};
meta.homepage = "https://github.com/2KAbhishek/nerdy.nvim/";
meta.license = getLicenseFromSpdxId "GPL-3.0-only";
@ -12882,11 +12882,11 @@ final: prev: {
nvim-lint = buildVimPlugin {
pname = "nvim-lint";
version = "05-unstable-2026-04-09";
version = "05-unstable-2026-05-13";
src = fetchgit {
url = "https://codeberg.org/mfussenegger/nvim-lint/";
rev = "eab58b48eb11d7745c11c505e0f3057165902461";
hash = "sha256-5bVnAw7xxTntwmYYDZGt+3HOizlddqMOIyg/zqGbSEM=";
rev = "665525810630701b84181e4d9eefd24b49845b29";
hash = "sha256-lFMtmAVGU2HKOsImNINH9xeEiFTvrd8G2l2m5mT7cMY=";
};
meta.homepage = "https://codeberg.org/mfussenegger/nvim-lint/";
meta.license = unfree;
@ -13735,12 +13735,12 @@ final: prev: {
nvim-unception = buildVimPlugin {
pname = "nvim-unception";
version = "1.0.0-unstable-2026-04-04";
version = "1.0.0-unstable-2026-05-14";
src = fetchFromGitHub {
owner = "samjwill";
repo = "nvim-unception";
rev = "59f9f64a7ff4c7f853d3d1a941132648059fc799";
hash = "sha256-xaKMcgGI++yrNnmVa3h7ohLKTSkNolcr2zofuJgYRZo=";
rev = "f14eeb22238d2c2bdafe9a2e5e1f4bd200d0e450";
hash = "sha256-hoaguD4TWEFkgKBH+LWYR4MHTBXDK8OTtnm+4lF6r1I=";
};
meta.homepage = "https://github.com/samjwill/nvim-unception/";
meta.license = getLicenseFromSpdxId "MIT";
@ -14197,12 +14197,12 @@ final: prev: {
onenord-nvim = buildVimPlugin {
pname = "onenord.nvim";
version = "0.7.0-unstable-2025-12-25";
version = "0.7.0-unstable-2026-05-14";
src = fetchFromGitHub {
owner = "rmehri01";
repo = "onenord.nvim";
rev = "b68f1e66736840e837c2a77ebff59c932fcb70c7";
hash = "sha256-IjY0QUfe122oT+bQd0/iE7ZoRK59WUWrUSRgIKOvN2M=";
rev = "8b6fe1e0f260ca0b8201ef6a8e2c97e0f38ea35d";
hash = "sha256-iqnWSAV16m5RTHs3YeYolF+amXvHbsnkHNtVa2mBhyY=";
};
meta.homepage = "https://github.com/rmehri01/onenord.nvim/";
meta.license = getLicenseFromSpdxId "MIT";
@ -14351,12 +14351,12 @@ final: prev: {
overseer-nvim = buildVimPlugin {
pname = "overseer.nvim";
version = "2.1.0-unstable-2026-04-01";
version = "2.1.0-unstable-2026-05-14";
src = fetchFromGitHub {
owner = "stevearc";
repo = "overseer.nvim";
rev = "f818eefff81f4b12fb7cf236f1b6c16768a2fcbc";
hash = "sha256-f7uEyEAh+iVdtY9OtyfnmsGAN/XeCOFv30p0y493A+g=";
rev = "3d0c7e7bbfe1a1c6f9bfecd0af8709171a97df71";
hash = "sha256-hxVnBKiyIFtb2PkRHOlClVXSJ20Gtg2w7QzuwpiVqsQ=";
fetchSubmodules = true;
};
meta.homepage = "https://github.com/stevearc/overseer.nvim/";
@ -14674,12 +14674,12 @@ final: prev: {
pi-nvim = buildVimPlugin {
pname = "pi.nvim";
version = "0-unstable-2026-05-12";
version = "0-unstable-2026-05-14";
src = fetchFromGitHub {
owner = "pablopunk";
repo = "pi.nvim";
rev = "1922e69569fe8ca8219d7934201f00cd38a30565";
hash = "sha256-bS+x0jbzhj3FghGSuwfvn34ty3U8RpN1x3AwQdadS1o=";
rev = "8d13ed4a5c0c5bd8709fd1fef9773899e0bef65b";
hash = "sha256-9Pdj66T53ZFWRWGPm6FWusugXWOvPkdAh68+/+UJ8eY=";
};
meta.homepage = "https://github.com/pablopunk/pi.nvim/";
meta.license = getLicenseFromSpdxId "MIT";
@ -14899,12 +14899,12 @@ final: prev: {
project-nvim = buildVimPlugin {
pname = "project.nvim";
version = "3.5.0-1";
version = "4.1.0-1";
src = fetchFromGitHub {
owner = "DrKJeff16";
repo = "project.nvim";
tag = "v3.5.0-1";
hash = "sha256-lmnduaG6jmsLPQYyhAG/MnRwVfSJ3VOjNtas0d+ry4w=";
tag = "v4.1.0-1";
hash = "sha256-Fb9kZ2MVTFO8fj5eDKQW3cRHz1c/7xw/fJ9LkNrI4Sw=";
};
meta.homepage = "https://github.com/DrKJeff16/project.nvim/";
meta.license = getLicenseFromSpdxId "Apache-2.0";
@ -15082,12 +15082,12 @@ final: prev: {
quicker-nvim = buildVimPlugin {
pname = "quicker.nvim";
version = "1.5.0-unstable-2026-03-10";
version = "1.5.0-unstable-2026-05-15";
src = fetchFromGitHub {
owner = "stevearc";
repo = "quicker.nvim";
rev = "063cc44da1eef8681bbd653b29d3bc961780886a";
hash = "sha256-ldKDPSzv3QTZbeesRRZbHynESlrZSogdDP+zUq5mPzA=";
rev = "1c9322b7e2967472548ba9bccd1ccd40e49d0a49";
hash = "sha256-K1jaWpTSNCni6CgR9mlNguiPyhQ1BMjj4p3/V+6XoMA=";
};
meta.homepage = "https://github.com/stevearc/quicker.nvim/";
meta.license = getLicenseFromSpdxId "MIT";
@ -15277,12 +15277,12 @@ final: prev: {
refactoring-nvim = buildVimPlugin {
pname = "refactoring.nvim";
version = "0-unstable-2026-05-06";
version = "0-unstable-2026-05-13";
src = fetchFromGitHub {
owner = "theprimeagen";
repo = "refactoring.nvim";
rev = "29bada48407a9e00d670207d00bbdc0c46c5dc58";
hash = "sha256-d/browY8XA8JXDSVI0MVyCVrQc8ENaGDHEFjj6UYDho=";
rev = "f5b54f3605d9ed709521db1827b8686dea283622";
hash = "sha256-h2ZOwdva5f3VeZASKjq/DhBiuaZI2Ovpc/vzBMerv9g=";
};
meta.homepage = "https://github.com/theprimeagen/refactoring.nvim/";
meta.license = getLicenseFromSpdxId "MIT";
@ -15488,12 +15488,12 @@ final: prev: {
rose-pine = buildVimPlugin {
pname = "rose-pine";
version = "3.0.2-unstable-2026-04-29";
version = "3.0.2-unstable-2026-05-15";
src = fetchFromGitHub {
owner = "rose-pine";
repo = "neovim";
rev = "6a961effd67f6130d36df6d1c05c48c739796dd2";
hash = "sha256-Jf5jycFdPGugGjGH36owtD+27qptBDjADiam2KxQ/L4=";
rev = "ff483051a47e27d84bdef47703538df1ed9f4a47";
hash = "sha256-uFIave5TaC5WJj6zPrb3OBJKM/Z8tnhNoeIGaHJFym0=";
};
meta.homepage = "https://github.com/rose-pine/neovim/";
meta.license = getLicenseFromSpdxId "MIT";
@ -15502,12 +15502,12 @@ final: prev: {
roslyn-nvim = buildVimPlugin {
pname = "roslyn.nvim";
version = "0-unstable-2026-04-21";
version = "0-unstable-2026-05-14";
src = fetchFromGitHub {
owner = "seblyng";
repo = "roslyn.nvim";
rev = "b62d1a588765f0aa1b46ed260252c9e456408835";
hash = "sha256-j5+Kg4B1flk4TwkZKRDW7tHbaoUyE5dKGypXsd9+qSw=";
rev = "90d43d35f0ebb5ecf1df734194cb568a162de4cb";
hash = "sha256-McG9zWKxX+f6IeHK9x/fEQmnWNILuv3WOZmYKf/Ghh8=";
};
meta.homepage = "https://github.com/seblyng/roslyn.nvim/";
meta.license = getLicenseFromSpdxId "MIT";
@ -15669,12 +15669,12 @@ final: prev: {
schema-companion-nvim = buildVimPlugin {
pname = "schema-companion.nvim";
version = "0-unstable-2026-04-05";
version = "0-unstable-2026-05-14";
src = fetchFromGitHub {
owner = "cenk1cenk2";
repo = "schema-companion.nvim";
rev = "bcccfe46a1796f86b81dc3be6ab80ece3664d3b2";
hash = "sha256-NpucvX0HBCu779Uk6qwBnjEp2RP6djlk6+GL+kGTlgM=";
rev = "375f98a3aa8c9c0a0991dd0161089daa3e027742";
hash = "sha256-o4jOp22xZRSaRfWvp1oSLlCLZPSzD28Hfa0x+Hopb0o=";
};
meta.homepage = "https://github.com/cenk1cenk2/schema-companion.nvim/";
meta.license = getLicenseFromSpdxId "MIT";
@ -23451,12 +23451,12 @@ final: prev: {
vim-sexp = buildVimPlugin {
pname = "vim-sexp";
version = "0-unstable-2026-05-10";
version = "0-unstable-2026-05-13";
src = fetchFromGitHub {
owner = "guns";
repo = "vim-sexp";
rev = "0284743c84bebaf04b4862743f692718a3774d30";
hash = "sha256-h2xeox9wJoHpYQtbegCPYxqfLDdA8Qo7g27NoLf4IEY=";
rev = "2328c1b7236eec847e0ee9abda0ae83a0a77dea9";
hash = "sha256-letPTt+fWw51eA/+JkGZ4OuPKyZY2RGJtIF1ekMn+9s=";
};
meta.homepage = "https://github.com/guns/vim-sexp/";
meta.license = getLicenseFromSpdxId "MIT";
@ -23772,12 +23772,12 @@ final: prev: {
vim-spirv = buildVimPlugin {
pname = "vim-spirv";
version = "0.5.2-unstable-2026-04-30";
version = "0.5.2-unstable-2026-05-15";
src = fetchFromGitHub {
owner = "kbenzie";
repo = "vim-spirv";
rev = "6fab3521a18b2a3ba3ad59cbad5c05e1e0e9744d";
hash = "sha256-FiaQLxqANOOwTdlZgRSxrD0uCJHA5zHDnnrurctMFW8=";
rev = "bdd077d8720bd87923408d3a38cd90de634d1e54";
hash = "sha256-af0NSvJVv22BNxzPWxsSfEqoY4VlrDX7Ico+VAoVuxU=";
};
meta.homepage = "https://github.com/kbenzie/vim-spirv/";
meta.license = getLicenseFromSpdxId "MIT";
@ -24401,12 +24401,12 @@ final: prev: {
vim-twiggy = buildVimPlugin {
pname = "vim-twiggy";
version = "0.4-unstable-2022-01-10";
version = "0.4-unstable-2026-05-14";
src = fetchFromGitHub {
owner = "sodapopcan";
repo = "vim-twiggy";
rev = "7a2161991722a811c4ff06b3ce0119dd180729fd";
hash = "sha256-3my/0EOsuB4MBAJQDflIAHg3/Rd7wkk0nW6yqElQY7o=";
rev = "32a2b9a0222fa6afd374c8345f7cfa305f3b1655";
hash = "sha256-Q3XJIkKruQOotJjWBNyZ/pTfUbiqB/YbR9d9ojFEx/w=";
};
meta.homepage = "https://github.com/sodapopcan/vim-twiggy/";
meta.license = unfree;
@ -25284,15 +25284,15 @@ final: prev: {
whitespace-nvim = buildVimPlugin {
pname = "whitespace.nvim";
version = "0.4.2";
version = "0.5.0";
src = fetchFromGitHub {
owner = "johnfrankmorgan";
repo = "whitespace.nvim";
tag = "0.4.2";
hash = "sha256-9Dtf6x2daQ6bP7qq6jKiDY8RpKNG03r1z8AzqM6/Oaw=";
tag = "0.5.0";
hash = "sha256-d+jbLU5N4qJ4WzPPHWZWPTesZ++h6TiYc5z5sYlbDgE=";
};
meta.homepage = "https://github.com/johnfrankmorgan/whitespace.nvim/";
meta.license = unfree;
meta.license = getLicenseFromSpdxId "MIT";
meta.hydraPlatforms = [ ];
};
@ -25663,12 +25663,12 @@ final: prev: {
yazi-nvim = buildVimPlugin {
pname = "yazi.nvim";
version = "13.1.5-unstable-2026-05-12";
version = "13.1.5-unstable-2026-05-15";
src = fetchFromGitHub {
owner = "mikavilpas";
repo = "yazi.nvim";
rev = "25f370e6e84ca7ebca5927ec66cd93e2fa16fd3d";
hash = "sha256-togJQq+HhpkqZJD4GZ9F9NNjulur+sbcUB3PulmQvLU=";
rev = "09d8ce930b48ea6724e94bff6dbb578304e0b478";
hash = "sha256-rGDM4CNLQI7PxqfiJVHHiU3Y99aeWWvmq96330nEOYQ=";
};
meta.homepage = "https://github.com/mikavilpas/yazi.nvim/";
meta.license = getLicenseFromSpdxId "MIT";

View file

@ -13,18 +13,18 @@
writableTmpDirAsHomeHook,
}:
let
version = "0.6.4";
version = "0.8.0";
src = fetchFromGitHub {
owner = "dmtrKovalenko";
repo = "fff.nvim";
tag = "v${version}";
hash = "sha256-vu5yqOvVAPXHMi8sZFQuH9rNsFDffh3Ja74Be0Cs64c=";
hash = "sha256-JbV2dTQhTyZgDZYvFoR1mz9CeM2IPv59Qmp2iiJC8a0=";
};
fff-nvim-lib = rustPlatform.buildRustPackage {
pname = "fff-nvim-lib";
inherit version src;
cargoHash = "sha256-w6KwiE0rAT00fiRa1rT8uthVgcMB7EFGoG3+M5MYEBo=";
cargoHash = "sha256-L/Ens/wzw/jKaa1T3A2pLIBKs09saPEk/0bRhgRezPQ=";
cargoBuildFlags = [
"-p"
@ -45,8 +45,14 @@ let
perl
rustPlatform.bindgenHook
writableTmpDirAsHomeHook
zig
];
dontUseZigConfigure = true;
dontUseZigBuild = true;
dontUseZigCheck = true;
dontUseZigInstall = true;
# Some tests need git
nativeCheckInputs = [ gitMinimal ];
@ -69,8 +75,6 @@ let
# Allow undefined symbols on Darwin - they will be provided by Neovim's LuaJIT runtime
RUSTFLAGS = lib.optionalString stdenv.hostPlatform.isDarwin "-C link-arg=-undefined -C link-arg=dynamic_lookup";
ZIG = lib.getExe zig; # zlob requires zig
};
};
in

View file

@ -21,26 +21,26 @@ vscode-utils.buildVscodeMarketplaceExtension (finalAttrs: {
sources = {
"x86_64-linux" = {
arch = "linux-x64";
hash = "sha256-av844ENiMjenpHu5HOFHotAZ2OcZETpuxhfrKW/GYRk=";
hash = "sha256-pGJ1coic0kdjXUI6HCEkQsyQC5YU0jnA1hmN6MaPfwg=";
};
"aarch64-linux" = {
arch = "linux-arm64";
hash = "sha256-LKGZ2TWJWVhn2D6NmQFszB3B/kf3FJd6+PR6ZZ2r1Hc=";
hash = "sha256-NppbZ/gCZYGZna8bs/nUASxyqd6Bv0AOYTEbfaqJWyI=";
};
"x86_64-darwin" = {
arch = "darwin-x64";
hash = "sha256-n/wWN6SeRPUTX2X/0eXDRUy4UM0nYT3Yk8gVxy4wyXc=";
hash = "sha256-oM2H7CJBS0G8ieiI6twqpA257QWWytdbpkV2Q2D7R6o=";
};
"aarch64-darwin" = {
arch = "darwin-arm64";
hash = "sha256-oW16SY7D7q6/3PyWSBz04/JU1T8x6DnIkTe3+T/RSzY=";
hash = "sha256-lRChL8hGIc4zJ/CBwPkLYY1U5YhfM0DrW//C1dNi//A=";
};
};
in
{
name = "claude-code";
publisher = "anthropic";
version = "2.1.140";
version = "2.1.141";
}
// sources.${stdenvNoCC.hostPlatform.system}
or (throw "Unsupported system ${stdenvNoCC.hostPlatform.system}");

View file

@ -156,7 +156,7 @@ let
downloadPage = "https://marketplace.visualstudio.com/items?itemName=adzero.vscode-sievehighlight";
homepage = "https://github.com/adzero/vscode-sievehighlight";
license = lib.licenses.mit;
maintainers = [ lib.maintainers.sebtm ];
maintainers = [ ];
};
};
@ -413,8 +413,8 @@ let
mktplcRef = {
name = "vscode-neovim";
publisher = "asvetliakov";
version = "1.18.24";
hash = "sha256-oqsqcB2i8zS2pBElTFHh/diffTLFE9IRDjcQv/IcMgU=";
version = "1.19.0";
hash = "sha256-PTuOqbvhN2lutShMn76uxune/gd5sTc5KSfA2xLhmH8=";
};
meta = {
changelog = "https://marketplace.visualstudio.com/items/asvetliakov.vscode-neovim/changelog";
@ -797,7 +797,7 @@ let
downloadPage = "https://marketplace.visualstudio.com/items?itemName=BrandonKirbyson.solarized-palenight";
homepage = "https://github.com/BrandonKirbyson/Solarized-Palenight";
license = lib.licenses.mit;
maintainers = [ lib.maintainers.sebtm ];
maintainers = [ ];
};
};
@ -1145,8 +1145,8 @@ let
mktplcRef = {
name = "vscode-database-client2";
publisher = "cweijan";
version = "8.4.5";
hash = "sha256-CViXcQ8k4eTd5adFvSK4cCFJDRov09wK80QBveziom4=";
version = "8.4.6";
hash = "sha256-GBz0hS75VgfuGuHY/K/VHxp5sFptUCJaz/CXrm6wFPc=";
};
meta = {
description = "Database Client For Visual Studio Code";
@ -1174,8 +1174,8 @@ let
mktplcRef = {
publisher = "DanielSanMedium";
name = "dscodegpt";
version = "3.17.36";
hash = "sha256-7+Ja5/zeGq+W1aCIzZu0x+CU1ERwZhwvOaZKaGSWK4c=";
version = "3.20.6";
hash = "sha256-QDs+zi2Kb2APYxZOzvBnrEZqlmhzNFmQ3bpSfIaPjlc=";
};
meta = {
changelog = "https://marketplace.visualstudio.com/items/DanielSanMedium.dscodegpt/changelog";
@ -1226,8 +1226,8 @@ let
mktplcRef = {
name = "databricks";
publisher = "databricks";
version = "2.10.6";
hash = "sha256-6D8QRH8x2LCZehkkaKf3s3yKzmAkiBg9gFaUCIzGJB4=";
version = "2.10.7";
hash = "sha256-ODAUmYiomllLMGbncU4T+8SfLZnhULggFB6Mfw7vn1o=";
};
meta = {
changelog = "https://marketplace.visualstudio.com/items/databricks.databricks/changelog";
@ -1760,8 +1760,8 @@ let
mktplcRef = {
name = "foam-vscode";
publisher = "foam";
version = "0.40.3";
hash = "sha256-NGC6uW1biseqQ04fD3K4mK4D4rcGVqt0LBlGFC1Exu8=";
version = "0.40.4";
hash = "sha256-WqFIWt3c3XtdsXys+V4tQWxzDMefYOQ88MzTSPDHOKE=";
};
meta = {
changelog = "https://marketplace.visualstudio.com/items/foam.foam-vscode/changelog";
@ -1998,8 +1998,8 @@ let
mktplcRef = {
name = "gitlab-workflow";
publisher = "gitlab";
version = "6.75.3";
hash = "sha256-UrcrHL46ZtQl6Zazec/2rkZLtnPK9BsmyT+9nhTncsA=";
version = "6.78.1";
hash = "sha256-N6M8HLSpnfUqMaPaWZuedWbA7ITwKhLS1n+uuwudpkU=";
};
meta = {
description = "GitLab extension for Visual Studio Code";
@ -2570,8 +2570,8 @@ let
mktplcRef = {
publisher = "jnoortheen";
name = "nix-ide";
version = "0.5.5";
hash = "sha256-epdEMPAkSo0IXsd+ozicI8bjPPquDKIzB3ONRUYWwn8=";
version = "0.5.9";
hash = "sha256-hPOcp6Yksgfu1+In21/gJ3MthV8JUV5WaRpYHvo5GGk=";
};
meta = {
changelog = "https://marketplace.visualstudio.com/items/jnoortheen.nix-ide/changelog";
@ -3239,6 +3239,8 @@ let
ms-python.vscode-pylance = callPackage ./ms-python.vscode-pylance { };
ms-python.vscode-python-envs = callPackage ./ms-python.vscode-python-envs { };
ms-toolsai.datawrangler = buildVscodeMarketplaceExtension {
mktplcRef = {
name = "datawrangler";
@ -3707,6 +3709,8 @@ let
oracle.oracle-java = callPackage ./oracle.oracle-java { };
oxc.oxc-vscode = callPackage ./oxc.oxc-vscode { };
ph-hawkins.arc-plus = callPackage ./ph-hawkins.arc-plus { };
phind.phind = buildVscodeMarketplaceExtension {
@ -4218,8 +4222,8 @@ let
mktplcRef = {
publisher = "shd101wyy";
name = "markdown-preview-enhanced";
version = "0.8.25";
hash = "sha256-0yOtvHL24eJizmzXAC956Tx9eNJaWDPl/OAhmFv2KJk=";
version = "0.8.26";
hash = "sha256-OZMUHqc8l8BrpLONlOIeImnsJVa0TLN1R51ulQ5n8h4=";
};
meta = {
description = "Provides a live preview of markdown using either markdown-it or pandoc";
@ -4357,8 +4361,8 @@ let
mktplcRef = {
publisher = "sonarsource";
name = "sonarlint-vscode";
version = "5.2.1";
hash = "sha256-GVuFP0n2Su6YAh/KwtkEFvZK9hAyVDIWfoBjaPQyUFM=";
version = "5.2.3";
hash = "sha256-HSQjoYIQa8CVw6Fjb3H+et6U3urptNjrIT8HLgHirxA=";
};
meta.license = lib.licenses.lgpl3Only;
};
@ -4863,8 +4867,8 @@ let
mktplcRef = {
name = "uiua-vscode";
publisher = "uiua-lang";
version = "0.0.68";
hash = "sha256-5qzMT7aue8PO4mpMsoBc/18J7yhxrmKwA+KE+LeK0mU=";
version = "0.0.69";
hash = "sha256-wP2Mw4K0Fh4xKaffzl1OwrWnWu6npZ2PyVDaT5LUeeY=";
};
meta = {
description = "VSCode language extension for Uiua";
@ -5106,8 +5110,8 @@ let
mktplcRef = {
publisher = "vscjava";
name = "vscode-java-dependency";
version = "0.27.2";
hash = "sha256-1ix/MtZ801uX0Q1/t+S6AG3sSkILDugouecOq9BO1IQ=";
version = "0.27.3";
hash = "sha256-8ZkdAZLplf9RI5sFGqsjVMlsletck/qXJ6D1Dxz9AuI=";
};
meta = {
license = lib.licenses.mit;

View file

@ -0,0 +1,23 @@
{
lib,
vscode-utils,
}:
vscode-utils.buildVscodeMarketplaceExtension {
mktplcRef = {
name = "vscode-python-envs";
publisher = "ms-python";
version = "1.33.2026051501";
hash = "sha256-V5anlwzLt0V08HsO6TCBIUPD3VPhyohg7YnSc/1++GE=";
};
meta = {
description = "Provides a unified python environment experience";
downloadPage = "https://marketplace.visualstudio.com/items?itemName=ms-python.vscode-python-envs";
homepage = "https://github.com/microsoft/vscode-python-environments";
license = lib.licenses.mit;
maintainers = with lib.maintainers; [
Zocker1999NET
];
};
}

View file

@ -1,9 +1,8 @@
{
lib,
vscode-utils,
jq,
buildPackages,
python3,
moreutils,
}:
vscode-utils.buildVscodeMarketplaceExtension {
@ -16,7 +15,7 @@ vscode-utils.buildVscodeMarketplaceExtension {
postInstall = ''
cd "$out/$installPrefix"
${lib.getExe jq} '.contributes.configuration.properties."scheme-fmt.pythonPath".default = "${lib.getExe python3}"' package.json | ${lib.getExe' moreutils "sponge"} package.json
${lib.getExe buildPackages.jq} '.contributes.configuration.properties."scheme-fmt.pythonPath".default = "${lib.getExe python3}"' package.json | ${lib.getExe' buildPackages.moreutils "sponge"} package.json
'';
meta = {

View file

@ -0,0 +1,39 @@
{
lib,
vscode-utils,
jaq,
moreutils,
oxlint,
oxfmt,
}:
vscode-utils.buildVscodeMarketplaceExtension {
mktplcRef = {
publisher = "oxc";
name = "oxc-vscode";
version = "1.55.0";
hash = "sha256-QAuN9Qe1AErcGIbbqsYYO6kikgaEiX0Y3ddnNhuOB6Q=";
};
nativeBuildInputs = [
jaq
moreutils
];
postPatch = ''
jaq \
--arg oxlint "${lib.getExe oxlint}" \
--arg oxfmt "${lib.getExe oxfmt}" \
'
.contributes.configuration.properties."oxc.path.oxlint".default = $oxlint |
.contributes.configuration.properties."oxc.path.oxfmt".default = $oxfmt
' package.json | sponge package.json
'';
meta = {
description = "Oxlint and Oxfmt editor integration";
downloadPage = "https://marketplace.visualstudio.com/items?itemName=oxc.oxc-vscode";
homepage = "https://github.com/oxc-project/oxc-vscode";
license = lib.licenses.mit;
maintainers = [ lib.maintainers.drupol ];
};
}

View file

@ -7,8 +7,8 @@ vscode-utils.buildVscodeMarketplaceExtension {
mktplcRef = {
name = "claude-dev";
publisher = "saoudrizwan";
version = "3.82.0";
hash = "sha256-+CtWfRGumMTFckmU9Z8TAwrn35WiUrri1x6XL9khOnM=";
version = "3.83.0";
hash = "sha256-d9b8mXi/PI87T9J67yzI2yID7hhd6OPdM2+Na3I5Wg8=";
};
meta = {

View file

@ -5,6 +5,7 @@
writeShellScriptBin,
fetchurl,
vscode,
buildPackages,
unzip,
makeSetupHook,
writeScript,
@ -15,7 +16,7 @@ let
unpackVsixSetupHook = makeSetupHook {
name = "unpack-vsix-setup-hook";
substitutions = {
unzip = "${unzip}/bin/unzip";
unzip = "${buildPackages.unzip}/bin/unzip";
};
} ./unpack-vsix-setup-hook.sh;
buildVscodeExtension = lib.extendMkDerivation {

View file

@ -5,13 +5,13 @@
}:
mkLibretroCore {
core = "mednafen-pce-fast";
version = "0-unstable-2026-05-01";
version = "0-unstable-2026-05-16";
src = fetchFromGitHub {
owner = "libretro";
repo = "beetle-pce-fast-libretro";
rev = "9ba79648d6ec85e833aef719d7f359117498d89c";
hash = "sha256-VSZelshWjMxIe8sumNZZ6WHm1WTE9r2xm62og0YLGlY=";
rev = "82cbe149648969fa55d60b955d455f15fd125b1d";
hash = "sha256-odOMCxLl2fCBdalnW/ykOeVmB+G8N/lGbZqCTr2mdow=";
};
makefile = "Makefile";

View file

@ -5,13 +5,13 @@
}:
mkLibretroCore {
core = "gambatte";
version = "0-unstable-2026-04-24";
version = "0-unstable-2026-05-12";
src = fetchFromGitHub {
owner = "libretro";
repo = "gambatte-libretro";
rev = "5ba6bd1ad745e04b7069d0eb2b44091364fc997a";
hash = "sha256-A9OQx0eXVgrGcmpMTtTe97rHCjrV3Ksi/ooLefsysbQ=";
rev = "4c1b4c26c8db94663196bad187b58fe8e9162b4f";
hash = "sha256-uJoHwHJ2KtNk83eEDdWPPxAViMCp8bVq06wsBxQZEPw=";
};
meta = {

View file

@ -12,13 +12,13 @@
}:
mkLibretroCore {
core = "mupen64plus-next";
version = "0-unstable-2026-04-02";
version = "0-unstable-2026-05-12";
src = fetchFromGitHub {
owner = "libretro";
repo = "mupen64plus-libretro-nx";
rev = "58b9daf940fb43f09c3984c6a7c730f4b4c24861";
hash = "sha256-9d1gbDDK2rOt/a9NNRQVJJmiE+UdohM/yPI5WstNmtA=";
rev = "8cdfadf266a784cd1849f7fef8adae2912240b18";
hash = "sha256-37A9ScN8jRX1i2aocyNr3VAJsJ7xoMsmzVgPILpoqmQ=";
};
# Fix for GCC 14

View file

@ -5,13 +5,13 @@
}:
mkLibretroCore rec {
core = "np2kai";
version = "0-unstable-2026-04-01";
version = "0-unstable-2026-05-09";
src = fetchFromGitHub {
owner = "AZO234";
repo = "NP2kai";
rev = "cbadd7572e0b13de0c0c011a86758ca4dc4a74ae";
hash = "sha256-4p5SpXgGzfj2lc+0yAgwrRLDkYWrIkZi+XREQpNhdKA=";
rev = "eebb95c060f82df45a5615be676c3fa4b7bb7ae0";
hash = "sha256-KBvxqxCeYyIKCTHdcczwpgHBIZds6xMfHt6LblRRoFc=";
fetchSubmodules = true;
};

View file

@ -5,13 +5,13 @@
}:
mkLibretroCore {
core = "pcsx-rearmed";
version = "0-unstable-2026-04-25";
version = "0-unstable-2026-05-15";
src = fetchFromGitHub {
owner = "libretro";
repo = "pcsx_rearmed";
rev = "a97efbb0646dd7766bd66fe9e93118206edec36a";
hash = "sha256-2MAj/UdEg/kRZuGZcVQ+hBMe2pRlZWvEQnXeqb+444Y=";
rev = "c88070df8e0e84106ecc4b6394860a413a7bc046";
hash = "sha256-ZngYExWmL4NlmSfaRbTpSthNY1QRwKXtSiSX8zS/teo=";
};
dontConfigure = true;

View file

@ -5,13 +5,13 @@
}:
mkLibretroCore {
core = "stella";
version = "0-unstable-2026-04-28";
version = "0-unstable-2026-05-16";
src = fetchFromGitHub {
owner = "stella-emu";
repo = "stella";
rev = "0c1b944387b5ac2b1bf753c2c4221db4fdc10f79";
hash = "sha256-mohkp6oOP8MtRs/WHw4Rxs3FrB6h4X6/ENrRdjiiXlQ=";
rev = "03dbb069fd2d6fee0d58c5d96077bdf9c686a1e2";
hash = "sha256-BiyicKZsoRXd/w0U2uvCjd0E3gzNvfNPbAt34nGdXdw=";
};
makefile = "Makefile";

View file

@ -5,13 +5,13 @@
}:
mkLibretroCore {
core = "tgbdual";
version = "0-unstable-2026-04-20";
version = "0-unstable-2026-05-11";
src = fetchFromGitHub {
owner = "libretro";
repo = "tgbdual-libretro";
rev = "12540f0b2d3783259a0dce34ac8aa7a86beeaa11";
hash = "sha256-l+WiFC5GxbdY9ulmtdqd2iKU7qKoVWqcf4YR/waSVhQ=";
rev = "bf816b096f1dca55ea805337d7c9e78d6b98d839";
hash = "sha256-HpvgFN37lPZpJqwUdM8qFSGcqUkYsqSCKCLMFHD6ggM=";
};
makefile = "Makefile";

View file

@ -2,6 +2,7 @@
stdenv,
lib,
callPackage,
installFonts,
}:
let
src = (callPackage ./sources.nix { }).stable;
@ -13,9 +14,9 @@ stdenv.mkDerivation {
sourceRoot = "wine-${src.version}/fonts";
inherit src;
installPhase = ''
install *.ttf -Dt $out/share/fonts/wine
'';
nativeBuildInputs = [
installFonts
];
meta = {
description = "Microsoft replacement fonts by the Wine project";

View file

@ -85,7 +85,7 @@ let
];
in
mkDerivation rec {
version = "3.44.9";
version = "3.44.10";
pname = "qgis-ltr-unwrapped";
outputs = [ "out" ] ++ lib.optional (!stdenv.hostPlatform.isDarwin) "man";
@ -93,7 +93,7 @@ mkDerivation rec {
owner = "qgis";
repo = "QGIS";
rev = "final-${lib.replaceStrings [ "." ] [ "_" ] version}";
hash = "sha256-aeTWjzYRCKcgdB9sknrcqO5oWEuwU7OuvrvAi8W4bWE=";
hash = "sha256-wWLbnZpLIchm0NXuU7jEXCBctrI6G1z8iqf9R2YhS8Y=";
};
passthru = {

View file

@ -89,14 +89,14 @@ let
in
stdenv.mkDerivation rec {
pname = "qgis-unwrapped";
version = "4.0.1";
version = "4.0.2";
outputs = [ "out" ] ++ lib.optional (!stdenv.hostPlatform.isDarwin) "man";
src = fetchFromGitHub {
owner = "qgis";
repo = "QGIS";
rev = "final-${lib.replaceStrings [ "." ] [ "_" ] version}";
hash = "sha256-pH48EhH2kmlscFPYiLStGIqXrmO9zgpidtkWVf1K5Mo=";
hash = "sha256-4tQ7Jv03/S6+xt3NU7jZLsZk3rQyaj+XsVnpCWW1uqg=";
};
passthru = {

View file

@ -55,7 +55,7 @@ stdenv.mkDerivation rec {
install -Dpm755 -D diffpdf $out/bin/diffpdf
install -Dpm644 -D diffpdf.1 $out/share/man/man1/diffpdf.1
install -dpm755 $out/share/doc/${pname}-${version} $out/share/licenses/${pname}-${version} $out/share/icons $out/share/pixmaps $out/share/applications
install -dpm755 $out/share/doc/${pname}-${version} $out/share/licenses/${pname}-${version} $out/share/icons $out/share/applications
install -Dpm644 CHANGES README help.html $out/share/doc/${pname}-${version}/
install -Dpm644 gpl-2.0.txt $out/share/licenses/${pname}-${version}/
install -Dpm644 images/icon.png $out/share/icons/hicolor/64x64/apps/diffpdf.png
@ -67,7 +67,7 @@ stdenv.mkDerivation rec {
Name=diffpdf
Icon=diffpdf
Comment=PDF diffing tool
Exec=$out/bin/diffpdf
Exec=diffpdf
Terminal=false
EOF
'';

View file

@ -7,40 +7,41 @@
python3,
python3Packages,
ruby,
wrapQtAppsHook,
qtbase,
qtmultimedia,
qtsvg,
qttools,
qtxmlpatterns,
qmake,
which,
perl,
libgit2,
libpng,
expat,
curl,
zlib,
wrapQtAppsHook,
qmake,
qtbase,
qtmultimedia,
qtsvg,
qttools,
qt5compat,
}:
stdenv.mkDerivation (finalAttrs: {
pname = "klayout";
version = "0.30.7";
version = "0.30.8";
src = fetchFromGitHub {
owner = "KLayout";
repo = "klayout";
rev = "v${finalAttrs.version}";
hash = "sha256-W8ry1+wxVOUxg4hXMd0OpcaWcVr6wUBC3eGgDney2Xc=";
hash = "sha256-RjMH6hrc0jyCLgG1D6cztBp5Fb3W5HgTxVTfI2bxgCs=";
};
strictDeps = true;
postPatch = ''
substituteInPlace src/klayout.pri --replace "-Wno-reserved-user-defined-literal" ""
patchShebangs .
patchShebangs --build .
'';
dontUseQmakeConfigure = true;
dontWrapQtApps = stdenv.hostPlatform.isDarwin;
nativeBuildInputs = [
(python3.withPackages (ps: [ ps.tomli ]))
@ -54,7 +55,7 @@ stdenv.mkDerivation (finalAttrs: {
qtmultimedia
qtsvg
qttools
qtxmlpatterns
qt5compat
];
buildInputs = [
@ -62,11 +63,12 @@ stdenv.mkDerivation (finalAttrs: {
qtmultimedia
qtsvg
qttools
qtxmlpatterns
qt5compat
libgit2
libpng
expat
curl
zlib
];
buildPhase = ''
@ -107,7 +109,10 @@ stdenv.mkDerivation (finalAttrs: {
wrapQtApp "$out/Applications/klayout.app/Contents/MacOS/klayout"
'';
env.NIX_CFLAGS_COMPILE = toString [ "-Wno-parentheses" ];
env = {
NIX_CFLAGS_COMPILE = toString [ "-Wno-parentheses" ];
NIX_LDFLAGS = lib.optionalString stdenv.hostPlatform.isDarwin "-headerpad_max_install_names";
};
# Installation is handled manually in buildPhase/postBuild via build.sh -prefix
dontInstall = true;

Some files were not shown because too many files have changed in this diff Show more