Merge remote-tracking branch 'origin/staging-next' into staging

This commit is contained in:
Leona Maroni
2025-11-15 09:52:12 +01:00
1249 changed files with 31237 additions and 24104 deletions
+14 -8
View File
@@ -12,9 +12,14 @@ on:
mergedSha:
required: true
type: string
secrets:
CACHIX_AUTH_TOKEN:
targetSha:
required: true
type: string
secrets:
# Should only be provided in the merge queue, not in pull requests,
# where we're evaluating untrusted code.
CACHIX_AUTH_TOKEN_GHA:
required: false
permissions: {}
@@ -55,21 +60,22 @@ jobs:
uses: ./.github/actions/checkout
with:
merged-as-untrusted-at: ${{ inputs.mergedSha }}
target-as-trusted-at: ${{ inputs.targetSha }}
- uses: cachix/install-nix-action@456688f15bc354bef6d396e4a35f4f89d40bf2b7 # v31
- uses: cachix/install-nix-action@7ec16f2c061ab07b235a7245e06ed46fe9a1cab6 # v31
with:
# Sandbox is disabled on MacOS by default.
extra_nix_config: sandbox = true
- uses: cachix/cachix-action@0fc020193b5a1fa3ac4575aa3a7d3aa6a35435ad # v16
with:
# The nixpkgs-ci cache should not be trusted or used outside of Nixpkgs and its forks' CI.
name: ${{ vars.CACHIX_NAME || 'nixpkgs-ci' }}
extraPullNames: nixpkgs-ci
authToken: ${{ secrets.CACHIX_AUTH_TOKEN }}
# The nixpkgs-gha cache should not be trusted or used outside of Nixpkgs and its forks' CI.
name: ${{ vars.CACHIX_NAME || 'nixpkgs-gha' }}
extraPullNames: nixpkgs-gha
authToken: ${{ secrets.CACHIX_AUTH_TOKEN_GHA }}
pushFilter: '(-source$|-nixpkgs-tarball-)'
- run: nix-env --install -f nixpkgs/untrusted-pinned -A nix-build-uncached
- run: nix-env --install -f nixpkgs/trusted-pinned -A nix-build-uncached
- name: Build shell
if: contains(matrix.builds, 'shell')
+12 -9
View File
@@ -4,10 +4,10 @@ on:
workflow_call:
inputs:
baseBranch:
required: true
required: false
type: string
headBranch:
required: true
required: false
type: string
mergedSha:
required: true
@@ -16,8 +16,10 @@ on:
required: true
type: string
secrets:
CACHIX_AUTH_TOKEN:
required: true
# Should only be provided in the merge queue, not in pull requests,
# where we're evaluating untrusted code.
CACHIX_AUTH_TOKEN_GHA:
required: false
permissions: {}
@@ -27,6 +29,7 @@ defaults:
jobs:
commits:
if: inputs.baseBranch && inputs.headBranch
permissions:
pull-requests: write
runs-on: ubuntu-24.04-arm
@@ -82,14 +85,14 @@ jobs:
merged-as-untrusted-at: ${{ inputs.mergedSha }}
target-as-trusted-at: ${{ inputs.targetSha }}
- uses: cachix/install-nix-action@456688f15bc354bef6d396e4a35f4f89d40bf2b7 # v31
- uses: cachix/install-nix-action@7ec16f2c061ab07b235a7245e06ed46fe9a1cab6 # v31
- uses: cachix/cachix-action@0fc020193b5a1fa3ac4575aa3a7d3aa6a35435ad # v16
with:
# The nixpkgs-ci cache should not be trusted or used outside of Nixpkgs and its forks' CI.
name: ${{ vars.CACHIX_NAME || 'nixpkgs-ci' }}
extraPullNames: nixpkgs-ci
authToken: ${{ secrets.CACHIX_AUTH_TOKEN }}
# The nixpkgs-gha cache should not be trusted or used outside of Nixpkgs and its forks' CI.
name: ${{ vars.CACHIX_NAME || 'nixpkgs-gha' }}
extraPullNames: nixpkgs-gha
authToken: ${{ secrets.CACHIX_AUTH_TOKEN_GHA }}
pushFilter: -source$
- name: Build codeowners validator
+12 -10
View File
@@ -19,8 +19,10 @@ on:
default: false
type: boolean
secrets:
CACHIX_AUTH_TOKEN:
required: true
# Should only be provided in the merge queue, not in pull requests,
# where we're evaluating untrusted code.
CACHIX_AUTH_TOKEN_GHA:
required: false
permissions: {}
@@ -52,7 +54,7 @@ jobs:
ci/pinned.json
- name: Install Nix
uses: cachix/install-nix-action@456688f15bc354bef6d396e4a35f4f89d40bf2b7 # v31
uses: cachix/install-nix-action@7ec16f2c061ab07b235a7245e06ed46fe9a1cab6 # v31
- name: Load supported versions
id: versions
@@ -98,14 +100,14 @@ jobs:
target-as-trusted-at: ${{ inputs.targetSha }}
- name: Install Nix
uses: cachix/install-nix-action@456688f15bc354bef6d396e4a35f4f89d40bf2b7 # v31
uses: cachix/install-nix-action@7ec16f2c061ab07b235a7245e06ed46fe9a1cab6 # v31
- uses: cachix/cachix-action@0fc020193b5a1fa3ac4575aa3a7d3aa6a35435ad # v16
with:
# The nixpkgs-ci cache should not be trusted or used outside of Nixpkgs and its forks' CI.
name: ${{ vars.CACHIX_NAME || 'nixpkgs-ci' }}
extraPullNames: nixpkgs-ci
authToken: ${{ secrets.CACHIX_AUTH_TOKEN }}
# The nixpkgs-gha cache should not be trusted or used outside of Nixpkgs and its forks' CI.
name: ${{ vars.CACHIX_NAME || 'nixpkgs-gha' }}
extraPullNames: nixpkgs-gha
authToken: ${{ secrets.CACHIX_AUTH_TOKEN_GHA }}
pushFilter: '(-source|-single-chunk)$'
- name: Evaluate the ${{ matrix.system }} output paths at the merge commit
@@ -186,7 +188,7 @@ jobs:
merge-multiple: true
- name: Install Nix
uses: cachix/install-nix-action@456688f15bc354bef6d396e4a35f4f89d40bf2b7 # v31
uses: cachix/install-nix-action@7ec16f2c061ab07b235a7245e06ed46fe9a1cab6 # v31
- name: Combine all output paths and eval stats
run: |
@@ -349,7 +351,7 @@ jobs:
merged-as-untrusted-at: ${{ inputs.mergedSha }}
- name: Install Nix
uses: cachix/install-nix-action@456688f15bc354bef6d396e4a35f4f89d40bf2b7 # v31
uses: cachix/install-nix-action@7ec16f2c061ab07b235a7245e06ed46fe9a1cab6 # v31
- name: Run misc eval tasks in parallel
run: |
+15 -13
View File
@@ -10,8 +10,10 @@ on:
required: true
type: string
secrets:
CACHIX_AUTH_TOKEN:
required: true
# Should only be provided in the merge queue, not in pull requests,
# where we're evaluating untrusted code.
CACHIX_AUTH_TOKEN_GHA:
required: false
permissions: {}
@@ -33,7 +35,7 @@ jobs:
with:
merged-as-untrusted-at: ${{ inputs.mergedSha }}
- uses: cachix/install-nix-action@456688f15bc354bef6d396e4a35f4f89d40bf2b7 # v31
- uses: cachix/install-nix-action@7ec16f2c061ab07b235a7245e06ed46fe9a1cab6 # v31
# TODO: Figure out how to best enable caching for the treefmt job. Cachix won't work well,
# because the cache would be invalidated on every commit - treefmt checks every file.
@@ -68,14 +70,14 @@ jobs:
with:
merged-as-untrusted-at: ${{ inputs.mergedSha }}
- uses: cachix/install-nix-action@456688f15bc354bef6d396e4a35f4f89d40bf2b7 # v31
- uses: cachix/install-nix-action@7ec16f2c061ab07b235a7245e06ed46fe9a1cab6 # v31
- uses: cachix/cachix-action@0fc020193b5a1fa3ac4575aa3a7d3aa6a35435ad # v16
with:
# The nixpkgs-ci cache should not be trusted or used outside of Nixpkgs and its forks' CI.
name: ${{ vars.CACHIX_NAME || 'nixpkgs-ci' }}
extraPullNames: nixpkgs-ci
authToken: ${{ secrets.CACHIX_AUTH_TOKEN }}
# The nixpkgs-gha cache should not be trusted or used outside of Nixpkgs and its forks' CI.
name: ${{ vars.CACHIX_NAME || 'nixpkgs-gha' }}
extraPullNames: nixpkgs-gha
authToken: ${{ secrets.CACHIX_AUTH_TOKEN_GHA }}
pushFilter: -source$
- name: Parse all nix files
@@ -97,14 +99,14 @@ jobs:
merged-as-untrusted-at: ${{ inputs.mergedSha }}
target-as-trusted-at: ${{ inputs.targetSha }}
- uses: cachix/install-nix-action@456688f15bc354bef6d396e4a35f4f89d40bf2b7 # v31
- uses: cachix/install-nix-action@7ec16f2c061ab07b235a7245e06ed46fe9a1cab6 # v31
- uses: cachix/cachix-action@0fc020193b5a1fa3ac4575aa3a7d3aa6a35435ad # v16
with:
# The nixpkgs-ci cache should not be trusted or used outside of Nixpkgs and its forks' CI.
name: ${{ vars.CACHIX_NAME || 'nixpkgs-ci' }}
extraPullNames: nixpkgs-ci
authToken: ${{ secrets.CACHIX_AUTH_TOKEN }}
# The nixpkgs-gha cache should not be trusted or used outside of Nixpkgs and its forks' CI.
name: ${{ vars.CACHIX_NAME || 'nixpkgs-gha' }}
extraPullNames: nixpkgs-gha
authToken: ${{ secrets.CACHIX_AUTH_TOKEN_GHA }}
pushFilter: -source$
- name: Running nixpkgs-vet
+57 -14
View File
@@ -13,9 +13,6 @@ on:
targetSha:
required: true
type: string
secrets:
CACHIX_AUTH_TOKEN:
required: true
permissions: {}
@@ -23,7 +20,10 @@ jobs:
prepare:
runs-on: ubuntu-24.04-arm
outputs:
systems: ${{ steps.systems.outputs.systems }}
baseBranch: ${{ steps.prepare.outputs.base }}
mergedSha: ${{ steps.prepare.outputs.mergedSha }}
targetSha: ${{ steps.prepare.outputs.targetSha }}
systems: ${{ steps.prepare.outputs.systems }}
steps:
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
@@ -31,19 +31,50 @@ jobs:
sparse-checkout: |
ci/supportedSystems.json
- name: Load supported systems
id: systems
run: |
echo "systems=$(jq -c <ci/supportedSystems.json)" >> "$GITHUB_OUTPUT"
- id: prepare
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
env:
MERGED_SHA: ${{ inputs.mergedSha }}
TARGET_SHA: ${{ inputs.targetSha }}
with:
script: |
const { classify } = require('./ci/supportedBranches.js')
const baseBranch = (
context.payload.merge_group?.base_ref ??
context.payload.pull_request.base.ref
).replace(/^refs\/heads\//, '')
const baseClassification = classify(baseBranch)
core.setOutput('base', baseClassification)
core.info('base classification:', baseClassification)
core.setOutput('mergedSha', context.payload.merge_group?.head_sha ?? process.env.MERGED_SHA)
core.info(`mergedSha: ${context.payload.merge_group?.head_sha ?? process.env.MERGED_SHA}`)
core.setOutput('targetSha', context.payload.merge_group?.base_sha ?? process.env.TARGET_SHA)
core.info(`targetSha: ${context.payload.merge_group?.base_sha ?? process.env.TARGET_SHA}`)
core.setOutput('systems', require('./ci/supportedSystems.json'))
check:
name: Check
needs: [prepare]
uses: ./.github/workflows/check.yml
permissions:
# cherry-picks; formality right now, but unused
pull-requests: write
secrets:
CACHIX_AUTH_TOKEN_GHA: ${{ secrets.CACHIX_AUTH_TOKEN_GHA }}
with:
mergedSha: ${{ needs.prepare.outputs.mergedSha }}
targetSha: ${{ needs.prepare.outputs.targetSha }}
lint:
name: Lint
needs: [prepare]
uses: ./.github/workflows/lint.yml
secrets:
CACHIX_AUTH_TOKEN: ${{ secrets.CACHIX_AUTH_TOKEN }}
CACHIX_AUTH_TOKEN_GHA: ${{ secrets.CACHIX_AUTH_TOKEN_GHA }}
with:
mergedSha: ${{ inputs.mergedSha || github.event.merge_group.head_sha }}
targetSha: ${{ inputs.targetSha || github.event.merge_group.base_sha }}
mergedSha: ${{ needs.prepare.outputs.mergedSha }}
targetSha: ${{ needs.prepare.outputs.targetSha }}
eval:
name: Eval
@@ -55,13 +86,25 @@ jobs:
# compare
statuses: write
secrets:
CACHIX_AUTH_TOKEN: ${{ secrets.CACHIX_AUTH_TOKEN }}
CACHIX_AUTH_TOKEN_GHA: ${{ secrets.CACHIX_AUTH_TOKEN_GHA }}
with:
artifact-prefix: ${{ inputs.artifact-prefix }}
mergedSha: ${{ inputs.mergedSha || github.event.merge_group.head_sha }}
targetSha: ${{ inputs.targetSha || github.event.merge_group.base_sha }}
mergedSha: ${{ needs.prepare.outputs.mergedSha }}
targetSha: ${{ needs.prepare.outputs.targetSha }}
systems: ${{ needs.prepare.outputs.systems }}
build:
name: Build
needs: [prepare]
uses: ./.github/workflows/build.yml
secrets:
CACHIX_AUTH_TOKEN_GHA: ${{ secrets.CACHIX_AUTH_TOKEN_GHA }}
with:
artifact-prefix: ${{ inputs.artifact-prefix }}
baseBranch: ${{ needs.prepare.outputs.baseBranch }}
mergedSha: ${{ needs.prepare.outputs.mergedSha }}
targetSha: ${{ needs.prepare.outputs.targetSha }}
# This job's only purpose is to create the target for the "Required Status Checks" branch ruleset.
# It "needs" all the jobs that should block the Merge Queue.
unlock:
+4
View File
@@ -35,6 +35,10 @@ jobs:
into: staging-next-25.05
- from: staging-next-25.05
into: staging-25.05
- from: master
into: staging-next-25.11
- from: staging-next-25.11
into: staging-25.11
- name: merge-base(master,staging) → haskell-updates
from: master staging
into: haskell-updates
+1 -10
View File
@@ -8,8 +8,6 @@ on:
required: true
type: string
secrets:
CACHIX_AUTH_TOKEN:
required: true
NIXPKGS_CI_APP_PRIVATE_KEY:
required: true
@@ -63,8 +61,6 @@ jobs:
permissions:
# cherry-picks
pull-requests: write
secrets:
CACHIX_AUTH_TOKEN: ${{ secrets.CACHIX_AUTH_TOKEN }}
with:
baseBranch: ${{ needs.prepare.outputs.baseBranch }}
headBranch: ${{ needs.prepare.outputs.headBranch }}
@@ -75,8 +71,6 @@ jobs:
name: Lint
needs: [prepare]
uses: ./.github/workflows/lint.yml
secrets:
CACHIX_AUTH_TOKEN: ${{ secrets.CACHIX_AUTH_TOKEN }}
with:
mergedSha: ${{ needs.prepare.outputs.mergedSha }}
targetSha: ${{ needs.prepare.outputs.targetSha }}
@@ -88,8 +82,6 @@ jobs:
permissions:
# compare
statuses: write
secrets:
CACHIX_AUTH_TOKEN: ${{ secrets.CACHIX_AUTH_TOKEN }}
with:
artifact-prefix: ${{ inputs.artifact-prefix }}
mergedSha: ${{ needs.prepare.outputs.mergedSha }}
@@ -113,12 +105,11 @@ jobs:
name: Build
needs: [prepare]
uses: ./.github/workflows/build.yml
secrets:
CACHIX_AUTH_TOKEN: ${{ secrets.CACHIX_AUTH_TOKEN }}
with:
artifact-prefix: ${{ inputs.artifact-prefix }}
baseBranch: ${{ needs.prepare.outputs.baseBranch }}
mergedSha: ${{ needs.prepare.outputs.mergedSha }}
targetSha: ${{ needs.prepare.outputs.targetSha }}
# This job's only purpose is to create the target for the "Required Status Checks" branch ruleset.
# It "needs" all the jobs that should block merging a PR.
+1 -3
View File
@@ -82,9 +82,8 @@ jobs:
uses: ./.github/workflows/merge-group.yml
# Those are actually only used on the merge_group event, but will throw an error if not set.
permissions:
pull-requests: write
statuses: write
secrets:
CACHIX_AUTH_TOKEN: ${{ secrets.CACHIX_AUTH_TOKEN }}
with:
artifact-prefix: mg-
mergedSha: ${{ needs.prepare.outputs.mergedSha }}
@@ -101,7 +100,6 @@ jobs:
pull-requests: write
statuses: write
secrets:
CACHIX_AUTH_TOKEN: ${{ secrets.CACHIX_AUTH_TOKEN }}
NIXPKGS_CI_APP_PRIVATE_KEY: ${{ secrets.NIXPKGS_CI_APP_PRIVATE_KEY }}
with:
artifact-prefix: pr-
+8 -2
View File
@@ -507,8 +507,14 @@ pkgs/servers/authelia/ @06kellyjac @dit7ya @nicomem
pkgs/by-name/oc/octodns/ @anthonyroussel
# Teleport
/pkgs/build-support/teleport @arianvp @justinas @sigma @tomberek @freezeboy @techknowlogick @JuliusFreudenberger
pkgs/by-name/te/teleport* @arianvp @justinas @sigma @tomberek @freezeboy @techknowlogick @JuliusFreudenberger
/pkgs/build-support/teleport @arianvp @justinas @sigma @tomberek @techknowlogick @JuliusFreudenberger
pkgs/by-name/te/teleport* @arianvp @justinas @sigma @tomberek @techknowlogick @JuliusFreudenberger
# Warp-terminal
pkgs/by-name/wa/warp-terminal/ @emilytrau @imadnyc @FlameFlag @johnrtitor
# Nim
/doc/languages-frameworks/nim.section.md @NixOS/nim
/pkgs/build-support/build-nim-package.nix @NixOS/nim
/pkgs/build-support/build-nim-sbom.nix @NixOS/nim
/pkgs/top-level/nim-overrides.nix @NixOS/nim
+1 -1
View File
@@ -4,7 +4,7 @@
Nixpkgs includes Julia as the `julia` derivation.
You can get specific versions by looking at the other `julia*` top-level derivations available.
For example, `julia_19` corresponds to Julia 1.9.
For example, `julia_112` corresponds to Julia 1.12.
We also provide the current stable version as `julia-stable`, and an LTS version as `julia-lts`.
Occasionally, a Julia version has been too difficult to build from source in Nixpkgs and has been fetched prebuilt instead.
+6 -6
View File
@@ -43,12 +43,12 @@ Here is a simple package example.
- It uses the `fetchFromGitHub` fetcher to get its source.
- It also accepts a `duneVersion` parameter (valid values are `"1"`, `"2"`, and
`"3"`). The recommended practice is to set it only if you don't want the default
value and/or it depends on something else like package version. You might see
a not-supported argument `useDune2`. The behavior was `useDune2 = true;` =>
`duneVersion = "2";` and `useDune2 = false;` => `duneVersion = "1";`. It was
used at the time when dune3 didn't exist.
- It also accepts a `duneVersion` parameter (valid values are `"2"`, and
`"3"`). The recommended practice is to set it only if you don't want the
default value and/or it depends on something else like package version. You
might see a not-supported argument `useDune2`. The behavior was `useDune2 =
true;` => `duneVersion = "2";` and `useDune2 = false;` => `duneVersion =
"1";`. It was used at the time when dune3 didn't exist.
- It sets the optional `doCheck` attribute such that tests will be run with
`dune runtest -p angstrom` after the build (`dune build -p angstrom`) is
+4
View File
@@ -104,6 +104,8 @@
- `mx-puppet-discord` was removed from Nixpkgs along with its NixOS module as it was unmaintained and was the only user of sha1 hashes in tree.
- `notary` has been removed because it was [archived upstream](https://github.com/notaryproject/.github/issues/70). Upstream recommends [`notation`](https://github.com/notaryproject/notation/) instead.
- `gradience` has been removed because it was archived upstream.
- `kbd` package's `outputs` now include a `man` and `scripts` outputs. The `unicode_start` and `unicode_stop` Bash scripts are now part of the `scripts` output, allowing most usages of the `kbd` package to not pull in `bash`.
@@ -287,6 +289,8 @@
Use `python3Packages.ddgs` instead.
See [release note for v9.0.0](https://github.com/deedy5/ddgs/releases/tag/v9.0.0)
- `ra-multiplex` has been renamed to/replaced by `lspmux`. Its wrapper no longer includes `rust-analyzer`.
## Other Notable Changes {#sec-nixpkgs-release-25.11-notable-changes}
<!-- To avoid merge conflicts, consider adding your item at an arbitrary place in the list instead. -->
+36
View File
@@ -0,0 +1,36 @@
# Nixpkgs 26.05 (2026.05/??) {#sec-nixpkgs-release-26.05}
## Highlights {#sec-nixpkgs-release-26.05-highlights}
<!-- 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!
## Backward Incompatibilities {#sec-nixpkgs-release-26.05-incompatibilities}
<!-- To avoid merge conflicts, consider adding your item at an arbitrary place in the list instead. -->
- `spoof` has been removed, as there are many issues upstream with it working on modern OS versions, and it appears to be unmaintained.
## Other Notable Changes {#sec-nixpkgs-release-26.05-notable-changes}
<!-- 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!
## Nixpkgs Library {#sec-nixpkgs-release-26.05-lib}
<!-- To avoid merge conflicts, consider adding your item at an arbitrary place in the list instead. -->
### Breaking changes {#sec-nixpkgs-release-26.05-lib-breaking}
- Create the first release note entry in this section!
### Deprecations {#sec-nixpkgs-release-26.05-lib-deprecations}
- Create the first release note entry in this section!
### Additions and Improvements {#sec-nixpkgs-release-26.05-lib-additions-improvements}
- Create the first release note entry in this section!
+125
View File
@@ -16,6 +16,7 @@
{ lib }:
let
inherit (lib)
concatMapStringsSep
isList
isAttrs
substring
@@ -23,6 +24,7 @@ let
concatLists
const
elem
foldl'
generators
id
mapAttrs
@@ -454,6 +456,129 @@ rec {
)
);
/**
Pretty-print a list of test failures.
This takes an attribute set containing `failures` (a list of test failures
produced by `runTests`) and pretty-prints each failing test, before
throwing an error containing the raw test data as JSON.
If the input list is empty, `null` is returned.
# Inputs
`failures`
: A list of test failures (produced `runTests`), each containing `name`,
`expected`, and `result` attributes.
# Type
```
throwTestFailures :: {
failures = [
{
name :: String;
expected :: a;
result :: a;
}
];
}
->
null
```
# Examples
:::{.example}
## `lib.debug.throwTestFailures` usage example
```nix
throwTestFailures {
failures = [
{
name = "testDerivation";
expected = derivation {
name = "a";
builder = "bash";
system = "x86_64-linux";
};
result = derivation {
name = "b";
builder = "bash";
system = "x86_64-linux";
};
}
];
}
->
trace: FAIL testDerivation:
Expected: <derivation a>
Result: <derivation b>
error:
while evaluating the file '...':
caused by explicit throw
at /nix/store/.../lib/debug.nix:528:7:
527| in
528| throw (
| ^
529| builtins.seq traceFailures (
error: 1 tests failed:
- testDerivation
[{"expected":"/nix/store/xh7kyqp69mxkwspmi81a94m9xx74r8dr-a","name":"testDerivation","result":"/nix/store/503l84nir4zw57d1shfhai25bxxn16c6-b"}]
null
```
:::
*/
throwTestFailures =
{
failures,
description ? "tests",
...
}:
if failures == [ ] then
null
else
let
toPretty =
value:
# Thanks to @Ma27 for this:
#
# > The `unsafeDiscardStringContext` is useful when the `toPretty`
# > stumbles upon a derivation that would be realized without it (I
# > ran into the problem when writing a test for a flake helper where
# > I creating a bunch of "mock" derivations for different systems
# > and Nix then tried to build those when the error-string got
# > forced).
#
# See: https://github.com/NixOS/nixpkgs/pull/416207#discussion_r2145942389
builtins.unsafeDiscardStringContext (generators.toPretty { allowPrettyValues = true; } value);
failureToPretty = failure: ''
FAIL ${toPretty failure.name}:
Expected:
${toPretty failure.expected}
Result:
${toPretty failure.result}
'';
traceFailures = foldl' (_accumulator: failure: traceVal (failureToPretty failure)) null failures;
in
throw (
builtins.seq traceFailures (
"${builtins.toString (builtins.length failures)} ${description} failed:\n- "
+ (concatMapStringsSep "\n- " (failure: failure.name) failures)
+ "\n\n"
+ builtins.toJSON failures
)
);
/**
Create a test assuming that list elements are `true`.
+4 -5
View File
@@ -15,7 +15,7 @@ let
# This is not allowed generally, but we're in the tests here, so we'll allow ourselves.
storeDirPath = /. + builtins.storeDir;
cases = lib.runTests {
failures = lib.runTests {
# Test examples from the lib.path.append documentation
testAppendExample1 = {
expr = append /foo "bar/baz";
@@ -326,7 +326,6 @@ let
};
};
in
if cases == [ ] then
"Unit tests successful"
else
throw "Path unit tests failed: ${lib.generators.toPretty { } cases}"
lib.debug.throwTestFailures {
inherit failures;
}
+27 -2
View File
@@ -4741,8 +4741,6 @@ runTests {
expected = "/non-existent/this/does/not/exist/for/real/please-dont-mess-with-your-local-fs/default.nix";
};
# Tests for cross index utilities
testRenameCrossIndexFrom = {
expr = lib.renameCrossIndexFrom "pkgs" {
pkgsBuildBuild = "dummy-build-build";
@@ -4819,4 +4817,31 @@ runTests {
};
};
testThrowTestFailuresEmpty = {
expr = lib.debug.throwTestFailures {
failures = [ ];
};
expected = null;
};
testThrowTestFailures = testingThrow (
lib.debug.throwTestFailures {
failures = [
{
name = "testDerivation";
expected = builtins.derivation {
name = "a";
builder = "bash";
system = "x86_64-linux";
};
result = builtins.derivation {
name = "b";
builder = "bash";
system = "x86_64-linux";
};
}
];
}
);
}
+13 -3
View File
@@ -241,7 +241,6 @@
"mirkolenz": 5160954,
"mstone": 412508,
"n8henrie": 1234956,
"niklaskorz": 590517,
"ofalvai": 1694986,
"pasqui23": 6931743,
"prusnak": 42201,
@@ -665,6 +664,18 @@
},
"name": "neovim"
},
"nim": {
"description": "Maintains the nim language and build tooling",
"id": 14913434,
"maintainers": {
"eclairevoyant": 848000
},
"members": {
"Eveeifyeve": 88671402,
"daylinmorgan": 47667941
},
"name": "nim"
},
"nix-formatting": {
"description": "Maintain the official Nix formatter and apply it to Nixpkgs: https://nixos.org/community/teams/formatting/",
"id": 9676823,
@@ -676,8 +687,7 @@
"0x4A6F": 9675338,
"MattSturgeon": 5046562,
"Sereja313": 112060595,
"dasJ": 4971975,
"piegamesde": 14054505
"dasJ": 4971975
},
"name": "nix-formatting"
},
+82 -54
View File
@@ -3232,12 +3232,6 @@
githubId = 10439709;
name = "Bert Moens";
};
berdario = {
email = "berdario@gmail.com";
github = "berdario";
githubId = 752835;
name = "Dario Bertini";
};
bergey = {
email = "bergey@teallabs.org";
github = "bergey";
@@ -3498,6 +3492,12 @@
githubId = 37768199;
name = "Christian Bergschneider";
};
bloominstrong = {
email = "github@mail.bloominstrong.net";
github = "bloominstrong";
githubId = 114744388;
name = "bloominstrong";
};
bloveless = {
email = "brennon.loveless@gmail.com";
github = "bloveless";
@@ -3821,6 +3821,12 @@
github = "britter";
githubId = 1327662;
};
brittonr = {
name = "Britton Robitzsch";
email = "b@robitzs.ch";
github = "brittonr";
githubId = 4730485;
};
brodes = {
email = "me@brod.es";
github = "brhoades";
@@ -5628,7 +5634,7 @@
email = "nix@theriault.codes";
github = "Dan-Theriault";
githubId = 13945563;
matrix = "@dan:matrix.org";
matrix = "@Dan:matrix.org";
name = "Daniel Theriault";
};
danbst = {
@@ -6165,6 +6171,12 @@
github = "deifactor";
githubId = 30192992;
};
deimelias = {
name = "Deim Elias";
github = "DeimElias";
email = "deimelias@gmail.com";
githubId = 100871962;
};
deinferno = {
name = "deinferno";
github = "deinferno";
@@ -8825,11 +8837,6 @@
githubId = 32936898;
name = "Wu Zhenyu";
};
freezeboy = {
github = "freezeboy";
githubId = 13279982;
name = "freezeboy";
};
frenetic00 = {
github = "frenetic00";
githubId = 50942055;
@@ -10112,12 +10119,6 @@
githubId = 79340822;
keys = [ { fingerprint = "3582 5B85 66C8 4F36 45C7 EC42 809F 7938 9CB1 8650"; } ];
};
havvy = {
email = "ryan.havvy@gmail.com";
github = "Havvy";
githubId = 731722;
name = "Ryan Scheel";
};
hawkw = {
email = "eliza@elizas.website";
github = "hawkw";
@@ -11410,12 +11411,6 @@
githubId = 8095978;
name = "j-mendez";
};
j03 = {
email = "github@johannesloetzsch.de";
github = "johannesloetzsch";
githubId = 175537;
name = "Johannes Lötzsch";
};
j0hax = {
name = "Johannes Arnold";
email = "johannes.arnold@stud.uni-hannover.de";
@@ -13285,12 +13280,6 @@
githubId = 54859825;
keys = [ { fingerprint = "B2D0 AA53 8DBE 60B0 0811 3FC0 2D52 5F67 791E 5834"; } ];
};
kampfschlaefer = {
email = "arnold@arnoldarts.de";
github = "kampfschlaefer";
githubId = 3831860;
name = "Arnold Krille";
};
kanashimia = {
email = "chad@redpilled.dev";
github = "kanashimia";
@@ -13314,6 +13303,13 @@
githubId = 34152449;
name = "Karl Hallsby";
};
karpfediem = {
name = "Karpfen";
github = "karpfediem";
githubId = 11753414;
email = "nixos@karpfen.dev";
matrix = "@karpfen:matrix.org";
};
kashw2 = {
email = "supra4keanu@hotmail.com";
github = "kashw2";
@@ -14512,12 +14508,6 @@
githubId = 736291;
name = "Lee Machin";
};
leenaars = {
email = "ml.software@leenaa.rs";
github = "leenaars";
githubId = 4158274;
name = "Michiel Leenaars";
};
legojames = {
github = "jrobinson-uk";
githubId = 4701504;
@@ -14755,6 +14745,18 @@
matrix = "@libjared:matrix.org";
name = "Jared Perry";
};
liferooter = {
name = "Gleb Smirnov";
github = "liferooter";
githubId = 54807745;
email = "glebsmirnov0708@gmail.com";
matrix = "@liferooter:vanutp.dev";
keys = [
{
fingerprint = "B793 3BBD DE3F 524F 69BD CEAB FF5A EB4C 68AC 0F8D";
}
];
};
liff = {
email = "liff@iki.fi";
github = "liff";
@@ -15075,6 +15077,12 @@
github = "lorenz";
githubId = 5228892;
};
LorenzBischof = {
name = "Lorenz Bischof";
email = "nix@lorenzbischof.ch";
github = "LorenzBischof";
githubId = 1837725;
};
lorenzleutgeb = {
email = "lorenz@leutgeb.xyz";
github = "lorenzleutgeb";
@@ -15648,12 +15656,6 @@
githubId = 1433367;
name = "Marc Fontaine";
};
magenbluten = {
email = "magenbluten@codemonkey.cc";
github = "magenbluten";
githubId = 1140462;
name = "magenbluten";
};
magicquark = {
name = "magicquark";
github = "magicquark";
@@ -16389,6 +16391,12 @@
githubId = 65052855;
name = "maxicode";
};
maximiliancf = {
email = "maximiliancf.dev@icloud.com";
github = "MaximilianCF";
githubId = 92341177;
name = "Maximilian Canez Fernandes";
};
maximsmol = {
email = "maximsmol@gmail.com";
github = "maximsmol";
@@ -16724,6 +16732,12 @@
github = "merrkry";
githubId = 124278440;
};
messemar = {
email = "martin.messer@cyberus-technology.de";
name = "messemar";
github = "messemar";
githubId = 22659757;
};
metalmatze = {
email = "matthias.loibl@polarsignals.com";
name = "Matthias Loibl";
@@ -17395,12 +17409,6 @@
githubId = 14153763;
name = "modderme123";
};
modulistic = {
email = "modulistic@gmail.com";
github = "modulistic";
githubId = 1902456;
name = "Pablo Costa";
};
mog = {
email = "mog-lists@rldn.net";
github = "mogorman";
@@ -20153,12 +20161,6 @@
githubId = 121009904;
name = "penalty1083";
};
penguwin = {
email = "penguwin@penguwin.eu";
github = "penguwin";
githubId = 13225611;
name = "Nicolas Martin";
};
pentane = {
email = "cyclopentane@aidoskyneen.eu";
github = "cyclic-pentane";
@@ -20613,6 +20615,13 @@
github = "plamper";
githubId = 59016721;
};
PlasmaPower = {
name = "Lee Bousfield";
github = "PlasmaPower";
githubId = 6006498;
email = "ljbousfield+nix@gmail.com";
matrix = "@plasmapower:matrix.org";
};
plchldr = {
email = "mail@oddco.de";
github = "plchldr";
@@ -22698,6 +22707,12 @@
github = "rudolfvesely";
githubId = 13966949;
};
ruiiiijiiiiang = {
name = "Rui Jiang";
email = "me@ruijiang.me";
github = "ruiiiijiiiiang";
githubId = 911199;
};
Ruixi-rebirth = {
name = "Ruixi-rebirth";
email = "ruixirebirth@gmail.com";
@@ -24971,6 +24986,14 @@
githubId = 1694705;
name = "Sam Stites";
};
storopoli = {
email = "jose@storopoli.com";
github = "storopoli";
githubId = 43353831;
name = "Jose Storopoli";
keys = [ { fingerprint = "B8C0 1A87 C046 33C9 F6CD 0DA2 1BD3 8BE8 D065 3A7A"; } ];
matrix = "@jose:storopoli.com";
};
strager = {
email = "strager.nds@gmail.com";
github = "strager";
@@ -27734,6 +27757,11 @@
githubId = 51289041;
name = "Vuks";
};
vv01f = {
github = "vv01f";
githubId = 3034896;
name = "Wolf";
};
vyorkin = {
email = "vasiliy.yorkin@gmail.com";
github = "vyorkin";
+17 -2
View File
@@ -226,6 +226,18 @@ with lib.maintainers;
shortName = "Cosmopolitan";
};
ctrl-os = {
# Existing members may approve additions.
members = [
blitz
messemar
flyfloh
];
scope = "Team of Cyberus Technology employees that maintain packages relevant to CTRL-OS";
shortName = "CTRL-OS";
};
cuda = {
github = "cuda-maintainers";
};
@@ -234,7 +246,6 @@ with lib.maintainers;
# Verify additions by approval of an already existing member of the team.
members = [
xanderio
blitz
snu
e1mo
];
@@ -620,7 +631,6 @@ with lib.maintainers;
mate = {
members = [
bobby285271
j03
romildo
];
scope = "Maintain Mate desktop environment and related packages.";
@@ -706,6 +716,11 @@ with lib.maintainers;
shortName = "NGI";
};
nim = {
github = "nim";
enableFeatureFreezePing = true;
};
# same as https://github.com/orgs/NixOS/teams/nix-team
nix = {
members = [
@@ -138,6 +138,8 @@
- [dwl](https://codeberg.org/dwl/dwl), a compact, hackable compositor for Wayland based on wlroots. Available as [programs.dwl](#opt-programs.dwl.enable).
- [nebula-lighthouse-service](https://github.com/manuels/nebula-lighthouse-service), a public Nebula VPN lighthouse service. Available as [services.nebula-lighthouse-service](#opt-services.nebula-lighthouse-service.enable).
- [angrr](https://github.com/linyinfeng/angrr), a service that automatically cleans up old auto GC roots. Available as [services.angrr](#opt-services.angrr.enable).
- [Sharkey](https://joinsharkey.org), a Sharkish microblogging platform. Available as [services.sharkey](#opt-services.sharkey.enable).
@@ -164,6 +166,8 @@
- [conman](https://github.com/dun/conman), a serial console management program. Available as [services.conman](#opt-services.conman.enable).
- [Prometheus Tailscale Exporter](https://github.com/adinhodovic/tailscale-exporter), a Prometheus exporter for Tailscale Tailnet metrics.
- [KMinion](https://github.com/redpanda-data/kminion), feature-rich Prometheus exporter for Apache Kafka. Available as [services.prometheus.exporters.kafka](options.html#opt-services.prometheus.exporters.kafka).
- [Beszel](https://beszel.dev), a lightweight server monitoring hub with historical data, docker stats, and alerts. Available as [`services.beszel.agent`](options.html#opt-services.beszel.agent.enable) and [`services.beszel.hub`](options.html#opt-services.beszel.hub.enable).
@@ -200,6 +204,10 @@
- Linux 5.4 and all its variants have been removed since mainline will reach its end of life within the support-span of 25.11.
- The `services.nginx.sso` module has switched to generating its configuration
file in `/run`. You should manually delete `/var/lib/nginx-sso/config.yaml` to
avoid storing secret values to disk.
- The `services.polipo` module has been removed as `polipo` is unmaintained and archived upstream.
- `boot.enableContainers` is only turned on when a declarative NixOS container is defined in `containers`.
@@ -395,6 +403,8 @@ and [release notes for v18](https://goteleport.com/docs/changelog/#1800-070325).
- In all other cases, you'll need to set this option to `true` yourself.
- `boot.isNspawnContainer` being `true` implies [](#opt-boot.isContainer) being `true`.
- `users.users.*.linger` now defaults to `null` rather than `false`, meaning NixOS will not attempt to enable or disable lingering for that user account, instead allowing for imperative control over lingering using the `loginctl` commands. In practice, this is unlikely to make a difference for most people, as new users are created without lingering configured. There is a new, related option, `users.manageLingering`, which can be used to prevent NixOS attempting to manage lingering entirely.
- Due to [deprecation of gnome-session X11 support](https://blogs.gnome.org/alatiera/2025/06/08/the-x11-session-removal/), `services.desktopManager.pantheon` now defaults to pantheon-wayland session. The X11 session has been removed, see [this issue](https://github.com/elementary/session-settings/issues/91) for details.
- `bcachefs` file systems will now use the out-of-tree module for supported kernels. The in-tree module has been removed, and users will need to switch to kernels that support the out-of-tree module.
@@ -456,6 +466,8 @@ and [release notes for v18](https://goteleport.com/docs/changelog/#1800-070325).
- `linux_libre` & `linux_latest_libre` have been removed due to a lack of maintenance.
- `services.nebula.networks.<name>` will now store configuration files in `/etc/nebula/<name>.yml` and supports config reloading.
- `services.pds` has been renamed to `services.bluesky-pds`.
- `services.xserver.desktopManager.deepin` and associated packages have been removed due to being unmaintained. See issue [#422090](https://github.com/NixOS/nixpkgs/issues/422090) for more details.
@@ -0,0 +1,25 @@
# Release 26.05 (2026.05/??) {#sec-release-26.05}
## Highlights {#sec-release-26.05-highlights}
<!-- 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!
## New Modules {#sec-release-26.05-new-modules}
<!-- 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!
## Backward Incompatibilities {#sec-release-26.05-incompatibilities}
<!-- 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!
## Other Notable Changes {#sec-release-26.05-notable-changes}
<!-- 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!
@@ -194,8 +194,7 @@ class StartCommand:
class NixStartScript(StartCommand):
"""A start script from nixos/modules/virtualiation/qemu-vm.nix
that also satisfies the requirement of the BaseStartCommand.
"""A start script from nixos/modules/virtualiation/qemu-vm.nix.
These Nix commands have the particular characteristic that the
machine name can be extracted out of them via a regex match.
(Admittedly a _very_ implicit contract, evtl. TODO fix)
+73 -25
View File
@@ -11,6 +11,7 @@ let
any
attrNames
attrValues
boolToString
concatMap
concatMapStringsSep
concatStrings
@@ -43,6 +44,7 @@ let
stringLength
trace
types
versionOlder
xor
;
@@ -455,16 +457,21 @@ let
};
linger = mkOption {
type = types.bool;
default = false;
type = types.nullOr types.bool;
example = true;
default = null;
description = ''
Whether to enable lingering for this user. If true, systemd user
units will start at boot, rather than starting at login and stopping
at logout. This is the declarative equivalent of running
`loginctl enable-linger` for this user.
Whether to enable or disable lingering for this user. Without
lingering, user units will not be started until the user logs in,
and may be stopped on logout depending on the settings in
`logind.conf`.
If false, user units will not be started until the user logs in, and
may be stopped on logout depending on the settings in `logind.conf`.
By default, NixOS will not manage lingering, new users will default
to not lingering, and lingering can be configured imperatively using
`loginctl enable-linger` or `loginctl disable-linger`. Setting
this option to `true` or `false` is the declarative equivalent of
running `loginctl enable-linger` or `loginctl disable-linger`
respectively.
'';
};
};
@@ -661,8 +668,6 @@ let
shells = mapAttrsToList (_: u: u.shell) cfg.users;
in
filter types.shellPackage.check shells;
lingeringUsers = map (u: u.name) (attrValues (flip filterAttrs cfg.users (n: u: u.linger)));
in
{
imports = [
@@ -710,6 +715,13 @@ in
'';
};
users.manageLingering = mkOption {
type = types.bool;
default = true;
description = "Whether to manage whether users linger or not.";
example = false;
};
users.users = mkOption {
default = { };
type = with types; attrsOf (submodule userOpts);
@@ -894,32 +906,52 @@ in
else
""; # keep around for backwards compatibility
systemd.services.linger-users = lib.mkIf ((length lingeringUsers) > 0) {
systemd.services.linger-users = lib.mkIf cfg.manageLingering {
wantedBy = [ "multi-user.target" ];
after = [ "systemd-logind.service" ];
requires = [ "systemd-logind.service" ];
script =
let
lingerDir = "/var/lib/systemd/linger";
lingeringUsersFile = builtins.toFile "lingering-users" (
concatStrings (map (s: "${s}\n") (sort (a: b: a < b) lingeringUsers))
); # this sorting is important for `comm` to work correctly
lingeringUsers = filterAttrs (n: v: v.linger == true) cfg.users;
nonLingeringUsers = filterAttrs (n: v: v.linger == false) cfg.users;
lingeringUserNames = mapAttrsToList (n: v: v.name) lingeringUsers;
nonLingeringUserNames = mapAttrsToList (n: v: v.name) nonLingeringUsers;
in
''
mkdir -vp ${lingerDir}
cd ${lingerDir}
for user in $(ls); do
if ! id "$user" >/dev/null; then
echo "Removing linger for missing user $user"
rm --force -- "$user"
fi
${lib.strings.toShellVars { inherit lingeringUserNames nonLingeringUserNames; }}
user_configured () {
# Use `id` to check if the user exists rather than checking the
# NixOS configuration, as it may be that the user has been
# manually configured, which is permitted if users.mutableUsers
# is true (the default).
id "$1" >/dev/null
}
shopt -s dotglob nullglob
for user in *; do
if ! user_configured "$user"; then
# systemd has this user configured to linger despite them not
# existing.
echo "Removing linger for missing user $user" >&2
rm -- "$user"
fi
done
ls | sort | comm -3 -1 ${lingeringUsersFile} - | xargs -r ${pkgs.systemd}/bin/loginctl disable-linger
ls | sort | comm -3 -2 ${lingeringUsersFile} - | xargs -r ${pkgs.systemd}/bin/loginctl enable-linger
if (( ''${#nonLingeringUserNames[*]} > 0 )); then
${config.systemd.package}/bin/loginctl disable-linger "''${nonLingeringUserNames[@]}"
fi
if (( ''${#lingeringUserNames[*]} > 0 )); then
${config.systemd.package}/bin/loginctl enable-linger "''${lingeringUserNames[@]}"
fi
'';
serviceConfig.Type = "oneshot";
serviceConfig = {
Type = "oneshot";
StateDirectory = "systemd/linger";
WorkingDirectory = "/var/lib/systemd/linger";
};
};
# Warn about user accounts with deprecated password hashing schemes
@@ -1163,6 +1195,22 @@ in
users.groups.${user.name} = {};
'';
}
{
assertion = user.linger != null -> cfg.manageLingering;
message = ''
users.manageLingering is set to false, but
users.users.${user.name}.linger is configured.
If you want NixOS to manage whether user accounts linger or
not, you must set users.manageLingering to true. This is the
default setting.
If you do not want NixOS to manage whether user accounts linger
or not, you must set users.users.${user.name}.linger to null.
This is the default setting provided system.stateVersion is at
least "25.11".
'';
}
]
++ (map
(shell: {
+26 -3
View File
@@ -21,7 +21,7 @@
with lib;
let
rootfsImage = pkgs.callPackage ../../../lib/make-ext4-fs.nix (
rootfsImage = pkgs.callPackage config.sdImage.rootFilesystemCreator (
{
inherit (config.sdImage) storePaths;
compressImage = config.sdImage.compressImage;
@@ -128,6 +128,29 @@ in
'';
};
rootFilesystemCreator = mkOption {
type = types.oneOf [
types.package
types.path
];
default = ../../../lib/make-ext4-fs.nix;
example = ''
nixpkgs/nixos/lib/make-btrfs-fs.nix
'';
description = ''
The filesystem creator used for the root partition.
'';
};
rootFilesystemImage = mkOption {
type = types.package;
default = rootfsImage;
description = ''
The finished root partition image with all custom fileystem modifications.
Used to override the filesystem creator itself.
'';
};
firmwareSize = mkOption {
type = types.int;
# As of 2019-08-18 the Raspberry pi firmware + u-boot takes ~18MiB
@@ -254,11 +277,11 @@ in
echo "file sd-image $img" >> $out/nix-support/hydra-build-products
fi
root_fs=${rootfsImage}
root_fs=${config.sdImage.rootFilesystemImage}
${lib.optionalString config.sdImage.compressImage ''
root_fs=./root-fs.img
echo "Decompressing rootfs image"
zstd -d --no-progress "${rootfsImage}" -o $root_fs
zstd -d --no-progress "${config.sdImage.rootFilesystemImage}" -o $root_fs
''}
# Gap in front of the first partition, in MiB
+2 -1
View File
@@ -269,7 +269,6 @@
./programs/nano.nix
./programs/nautilus-open-any-terminal.nix
./programs/nbd.nix
./programs/nekoray.nix
./programs/neovim.nix
./programs/nethoscope.nix
./programs/nexttrace.nix
@@ -327,6 +326,7 @@
./programs/systemtap.nix
./programs/tcpdump.nix
./programs/television.nix
./programs/throne.nix
./programs/thunar.nix
./programs/thunderbird.nix
./programs/tmux.nix
@@ -1268,6 +1268,7 @@
./services/networking/ncdns.nix
./services/networking/ncps.nix
./services/networking/ndppd.nix
./services/networking/nebula-lighthouse-service.nix
./services/networking/nebula.nix
./services/networking/netbird.nix
./services/networking/netbird/server.nix
+1
View File
@@ -32,6 +32,7 @@
boot.kexec.enable = lib.mkDefault false;
# Relies on bash scripts
powerManagement.enable = lib.mkDefault false;
users.manageLingering = lib.mkDefault false;
# Relies on the gzip command which depends on bash
services.logrotate.enable = lib.mkDefault false;
+12 -13
View File
@@ -6,7 +6,6 @@
}:
let
cfge = config.environment;
cfg = config.programs.fish;
@@ -27,6 +26,14 @@ let
envInteractiveShellInit = pkgs.writeText "interactiveShellInit" cfge.interactiveShellInit;
indentFishFile =
name: text:
pkgs.runCommand name {
nativeBuildInputs = [ cfg.package ];
inherit text;
passAsFile = [ "text" ];
} "fish_indent < $textPath > $out";
sourceEnv =
file:
if cfg.useBabelfish then
@@ -46,13 +53,9 @@ let
} "babelfish < ${path} > $out;";
in
{
options = {
programs.fish = {
enable = lib.mkOption {
default = false;
description = ''
@@ -153,13 +156,10 @@ in
'';
type = lib.types.lines;
};
};
};
config = lib.mkIf cfg.enable {
programs.fish.shellAliases = lib.mapAttrs (name: lib.mkDefault) cfge.shellAliases;
# Required for man completions
@@ -182,16 +182,16 @@ in
})
{
etc."fish/nixos-env-preinit.fish".text =
etc."fish/nixos-env-preinit.fish".source =
if cfg.useBabelfish then
''
indentFishFile "nixos-env-preinit.fish" ''
# source the NixOS environment config
if [ -z "$__NIXOS_SET_ENVIRONMENT_DONE" ]
source /etc/fish/setEnvironment.fish
end
''
else
''
indentFishFile "nixos-env-preinit.fish" ''
# This happens before $__fish_datadir/config.fish sets fish_function_path, so it is currently
# unset. We set it and then completely erase it, leaving its configuration to $__fish_datadir/config.fish
set fish_function_path ${pkgs.fishPlugins.foreign-env}/share/fish/vendor_functions.d $__fish_datadir/functions
@@ -207,7 +207,7 @@ in
}
{
etc."fish/config.fish".text = ''
etc."fish/config.fish".source = indentFishFile "config.fish" ''
# /etc/fish/config.fish: DO NOT EDIT -- this file has been generated automatically.
# if we haven't sourced the general config, do it
@@ -259,7 +259,6 @@ in
name = "fish_patched-completion-generator";
srcs = [
"${cfg.package}/share/fish/tools/create_manpage_completions.py"
"${cfg.package}/share/fish/tools/deroff.py"
];
unpackCmd = "cp $curSrc $(basename $curSrc)";
sourceRoot = ".";
@@ -6,20 +6,24 @@
}:
let
cfg = config.programs.nekoray;
cfg = config.programs.throne;
in
{
options = {
programs.nekoray = {
enable = lib.mkEnableOption "nekoray, a GUI proxy configuration manager";
imports = [
(lib.mkRenamedOptionModule [ "programs" "nekoray" ] [ "programs" "throne" ])
];
package = lib.mkPackageOption pkgs "nekoray" { };
options = {
programs.throne = {
enable = lib.mkEnableOption "Throne, a GUI proxy configuration manager";
package = lib.mkPackageOption pkgs "throne" { };
tunMode = {
enable = lib.mkEnableOption "TUN mode of nekoray";
enable = lib.mkEnableOption "TUN mode of Throne";
setuid = lib.mkEnableOption ''
setting suid bit for nekobox_core to run as root, which is less
setting suid bit for throne-core to run as root, which is less
secure than default setcap method but closer to upstream assumptions.
Enable this if you find the default setcap method configured in
this module doesn't work for you
@@ -29,10 +33,11 @@ in
};
config = lib.mkIf cfg.enable {
environment.systemPackages = [ cfg.package ];
security.wrappers.nekobox_core = lib.mkIf cfg.tunMode.enable {
source = "${cfg.package}/share/nekoray/nekobox_core";
security.wrappers.throne-core = lib.mkIf cfg.tunMode.enable {
source = "${cfg.package}/share/throne/Core";
owner = "root";
group = "root";
setuid = lib.mkIf cfg.tunMode.setuid true;
@@ -44,7 +49,7 @@ in
# avoid resolvectl password prompt popping up three times
# https://github.com/SagerNet/sing-tun/blob/0686f8c4f210f4e7039c352d42d762252f9d9cf5/tun_linux.go#L1062
# We use a hack here to determine whether the requested process is nekobox_core
# We use a hack here to determine whether the requested process is throne-core
# Detect whether its capabilities contain at least `net_admin` and `net_raw`.
# This does not reduce security, as we can already bypass `resolved` with them.
# Alternatives to consider:
@@ -56,9 +61,9 @@ in
# change its own cmdline. `/proc/<pid>/exe` is reliable but kernel forbids
# checking that entry of process from different users, and polkit runs `spawn`
# as an unprivileged user.
# 3. Put nekobox_core into a systemd service, and let polkit check service name.
# 3. Put throne-core into a systemd service, and let polkit check service name.
# This is the most secure and convenient way but requires heavy modification
# to nekoray source code. Would be good to let upstream support that eventually.
# to Throne source code. Would be good to let upstream support that eventually.
security.polkit.extraConfig =
lib.mkIf (cfg.tunMode.enable && (!cfg.tunMode.setuid) && config.services.resolved.enable)
''
+54 -45
View File
@@ -4,7 +4,7 @@
pkgs,
...
}:
with lib;
let
cfg = config.security.ipa;
@@ -30,17 +30,17 @@ in
{
options = {
security.ipa = {
enable = mkEnableOption "FreeIPA domain integration";
enable = lib.mkEnableOption "FreeIPA domain integration";
certificate = mkOption {
type = types.package;
certificate = lib.mkOption {
type = lib.types.package;
description = ''
IPA server CA certificate.
Use `nix-prefetch-url http://$server/ipa/config/ca.crt` to
obtain the file and the hash.
'';
example = literalExpression ''
example = lib.literalExpression ''
pkgs.fetchurl {
url = "http://ipa.example.com/ipa/config/ca.crt";
hash = lib.fakeHash;
@@ -48,87 +48,93 @@ in
'';
};
domain = mkOption {
type = types.str;
domain = lib.mkOption {
type = lib.types.str;
example = "example.com";
description = "Domain of the IPA server.";
};
realm = mkOption {
type = types.str;
realm = lib.mkOption {
type = lib.types.str;
example = "EXAMPLE.COM";
description = "Kerberos realm.";
};
server = mkOption {
type = types.str;
server = lib.mkOption {
type = lib.types.str;
example = "ipa.example.com";
description = "IPA Server hostname.";
};
basedn = mkOption {
type = types.str;
basedn = lib.mkOption {
type = lib.types.str;
example = "dc=example,dc=com";
description = "Base DN to use when performing LDAP operations.";
};
offlinePasswords = mkOption {
type = types.bool;
offlinePasswords = lib.mkOption {
type = lib.types.bool;
default = true;
description = "Whether to store offline passwords when the server is down.";
};
cacheCredentials = mkOption {
type = types.bool;
cacheCredentials = lib.mkOption {
type = lib.types.bool;
default = true;
description = "Whether to cache credentials.";
};
ipaHostname = mkOption {
type = types.str;
useAsTimeserver = lib.mkOption {
type = lib.types.bool;
default = true;
description = "Whether to add the IPA server to the timeserver.";
};
ipaHostname = lib.mkOption {
type = lib.types.str;
example = "myworkstation.example.com";
default =
if config.networking.domain != null then
config.networking.fqdn
else
"${config.networking.hostName}.${cfg.domain}";
defaultText = literalExpression ''
defaultText = lib.literalExpression ''
if config.networking.domain != null then config.networking.fqdn
else "''${networking.hostName}.''${security.ipa.domain}"
'';
description = "Fully-qualified hostname used to identify this host in the IPA domain.";
};
ifpAllowedUids = mkOption {
type = types.listOf types.str;
ifpAllowedUids = lib.mkOption {
type = lib.types.listOf lib.types.str;
default = [ "root" ];
description = "A list of users allowed to access the ifp dbus interface.";
};
dyndns = {
enable = mkOption {
type = types.bool;
enable = lib.mkOption {
type = lib.types.bool;
default = true;
description = "Whether to enable FreeIPA automatic hostname updates.";
};
interface = mkOption {
type = types.str;
interface = lib.mkOption {
type = lib.types.str;
example = "eth0";
default = "*";
description = "Network interface to perform hostname updates through.";
};
};
chromiumSupport = mkOption {
type = types.bool;
chromiumSupport = lib.mkOption {
type = lib.types.bool;
default = true;
description = "Whether to whitelist the FreeIPA domain in Chromium.";
};
};
};
config = mkIf cfg.enable {
config = lib.mkIf cfg.enable {
assertions = [
{
assertion = !config.security.krb5.enable;
@@ -141,21 +147,24 @@ in
];
environment.systemPackages = with pkgs; [
krb5Full
krb5
freeipa
];
environment.etc = {
"ipa/default.conf".text = ''
[global]
basedn = ${cfg.basedn}
realm = ${cfg.realm}
domain = ${cfg.domain}
server = ${cfg.server}
host = ${config.networking.hostName}
xmlrpc_uri = https://${cfg.server}/ipa/xml
enable_ra = True
'';
"ipa/default.conf".text = lib.generators.toINI { } {
global = {
inherit (cfg)
basedn
realm
domain
server
;
host = cfg.ipaHostname;
xmlrpc_uri = "https://${cfg.server}/ipa/xml";
enable_ra = "True";
};
};
"ipa/nssdb".source = nssDb;
@@ -191,7 +200,7 @@ in
"ldap.conf".source = ldapConf;
"chromium/policies/managed/freeipa.json" = mkIf cfg.chromiumSupport {
"chromium/policies/managed/freeipa.json" = lib.mkIf cfg.chromiumSupport {
text = builtins.toJSON {
AuthServerWhitelist = "*.${cfg.domain}";
};
@@ -248,7 +257,7 @@ in
cache_credentials = cfg.cacheCredentials;
krb5_store_password_if_offline = cfg.offlinePasswords;
krb5_realm = lib.mkIf ((toLower cfg.domain) != (toLower cfg.realm)) cfg.realm;
krb5_realm = lib.mkIf ((lib.toLower cfg.domain) != (lib.toLower cfg.realm)) cfg.realm;
dyndns_update = cfg.dyndns.enable;
dyndns_iface = cfg.dyndns.interface;
@@ -279,13 +288,13 @@ in
ifp = {
user_attributes = "+mail, +telephoneNumber, +givenname, +sn, +lock";
allowed_uids = concatStringsSep ", " cfg.ifpAllowedUids;
allowed_uids = lib.concatStringsSep ", " cfg.ifpAllowedUids;
};
};
};
networking.timeServers = singleton cfg.server;
networking.timeServers = lib.optional cfg.useAsTimeserver cfg.server;
security.pki.certificateFiles = singleton cfg.certificate;
security.pki.certificateFiles = lib.singleton cfg.certificate;
};
}
+2 -1
View File
@@ -126,7 +126,8 @@ in
ReadWritePaths = "";
BindPaths =
optional (cfg.settings ? DataFolder) cfg.settings.DataFolder
++ optional (cfg.settings ? CacheFolder) cfg.settings.CacheFolder;
++ optional (cfg.settings ? CacheFolder) cfg.settings.CacheFolder
++ optional (cfg.settings ? Backup.Path) cfg.settings.Backup.Path;
BindReadOnlyPaths = [
# navidrome uses online services to download additional album metadata / covers
"${config.security.pki.caBundle}:/etc/ssl/certs/ca-certificates.crt"
+62 -13
View File
@@ -89,19 +89,24 @@ let
${cfg.postInit}
fi
''
+ ''
(
set -o pipefail
${lib.optionalString (cfg.dumpCommand != null) ''${lib.escapeShellArg cfg.dumpCommand} | \''}
borgWrapper create "''${extraArgs[@]}" \
--compression ${cfg.compression} \
--exclude-from ${mkExcludeFile cfg} \
--patterns-from ${mkPatternsFile cfg} \
"''${extraCreateArgs[@]}" \
"::$archiveName$archiveSuffix" \
${if cfg.paths == null then "-" else lib.escapeShellArgs cfg.paths}
)
''
+ (
let
import-tar = cfg.createCommand == "import-tar";
in
''
(
set -o pipefail
${lib.optionalString (cfg.dumpCommand != null) ''${lib.escapeShellArg cfg.dumpCommand} | \''}
borgWrapper ${lib.escapeShellArg cfg.createCommand} "''${extraArgs[@]}" \
--compression ${cfg.compression} \
${lib.optionalString (!import-tar) "--exclude-from ${mkExcludeFile cfg}"} \
${lib.optionalString (!import-tar) "--patterns-from ${mkPatternsFile cfg}"} \
"''${extraCreateArgs[@]}" \
"::$archiveName$archiveSuffix" \
${if cfg.paths == null then "-" else lib.escapeShellArgs cfg.paths}
)
''
)
+ lib.optionalString cfg.appendFailedSuffix ''
borgWrapper rename "''${extraArgs[@]}" \
"::$archiveName$archiveSuffix" "$archiveName"
@@ -310,6 +315,23 @@ let
'';
};
mkCreateCommandImportTarDumpCommandAssertion = name: cfg: {
assertion = cfg.createCommand != "import-tar" || cfg.dumpCommand != null;
message = ''
Option borgbackup.jobs.${name}.dumpCommand is required when createCommand
is set to "import-tar".
'';
};
mkCreateCommandImportTarExclusionsAssertion = name: cfg: {
assertion = cfg.createCommand != "import-tar" || (cfg.exclude == [ ] && cfg.patterns == [ ]);
message = ''
Options borgbackup.jobs.${name}.exclude and
borgbackup.jobs.${name}.patterns have no effect when createCommand is set
to "import-tar".
'';
};
mkRemovableDeviceAssertions = name: cfg: {
assertion = !(isLocalPath cfg.repo) -> !cfg.removableDevice;
message = ''
@@ -377,6 +399,25 @@ in
{ name, config, ... }:
{
options = {
createCommand = lib.mkOption {
type = lib.types.enum [
"create"
"import-tar"
];
description = ''
Borg command to use for archive creation. The default (`create`)
creates a regular Borg archive.
Use `import-tar` to instead read a tar archive stream from
{option}`dumpCommand` output and import its contents into the
repository.
`import-tar` can not be used together with {option}`exclude` or
{option}`patterns`.
'';
default = "create";
example = "import-tar";
};
paths = lib.mkOption {
type = with lib.types; nullOr (coercedTo str lib.singleton (listOf str));
@@ -556,6 +597,9 @@ in
description = ''
Exclude paths matching any of the given patterns. See
{command}`borg help patterns` for pattern syntax.
Can not be set when {option}`createCommand` is set to
`import-tar`.
'';
default = [ ];
example = [
@@ -571,6 +615,9 @@ in
matching patterns is used, so if an include pattern (prefix `+`)
matches before an exclude pattern (prefix `-`), the file is
backed up. See [{command}`borg help patterns`](https://borgbackup.readthedocs.io/en/stable/usage/help.html#borg-patterns) for pattern syntax.
Can not be set when {option}`createCommand` is set to
`import-tar`.
'';
default = [ ];
example = [
@@ -888,6 +935,8 @@ in
lib.mapAttrsToList mkPassAssertion jobs
++ lib.mapAttrsToList mkKeysAssertion repos
++ lib.mapAttrsToList mkSourceAssertions jobs
++ lib.mapAttrsToList mkCreateCommandImportTarDumpCommandAssertion jobs
++ lib.mapAttrsToList mkCreateCommandImportTarExclusionsAssertion jobs
++ lib.mapAttrsToList mkRemovableDeviceAssertions jobs;
systemd.tmpfiles.settings = lib.mapAttrs' mkTmpfiles jobs;
+1 -2
View File
@@ -559,8 +559,7 @@ in
];
RestrictNamespaces = true;
LockPersonality = true;
# we need to disable MemoryDenyWriteExecute for keydb
MemoryDenyWriteExecute = cfg.package.pname != "keydb";
MemoryDenyWriteExecute = true;
RestrictRealtime = true;
RestrictSUIDSGID = true;
PrivateMounts = true;
@@ -82,8 +82,19 @@ in
};
default = { };
description = ''
Configuration settings for the generated config
file.
Configuration settings for the generated config file.
This config is combined with the contents of `secretsConfigFile` and
passed to zwave-js-server via `--config`. The project's README [1]
states that the config must follow the Z-Wave JS config format [2].
[1]: https://github.com/zwave-js/zwave-js-server/tree/master
[2]: https://zwave-js.github.io/node-zwave-js/#/api/driver?id=zwaveoptions
::: {.warning}
Secrets should go in `secretsConfigFile`. The contents of `settings` is
written to the nix store, which is world-readable.
:::
'';
};
+1 -1
View File
@@ -972,7 +972,7 @@ in
${lib.concatStringsSep "\n" (
lib.mapAttrsToList (to: from: ''
ln -sf ${from} /var/lib/postfix/conf/${to}
${lib.getExe' cfg.package "postmap"} -o -p /var/lib/postfix/conf/${to}
${lib.getExe' cfg.package "postmap"} /var/lib/postfix/conf/${to}
'') cfg.mapFiles
)}
+6 -9
View File
@@ -11,6 +11,9 @@ let
format = pkgs.formats.yaml { };
stateDir = "/var/lib/recyclarr";
configPath = "${stateDir}/config.json";
secretsReplacement = utils.genJqSecretsReplacement {
loadCredential = true;
} cfg.configuration configPath;
in
{
options.services.recyclarr = {
@@ -47,14 +50,7 @@ in
For detailed configuration options and examples, see the
[official configuration reference](https://recyclarr.dev/wiki/yaml/config-reference/).
The configuration is processed using [utils.genJqSecretsReplacementSnippet](https://github.com/NixOS/nixpkgs/blob/master/nixos/lib/utils.nix#L232-L331) to handle secret substitution.
To avoid permission issues, secrets should be provided via systemd's credential mechanism:
```nix
systemd.services.recyclarr.serviceConfig.LoadCredential = [
"radarr-api_key:''${config.sops.secrets.radarr-api_key.path}"
];
The configuration is processed using [utils.genJqSecretsReplacement](https://github.com/NixOS/nixpkgs/blob/master/nixos/lib/utils.nix#L232-L331) to handle secret substitution.
```
'';
};
@@ -103,7 +99,7 @@ in
description = "Recyclarr Service";
# YAML is a JSON super-set
preStart = utils.genJqSecretsReplacementSnippet cfg.configuration configPath;
preStart = secretsReplacement.script;
serviceConfig = {
Type = "oneshot";
@@ -111,6 +107,7 @@ in
Group = cfg.group;
StateDirectory = "recyclarr";
ExecStart = "${lib.getExe cfg.package} ${cfg.command} --app-data ${stateDir} --config ${configPath}";
LoadCredential = secretsReplacement.credentials;
ProtectSystem = "strict";
ProtectHome = true;
@@ -127,6 +127,7 @@ let
"storagebox"
"surfboard"
"systemd"
"tailscale"
"tibber"
"unbound"
"unpoller"
@@ -0,0 +1,47 @@
{
config,
lib,
pkgs,
utils,
...
}:
let
inherit (lib)
getExe
mkOption
mkPackageOption
types
;
inherit (utils) escapeSystemdExecArgs;
cfg = config.services.prometheus.exporters.tailscale;
in
{
port = 9250;
extraOpts = with types; {
package = mkPackageOption pkgs "prometheus-tailscale-exporter" { };
environmentFile = mkOption {
type = path;
description = ''
Environment file containg at least the TAILSCALE_TAILNET,
TAILSCALE_OAUTH_CLIENT_ID, and TAILSCALE_OAUTH_CLIENT_SECRET
environment variables.
'';
};
};
serviceOpts = {
serviceConfig = {
EnvironmentFile = cfg.environmentFile;
ExecStart = escapeSystemdExecArgs (
[
(getExe cfg.package)
"--listen-address"
"${cfg.listenAddress}:${toString cfg.port}"
]
++ cfg.extraFlags
);
};
};
}
+3 -10
View File
@@ -35,8 +35,7 @@ let
user = "sa";
};
logger.console = "true";
media.path = "${stateDirectory}/media";
templates.root = "${stateDirectory}/templates";
web.override = "${stateDirectory}/override";
};
in
@@ -95,11 +94,9 @@ in
wants = [ "network-online.target" ];
preStart = ''
# Copy new templates into our state directory.
cp -a --update=none ${pkgs.traccar}/templates ${stateDirectory}
test -f '${configFilePath}' && rm -f '${configFilePath}'
# Substitute the configFile from Envvars read from EnvironmentFile
# Perform envvars substition read from environmentFile
old_umask=$(umask)
umask 0177
${lib.getExe pkgs.envsubst} \
@@ -110,6 +107,7 @@ in
serviceConfig = {
DynamicUser = true;
WorkingDirectory = "${pkgs.traccar}";
EnvironmentFile = lib.mkIf (cfg.environmentFile != null) cfg.environmentFile;
ExecStart = "${lib.getExe pkgs.traccar} ${configFilePath}";
LockPersonality = true;
@@ -132,11 +130,6 @@ in
StateDirectory = "traccar";
SuccessExitStatus = 143;
Type = "simple";
# Set the working directory to traccar's package.
# Traccar only searches for the DB migrations relative to it's WorkingDirectory and nothing worked to
# work around this. To avoid copying the migrations over to the state directory, we use the package as
# WorkingDirectory.
WorkingDirectory = "${pkgs.traccar}";
};
};
};
@@ -223,6 +223,23 @@ in
};
};
edgeIPVersion = lib.mkOption {
type = lib.types.enum [
"auto"
"4"
"6"
];
default = "4";
description = ''
Specifies the IP address version (IPv4 or IPv6) used to establish a connection between `cloudflared` and the Cloudflare global network.
The value `auto` relies on the host operating system to determine which IP version to select. The first IP version returned from the DNS resolution of the region lookup will be used as the primary set. In dual IPv6 and IPv4 network setups, `cloudflared` will separate the IP versions into two address sets that will be used to fallback in connectivity failure scenarios.
See [Tunnel run parameters](https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/configure-tunnels/cloudflared-parameters/run-parameters/#edge-ip-version).
'';
example = "auto";
};
default = lib.mkOption {
type = lib.types.str;
description = ''
@@ -377,7 +394,10 @@ in
DynamicUser = true;
};
environment.TUNNEL_ORIGIN_CERT = lib.mkIf (certFile != null) ''%d/cert.pem'';
environment = {
TUNNEL_ORIGIN_CERT = lib.mkIf (certFile != null) ''%d/cert.pem'';
TUNNEL_EDGE_IP_VERSION = tunnel.edgeIPVersion;
};
}
) config.services.cloudflared.tunnels;
};
@@ -0,0 +1,77 @@
{
config,
pkgs,
lib,
...
}:
let
inherit (lib) types;
cfg = config.services.nebula-lighthouse-service;
settingsFormat = pkgs.formats.yaml { };
in
{
options.services.nebula-lighthouse-service = {
enable = lib.mkEnableOption "nebula-lighthouse-service";
user = lib.mkOption {
type = types.str;
default = "nebula-lighthouse";
description = ''
The user and group to run nebula-lighthouse-service as.
'';
example = "nebula-lighthouse";
};
settings = lib.mkOption {
type = settingsFormat.type;
default = { };
description = ''
Configuration for nebula-lighthouse-service.
'';
example = {
max-port = 65535;
min-port = 49152;
"webserver.ip" = "127.0.0.1";
"webserver.port" = 8080;
};
};
};
config = lib.mkIf cfg.enable {
services.nebula-lighthouse-service.settings = {
min-port = lib.mkDefault 49152;
max-port = lib.mkDefault 65535;
"webserver.port" = lib.mkDefault 8080;
"webserver.ip" = lib.mkDefault "127.0.0.1";
};
environment.etc."nebula-lighthouse-service/config.yaml".source =
settingsFormat.generate "nebula-lighthouse-service-config.yaml" cfg.settings;
systemd.services.nebula-lighthouse-service = {
description = "Run nebula-lighthouse-service";
wants = [ "basic.target" ];
after = [
"basic.target"
"network.target"
];
wantedBy = [ "multi-user.target" ];
serviceConfig = {
Type = "exec";
Restart = "always";
ExecStart = "${pkgs.nebula-lighthouse-service}/bin/nebula-lighthouse-service";
StateDirectory = "nebula-lighthouse-service";
User = cfg.user;
Group = cfg.user;
};
};
users.users.${cfg.user} = {
group = cfg.user;
description = "nebula-lighthouse-service user";
isSystemUser = true;
};
users.groups.${cfg.user} = { };
};
meta.maintainers = with lib.maintainers; [
bloominstrong
];
}
+81 -41
View File
@@ -9,8 +9,54 @@ let
cfg = config.services.nebula;
enabledNetworks = lib.filterAttrs (n: v: v.enable) cfg.networks;
genSettings =
netName: netCfg:
lib.recursiveUpdate {
pki = {
ca = netCfg.ca;
cert = netCfg.cert;
key = netCfg.key;
};
static_host_map = netCfg.staticHostMap;
lighthouse = {
am_lighthouse = netCfg.isLighthouse;
hosts = netCfg.lighthouses;
serve_dns = netCfg.lighthouse.dns.enable;
dns.host = netCfg.lighthouse.dns.host;
dns.port = netCfg.lighthouse.dns.port;
};
relay = {
am_relay = netCfg.isRelay;
relays = netCfg.relays;
use_relays = true;
};
listen = {
host = netCfg.listen.host;
port = resolveFinalPort netCfg;
};
tun = {
disabled = netCfg.tun.disable;
dev = if (netCfg.tun.device != null) then netCfg.tun.device else "nebula.${netName}";
};
firewall = {
inbound = netCfg.firewall.inbound;
outbound = netCfg.firewall.outbound;
};
} netCfg.settings;
format = pkgs.formats.yaml { };
genConfigFile =
netName: settings:
format.generate "nebula-config-${netName}.yml" (
lib.warnIf
((settings.lighthouse.am_lighthouse || settings.relay.am_relay) && settings.listen.port == 0)
''
Nebula network '${netName}' is configured as a lighthouse or relay, and its port is ${builtins.toString settings.listen.port}.
You will likely experience connectivity issues: https://nebula.defined.net/docs/config/listen/#listenport
''
settings
);
nameToId = netName: "nebula-${netName}";
resolveFinalPort =
@@ -60,6 +106,16 @@ in
example = "/etc/nebula/host.key";
};
enableReload = lib.mkOption {
type = lib.types.bool;
default = false;
description = ''
Enable automatic config reload on config change.
This setting is not enabled by default as nix cannot determine if the config change is reloadable.
Please refer to the [config reference](https://nebula.defined.net/docs/config/) for documentation on reloadable changes.
'';
};
staticHostMap = lib.mkOption {
type = lib.types.attrsOf (lib.types.listOf (lib.types.str));
default = { };
@@ -212,47 +268,13 @@ in
netName: netCfg:
let
networkId = nameToId netName;
settings = lib.recursiveUpdate {
pki = {
ca = netCfg.ca;
cert = netCfg.cert;
key = netCfg.key;
};
static_host_map = netCfg.staticHostMap;
lighthouse = {
am_lighthouse = netCfg.isLighthouse;
hosts = netCfg.lighthouses;
serve_dns = netCfg.lighthouse.dns.enable;
dns.host = netCfg.lighthouse.dns.host;
dns.port = netCfg.lighthouse.dns.port;
};
relay = {
am_relay = netCfg.isRelay;
relays = netCfg.relays;
use_relays = true;
};
listen = {
host = netCfg.listen.host;
port = resolveFinalPort netCfg;
};
tun = {
disabled = netCfg.tun.disable;
dev = if (netCfg.tun.device != null) then netCfg.tun.device else "nebula.${netName}";
};
firewall = {
inbound = netCfg.firewall.inbound;
outbound = netCfg.firewall.outbound;
};
} netCfg.settings;
configFile = format.generate "nebula-config-${netName}.yml" (
lib.warnIf
((settings.lighthouse.am_lighthouse || settings.relay.am_relay) && settings.listen.port == 0)
''
Nebula network '${netName}' is configured as a lighthouse or relay, and its port is ${builtins.toString settings.listen.port}.
You will likely experience connectivity issues: https://nebula.defined.net/docs/config/listen/#listenport
''
settings
);
settings = genSettings netName netCfg;
generatedConfigFile = genConfigFile netName settings;
configFile =
if ((lib.versionAtLeast config.system.stateVersion "25.11") || netCfg.enableReload) then
"/etc/nebula/${netName}.yml"
else
generatedConfigFile;
capabilities =
let
nebulaPort = if !settings.tun.disabled then settings.listen.port else 0;
@@ -278,6 +300,8 @@ in
];
before = [ "sshd.service" ];
wantedBy = [ "multi-user.target" ];
restartTriggers = lib.optional (!netCfg.enableReload) generatedConfigFile;
reloadTriggers = lib.optional netCfg.enableReload generatedConfigFile;
serviceConfig = {
Type = "notify";
Restart = "always";
@@ -313,6 +337,22 @@ in
) enabledNetworks
);
environment.etc = lib.mkMerge (
lib.mapAttrsToList
(netName: netCfg: {
"nebula/${netName}.yml" = {
source = genConfigFile netName (genSettings netName netCfg);
mode = "0440";
user = nameToId netName;
};
})
(
lib.filterAttrs (
_: netCfg: netCfg.enableReload || (lib.versionAtLeast config.system.stateVersion "25.11")
) enabledNetworks
)
);
# Open the chosen ports for UDP.
networking.firewall.allowedUDPPorts = lib.unique (
lib.filter (port: port > 0) (
@@ -213,7 +213,7 @@ in
if [[ "$state" != "$lastState" ]]; then
# https://github.com/tailscale/tailscale/blob/v1.72.1/ipn/backend.go#L24-L32
case "$state" in
NeedsLogin)
NeedsLogin|NeedsMachineAuth|Stopped)
echo "Server needs authentication, sending auth key"
tailscale up --auth-key "$(cat ${cfg.authKeyFile})${params}" ${escapeShellArgs cfg.extraUpFlags}
;;
@@ -226,8 +226,8 @@ in
echo "Waiting for Tailscale State = Running or systemd timeout"
;;
esac
echo "State = $state"
fi
echo "State = $state"
lastState="$state"
sleep .5
done
@@ -235,7 +235,10 @@ in
};
systemd.services.tailscaled-set = mkIf (cfg.extraSetFlags != [ ]) {
after = [ "tailscaled.service" ];
after = [
"tailscaled.service"
"tailscaled-autoconnect.service"
];
wants = [ "tailscaled.service" ];
wantedBy = [ "multi-user.target" ];
serviceConfig = {
@@ -29,6 +29,13 @@ let
escapeCredentialName = input: replaceStrings [ "\\" ] [ "_" ] input;
fwMarkFromHexOrNum =
fwMark:
if (lib.hasPrefix "0x" fwMark) then
lib.fromHexString fwMark
else
(builtins.fromTOML "v=${fwMark}").v;
privateKeyCredential = interfaceName: escapeCredentialName "wireguard-${interfaceName}-private-key";
presharedKeyCredential =
interfaceName: peer: escapeCredentialName "wireguard-${interfaceName}-${peer.name}-preshared-key";
@@ -52,7 +59,7 @@ let
wireguardConfig = removeNulls {
PrivateKey = "@${privateKeyCredential name}";
ListenPort = interface.listenPort;
FirewallMark = interface.fwMark;
FirewallMark = if interface.fwMark == null then null else (fwMarkFromHexOrNum interface.fwMark);
RouteTable = if interface.allowedIPsAsRoutes then interface.table else null;
RouteMetric = interface.metric;
};
+71 -1
View File
@@ -65,6 +65,34 @@ in
'';
};
};
clamonacc = {
enable = lib.mkOption {
default = false;
example = true;
description = ''
Whether to enable ClamAV on-access scanner.
The settings for ClamAV's on-access scanner is configured in `clamd.conf` via `services.clamav.daemon.settings`.
Refer to <https://docs.clamav.net/manual/OnAccess.html> on how to configure it.
Example to scan `/home/foo/Downloads` (and block access until scanning is completed) would be:
```
services.clamav = {
daemon.enable = true;
clamonacc.enable = true;
daemon.settings = {
OnAccessPrevention = true;
OnAccessIncludePath = "/home/foo/Downloads";
};
};
```
'';
type = lib.types.bool;
};
};
updater = {
enable = lib.mkEnableOption "ClamAV freshclam updater";
@@ -172,6 +200,17 @@ in
};
config = lib.mkIf (cfg.updater.enable || cfg.daemon.enable) {
assertions = [
{
assertion = cfg.scanner.enable -> cfg.daemon.enable;
message = "ClamAV scanner requires ClamAV daemon to operate";
}
{
assertion = cfg.clamonacc.enable -> cfg.daemon.enable;
message = "ClamAV on-access scanner requires ClamAV daemon to operate";
}
];
environment.systemPackages = [ cfg.package ];
users.users.${clamavUser} = {
@@ -189,8 +228,10 @@ in
DatabaseDirectory = stateDir;
LocalSocket = "/run/clamav/clamd.ctl";
PidFile = "/run/clamav/clamd.pid";
User = "clamav";
User = clamavUser;
Foreground = true;
# Prevent infinite recursion in scanning
OnAccessExcludeUname = clamavUser;
};
services.clamav.updater.settings = {
@@ -216,11 +257,26 @@ in
description = "ClamAV Antivirus Slice";
};
systemd.sockets.clamav-daemon = lib.mkIf cfg.daemon.enable {
description = "Socket for ClamAV daemon (clamd)";
wantedBy = [ "sockets.target" ];
listenStreams = [
cfg.daemon.settings.LocalSocket
];
socketConfig = {
SocketUser = clamavUser;
SocketGroup = clamavGroup;
# LocalSocketMode setting in clamd.conf is not prefixed with octal 0, add it here.
SocketMode = "0${cfg.daemon.settings.LocalSocketMode or "666"}";
};
};
systemd.services.clamav-daemon = lib.mkIf cfg.daemon.enable {
description = "ClamAV daemon (clamd)";
documentation = [ "man:clamd(8)" ];
after = lib.optionals cfg.updater.enable [ "clamav-freshclam.service" ];
wants = lib.optionals cfg.updater.enable [ "clamav-freshclam.service" ];
requires = [ "clamav-daemon.socket" ];
wantedBy = [ "multi-user.target" ];
restartTriggers = [ clamdConfigFile ];
@@ -238,6 +294,20 @@ in
};
};
systemd.services.clamav-clamonacc = lib.mkIf cfg.clamonacc.enable {
description = "ClamAV on-access scanner (clamonacc)";
after = [ "clamav-daemon.socket" ];
requires = [ "clamav-daemon.socket" ];
wantedBy = [ "multi-user.target" ];
restartTriggers = [ clamdConfigFile ];
# This unit must start as root to be able to use fanotify.
serviceConfig = {
ExecStart = "${cfg.package}/bin/clamonacc -F --fdpass";
Slice = "system-clamav.slice";
};
};
systemd.timers.clamav-freshclam = lib.mkIf cfg.updater.enable {
description = "Timer for ClamAV virus database updater (freshclam)";
wantedBy = [ "timers.target" ];
+9 -16
View File
@@ -8,7 +8,10 @@
let
cfg = config.services.nginx.sso;
format = pkgs.formats.yaml { };
configPath = "/var/lib/nginx-sso/config.yaml";
configPath = "/run/nginx-sso/config.yaml";
secretsReplacement = utils.genJqSecretsReplacement {
loadCredential = true;
} cfg.configuration configPath;
in
{
options.services.nginx.sso = {
@@ -47,7 +50,7 @@ in
Options containing secret data should be set to an attribute set
with the singleton attribute `_secret` - a string value set to the path
to the file containing the secret value which should be used in the
configuration. This file must be readable by `nginx-sso`.
configuration.
'';
};
};
@@ -57,30 +60,20 @@ in
description = "Nginx SSO Backend";
after = [ "network.target" ];
wantedBy = [ "multi-user.target" ];
preStart = secretsReplacement.script;
serviceConfig = {
StateDirectory = "nginx-sso";
WorkingDirectory = "/var/lib/nginx-sso";
ExecStartPre = pkgs.writeShellScript "merge-nginx-sso-config" ''
rm -f '${configPath}'
# Relies on YAML being a superset of JSON
${utils.genJqSecretsReplacementSnippet cfg.configuration configPath}
'';
RuntimeDirectory = "nginx-sso";
ExecStart = ''
${lib.getExe cfg.package} \
--config ${configPath} \
--frontend-dir ${lib.getBin cfg.package}/share/frontend
'';
LoadCredential = secretsReplacement.credentials;
Restart = "always";
User = "nginx-sso";
Group = "nginx-sso";
DynamicUser = true;
};
};
users.users.nginx-sso = {
isSystemUser = true;
group = "nginx-sso";
};
users.groups.nginx-sso = { };
};
}
+9 -3
View File
@@ -456,6 +456,8 @@ in
package = lib.mkPackageOption pkgs "tor" { };
obfs4Package = lib.mkPackageOption pkgs "obfs4" { };
enableGeoIP =
lib.mkEnableOption ''
use of GeoIP databases.
@@ -1055,7 +1057,11 @@ in
options.MaxClientCircuitsPending = optionInt "MaxClientCircuitsPending";
options.NATDPort = optionIsolablePorts "NATDPort";
options.NewCircuitPeriod = optionInt "NewCircuitPeriod";
options.Nickname = optionString "Nickname";
options.Nickname = lib.mkOption {
type = with lib.types; nullOr (strMatching "^[a-zA-Z0-9]{1,19}$");
default = null;
description = (descriptionGeneric "Nickname");
};
options.ORPort = optionORPort "ORPort";
options.OfflineMasterKey = optionBool "OfflineMasterKey";
options.OptimisticData = optionBool "OptimisticData"; # default is null and like "auto"
@@ -1249,7 +1255,7 @@ in
BridgeRelay = true;
ExtORPort.port = lib.mkDefault "auto";
ServerTransportPlugin.transports = lib.mkDefault [ "obfs4" ];
ServerTransportPlugin.exec = lib.mkDefault "${lib.getExe pkgs.obfs4} managed";
ServerTransportPlugin.exec = lib.mkDefault "${lib.getExe cfg.obfs4Package} managed";
}
// lib.optionalAttrs (cfg.relay.role == "private-bridge") {
ExtraInfoStatistics = false;
@@ -1322,7 +1328,7 @@ in
systemd.services.tor = {
description = "Tor Daemon";
documentation = [ "man:tor(8)" ];
path = [ pkgs.tor ];
path = [ cfg.package ];
wantedBy = [ "multi-user.target" ];
after = [ "network.target" ];
@@ -73,7 +73,7 @@ in
PDS_BLOB_UPLOAD_LIMIT = mkOption {
type = types.str;
default = "52428800";
default = "104857600";
description = "Size limit of uploaded blobs in bytes";
};
+1 -1
View File
@@ -446,7 +446,7 @@ in
wantedBy = [ "multi-user.target" ];
inherit (cfg.machine-learning) environment;
serviceConfig = commonServiceConfig // {
ExecStart = lib.getExe (cfg.package.machine-learning.override { immich = cfg.package; });
ExecStart = lib.getExe cfg.package.machine-learning;
Slice = "system-immich.slice";
CacheDirectory = "immich";
User = cfg.user;
@@ -550,6 +550,7 @@ in
"pm.min_spare_servers" = "6";
"pm.max_spare_servers" = "18";
"pm.max_requests" = "500";
"pm.status_path" = "/status";
};
description = ''
Options for nextcloud's PHP pool. See the documentation on `php-fpm.conf` for details on
+31 -1
View File
@@ -7,6 +7,10 @@
let
cfg = config.services.onlyoffice;
defaultNginxNonceFileContent = "set $secure_link_secret \"mynonce\";";
defaultNginxNonceFile = pkgs.writeText "onlyoffice-nonce-nginx.conf" ''
${defaultNginxNonceFileContent}
'';
in
{
options.services.onlyoffice = {
@@ -20,6 +24,22 @@ in
description = "FQDN for the OnlyOffice instance.";
};
securityNonceFile = lib.mkOption {
type = lib.types.str;
default = "${defaultNginxNonceFile}";
defaultText = lib.literalExpression ''
(pkgs.writeText "onlyoffice-nonce-nginx.conf" \'\'
${defaultNginxNonceFileContent}
\'\').outPath;
'';
description = ''
Path to a file that contains a secret to sign web requests.
This file should set a 'secure_link_secret' nginx variable,
and ideally be managed by a
[secret managing scheme](https://wiki.nixos.org/wiki/Comparison_of_secret_managing_schemes).
'';
};
jwtSecretFile = lib.mkOption {
type = lib.types.nullOr lib.types.str;
default = null;
@@ -83,6 +103,12 @@ in
};
config = lib.mkIf cfg.enable {
warnings = [
(lib.optionalString (cfg.securityNonceFile == "${defaultNginxNonceFile}") ''
Please set `options.services.onlyoffice.securityNonceFile`
to avoid an (albeit unlikely) information disclosure issue.
'')
];
services = {
nginx = {
enable = lib.mkDefault true;
@@ -147,7 +173,7 @@ in
alias /var/lib/onlyoffice/documentserver/App_Data$1;
more_set_headers "Content-Disposition: attachment; filename*=UTF-8''$arg_filename";
set $secure_link_secret verysecretstring;
include ${cfg.securityNonceFile};
secure_link $arg_md5,$arg_expires;
secure_link_md5 "$secure_link_expires$uri$secure_link_secret";
@@ -279,7 +305,9 @@ in
# for a mapping of environment variables from the docker container to json options see
# https://github.com/ONLYOFFICE/Docker-DocumentServer/blob/master/run-document-server.sh
FS_SECRET_STRING=$(cut -d '"' -f 2 < ${cfg.securityNonceFile})
jq '
.storage.fs.secretString = "'$FS_SECRET_STRING'" |
.services.CoAuthoring.server.port = ${toString cfg.port} |
.services.CoAuthoring.sql.dbHost = "${cfg.postgresHost}" |
.services.CoAuthoring.sql.dbName = "${cfg.postgresName}" |
@@ -343,4 +371,6 @@ in
users.groups.onlyoffice = { };
};
meta.maintainers = with lib.maintainers; [ raboof ];
}
@@ -41,6 +41,16 @@ in
'';
};
environmentFile = mkOption {
type = types.nullOr types.path;
default = null;
example = "/secrets/trilium.env";
description = ''
File to load as the environment file. This allows you to pass secrets in without writing
to the nix store.
'';
};
instanceName = mkOption {
type = types.str;
default = "Trilium";
@@ -126,6 +136,7 @@ in
environment.TRILIUM_DATA_DIR = cfg.dataDir;
serviceConfig = {
ExecStart = lib.getExe cfg.package;
EnvironmentFile = cfg.environmentFile;
User = "trilium";
Group = "trilium";
PrivateTmp = "true";
+7 -28
View File
@@ -36,7 +36,6 @@ in
apply =
pkg:
pkg.override {
databaseType = cfg.settings.DATABASE_TYPE;
collectApiEndpoint = optionalString (
cfg.settings.COLLECT_API_ENDPOINT != null
) cfg.settings.COLLECT_API_ENDPOINT;
@@ -95,10 +94,7 @@ in
type = types.nullOr (
types.str
// {
check =
it:
isString it
&& ((hasPrefix "postgresql://" it) || (hasPrefix "postgres://" it) || (hasPrefix "mysql://" it));
check = it: isString it && ((hasPrefix "postgresql://" it) || (hasPrefix "postgres://" it));
}
);
# For some reason, Prisma requires the username in the connection string
@@ -111,8 +107,7 @@ in
defaultText = literalExpression ''if config.services.umami.createPostgresqlDatabase then "postgresql://umami@localhost/umami?host=/run/postgresql" else null'';
example = "postgresql://root:root@localhost/umami";
description = ''
Connection string for the database. Must start with `postgresql://`, `postgres://`
or `mysql://`.
Connection string for the database. Must start with `postgresql://` or `postgres://`.
'';
};
DATABASE_URL_FILE = mkOption {
@@ -128,31 +123,11 @@ in
example = "/run/secrets/umamiDatabaseUrl";
description = ''
A file containing a connection string for the database. The connection string
must start with `postgresql://`, `postgres://` or `mysql://`.
If using this, then DATABASE_TYPE must be set to the appropriate value.
must start with `postgresql://` or `postgres://`.
The contents of the file are read through systemd credentials, therefore the
user running umami does not need permissions to read the file.
'';
};
DATABASE_TYPE = mkOption {
type = types.nullOr (
types.enum [
"postgresql"
"mysql"
]
);
default =
if cfg.settings.DATABASE_URL != null && hasPrefix "mysql://" cfg.settings.DATABASE_URL then
"mysql"
else
"postgresql";
defaultText = literalExpression ''if config.services.umami.settings.DATABASE_URL != null && hasPrefix "mysql://" config.services.umami.settings.DATABASE_URL then "mysql" else "postgresql"'';
example = "mysql";
description = ''
The type of database to use. This is automatically inferred from DATABASE_URL, but
must be set manually if you are using DATABASE_URL_FILE.
'';
};
COLLECT_API_ENDPOINT = mkOption {
type = types.nullOr types.str;
default = null;
@@ -239,6 +214,10 @@ in
-> cfg.settings.DATABASE_URL == "postgresql://umami@localhost/umami?host=/run/postgresql";
message = "The option config.services.umami.createPostgresqlDatabase is enabled, but config.services.umami.settings.DATABASE_URL has been modified.";
}
{
assertion = cfg.settings.DATABASE_TYPE or null != "mysql";
message = "Umami only supports PostgreSQL as of 3.0.0. Follow migration instructions if you are using MySQL: https://umami.is/docs/guides/migrate-mysql-postgresql";
}
];
services.postgresql = mkIf cfg.createPostgresqlDatabase {
@@ -1089,7 +1089,7 @@ in
example = "1:2:2";
description = ''
The levels parameter defines structure of subdirectories in cache: from
1 to 3, each level accepts values 1 or 2. Сan be used any combination of
1 to 3, each level accepts values 1 or 2. Can be used any combination of
1 and 2 in these formats: x, x:x and x:x:x.
'';
};
@@ -211,6 +211,7 @@ in
mint-x-icons
mint-y-icons
xapp # provides some xapp-* icons
xapp-symbolic-icons
] config.environment.cinnamon.excludePackages
);
+2 -12
View File
@@ -53,8 +53,6 @@ let
${config.boot.bootspec.writer}
${optionalString config.boot.bootspec.enableValidation ''${config.boot.bootspec.validator} "$out/${config.boot.bootspec.filename}"''}
''}
${config.system.extraSystemBuilderCmds}
'';
# Putting it all together. This builds a store path containing
@@ -129,6 +127,7 @@ in
[ "system" "replaceRuntimeDependencies" ]
[ "system" "replaceDependencies" "replacements" ]
)
(mkRenamedOptionModule [ "system" "extraSystemBuilderCmds" ] [ "system" "systemBuilderCommands" ])
];
options = {
@@ -213,15 +212,6 @@ in
'';
};
system.extraSystemBuilderCmds = mkOption {
type = types.lines;
internal = true;
default = "";
description = ''
This code will be added to the builder creating the system store path.
'';
};
system.extraDependencies = mkOption {
type = types.listOf types.pathInStore;
default = [ ];
@@ -343,7 +333,7 @@ in
}
];
system.extraSystemBuilderCmds =
system.systemBuilderCommands =
optionalString config.system.copySystemConfiguration ''
ln -s '${import ../../../lib/from-env.nix "NIXOS_CONFIG" <nixos-config>}' \
"$out/configuration.nix"
@@ -26,8 +26,9 @@
services.openssh.enable = lib.mkDefault true;
services.openssh.startWhenNeeded = lib.mkDefault true;
# As this is intended as a standalone image, undo some of the minimal profile stuff
documentation.enable = lib.mkDefault true;
documentation.nixos.enable = lib.mkDefault true;
# friendlier defaults than minimal profile provides
# but we can't use mkDefault since minimal uses it
documentation.enable = lib.mkOverride 890 true;
documentation.nixos.enable = lib.mkOverride 890 true;
services.logrotate.enable = true;
}
-1
View File
@@ -100,7 +100,6 @@ rec {
(onFullSupported "nixos.tests.fontconfig-default-fonts")
(onFullSupported "nixos.tests.gitlab")
(onFullSupported "nixos.tests.gnome")
(onFullSupported "nixos.tests.gnome-xorg")
(onSystems [ "x86_64-linux" ] "nixos.tests.hibernate")
(onFullSupported "nixos.tests.i3wm")
(onSystems [ "aarch64-linux" ] "nixos.tests.installer.simpleUefiSystemdBoot")
+7 -3
View File
@@ -359,6 +359,7 @@ in
cinnamon = runTest ./cinnamon.nix;
cinnamon-wayland = runTest ./cinnamon-wayland.nix;
cjdns = runTest ./cjdns.nix;
clamav = runTest ./clamav.nix;
clatd = runTest ./clatd.nix;
clickhouse = import ./clickhouse {
inherit runTest;
@@ -642,7 +643,6 @@ in
gnome = runTest ./gnome.nix;
gnome-extensions = runTest ./gnome-extensions.nix;
gnome-flashback = runTest ./gnome-flashback.nix;
gnome-xorg = runTest ./gnome-xorg.nix;
gns3-server = runTest ./gns3-server.nix;
gnupg = runTest ./gnupg.nix;
go-camo = runTest ./go-camo.nix;
@@ -889,7 +889,7 @@ in
lorri = handleTest ./lorri/default.nix { };
luks = runTest ./luks.nix;
lvm2 = handleTest ./lvm2 { };
lxc = handleTest ./lxc { };
lxc = runTestOn [ "x86_64-linux" "aarch64-linux" ] ./lxc;
lxd-image-server = runTest ./lxd-image-server.nix;
lxqt = runTest ./lxqt.nix;
ly = runTest ./ly.nix;
@@ -1011,7 +1011,9 @@ in
defaults.services.ncps.cache.dataPath = "/path/to/ncps";
};
ndppd = runTest ./ndppd.nix;
nebula = runTest ./nebula.nix;
nebula-lighthouse-service = runTest ./nebula-lighthouse-service.nix;
nebula.connectivity = runTest ./nebula/connectivity.nix;
nebula.reload = runTest ./nebula/reload.nix;
neo4j = runTest ./neo4j.nix;
netbird = runTest ./netbird.nix;
netbox-upgrade = runTest ./web-apps/netbox-upgrade.nix;
@@ -1520,6 +1522,7 @@ in
systemd-sysusers-password-option-override-ordering = runTest ./systemd-sysusers-password-option-override-ordering.nix;
systemd-timesyncd-nscd-dnssec = runTest ./systemd-timesyncd-nscd-dnssec.nix;
systemd-user-linger = runTest ./systemd-user-linger.nix;
systemd-user-linger-purge = runTest ./systemd-user-linger-purge.nix;
systemd-user-tmpfiles-rules = runTest ./systemd-user-tmpfiles-rules.nix;
systemd-userdbd = runTest ./systemd-userdbd.nix;
systemtap = handleTest ./systemtap.nix { };
@@ -1555,6 +1558,7 @@ in
tor = runTest ./tor.nix;
tpm-ek = handleTest ./tpm-ek { };
tpm2 = runTest ./tpm2.nix;
traccar = runTest ./traccar.nix;
# tracee requires bpf
tracee = handleTestOn [ "x86_64-linux" ] ./tracee.nix { };
traefik = runTestOn [ "aarch64-linux" "x86_64-linux" ] ./traefik.nix;
+29 -1
View File
@@ -9,6 +9,7 @@ let
keepFile = "important_file";
keepFileData = "important_data";
localRepo = "/root/back:up";
localTarRepo = "/root/backup-tar";
# a repository on a file system which is not mounted automatically
localRepoMount = "/noAutoMount";
archiveName = "my_archive";
@@ -47,7 +48,7 @@ in
nodes = {
client =
{ ... }:
{ lib, pkgs, ... }:
{
virtualisation.fileSystems.${localRepoMount} = {
device = "tmpfs";
@@ -93,6 +94,20 @@ in
startAt = [ ];
};
localTar = {
dumpCommand = pkgs.writeScript "createTarArchive" ''
${lib.getExe pkgs.gnutar} cf - ${dataDir}
'';
createCommand = "import-tar";
repo = localTarRepo;
# Make sure in import-tar mode encryption flags are still respected.
encryption = {
mode = "repokey";
inherit passphrase;
};
startAt = [ ]; # Do not run automatically
};
remote = {
paths = dataDir;
repo = remoteRepo;
@@ -231,6 +246,19 @@ in
# Make sure disabling wrapper works
client.fail("command -v borg-job-localMount")
with subtest("localTar"):
borg = "BORG_PASSPHRASE='${passphrase}' borg"
client.systemctl("start --wait borgbackup-job-localTar")
client.fail("systemctl is-failed borgbackup-job-localTar")
archiveName, = client.succeed("{} list --format '{{archive}}{{NL}}' '${localTarRepo}'".format(borg)).strip().split("\n")
# Since excludes are not supported by import-tar, we expect to find exclude file, too
client.succeed(
"{} list '${localTarRepo}::{}' | grep -qF '${excludeFile}'".format(borg, archiveName)
)
# Make sure keepFile has the correct content
client.succeed("{} extract '${localTarRepo}::{}'".format(borg, archiveName))
assert "${keepFileData}" in client.succeed("cat ${dataDir}/${keepFile}")
with subtest("remote"):
borg = "BORG_RSH='ssh -oStrictHostKeyChecking=no -i /root/id_ed25519' borg"
server.wait_for_unit("sshd.service")
+45
View File
@@ -0,0 +1,45 @@
# Test ClamAV.
{ lib, pkgs, ... }:
{
name = "clamav";
nodes = {
machine = {
services.clamav = {
daemon.enable = true;
clamonacc.enable = true;
daemon.settings = {
OnAccessPrevention = true;
OnAccessIncludePath = "/opt";
};
};
# Add the definition for our test file.
# We cannot download definitions from Internet using freshclam in sandboxed test.
systemd.tmpfiles.settings."10-eicar"."/var/lib/clamav/test.hdb".L.argument = "${pkgs.runCommand
"test.hdb"
{ }
''
echo CLAMAVTEST > testfile
${lib.getExe' pkgs.clamav "sigtool"} --sha256 testfile > $out
''
}";
# Test using /opt as the ClamAV on-access scanner-protected directory.
systemd.tmpfiles.settings."10-testdir"."/opt".d = { };
};
};
testScript = ''
start_all()
machine.wait_for_unit("default.target")
# Write test file into the test directory.
# This won't trigger ClamAV as it scans on file open.
machine.succeed("echo CLAMAVTEST > /opt/testfile")
machine.fail("cat /opt/testfile")
'';
}
-1
View File
@@ -12,7 +12,6 @@ in
maintainers = with lib.maintainers; [
aristid
aszlig
kampfschlaefer
];
};
-1
View File
@@ -2,7 +2,6 @@
{
name = "containers-extra_veth";
meta = {
maintainers = with lib.maintainers; [ kampfschlaefer ];
};
nodes.machine =
-1
View File
@@ -5,7 +5,6 @@
maintainers = with lib.maintainers; [
aristid
aszlig
kampfschlaefer
];
};
-1
View File
@@ -19,7 +19,6 @@ in
maintainers = with lib.maintainers; [
aristid
aszlig
kampfschlaefer
];
};
@@ -2,7 +2,6 @@
{
name = "containers-physical_interfaces";
meta = {
maintainers = with lib.maintainers; [ kampfschlaefer ];
};
nodes = {
-1
View File
@@ -12,7 +12,6 @@ in
maintainers = with lib.maintainers; [
aristid
aszlig
kampfschlaefer
ianwookim
];
};
@@ -2,7 +2,6 @@
{
name = "containers-restart_networking";
meta = {
maintainers = with lib.maintainers; [ kampfschlaefer ];
};
nodes = {
+3 -1
View File
@@ -22,7 +22,9 @@
machine.wait_for_file("/etc/fish/generated_completions/coreutils.fish")
machine.wait_for_file("/etc/fish/generated_completions/kill.fish")
machine.succeed(
"fish -ic 'echo $fish_complete_path' | grep -q '/share/fish/completions /etc/fish/generated_completions /root/.cache/fish/generated_completions$'"
"fish -ic 'echo $fish_complete_path' | grep -q '/share/fish/vendor_completions.d /etc/fish/generated_completions /root/.cache/fish/generated_completions$'"
)
machine.wait_for_file("/etc/fish/config.fish")
config = machine.succeed("fish_indent -c /etc/fish/config.fish")
'';
}
-110
View File
@@ -1,110 +0,0 @@
{ pkgs, lib, ... }:
{
name = "gnome-xorg";
meta = {
maintainers = lib.teams.gnome.members;
};
nodes.machine =
{ nodes, ... }:
let
user = nodes.machine.users.users.alice;
in
{
imports = [ ./common/user-account.nix ];
services.xserver.enable = true;
services.displayManager.gdm = {
enable = true;
debug = true;
};
services.displayManager.autoLogin = {
enable = true;
user = user.name;
};
services.desktopManager.gnome.enable = true;
services.desktopManager.gnome.debug = true;
services.displayManager.defaultSession = "gnome-xorg";
systemd.user.services = {
"org.gnome.Shell@x11" = {
serviceConfig = {
ExecStart = [
# Clear the list before overriding it.
""
# Eval API is now internal so Shell needs to run in unsafe mode.
# TODO: improve test driver so that it supports openqa-like manipulation
# that would allow us to drop this mess.
"${pkgs.gnome-shell}/bin/gnome-shell --unsafe-mode"
];
};
};
};
};
testScript =
{ nodes, ... }:
let
user = nodes.machine.users.users.alice;
uid = toString user.uid;
bus = "DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/${uid}/bus";
xauthority = "/run/user/${uid}/gdm/Xauthority";
display = "DISPLAY=:0.0";
env = "${bus} XAUTHORITY=${xauthority} ${display}";
# Run a command in the appropriate user environment
run = command: "su - ${user.name} -c '${bus} ${command}'";
# Call javascript in gnome shell, returns a tuple (success, output), where
# `success` is true if the dbus call was successful and output is what the
# javascript evaluates to.
eval =
command:
run "gdbus call --session -d org.gnome.Shell -o /org/gnome/Shell -m org.gnome.Shell.Eval ${command}";
# False when startup is done
startingUp = eval "Main.layoutManager._startingUp";
# Start Console
launchConsole = run "gapplication launch org.gnome.Console";
# Hopefully Console's wm class
wmClass = eval "global.display.focus_window.wm_class";
in
''
with subtest("Login to GNOME Xorg with GDM"):
machine.wait_for_x()
# Wait for alice to be logged in"
machine.wait_for_unit("default.target", "${user.name}")
machine.wait_for_file("${xauthority}")
machine.succeed("xauth merge ${xauthority}")
# Check that logging in has given the user ownership of devices
# Change back to /dev/snd/timer after systemd-258.1
assert "alice" in machine.succeed("getfacl -p /dev/dri/card0")
with subtest("Wait for GNOME Shell"):
# correct output should be (true, 'false')
machine.wait_until_succeeds(
"${startingUp} | grep -q 'true,..false'"
)
with subtest("Open Console"):
# Close the Activities view so that Shell can correctly track the focused window.
machine.send_key("esc")
machine.succeed(
"${launchConsole}"
)
# correct output should be (true, '"kgx"')
# For some reason, this deviates from Wayland.
machine.wait_until_succeeds(
"${wmClass} | grep -q 'true,...kgx'"
)
machine.sleep(20)
machine.screenshot("screen")
'';
}
+7 -4
View File
@@ -38,10 +38,13 @@ in
settings = {
server_url = "https://headscale";
ip_prefixes = [ "100.64.0.0/10" ];
derp.server = {
enabled = true;
region_id = 999;
stun_listen_addr = "0.0.0.0:${toString stunPort}";
derp = {
server = {
enabled = true;
region_id = 999;
stun_listen_addr = "0.0.0.0:${toString stunPort}";
};
urls = [ ];
};
dns = {
base_domain = "tailnet";
+116 -112
View File
@@ -1,124 +1,128 @@
import ../make-test-python.nix (
{ pkgs, lib, ... }:
{ pkgs, lib, ... }:
let
releases = import ../../release.nix {
configuration = {
# Building documentation makes the test unnecessarily take a longer time:
documentation.enable = lib.mkForce false;
let
releases = import ../../release.nix {
configuration = {
# Building documentation makes the test unnecessarily take a longer time:
documentation.enable = lib.mkForce false;
documentation.nixos.enable = lib.mkForce false;
# including a channel forces images to be rebuilt on any changes
system.installer.channel.enable = lib.mkForce false;
};
};
lxc-image-metadata =
releases.incusContainerMeta.${pkgs.stdenv.hostPlatform.system}
+ "/tarball/nixos-image-lxc-*-${pkgs.stdenv.hostPlatform.system}.tar.xz";
# the incus container rootfs is in squashfs, but lxc requires tar.xz so use containerTarball
lxc-image-rootfs =
releases.containerTarball.${pkgs.stdenv.hostPlatform.system}
+ "/tarball/nixos-image-lxc-*-${pkgs.stdenv.hostPlatform.system}.tar.xz";
in
{
name = "lxc-container-unprivileged";
meta = {
maintainers = lib.teams.lxc.members;
};
nodes.machine = {
virtualisation = {
diskSize = 6144;
cores = 2;
memorySize = 512;
writableStore = true;
lxc = {
enable = true;
unprivilegedContainers = true;
systemConfig = ''
lxc.lxcpath = /tmp/lxc
'';
defaultConfig = ''
lxc.net.0.type = veth
lxc.net.0.link = lxcbr0
lxc.net.0.flags = up
lxc.net.0.hwaddr = 00:16:3e:xx:xx:xx
lxc.idmap = u 0 100000 65536
lxc.idmap = g 0 100000 65536
'';
# Permit user alice to connect to bridge
usernetConfig = ''
@lxc-user veth lxcbr0 10
'';
bridgeConfig = ''
LXC_IPV6_ADDR=""
LXC_IPV6_MASK=""
LXC_IPV6_NETWORK=""
LXC_IPV6_NAT="false"
'';
};
};
lxc-image-metadata = releases.incusContainerMeta.${pkgs.stdenv.hostPlatform.system};
lxc-image-rootfs = releases.incusContainerImage.${pkgs.stdenv.hostPlatform.system};
# Needed for lxc
environment.systemPackages = [
pkgs.wget
pkgs.dnsmasq
];
in
{
name = "lxc-container-unprivileged";
meta = {
maintainers = lib.teams.lxc.members;
# Create user for test
users.users.alice = {
isNormalUser = true;
password = "test";
description = "Lxc unprivileged user with access to lxcbr0";
extraGroups = [ "lxc-user" ];
subGidRanges = [
{
startGid = 100000;
count = 65536;
}
];
subUidRanges = [
{
startUid = 100000;
count = 65536;
}
];
};
nodes.machine =
{ lib, pkgs, ... }:
{
virtualisation = {
diskSize = 6144;
cores = 2;
memorySize = 512;
writableStore = true;
users.users.bob = {
isNormalUser = true;
password = "test";
description = "Lxc unprivileged user without access to lxcbr0";
subGidRanges = [
{
startGid = 100000;
count = 65536;
}
];
subUidRanges = [
{
startUid = 100000;
count = 65536;
}
];
};
};
lxc = {
enable = true;
unprivilegedContainers = true;
systemConfig = ''
lxc.lxcpath = /tmp/lxc
'';
defaultConfig = ''
lxc.net.0.type = veth
lxc.net.0.link = lxcbr0
lxc.net.0.flags = up
lxc.net.0.hwaddr = 00:16:3e:xx:xx:xx
lxc.idmap = u 0 100000 65536
lxc.idmap = g 0 100000 65536
'';
# Permit user alice to connect to bridge
usernetConfig = ''
@lxc-user veth lxcbr0 10
'';
bridgeConfig = ''
LXC_IPV6_ADDR=""
LXC_IPV6_MASK=""
LXC_IPV6_NETWORK=""
LXC_IPV6_NAT="false"
'';
};
};
testScript = ''
machine.wait_for_unit("lxc-net.service")
# Needed for lxc
environment.systemPackages = [
pkgs.wget
pkgs.dnsmasq
];
# Copy config files for alice
machine.execute("su -- alice -c 'mkdir -p ~/.config/lxc'")
machine.execute("su -- alice -c 'cp /etc/lxc/default.conf ~/.config/lxc/'")
machine.execute("su -- alice -c 'cp /etc/lxc/lxc.conf ~/.config/lxc/'")
# Create user for test
users.users.alice = {
isNormalUser = true;
password = "test";
description = "Lxc unprivileged user with access to lxcbr0";
extraGroups = [ "lxc-user" ];
subGidRanges = [
{
startGid = 100000;
count = 65536;
}
];
subUidRanges = [
{
startUid = 100000;
count = 65536;
}
];
};
machine.succeed("su -- alice -c 'lxc-create -t local -n test -- --metadata ${lxc-image-metadata} --fstree ${lxc-image-rootfs}'")
machine.succeed("su -- alice -c 'lxc-start test'")
machine.succeed("su -- alice -c 'lxc-stop test'")
users.users.bob = {
isNormalUser = true;
password = "test";
description = "Lxc unprivileged user without access to lxcbr0";
subGidRanges = [
{
startGid = 100000;
count = 65536;
}
];
subUidRanges = [
{
startUid = 100000;
count = 65536;
}
];
};
};
# Copy config files for bob
machine.execute("su -- bob -c 'mkdir -p ~/.config/lxc'")
machine.execute("su -- bob -c 'cp /etc/lxc/default.conf ~/.config/lxc/'")
machine.execute("su -- bob -c 'cp /etc/lxc/lxc.conf ~/.config/lxc/'")
testScript = ''
machine.wait_for_unit("lxc-net.service")
# Copy config files for alice
machine.execute("su -- alice -c 'mkdir -p ~/.config/lxc'")
machine.execute("su -- alice -c 'cp /etc/lxc/default.conf ~/.config/lxc/'")
machine.execute("su -- alice -c 'cp /etc/lxc/lxc.conf ~/.config/lxc/'")
machine.succeed("su -- alice -c 'lxc-create -t local -n test -- --metadata ${lxc-image-metadata}/*/*.tar.xz --fstree ${lxc-image-rootfs}/*/*.tar.xz'")
machine.succeed("su -- alice -c 'lxc-start test'")
machine.succeed("su -- alice -c 'lxc-stop test'")
# Copy config files for bob
machine.execute("su -- bob -c 'mkdir -p ~/.config/lxc'")
machine.execute("su -- bob -c 'cp /etc/lxc/default.conf ~/.config/lxc/'")
machine.execute("su -- bob -c 'cp /etc/lxc/lxc.conf ~/.config/lxc/'")
machine.fail("su -- bob -c 'lxc-start test'")
'';
}
)
machine.fail("su -- bob -c 'lxc-start test'")
'';
}
+17 -13
View File
@@ -14,6 +14,7 @@ in
let
inherit (config.networking) hostName;
cfg = config.services.molly-brown;
openssl = pkgs.lib.getExe pkgs.openssl;
in
{
@@ -47,22 +48,25 @@ in
services.molly-brown = {
enable = true;
docBase = "/tmp/docs";
certPath = "/tmp/cert.pem";
keyPath = "/tmp/key.pem";
docBase = "/var/lib/molly-brown/docs";
certPath = "/var/lib/molly-brown/cert.pem";
keyPath = "/var/lib/molly-brown/key.pem";
};
systemd.services.molly-brown.preStart = ''
${pkgs.openssl}/bin/openssl genrsa -out "/tmp/key.pem"
${pkgs.openssl}/bin/openssl req -new \
-subj "/CN=${config.networking.hostName}" \
-key "/tmp/key.pem" -out /tmp/request.pem
${pkgs.openssl}/bin/openssl x509 -req -days 3650 \
-in /tmp/request.pem -signkey "/tmp/key.pem" -out "/tmp/cert.pem"
systemd.services.molly-brown = {
serviceConfig.StateDirectory = "molly-brown";
preStart = ''
${openssl} genrsa -out "$STATE_DIRECTORY/key.pem"
${openssl} req -new \
-subj "/CN=${hostName}" \
-key "$STATE_DIRECTORY/key.pem" -out "$STATE_DIRECTORY/request.pem"
${openssl} x509 -req -days 3650 \
-in "$STATE_DIRECTORY/request.pem" -signkey "$STATE_DIRECTORY/key.pem" -out "$STATE_DIRECTORY/cert.pem"
mkdir -p "${cfg.settings.DocBase}"
echo "${testString}" > "${cfg.settings.DocBase}/test.gmi"
'';
mkdir -p "${cfg.settings.DocBase}"
echo "${testString}" > "${cfg.settings.DocBase}/test.gmi"
'';
};
};
};
testScript = ''
+1 -4
View File
@@ -5,10 +5,7 @@ let
in
{
name = "n8n";
meta.maintainers = with lib.maintainers; [
freezeboy
k900
];
meta.maintainers = with lib.maintainers; [ k900 ];
node.pkgsReadOnly = false;
+33
View File
@@ -0,0 +1,33 @@
{ pkgs, lib, ... }:
{
name = "nebula-lighthouse-service";
meta.maintainers = with lib.maintainers; [
bloominstrong
];
nodes.machine =
{ ... }:
{
environment.systemPackages = with pkgs; [
nebula
];
services.nebula-lighthouse-service.enable = true;
};
testScript = ''
start_all()
machine.succeed(
'nebula-cert ca -duration $((10*365*24*60))m -name "NLS Test" -out-crt ca.crt -out-key ca.key',
'nebula-cert sign -duration $((365*24*60))m -ca-crt ca.crt -ca-key ca.key -name "lighthouse" -groups "lighthouse" -ip "10.0.100.1/24" -out-crt lighthouse.crt -out-key lighthouse.key'
)
machine.wait_for_unit("nebula-lighthouse-service.service")
machine.wait_for_open_port(8080)
machine.succeed(
'curl -X POST "http://127.0.0.1:8080/lighthouse/" -F ca_crt=@./ca.crt -F host_crt=@./lighthouse.crt -F host_key=@./lighthouse.key',
'curl -X GET "http://127.0.0.1:8080/lighthouse/" -F ca_crt=@./ca.crt -F host_crt=@./lighthouse.crt -F host_key=@./lighthouse.key',
'pgrep -x nebula'
)
'';
}
@@ -2,7 +2,7 @@
let
# We'll need to be able to trade cert files between nodes via scp.
inherit (import ./ssh-keys.nix pkgs)
inherit (import ../ssh-keys.nix pkgs)
snakeOilPrivateKey
snakeOilPublicKey
;
+92
View File
@@ -0,0 +1,92 @@
{ pkgs, lib, ... }:
let
inherit (import ../ssh-keys.nix pkgs)
snakeOilPrivateKey
snakeOilPublicKey
;
in
{
name = "nebula";
nodes = {
lighthouse =
{
pkgs,
lib,
config,
...
}:
{
environment.systemPackages = [ pkgs.nebula ];
environment.etc."nebula-key" = {
user = "nebula-smoke";
group = "nebula-smoke";
source = snakeOilPrivateKey;
mode = "0600";
};
services.nebula.networks.smoke = {
# Note that these paths won't exist when the machine is first booted.
ca = "/etc/nebula/ca.crt";
cert = "/etc/nebula/lighthouse.crt";
key = "/etc/nebula/lighthouse.key";
isLighthouse = true;
listen = {
host = "0.0.0.0";
port = 4242;
};
enableReload = true;
settings.sshd = {
enabled = true;
listen = "127.0.0.1:2222";
host_key = "/etc/nebula-key";
};
};
# We will test that nebula is reloaded by switching specialisations.
specialisation.sshd-off.configuration = {
services.nebula.networks.smoke.settings.sshd.enabled = lib.mkForce false;
};
specialisation.sshd-on.configuration = {
services.nebula.networks.smoke.settings.sshd.enabled = lib.mkForce true;
};
};
};
testScript =
{ nodes, ... }:
let
sshd-on = "${nodes.lighthouse.system.build.toplevel}/specialisation/sshd-on";
sshd-off = "${nodes.lighthouse.system.build.toplevel}/specialisation/sshd-off";
in
''
# Create the certificate and sign the lighthouse's keys.
lighthouse.succeed(
"mkdir -p /etc/nebula",
'nebula-cert ca -duration $((10*365*24*60))m -name "Smoke Test" -out-crt /etc/nebula/ca.crt -out-key /etc/nebula/ca.key',
'nebula-cert sign -duration $((365*24*60))m -ca-crt /etc/nebula/ca.crt -ca-key /etc/nebula/ca.key -name "lighthouse" -groups "lighthouse" -ip "10.0.100.1/24" -out-crt /etc/nebula/lighthouse.crt -out-key /etc/nebula/lighthouse.key',
'chown -R nebula-smoke:nebula-smoke /etc/nebula'
)
# Restart nebula to pick up the keys.
lighthouse.systemctl("restart nebula@smoke.service")
lighthouse.succeed("ping -c5 10.0.100.1")
# Verify that nebula's ssh interface is up.
lighthouse.succeed("${pkgs.nmap}/bin/nmap 127.0.0.1 | grep 2222/tcp")
# Switch configuration, verify nebula was reloaded and not restarted.
lighthouse.succeed("${sshd-off}/bin/switch-to-configuration test 2>&1 | grep 'nebula' | grep 'reload'")
# Verify that nebula's ssh interface is no longer up.
lighthouse.fail("${pkgs.nmap}/bin/nmap 127.0.0.1 | grep 2222/tcp")
# Switch configuration, verify reload again.
lighthouse.succeed("${sshd-on}/bin/switch-to-configuration test 2>&1 | grep 'nebula' | grep 'reload'")
# Verify that ssh is back.
lighthouse.succeed("${pkgs.nmap}/bin/nmap 127.0.0.1 | grep 2222/tcp")
'';
}
+1 -1
View File
@@ -50,7 +50,7 @@ in
# octoprint takes some time to start. This makes sure we'll retry just in case it takes longer
# retry-all-errors in necessary, since octoprint will report a 404 error when not yet ready
curl_cmd = "curl --retry-all-errors --connect-timeout 5 --max-time 10 --retry 5 --retry-delay 0 \
curl_cmd = "curl --retry-all-errors --connect-timeout 5 --max-time 10 --retry 5 --retry-delay 5 \
--retry-max-time 40 -X GET --header 'X-API-Key: ${apikey}' "
# used to fail early, in case octoprint first starts and then crashes
@@ -103,18 +103,17 @@ in
};
testScript = ''
import crypt
def assert_password_match(machine, username, password):
def assert_password_sha512crypt_match(machine, username, password):
shadow_entry = machine.succeed(f"getent shadow {username}")
print(shadow_entry)
hash = shadow_entry.split(":")[1]
seed = "$".join(hash.split("$")[:-1])
assert crypt.crypt(password, seed) == hash, f"{username} user password does not match"
stored_hash = shadow_entry.split(":")[1]
salt = stored_hash.split("$")[2]
pass_hash = machine.succeed(f"mkpasswd -m sha512crypt {password} {salt}").strip()
assert stored_hash == pass_hash, f"{username} user password does not match"
with subtest("alice user has correct password"):
for machine in machines:
assert_password_match(machine, "alice", "${password1}")
assert_password_sha512crypt_match(machine, "alice", "${password1}")
assert "${hashed_sha512crypt}" not in machine.succeed("getent shadow alice"), f"{machine}: alice user password is not correct"
with subtest("bob user has correct password"):
@@ -136,7 +135,7 @@ in
print(mutable.succeed("getent shadow greg"))
assert "${hashed_sha512crypt}" in mutable.succeed("getent shadow greg"), "greg user password is not correct"
assert_password_match(immutable, "greg", "${password1}")
assert_password_sha512crypt_match(immutable, "greg", "${password1}")
assert "${hashed_sha512crypt}" not in immutable.succeed("getent shadow greg"), "greg user password is not correct"
for machine in machines:
+7 -4
View File
@@ -10,11 +10,14 @@
enable = true;
port = 8080;
originalsPath = "/media/photos/";
passwordFile = pkgs.writeText "password" "secret";
passwordFile = "/etc/photoprism-password";
};
environment = {
etc."photoprism-password".text = "secret";
extraInit = ''
mkdir -p /media/photos
'';
};
environment.extraInit = ''
mkdir -p /media/photos
'';
};
testScript = ''
+2 -2
View File
@@ -1,8 +1,8 @@
{ lib, ... }:
{
name = "plikd";
meta = with lib.maintainers; {
maintainers = [ freezeboy ];
meta = {
maintainers = [ ];
};
nodes.machine =
+45
View File
@@ -1757,6 +1757,51 @@ let
'';
};
tailscale = {
exporterConfig = {
package = pkgs.prometheus-tailscale-exporter.overrideAttrs {
patches = [
# This patch prevents the exporter from exiting immediately upon
# startup when no credentials are provided, which is useful for
# testing the NixOS module.
(pkgs.writeText "allow-running-without-credentials" ''
diff --git a/cmd/tailscale-exporter/root.go b/cmd/tailscale-exporter/root.go
index 2ff11cb..2fb576f 100644
--- a/cmd/tailscale-exporter/root.go
+++ b/cmd/tailscale-exporter/root.go
@@ -137,14 +137,6 @@ func runExporter(cmd *cobra.Command, args []string) error {
''\t// Create HTTP client that automatically handles token refresh
''\thttpClient := oauthConfig.Client(context.Background())
-''\t// Test OAuth token generation
-''\ttoken, err := oauthConfig.Token(context.Background())
-''\tif err != nil {
-''\t''\treturn fmt.Errorf("failed to obtain OAuth token: %w", err)
-''\t}
-''\tlogger.Info("OAuth token obtained", "token_type", token.TokenType)
-''\tlogger.Info("Successfully obtained OAuth token", "expires", token.Expiry)
-
''\t// Default labels for all metrics
''\tdefaultLabels := prometheus.Labels{"tailnet": tailnet}
''\treg := prometheus.WrapRegistererWith(
'')
];
};
enable = true;
environmentFile = pkgs.writeText "tailscale-exporter-env" ''
TAILSCALE_OAUTH_CLIENT_ID=12345678
TAILSCALE_OAUTH_CLIENT_SECRET=12345678
TAILSCALE_TAILNET=example.com
'';
};
exporterTest = ''
wait_for_unit("prometheus-tailscale-exporter.service")
wait_for_open_port(9250)
succeed("curl -sSf localhost:9250/metrics | grep 'tailscale_up{tailnet=\"example.com\"} 1'")
'';
};
unpoller = {
nodeName = "unpoller";
exporterConfig.enable = true;
+1 -1
View File
@@ -10,7 +10,7 @@ let
mkTestName =
pkg: "${pkg.pname}_${builtins.replaceStrings [ "." ] [ "" ] (lib.versions.majorMinor pkg.version)}";
redisPackages = {
inherit (pkgs) redis keydb valkey;
inherit (pkgs) redis valkey;
};
makeRedisTest =
{
+1 -1
View File
@@ -362,7 +362,7 @@ in
client.wait_until_succeeds("curl -sSf http://server:${toString httpPort}/web/client/login")
# Ensure sftpgo found the static folder
client.wait_until_succeeds("curl -o /dev/null -sSf http://server:${toString httpPort}/static/favicon.ico")
client.wait_until_succeeds("curl -o /dev/null -sSf http://server:${toString httpPort}/static/favicon.png")
with subtest("Setup SSH keys"):
client.succeed("mkdir -m 700 /root/.ssh")
+1 -1
View File
@@ -64,7 +64,7 @@ in
boot.loader.grub.enable = false;
specialisation = rec {
brokenInitInterface.configuration.config.system.extraSystemBuilderCmds = ''
brokenInitInterface.configuration.config.system.systemBuilderCommands = ''
echo "systemd 0" > $out/init-interface-version
'';
+37
View File
@@ -0,0 +1,37 @@
# This test checks #418101, where lingering users would not be cleared up if
# the configuration is updated to remove lingering from all users.
rec {
name = "systemd-user-linger-purge";
nodes.machine = {
users.users = {
bob = {
isNormalUser = true;
linger = false;
uid = 1001;
};
};
};
testScript =
let
uidStrings = builtins.mapAttrs (k: v: builtins.toString v.uid) nodes.machine.users.users;
in
''
machine.fail("test -e /var/lib/systemd/linger/bob")
machine.fail("systemctl status user-${uidStrings.bob}.slice")
with subtest("missing users have linger purged"):
machine.succeed("touch /var/lib/systemd/linger/alice")
machine.systemctl("restart linger-users")
machine.succeed("test ! -e /var/lib/systemd/linger/alice")
with subtest("mutable users can linger"):
machine.succeed("useradd alice")
machine.succeed("test ! -e /var/lib/systemd/linger/alice")
machine.succeed("loginctl enable-linger alice")
machine.succeed("test -e /var/lib/systemd/linger/alice")
machine.systemctl("restart linger-users")
machine.succeed("test -e /var/lib/systemd/linger/alice")
'';
}
+24 -22
View File
@@ -1,37 +1,39 @@
{ lib, ... }:
{
rec {
name = "systemd-user-linger";
nodes.machine =
{ ... }:
{
users.users = {
alice = {
isNormalUser = true;
linger = true;
uid = 1000;
};
nodes.machine = {
users.users = {
alice = {
isNormalUser = true;
linger = true;
uid = 1000;
};
bob = {
isNormalUser = true;
linger = false;
uid = 10001;
};
bob = {
isNormalUser = true;
linger = false;
uid = 1001;
};
};
};
testScript =
{ ... }:
let
uidStrings = builtins.mapAttrs (k: v: builtins.toString v.uid) nodes.machine.users.users;
in
''
machine.wait_for_file("/var/lib/systemd/linger/alice")
machine.succeed("systemctl status user-1000.slice")
machine.succeed("systemctl status user-${uidStrings.alice}.slice")
machine.fail("test -e /var/lib/systemd/linger/bob")
machine.fail("systemctl status user-1001.slice")
machine.fail("systemctl status user-${uidStrings.bob}.slice")
with subtest("missing users have linger purged"):
machine.succeed("touch /var/lib/systemd/linger/missing")
with subtest("mutable users can linger"):
machine.succeed("useradd clare")
machine.succeed("test ! -e /var/lib/systemd/linger/clare")
machine.succeed("loginctl enable-linger clare")
machine.succeed("test -e /var/lib/systemd/linger/clare")
machine.systemctl("restart linger-users")
machine.succeed("test ! -e /var/lib/systemd/linger/missing")
machine.succeed("test -e /var/lib/systemd/linger/clare")
'';
}
+51
View File
@@ -0,0 +1,51 @@
{
pkgs,
lib,
...
}:
{
name = "traccar";
meta = {
maintainers = with lib.maintainers; [ frederictobiasc ];
};
nodes.machine = {
services.traccar = {
enable = true;
settings.mail.smtp.host = "$SMTP_HOST";
environmentFile = pkgs.writeText "traccar.env" ''
SMTP_HOST=smtp.example.com
'';
};
};
testScript = ''
machine.wait_for_unit("traccar.service")
# Check that environment variables were substituted
t.assertIn("smtp.example.com", machine.succeed("cat /var/lib/traccar/config.xml"), "environment substitution failed")
machine.wait_for_open_port(8082)
# Check that we get the traccar login page
t.assertIn("Traccar", machine.wait_until_succeeds("curl -sf http://localhost:8082/"), "Traccar frontend seems unreachable")
# Register the first admin user
register_data = """
{
"email": "admin@example.com",
"name": "admin",
"password": "admin123"
}
"""
t.assertIn(
"\"administrator\":true",
machine.succeed(
"curl -s -X POST "
"-H 'Content-Type: application/json' "
f"-d '{register_data}' "
"http://localhost:8082/api/users"
),
"Unexpected registration response"
)
'';
}
+1 -1
View File
@@ -162,7 +162,7 @@ let
cp "${cfg.system.build.kernel}/bzImage" /mnt/linux
cp "${cfg.system.build.initialRamdisk}/initrd" /mnt/initrd
${pkgs.grub2}/bin/grub-install --boot-directory=/mnt /dev/vda
${pkgs.grub2}/bin/grub-install --target=i386-pc --boot-directory=/mnt /dev/vda
cat > /mnt/grub/grub.cfg <<GRUB
set root=hd0,1
+6
View File
@@ -27,6 +27,7 @@ in
"fc00::1/128"
];
listenPort = 23542;
fwMark = "0x6e6978";
# !!! Don't do this with real keys. The /nix store is world-readable!
privateKeyFile = toString (pkgs.writeText "privateKey" wg-snakeoil-keys.peer0.privateKey);
@@ -60,6 +61,7 @@ in
"fc00::2/128"
];
listenPort = 23542;
fwMark = "30567";
# !!! Don't do this with real keys. The /nix store is world-readable!
privateKeyFile = toString (pkgs.writeText "privateKey" wg-snakeoil-keys.peer1.privateKey);
@@ -97,5 +99,9 @@ in
with subtest("Has PSK set"):
peer0.succeed("wg | grep 'preshared key'")
peer1.succeed("wg | grep 'preshared key'")
with subtest("Has FwMark set"):
peer0.succeed("wg | grep '0x6e6978'")
peer1.succeed("wg | grep '0x7767'")
'';
}
@@ -127,6 +127,10 @@ stdenv.mkDerivation rec {
mkdir $out/bin
ln -s $out/opt/REAPER/reaper $out/bin/
# Avoid store path in Exec, since we already link to $out/bin
substituteInPlace $out/share/applications/cockos-reaper.desktop \
--replace-fail "Exec=\"$out/opt/REAPER/reaper\"" "Exec=reaper"
runHook postInstall
'';
@@ -19,6 +19,10 @@
stdenv.mkDerivation (finalAttrs: {
pname = "timeshift";
version = "25.07.7";
outputs = [
"out"
"man"
];
src = fetchFromGitHub {
owner = "linuxmint";
@@ -10,7 +10,7 @@
timeshift-unwrapped: runtimeDeps:
stdenvNoCC.mkDerivation {
inherit (timeshift-unwrapped) pname version;
inherit (timeshift-unwrapped) pname version outputs;
dontUnpack = true;
@@ -21,8 +21,12 @@ stdenvNoCC.mkDerivation {
installPhase = ''
runHook preInstall
mkdir -p "$out"
lndir "${timeshift-unwrapped}" "$out"
''
+ lib.concatMapStrings (outputName: ''
mkdir -p "''$${outputName}"
lndir -silent "${timeshift-unwrapped.${outputName}}" "''$${outputName}"
'') timeshift-unwrapped.outputs
+ ''
runHook postInstall
'';
@@ -32,19 +32,18 @@
# The list can be found at https://github.com/bitcoinknots/guix.sigs/tree/knots/builder-keys
builderKeys ? [
"1A3E761F19D2CC7785C5502EA291A2C45D0C504A" # luke-jr.gpg
"C1BCB7169AF1A07A0C5E471A047509FA0A6D7350" # ataraxia
"DAED928C727D3E613EC46635F5073C4F4882FFFC" # leo-haf.gpg
],
}:
stdenv.mkDerivation (finalAttrs: {
pname = if withGui then "bitcoin-knots" else "bitcoind-knots";
version = "29.2.knots20251010";
version = "29.2.knots20251110";
src = fetchurl {
url = "https://bitcoinknots.org/files/29.x/${finalAttrs.version}/bitcoin-${finalAttrs.version}.tar.gz";
# hash retrieved from signed SHA256SUMS
hash = "sha256-p3omcfgX57reHXQX3IG8FPmMy8MHSCN0+D9Hhb24Wck=";
hash = "sha256-ZoFQsrNSkIFdSkiwMX64UnWtjVZu+g+64AV7OjtCcBI=";
};
nativeBuildInputs = [
@@ -89,18 +88,18 @@ stdenv.mkDerivation (finalAttrs: {
publicKeys = fetchFromGitHub {
owner = "bitcoinknots";
repo = "guix.sigs";
rev = "251a8f2141e5f8439175fdd7b6cd6819d743cc01";
sha256 = "sha256-pZOK/lD1m9x8mz1IB39kLA/27fBnLvEL3qrwTRjL9Ec=";
rev = "cc710f4715ff5ff74a9e89d8b6798884fe1e9d40";
sha256 = "sha256-PVvsqY//75dv+VrtapCNroD1z1zUaA/UBGvfq3zNySo=";
};
checksums = fetchurl {
url = "https://bitcoinknots.org/files/${majorVersion}.x/${finalAttrs.version}/SHA256SUMS";
hash = "sha256-DQQg2Iahp2H5jDYA9XX5n/ypRzmFggincGNoIH2t5iU=";
hash = "sha256-A6UPWZtdm3/P62JmEvzIxHC8zdPpHdLnbdD/xXMMo+I=";
};
signatures = fetchurl {
url = "https://bitcoinknots.org/files/${majorVersion}.x/${finalAttrs.version}/SHA256SUMS.asc";
hash = "sha256-fSjYdscQ4viuXutP43prWjrNT7cMaJ9J8SsUykNjJtw";
hash = "sha256-tEw/GnnwDf1G16fx6NzXPCvAnOzWY16iW93CowoFfA8=";
};
verifyBuilderKeys =
@@ -27,10 +27,10 @@
"dataspell": {
"update-channel": "DataSpell RELEASE",
"url-template": "https://download.jetbrains.com/python/dataspell-{version}.tar.gz",
"version": "2025.2.2",
"sha256": "32cdc6178f4046b3056c50184fd5157eef0658875a6ff17c64eb451d1fb0f4fb",
"url": "https://download.jetbrains.com/python/dataspell-2025.2.2.tar.gz",
"build_number": "252.27397.107"
"version": "2025.2.3",
"sha256": "1e4bc499da1ce8c63e8a4526159c20ef8a797315dc6d3ab4c8eb109f323faba6",
"url": "https://download.jetbrains.com/python/dataspell-2025.2.3.tar.gz",
"build_number": "252.27397.129"
},
"gateway": {
"update-channel": "Gateway RELEASE",
@@ -100,10 +100,10 @@
"rider": {
"update-channel": "Rider RELEASE",
"url-template": "https://download.jetbrains.com/rider/JetBrains.Rider-{version}.tar.gz",
"version": "2025.2.4",
"sha256": "cd428f7d6db5055cd2594c3d1ef91241843d263cb6301369d3121a847ffb6589",
"url": "https://download.jetbrains.com/rider/JetBrains.Rider-2025.2.4.tar.gz",
"build_number": "252.27397.121"
"version": "2025.3",
"sha256": "bf7be76634ec70dc33008505a08dcc024d4d7ec2bf0e4ace8a71f219d2f40706",
"url": "https://download.jetbrains.com/rider/JetBrains.Rider-2025.3.tar.gz",
"build_number": "253.28294.88"
},
"ruby-mine": {
"update-channel": "RubyMine RELEASE",
@@ -116,10 +116,10 @@
"rust-rover": {
"update-channel": "RustRover RELEASE",
"url-template": "https://download.jetbrains.com/rustrover/RustRover-{version}.tar.gz",
"version": "2025.2.4",
"sha256": "3da078b5e68bac2283c0dd60fe3ff17d6025d92d6237bc6fab74f1f35ff6fbe5",
"url": "https://download.jetbrains.com/rustrover/RustRover-2025.2.4.tar.gz",
"build_number": "252.27397.120"
"version": "2025.2.4.1",
"sha256": "a51a62af4801f7f4caf8586dde0354d06f6bc351660b75feff554e756874cb37",
"url": "https://download.jetbrains.com/rustrover/RustRover-2025.2.4.1.tar.gz",
"build_number": "252.27397.133"
},
"webstorm": {
"update-channel": "WebStorm RELEASE",
@@ -166,10 +166,10 @@
"dataspell": {
"update-channel": "DataSpell RELEASE",
"url-template": "https://download.jetbrains.com/python/dataspell-{version}-aarch64.tar.gz",
"version": "2025.2.2",
"sha256": "6881781e1020272cf3ceb4e50da66e24cbc4f35535e568131353cbfbd9d81968",
"url": "https://download.jetbrains.com/python/dataspell-2025.2.2-aarch64.tar.gz",
"build_number": "252.27397.107"
"version": "2025.2.3",
"sha256": "4bebb406617b4179791d4b6560dc50355760773ef37f6ce9f27bd0d1fd638750",
"url": "https://download.jetbrains.com/python/dataspell-2025.2.3-aarch64.tar.gz",
"build_number": "252.27397.129"
},
"gateway": {
"update-channel": "Gateway RELEASE",
@@ -239,10 +239,10 @@
"rider": {
"update-channel": "Rider RELEASE",
"url-template": "https://download.jetbrains.com/rider/JetBrains.Rider-{version}-aarch64.tar.gz",
"version": "2025.2.4",
"sha256": "75c38a2bd94e31200fc4e3a6cfad83b35c65d36c9d61b9a7b208e3ec82f8c81a",
"url": "https://download.jetbrains.com/rider/JetBrains.Rider-2025.2.4-aarch64.tar.gz",
"build_number": "252.27397.121"
"version": "2025.3",
"sha256": "bce1eed1a6fac3cc0850fc2b38ef557e1c51872c4b619a86ce36d002f6cbcbcb",
"url": "https://download.jetbrains.com/rider/JetBrains.Rider-2025.3-aarch64.tar.gz",
"build_number": "253.28294.88"
},
"ruby-mine": {
"update-channel": "RubyMine RELEASE",
@@ -255,10 +255,10 @@
"rust-rover": {
"update-channel": "RustRover RELEASE",
"url-template": "https://download.jetbrains.com/rustrover/RustRover-{version}-aarch64.tar.gz",
"version": "2025.2.4",
"sha256": "03052ead61bd13eaa616d1126add5b6b6fa9dbc6ef591109b358005d5b630606",
"url": "https://download.jetbrains.com/rustrover/RustRover-2025.2.4-aarch64.tar.gz",
"build_number": "252.27397.120"
"version": "2025.2.4.1",
"sha256": "83d868b92b79907dc42d9e4aacc2a2aae3f9838d392c5a7593487bf4cbb8c641",
"url": "https://download.jetbrains.com/rustrover/RustRover-2025.2.4.1-aarch64.tar.gz",
"build_number": "252.27397.133"
},
"webstorm": {
"update-channel": "WebStorm RELEASE",
@@ -305,10 +305,10 @@
"dataspell": {
"update-channel": "DataSpell RELEASE",
"url-template": "https://download.jetbrains.com/python/dataspell-{version}.dmg",
"version": "2025.2.2",
"sha256": "9573f0450a6eb1877bf53705533c886962ea5985c83c7a2ef642cea796b8eae0",
"url": "https://download.jetbrains.com/python/dataspell-2025.2.2.dmg",
"build_number": "252.27397.107"
"version": "2025.2.3",
"sha256": "7d1a60c4367a1e1bd43aec494177c4c30744cb5bf904a3c71d2a3d13439a7b12",
"url": "https://download.jetbrains.com/python/dataspell-2025.2.3.dmg",
"build_number": "252.27397.129"
},
"gateway": {
"update-channel": "Gateway RELEASE",
@@ -378,10 +378,10 @@
"rider": {
"update-channel": "Rider RELEASE",
"url-template": "https://download.jetbrains.com/rider/JetBrains.Rider-{version}.dmg",
"version": "2025.2.4",
"sha256": "f8cabc370393b6be2bd244413fd5692714c02e11cf24eb9c32438367d2895750",
"url": "https://download.jetbrains.com/rider/JetBrains.Rider-2025.2.4.dmg",
"build_number": "252.27397.121"
"version": "2025.3",
"sha256": "add7e6e67b9f2588979782d86a7ff680a263ef41cd13664ed703975a6498976e",
"url": "https://download.jetbrains.com/rider/JetBrains.Rider-2025.3.dmg",
"build_number": "253.28294.88"
},
"ruby-mine": {
"update-channel": "RubyMine RELEASE",
@@ -394,10 +394,10 @@
"rust-rover": {
"update-channel": "RustRover RELEASE",
"url-template": "https://download.jetbrains.com/rustrover/RustRover-{version}.dmg",
"version": "2025.2.4",
"sha256": "71f0735c546b659d4d1ed9ce58411848146ac0216b4b971583ce682311e9e075",
"url": "https://download.jetbrains.com/rustrover/RustRover-2025.2.4.dmg",
"build_number": "252.27397.120"
"version": "2025.2.4.1",
"sha256": "ec6faaaf119306c8b102b63492a530d8a1cf62f63c6f082543408c5c94e704bf",
"url": "https://download.jetbrains.com/rustrover/RustRover-2025.2.4.1.dmg",
"build_number": "252.27397.133"
},
"webstorm": {
"update-channel": "WebStorm RELEASE",
@@ -444,10 +444,10 @@
"dataspell": {
"update-channel": "DataSpell RELEASE",
"url-template": "https://download.jetbrains.com/python/dataspell-{version}-aarch64.dmg",
"version": "2025.2.2",
"sha256": "a2a9cc1c0c515399206568e66add7693718918cef58fc16025effde3d768371b",
"url": "https://download.jetbrains.com/python/dataspell-2025.2.2-aarch64.dmg",
"build_number": "252.27397.107"
"version": "2025.2.3",
"sha256": "ad8a2d8403c7d44f66d0905ab6d28a3e888e78b9cc140725e7ca744257c6ce58",
"url": "https://download.jetbrains.com/python/dataspell-2025.2.3-aarch64.dmg",
"build_number": "252.27397.129"
},
"gateway": {
"update-channel": "Gateway RELEASE",
@@ -517,10 +517,10 @@
"rider": {
"update-channel": "Rider RELEASE",
"url-template": "https://download.jetbrains.com/rider/JetBrains.Rider-{version}-aarch64.dmg",
"version": "2025.2.4",
"sha256": "e6bd0a07f5922c05c73d9170bbaa2219534fa8e5350b99f37c6a4bc9eb7c0870",
"url": "https://download.jetbrains.com/rider/JetBrains.Rider-2025.2.4-aarch64.dmg",
"build_number": "252.27397.121"
"version": "2025.3",
"sha256": "033f8dad94b9fec826ba9bd87025dfe668ef6d063a5cb49e7d33f7122ec2885e",
"url": "https://download.jetbrains.com/rider/JetBrains.Rider-2025.3-aarch64.dmg",
"build_number": "253.28294.88"
},
"ruby-mine": {
"update-channel": "RubyMine RELEASE",
@@ -533,10 +533,10 @@
"rust-rover": {
"update-channel": "RustRover RELEASE",
"url-template": "https://download.jetbrains.com/rustrover/RustRover-{version}-aarch64.dmg",
"version": "2025.2.4",
"sha256": "8bad55d714d388c115c0d35c297eb5bdb140bc024b2bf602efc8d07a3327cad9",
"url": "https://download.jetbrains.com/rustrover/RustRover-2025.2.4-aarch64.dmg",
"build_number": "252.27397.120"
"version": "2025.2.4.1",
"sha256": "0d4fe97c97c4cc66ec2d5a06fccc664557cae181cdf59177c9b24bff29ad5848",
"url": "https://download.jetbrains.com/rustrover/RustRover-2025.2.4.1-aarch64.dmg",
"build_number": "252.27397.133"
},
"webstorm": {
"update-channel": "WebStorm RELEASE",
@@ -45,7 +45,7 @@ let
products = versions.${system} or (throw "Unsupported system: ${system}");
dotnet-sdk = dotnetCorePackages.sdk_8_0-source;
dotnet-sdk = dotnetCorePackages.sdk_9_0-source;
package = if stdenv.hostPlatform.isDarwin then ./bin/darwin.nix else ./bin/linux.nix;
mkJetBrainsProductCore = callPackage package { inherit vmopts; };
@@ -175,7 +175,9 @@ let
$out/*/plugins/*/bin/*/linux/*/lib/python3.8/lib-dynload/* |
xargs patchelf \
--replace-needed libssl.so.10 libssl.so \
--replace-needed libssl.so.1.1 libssl.so \
--replace-needed libcrypto.so.10 libcrypto.so \
--replace-needed libcrypto.so.1.1 libcrypto.so \
--replace-needed libcrypt.so.1 libcrypt.so \
${lib.optionalString stdenv.hostPlatform.isAarch "--replace-needed libxml2.so.2 libxml2.so"}
'';
@@ -25,9 +25,9 @@
"252.27397.109": "https://plugins.jetbrains.com/files/164/835262/IdeaVIM-2.27.2.zip",
"252.27397.112": "https://plugins.jetbrains.com/files/164/835262/IdeaVIM-2.27.2.zip",
"252.27397.114": "https://plugins.jetbrains.com/files/164/835262/IdeaVIM-2.27.2.zip",
"252.27397.120": "https://plugins.jetbrains.com/files/164/835262/IdeaVIM-2.27.2.zip",
"252.27397.121": "https://plugins.jetbrains.com/files/164/835262/IdeaVIM-2.27.2.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/164/835262/IdeaVIM-2.27.2.zip"
"252.27397.133": "https://plugins.jetbrains.com/files/164/835262/IdeaVIM-2.27.2.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/164/835262/IdeaVIM-2.27.2.zip",
"253.28294.88": "https://plugins.jetbrains.com/files/164/835262/IdeaVIM-2.27.2.zip"
},
"name": "ideavim"
},
@@ -46,7 +46,7 @@
"idea-ultimate"
],
"builds": {
"251.25410.129": "https://plugins.jetbrains.com/files/1347/770332/scala-intellij-bin-2025.1.25.zip",
"251.25410.129": null,
"252.27397.103": "https://plugins.jetbrains.com/files/1347/882283/scala-intellij-bin-2025.2.48.zip"
},
"name": "scala"
@@ -76,9 +76,9 @@
"252.27397.109": "https://plugins.jetbrains.com/files/2162/820000/StringManipulation-9.16.0.zip",
"252.27397.112": "https://plugins.jetbrains.com/files/2162/820000/StringManipulation-9.16.0.zip",
"252.27397.114": "https://plugins.jetbrains.com/files/2162/820000/StringManipulation-9.16.0.zip",
"252.27397.120": "https://plugins.jetbrains.com/files/2162/820000/StringManipulation-9.16.0.zip",
"252.27397.121": "https://plugins.jetbrains.com/files/2162/820000/StringManipulation-9.16.0.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/2162/820000/StringManipulation-9.16.0.zip"
"252.27397.133": "https://plugins.jetbrains.com/files/2162/820000/StringManipulation-9.16.0.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/2162/820000/StringManipulation-9.16.0.zip",
"253.28294.88": "https://plugins.jetbrains.com/files/2162/820000/StringManipulation-9.16.0.zip"
},
"name": "stringmanipulation"
},
@@ -107,9 +107,9 @@
"252.27397.109": "https://plugins.jetbrains.com/files/6884/796395/handlebars-252.23892.201.zip",
"252.27397.112": "https://plugins.jetbrains.com/files/6884/796395/handlebars-252.23892.201.zip",
"252.27397.114": "https://plugins.jetbrains.com/files/6884/796395/handlebars-252.23892.201.zip",
"252.27397.120": "https://plugins.jetbrains.com/files/6884/796395/handlebars-252.23892.201.zip",
"252.27397.121": "https://plugins.jetbrains.com/files/6884/796395/handlebars-252.23892.201.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/6884/796395/handlebars-252.23892.201.zip"
"252.27397.133": "https://plugins.jetbrains.com/files/6884/796395/handlebars-252.23892.201.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/6884/796395/handlebars-252.23892.201.zip",
"253.28294.88": "https://plugins.jetbrains.com/files/6884/889746/handlebars-253.28294.51.zip"
},
"name": "handlebars-mustache"
},
@@ -138,9 +138,9 @@
"252.27397.109": "https://plugins.jetbrains.com/files/6954/882364/Kotlin-252.27397.103-IJ.zip",
"252.27397.112": "https://plugins.jetbrains.com/files/6954/882364/Kotlin-252.27397.103-IJ.zip",
"252.27397.114": "https://plugins.jetbrains.com/files/6954/882364/Kotlin-252.27397.103-IJ.zip",
"252.27397.120": "https://plugins.jetbrains.com/files/6954/882364/Kotlin-252.27397.103-IJ.zip",
"252.27397.121": "https://plugins.jetbrains.com/files/6954/882364/Kotlin-252.27397.103-IJ.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/6954/882364/Kotlin-252.27397.103-IJ.zip"
"252.27397.133": "https://plugins.jetbrains.com/files/6954/882364/Kotlin-252.27397.103-IJ.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/6954/882364/Kotlin-252.27397.103-IJ.zip",
"253.28294.88": "https://plugins.jetbrains.com/files/6954/889899/Kotlin-253.28294.51-IJ.zip"
},
"name": "kotlin"
},
@@ -163,15 +163,15 @@
"251.25410.129": null,
"252.26199.587": null,
"252.26830.46": "https://plugins.jetbrains.com/files/6981/871946/ini-252.26830.99.zip",
"252.27397.100": "https://plugins.jetbrains.com/files/6981/882710/ini-252.27397.112.zip",
"252.27397.103": "https://plugins.jetbrains.com/files/6981/882710/ini-252.27397.112.zip",
"252.27397.106": "https://plugins.jetbrains.com/files/6981/882710/ini-252.27397.112.zip",
"252.27397.109": "https://plugins.jetbrains.com/files/6981/882710/ini-252.27397.112.zip",
"252.27397.112": "https://plugins.jetbrains.com/files/6981/882710/ini-252.27397.112.zip",
"252.27397.114": "https://plugins.jetbrains.com/files/6981/882710/ini-252.27397.112.zip",
"252.27397.120": "https://plugins.jetbrains.com/files/6981/882710/ini-252.27397.112.zip",
"252.27397.121": "https://plugins.jetbrains.com/files/6981/882710/ini-252.27397.112.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/6981/882710/ini-252.27397.112.zip"
"252.27397.100": "https://plugins.jetbrains.com/files/6981/884814/ini-252.27397.129.zip",
"252.27397.103": "https://plugins.jetbrains.com/files/6981/884814/ini-252.27397.129.zip",
"252.27397.106": "https://plugins.jetbrains.com/files/6981/884814/ini-252.27397.129.zip",
"252.27397.109": "https://plugins.jetbrains.com/files/6981/884814/ini-252.27397.129.zip",
"252.27397.112": "https://plugins.jetbrains.com/files/6981/884814/ini-252.27397.129.zip",
"252.27397.114": "https://plugins.jetbrains.com/files/6981/884814/ini-252.27397.129.zip",
"252.27397.133": "https://plugins.jetbrains.com/files/6981/884814/ini-252.27397.129.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/6981/884814/ini-252.27397.129.zip",
"253.28294.88": "https://plugins.jetbrains.com/files/6981/889727/ini-253.28294.51.zip"
},
"name": "ini"
},
@@ -200,9 +200,9 @@
"252.27397.109": "https://plugins.jetbrains.com/files/7086/738977/AceJump.zip",
"252.27397.112": "https://plugins.jetbrains.com/files/7086/738977/AceJump.zip",
"252.27397.114": "https://plugins.jetbrains.com/files/7086/738977/AceJump.zip",
"252.27397.120": "https://plugins.jetbrains.com/files/7086/738977/AceJump.zip",
"252.27397.121": "https://plugins.jetbrains.com/files/7086/738977/AceJump.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/7086/738977/AceJump.zip"
"252.27397.133": "https://plugins.jetbrains.com/files/7086/738977/AceJump.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/7086/738977/AceJump.zip",
"253.28294.88": "https://plugins.jetbrains.com/files/7086/738977/AceJump.zip"
},
"name": "acejump"
},
@@ -231,9 +231,9 @@
"252.27397.109": "https://plugins.jetbrains.com/files/7125/819837/GrepConsole-13.3.0-IJ2023.3.zip",
"252.27397.112": "https://plugins.jetbrains.com/files/7125/819837/GrepConsole-13.3.0-IJ2023.3.zip",
"252.27397.114": "https://plugins.jetbrains.com/files/7125/819837/GrepConsole-13.3.0-IJ2023.3.zip",
"252.27397.120": "https://plugins.jetbrains.com/files/7125/819837/GrepConsole-13.3.0-IJ2023.3.zip",
"252.27397.121": "https://plugins.jetbrains.com/files/7125/819837/GrepConsole-13.3.0-IJ2023.3.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/7125/819837/GrepConsole-13.3.0-IJ2023.3.zip"
"252.27397.133": "https://plugins.jetbrains.com/files/7125/819837/GrepConsole-13.3.0-IJ2023.3.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/7125/819837/GrepConsole-13.3.0-IJ2023.3.zip",
"253.28294.88": "https://plugins.jetbrains.com/files/7125/819837/GrepConsole-13.3.0-IJ2023.3.zip"
},
"name": "grep-console"
},
@@ -262,9 +262,9 @@
"252.27397.109": "https://plugins.jetbrains.com/files/7177/796349/fileWatcher-252.23892.201.zip",
"252.27397.112": "https://plugins.jetbrains.com/files/7177/796349/fileWatcher-252.23892.201.zip",
"252.27397.114": "https://plugins.jetbrains.com/files/7177/796349/fileWatcher-252.23892.201.zip",
"252.27397.120": "https://plugins.jetbrains.com/files/7177/796349/fileWatcher-252.23892.201.zip",
"252.27397.121": "https://plugins.jetbrains.com/files/7177/796349/fileWatcher-252.23892.201.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/7177/796349/fileWatcher-252.23892.201.zip"
"252.27397.133": "https://plugins.jetbrains.com/files/7177/796349/fileWatcher-252.23892.201.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/7177/796349/fileWatcher-252.23892.201.zip",
"253.28294.88": "https://plugins.jetbrains.com/files/7177/889979/fileWatcher-253.28294.51.zip"
},
"name": "file-watchers"
},
@@ -304,9 +304,9 @@
"252.27397.109": "https://plugins.jetbrains.com/files/7212/809131/cucumber-java-252.23892.360.zip",
"252.27397.112": "https://plugins.jetbrains.com/files/7212/809131/cucumber-java-252.23892.360.zip",
"252.27397.114": "https://plugins.jetbrains.com/files/7212/809131/cucumber-java-252.23892.360.zip",
"252.27397.120": "https://plugins.jetbrains.com/files/7212/809131/cucumber-java-252.23892.360.zip",
"252.27397.121": "https://plugins.jetbrains.com/files/7212/809131/cucumber-java-252.23892.360.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/7212/809131/cucumber-java-252.23892.360.zip"
"252.27397.133": "https://plugins.jetbrains.com/files/7212/809131/cucumber-java-252.23892.360.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/7212/809131/cucumber-java-252.23892.360.zip",
"253.28294.88": "https://plugins.jetbrains.com/files/7212/889840/cucumber-java-253.28294.51.zip"
},
"name": "cucumber-for-java"
},
@@ -351,9 +351,9 @@
"252.27397.103": "https://plugins.jetbrains.com/files/7322/882365/python-ce-252.27397.103.zip",
"252.27397.106": "https://plugins.jetbrains.com/files/7322/882365/python-ce-252.27397.103.zip",
"252.27397.114": "https://plugins.jetbrains.com/files/7322/882365/python-ce-252.27397.103.zip",
"252.27397.120": "https://plugins.jetbrains.com/files/7322/882365/python-ce-252.27397.103.zip",
"252.27397.121": "https://plugins.jetbrains.com/files/7322/882365/python-ce-252.27397.103.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/7322/882365/python-ce-252.27397.103.zip"
"252.27397.133": "https://plugins.jetbrains.com/files/7322/882365/python-ce-252.27397.103.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/7322/882365/python-ce-252.27397.103.zip",
"253.28294.88": "https://plugins.jetbrains.com/files/7322/889972/python-ce-253.28294.51.zip"
},
"name": "python-community-edition"
},
@@ -382,9 +382,9 @@
"252.27397.109": "https://plugins.jetbrains.com/files/7391/880448/asciidoctor-intellij-plugin-0.44.10.zip",
"252.27397.112": "https://plugins.jetbrains.com/files/7391/880448/asciidoctor-intellij-plugin-0.44.10.zip",
"252.27397.114": "https://plugins.jetbrains.com/files/7391/880448/asciidoctor-intellij-plugin-0.44.10.zip",
"252.27397.120": "https://plugins.jetbrains.com/files/7391/880448/asciidoctor-intellij-plugin-0.44.10.zip",
"252.27397.121": "https://plugins.jetbrains.com/files/7391/880448/asciidoctor-intellij-plugin-0.44.10.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/7391/880448/asciidoctor-intellij-plugin-0.44.10.zip"
"252.27397.133": "https://plugins.jetbrains.com/files/7391/880448/asciidoctor-intellij-plugin-0.44.10.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/7391/880448/asciidoctor-intellij-plugin-0.44.10.zip",
"253.28294.88": "https://plugins.jetbrains.com/files/7391/880451/asciidoctor-intellij-plugin-0.45.1.zip"
},
"name": "asciidoc"
},
@@ -413,9 +413,9 @@
"252.27397.109": "https://plugins.jetbrains.com/files/7425/760442/WakaTime.jar",
"252.27397.112": "https://plugins.jetbrains.com/files/7425/760442/WakaTime.jar",
"252.27397.114": "https://plugins.jetbrains.com/files/7425/760442/WakaTime.jar",
"252.27397.120": "https://plugins.jetbrains.com/files/7425/760442/WakaTime.jar",
"252.27397.121": "https://plugins.jetbrains.com/files/7425/760442/WakaTime.jar",
"252.27397.92": "https://plugins.jetbrains.com/files/7425/760442/WakaTime.jar"
"252.27397.133": "https://plugins.jetbrains.com/files/7425/760442/WakaTime.jar",
"252.27397.92": "https://plugins.jetbrains.com/files/7425/760442/WakaTime.jar",
"253.28294.88": "https://plugins.jetbrains.com/files/7425/760442/WakaTime.jar"
},
"name": "wakatime"
},
@@ -435,18 +435,18 @@
"webstorm"
],
"builds": {
"251.25410.129": "https://plugins.jetbrains.com/files/7499/875436/gittoolbox-600.1.12_243-signed.zip",
"252.26199.587": "https://plugins.jetbrains.com/files/7499/875436/gittoolbox-600.1.12_243-signed.zip",
"252.26830.46": "https://plugins.jetbrains.com/files/7499/875436/gittoolbox-600.1.12_243-signed.zip",
"252.27397.100": "https://plugins.jetbrains.com/files/7499/875436/gittoolbox-600.1.12_243-signed.zip",
"252.27397.103": "https://plugins.jetbrains.com/files/7499/875436/gittoolbox-600.1.12_243-signed.zip",
"252.27397.106": "https://plugins.jetbrains.com/files/7499/875436/gittoolbox-600.1.12_243-signed.zip",
"252.27397.109": "https://plugins.jetbrains.com/files/7499/875436/gittoolbox-600.1.12_243-signed.zip",
"252.27397.112": "https://plugins.jetbrains.com/files/7499/875436/gittoolbox-600.1.12_243-signed.zip",
"252.27397.114": "https://plugins.jetbrains.com/files/7499/875436/gittoolbox-600.1.12_243-signed.zip",
"252.27397.120": "https://plugins.jetbrains.com/files/7499/875436/gittoolbox-600.1.12_243-signed.zip",
"252.27397.121": "https://plugins.jetbrains.com/files/7499/875436/gittoolbox-600.1.12_243-signed.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/7499/875436/gittoolbox-600.1.12_243-signed.zip"
"251.25410.129": "https://plugins.jetbrains.com/files/7499/883982/gittoolbox-600.1.13_243-signed.zip",
"252.26199.587": "https://plugins.jetbrains.com/files/7499/883982/gittoolbox-600.1.13_243-signed.zip",
"252.26830.46": "https://plugins.jetbrains.com/files/7499/883982/gittoolbox-600.1.13_243-signed.zip",
"252.27397.100": "https://plugins.jetbrains.com/files/7499/883982/gittoolbox-600.1.13_243-signed.zip",
"252.27397.103": "https://plugins.jetbrains.com/files/7499/883982/gittoolbox-600.1.13_243-signed.zip",
"252.27397.106": "https://plugins.jetbrains.com/files/7499/883982/gittoolbox-600.1.13_243-signed.zip",
"252.27397.109": "https://plugins.jetbrains.com/files/7499/883982/gittoolbox-600.1.13_243-signed.zip",
"252.27397.112": "https://plugins.jetbrains.com/files/7499/883982/gittoolbox-600.1.13_243-signed.zip",
"252.27397.114": "https://plugins.jetbrains.com/files/7499/883982/gittoolbox-600.1.13_243-signed.zip",
"252.27397.133": "https://plugins.jetbrains.com/files/7499/883982/gittoolbox-600.1.13_243-signed.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/7499/883982/gittoolbox-600.1.13_243-signed.zip",
"253.28294.88": "https://plugins.jetbrains.com/files/7499/877840/gittoolbox-600.2.0_253-signed.zip"
},
"name": "gittoolbox"
},
@@ -469,15 +469,15 @@
"251.25410.129": null,
"252.26199.587": null,
"252.26830.46": "https://plugins.jetbrains.com/files/7724/871939/clouds-docker-impl-252.26830.99.zip",
"252.27397.100": "https://plugins.jetbrains.com/files/7724/882712/clouds-docker-impl-252.27397.112.zip",
"252.27397.103": "https://plugins.jetbrains.com/files/7724/882712/clouds-docker-impl-252.27397.112.zip",
"252.27397.106": "https://plugins.jetbrains.com/files/7724/882712/clouds-docker-impl-252.27397.112.zip",
"252.27397.109": "https://plugins.jetbrains.com/files/7724/882712/clouds-docker-impl-252.27397.112.zip",
"252.27397.112": "https://plugins.jetbrains.com/files/7724/882712/clouds-docker-impl-252.27397.112.zip",
"252.27397.114": "https://plugins.jetbrains.com/files/7724/882712/clouds-docker-impl-252.27397.112.zip",
"252.27397.120": "https://plugins.jetbrains.com/files/7724/882712/clouds-docker-impl-252.27397.112.zip",
"252.27397.121": "https://plugins.jetbrains.com/files/7724/882712/clouds-docker-impl-252.27397.112.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/7724/882712/clouds-docker-impl-252.27397.112.zip"
"252.27397.100": "https://plugins.jetbrains.com/files/7724/884806/clouds-docker-impl-252.27397.129.zip",
"252.27397.103": "https://plugins.jetbrains.com/files/7724/884806/clouds-docker-impl-252.27397.129.zip",
"252.27397.106": "https://plugins.jetbrains.com/files/7724/884806/clouds-docker-impl-252.27397.129.zip",
"252.27397.109": "https://plugins.jetbrains.com/files/7724/884806/clouds-docker-impl-252.27397.129.zip",
"252.27397.112": "https://plugins.jetbrains.com/files/7724/884806/clouds-docker-impl-252.27397.129.zip",
"252.27397.114": "https://plugins.jetbrains.com/files/7724/884806/clouds-docker-impl-252.27397.129.zip",
"252.27397.133": "https://plugins.jetbrains.com/files/7724/884806/clouds-docker-impl-252.27397.129.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/7724/884806/clouds-docker-impl-252.27397.129.zip",
"253.28294.88": "https://plugins.jetbrains.com/files/7724/891767/clouds-docker-impl-253.28294.90.zip"
},
"name": "docker"
},
@@ -506,9 +506,9 @@
"252.27397.109": "https://plugins.jetbrains.com/files/8097/827445/graphql-252.25557.23.zip",
"252.27397.112": "https://plugins.jetbrains.com/files/8097/827445/graphql-252.25557.23.zip",
"252.27397.114": "https://plugins.jetbrains.com/files/8097/827445/graphql-252.25557.23.zip",
"252.27397.120": "https://plugins.jetbrains.com/files/8097/827445/graphql-252.25557.23.zip",
"252.27397.121": "https://plugins.jetbrains.com/files/8097/827445/graphql-252.25557.23.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/8097/827445/graphql-252.25557.23.zip"
"252.27397.133": "https://plugins.jetbrains.com/files/8097/827445/graphql-252.25557.23.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/8097/827445/graphql-252.25557.23.zip",
"253.28294.88": "https://plugins.jetbrains.com/files/8097/889919/graphql-253.28294.51.zip"
},
"name": "graphql"
},
@@ -536,8 +536,8 @@
"252.27397.109": null,
"252.27397.112": null,
"252.27397.114": null,
"252.27397.121": null,
"252.27397.92": null
"252.27397.92": null,
"253.28294.88": null
},
"name": "-deprecated-rust"
},
@@ -565,8 +565,8 @@
"252.27397.109": null,
"252.27397.112": null,
"252.27397.114": null,
"252.27397.121": null,
"252.27397.92": null
"252.27397.92": null,
"253.28294.88": null
},
"name": "-deprecated-rust-beta"
},
@@ -595,9 +595,9 @@
"252.27397.109": "https://plugins.jetbrains.com/files/8195/882551/toml-252.27397.109.zip",
"252.27397.112": "https://plugins.jetbrains.com/files/8195/882551/toml-252.27397.109.zip",
"252.27397.114": "https://plugins.jetbrains.com/files/8195/882551/toml-252.27397.109.zip",
"252.27397.120": "https://plugins.jetbrains.com/files/8195/882551/toml-252.27397.109.zip",
"252.27397.121": "https://plugins.jetbrains.com/files/8195/882551/toml-252.27397.109.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/8195/882551/toml-252.27397.109.zip"
"252.27397.133": "https://plugins.jetbrains.com/files/8195/882551/toml-252.27397.109.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/8195/882551/toml-252.27397.109.zip",
"253.28294.88": "https://plugins.jetbrains.com/files/8195/891234/toml-253.28294.86.zip"
},
"name": "toml"
},
@@ -637,9 +637,9 @@
"252.27397.109": "https://plugins.jetbrains.com/files/8554/871926/featuresTrainer-252.26830.95.zip",
"252.27397.112": "https://plugins.jetbrains.com/files/8554/871926/featuresTrainer-252.26830.95.zip",
"252.27397.114": "https://plugins.jetbrains.com/files/8554/871926/featuresTrainer-252.26830.95.zip",
"252.27397.120": "https://plugins.jetbrains.com/files/8554/871926/featuresTrainer-252.26830.95.zip",
"252.27397.121": "https://plugins.jetbrains.com/files/8554/871926/featuresTrainer-252.26830.95.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/8554/871926/featuresTrainer-252.26830.95.zip"
"252.27397.133": "https://plugins.jetbrains.com/files/8554/871926/featuresTrainer-252.26830.95.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/8554/871926/featuresTrainer-252.26830.95.zip",
"253.28294.88": "https://plugins.jetbrains.com/files/8554/891759/featuresTrainer-253.28294.90.zip"
},
"name": "ide-features-trainer"
},
@@ -668,9 +668,9 @@
"252.27397.109": "https://plugins.jetbrains.com/files/8607/786671/NixIDEA-0.4.0.18.zip",
"252.27397.112": "https://plugins.jetbrains.com/files/8607/786671/NixIDEA-0.4.0.18.zip",
"252.27397.114": "https://plugins.jetbrains.com/files/8607/786671/NixIDEA-0.4.0.18.zip",
"252.27397.120": "https://plugins.jetbrains.com/files/8607/786671/NixIDEA-0.4.0.18.zip",
"252.27397.121": "https://plugins.jetbrains.com/files/8607/786671/NixIDEA-0.4.0.18.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/8607/786671/NixIDEA-0.4.0.18.zip"
"252.27397.133": "https://plugins.jetbrains.com/files/8607/786671/NixIDEA-0.4.0.18.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/8607/786671/NixIDEA-0.4.0.18.zip",
"253.28294.88": "https://plugins.jetbrains.com/files/8607/786671/NixIDEA-0.4.0.18.zip"
},
"name": "nixidea"
},
@@ -699,9 +699,9 @@
"252.27397.109": "https://plugins.jetbrains.com/files/9164/827451/gherkin-252.25557.23.zip",
"252.27397.112": "https://plugins.jetbrains.com/files/9164/827451/gherkin-252.25557.23.zip",
"252.27397.114": "https://plugins.jetbrains.com/files/9164/827451/gherkin-252.25557.23.zip",
"252.27397.120": "https://plugins.jetbrains.com/files/9164/827451/gherkin-252.25557.23.zip",
"252.27397.121": "https://plugins.jetbrains.com/files/9164/827451/gherkin-252.25557.23.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/9164/827451/gherkin-252.25557.23.zip"
"252.27397.133": "https://plugins.jetbrains.com/files/9164/827451/gherkin-252.25557.23.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/9164/827451/gherkin-252.25557.23.zip",
"253.28294.88": "https://plugins.jetbrains.com/files/9164/889873/gherkin-253.28294.51.zip"
},
"name": "gherkin"
},
@@ -730,9 +730,9 @@
"252.27397.109": "https://plugins.jetbrains.com/files/9525/796325/dotenv-252.23892.201.zip",
"252.27397.112": "https://plugins.jetbrains.com/files/9525/796325/dotenv-252.23892.201.zip",
"252.27397.114": "https://plugins.jetbrains.com/files/9525/796325/dotenv-252.23892.201.zip",
"252.27397.120": "https://plugins.jetbrains.com/files/9525/796325/dotenv-252.23892.201.zip",
"252.27397.121": "https://plugins.jetbrains.com/files/9525/796325/dotenv-252.23892.201.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/9525/796325/dotenv-252.23892.201.zip"
"252.27397.133": "https://plugins.jetbrains.com/files/9525/796325/dotenv-252.23892.201.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/9525/796325/dotenv-252.23892.201.zip",
"253.28294.88": "https://plugins.jetbrains.com/files/9525/889789/dotenv-253.28294.51.zip"
},
"name": "-env-files"
},
@@ -772,9 +772,9 @@
"252.27397.109": "https://plugins.jetbrains.com/files/9707/767822/ANSI_Highlighter_Premium-25.2.1.jar",
"252.27397.112": "https://plugins.jetbrains.com/files/9707/767822/ANSI_Highlighter_Premium-25.2.1.jar",
"252.27397.114": "https://plugins.jetbrains.com/files/9707/767822/ANSI_Highlighter_Premium-25.2.1.jar",
"252.27397.120": "https://plugins.jetbrains.com/files/9707/767822/ANSI_Highlighter_Premium-25.2.1.jar",
"252.27397.121": "https://plugins.jetbrains.com/files/9707/767822/ANSI_Highlighter_Premium-25.2.1.jar",
"252.27397.92": "https://plugins.jetbrains.com/files/9707/767822/ANSI_Highlighter_Premium-25.2.1.jar"
"252.27397.133": "https://plugins.jetbrains.com/files/9707/767822/ANSI_Highlighter_Premium-25.2.1.jar",
"252.27397.92": "https://plugins.jetbrains.com/files/9707/767822/ANSI_Highlighter_Premium-25.2.1.jar",
"253.28294.88": null
},
"name": "ansi-highlighter-premium"
},
@@ -803,9 +803,9 @@
"252.27397.109": "https://plugins.jetbrains.com/files/9792/633158/Key_Promoter_X-2024.2.2.zip",
"252.27397.112": "https://plugins.jetbrains.com/files/9792/633158/Key_Promoter_X-2024.2.2.zip",
"252.27397.114": "https://plugins.jetbrains.com/files/9792/633158/Key_Promoter_X-2024.2.2.zip",
"252.27397.120": "https://plugins.jetbrains.com/files/9792/633158/Key_Promoter_X-2024.2.2.zip",
"252.27397.121": "https://plugins.jetbrains.com/files/9792/633158/Key_Promoter_X-2024.2.2.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/9792/633158/Key_Promoter_X-2024.2.2.zip"
"252.27397.133": "https://plugins.jetbrains.com/files/9792/633158/Key_Promoter_X-2024.2.2.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/9792/633158/Key_Promoter_X-2024.2.2.zip",
"253.28294.88": "https://plugins.jetbrains.com/files/9792/633158/Key_Promoter_X-2024.2.2.zip"
},
"name": "key-promoter-x"
},
@@ -834,9 +834,9 @@
"252.27397.109": "https://plugins.jetbrains.com/files/9836/840770/intellij-randomness-3.4.2.zip",
"252.27397.112": "https://plugins.jetbrains.com/files/9836/840770/intellij-randomness-3.4.2.zip",
"252.27397.114": "https://plugins.jetbrains.com/files/9836/840770/intellij-randomness-3.4.2.zip",
"252.27397.120": "https://plugins.jetbrains.com/files/9836/840770/intellij-randomness-3.4.2.zip",
"252.27397.121": "https://plugins.jetbrains.com/files/9836/840770/intellij-randomness-3.4.2.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/9836/840770/intellij-randomness-3.4.2.zip"
"252.27397.133": "https://plugins.jetbrains.com/files/9836/840770/intellij-randomness-3.4.2.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/9836/840770/intellij-randomness-3.4.2.zip",
"253.28294.88": "https://plugins.jetbrains.com/files/9836/840770/intellij-randomness-3.4.2.zip"
},
"name": "randomness"
},
@@ -865,9 +865,9 @@
"252.27397.109": "https://plugins.jetbrains.com/files/10037/851933/intellij-csv-validator-4.1.0.zip",
"252.27397.112": "https://plugins.jetbrains.com/files/10037/851933/intellij-csv-validator-4.1.0.zip",
"252.27397.114": "https://plugins.jetbrains.com/files/10037/851933/intellij-csv-validator-4.1.0.zip",
"252.27397.120": "https://plugins.jetbrains.com/files/10037/851933/intellij-csv-validator-4.1.0.zip",
"252.27397.121": "https://plugins.jetbrains.com/files/10037/851933/intellij-csv-validator-4.1.0.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/10037/851933/intellij-csv-validator-4.1.0.zip"
"252.27397.133": "https://plugins.jetbrains.com/files/10037/851933/intellij-csv-validator-4.1.0.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/10037/851933/intellij-csv-validator-4.1.0.zip",
"253.28294.88": "https://plugins.jetbrains.com/files/10037/851933/intellij-csv-validator-4.1.0.zip"
},
"name": "csv-editor"
},
@@ -887,18 +887,18 @@
"webstorm"
],
"builds": {
"251.25410.129": "https://plugins.jetbrains.com/files/10080/867937/intellij-rainbow-brackets-2025.3.5.zip",
"252.26199.587": "https://plugins.jetbrains.com/files/10080/867937/intellij-rainbow-brackets-2025.3.5.zip",
"252.26830.46": "https://plugins.jetbrains.com/files/10080/867937/intellij-rainbow-brackets-2025.3.5.zip",
"252.27397.100": "https://plugins.jetbrains.com/files/10080/867937/intellij-rainbow-brackets-2025.3.5.zip",
"252.27397.103": "https://plugins.jetbrains.com/files/10080/867937/intellij-rainbow-brackets-2025.3.5.zip",
"252.27397.106": "https://plugins.jetbrains.com/files/10080/867937/intellij-rainbow-brackets-2025.3.5.zip",
"252.27397.109": "https://plugins.jetbrains.com/files/10080/867937/intellij-rainbow-brackets-2025.3.5.zip",
"252.27397.112": "https://plugins.jetbrains.com/files/10080/867937/intellij-rainbow-brackets-2025.3.5.zip",
"252.27397.114": "https://plugins.jetbrains.com/files/10080/867937/intellij-rainbow-brackets-2025.3.5.zip",
"252.27397.120": "https://plugins.jetbrains.com/files/10080/867937/intellij-rainbow-brackets-2025.3.5.zip",
"252.27397.121": "https://plugins.jetbrains.com/files/10080/867937/intellij-rainbow-brackets-2025.3.5.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/10080/867937/intellij-rainbow-brackets-2025.3.5.zip"
"251.25410.129": "https://plugins.jetbrains.com/files/10080/887330/intellij-rainbow-brackets-2025.3.6.zip",
"252.26199.587": "https://plugins.jetbrains.com/files/10080/887330/intellij-rainbow-brackets-2025.3.6.zip",
"252.26830.46": "https://plugins.jetbrains.com/files/10080/887330/intellij-rainbow-brackets-2025.3.6.zip",
"252.27397.100": "https://plugins.jetbrains.com/files/10080/887330/intellij-rainbow-brackets-2025.3.6.zip",
"252.27397.103": "https://plugins.jetbrains.com/files/10080/887330/intellij-rainbow-brackets-2025.3.6.zip",
"252.27397.106": "https://plugins.jetbrains.com/files/10080/887330/intellij-rainbow-brackets-2025.3.6.zip",
"252.27397.109": "https://plugins.jetbrains.com/files/10080/887330/intellij-rainbow-brackets-2025.3.6.zip",
"252.27397.112": "https://plugins.jetbrains.com/files/10080/887330/intellij-rainbow-brackets-2025.3.6.zip",
"252.27397.114": "https://plugins.jetbrains.com/files/10080/887330/intellij-rainbow-brackets-2025.3.6.zip",
"252.27397.133": "https://plugins.jetbrains.com/files/10080/887330/intellij-rainbow-brackets-2025.3.6.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/10080/887330/intellij-rainbow-brackets-2025.3.6.zip",
"253.28294.88": "https://plugins.jetbrains.com/files/10080/887330/intellij-rainbow-brackets-2025.3.6.zip"
},
"name": "rainbow-brackets"
},
@@ -927,9 +927,9 @@
"252.27397.109": "https://plugins.jetbrains.com/files/10312/581013/dotplugin-1.5.4.zip",
"252.27397.112": "https://plugins.jetbrains.com/files/10312/581013/dotplugin-1.5.4.zip",
"252.27397.114": "https://plugins.jetbrains.com/files/10312/581013/dotplugin-1.5.4.zip",
"252.27397.120": "https://plugins.jetbrains.com/files/10312/581013/dotplugin-1.5.4.zip",
"252.27397.121": "https://plugins.jetbrains.com/files/10312/581013/dotplugin-1.5.4.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/10312/581013/dotplugin-1.5.4.zip"
"252.27397.133": "https://plugins.jetbrains.com/files/10312/581013/dotplugin-1.5.4.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/10312/581013/dotplugin-1.5.4.zip",
"253.28294.88": "https://plugins.jetbrains.com/files/10312/581013/dotplugin-1.5.4.zip"
},
"name": "dot-language"
},
@@ -958,9 +958,9 @@
"252.27397.109": "https://plugins.jetbrains.com/files/10481/671222/intellij-hocon-2025.1.0.zip",
"252.27397.112": "https://plugins.jetbrains.com/files/10481/671222/intellij-hocon-2025.1.0.zip",
"252.27397.114": "https://plugins.jetbrains.com/files/10481/671222/intellij-hocon-2025.1.0.zip",
"252.27397.120": "https://plugins.jetbrains.com/files/10481/671222/intellij-hocon-2025.1.0.zip",
"252.27397.121": "https://plugins.jetbrains.com/files/10481/671222/intellij-hocon-2025.1.0.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/10481/671222/intellij-hocon-2025.1.0.zip"
"252.27397.133": "https://plugins.jetbrains.com/files/10481/671222/intellij-hocon-2025.1.0.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/10481/671222/intellij-hocon-2025.1.0.zip",
"253.28294.88": "https://plugins.jetbrains.com/files/10481/671222/intellij-hocon-2025.1.0.zip"
},
"name": "hocon"
},
@@ -987,9 +987,9 @@
"252.27397.109": "https://plugins.jetbrains.com/files/10581/796391/go-template-252.23892.201.zip",
"252.27397.112": "https://plugins.jetbrains.com/files/10581/796391/go-template-252.23892.201.zip",
"252.27397.114": "https://plugins.jetbrains.com/files/10581/796391/go-template-252.23892.201.zip",
"252.27397.120": "https://plugins.jetbrains.com/files/10581/796391/go-template-252.23892.201.zip",
"252.27397.121": "https://plugins.jetbrains.com/files/10581/796391/go-template-252.23892.201.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/10581/796391/go-template-252.23892.201.zip"
"252.27397.133": "https://plugins.jetbrains.com/files/10581/796391/go-template-252.23892.201.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/10581/796391/go-template-252.23892.201.zip",
"253.28294.88": "https://plugins.jetbrains.com/files/10581/889752/go-template-253.28294.51.zip"
},
"name": "go-template"
},
@@ -1018,9 +1018,9 @@
"252.27397.109": "https://plugins.jetbrains.com/files/11058/878842/Extra_Icons-2025.1.16.zip",
"252.27397.112": "https://plugins.jetbrains.com/files/11058/878842/Extra_Icons-2025.1.16.zip",
"252.27397.114": "https://plugins.jetbrains.com/files/11058/878842/Extra_Icons-2025.1.16.zip",
"252.27397.120": "https://plugins.jetbrains.com/files/11058/878842/Extra_Icons-2025.1.16.zip",
"252.27397.121": "https://plugins.jetbrains.com/files/11058/878842/Extra_Icons-2025.1.16.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/11058/878842/Extra_Icons-2025.1.16.zip"
"252.27397.133": "https://plugins.jetbrains.com/files/11058/878842/Extra_Icons-2025.1.16.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/11058/878842/Extra_Icons-2025.1.16.zip",
"253.28294.88": "https://plugins.jetbrains.com/files/11058/878842/Extra_Icons-2025.1.16.zip"
},
"name": "extra-icons"
},
@@ -1049,9 +1049,9 @@
"252.27397.109": "https://plugins.jetbrains.com/files/11349/879071/aws-toolkit-jetbrains-standalone-3.97.252.zip",
"252.27397.112": "https://plugins.jetbrains.com/files/11349/879071/aws-toolkit-jetbrains-standalone-3.97.252.zip",
"252.27397.114": "https://plugins.jetbrains.com/files/11349/879071/aws-toolkit-jetbrains-standalone-3.97.252.zip",
"252.27397.120": "https://plugins.jetbrains.com/files/11349/879071/aws-toolkit-jetbrains-standalone-3.97.252.zip",
"252.27397.121": "https://plugins.jetbrains.com/files/11349/879071/aws-toolkit-jetbrains-standalone-3.97.252.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/11349/879071/aws-toolkit-jetbrains-standalone-3.97.252.zip"
"252.27397.133": "https://plugins.jetbrains.com/files/11349/879071/aws-toolkit-jetbrains-standalone-3.97.252.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/11349/879071/aws-toolkit-jetbrains-standalone-3.97.252.zip",
"253.28294.88": null
},
"name": "aws-toolkit"
},
@@ -1060,7 +1060,7 @@
"rider"
],
"builds": {
"252.27397.121": "https://plugins.jetbrains.com/files/12024/834783/ReSharperPlugin.CognitiveComplexity-2025.2.0.zip"
"253.28294.88": "https://plugins.jetbrains.com/files/12024/834783/ReSharperPlugin.CognitiveComplexity-2025.2.0.zip"
},
"name": "cognitivecomplexity"
},
@@ -1089,9 +1089,9 @@
"252.27397.109": "https://plugins.jetbrains.com/files/12062/796429/keymap-vscode-252.23892.201.zip",
"252.27397.112": "https://plugins.jetbrains.com/files/12062/796429/keymap-vscode-252.23892.201.zip",
"252.27397.114": "https://plugins.jetbrains.com/files/12062/796429/keymap-vscode-252.23892.201.zip",
"252.27397.120": "https://plugins.jetbrains.com/files/12062/796429/keymap-vscode-252.23892.201.zip",
"252.27397.121": "https://plugins.jetbrains.com/files/12062/796429/keymap-vscode-252.23892.201.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/12062/796429/keymap-vscode-252.23892.201.zip"
"252.27397.133": "https://plugins.jetbrains.com/files/12062/796429/keymap-vscode-252.23892.201.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/12062/796429/keymap-vscode-252.23892.201.zip",
"253.28294.88": "https://plugins.jetbrains.com/files/12062/889778/keymap-vscode-253.28294.51.zip"
},
"name": "vscode-keymap"
},
@@ -1120,9 +1120,9 @@
"252.27397.109": "https://plugins.jetbrains.com/files/12559/796343/keymap-eclipse-252.23892.201.zip",
"252.27397.112": "https://plugins.jetbrains.com/files/12559/796343/keymap-eclipse-252.23892.201.zip",
"252.27397.114": "https://plugins.jetbrains.com/files/12559/796343/keymap-eclipse-252.23892.201.zip",
"252.27397.120": "https://plugins.jetbrains.com/files/12559/796343/keymap-eclipse-252.23892.201.zip",
"252.27397.121": "https://plugins.jetbrains.com/files/12559/796343/keymap-eclipse-252.23892.201.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/12559/796343/keymap-eclipse-252.23892.201.zip"
"252.27397.133": "https://plugins.jetbrains.com/files/12559/796343/keymap-eclipse-252.23892.201.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/12559/796343/keymap-eclipse-252.23892.201.zip",
"253.28294.88": "https://plugins.jetbrains.com/files/12559/891762/keymap-eclipse-253.28294.90.zip"
},
"name": "eclipse-keymap"
},
@@ -1151,9 +1151,9 @@
"252.27397.109": "https://plugins.jetbrains.com/files/12896/173977/RainbowCSV.zip",
"252.27397.112": "https://plugins.jetbrains.com/files/12896/173977/RainbowCSV.zip",
"252.27397.114": "https://plugins.jetbrains.com/files/12896/173977/RainbowCSV.zip",
"252.27397.120": "https://plugins.jetbrains.com/files/12896/173977/RainbowCSV.zip",
"252.27397.121": "https://plugins.jetbrains.com/files/12896/173977/RainbowCSV.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/12896/173977/RainbowCSV.zip"
"252.27397.133": "https://plugins.jetbrains.com/files/12896/173977/RainbowCSV.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/12896/173977/RainbowCSV.zip",
"253.28294.88": "https://plugins.jetbrains.com/files/12896/173977/RainbowCSV.zip"
},
"name": "rainbow-csv"
},
@@ -1182,9 +1182,9 @@
"252.27397.109": "https://plugins.jetbrains.com/files/13017/796396/keymap-visualStudio-252.23892.201.zip",
"252.27397.112": "https://plugins.jetbrains.com/files/13017/796396/keymap-visualStudio-252.23892.201.zip",
"252.27397.114": "https://plugins.jetbrains.com/files/13017/796396/keymap-visualStudio-252.23892.201.zip",
"252.27397.120": "https://plugins.jetbrains.com/files/13017/796396/keymap-visualStudio-252.23892.201.zip",
"252.27397.121": "https://plugins.jetbrains.com/files/13017/796396/keymap-visualStudio-252.23892.201.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/13017/796396/keymap-visualStudio-252.23892.201.zip"
"252.27397.133": "https://plugins.jetbrains.com/files/13017/796396/keymap-visualStudio-252.23892.201.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/13017/796396/keymap-visualStudio-252.23892.201.zip",
"253.28294.88": "https://plugins.jetbrains.com/files/13017/891738/keymap-visualStudio-253.28294.90.zip"
},
"name": "visual-studio-keymap"
},
@@ -1213,9 +1213,9 @@
"252.27397.109": "https://plugins.jetbrains.com/files/13308/370912/Indent_Rainbow-2.2.0-signed.zip",
"252.27397.112": "https://plugins.jetbrains.com/files/13308/370912/Indent_Rainbow-2.2.0-signed.zip",
"252.27397.114": "https://plugins.jetbrains.com/files/13308/370912/Indent_Rainbow-2.2.0-signed.zip",
"252.27397.120": "https://plugins.jetbrains.com/files/13308/370912/Indent_Rainbow-2.2.0-signed.zip",
"252.27397.121": "https://plugins.jetbrains.com/files/13308/370912/Indent_Rainbow-2.2.0-signed.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/13308/370912/Indent_Rainbow-2.2.0-signed.zip"
"252.27397.133": "https://plugins.jetbrains.com/files/13308/370912/Indent_Rainbow-2.2.0-signed.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/13308/370912/Indent_Rainbow-2.2.0-signed.zip",
"253.28294.88": "https://plugins.jetbrains.com/files/13308/370912/Indent_Rainbow-2.2.0-signed.zip"
},
"name": "indent-rainbow"
},
@@ -1244,9 +1244,9 @@
"252.27397.109": "https://plugins.jetbrains.com/files/14004/796340/protoeditor-252.23892.201.zip",
"252.27397.112": "https://plugins.jetbrains.com/files/14004/796340/protoeditor-252.23892.201.zip",
"252.27397.114": "https://plugins.jetbrains.com/files/14004/796340/protoeditor-252.23892.201.zip",
"252.27397.120": "https://plugins.jetbrains.com/files/14004/796340/protoeditor-252.23892.201.zip",
"252.27397.121": "https://plugins.jetbrains.com/files/14004/796340/protoeditor-252.23892.201.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/14004/796340/protoeditor-252.23892.201.zip"
"252.27397.133": "https://plugins.jetbrains.com/files/14004/796340/protoeditor-252.23892.201.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/14004/796340/protoeditor-252.23892.201.zip",
"253.28294.88": "https://plugins.jetbrains.com/files/14004/891226/protoeditor-253.28294.86.zip"
},
"name": "protocol-buffers"
},
@@ -1275,9 +1275,9 @@
"252.27397.109": "https://plugins.jetbrains.com/files/14059/82616/darcula-pitch-black.jar",
"252.27397.112": "https://plugins.jetbrains.com/files/14059/82616/darcula-pitch-black.jar",
"252.27397.114": "https://plugins.jetbrains.com/files/14059/82616/darcula-pitch-black.jar",
"252.27397.120": "https://plugins.jetbrains.com/files/14059/82616/darcula-pitch-black.jar",
"252.27397.121": "https://plugins.jetbrains.com/files/14059/82616/darcula-pitch-black.jar",
"252.27397.92": "https://plugins.jetbrains.com/files/14059/82616/darcula-pitch-black.jar"
"252.27397.133": "https://plugins.jetbrains.com/files/14059/82616/darcula-pitch-black.jar",
"252.27397.92": "https://plugins.jetbrains.com/files/14059/82616/darcula-pitch-black.jar",
"253.28294.88": "https://plugins.jetbrains.com/files/14059/82616/darcula-pitch-black.jar"
},
"name": "darcula-pitch-black"
},
@@ -1306,9 +1306,9 @@
"252.27397.109": "https://plugins.jetbrains.com/files/14708/475401/MarioProgressBar-1.9.jar",
"252.27397.112": "https://plugins.jetbrains.com/files/14708/475401/MarioProgressBar-1.9.jar",
"252.27397.114": "https://plugins.jetbrains.com/files/14708/475401/MarioProgressBar-1.9.jar",
"252.27397.120": "https://plugins.jetbrains.com/files/14708/475401/MarioProgressBar-1.9.jar",
"252.27397.121": "https://plugins.jetbrains.com/files/14708/475401/MarioProgressBar-1.9.jar",
"252.27397.92": "https://plugins.jetbrains.com/files/14708/475401/MarioProgressBar-1.9.jar"
"252.27397.133": "https://plugins.jetbrains.com/files/14708/475401/MarioProgressBar-1.9.jar",
"252.27397.92": "https://plugins.jetbrains.com/files/14708/475401/MarioProgressBar-1.9.jar",
"253.28294.88": "https://plugins.jetbrains.com/files/14708/475401/MarioProgressBar-1.9.jar"
},
"name": "mario-progress-bar"
},
@@ -1337,9 +1337,9 @@
"252.27397.109": "https://plugins.jetbrains.com/files/15976/851109/IDEA_Which-Key-0.11.2.jar",
"252.27397.112": "https://plugins.jetbrains.com/files/15976/851109/IDEA_Which-Key-0.11.2.jar",
"252.27397.114": "https://plugins.jetbrains.com/files/15976/851109/IDEA_Which-Key-0.11.2.jar",
"252.27397.120": "https://plugins.jetbrains.com/files/15976/851109/IDEA_Which-Key-0.11.2.jar",
"252.27397.121": "https://plugins.jetbrains.com/files/15976/851109/IDEA_Which-Key-0.11.2.jar",
"252.27397.92": "https://plugins.jetbrains.com/files/15976/851109/IDEA_Which-Key-0.11.2.jar"
"252.27397.133": "https://plugins.jetbrains.com/files/15976/851109/IDEA_Which-Key-0.11.2.jar",
"252.27397.92": "https://plugins.jetbrains.com/files/15976/851109/IDEA_Which-Key-0.11.2.jar",
"253.28294.88": "https://plugins.jetbrains.com/files/15976/851109/IDEA_Which-Key-0.11.2.jar"
},
"name": "which-key"
},
@@ -1368,9 +1368,9 @@
"252.27397.109": "https://plugins.jetbrains.com/files/16604/878839/Extra_ToolWindow_Colorful_Icons_Subscription-2025.1.15.zip",
"252.27397.112": "https://plugins.jetbrains.com/files/16604/878839/Extra_ToolWindow_Colorful_Icons_Subscription-2025.1.15.zip",
"252.27397.114": "https://plugins.jetbrains.com/files/16604/878839/Extra_ToolWindow_Colorful_Icons_Subscription-2025.1.15.zip",
"252.27397.120": "https://plugins.jetbrains.com/files/16604/878839/Extra_ToolWindow_Colorful_Icons_Subscription-2025.1.15.zip",
"252.27397.121": "https://plugins.jetbrains.com/files/16604/878839/Extra_ToolWindow_Colorful_Icons_Subscription-2025.1.15.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/16604/878839/Extra_ToolWindow_Colorful_Icons_Subscription-2025.1.15.zip"
"252.27397.133": "https://plugins.jetbrains.com/files/16604/878839/Extra_ToolWindow_Colorful_Icons_Subscription-2025.1.15.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/16604/878839/Extra_ToolWindow_Colorful_Icons_Subscription-2025.1.15.zip",
"253.28294.88": "https://plugins.jetbrains.com/files/16604/878839/Extra_ToolWindow_Colorful_Icons_Subscription-2025.1.15.zip"
},
"name": "extra-toolwindow-colorful-icons"
},
@@ -1399,11 +1399,11 @@
"252.27397.109": "https://plugins.jetbrains.com/files/17718/882517/github-copilot-intellij-1.5.59-243.zip",
"252.27397.112": "https://plugins.jetbrains.com/files/17718/882517/github-copilot-intellij-1.5.59-243.zip",
"252.27397.114": "https://plugins.jetbrains.com/files/17718/882517/github-copilot-intellij-1.5.59-243.zip",
"252.27397.120": "https://plugins.jetbrains.com/files/17718/882517/github-copilot-intellij-1.5.59-243.zip",
"252.27397.121": "https://plugins.jetbrains.com/files/17718/882517/github-copilot-intellij-1.5.59-243.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/17718/882517/github-copilot-intellij-1.5.59-243.zip"
"252.27397.133": "https://plugins.jetbrains.com/files/17718/882517/github-copilot-intellij-1.5.59-243.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/17718/882517/github-copilot-intellij-1.5.59-243.zip",
"253.28294.88": "https://plugins.jetbrains.com/files/17718/882517/github-copilot-intellij-1.5.59-243.zip"
},
"name": "github-copilot"
"name": "github-copilot--your-ai-pair-programmer"
},
"18444": {
"compatible": [
@@ -1430,9 +1430,9 @@
"252.27397.109": "https://plugins.jetbrains.com/files/18444/165585/NetBeans6.5Keymap.zip",
"252.27397.112": "https://plugins.jetbrains.com/files/18444/165585/NetBeans6.5Keymap.zip",
"252.27397.114": "https://plugins.jetbrains.com/files/18444/165585/NetBeans6.5Keymap.zip",
"252.27397.120": "https://plugins.jetbrains.com/files/18444/165585/NetBeans6.5Keymap.zip",
"252.27397.121": "https://plugins.jetbrains.com/files/18444/165585/NetBeans6.5Keymap.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/18444/165585/NetBeans6.5Keymap.zip"
"252.27397.133": "https://plugins.jetbrains.com/files/18444/165585/NetBeans6.5Keymap.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/18444/165585/NetBeans6.5Keymap.zip",
"253.28294.88": "https://plugins.jetbrains.com/files/18444/165585/NetBeans6.5Keymap.zip"
},
"name": "netbeans-6-5-keymap"
},
@@ -1461,9 +1461,9 @@
"252.27397.109": "https://plugins.jetbrains.com/files/18682/864736/Catppuccin_Theme-3.5.2.zip",
"252.27397.112": "https://plugins.jetbrains.com/files/18682/864736/Catppuccin_Theme-3.5.2.zip",
"252.27397.114": "https://plugins.jetbrains.com/files/18682/864736/Catppuccin_Theme-3.5.2.zip",
"252.27397.120": "https://plugins.jetbrains.com/files/18682/864736/Catppuccin_Theme-3.5.2.zip",
"252.27397.121": "https://plugins.jetbrains.com/files/18682/864736/Catppuccin_Theme-3.5.2.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/18682/864736/Catppuccin_Theme-3.5.2.zip"
"252.27397.133": "https://plugins.jetbrains.com/files/18682/864736/Catppuccin_Theme-3.5.2.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/18682/864736/Catppuccin_Theme-3.5.2.zip",
"253.28294.88": "https://plugins.jetbrains.com/files/18682/864736/Catppuccin_Theme-3.5.2.zip"
},
"name": "catppuccin-theme"
},
@@ -1483,18 +1483,18 @@
"webstorm"
],
"builds": {
"251.25410.129": "https://plugins.jetbrains.com/files/18824/865849/CodeGlancePro-2.0.0-signed.zip",
"252.26199.587": "https://plugins.jetbrains.com/files/18824/865849/CodeGlancePro-2.0.0-signed.zip",
"252.26830.46": "https://plugins.jetbrains.com/files/18824/865849/CodeGlancePro-2.0.0-signed.zip",
"252.27397.100": "https://plugins.jetbrains.com/files/18824/865849/CodeGlancePro-2.0.0-signed.zip",
"252.27397.103": "https://plugins.jetbrains.com/files/18824/865849/CodeGlancePro-2.0.0-signed.zip",
"252.27397.106": "https://plugins.jetbrains.com/files/18824/865849/CodeGlancePro-2.0.0-signed.zip",
"252.27397.109": "https://plugins.jetbrains.com/files/18824/865849/CodeGlancePro-2.0.0-signed.zip",
"252.27397.112": "https://plugins.jetbrains.com/files/18824/865849/CodeGlancePro-2.0.0-signed.zip",
"252.27397.114": "https://plugins.jetbrains.com/files/18824/865849/CodeGlancePro-2.0.0-signed.zip",
"252.27397.120": "https://plugins.jetbrains.com/files/18824/865849/CodeGlancePro-2.0.0-signed.zip",
"252.27397.121": "https://plugins.jetbrains.com/files/18824/865849/CodeGlancePro-2.0.0-signed.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/18824/865849/CodeGlancePro-2.0.0-signed.zip"
"251.25410.129": "https://plugins.jetbrains.com/files/18824/887070/CodeGlancePro-2.0.1-signed.zip",
"252.26199.587": "https://plugins.jetbrains.com/files/18824/887070/CodeGlancePro-2.0.1-signed.zip",
"252.26830.46": "https://plugins.jetbrains.com/files/18824/887070/CodeGlancePro-2.0.1-signed.zip",
"252.27397.100": "https://plugins.jetbrains.com/files/18824/887070/CodeGlancePro-2.0.1-signed.zip",
"252.27397.103": "https://plugins.jetbrains.com/files/18824/887070/CodeGlancePro-2.0.1-signed.zip",
"252.27397.106": "https://plugins.jetbrains.com/files/18824/887070/CodeGlancePro-2.0.1-signed.zip",
"252.27397.109": "https://plugins.jetbrains.com/files/18824/887070/CodeGlancePro-2.0.1-signed.zip",
"252.27397.112": "https://plugins.jetbrains.com/files/18824/887070/CodeGlancePro-2.0.1-signed.zip",
"252.27397.114": "https://plugins.jetbrains.com/files/18824/887070/CodeGlancePro-2.0.1-signed.zip",
"252.27397.133": "https://plugins.jetbrains.com/files/18824/887070/CodeGlancePro-2.0.1-signed.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/18824/887070/CodeGlancePro-2.0.1-signed.zip",
"253.28294.88": "https://plugins.jetbrains.com/files/18824/887070/CodeGlancePro-2.0.1-signed.zip"
},
"name": "codeglance-pro"
},
@@ -1514,18 +1514,18 @@
"webstorm"
],
"builds": {
"251.25410.129": "https://plugins.jetbrains.com/files/18922/881168/GerryThemes.jar",
"252.26199.587": "https://plugins.jetbrains.com/files/18922/881168/GerryThemes.jar",
"252.26830.46": "https://plugins.jetbrains.com/files/18922/881168/GerryThemes.jar",
"252.27397.100": "https://plugins.jetbrains.com/files/18922/881168/GerryThemes.jar",
"252.27397.103": "https://plugins.jetbrains.com/files/18922/881168/GerryThemes.jar",
"252.27397.106": "https://plugins.jetbrains.com/files/18922/881168/GerryThemes.jar",
"252.27397.109": "https://plugins.jetbrains.com/files/18922/881168/GerryThemes.jar",
"252.27397.112": "https://plugins.jetbrains.com/files/18922/881168/GerryThemes.jar",
"252.27397.114": "https://plugins.jetbrains.com/files/18922/881168/GerryThemes.jar",
"252.27397.120": "https://plugins.jetbrains.com/files/18922/881168/GerryThemes.jar",
"252.27397.121": "https://plugins.jetbrains.com/files/18922/881168/GerryThemes.jar",
"252.27397.92": "https://plugins.jetbrains.com/files/18922/881168/GerryThemes.jar"
"251.25410.129": "https://plugins.jetbrains.com/files/18922/891154/GerryThemes.jar",
"252.26199.587": "https://plugins.jetbrains.com/files/18922/891154/GerryThemes.jar",
"252.26830.46": "https://plugins.jetbrains.com/files/18922/891154/GerryThemes.jar",
"252.27397.100": "https://plugins.jetbrains.com/files/18922/891154/GerryThemes.jar",
"252.27397.103": "https://plugins.jetbrains.com/files/18922/891154/GerryThemes.jar",
"252.27397.106": "https://plugins.jetbrains.com/files/18922/891154/GerryThemes.jar",
"252.27397.109": "https://plugins.jetbrains.com/files/18922/891154/GerryThemes.jar",
"252.27397.112": "https://plugins.jetbrains.com/files/18922/891154/GerryThemes.jar",
"252.27397.114": "https://plugins.jetbrains.com/files/18922/891154/GerryThemes.jar",
"252.27397.133": "https://plugins.jetbrains.com/files/18922/891154/GerryThemes.jar",
"252.27397.92": "https://plugins.jetbrains.com/files/18922/891154/GerryThemes.jar",
"253.28294.88": "https://plugins.jetbrains.com/files/18922/891154/GerryThemes.jar"
},
"name": "gerry-themes"
},
@@ -1554,9 +1554,9 @@
"252.27397.109": "https://plugins.jetbrains.com/files/19275/355572/better_direnv-1.2.2-signed.zip",
"252.27397.112": "https://plugins.jetbrains.com/files/19275/355572/better_direnv-1.2.2-signed.zip",
"252.27397.114": "https://plugins.jetbrains.com/files/19275/355572/better_direnv-1.2.2-signed.zip",
"252.27397.120": "https://plugins.jetbrains.com/files/19275/355572/better_direnv-1.2.2-signed.zip",
"252.27397.121": "https://plugins.jetbrains.com/files/19275/355572/better_direnv-1.2.2-signed.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/19275/355572/better_direnv-1.2.2-signed.zip"
"252.27397.133": "https://plugins.jetbrains.com/files/19275/355572/better_direnv-1.2.2-signed.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/19275/355572/better_direnv-1.2.2-signed.zip",
"253.28294.88": "https://plugins.jetbrains.com/files/19275/355572/better_direnv-1.2.2-signed.zip"
},
"name": "better-direnv"
},
@@ -1585,9 +1585,9 @@
"252.27397.109": "https://plugins.jetbrains.com/files/20146/811306/Mermaid-0.0.26_IJ.252.zip",
"252.27397.112": "https://plugins.jetbrains.com/files/20146/811306/Mermaid-0.0.26_IJ.252.zip",
"252.27397.114": "https://plugins.jetbrains.com/files/20146/811306/Mermaid-0.0.26_IJ.252.zip",
"252.27397.120": "https://plugins.jetbrains.com/files/20146/811306/Mermaid-0.0.26_IJ.252.zip",
"252.27397.121": "https://plugins.jetbrains.com/files/20146/811306/Mermaid-0.0.26_IJ.252.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/20146/811306/Mermaid-0.0.26_IJ.252.zip"
"252.27397.133": "https://plugins.jetbrains.com/files/20146/811306/Mermaid-0.0.26_IJ.252.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/20146/811306/Mermaid-0.0.26_IJ.252.zip",
"253.28294.88": "https://plugins.jetbrains.com/files/20146/811306/Mermaid-0.0.26_IJ.252.zip"
},
"name": "mermaid"
},
@@ -1616,9 +1616,9 @@
"252.27397.109": "https://plugins.jetbrains.com/files/21551/323564/ferris-2021.1.zip",
"252.27397.112": "https://plugins.jetbrains.com/files/21551/323564/ferris-2021.1.zip",
"252.27397.114": "https://plugins.jetbrains.com/files/21551/323564/ferris-2021.1.zip",
"252.27397.120": "https://plugins.jetbrains.com/files/21551/323564/ferris-2021.1.zip",
"252.27397.121": "https://plugins.jetbrains.com/files/21551/323564/ferris-2021.1.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/21551/323564/ferris-2021.1.zip"
"252.27397.133": "https://plugins.jetbrains.com/files/21551/323564/ferris-2021.1.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/21551/323564/ferris-2021.1.zip",
"253.28294.88": "https://plugins.jetbrains.com/files/21551/323564/ferris-2021.1.zip"
},
"name": "ferris"
},
@@ -1647,9 +1647,9 @@
"252.27397.109": "https://plugins.jetbrains.com/files/21667/818221/code-complexity-plugin-1.6.3.zip",
"252.27397.112": "https://plugins.jetbrains.com/files/21667/818221/code-complexity-plugin-1.6.3.zip",
"252.27397.114": "https://plugins.jetbrains.com/files/21667/818221/code-complexity-plugin-1.6.3.zip",
"252.27397.120": "https://plugins.jetbrains.com/files/21667/818221/code-complexity-plugin-1.6.3.zip",
"252.27397.121": "https://plugins.jetbrains.com/files/21667/818221/code-complexity-plugin-1.6.3.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/21667/818221/code-complexity-plugin-1.6.3.zip"
"252.27397.133": "https://plugins.jetbrains.com/files/21667/818221/code-complexity-plugin-1.6.3.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/21667/818221/code-complexity-plugin-1.6.3.zip",
"253.28294.88": null
},
"name": "code-complexity"
},
@@ -1678,9 +1678,9 @@
"252.27397.109": "https://plugins.jetbrains.com/files/21904/744652/intellij-developer-tools-plugin-7.1.0-signed.zip",
"252.27397.112": "https://plugins.jetbrains.com/files/21904/744652/intellij-developer-tools-plugin-7.1.0-signed.zip",
"252.27397.114": "https://plugins.jetbrains.com/files/21904/744652/intellij-developer-tools-plugin-7.1.0-signed.zip",
"252.27397.120": "https://plugins.jetbrains.com/files/21904/744652/intellij-developer-tools-plugin-7.1.0-signed.zip",
"252.27397.121": "https://plugins.jetbrains.com/files/21904/744652/intellij-developer-tools-plugin-7.1.0-signed.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/21904/744652/intellij-developer-tools-plugin-7.1.0-signed.zip"
"252.27397.133": "https://plugins.jetbrains.com/files/21904/744652/intellij-developer-tools-plugin-7.1.0-signed.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/21904/744652/intellij-developer-tools-plugin-7.1.0-signed.zip",
"253.28294.88": "https://plugins.jetbrains.com/files/21904/744652/intellij-developer-tools-plugin-7.1.0-signed.zip"
},
"name": "developer-tools"
},
@@ -1701,9 +1701,9 @@
"252.27397.109": "https://plugins.jetbrains.com/files/21962/828479/clouds-docker-gateway-252.25557.34.zip",
"252.27397.112": "https://plugins.jetbrains.com/files/21962/828479/clouds-docker-gateway-252.25557.34.zip",
"252.27397.114": "https://plugins.jetbrains.com/files/21962/828479/clouds-docker-gateway-252.25557.34.zip",
"252.27397.120": "https://plugins.jetbrains.com/files/21962/828479/clouds-docker-gateway-252.25557.34.zip",
"252.27397.121": "https://plugins.jetbrains.com/files/21962/828479/clouds-docker-gateway-252.25557.34.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/21962/828479/clouds-docker-gateway-252.25557.34.zip"
"252.27397.133": "https://plugins.jetbrains.com/files/21962/828479/clouds-docker-gateway-252.25557.34.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/21962/828479/clouds-docker-gateway-252.25557.34.zip",
"253.28294.88": "https://plugins.jetbrains.com/files/21962/891736/clouds-docker-gateway-253.28294.90.zip"
},
"name": "dev-containers"
},
@@ -1714,9 +1714,9 @@
"rust-rover"
],
"builds": {
"252.27397.103": "https://plugins.jetbrains.com/files/22407/883703/intellij-rust-252.27397.120.zip",
"252.27397.114": "https://plugins.jetbrains.com/files/22407/883703/intellij-rust-252.27397.120.zip",
"252.27397.120": "https://plugins.jetbrains.com/files/22407/883703/intellij-rust-252.27397.120.zip"
"252.27397.103": "https://plugins.jetbrains.com/files/22407/887323/intellij-rust-252.27397.133.zip",
"252.27397.114": "https://plugins.jetbrains.com/files/22407/887323/intellij-rust-252.27397.133.zip",
"252.27397.133": "https://plugins.jetbrains.com/files/22407/887323/intellij-rust-252.27397.133.zip"
},
"name": "rust"
},
@@ -1736,18 +1736,18 @@
"webstorm"
],
"builds": {
"251.25410.129": "https://plugins.jetbrains.com/files/22707/878331/continue-intellij-extension-1.0.48.zip",
"252.26199.587": "https://plugins.jetbrains.com/files/22707/878331/continue-intellij-extension-1.0.48.zip",
"252.26830.46": "https://plugins.jetbrains.com/files/22707/878331/continue-intellij-extension-1.0.48.zip",
"252.27397.100": "https://plugins.jetbrains.com/files/22707/878331/continue-intellij-extension-1.0.48.zip",
"252.27397.103": "https://plugins.jetbrains.com/files/22707/878331/continue-intellij-extension-1.0.48.zip",
"252.27397.106": "https://plugins.jetbrains.com/files/22707/878331/continue-intellij-extension-1.0.48.zip",
"252.27397.109": "https://plugins.jetbrains.com/files/22707/878331/continue-intellij-extension-1.0.48.zip",
"252.27397.112": "https://plugins.jetbrains.com/files/22707/878331/continue-intellij-extension-1.0.48.zip",
"252.27397.114": "https://plugins.jetbrains.com/files/22707/878331/continue-intellij-extension-1.0.48.zip",
"252.27397.120": "https://plugins.jetbrains.com/files/22707/878331/continue-intellij-extension-1.0.48.zip",
"252.27397.121": "https://plugins.jetbrains.com/files/22707/878331/continue-intellij-extension-1.0.48.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/22707/878331/continue-intellij-extension-1.0.48.zip"
"251.25410.129": "https://plugins.jetbrains.com/files/22707/888295/continue-intellij-extension-1.0.52.zip",
"252.26199.587": "https://plugins.jetbrains.com/files/22707/888295/continue-intellij-extension-1.0.52.zip",
"252.26830.46": "https://plugins.jetbrains.com/files/22707/888295/continue-intellij-extension-1.0.52.zip",
"252.27397.100": "https://plugins.jetbrains.com/files/22707/888295/continue-intellij-extension-1.0.52.zip",
"252.27397.103": "https://plugins.jetbrains.com/files/22707/888295/continue-intellij-extension-1.0.52.zip",
"252.27397.106": "https://plugins.jetbrains.com/files/22707/888295/continue-intellij-extension-1.0.52.zip",
"252.27397.109": "https://plugins.jetbrains.com/files/22707/888295/continue-intellij-extension-1.0.52.zip",
"252.27397.112": "https://plugins.jetbrains.com/files/22707/888295/continue-intellij-extension-1.0.52.zip",
"252.27397.114": "https://plugins.jetbrains.com/files/22707/888295/continue-intellij-extension-1.0.52.zip",
"252.27397.133": "https://plugins.jetbrains.com/files/22707/888295/continue-intellij-extension-1.0.52.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/22707/888295/continue-intellij-extension-1.0.52.zip",
"253.28294.88": "https://plugins.jetbrains.com/files/22707/888295/continue-intellij-extension-1.0.52.zip"
},
"name": "continue"
},
@@ -1776,9 +1776,9 @@
"252.27397.109": "https://plugins.jetbrains.com/files/22857/871944/vcs-gitlab-IU-252.26830.99-IU.zip",
"252.27397.112": "https://plugins.jetbrains.com/files/22857/871944/vcs-gitlab-IU-252.26830.99-IU.zip",
"252.27397.114": "https://plugins.jetbrains.com/files/22857/871944/vcs-gitlab-IU-252.26830.99-IU.zip",
"252.27397.120": "https://plugins.jetbrains.com/files/22857/871944/vcs-gitlab-IU-252.26830.99-IU.zip",
"252.27397.121": "https://plugins.jetbrains.com/files/22857/871944/vcs-gitlab-IU-252.26830.99-IU.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/22857/871944/vcs-gitlab-IU-252.26830.99-IU.zip"
"252.27397.133": "https://plugins.jetbrains.com/files/22857/871944/vcs-gitlab-IU-252.26830.99-IU.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/22857/871944/vcs-gitlab-IU-252.26830.99-IU.zip",
"253.28294.88": "https://plugins.jetbrains.com/files/22857/891754/vcs-gitlab-253.28294.90.zip"
},
"name": "gitlab"
},
@@ -1807,9 +1807,9 @@
"252.27397.109": "https://plugins.jetbrains.com/files/23029/876768/Catppuccin_Icons-1.13.0.zip",
"252.27397.112": "https://plugins.jetbrains.com/files/23029/876768/Catppuccin_Icons-1.13.0.zip",
"252.27397.114": "https://plugins.jetbrains.com/files/23029/876768/Catppuccin_Icons-1.13.0.zip",
"252.27397.120": "https://plugins.jetbrains.com/files/23029/876768/Catppuccin_Icons-1.13.0.zip",
"252.27397.121": "https://plugins.jetbrains.com/files/23029/876768/Catppuccin_Icons-1.13.0.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/23029/876768/Catppuccin_Icons-1.13.0.zip"
"252.27397.133": "https://plugins.jetbrains.com/files/23029/876768/Catppuccin_Icons-1.13.0.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/23029/876768/Catppuccin_Icons-1.13.0.zip",
"253.28294.88": "https://plugins.jetbrains.com/files/23029/876768/Catppuccin_Icons-1.13.0.zip"
},
"name": "catppuccin-icons"
},
@@ -1838,9 +1838,9 @@
"252.27397.109": "https://plugins.jetbrains.com/files/23043/635877/MermaidChart-1.1.8.zip",
"252.27397.112": "https://plugins.jetbrains.com/files/23043/635877/MermaidChart-1.1.8.zip",
"252.27397.114": "https://plugins.jetbrains.com/files/23043/635877/MermaidChart-1.1.8.zip",
"252.27397.120": "https://plugins.jetbrains.com/files/23043/635877/MermaidChart-1.1.8.zip",
"252.27397.121": "https://plugins.jetbrains.com/files/23043/635877/MermaidChart-1.1.8.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/23043/635877/MermaidChart-1.1.8.zip"
"252.27397.133": "https://plugins.jetbrains.com/files/23043/635877/MermaidChart-1.1.8.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/23043/635877/MermaidChart-1.1.8.zip",
"253.28294.88": "https://plugins.jetbrains.com/files/23043/635877/MermaidChart-1.1.8.zip"
},
"name": "mermaid-chart"
},
@@ -1869,9 +1869,9 @@
"252.27397.109": "https://plugins.jetbrains.com/files/23806/867921/Oxocarbon-1.4.7.zip",
"252.27397.112": "https://plugins.jetbrains.com/files/23806/867921/Oxocarbon-1.4.7.zip",
"252.27397.114": "https://plugins.jetbrains.com/files/23806/867921/Oxocarbon-1.4.7.zip",
"252.27397.120": "https://plugins.jetbrains.com/files/23806/867921/Oxocarbon-1.4.7.zip",
"252.27397.121": "https://plugins.jetbrains.com/files/23806/867921/Oxocarbon-1.4.7.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/23806/867921/Oxocarbon-1.4.7.zip"
"252.27397.133": "https://plugins.jetbrains.com/files/23806/867921/Oxocarbon-1.4.7.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/23806/867921/Oxocarbon-1.4.7.zip",
"253.28294.88": null
},
"name": "oxocarbon"
},
@@ -1900,9 +1900,9 @@
"252.27397.109": "https://plugins.jetbrains.com/files/23927/878837/Extra_IDE_Tweaks_Subscription-2025.1.14.zip",
"252.27397.112": "https://plugins.jetbrains.com/files/23927/878837/Extra_IDE_Tweaks_Subscription-2025.1.14.zip",
"252.27397.114": "https://plugins.jetbrains.com/files/23927/878837/Extra_IDE_Tweaks_Subscription-2025.1.14.zip",
"252.27397.120": "https://plugins.jetbrains.com/files/23927/878837/Extra_IDE_Tweaks_Subscription-2025.1.14.zip",
"252.27397.121": "https://plugins.jetbrains.com/files/23927/878837/Extra_IDE_Tweaks_Subscription-2025.1.14.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/23927/878837/Extra_IDE_Tweaks_Subscription-2025.1.14.zip"
"252.27397.133": "https://plugins.jetbrains.com/files/23927/878837/Extra_IDE_Tweaks_Subscription-2025.1.14.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/23927/878837/Extra_IDE_Tweaks_Subscription-2025.1.14.zip",
"253.28294.88": "https://plugins.jetbrains.com/files/23927/878837/Extra_IDE_Tweaks_Subscription-2025.1.14.zip"
},
"name": "extra-ide-tweaks"
},
@@ -1931,9 +1931,9 @@
"252.27397.109": "https://plugins.jetbrains.com/files/24559/878844/Extra_Tools_Pack-2025.1.18.zip",
"252.27397.112": "https://plugins.jetbrains.com/files/24559/878844/Extra_Tools_Pack-2025.1.18.zip",
"252.27397.114": "https://plugins.jetbrains.com/files/24559/878844/Extra_Tools_Pack-2025.1.18.zip",
"252.27397.120": "https://plugins.jetbrains.com/files/24559/878844/Extra_Tools_Pack-2025.1.18.zip",
"252.27397.121": "https://plugins.jetbrains.com/files/24559/878844/Extra_Tools_Pack-2025.1.18.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/24559/878844/Extra_Tools_Pack-2025.1.18.zip"
"252.27397.133": "https://plugins.jetbrains.com/files/24559/878844/Extra_Tools_Pack-2025.1.18.zip",
"252.27397.92": "https://plugins.jetbrains.com/files/24559/878844/Extra_Tools_Pack-2025.1.18.zip",
"253.28294.88": "https://plugins.jetbrains.com/files/24559/878844/Extra_Tools_Pack-2025.1.18.zip"
},
"name": "extra-tools-pack"
},
@@ -1956,9 +1956,9 @@
"252.27397.109": null,
"252.27397.112": null,
"252.27397.114": null,
"252.27397.120": null,
"252.27397.121": null,
"252.27397.92": null
"252.27397.133": null,
"252.27397.92": null,
"253.28294.88": null
},
"name": "nix-lsp"
},
@@ -1985,36 +1985,40 @@
"252.27397.109": null,
"252.27397.112": null,
"252.27397.114": null,
"252.27397.120": null,
"252.27397.121": null,
"252.27397.92": null
"252.27397.133": null,
"252.27397.92": null,
"253.28294.88": null
},
"name": "markdtask"
}
},
"files": {
"https://plugins.jetbrains.com/files/10037/851933/intellij-csv-validator-4.1.0.zip": "sha256-jk5JisClylJCL6PdQIUC5pyKb9ccEYJl7T7AyAkAkEE=",
"https://plugins.jetbrains.com/files/10080/867937/intellij-rainbow-brackets-2025.3.5.zip": "sha256-50IFDt9PC6IpjFLL8ggbybhf8dCi4U3ceKDfbDjEK6Q=",
"https://plugins.jetbrains.com/files/10080/887330/intellij-rainbow-brackets-2025.3.6.zip": "sha256-MOW8OwMdeBKr9jsc2lWnuiRRkmbg7rSUsKbZMftKzHU=",
"https://plugins.jetbrains.com/files/10312/581013/dotplugin-1.5.4.zip": "sha256-25vtwXuBNiYL9E0pKG4dqJDkwX1FckAErdqRPKXybQA=",
"https://plugins.jetbrains.com/files/10481/671222/intellij-hocon-2025.1.0.zip": "sha256-GO0bXJsHx9O1A6M9NUCv9m4JwKHs5plwSssgx+InNqE=",
"https://plugins.jetbrains.com/files/10581/711019/go-template-251.23774.318.zip": "sha256-zX1nEdq84wwQvGhV664V5bNBPVTI4zWo306JtjXcGkE=",
"https://plugins.jetbrains.com/files/10581/796391/go-template-252.23892.201.zip": "sha256-XKv4jEKOk2O++VdHycGoLgICsusULbWRlQ0J5p+KgAE=",
"https://plugins.jetbrains.com/files/10581/889752/go-template-253.28294.51.zip": "sha256-SpZAnJBO4GLA8504kdzHIgITAkTlQ9jw/YnAsnQFkrY=",
"https://plugins.jetbrains.com/files/11058/878842/Extra_Icons-2025.1.16.zip": "sha256-kc/C/c9zsMVO0ZrPI6XH/P9X4XaoprJxo3v9ZlWVCiw=",
"https://plugins.jetbrains.com/files/11349/879071/aws-toolkit-jetbrains-standalone-3.97.252.zip": "sha256-Un5ZwdJNDuR6Gkox9WiY6Ab8IY9YwBiSIogbeaYeciM=",
"https://plugins.jetbrains.com/files/11349/879073/aws-toolkit-jetbrains-standalone-3.97.251.zip": "sha256-QV0oxBSRsQVU+kLzRgaOSU0f7NcQPBXWHBiUvcry3KA=",
"https://plugins.jetbrains.com/files/12024/834783/ReSharperPlugin.CognitiveComplexity-2025.2.0.zip": "sha256-XDBmYpBpLhuLGTB8aP0csK1NBEncmMUPKWoPJx2AVao=",
"https://plugins.jetbrains.com/files/12062/711097/keymap-vscode-251.23774.318.zip": "sha256-obbLL8n6gK8oFw8NnJbdAylPHfTv4GheBDnVFOUpwL0=",
"https://plugins.jetbrains.com/files/12062/796429/keymap-vscode-252.23892.201.zip": "sha256-V3Vk6UYLUSiSmypD+g0DCX1sPw3/wZqvLxFhbkTqY34=",
"https://plugins.jetbrains.com/files/12062/889778/keymap-vscode-253.28294.51.zip": "sha256-Y3x4zXyZ7iXn26/Rd4AP5DV5hoTxj51mCmZDBhPaACc=",
"https://plugins.jetbrains.com/files/12559/711714/keymap-eclipse-251.23774.329.zip": "sha256-HC1s5FqSLVgPNKc5Wiw0RFC6KpozxmjKzbh9rS9nFwc=",
"https://plugins.jetbrains.com/files/12559/796343/keymap-eclipse-252.23892.201.zip": "sha256-VotPAC/wcz5QveJMlgzGZktKHRpqW/KalckEMRU66cU=",
"https://plugins.jetbrains.com/files/12559/891762/keymap-eclipse-253.28294.90.zip": "sha256-MN+Ln7VS5340A1V5yQCoPNMT84yy/PoOX7C+4NqyC+c=",
"https://plugins.jetbrains.com/files/12896/173977/RainbowCSV.zip": "sha256-Q+gqKG/2bHD49Xtn9MNlYJQGtNF/7tIay9F7ndi8uwA=",
"https://plugins.jetbrains.com/files/13017/711726/keymap-visualStudio-251.23774.329.zip": "sha256-DKkgt0z/ui0bOLSbnKy51RL7+9HIqeriroi2otZ64mQ=",
"https://plugins.jetbrains.com/files/13017/796396/keymap-visualStudio-252.23892.201.zip": "sha256-5qDjLRMNwn+1QVN8cKUYlakQ8aBRiTyGuA7se3l9BI0=",
"https://plugins.jetbrains.com/files/13017/891738/keymap-visualStudio-253.28294.90.zip": "sha256-YMMwxwwxrIBMnF0ljd5iHS2AJg7xiTYx4+eAdIJRpJg=",
"https://plugins.jetbrains.com/files/13308/370912/Indent_Rainbow-2.2.0-signed.zip": "sha256-eKwDE+PMtYhrGbDDZPS5cimssH+1xV4GF6RXXg/3urU=",
"https://plugins.jetbrains.com/files/1347/770332/scala-intellij-bin-2025.1.25.zip": "sha256-h9GNGjqTc+h+x/0TRilKmqGoPsxhPmXIKoGC/s4/PKg=",
"https://plugins.jetbrains.com/files/1347/882283/scala-intellij-bin-2025.2.48.zip": "sha256-FUirdeHtISeqLDzBKNEViFg9EMqMGlh2xD9PhIMD9ZA=",
"https://plugins.jetbrains.com/files/14004/711000/protoeditor-251.23774.318.zip": "sha256-ZYn365EY8+VP1TKM4wBotMj1hYbSSr4J1K5oIZlE2SE=",
"https://plugins.jetbrains.com/files/14004/796340/protoeditor-252.23892.201.zip": "sha256-WK9ukN6g2tCmeljFXwv3F+xFI/VZKlIeFs8DXqPcIKA=",
"https://plugins.jetbrains.com/files/14004/891226/protoeditor-253.28294.86.zip": "sha256-dSQwkaDQDyhbBv7wvtDvgb360trisZFQ6mIkDGV1fPU=",
"https://plugins.jetbrains.com/files/14059/82616/darcula-pitch-black.jar": "sha256-eXInfAqY3yEZRXCAuv3KGldM1pNKEioNwPB0rIGgJFw=",
"https://plugins.jetbrains.com/files/14708/475401/MarioProgressBar-1.9.jar": "sha256-mB09zvUg1hLXl9lgW1NEU+DyVel1utZv6s+mFykckYY=",
"https://plugins.jetbrains.com/files/15976/851109/IDEA_Which-Key-0.11.2.jar": "sha256-Qujmu2j8nrgkbsRc+ei/musrNAI1UPC3vhwIjv53zxY=",
@@ -2023,8 +2027,8 @@
"https://plugins.jetbrains.com/files/17718/882517/github-copilot-intellij-1.5.59-243.zip": "sha256-PArPmySjlt/i/GKwm7qZxzjJh9xN2QAKaWTCFMN+yuE=",
"https://plugins.jetbrains.com/files/18444/165585/NetBeans6.5Keymap.zip": "sha256-KrzZTKZMQqoEMw+vDUv2jjs0EX0leaPBkU8H/ecq/oI=",
"https://plugins.jetbrains.com/files/18682/864736/Catppuccin_Theme-3.5.2.zip": "sha256-F37RoWSV96ofEw7ckvhSS4nHaXUJOBuWecEhzaH2Zk4=",
"https://plugins.jetbrains.com/files/18824/865849/CodeGlancePro-2.0.0-signed.zip": "sha256-v/BwU04VevdH7I40yiU7wOMn6CsFmSc63TKAVAcMiJI=",
"https://plugins.jetbrains.com/files/18922/881168/GerryThemes.jar": "sha256-ohVw2m/BeXssfTfsBm28RXrEW0gmqUmI/Q3Ob/SdTC4=",
"https://plugins.jetbrains.com/files/18824/887070/CodeGlancePro-2.0.1-signed.zip": "sha256-V92Co+yG64FfOoCZ8EG7MmBbMP80x2EfdJrNcN5VEJM=",
"https://plugins.jetbrains.com/files/18922/891154/GerryThemes.jar": "sha256-CZKPa1WrZxEYeU7CipgIpW0F7sTmJKAZ+cJGwJgazqM=",
"https://plugins.jetbrains.com/files/19275/355572/better_direnv-1.2.2-signed.zip": "sha256-hoFfIid7lClHDiT+ZH3H+tFSvWYb1tSRZH1iif+kWrM=",
"https://plugins.jetbrains.com/files/20146/811306/Mermaid-0.0.26_IJ.252.zip": "sha256-QTh77pyi4lh7V0DGPFx9kERjFCop219d76wTDwD0SYY=",
"https://plugins.jetbrains.com/files/21551/323564/ferris-2021.1.zip": "sha256-N66Bh0AwHmg5N9PNguRAGtpJ/dLMWMp3rxjTgz9poFo=",
@@ -2032,10 +2036,12 @@
"https://plugins.jetbrains.com/files/21667/818221/code-complexity-plugin-1.6.3.zip": "sha256-8agNBVenqaV9DlvRmFP7ul3IZfj9Dij8v/h8QMUb72E=",
"https://plugins.jetbrains.com/files/21904/744652/intellij-developer-tools-plugin-7.1.0-signed.zip": "sha256-lOPUSxlbgagD0SuXTw+fEdwTxxfUHP1Kl6L+u/oa4fs=",
"https://plugins.jetbrains.com/files/21962/828479/clouds-docker-gateway-252.25557.34.zip": "sha256-uwonawWIgXi9OXZlQaZl/GDt/iHqsyAKV7ifCgcMqWU=",
"https://plugins.jetbrains.com/files/22407/883703/intellij-rust-252.27397.120.zip": "sha256-gpfWoNR/RiWe36Og5eL9MROtrqKVlZRHxVqeFCaS7lo=",
"https://plugins.jetbrains.com/files/22707/878331/continue-intellij-extension-1.0.48.zip": "sha256-7553kxXry5sEJJn+Za4RsfUJGn/roAap8qDkaHjhfXQ=",
"https://plugins.jetbrains.com/files/21962/891736/clouds-docker-gateway-253.28294.90.zip": "sha256-fXR4Dyc/OGFXKyQ058KPW5IbdhqIbG5aIB8USrAOSJ4=",
"https://plugins.jetbrains.com/files/22407/887323/intellij-rust-252.27397.133.zip": "sha256-szclZHKYcQl8JzswLxMUvUFqY6VtZNmo+eX10W2NiS0=",
"https://plugins.jetbrains.com/files/22707/888295/continue-intellij-extension-1.0.52.zip": "sha256-zI+fXMr19+yjxJZRP0HeGGsVBwm96Zo7+1DyxeRtU/0=",
"https://plugins.jetbrains.com/files/22857/856960/vcs-gitlab-IU-252.26199.97-IU.zip": "sha256-dJM8j5aLWD6elv46HtXUhPvYWTdAE77m/jwRqztIwDk=",
"https://plugins.jetbrains.com/files/22857/871944/vcs-gitlab-IU-252.26830.99-IU.zip": "sha256-bTqJlTkoOyBm370Ks6kFpvxzRJJ7CSucT298YBQtl/M=",
"https://plugins.jetbrains.com/files/22857/891754/vcs-gitlab-253.28294.90.zip": "sha256-U6aCeCUS7aq8NqeE1mRT1svmg4PhFMdHvQik+RauN5M=",
"https://plugins.jetbrains.com/files/23029/876768/Catppuccin_Icons-1.13.0.zip": "sha256-fE0M8jYTYVIC0bbBDY9fWB+mgGcVIFkeee0VTAMXt2E=",
"https://plugins.jetbrains.com/files/23043/635877/MermaidChart-1.1.8.zip": "sha256-ssaSY1I6FopLBgVKHUyjBrqzxHLSuI/swtDfQWJ7gxU=",
"https://plugins.jetbrains.com/files/23806/867921/Oxocarbon-1.4.7.zip": "sha256-952sONSgui6bSVFYfRhx1PbHWHas24y0SdHl5QhNIdQ=",
@@ -2045,39 +2051,53 @@
"https://plugins.jetbrains.com/files/631/882374/python-252.27397.103.zip": "sha256-v3EO4oMT8CaJJRWikKYKC4TyQ2uyCnP+o5nxLg94+1E=",
"https://plugins.jetbrains.com/files/6884/711128/handlebars-251.23774.318.zip": "sha256-34s7pOsqMaGoVYhCuAZtylNwplQOtNQJUppepsl4F4Q=",
"https://plugins.jetbrains.com/files/6884/796395/handlebars-252.23892.201.zip": "sha256-iWKLgk+eWhUmv/lH9+B2HI97d++EYvLwGgtRsJf4aSE=",
"https://plugins.jetbrains.com/files/6884/889746/handlebars-253.28294.51.zip": "sha256-2g76+qxNiiV5HYwNH59Jn36fzk6XleVoIjvj9jnTr8Q=",
"https://plugins.jetbrains.com/files/6954/861041/Kotlin-252.26199.169-IJ.zip": "sha256-Fk/Df5MthwTWnhxv/u8/n2ITMLzZXKogj0tRRyPi5Zw=",
"https://plugins.jetbrains.com/files/6954/870901/Kotlin-252.26830.84-IJ.zip": "sha256-C1JXMUNESJ29psA661Z8/R5Jj1155YjVXdgDFcBY01k=",
"https://plugins.jetbrains.com/files/6954/882364/Kotlin-252.27397.103-IJ.zip": "sha256-zzSRwttzhbdhyV/De6a1TDSg5746iosG91LBSAeLcUQ=",
"https://plugins.jetbrains.com/files/6954/889899/Kotlin-253.28294.51-IJ.zip": "sha256-95kmr+jdrX8ISZrRDXNahdEPVl1Sr4zz8OzZdERCeqw=",
"https://plugins.jetbrains.com/files/6981/871946/ini-252.26830.99.zip": "sha256-hETXYiz7bXDOWXjK9tUWST/VzaKdfU4hluuDWF3FTGY=",
"https://plugins.jetbrains.com/files/6981/882710/ini-252.27397.112.zip": "sha256-GaYYYsyBjAcWsBY3W+qx1Frx7GGbNdGIHg+gHnPHdJg=",
"https://plugins.jetbrains.com/files/6981/884814/ini-252.27397.129.zip": "sha256-MvKnIEcZhJN/MaEa0okxjf41WKVw7lbBuOJI77rLLoY=",
"https://plugins.jetbrains.com/files/6981/889727/ini-253.28294.51.zip": "sha256-LcrnMWhI2K8Png1hnPczaYGdjxZGYiylTP4jXiIECTM=",
"https://plugins.jetbrains.com/files/7086/738977/AceJump.zip": "sha256-BW47ZEUINVnhV0RZ1np7Dkf3lfyrtKoZ9ej/SVct2Xs=",
"https://plugins.jetbrains.com/files/7125/819837/GrepConsole-13.3.0-IJ2023.3.zip": "sha256-KcRoHqvCcC6qRz58DHkQ6AFqnpyqPhETekuMWBQYYw8=",
"https://plugins.jetbrains.com/files/7177/711086/fileWatcher-251.23774.318.zip": "sha256-jNHP/vaCaolmvNUQRGmIgSR1ykjDtKqyJ69UIn5cz70=",
"https://plugins.jetbrains.com/files/7177/796349/fileWatcher-252.23892.201.zip": "sha256-ac4h2uwF6h2L5Cax40t36wTBNFzQn38EVGEL2gts8jQ=",
"https://plugins.jetbrains.com/files/7177/889979/fileWatcher-253.28294.51.zip": "sha256-bC0F5tTAp8idkHruKMNABVPYIftIKIniJvBmmLBN7do=",
"https://plugins.jetbrains.com/files/7179/767851/MavenHelper-4.30.0-IJ2022.2.zip": "sha256-Xsw4P/KddgOuwcNBzT3UWkaQBYXLqGop+fQhoL65Dfg=",
"https://plugins.jetbrains.com/files/7212/711023/cucumber-java-251.23774.318.zip": "sha256-I7gwjCnW8OXzM5eioM7h6RW9qYaQX0MWJPfHOOL9KJA=",
"https://plugins.jetbrains.com/files/7212/809131/cucumber-java-252.23892.360.zip": "sha256-ypJOPmcl4881TpMboomVvmspJ3I1sfm5a26l54cfFpo=",
"https://plugins.jetbrains.com/files/7212/889840/cucumber-java-253.28294.51.zip": "sha256-TTVywD9dqJ/WA/OS19ga4+WNHcCZIY+eS+Vr9xegCLI=",
"https://plugins.jetbrains.com/files/7219/770179/Symfony_Plugin-2025.1.280.zip": "sha256-SgldikXjVx6hUw3LqcN8/NxLLBfnr/LUc/SrIIACl7k=",
"https://plugins.jetbrains.com/files/7320/855846/PHP_Annotations-12.0.1.zip": "sha256-FQmHb4oo9TgXiJ4b7EEEELagOx31C9iQtsTRoqxCnO4=",
"https://plugins.jetbrains.com/files/7322/866568/python-ce-252.26830.24.zip": "sha256-7Tkcnl2km29lxQtBIX0ahKXShy16Lk1EBiwmKZBjpIc=",
"https://plugins.jetbrains.com/files/7322/882365/python-ce-252.27397.103.zip": "sha256-RjzA95Pc+UWa1XJklCw2qs6cLL0X8rlMedaxYt5L/G8=",
"https://plugins.jetbrains.com/files/7322/889972/python-ce-253.28294.51.zip": "sha256-zhBMPM5oxNtZUa9+gfSiba7iw+5mwrID0a539YhDetE=",
"https://plugins.jetbrains.com/files/7391/880448/asciidoctor-intellij-plugin-0.44.10.zip": "sha256-k2nL2OupoiqQHkLAauo/bLJ2hQ5HVAXrGEQMkVel0eE=",
"https://plugins.jetbrains.com/files/7391/880451/asciidoctor-intellij-plugin-0.45.1.zip": "sha256-wXu+Sebzyjc3ZzTFi2yqAyRP5q9tR/f9m+IYVwp9grM=",
"https://plugins.jetbrains.com/files/7425/760442/WakaTime.jar": "sha256-DobKZKokueqq0z75d2Fo3BD8mWX9+LpGdT9C7Eu2fHc=",
"https://plugins.jetbrains.com/files/7499/875436/gittoolbox-600.1.12_243-signed.zip": "sha256-o6HEc0RuM/GRZL0ke+Zrr8uSZGMLL0dDlubuwHdnGJc=",
"https://plugins.jetbrains.com/files/7499/877840/gittoolbox-600.2.0_253-signed.zip": "sha256-FoZIkhtYqEQWOTBKmp3oy2sOPLmPIHF8QjaYAWW8o38=",
"https://plugins.jetbrains.com/files/7499/883982/gittoolbox-600.1.13_243-signed.zip": "sha256-GJfaRzhKVqXK1boiqUi6TDfPIJ8YymG/vqbY3jau5sI=",
"https://plugins.jetbrains.com/files/7724/871939/clouds-docker-impl-252.26830.99.zip": "sha256-abY9ZqQ0z80B2l6HNUJxF3ZyLdLjCYo0K6Y5mlDOZvc=",
"https://plugins.jetbrains.com/files/7724/882712/clouds-docker-impl-252.27397.112.zip": "sha256-Y8yrKgPQVa/VnJIxoIBYsukBGlSPoX6GWnEdypTOUC0=",
"https://plugins.jetbrains.com/files/7724/884806/clouds-docker-impl-252.27397.129.zip": "sha256-Ltu7OsDfQD15FTzLNDvwOgqwhctXmQZ6G6IXX7kBtZo=",
"https://plugins.jetbrains.com/files/7724/891767/clouds-docker-impl-253.28294.90.zip": "sha256-o+F9+09g8mCv0mfpdED2A4g8VA4C0qHEyJ6tE+Xf6No=",
"https://plugins.jetbrains.com/files/8097/827445/graphql-252.25557.23.zip": "sha256-wN3+7++f6i0MvEmOTiWZgAW1QzM5HiD7jSAMS8jWC5s=",
"https://plugins.jetbrains.com/files/8097/889919/graphql-253.28294.51.zip": "sha256-fFNhWfjr8EQR5z056ib1JP0eXxio0ooq/FeiMaQqKgw=",
"https://plugins.jetbrains.com/files/8195/871151/toml-252.26830.93.zip": "sha256-trwXodrcUo1SHloOm6hQa3IUBS9F+VxK5jYvOxtSOI8=",
"https://plugins.jetbrains.com/files/8195/882551/toml-252.27397.109.zip": "sha256-MVzOzED2tWhoq6p0p2j5f6Gd/TPbIyom4Cu/jdNwekk=",
"https://plugins.jetbrains.com/files/8195/891234/toml-253.28294.86.zip": "sha256-CP4BHBg3VWMUBSRRHyYmWLYZBapXzTsX27kWzES2T9M=",
"https://plugins.jetbrains.com/files/8327/809293/Minecraft_Development-2025.1-1.8.6.zip": "sha256-mePVZa+63bheH85ylkbX9oOX1Nq/IYLAGHHseOJx520=",
"https://plugins.jetbrains.com/files/8327/809294/Minecraft_Development-2025.2-1.8.6.zip": "sha256-NOuzQ+CL+Z8n5gwMBaberLyMvS5KNmXKwZ+j88+SFqU=",
"https://plugins.jetbrains.com/files/8554/854483/featuresTrainer-252.26199.84.zip": "sha256-euvA9ZNcFcQ6iZ5AC6tpyeJKTkAGzIq4jJ2sdLF0Fno=",
"https://plugins.jetbrains.com/files/8554/871926/featuresTrainer-252.26830.95.zip": "sha256-evHs8vwjnUSjN20ewZaMCpKHQbbjOmN+TspNqOMhihM=",
"https://plugins.jetbrains.com/files/8554/891759/featuresTrainer-253.28294.90.zip": "sha256-3BbZcICo42Qti0t1bBsJOgA6PnXo81iG/u5rINMp3WQ=",
"https://plugins.jetbrains.com/files/8607/786671/NixIDEA-0.4.0.18.zip": "sha256-JShheBoOBiWM9HubMUJvBn4H3DnWykvqPyrmetaCZiM=",
"https://plugins.jetbrains.com/files/9164/710996/gherkin-251.23774.318.zip": "sha256-Boy61dRieXmWrnTMfqqYZbdG/DNQ24KdguKN2fcZ+eg=",
"https://plugins.jetbrains.com/files/9164/827451/gherkin-252.25557.23.zip": "sha256-y66kYTYD+R9Sert2JHWGwFFIgc5UJTssZrjgvzOjljk=",
"https://plugins.jetbrains.com/files/9164/889873/gherkin-253.28294.51.zip": "sha256-hLFqui1ivtBn35CZ86faqT9supJuItSxISRvy20wd8w=",
"https://plugins.jetbrains.com/files/9525/711041/dotenv-251.23774.318.zip": "sha256-0c/2qbuu+M6z0gvpme+Mkv23JlQKNTUU+9GL9mh2IFw=",
"https://plugins.jetbrains.com/files/9525/796325/dotenv-252.23892.201.zip": "sha256-N0DNEtF3FDcRirfjfSCCVUbDIA4SB35F/9XY1tPXXmg=",
"https://plugins.jetbrains.com/files/9525/889789/dotenv-253.28294.51.zip": "sha256-GaezfHralpd6MIbjP2ztPZi2WNTiL2GGfETh/HFYKgA=",
"https://plugins.jetbrains.com/files/9568/882349/go-plugin-252.27397.103.zip": "sha256-bEDB8GfqxmY1Pqco2mYW55QQvleidHYOdjyj6sWEpKE=",
"https://plugins.jetbrains.com/files/9707/702581/ANSI_Highlighter_Premium-25.1.5.jar": "sha256-XYCD4kOHDeIKhti0T175xhBHR8uscaFN4c9CNlUaCDs=",
"https://plugins.jetbrains.com/files/9707/767822/ANSI_Highlighter_Premium-25.2.1.jar": "sha256-mp1k2BdksxbGH4zUp/7DnjcGi5OXJ7UekCfX6dWZOtU=",
@@ -78,6 +78,7 @@ mapAliases (
feline-nvim = throw "feline.nvim has been removed: upstream deleted repository. Consider using lualine"; # Added 2025-02-09
fugitive = vim-fugitive;
floating-nvim = throw "floating.nvim has been removed: abandoned by upstream. Use popup-nvim or nui-nvim"; # Added 2024-11-26
fruzzy = throw "vimPlugins.fruzzy did not update since 2019-10-28 and uses EOL version of Nim"; # Added 2025-11-12
fzfWrapper = fzf-wrapper;
ghc-mod-vim = ghcmod-vim;
ghcmod = ghcmod-vim;
@@ -5464,19 +5464,6 @@ final: prev: {
meta.hydraPlatforms = [ ];
};
fruzzy = buildVimPlugin {
pname = "fruzzy";
version = "2020-08-31";
src = fetchFromGitHub {
owner = "raghur";
repo = "fruzzy";
rev = "4cdfee7b828a5cace22bfd93cf23fee0b2b233c4";
sha256 = "1dmxz283ypz1klcmdf4jk699aifr3dywkh9y8v8v8vyflampqwwp";
};
meta.homepage = "https://github.com/raghur/fruzzy/";
meta.hydraPlatforms = [ ];
};
fugit2-nvim = buildVimPlugin {
pname = "fugit2.nvim";
version = "2025-09-02";
@@ -5854,6 +5841,19 @@ final: prev: {
meta.hydraPlatforms = [ ];
};
gitportal-nvim = buildVimPlugin {
pname = "gitportal.nvim";
version = "2025-11-11";
src = fetchFromGitHub {
owner = "trevorhauter";
repo = "gitportal.nvim";
rev = "3abb1b87a48a8c07f042eb8c570dfe325ebf8702";
sha256 = "04f8yls7498v8ccs472zl1phr1c5p5nf37r05dpv4kr1wqlkmdq4";
};
meta.homepage = "https://github.com/trevorhauter/gitportal.nvim/";
meta.hydraPlatforms = [ ];
};
gitv = buildVimPlugin {
pname = "gitv";
version = "2019-08-22";
@@ -7,9 +7,7 @@ final: prev:
let
nodePackageNames = [
"coc-go"
"coc-ltex"
"coc-tsserver"
"coc-ultisnips"
];
in
lib.genAttrs nodePackageNames (
@@ -8,18 +8,18 @@
gitMinimal,
}:
let
version = "1.7.0";
version = "1.8.0";
src = fetchFromGitHub {
owner = "Saghen";
repo = "blink.cmp";
tag = "v${version}";
hash = "sha256-eMUOjG2CtedCGVU1Pdp8PCCgGoFbjeVvK7lMS8E+ogg=";
hash = "sha256-JjlcPj7v9J+v1SDBYIub6jFEslLhZGHmsipV1atUAFo=";
};
blink-fuzzy-lib = rustPlatform.buildRustPackage {
inherit version src;
pname = "blink-fuzzy-lib";
cargoHash = "sha256-zWZHT+Y8ENN/nFEtJnkEUHXRuU6FUQ/ITHo+V4zJ6f8=";
cargoHash = "sha256-Qdt8O7IGj2HySb1jxsv3m33ZxJg96Ckw26oTEEyQjfs=";
nativeBuildInputs = [ gitMinimal ];

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