Merge release-26.05 into staging-nixos-26.05

This commit is contained in:
nixpkgs-ci[bot]
2026-08-29 00:26:59 +00:00
committed by GitHub
41 changed files with 1502 additions and 301 deletions

View File

@@ -159,8 +159,8 @@ jobs:
run: ln -s "$PWD/trusted/ci/github-script/node_modules" untrusted/ci/github-script/node_modules
working-directory: nixpkgs
- name: Type-check ci/github-script
run: tsc --build
- name: Check ci/github-script
run: npm test
working-directory: nixpkgs/untrusted/ci/github-script
owners:

View File

@@ -0,0 +1,220 @@
const assert = require('node:assert/strict')
const test = require('node:test')
const {
evaluateTargetBranchPolicy,
} = require('./check-target-branch-policy.ts')
type DecisionFacts = {
base: string
head: string
maxRebuildCount: number
rebuildsAllTests: boolean
onlyChangedFile: string | null
}
type Decision =
| 'mass-rebuild'
| 'nixos-rebuild'
| 'possible-mass-rebuild'
| 'skip-development-merge'
| 'dismiss'
const defaults: DecisionFacts = {
base: 'master',
head: 'topic-branch',
maxRebuildCount: 0,
rebuildsAllTests: false,
onlyChangedFile: null,
}
const cases: Array<{
name: string
facts: Partial<DecisionFacts>
expected: Decision
}> = [
{
name: 'allows fewer than 500 rebuilds on master',
facts: { maxRebuildCount: 499 },
expected: 'dismiss',
},
{
name: 'flags 500 rebuilds on master as a possible mass rebuild',
facts: { maxRebuildCount: 500 },
expected: 'possible-mass-rebuild',
},
{
name: 'flags 999 rebuilds on master as a possible mass rebuild',
facts: { maxRebuildCount: 999 },
expected: 'possible-mass-rebuild',
},
{
name: 'flags 1000 rebuilds on master as a mass rebuild',
facts: { maxRebuildCount: 1000 },
expected: 'mass-rebuild',
},
{
name: 'flags a mass rebuild on staging-nixos',
facts: { base: 'staging-nixos', maxRebuildCount: 24_000 },
expected: 'mass-rebuild',
},
{
name: 'flags a mass rebuild on a release staging-nixos branch',
facts: { base: 'staging-nixos-26.05', maxRebuildCount: 1000 },
expected: 'mass-rebuild',
},
{
name: 'allows mass rebuilds on staging',
facts: { base: 'staging', maxRebuildCount: 1000 },
expected: 'dismiss',
},
{
name: 'flags a mass rebuild on a release branch',
facts: { base: 'release-26.05', maxRebuildCount: 1000 },
expected: 'mass-rebuild',
},
{
name: 'flags NixOS test rebuilds on master',
facts: { rebuildsAllTests: true },
expected: 'nixos-rebuild',
},
{
name: 'flags NixOS test rebuilds on a release branch',
facts: { base: 'release-26.05', rebuildsAllTests: true },
expected: 'nixos-rebuild',
},
{
name: 'allows NixOS test rebuilds on staging-nixos',
facts: { base: 'staging-nixos', rebuildsAllTests: true },
expected: 'dismiss',
},
{
name: 'does not flag a possible mass rebuild when staging-nixos rebuilds all NixOS tests',
facts: {
base: 'staging-nixos',
maxRebuildCount: 500,
rebuildsAllTests: true,
},
expected: 'dismiss',
},
{
name: 'flags other possible mass rebuilds on staging-nixos',
facts: { base: 'staging-nixos', maxRebuildCount: 500 },
expected: 'possible-mass-rebuild',
},
{
name: 'skips staging into master',
facts: {
head: 'staging',
maxRebuildCount: 24_000,
},
expected: 'skip-development-merge',
},
{
name: 'skips staging-nixos into master',
facts: {
head: 'staging-nixos',
maxRebuildCount: 24_000,
},
expected: 'skip-development-merge',
},
{
name: 'skips master into staging-nixos',
facts: {
base: 'staging-nixos',
head: 'master',
maxRebuildCount: 24_000,
},
expected: 'skip-development-merge',
},
{
name: 'checks staging into staging-nixos',
facts: {
base: 'staging-nixos',
head: 'staging',
maxRebuildCount: 24_000,
},
expected: 'mass-rebuild',
},
{
name: 'skips release staging-nixos into its release branch',
facts: {
base: 'release-26.05',
head: 'staging-nixos-26.05',
maxRebuildCount: 24_000,
},
expected: 'skip-development-merge',
},
{
name: 'skips a release branch into its staging-nixos branch',
facts: {
base: 'staging-nixos-26.05',
head: 'release-26.05',
maxRebuildCount: 24_000,
},
expected: 'skip-development-merge',
},
{
name: 'checks release staging into its staging-nixos branch',
facts: {
base: 'staging-nixos-26.05',
head: 'staging-26.05',
maxRebuildCount: 24_000,
},
expected: 'mass-rebuild',
},
{
name: 'kernel exemption suppresses a possible mass rebuild',
facts: {
maxRebuildCount: 999,
onlyChangedFile: 'pkgs/os-specific/linux/kernel/xanmod-kernels.nix',
},
expected: 'dismiss',
},
{
name: 'kernel exemption suppresses a definite mass rebuild',
facts: {
maxRebuildCount: 1000,
onlyChangedFile: 'pkgs/os-specific/linux/kernel/xanmod-kernels.nix',
},
expected: 'dismiss',
},
{
name: 'kernel exemption suppresses a NixOS test rebuild',
facts: {
rebuildsAllTests: true,
onlyChangedFile: 'pkgs/os-specific/linux/kernel/xanmod-kernels.nix',
},
expected: 'dismiss',
},
{
name: 'Home Assistant exemption suppresses a mass rebuild',
facts: {
head: 'wip-home-assistant',
maxRebuildCount: 1500,
},
expected: 'dismiss',
},
{
name: 'does not exempt a Home Assistant update above 1500 rebuilds',
facts: { head: 'wip-home-assistant', maxRebuildCount: 1501 },
expected: 'mass-rebuild',
},
{
name: 'Home Assistant exemption does not suppress a NixOS test rebuild',
facts: {
head: 'wip-home-assistant',
maxRebuildCount: 1500,
rebuildsAllTests: true,
},
expected: 'nixos-rebuild',
},
]
for (const { name, facts, expected } of cases) {
test(name, () => {
assert.equal(
evaluateTargetBranchPolicy({ ...defaults, ...facts }).decision,
expected,
)
})
}

View File

@@ -0,0 +1,109 @@
const { classify, split } = require('../supportedBranches.js')
type TargetBranchPolicyFacts = {
base: string
head: string
maxRebuildCount: number
rebuildsAllTests: boolean
onlyChangedFile: string | null
}
type TargetBranchReviewDecision =
| 'mass-rebuild'
| 'nixos-rebuild'
| 'possible-mass-rebuild'
| 'skip-development-merge'
| 'dismiss'
type TargetBranchPolicyResult = {
decision: TargetBranchReviewDecision
details: {
isExemptKernelUpdate: boolean
isExemptHomeAssistantUpdate: boolean
}
}
function getTargetBranchPolicy({ base, head }: { base: string; head: string }) {
const baseClassification = classify(base)
const headClassification = classify(head)
const isPrimaryBase = baseClassification.type.includes('primary')
const isPrimaryHead = headClassification.type.includes('primary')
const isStagingNixosBase = split(base).prefix === 'staging-nixos'
const isDevelopmentHead = headClassification.type.includes('development')
const shouldSkipDevelopmentMerge =
isDevelopmentHead && (!isStagingNixosBase || isPrimaryHead)
return {
isStagingNixosBase,
shouldSkipDevelopmentMerge,
shouldCheckMassRebuild:
!shouldSkipDevelopmentMerge && (isPrimaryBase || isStagingNixosBase),
shouldCheckNixosRebuild: !shouldSkipDevelopmentMerge && isPrimaryBase,
}
}
function evaluateTargetBranchPolicy({
base,
head,
maxRebuildCount,
rebuildsAllTests,
onlyChangedFile,
}: TargetBranchPolicyFacts): TargetBranchPolicyResult {
const {
isStagingNixosBase,
shouldSkipDevelopmentMerge,
shouldCheckMassRebuild,
shouldCheckNixosRebuild,
} = getTargetBranchPolicy({ base, head })
// https://github.com/NixOS/nixpkgs/pull/521157
// These should go to master and release-xx.xx when backported
const isExemptKernelUpdate =
onlyChangedFile === 'pkgs/os-specific/linux/kernel/xanmod-kernels.nix'
// https://github.com/NixOS/nixpkgs/pull/483194#issuecomment-3793393218
const isExemptHomeAssistantUpdate =
maxRebuildCount <= 1500 && head === 'wip-home-assistant'
const details = {
isExemptKernelUpdate,
isExemptHomeAssistantUpdate,
}
const result = (decision: TargetBranchReviewDecision) => ({
decision,
details,
})
const isMassRebuild =
maxRebuildCount >= 1000 &&
!isExemptKernelUpdate &&
!isExemptHomeAssistantUpdate
if (shouldCheckMassRebuild && isMassRebuild) {
return result('mass-rebuild')
}
if (shouldCheckNixosRebuild && rebuildsAllTests && !isExemptKernelUpdate) {
return result('nixos-rebuild')
}
const isPossibleMassRebuild =
maxRebuildCount >= 500 &&
!isMassRebuild &&
!isExemptKernelUpdate &&
!isExemptHomeAssistantUpdate
if (
shouldCheckMassRebuild &&
isPossibleMassRebuild &&
!(rebuildsAllTests && isStagingNixosBase)
) {
return result('possible-mass-rebuild')
}
return result(
shouldSkipDevelopmentMerge ? 'skip-development-merge' : 'dismiss',
)
}
module.exports = { evaluateTargetBranchPolicy, getTargetBranchPolicy }

View File

@@ -6,9 +6,13 @@ import type { GitHub } from '@actions/github/lib/utils'
// They do seem quite similar, but this needs to run after eval,
// and prepare.js obviously doesn't.
const { classify, split } = require('../supportedBranches.js')
const { split } = require('../supportedBranches.js')
const { readFile } = require('node:fs/promises')
const { postReview, dismissReviews } = require('./reviews.js')
const {
evaluateTargetBranchPolicy,
getTargetBranchPolicy,
} = require('./check-target-branch-policy.ts')
const reviewKey = 'check-target-branch'
@@ -40,6 +44,92 @@ type ChangedPaths = {
rebuildsByPlatform: Record<string, string[]>
}
type TargetBranchReviewFacts = {
github: InstanceType<typeof GitHub>
context: typeof actionsContext
core: typeof actionsCore
dry: boolean
base: string
maxRebuildCount: number
}
function getStagingBranch(base: string) {
const version = split(base).version
return version ? `staging-${version}` : 'staging'
}
async function postMassRebuildReview(facts: TargetBranchReviewFacts) {
const { github, context, core, dry, base, maxRebuildCount } = facts
const desiredBranch = getStagingBranch(base)
const body = [
`The PR's base branch is set to \`${base}\`, but this PR causes ${maxRebuildCount} rebuilds.`,
'It is therefore considered a mass rebuild.',
`Please [change the base branch](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/changing-the-base-branch-of-a-pull-request) to [the right base branch for your changes](https://github.com/NixOS/nixpkgs/blob/master/CONTRIBUTING.md#branch-conventions) (probably \`${desiredBranch}\`).`,
].join('\n')
await postReview({
github,
context,
core,
dry,
body,
event: 'REQUEST_CHANGES',
reviewKey,
})
}
async function postNixosRebuildReview(facts: TargetBranchReviewFacts) {
const { github, context, core, dry, base, maxRebuildCount } = facts
let branchText: string
if (base === 'master' && maxRebuildCount >= 500) {
branchText = '(probably either `staging-nixos` or `staging`)'
} else if (base === 'master') {
branchText = '(probably `staging-nixos`)'
} else if (maxRebuildCount >= 500) {
branchText = `(probably either \`staging-nixos-${split(base).version}\` or \`staging-${split(base).version}\`)`
} else {
branchText = `(probably \`staging-nixos-${split(base).version}\`)`
}
const body = [
`The PR's base branch is set to \`${base}\`, but this PR rebuilds all NixOS tests.`,
base === 'master' && maxRebuildCount >= 500
? `Since this PR also causes ${maxRebuildCount} rebuilds, it may also be considered a mass rebuild.`
: '',
`Please [change the base branch](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/changing-the-base-branch-of-a-pull-request) to [the right base branch for your changes](https://github.com/NixOS/nixpkgs/blob/master/CONTRIBUTING.md#branch-conventions) ${branchText}.`,
].join('\n')
await postReview({
github,
context,
core,
dry,
body,
event: 'REQUEST_CHANGES',
reviewKey,
})
}
async function postPossibleMassRebuildReview(facts: TargetBranchReviewFacts) {
const { github, context, core, dry, base, maxRebuildCount } = facts
const stagingBranch = getStagingBranch(base)
const body = [
`The PR's base branch is set to \`${base}\`, and this PR causes ${maxRebuildCount} rebuilds.`,
`Please consider whether this PR causes a mass rebuild according to [our conventions](https://github.com/NixOS/nixpkgs/blob/master/CONTRIBUTING.md#branch-conventions).`,
`If it does cause a mass rebuild, please [change the base branch](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/changing-the-base-branch-of-a-pull-request) to [the right base branch for your changes](https://github.com/NixOS/nixpkgs/blob/master/CONTRIBUTING.md#branch-conventions) (probably \`${stagingBranch}\`).`,
`If it does not cause a mass rebuild, this message can be ignored.`,
].join('\n')
await postReview({
github,
context,
core,
dry,
body,
event: 'REQUEST_CHANGES',
reviewKey,
})
}
async function checkTargetBranch({
github,
context,
@@ -69,41 +159,7 @@ async function checkTargetBranch({
).data
const base = prInfo.base.ref
const head = prInfo.head.ref
const baseClassification = classify(base)
const headClassification = classify(head)
// Don't run on, e.g., staging-nixos to master merges.
if (headClassification.type.includes('development')) {
core.info(
`Skipping checkTargetBranch: PR is from a development branch (${head})`,
)
await dismissReviews({
github,
context,
core,
dry,
reviewKey,
})
return
}
// Don't run on PRs against staging branches, wip branches, haskell-updates, etc.
if (!baseClassification.type.includes('primary')) {
core.info(
`Skipping checkTargetBranch: PR is against a non-primary base branch (${base})`,
)
await dismissReviews({
github,
context,
core,
dry,
reviewKey,
})
return
}
const { shouldCheckMassRebuild } = getTargetBranchPolicy({ base, head })
const maxRebuildCount = Math.max(
...Object.values(changed.rebuildCountByKernel),
@@ -112,25 +168,28 @@ async function checkTargetBranch({
changed.attrdiff.changed.includes('nixosTests.simple-container') ||
changed.attrdiff.changed.includes('nixosTests.simple-vm')
// https://github.com/NixOS/nixpkgs/pull/521157
// These should go to master and release-xx.xx when backported
let isExemptKernelUpdate = false
if (prInfo.changed_files === 1) {
let onlyChangedFile: string | null = null
if (shouldCheckMassRebuild && prInfo.changed_files === 1) {
const changedFiles = (
await github.rest.pulls.listFiles({
...context.repo,
pull_number,
})
).data
isExemptKernelUpdate =
changedFiles.length === 1 &&
changedFiles[0].filename ===
'pkgs/os-specific/linux/kernel/xanmod-kernels.nix'
onlyChangedFile =
changedFiles.length === 1 ? changedFiles[0].filename : null
}
// https://github.com/NixOS/nixpkgs/pull/483194#issuecomment-3793393218
const isExemptHomeAssistantUpdate =
maxRebuildCount <= 1500 && head === 'wip-home-assistant'
const {
decision,
details: { isExemptKernelUpdate, isExemptHomeAssistantUpdate },
} = evaluateTargetBranchPolicy({
base,
head,
maxRebuildCount,
rebuildsAllTests,
onlyChangedFile,
})
core.info(
[
@@ -142,90 +201,45 @@ async function checkTargetBranch({
].join('\n'),
)
if (
maxRebuildCount >= 1000 &&
!isExemptHomeAssistantUpdate &&
!isExemptKernelUpdate
) {
const desiredBranch =
base === 'master' ? 'staging' : `staging-${split(base).version}`
const body = [
`The PR's base branch is set to \`${base}\`, but this PR causes ${maxRebuildCount} rebuilds.`,
'It is therefore considered a mass rebuild.',
`Please [change the base branch](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/changing-the-base-branch-of-a-pull-request) to [the right base branch for your changes](https://github.com/NixOS/nixpkgs/blob/master/CONTRIBUTING.md#branch-conventions) (probably \`${desiredBranch}\`).`,
].join('\n')
const reviewFacts: TargetBranchReviewFacts = {
github,
context,
core,
dry,
base,
maxRebuildCount,
}
await postReview({
github,
context,
core,
dry,
body,
event: 'REQUEST_CHANGES',
reviewKey,
})
} else if (rebuildsAllTests && !isExemptKernelUpdate) {
let branchText: string
if (base === 'master' && maxRebuildCount >= 500) {
branchText = '(probably either `staging-nixos` or `staging`)'
} else if (base === 'master') {
branchText = '(probably `staging-nixos`)'
} else if (maxRebuildCount >= 500) {
branchText = `(probably either \`staging-nixos-${split(base).version}\` or \`staging-${split(base).version}\`)`
} else {
branchText = `(probably \`staging-nixos-${split(base).version}\`)`
}
const body = [
`The PR's base branch is set to \`${base}\`, but this PR rebuilds all NixOS tests.`,
base === 'master' && maxRebuildCount >= 500
? `Since this PR also causes ${maxRebuildCount} rebuilds, it may also be considered a mass rebuild.`
: '',
`Please [change the base branch](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/changing-the-base-branch-of-a-pull-request) to [the right base branch for your changes](https://github.com/NixOS/nixpkgs/blob/master/CONTRIBUTING.md#branch-conventions) ${branchText}.`,
].join('\n')
if (decision === 'mass-rebuild') {
await postMassRebuildReview(reviewFacts)
return
}
await postReview({
github,
context,
core,
dry,
body,
event: 'REQUEST_CHANGES',
reviewKey,
})
} else if (
maxRebuildCount >= 500 &&
!isExemptKernelUpdate &&
!isExemptHomeAssistantUpdate
) {
const stagingBranch =
base === 'master' ? 'staging' : `staging-${split(base).version}`
const body = [
`The PR's base branch is set to \`${base}\`, and this PR causes ${maxRebuildCount} rebuilds.`,
`Please consider whether this PR causes a mass rebuild according to [our conventions](https://github.com/NixOS/nixpkgs/blob/master/CONTRIBUTING.md#branch-conventions).`,
`If it does cause a mass rebuild, please [change the base branch](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/changing-the-base-branch-of-a-pull-request) to [the right base branch for your changes](https://github.com/NixOS/nixpkgs/blob/master/CONTRIBUTING.md#branch-conventions) (probably \`${stagingBranch}\`).`,
`If it does not cause a mass rebuild, this message can be ignored.`,
].join('\n')
if (decision === 'nixos-rebuild') {
await postNixosRebuildReview(reviewFacts)
return
}
await postReview({
github,
context,
core,
dry,
body,
event: 'REQUEST_CHANGES',
reviewKey,
})
if (decision === 'possible-mass-rebuild') {
await postPossibleMassRebuildReview(reviewFacts)
return
}
if (decision === 'skip-development-merge') {
core.info(
`Skipping checkTargetBranch: PR merges the development branch ${head} into ${base}`,
)
} else {
core.info('checkTargetBranch: this PR is against an appropriate branch.')
await dismissReviews({
github,
context,
core,
dry,
reviewKey,
})
}
await dismissReviews({
github,
context,
core,
dry,
reviewKey,
})
}
module.exports = checkTargetBranch

View File

@@ -1,5 +1,10 @@
{
"private": true,
"scripts": {
"typecheck": "tsc --build",
"testsuite": "node --test",
"test": "npm run typecheck && npm run testsuite"
},
"//": [
"Keep `@actions/core` and `@actions/github` in sync with",
"https://github.com/actions/github-script/blob/main/package.json."

View File

@@ -1679,6 +1679,7 @@
./services/web-apps/haven.nix
./services/web-apps/healthchecks.nix
./services/web-apps/hedgedoc.nix
./services/web-apps/hister.nix
./services/web-apps/hledger-web.nix
./services/web-apps/homebox.nix
./services/web-apps/homer.nix

View File

@@ -195,6 +195,25 @@ in
Only set this to true if you are certain you are working with a fresh, empty database.
'';
};
adoptConfig = mkOption {
type = types.bool;
default = false;
description = ''
Whether to let this module manage a pre-existing config.php,
such as a hand-maintained one (typically with
{option}`createDatabaseLocally` = false).
By default, a config.php this module didn't create is left alone:
{option}`baseUrl` and {option}`database` are not applied to it, so
real settings can't get silently overwritten by their defaults.
Before enabling this, make sure {option}`baseUrl` and
{option}`database` already match the file's real values. Once
enabled, config.php is regenerated from these options on every
activation, and anything in the file not covered by them is lost.
'';
};
};
config = mkIf cfg.enable {
@@ -287,6 +306,16 @@ in
cp -f ${cfg.package}/share/php/flarum/{extend.php,site.php,flarum} .
ln -sf ${cfg.package}/share/php/flarum/vendor .
ln -sf ${cfg.package}/share/php/flarum/public/index.php public/
${optionalString cfg.adoptConfig "touch .flarum-installed"}
# config.php with no marker means we didn't write it, so leave it alone.
# This check must come before the guard below: that guard also touches
# the marker, which would make this check pass for the wrong reason.
if [ ! -f .flarum-installed ] && [ -f config.php ]; then
echo "flarum-install: config.php exists but wasn't written by this module; leaving it untouched." >&2
echo "flarum-install: set services.flarum.adoptConfig = true to adopt it." >&2
else
''
+ optionalString (cfg.createDatabaseLocally && cfg.database.driver == "mysql") ''
if [ ! -f .flarum-installed ]; then
@@ -306,14 +335,18 @@ in
fi
''
+ ''
install -m 0600 ${configPhpFile} config.php
${optionalString (cfg.databasePasswordFile != null) ''
${pkgs.replace-secret}/bin/replace-secret '@databasePassword@' \
${escapeShellArg cfg.databasePasswordFile} config.php
''}
touch .flarum-installed
install -m 0600 ${configPhpFile} config.php
${optionalString (cfg.databasePasswordFile != null) ''
${pkgs.replace-secret}/bin/replace-secret '@databasePassword@' \
${escapeShellArg cfg.databasePasswordFile} config.php
''}
fi
php flarum migrate
php flarum cache:clear
if [ -f config.php ]; then
php flarum migrate
php flarum cache:clear
fi
'';
};
};

View File

@@ -0,0 +1,224 @@
{
config,
lib,
pkgs,
...
}:
let
cfg = config.services.hister;
yamlFormat = pkgs.formats.yaml { };
dataDir = if cfg.dataDir != null then cfg.dataDir else "/var/lib/hister";
generatedConfig = yamlFormat.generate "hister-config.yml" cfg.settings;
hasConfig = cfg.configPath != null || cfg.settings != { };
runtimeConfigSource = if cfg.settings != { } then generatedConfig else cfg.configPath;
runtimeConfig = "/run/hister/config.yml";
histerEnv =
lib.optionalAttrs (cfg.port != null) {
HISTER_PORT = toString cfg.port;
}
// lib.optionalAttrs hasConfig {
HISTER_CONFIG = runtimeConfig;
}
// {
HISTER_DATA_DIR = dataDir;
};
privilegedPort = cfg.port != null && cfg.port < 1024;
in
{
meta.maintainers = with lib.maintainers; [ _4evy ];
options.services.hister = {
enable = lib.mkEnableOption "Hister, a web history service with content-based search";
package = lib.mkPackageOption pkgs "hister" { };
user = lib.mkOption {
type = lib.types.str;
default = "hister";
description = "User account under which Hister runs.";
};
group = lib.mkOption {
type = lib.types.str;
default = "hister";
description = "Group under which Hister runs.";
};
dataDir = lib.mkOption {
type = lib.types.nullOr lib.types.path;
default = null;
example = "/var/lib/hister";
description = ''
Directory where Hister stores its data. When `null` (the default), the
service is isolated under `/var/lib/hister` via systemd's
`StateDirectory=`. When set to an explicit path, that path is created
with `systemd-tmpfiles` and granted via `ReadWritePaths=` instead.
'';
};
port = lib.mkOption {
type = lib.types.nullOr lib.types.port;
default = null;
example = 4433;
description = ''
Port on which Hister listens. When set, this overrides the port in
`server.address` from the configuration file via the `HISTER_PORT`
environment variable.
'';
};
openFirewall = lib.mkOption {
type = lib.types.bool;
default = false;
description = ''
Whether to open {option}`services.hister.port` in the firewall. Has no
effect if `port` is `null`.
'';
};
configPath = lib.mkOption {
type = lib.types.nullOr lib.types.path;
default = null;
example = "/etc/hister/config.yml";
description = ''
Path to an existing Hister configuration file mounted read-only into
the service runtime directory and passed via `HISTER_CONFIG`. Mutually
exclusive with {option}`services.hister.settings`.
'';
};
environmentFile = lib.mkOption {
type = lib.types.nullOr lib.types.path;
default = null;
example = "/run/secrets/hister.env";
description = ''
Path to an environment file (read at service start) used to inject
secrets such as `HISTER__APP__ACCESS_TOKEN` without placing them in the
world-readable Nix store.
'';
};
settings = lib.mkOption {
type = yamlFormat.type;
default = { };
description = ''
Hister configuration rendered to YAML and passed via `HISTER_CONFIG`.
Accepts any structure the server accepts: see the `app`, `server`,
`indexer`, `crawler`, `hotkeys`, `extractors`, `semantic_search`, and
`sensitive_content_patterns` blocks documented upstream.
'';
example = lib.literalExpression ''
{
app = {
search_url = "https://google.com/search?q={query}";
log_level = "info";
};
server = {
address = "127.0.0.1:4433";
database = "db.sqlite3";
};
hotkeys.web = {
"/" = "focus_search_input";
"enter" = "open_result";
};
}
'';
};
};
config = lib.mkIf cfg.enable {
assertions = [
{
assertion = !(cfg.configPath != null && cfg.settings != { });
message = "Only one of services.hister.configPath and services.hister.settings can be set";
}
];
environment.systemPackages = [ cfg.package ];
users.users = lib.mkIf (cfg.user == "hister") {
hister = {
description = "Hister web history service";
group = cfg.group;
isSystemUser = true;
};
};
users.groups = lib.mkIf (cfg.group == "hister") {
hister = { };
};
systemd.tmpfiles.settings."10-hister"."${dataDir}".d = lib.mkIf (cfg.dataDir != null) {
user = cfg.user;
group = cfg.group;
mode = "0750";
};
systemd.services.hister = {
description = "Hister web history service";
after = [
"network.target"
"systemd-tmpfiles-setup.service"
"systemd-tmpfiles-resetup.service"
];
wantedBy = [ "multi-user.target" ];
environment = histerEnv;
serviceConfig = {
ExecStart = "${lib.getExe cfg.package} listen";
Restart = "on-failure";
User = cfg.user;
Group = cfg.group;
RuntimeDirectory = lib.mkIf hasConfig "hister";
RuntimeDirectoryMode = lib.mkIf hasConfig "0750";
BindReadOnlyPaths = lib.mkIf hasConfig [ "${runtimeConfigSource}:${runtimeConfig}" ];
StateDirectory = lib.mkIf (cfg.dataDir == null) "hister";
StateDirectoryMode = lib.mkIf (cfg.dataDir == null) "0750";
ReadWritePaths = lib.mkIf (cfg.dataDir != null) [ cfg.dataDir ];
EnvironmentFile = lib.mkIf (cfg.environmentFile != null) cfg.environmentFile;
AmbientCapabilities = lib.mkIf privilegedPort [ "CAP_NET_BIND_SERVICE" ];
CapabilityBoundingSet = if privilegedPort then [ "CAP_NET_BIND_SERVICE" ] else [ "" ];
NoNewPrivileges = true;
ProtectSystem = "strict";
ProtectHome = true;
PrivateTmp = true;
PrivateDevices = true;
ProtectKernelTunables = true;
ProtectKernelModules = true;
ProtectKernelLogs = true;
ProtectControlGroups = true;
ProtectClock = true;
ProtectHostname = true;
ProtectProc = "invisible";
ProcSubset = "pid";
LockPersonality = true;
RestrictNamespaces = true;
RestrictRealtime = true;
RestrictSUIDSGID = true;
RemoveIPC = true;
RestrictAddressFamilies = [
"AF_INET"
"AF_INET6"
"AF_UNIX"
];
SystemCallArchitectures = "native";
SystemCallFilter = [
"@system-service"
"~@privileged"
];
MemoryDenyWriteExecute = true;
UMask = "0077";
};
};
networking.firewall.allowedTCPPorts = lib.mkIf (cfg.openFirewall && cfg.port != null) [ cfg.port ];
};
}

View File

@@ -66,7 +66,9 @@ in
WorkingDirectory = "/var/lib/readeck";
EnvironmentFile = lib.optional (cfg.environmentFile != null) cfg.environmentFile;
DynamicUser = true;
ExecStart = "${lib.getExe cfg.package} serve -config ${configFile}";
# readeck opens config.toml as writable in case it needs to add a secret key...
ExecStartPre = "${lib.getExe' pkgs.coreutils "cp"} --no-preserve=all ${configFile} config.toml";
ExecStart = "${lib.getExe cfg.package} serve -config config.toml";
ProtectSystem = "full";
SystemCallArchitectures = "native";
MemoryDenyWriteExecute = true;

View File

@@ -767,6 +767,7 @@ in
hibernate-systemd-stage-1 = handleTestOn [ "x86_64-linux" ] ./hibernate.nix {
systemdStage1 = true;
};
hister = runTest ./hister.nix;
hitch = handleTest ./hitch { };
hledger-web = runTest ./hledger-web.nix;
hockeypuck = runTest ./hockeypuck.nix;

View File

@@ -81,5 +81,18 @@
"echo 'select id from nixos_test_marker;' | sudo -u flarum mysql -u flarum flarum -N | grep -q 1"
)
machine.succeed("[ -f /var/lib/flarum/.flarum-installed ]")
# A config.php present without the .flarum-installed marker (hand-maintained,
# or from before this module managed config.php) must be left untouched.
machine.succeed("rm /var/lib/flarum/.flarum-installed")
machine.succeed(
"echo '<?php return array (\"url\" => \"http://localhost\", \"database\" => "
+ "array (\"driver\" => \"mysql\", \"host\" => \"localhost\", \"database\" => "
+ "\"flarum\", \"username\" => \"flarum\", \"password\" => \"flarum-db-password\"), "
+ "\"nixos_test_marker\" => \"foreign-config\");' "
+ "| sudo -u flarum tee /var/lib/flarum/config.php"
)
machine.succeed("systemctl restart flarum-install.service")
machine.succeed("grep -q 'nixos_test_marker' /var/lib/flarum/config.php")
'';
}

146
nixos/tests/hister.nix Normal file
View File

@@ -0,0 +1,146 @@
{ lib, pkgs, ... }:
let
configPathConfig = pkgs.writeText "hister-config.yml" ''
app:
title: NixOS Hister Config Path
search_url: https://config.example.invalid/?q={query}
hotkeys:
web:
alt+c: open_query_in_search_engine
'';
in
{
name = "hister";
meta = {
maintainers = with lib.maintainers; [ _4evy ];
};
nodes.machine = {
environment.systemPackages = [ pkgs.jq ];
systemd.tmpfiles.settings."10-hister-env"."/run/hister.env"."f" = {
mode = "0600";
user = "root";
group = "root";
argument = "HISTER__APP__ACCESS_TOKEN=test-token";
};
specialisation = {
inline_settings.configuration.services.hister = {
enable = true;
port = 4433;
environmentFile = "/run/hister.env";
settings = {
app = {
log_level = "debug";
title = "NixOS Hister";
search_url = "https://search.example.invalid/?q={query}";
open_results_on_new_tab = true;
};
hotkeys.web."alt+n" = "open_query_in_search_engine";
};
};
config_file.configuration.services.hister = {
enable = true;
port = 4434;
configPath = configPathConfig;
};
custom_data_dir.configuration.services.hister = {
enable = true;
port = 4435;
dataDir = "/srv/hister-data";
settings.app.title = "NixOS Hister Custom Data";
};
};
};
testScript =
{ nodes, ... }:
let
switchTo =
name:
"${nodes.machine.system.build.toplevel}/specialisation/${name}/bin/switch-to-configuration test";
in
''
start_all()
with subtest("inline settings"):
machine.succeed("${switchTo "inline_settings"}")
machine.systemctl("restart hister.service")
machine.wait_for_unit("hister.service")
machine.wait_for_open_port(4433)
machine.succeed("curl -fsS http://localhost:4433/ | grep -F '<title>Hister</title>'")
machine.succeed("test $(stat -c %a /var/lib/hister) = 750")
machine.succeed("test $(stat -c %a /run/hister) = 750")
machine.succeed("test -s /run/hister/tui.yaml")
machine.succeed("test -s /var/lib/hister/db.sqlite3")
machine.succeed("test -s /var/lib/hister/.secret_key")
machine.succeed("test -s /var/lib/hister/rules.json")
machine.succeed(
"curl -fsS http://localhost:4433/api/config"
+ " | jq -e "
+ "'"
+ '.baseUrl == "http://127.0.0.1:4433"'
+ ' and .title == "NixOS Hister"'
+ ' and .searchUrl == "https://search.example.invalid/?q={query}"'
+ ' and .openResultsOnNewTab == true'
+ ' and .hotkeys."alt+n" == "open_query_in_search_engine"'
+ ' and .authMode == "token"'
+ "'"
)
machine.fail("journalctl -u hister.service | grep -F 'Failed to create tui.yaml'")
with subtest("configPath"):
machine.succeed("${switchTo "config_file"}")
machine.systemctl("restart hister.service")
machine.wait_for_unit("hister.service")
machine.wait_for_open_port(4434)
machine.succeed("curl -fsS http://localhost:4434/ >/dev/null")
machine.succeed("test $(stat -c %a /run/hister) = 750")
machine.succeed("test -s /run/hister/tui.yaml")
machine.succeed("test -s /var/lib/hister/db.sqlite3")
machine.succeed("test -s /var/lib/hister/.secret_key")
machine.succeed("test -s /var/lib/hister/rules.json")
machine.succeed(
"curl -fsS http://localhost:4434/api/config"
+ " | jq -e "
+ "'"
+ '.baseUrl == "http://127.0.0.1:4434"'
+ ' and .title == "NixOS Hister Config Path"'
+ ' and .searchUrl == "https://config.example.invalid/?q={query}"'
+ ' and .hotkeys."alt+c" == "open_query_in_search_engine"'
+ ' and .authMode == "none"'
+ "'"
)
machine.fail("journalctl -u hister.service | grep -F 'Failed to create tui.yaml'")
with subtest("custom dataDir"):
machine.systemctl("stop hister.service")
machine.succeed("rm -rf /var/lib/hister")
machine.succeed("${switchTo "custom_data_dir"}")
machine.systemctl("restart hister.service")
machine.wait_for_unit("hister.service")
machine.wait_for_open_port(4435)
machine.succeed("curl -fsS http://localhost:4435/ >/dev/null")
machine.succeed("test $(stat -c %U:%G:%a /srv/hister-data) = hister:hister:750")
machine.succeed("test $(stat -c %a /run/hister) = 750")
machine.succeed("test -s /run/hister/tui.yaml")
machine.succeed("test -s /srv/hister-data/db.sqlite3")
machine.succeed("test -s /srv/hister-data/.secret_key")
machine.succeed("test -s /srv/hister-data/rules.json")
machine.succeed("test ! -e /var/lib/hister")
machine.succeed(
"curl -fsS http://localhost:4435/api/config"
+ " | jq -e "
+ "'"
+ '.baseUrl == "http://127.0.0.1:4435"'
+ ' and .title == "NixOS Hister Custom Data"'
+ ' and .authMode == "none"'
+ "'"
)
machine.fail("journalctl -u hister.service | grep -F 'Failed to create tui.yaml'")
'';
}

View File

@@ -136,6 +136,11 @@ in
url = "https://cgit.git.savannah.gnu.org/cgit/emacs.git/patch/?id=8466eb44991707d128110bdc549fad14c8e1d61e";
hash = "sha256-SyRCay2MahCJovtzBHA9M1H9hXhtD5IG3ZFSEUwaWlg=";
})
(fetchpatch {
name = "CVE-2026-79992.patch";
url = "https://gitweb.gentoo.org/proj/emacs-patches.git/plain/emacs/30.2/05_all_tramp.patch?id=2a6292f81affedcc468c594c60808e652ae87118";
hash = "sha256-WMjTscIuOXakuTO2H+w/Hd61V61V6ZrLh9WPMd58l+M=";
})
];
});
@@ -166,6 +171,11 @@ in
url = "https://cgit.git.savannah.gnu.org/cgit/emacs.git/patch/?id=8466eb44991707d128110bdc549fad14c8e1d61e";
hash = "sha256-SyRCay2MahCJovtzBHA9M1H9hXhtD5IG3ZFSEUwaWlg=";
})
(fetchpatch {
name = "CVE-2026-79992.patch";
url = "https://gitweb.gentoo.org/proj/emacs-patches.git/plain/emacs/30.2/05_all_tramp.patch?id=2a6292f81affedcc468c594c60808e652ae87118";
hash = "sha256-WMjTscIuOXakuTO2H+w/Hd61V61V6ZrLh9WPMd58l+M=";
})
];
});
}

View File

@@ -10,11 +10,11 @@
buildMozillaMach rec {
pname = "firefox-beta";
binaryName = "firefox-beta";
version = "154.0b10";
version = "155.0b5";
applicationName = "Firefox Beta";
src = fetchurl {
url = "mirror://mozilla/firefox/releases/${version}/source/firefox-${version}.source.tar.xz";
sha512 = "ddbe3ff45217a16df9eecfac52fcb12425accae76457e7054b20bd085f5b22908940a20448f213c3dc62d1276bb1c81f38194432336ba97459b2c17393ebd3cd";
sha512 = "30b4b84c80057a992e763b8f967c65f46308324fd41c0307c9302e262e6428c379861ccd9ce52dde15d0dc3f4410b95a8c047ea7e5af9d90e60e7bb57ee59137";
};
meta = {

View File

@@ -10,13 +10,13 @@
buildMozillaMach rec {
pname = "firefox-devedition";
binaryName = "firefox-devedition";
version = "154.0b10";
version = "155.0b5";
applicationName = "Firefox Developer Edition";
requireSigning = false;
branding = "browser/branding/aurora";
src = fetchurl {
url = "mirror://mozilla/devedition/releases/${version}/source/firefox-${version}.source.tar.xz";
sha512 = "e2275579e4769a0690010d8fbba528a0e347d86f0dc981d1702b3e627d9c73f3fd7399d3e618c514bf6a3c0059fa3aa5a29f9cdec802e52955a03b1122ca8d39";
sha512 = "8e9ccc65a8cd6640171d4891fe8d01435cd524cee8164a5829429df827bcc2b49c3b7e6a092aaf5bfa48140d7f40f6c9cb371af48a7321132ea6ee5da0af08e3";
};
# buildMozillaMach sets MOZ_APP_REMOTINGNAME during configuration, but

View File

@@ -1,45 +1,45 @@
{
"@esbuild/aix-ppc64@npm:0.28.0": "bedc005d10511c3ee50a02edbb380d3134d34f038cb2638257cb9344aa399276e672c44f7e7eb395a96ccc843e0a5903eb0349f22be30af49ae338ed222d5662",
"@esbuild/android-arm64@npm:0.28.0": "76fa5b984e742b96e427749530e4e973b8da60950163c2dbd766c75ed4f616b7f06d08f01d5b6bd06b6a25cf59b27c3519a4ba343792003b5fcadf463b3d6575",
"@esbuild/android-arm@npm:0.28.0": "b1e649f838c94ebac74e1c10561f010608f7226c0e444b4e178546cf6295bd46d691c52542bbe01598004e638bf9d75ed688b85b6ae31df55f2e2194482733ff",
"@esbuild/android-x64@npm:0.28.0": "9b611b9099d552e755d7b6b28dc39c26aad759ceb9379761a0bf2dfe6077c2437aea784152aefc711166b55c4159f03e6e2f39c1c71ffb923c5ef75c93f7282b",
"@esbuild/darwin-arm64@npm:0.28.0": "09ecf7709c8d86f35624fa9d3475ccb3d1beb9704ddfd71b71adcefc23c3aa8ab95263542bbca52cb0d50f23cf831f468968978969184e1da00dc84cd8c61953",
"@esbuild/darwin-x64@npm:0.28.0": "ba5ab146a8542f093bbe752fe85402894da18b304ae1f08eb455a864f124c61e1e03f8ad18c28eb2b9c1bd930c54dc773ad32b7ab4c7d7eb31f7be04451e74f4",
"@esbuild/freebsd-arm64@npm:0.28.0": "8c05cebfefb0c9f481b52ce8b0290d0e5f6fda17939e27d60d6440c00312a5a10b82ca6e8ddbc19c9a1a2973282c9393958b8ace0512741d76429465d3bdb415",
"@esbuild/freebsd-x64@npm:0.28.0": "da4a620d46b73b610dccfa8c80d110175bb207e0a6bd1bfa96f98d427b3d14bbe54096ccdabaf10fb189a21f6555f7721737106d30ff12933c08ef1aee7adac0",
"@esbuild/linux-arm64@npm:0.28.0": "589f88f21542ff9822fee3f6130051f19e19ec6714abc48d39795b201585c4f0e8dac42ec10a3e61521a4ad499abad5b3a8a8424d871ff5f464b86ba1bae8a65",
"@esbuild/linux-arm@npm:0.28.0": "429f4d7b938f2b72884f472bd9288c91899cacb4bf9c61df293dbe9e3c0368cc1700171cf86c3051df9e6ebdc8c1366db6a573995d327f156de63fd28a23e3a7",
"@esbuild/linux-ia32@npm:0.28.0": "45fcf60da75745f20ec6d98914de1dbb6bd97231a3d9fa1861a47ae43eb7db23780696530d17d68ee55693d189672b763cbdb9d0ad1ee5429ee9c7168a23dce8",
"@esbuild/linux-loong64@npm:0.28.0": "d7a5710068e5909661f48c276d82c836b9b6131076e550c83d83e63db3f2538ecd3a3694dcbf8129bb773f7ca580b2fbef38ec15b9028d246cbc0e77a1a5946c",
"@esbuild/linux-mips64el@npm:0.28.0": "1aa72c485a56cf432748b8e0527e86a88deda0574e13d914dbe657dc2878ecc8b441783bd6c1582c0359b5a33d30216c0c94b3c9c17e5ca975fe6aa4b80aaa2c",
"@esbuild/linux-ppc64@npm:0.28.0": "306bf03b0f6fd738bf74d9dfb23b8937227521b832fd901994600691b1f1fadb698a67a9990713b72ca1114715f82f0df35877281945e81b824ed437bf432742",
"@esbuild/linux-riscv64@npm:0.28.0": "c09c0f0ada23a3e55767586f3a341958c071d0b9adfe5460986e5e69f7397dfe2e37e2896a1c61092cececa929241d37f19b75ed608f5f00d535cd3b24c4ef1f",
"@esbuild/linux-s390x@npm:0.28.0": "40a939574f16362a5c9f1f82c20a8d82686efcf5f77e4b6c7e5c05bdcc596d8ce2ca188e6e7fa4772d4167bd18da630a3a3b3b70aa28308d3a9d1d48ff112feb",
"@esbuild/linux-x64@npm:0.28.0": "cde673ae0b9945bdc665c68b2df7ebe39d37bcd388c8e607ed4d369e7b6123ecdf3d1feb097ae13403d83c15952cb952d16f96146fa1a52405f09ec0e438d0f6",
"@esbuild/netbsd-arm64@npm:0.28.0": "c9738a8c3cfb817d9fbb46aa52fa532a0a74dc6d7d4e260e1eb8fd0acf729208932ce7f43e2c2dbf6cb1ca21f5db55f329936f81ae871953ff0e67e42d8eb362",
"@esbuild/netbsd-x64@npm:0.28.0": "c0be9ca72b5c18279e02e63a17a7fef428395f48fc1e0e251622c3cfe8a70b15cfb0bb814d355318917461a4e20d11723b837f6e4d1f1c0ce44e915ff80b3047",
"@esbuild/openbsd-arm64@npm:0.28.0": "fda84f2526cb29d943047f68e725c688e4a89ebcbc224e19ddc3479509783cd254e581b19c8fad1a28e55e193512f37842252f36b06b3df2c005a0dbca0a0d84",
"@esbuild/openbsd-x64@npm:0.28.0": "7a67881986611c0b851c246c2ccdb445ecc5e587c70efae0165cd963d149ebfec3a7b6820338cf38dc70cee95fbd17e80dcb636c7f1de113c9a85dfe867a0d97",
"@esbuild/openharmony-arm64@npm:0.28.0": "8cd175332efcedc6b69a980410426cbb7c76ed264f28cbf16cc807938e29f39c03353901179a88655377c39db1860d9df5c76294f2624a2db75b387334e9baa3",
"@esbuild/sunos-x64@npm:0.28.0": "99820c945c05651182afe4ec5a1bad80790775acefa403f25ad48ed9638efc573f3bf6fabdd273556854c609990a8a0c8fda7b140edabe3322d6a3ea77734d9c",
"@esbuild/win32-arm64@npm:0.28.0": "84314f636841e4568e4960e4ee50e66c5d4d74fc274d256f3c903904186014bed197316c8bedb3c38f9855ca8ad9c4ecc1c6e64df4c40ea6cd5f4cb7739ab66c",
"@esbuild/win32-ia32@npm:0.28.0": "41296dae0b5e74ca689460cd510cb88df7b92d0c027130c373138e09847dd48eb685c2c825f36337a7bff7c6eceba2cb75b7f4f76d78e140504159a59e2feb89",
"@esbuild/win32-x64@npm:0.28.0": "f2d53b57cb338ddf0bbfb5eb64dc95bd0b686817eee8ab2307085c04f18e1d9d5b27e1b74f327cd46a8f246e3df9fc6ee9158ab9977255b7d4a511d438e411de",
"@rolldown/binding-android-arm64@npm:1.0.1": "47696e8b2ccd0f243f742353bd59ab6ba9730c139d26761ca273800236a022466caafb6b28def7cda5309cee464fe4fabb8d7d356453f794c91c6c4a60cc3d20",
"@rolldown/binding-darwin-arm64@npm:1.0.1": "fff9883fa91eae1f5d40b3ef2608fb0bae33d3b178e886627bd7b6e4a621fddf7db6afdd8435b57f0f85b56fdfe84b2a299eea39ed50bfd1683df5da2d5603bd",
"@rolldown/binding-darwin-x64@npm:1.0.1": "ab8fdfd5cb08ffa6c01c5fd7ba5866a57a81f0cb129dae21ad8260a57bf166684475964fee1209c20a522d57d16c6d95ee4c29936371deb2ae40abe73ab2d1c4",
"@rolldown/binding-freebsd-x64@npm:1.0.1": "c43d4f0a46a9bf1ec23474bd38369080e1e69168385241555958f78103c602ba892008848ad6a7ff0fc77a5c3dd535e5fd74f8b32e2da64a2d65fc8001df5564",
"@rolldown/binding-linux-arm-gnueabihf@npm:1.0.1": "594c3e1bc4e16cc5ff5901c320f2bd84a3e613cd8581ae488650cca022350e3d7cceeb6bd831c4dabe74d2541a6c355ae7f99d08ed018443c75f6cd08fc92059",
"@rolldown/binding-linux-arm64-gnu@npm:1.0.1": "78b4c350ec41e385ac0f5b5cb07fdc4f1660e6ef7615f17c18589f309bff4e9423dc738a18e5ee662c2a58e951688976e7941a749a25a36aeec7a8971cf77448",
"@rolldown/binding-linux-arm64-musl@npm:1.0.1": "1c3abd853331b4a21a6aed91be19c7efecf47fed12e332a2209218e8bed0ab613f6cdbe531ced73e54ca79833fb3333ab5a111fb9f9557877a44187bca097f5c",
"@rolldown/binding-linux-ppc64-gnu@npm:1.0.1": "fa0e84291d5b15e729ad7345efe25317a57b7e57592903bb69cf851fefcb9996d5bee1f3992741cb6dc7d69cbb60cf5fb55762d77e8b67ced356b965d04242a4",
"@rolldown/binding-linux-s390x-gnu@npm:1.0.1": "a3e8baf077c063943743926807a3aa3a8beafb13738e849f2873bb585a65156134fe10201cd85dfe159d8f7f0b4ca75417c6581f5e8958a0b9d9330ea03942ae",
"@rolldown/binding-linux-x64-gnu@npm:1.0.1": "ba3919ec184935b8583d288bb6308003eaa56ba120acc6aaa3803891c45d335b28bd193aaf16bf3b2b013ae5c0be8f80922c527a2902dcae976f6a1f6718a713",
"@rolldown/binding-linux-x64-musl@npm:1.0.1": "c537717d76a6eb60889ed700575b48f32ba443314587e0617b5e364f3d204fbaaa5e990ec6b62b192226b4c5b9bb780b62bbbe64be2ccb60ecce6fb233123f9c",
"@rolldown/binding-openharmony-arm64@npm:1.0.1": "5d140313e75fa95556cd1b0de06b662b7c28af3c094640934017f58141de3648ed00064d7412e1f67a39c5a40ba023d6adcd584f2eaa45b6a1cbf912da52abda",
"@rolldown/binding-wasm32-wasi@npm:1.0.1": "078f9af1c6aba8c6c687cd5ccc10e93ff60de4e0297dafaa3f9c081cbaa603c029b9feb2fad0b2b3a8ffb82dad6bdb111e73e66082f09ea7a6e7e68e39304105",
"@rolldown/binding-win32-arm64-msvc@npm:1.0.1": "453ba3fe5629f25c444059988d14e0b5691df2a2607433f8674374eb5cf2e0e11345d33676f7d1a79fe1d819ab7685d96afe95582a465540a6b0af2fb4d4808a",
"@rolldown/binding-win32-x64-msvc@npm:1.0.1": "8eb2a1fa72497d1c5d947c0ecca6e13e37f065e2953f4be26a6a6b681b5eb3b51cd160ea0aca3fbaf565f4170f009951054adaf79bf24497d904d57ec703ae74",
"@esbuild/aix-ppc64@npm:0.28.2": "532f5b55262aef55e92cc60014f5dbb016122d84c85a5369d715035f1d18e47d916a292cb63673e52aca3c463b3829ad6adb257d5f7d7228a6fb55ed144fdf00",
"@esbuild/android-arm64@npm:0.28.2": "3cac1f07c479ac5fc35406e208189734c997253a1cbce64112549ce766ae884f10ea5b2bcddf9932c8f8f61f7eb7904c74f49444c4e58d1bf9e76d389227a26c",
"@esbuild/android-arm@npm:0.28.2": "e72d53f09d78b28cff55dbafb5635fa1c9327047cff9218991be2869f2adcfbee9d405109b66411ca2b6501273002ed2c41e2c82c985aec72b4dd6ddc755090f",
"@esbuild/android-x64@npm:0.28.2": "a42c252316c4750d622781e313065bff9da6924a98fba8e9e70aacd043387bc445115bf2d0dfa8176253ab7033e40597114b86c5794135aef9d96bfe2058e799",
"@esbuild/darwin-arm64@npm:0.28.2": "eaddd98934ea667dd0573a87376a77ed38d5256e8976a9f9d2612c22d795b08dc08015fe5b57dccca67b91578a7defd27bad1864a6feb4b39e1773dd837033a6",
"@esbuild/darwin-x64@npm:0.28.2": "7e10c00ebd47ae17987f09f0c95e7a98306f9fff19277d9755e2d808c4a83055a624e9c71b8672dac4373effb0f20f3548e877a2f2b44af4de0af72c036cdb0a",
"@esbuild/freebsd-arm64@npm:0.28.2": "f17cdd3604a23e9dcb486a80fd4f197f57d9870e78d9c2b255a0b74bff3c624b4811dd9b18db0be43543c99d503069b51932c16dc70d001672f8117905f3e514",
"@esbuild/freebsd-x64@npm:0.28.2": "e01ca12c86ff619cd3eae254ace2c8ce49d11cd879a2e77db1cc4e4b1419f84c8f9e887e6607f41349169fa23825c3406559547b95b2fef3f422658f028da4aa",
"@esbuild/linux-arm64@npm:0.28.2": "2a9c1a66a43bfcf36105f7dac5f9c169237b3b18463d822d7278c52b8414483e66f9ea669f8c49dab39af2dd91dfefa8c93943fc7e91c770d44dda09f6824923",
"@esbuild/linux-arm@npm:0.28.2": "5a913524b3b36063d37af3757f8b74f3b8528c82949c6595dd2a951650d5b69f04552362c3e32b546e851e84129df2a311815844efbf37b60dae47f92374c998",
"@esbuild/linux-ia32@npm:0.28.2": "e68de896188c417a0582117919b1bed47b2b235358ed1836fb8c17a214afb178d4f54dbdbe724eed990d8d2d2c1c391088cfd6637cdd0432062d2c3981b49213",
"@esbuild/linux-loong64@npm:0.28.2": "1adac09caf8ba573fa2fd4eaa34e720e439df0d17d2805d5c57fcafc01ab9e94a14d3457eafbe306629cd027028dafacc77e25a4f2730ae0602664ef5ef92695",
"@esbuild/linux-mips64el@npm:0.28.2": "6ce3422c183387a9126138f11d8143cdb94056658e4c007168e7801d5bda1947500fc9b6f671416e68e13afb762033021ec76b16fbdb9d75730593784d5b0229",
"@esbuild/linux-ppc64@npm:0.28.2": "4d772c34b72c5a5f35635204dd630ea560fc5a4ac06c5c0de247472adb8e6cfa170da0de9cc02421608d6c36463826097ea5630c2d66964ef4d49b3e7d918b62",
"@esbuild/linux-riscv64@npm:0.28.2": "3b2c61ec50b9af8079e72ba68cd130aa67113bbb039ae0bd07451ab34ca07cbfdc7175fea4ed3b8918fbce36f5a49056d8c1683f36e66aa3d884f4eb0159c116",
"@esbuild/linux-s390x@npm:0.28.2": "ee2520a6dee59461cd71f94b5ffbf238283e850defdfe4c25cdee3600e8c728f88d886233d92f3cac2371f647cb519a62af30899848ff0a9e4df3525a85d00b5",
"@esbuild/linux-x64@npm:0.28.2": "5e2ebf6534f2eaba70d67906aedc59ae84d763b07af9738a2a45adb44bd51ec2298dc94d2447e9d60dee8f6e2d58e137bd0f7e53435436f123bda1cfcf2fd0ce",
"@esbuild/netbsd-arm64@npm:0.28.2": "f4559f1abcb85732d71b6f123555eec54373cabfc2ed7c4d56ea9c10b6c262d30f1a1867ddb55e1b6f77414ee85594768e3d243f9d57eec09c72b67d6a37cd4c",
"@esbuild/netbsd-x64@npm:0.28.2": "852010db3be0e867a556f156f9fea93f33d9bf2b53164a584d212cbb972fda18b6f094f7886f08b68c66958909dccf3ef33e5f70cfe6cc71cc17ee3a92015ad0",
"@esbuild/openbsd-arm64@npm:0.28.2": "cc528c9b126d8aa3633faf07f796b9e380d85d309f5499d3f075a9da86a60a2a61c73f42dcdb5577442a4d9af07d22ed7f6b844665c1f6373a15730c75b68c90",
"@esbuild/openbsd-x64@npm:0.28.2": "ede88d45016e3dd3c77a49657c5608feb1331bcf1e0b7bfb2bfd87d07b687e5d687ffce962ac7e55a5a29b83e5824c91611406e3cd9317b6efed53b6e8f442bc",
"@esbuild/openharmony-arm64@npm:0.28.2": "7b8b3c8baf73151a473878b9d40fdd87f86bee4a9b28325f4f0ece236a0f98fad7b393d1b5f12268b7c122fbcfb3872c1467cabd4745cf8698a78b60241138cc",
"@esbuild/sunos-x64@npm:0.28.2": "f70b672bb0c8179d92e87077fcfea60b0971f8071830f574c85ef1706a6770deaa31f28adf3c1a08506403e9735d81a4e28e5d2ad1c3cbc15af2433112dceb4b",
"@esbuild/win32-arm64@npm:0.28.2": "9aa6841164e80b4d77fd267a9cd160be46586ea561fcb6d99507989856682dbdc007ab2d3c320787ea50ec0a2c1802395dc6c3cd4b254eb5ddac8a3a7705c319",
"@esbuild/win32-ia32@npm:0.28.2": "51d216d2a9cdc1ae2407ac88c4ea02be5b5cc9c618cfd846946b5691f9513de762e6a718222c3de02b14426b4939e040c98de7d424994837bed6ecbb1347b9ff",
"@esbuild/win32-x64@npm:0.28.2": "b109c1080e6ff5fcd9da0c61a6915d296837702234609b737284c01c38cc3a245caa351702da27114ae9cd17c4a577a5674375c4138269f63a578e46f6686066",
"@rolldown/binding-android-arm64@npm:1.0.3": "35e2b7f9e54c526cee5433351b0ef376dd1657d8a6eecf00512dec4720bb02594268bf8d3b661199917bdd286d4370bf3c3461b08eb74f0eae77bd13585e260a",
"@rolldown/binding-darwin-arm64@npm:1.0.3": "7e7d168d091053100a785c0240d6d6134039bf0fb7a658624fa33426b148e9b8131d1690729b32a7b1e65329879c15601b7afd576e149ca6feb6302c530ed860",
"@rolldown/binding-darwin-x64@npm:1.0.3": "0721c045d1446138e49dca250c8716c1b2eb4f1595bf1226a2c273befa063f91c4623e4cd5d338e969626e4281541b958c4a3d4649c0c553da0ec42292450a8d",
"@rolldown/binding-freebsd-x64@npm:1.0.3": "faa48a73ac1b1a4af8ed7b67932a59b62f139d76f21d1ccbe5efb5ab8a5a61e1f5de0b5d9367a9ecd8759bdab3aa1734aefd2214bbe2cfc4b0cb119f6e5391da",
"@rolldown/binding-linux-arm-gnueabihf@npm:1.0.3": "fab607d7639bf6d3393f6e0da0c9680e2d357b550abc50d7dc60cd45e25c788cddee38deac074d9c987e22532d83dcd8a76564710654663bd65622a190548c72",
"@rolldown/binding-linux-arm64-gnu@npm:1.0.3": "a067fc8d80a6af88893010abb55d697221afa8f9d3f468082bc759305f2decbf16f8655a5313e6e608d1b2f103d28922607290ab85d575b78930bc9daa777204",
"@rolldown/binding-linux-arm64-musl@npm:1.0.3": "b1264d8302780c991260991733cf156c1ed43fed66fce60e5a265577aced196b92907cfcbe8d3262621b8e08106f1f555743c601fe60676c08ffae0edd821128",
"@rolldown/binding-linux-ppc64-gnu@npm:1.0.3": "82f33061f5003b99bac68a0637bf7665f6fb2b22cfc025e4d7762afefe703af2acc1cd2df8ff07bb000b0eecd3e59959992481a5b03794604af090eaa843c70f",
"@rolldown/binding-linux-s390x-gnu@npm:1.0.3": "a6a3811352aa5db6a793879bf405bb98eaeca06cfd1aae959a9ed70db39b28e0a022ca50524cdd26d0447fa7b9c5ef913281cf543f816ac6e3ea6b6d620af88a",
"@rolldown/binding-linux-x64-gnu@npm:1.0.3": "13ece4e580f022a1a70031da2036448097bc38d040d1e87ee81cffd9e1ab8b64673e92843718470e3d07ea664171dc2c20d766cbafbb0ca8774e3c4f0b122c7d",
"@rolldown/binding-linux-x64-musl@npm:1.0.3": "6beeffe835e820679868021e01fb629fe124813911dd625bd3d24b1592450c06131b360e284396aca04798e6a85f988917ea00e95b3ea087a32a45441bad3235",
"@rolldown/binding-openharmony-arm64@npm:1.0.3": "f8e8352edde4d2345e3e360bb050915daf0d9ee4c491024a08e56088801994f2cbdf0152f81115a089c1870863e6384135765126114cf8481933bc15678e1dde",
"@rolldown/binding-wasm32-wasi@npm:1.0.3": "3f73081fc41cbd8c117183fecb0f491a71278472c0640b54e57a3a6705005f54d7997c610244d2ff651d5d688a20596ab1119e3dccf607f59fdea4ec0621da49",
"@rolldown/binding-win32-arm64-msvc@npm:1.0.3": "a29f05721b276acdeb7f00b43b9c6241f9c4cc60b820d6b9217d205cfd0ee66a82a29da501e60163c66ce7cc8cb6362f88933b466dea66e3219b38d15954873e",
"@rolldown/binding-win32-x64-msvc@npm:1.0.3": "d6afa484d89c9479561a0621709dfc9737584515f87e96fa74f7d153bbde74f81b6ba7aac92187189ffb4dd1795fa152c596a04ae9a41ffab7437babc5a15838",
"lightningcss-android-arm64@npm:1.32.0": "1cb326ad39dcb02cf9f45025c167b6900e3a04b08f5149d3c5ee26054b00d08db3736fb69183a6c3ed1cb32dddd148608c784b6631b4777623f7dd0c032c392d",
"lightningcss-darwin-arm64@npm:1.32.0": "da954d0c215d0e95f15a92c8717f871017586e1332b98fd40e96196571d2fd3d51a727dc530768afee9f6a04da210510740574dd0c8dbf2ecced79e5996f1a06",
"lightningcss-darwin-x64@npm:1.32.0": "b1d298c9173f839e8447d1917ed8bc5ab098ed0fc4e4b419d36ac5afe8b27bf21cb47d00a35c3d2edadcac598086e9b4f26c992a809d79f9681d6865a230d79e",

View File

@@ -15,13 +15,13 @@ let
in
stdenvNoCC.mkDerivation (finalAttrs: {
pname = "corepack";
version = "0.35.0";
version = "0.36.0";
src = fetchFromGitHub {
owner = "nodejs";
repo = "corepack";
tag = "v${finalAttrs.version}";
hash = "sha256-VgiQ4k6HiRxemtizItL0zkTDpgTnL0ScfSOfgjMpokI=";
hash = "sha256-oa/4Zjw1UIOt/mTPiBGSKhokDMoBMwhrKi7l3qcKqkI=";
};
nativeBuildInputs = [
@@ -40,7 +40,7 @@ stdenvNoCC.mkDerivation (finalAttrs: {
missingHashes
src
;
hash = "sha256-Q7vUJrFUr8ZbDdaMZq8fnJFfIgEFYkHQiUoo2xILaKo=";
hash = "sha256-LAzlLQUmjdxg/NNHgCwVK499RM6p/8csrHow6UAMJUY=";
};
postPatch = ''

View File

@@ -1,28 +0,0 @@
diff --git a/src/auth/Makefile.am b/src/auth/Makefile.am
index 7474e76fb6..e7fc4aad0f 100644
--- a/src/auth/Makefile.am
+++ b/src/auth/Makefile.am
@@ -21,12 +21,11 @@ LUA_LIB =
AUTH_LUA_LIBS =
AUTH_LUA_LDADD =
if HAVE_LUA
-
+AUTH_LUA_LDADD += $(LUA_LIBS)
if AUTH_LUA_PLUGIN
LUA_LIB += libauthdb_lua.la
else
AUTH_LUA_LIBS += $(LIBDOVECOT_LUA)
-AUTH_LUA_LDADD += $(LUA_LIBS)
endif
endif
@@ -200,7 +199,7 @@ endif
endif
if HAVE_LUA
-auth_libs += $(LIBDOVECOT_LUA) $(LUA_LIBS)
+auth_libs += $(LIBDOVECOT_LUA)
endif
if AUTH_LUA_PLUGIN

View File

@@ -1,9 +1,8 @@
import ./generic.nix {
version = "2.4.4";
hash = "sha256-vy0R8TWQQ3BSOyTtWoa65CYgUfsJqkIU6QfnnzaqrI4=";
version = "2.4.5";
hash = "sha256-oZ9wmfsKSr54DB9NebRl+atuDrCL3johkskY6M1Hxmg=";
patches = _: [
# Fix loading extended modules.
./load-extended-modules.patch
./fix-lua-build.patch
];
}

View File

@@ -11,6 +11,7 @@
fetchzip,
dovecot,
openssl,
pkg-config,
libstemmer,
perl,
python3,
@@ -45,6 +46,7 @@ stdenv.mkDerivation (finalAttrs: {
buildInputs = [
dovecot
openssl
pkg-config
]
++ lib.optional (isCurrent && stdenv.hostPlatform.isDarwin) libstemmer
++ lib.optionals withLDAP [

View File

@@ -1,12 +1,12 @@
import ./generic.nix {
version = "2.4.4";
version = "2.4.5";
url =
{
version,
dovecotMajorMinor,
}:
"https://pigeonhole.dovecot.org/releases/${dovecotMajorMinor}/dovecot-pigeonhole-${version}.tar.gz";
hash = "sha256-KZjV0aSDGNJCmEaovaeUy4P8rQQFHBBk5E3vWL3MqNw=";
hash = "sha256-pDvpoE9SRoOB0Nh3cczsILc4N7fnPzpFvfr2+cKZR4M=";
patches = fetchpatch: [
# https://github.com/NixOS/nixpkgs/pull/388463#issuecomment-3066016707
(fetchpatch {

View File

@@ -0,0 +1,103 @@
{
lib,
buildGoModule,
buildNpmPackage,
fetchFromGitHub,
nodejs_22,
sqlite,
yt-dlp-light,
makeBinaryWrapper,
nix-update-script,
pkg-config,
versionCheckHook,
nixosTests,
}:
buildGoModule (finalAttrs: {
pname = "hister";
version = "0.17.0";
src = fetchFromGitHub {
owner = "asciimoo";
repo = "hister";
tag = "v${finalAttrs.version}";
hash = "sha256-UIKQVs2hbzalDeRL1ILUgfMQnues5IFrzWn9Eg5sm30=";
};
__structuredAttrs = true;
strictDeps = true;
vendorHash = "sha256-ozTULKnUrzBy+tK/eSq7exPVjXp43mSzg4EOWG+r1No=";
proxyVendor = true;
nativeBuildInputs = [
pkg-config
makeBinaryWrapper
];
buildInputs = [ sqlite ];
tags = [ "libsqlite3" ];
preBuild = ''
mkdir -p server/static/app
cp -r ${finalAttrs.passthru.frontend}/* server/static/app/
'';
ldflags = [
"-s"
];
subPackages = [ "." ];
postInstall = ''
wrapProgram $out/bin/hister \
--prefix PATH : ${lib.makeBinPath [ yt-dlp-light ]}
'';
nativeInstallCheckInputs = [ versionCheckHook ];
doInstallCheck = true;
passthru = {
frontend = (buildNpmPackage.override { nodejs = nodejs_22; }) {
pname = "${finalAttrs.pname}-frontend";
inherit (finalAttrs) version src;
strictDeps = true;
npmWorkspace = "webui/app";
npmDepsFetcherVersion = 2;
npmDepsHash = "sha256-ueGtZYMrmQeYsJXmA5RRV5GHCEH5Ui+6PDiQ/Nd1quM=";
# vite 8's rolldown pipeline does a dns.lookup('localhost') during `vite build`
# which fails in darwin's relaxed sandbox without loopback access
__darwinAllowLocalNetworking = true;
preBuild = ''
patchShebangs webui
'';
installPhase = ''
runHook preInstall
mkdir -p "$out"
cp -r webui/app/build/* "$out/"
runHook postInstall
'';
};
updateScript = nix-update-script {
extraArgs = [
"--subpackage"
"frontend"
];
};
tests = { inherit (nixosTests) hister; };
};
meta = {
changelog = "https://github.com/asciimoo/hister/releases/tag/v${finalAttrs.version}";
description = "Web history on steroids - blazing fast, content-based search for visited websites";
homepage = "https://github.com/asciimoo/hister";
license = lib.licenses.agpl3Plus;
mainProgram = "hister";
maintainers = with lib.maintainers; [ _4evy ];
platforms = lib.platforms.unix;
};
})

View File

@@ -0,0 +1,12 @@
diff --git i/go.mod w/go.mod
index 0fd8ca7b49..9b7b05b433 100644
--- i/go.mod
+++ w/go.mod
@@ -1,6 +1,6 @@
module github.com/lxc/incus/v7
-go 1.26.7
+go 1.26.6
require (
github.com/FuturFusion/vsock v0.0.0-20260219213046-d78a7104f821

View File

@@ -1,8 +1,10 @@
import ./generic.nix {
hash = "sha256-5XOpT+MnLcPrINHD9VAjDtXSeYAqIsejuOsOpQLMfwc=";
version = "7.3.0";
vendorHash = "sha256-FZ9oVHrZNE/h1w/qWNTdN9/zfn9r6S3ox0W2YKf6hgI=";
patches = fetchpatch2: [ ];
hash = "sha256-9q4YrumeCb8u0O6e0Ftisb33s2dz/DOdUO3JD05W8K0=";
version = "7.4.0";
vendorHash = "sha256-zplmn+JH/zEaQgo2xa5wzc6rCIb5tLIVlM1vYJpw9zQ=";
patches = fetchpatch2: [
./go_1_26_6.patch
];
nixUpdateExtraArgs = [
"--override-filename=pkgs/by-name/in/incus/package.nix"
];

View File

@@ -1,8 +1,8 @@
{
"packageVersion": "154.0.1-2",
"packageVersion": "154.0.1-3",
"source": {
"rev": "154.0.1-2",
"hash": "sha256-cwPJzF9kvbVGAB8lBJSTCoP26k1EKQUKGbngsKmdtt0="
"rev": "154.0.1-3",
"hash": "sha256-IPV+/5NCyoLYaRD5N6bu4doI6R4yxs4cBw8UrJP3E4U="
},
"firefox": {
"version": "154.0.1",

View File

@@ -9,13 +9,13 @@
}:
let
pname = "open-webui";
version = "0.11.0";
version = "0.11.1";
src = fetchFromGitHub {
owner = "open-webui";
repo = "open-webui";
tag = "v${version}";
hash = "sha256-SP5Huefj35PHvVzqS8R/DGSBci/hCHoueEb5RupGVqY=";
hash = "sha256-W3RzBYUtI32Ft1Nw5JM7Z/mgYELNAlFCJmrNa2Wnhu4=";
};
# we need datasets_3 for SpeechT5 embeddings
@@ -36,7 +36,7 @@ let
url = "https://github.com/pyodide/pyodide/releases/download/${pyodideVersion}/pyodide-${pyodideVersion}.tar.bz2";
};
npmDepsHash = "sha256-9Wa6gP0asGPCoBJh8ufpweOg4zNf7onzBu08iQwgqis=";
npmDepsHash = "sha256-5W/IMa23b0afAlw5Md8KvJYQmRen8u1dfUG2RAKDOn0=";
npmFlags = [ "--force" ];
@@ -173,6 +173,7 @@ python3Packages.buildPythonApplication (finalAttrs: {
pymysql
pypandoc
pypdf
python-docx
python-dotenv
python-mimeparse
python-multipart
@@ -225,7 +226,6 @@ python3Packages.buildPythonApplication (finalAttrs: {
azure-search-documents
colbert-ai
elasticsearch
moto
oracledb
pinecone-client
playwright
@@ -236,8 +236,7 @@ python3Packages.buildPythonApplication (finalAttrs: {
]
++ finalAttrs.passthru.optional-dependencies.mariadb
++ finalAttrs.passthru.optional-dependencies.postgres
++ finalAttrs.passthru.optional-dependencies.unstructured
++ moto.optional-dependencies.s3;
++ finalAttrs.passthru.optional-dependencies.unstructured;
};
pythonImportsCheck = [ "open_webui" ];

View File

@@ -0,0 +1,352 @@
{
lib,
stdenv,
cctools,
cmake,
fetchFromGitHub,
fetchpatch2,
gn,
ninja,
nix-update-script,
pkg-config,
protobuf,
python3,
re2,
sqlite,
zlib,
zstd,
testers,
validatePkgConfig,
versionCheckHook,
}:
let
inherit (stdenv.hostPlatform) isStatic isDarwin extensions;
libName = "libperfetto${if isStatic then ".a" else extensions.sharedLibrary}";
buildInputs = [
protobuf
re2
sqlite
zlib
zstd
];
# pkg-config module name -> perfetto_use_system_* GN arg suffix
systemLibs = builtins.listToAttrs (
builtins.map (drv: {
name = "${
if builtins.hasAttr "pkgConfigModules" drv.meta then
(builtins.head drv.meta.pkgConfigModules)
else
drv.pname
}";
value = drv.pname;
}) buildInputs
);
systemModules = toString (lib.attrNames systemLibs);
# Serialize Nix values into GN values, cf.
# https://gn.googlesource.com/gn/+/main/docs/language.md
toGnValue =
value:
if lib.isBool value then
lib.boolToString value
else if lib.isInt value then
toString value
else if lib.isString value then
''"${lib.escape [ "\"" "$" "\\" ] value}"''
else
throw "Unsupported type for GN value: ${lib.generators.toPretty { } value}";
toGnFlags = lib.mapAttrsToList (name: value: "${name}=${toGnValue value}");
commonGnFlags = {
is_debug = false;
is_system_compiler = true;
is_clang = stdenv.cc.isClang;
monolithic_binaries = isStatic;
perfetto_use_pkgconfig = true;
use_custom_libcxx = false;
}
// lib.concatMapAttrs (_: gnName: { "perfetto_use_system_${gnName}" = true; }) systemLibs;
in
stdenv.mkDerivation (finalAttrs: {
pname = "perfetto";
version = "58.2";
__structuredAttrs = true;
strictDeps = true;
src = fetchFromGitHub {
owner = "google";
repo = "perfetto";
tag = "v${finalAttrs.version}";
hash = "sha256-Ipr86zH0iGjMzz9ZM3QEvtA6FlAN4lhkiDgySSeNj5c=";
};
patches = [
# TODO: remove once included in a next release
(fetchpatch2 {
url = "https://github.com/google/perfetto/commit/e698e3903870da0317511334ee21d3ae830ecd66.patch?full_index=1";
hash = "sha256-L3/xAz1dc3KDZLs7nt7F945ZuvexyWlA9x0YqRNjdIo=";
})
(fetchpatch2 {
url = "https://github.com/google/perfetto/commit/5739344741e4b881952a2786f67355eefe0a2c8d.patch?full_index=1";
hash = "sha256-AplecRNDDLGpbYC6zg2Ie0LrX+0MBxodTC72SP6SSl8=";
})
];
# Upstream includes its own tooling to download its deps, we have to disable it to make it use the ones from the PATH.
postPatch = ''
echo '#!/usr/bin/env python3' > tools/install-build-deps
substituteInPlace tools/run_buildtools_binary.py \
--replace-fail "and sys_name == 'freebsd'" ""
substituteInPlace gn/standalone/toolchain/BUILD.gn \
--replace-fail 'default_output_extension = ".so"' 'default_output_extension = "${extensions.sharedLibrary}"'
'';
nativeBuildInputs = [
gn
ninja
pkg-config
protobuf
python3
validatePkgConfig
]
++ lib.optional isDarwin cctools.libtool;
inherit buildInputs;
gnFlags = toGnFlags (
commonGnFlags
// (lib.optionalAttrs (!isStatic) {
extra_ldflags = "-Wl,-rpath,${placeholder "out"}/lib";
})
);
ninjaFlags = [
"tracebox"
"traced"
"traced_probes"
"perfetto"
];
dontUseNinjaInstall = true;
installPhase = ''
runHook preInstall
install -Dt $out/bin perfetto traced traced_probes tracebox
${lib.optionalString (!isStatic) "install -Dt $out/lib ${libName}"}
runHook postInstall
'';
nativeInstallCheckInputs = [
versionCheckHook
];
doInstallCheck = true;
passthru = {
updateScript = nix-update-script { };
sdk = (
stdenv.mkDerivation {
pname = "perfetto-sdk";
inherit (finalAttrs)
src
version
patches
postPatch
nativeBuildInputs
;
propagatedBuildInputs = buildInputs;
__structuredAttrs = true;
strictDeps = true;
outputs = [
"out"
"dev"
];
dontUseGnConfigure = true;
configurePhase = ''
runHook preConfigure
python3 tools/gen_amalgamated --quiet --system_buildtools --sdk cpp --output sdk/perfetto \
--gn_args ${
lib.escapeShellArg (
toString (
toGnFlags (
commonGnFlags
// {
enable_perfetto_ipc = true;
enable_perfetto_pcre2 = false;
enable_perfetto_re2 = true;
enable_perfetto_zlib = true;
enable_perfetto_zstd = true;
is_perfetto_build_generator = true;
is_perfetto_embedder = true;
perfetto_amalgamated_sdk = true;
perfetto_enable_git_rev_version_header = true;
}
)
)
)
}
runHook postConfigure
'';
dontUseNinjaBuild = true;
buildPhase = ''
runHook preBuild
$CXX $CXXFLAGS -std=c++17 -fPIC -O2 -DNDEBUG $($PKG_CONFIG --cflags ${systemModules}) -c sdk/perfetto.cc -o perfetto.o
${
if isStatic then
"$AR rcs"
else
"$CXX $CXXFLAGS $LDFLAGS $($PKG_CONFIG --libs ${systemModules}) ${
if isDarwin then "-dynamiclib -install_name $out/lib/" else "-shared -lpthread -Wl,-soname,"
}${libName} -o"
} ${libName} perfetto.o
runHook postBuild
'';
dontUseNinjaInstall = true;
installPhase = ''
runHook preInstall
install -Dm${if isStatic then "644" else "755"} ${libName} -t $out/lib
install -Dm644 sdk/perfetto.h -t $out/include
mkdir -p $out/lib/pkgconfig
cat -> $out/lib/pkgconfig/perfetto.pc << EOF
prefix=$out
exec_prefix=\''${prefix}
libdir=\''${exec_prefix}/lib
includedir=\''${prefix}/include
Name: perfetto
Description: Perfetto tracing SDK (amalgamated C++ distribution)
Version: ${finalAttrs.version}
Cflags: -I\''${includedir}
Libs: -L\''${libdir} -lperfetto
Requires.private: ${systemModules}
EOF
runHook postInstall
'';
meta = {
inherit (finalAttrs.meta)
homepage
changelog
license
maintainers
platforms
;
description = "Perfetto tracing SDK (amalgamated C++ distribution)";
pkgConfigModules = [ "perfetto" ];
};
}
);
tests = {
pkg-config = testers.hasPkgConfigModules {
package = finalAttrs.finalPackage.sdk;
};
examples = (
stdenv.mkDerivation {
pname = "perfetto-sdk-examples";
inherit (finalAttrs) src version;
sourceRoot = "${finalAttrs.src.name}/examples/sdk";
__structuredAttrs = true;
strictDeps = true;
postPatch = ''
substituteInPlace CMakeLists.txt --replace-fail "$(
printf '\n%s\n%s\n' \
'include_directories(../../sdk)' \
'add_library(perfetto STATIC ../../sdk/perfetto.cc)'
)" "$(
printf '\n%s\n%s\n%s\n' \
'find_package(PkgConfig REQUIRED)' \
'pkg_check_modules(PERFETTO REQUIRED IMPORTED_TARGET perfetto)' \
'add_library(perfetto ALIAS PkgConfig::PERFETTO)'
)"
'';
nativeBuildInputs = [
cmake
pkg-config
];
buildInputs = [
finalAttrs.finalPackage.sdk
];
# The CMakeLists.txt file does not define an install target.
installPhase = ''
runHook preInstall
find . -maxdepth 1 -type f -executable -exec install -Dt $out/bin {} +
runHook postInstall
'';
doInstallCheck = true;
nativeInstallCheckInputs = [ finalAttrs.finalPackage ];
installCheckPhase = ''
runHook preInstallCheck
find $out/bin -maxdepth 1 -type f -executable -not -name example_system_wide -print0 |
while LC_ALL=C IFS= read -rd "" bin; do
echo "Running $bin"
"$bin"
done
export PERFETTO_PRODUCER_SOCK_NAME=$TMPDIR/producer.sock
export PERFETTO_CONSUMER_SOCK_NAME=$TMPDIR/consumer.sock
traced & tracedPid=$!
until [[ -e $PERFETTO_PRODUCER_SOCK_NAME && -e $PERFETTO_CONSUMER_SOCK_NAME ]]; do sleep 0.2; done
timeout 60 $out/bin/example_system_wide & examplePid=$!
# wait until the example has connected and registered track_event
for _ in $(seq 100); do
if perfetto --query | grep -q example_system_wide; then break; fi
sleep 0.2
done
perfetto --query | grep -q example_system_wide # fail loudly instead of hanging
perfetto -c /dev/stdin --txt -o $TMPDIR/trace <<'EOF'
buffers: { size_kb: 4096 }
data_sources: { config { name: "track_event" } }
duration_ms: 2000
EOF
wait $examplePid
kill $tracedPid
[ -s $TMPDIR/trace ]
runHook postInstallCheck
'';
}
);
};
};
meta = {
description = "Client-side tracing, profiling, and analysis for complex software systems";
homepage = "https://perfetto.dev/";
changelog = "https://github.com/google/perfetto/releases/tag/v${finalAttrs.version}";
license = lib.licenses.asl20;
maintainers = with lib.maintainers; [ aduh95 ];
mainProgram = "perfetto";
platforms = lib.platforms.unix;
};
})

View File

@@ -2,44 +2,24 @@
lib,
buildNpmPackage,
fetchFromRadicle,
fetchFromGitHub,
writers,
_experimental-update-script-combinators,
unstableGitUpdater,
nix-update-script,
}:
let
# radicle-explorer bundles these freely available Emoji assets, but does not
# redistribute them.
twemojiAssets = fetchFromGitHub {
owner = "twitter";
repo = "twemoji";
tag = "v14.0.2";
hash = "sha256-YoOnZ5uVukzi/6bLi22Y8U5TpplPzB7ji42l+/ys5xI=";
meta.license = [ lib.licenses.cc-by-40 ];
};
in
buildNpmPackage (finalAttrs: {
pname = "radicle-explorer";
version = "0-unstable-2026-07-29";
version = "0-unstable-2026-08-28";
src = fetchFromRadicle {
seed = "seed.radicle.dev";
repo = "z4V1sjrXqjvFdnCUbxPFqd5p4DtH5";
rev = "427cece9850944d30f0d49ccd016f98dacd77d75";
hash = "sha256-FC78GCaC8IcBtXDRotYcaw040cggGWnrI2lgnWLwU68=";
rev = "60fd9a12880c35b4feda9e25528e9822e2a35829";
hash = "sha256-R8rnVh/NVdt1AB6SXKsYYtVPqV4AgRqiEtP4Ti2xwXY=";
};
npmDepsHash = "sha256-L/JOhI7KVXNDGHzk8RVNNcd8hHL+I7YKVg8sZyRSBtA=";
postPatch = ''
patchShebangs --build ./scripts
: >scripts/install-twemoji-assets
cp -r "${twemojiAssets}/assets/svg" public/twemoji
'';
npmDepsHash = "sha256-m+md3XIjn4SpZ3vp5STDFAKU3QSs0maFUm3Ll5DLghc=";
preBuild = ''
if [[ $configFile ]]; then

View File

@@ -15,7 +15,7 @@
rustPlatform.buildRustPackage (finalAttrs: {
pname = "radicle-httpd";
version = "0.27.0";
version = "0.28.0";
env.RADICLE_VERSION = finalAttrs.version;
@@ -29,10 +29,10 @@ rustPlatform.buildRustPackage (finalAttrs: {
"/Cargo.toml"
"/Cargo.lock"
];
hash = "sha256-OJrHV5WdFNzoYrOkqpN1ctrJDB3JTJhH54q/C6IV9ZU=";
hash = "sha256-D15u6aU6lKch/bEa1J6PBntb42NMHWYChIgprbJM+4M=";
};
cargoHash = "sha256-FjYhw27pAX9Tilgm/Tg18Vkv4/K5kEFJAbhv1mDY0rg=";
cargoHash = "sha256-z/ddTzoitMOsfndleM8Wu2sOn156ZTg8w/3/AJYw8wE=";
nativeBuildInputs = [
asciidoctor

View File

@@ -15,9 +15,9 @@
xdg-utils,
versionCheckHook,
version ? "1.10.1",
srcHash ? "sha256-F+64o9z/al0iaLFyQHAYk/3jjf5T0FdgqaU3nEWIheg=",
cargoHash ? "sha256-TLffetbkVwIbUDoI+96T99+lfYu2SIpGtwC0DbuJXnU=",
version ? "1.10.2",
srcHash ? "sha256-dlF1aoWqqGsSCTarT/8xl/WH8Hs9vAlk0BSQoGj1TR0=",
cargoHash ? "sha256-X+/SWtRToZHjJ1Eha3bbYNYAzEvJdX4bAOrl5G5vYU8=",
updateScript ? ./update.sh,
}:

View File

@@ -1,8 +1,8 @@
{ radicle-node }:
radicle-node.override {
version = "1.10.1";
srcHash = "sha256-F+64o9z/al0iaLFyQHAYk/3jjf5T0FdgqaU3nEWIheg=";
cargoHash = "sha256-TLffetbkVwIbUDoI+96T99+lfYu2SIpGtwC0DbuJXnU=";
version = "1.10.2";
srcHash = "sha256-dlF1aoWqqGsSCTarT/8xl/WH8Hs9vAlk0BSQoGj1TR0=";
cargoHash = "sha256-X+/SWtRToZHjJ1Eha3bbYNYAzEvJdX4bAOrl5G5vYU8=";
updateScript = ./update-unstable.sh;
}

View File

@@ -46,6 +46,8 @@ stdenv.mkDerivation rec {
"linux-arm"
else if stdenv.hostPlatform.system == "armv7l-linux" then
"linux-arm"
else if stdenv.hostPlatform.system == "riscv64-linux" then
"linux-arm"
else if stdenv.hostPlatform.system == "aarch64-darwin" then
"macosx"
else if stdenv.hostPlatform.system == "x86_64-darwin" then

View File

@@ -10,15 +10,15 @@
enableSoftnet ? false,
softnet,
nix-update-script,
versionCheckHook,
testers,
}:
stdenvNoCC.mkDerivation (finalAttrs: {
pname = "tart";
version = "2.30.6";
version = "2.36.0";
src = fetchurl {
url = "https://github.com/cirruslabs/tart/releases/download/${finalAttrs.version}/tart.tar.gz";
hash = "sha256-wepqDaJp1oRjGqEVrXUM/JO5gfAKc12AUkZUbfwwdx0=";
url = "https://github.com/openai/tart/releases/download/${finalAttrs.version}/tart.tar.gz";
hash = "sha256-xyqKuNeKZJih5CaIsaHsbFEs5GyjWjo74TDD3hRAx+g=";
};
sourceRoot = ".";
@@ -39,16 +39,16 @@ stdenvNoCC.mkDerivation (finalAttrs: {
runHook postInstall
'';
nativeInstallCheckInputs = [
versionCheckHook
];
doInstallCheck = true;
passthru.updateScript = nix-update-script { };
passthru.tests.version = testers.testVersion {
inherit (finalAttrs) version;
package = finalAttrs.finalPackage;
};
meta = {
description = "macOS and Linux VMs on Apple Silicon to use in CI and other automations";
homepage = "https://tart.run";
license = lib.licenses.fairsource09;
license = lib.licenses.fsl11Asl20;
maintainers = with lib.maintainers; [
emilytrau
aduh95

View File

@@ -1,6 +1,6 @@
{
"hash": "sha256-0cmzR5KZY6q+ZhoF90HkiIqHJsEdMeLOt4bmV8ID5so=",
"hash": "sha256-6cO7tfgUwMeDXjGBiGkKk7lODgxAGub/phS54URUfSI=",
"owner": "openjdk",
"repo": "jdk17u",
"rev": "refs/tags/jdk-17.0.20+8"
"rev": "refs/tags/jdk-17.0.20.1+1"
}

View File

@@ -1,6 +1,6 @@
{
"hash": "sha256-/42TUyZnw8LVOuUnupVFBkqsT5IIeTw9/WNQ0eCfQRQ=",
"hash": "sha256-i5PZZbIcHviwOQ5I41LDJxjbS64AOXudk1cXXFUypUo=",
"owner": "openjdk",
"repo": "jdk25u",
"rev": "refs/tags/jdk-25.0.4+7"
"rev": "refs/tags/jdk-25.0.4.1+1"
}

View File

@@ -1,6 +1,6 @@
import ./generic-builder.nix {
version = "1.18.4";
hash = "sha256-PwogI+HfRXy5M7Xn/KyDjm5vUquTBoGxliSV0A2AwSA=";
version = "1.18.5";
hash = "sha256-C7RXBjZZbdSgz4jdoOCKv8xfM95ChrYjXIIS/ahX+3Y=";
# https://hexdocs.pm/elixir/1.18.0/compatibility-and-deprecations.html#between-elixir-and-erlang-otp
minimumOTPVersion = "25";
}

View File

@@ -1,6 +1,6 @@
import ./generic-builder.nix {
version = "1.19.5";
hash = "sha256-ph7zu0F5q+/QZcsVIwpdU1icN84Rn3nIVpnRelpRIMQ=";
version = "1.19.6";
hash = "sha256-IpC1w3vKCKvEtmYqeYScChNWL7RXn/PjypUnLQt7IZc=";
# https://hexdocs.pm/elixir/1.19.5/compatibility-and-deprecations.html#between-elixir-and-erlang-otp
minimumOTPVersion = "26";
maximumOTPVersion = "28";

View File

@@ -1,6 +1,6 @@
import ./generic-builder.nix {
version = "1.20.3";
hash = "sha256-60DlK+yocWcKnxcOtUOkRO69scaY35AADoKFCCF6QfQ=";
version = "1.20.4";
hash = "sha256-Z/lAmD3wyiTnX2e7n2gHELkTpZ3AgGSjqNmvDxCH91g=";
# https://hexdocs.pm/elixir/1.20.3/compatibility-and-deprecations.html#between-elixir-and-erlang-otp
minimumOTPVersion = "27";
maximumOTPVersion = "29";

View File

@@ -5,43 +5,43 @@
"lts": false
},
"6.1": {
"version": "6.1.185",
"hash": "sha256:0x1639znr91szyahgj2ni7ymcm46dmm41ispfx4jdikx2fhxjr1q",
"version": "6.1.186",
"hash": "sha256:0vi3yqvass80jgjw2yc2iz7p4wfqlih2gvjhzxd20j14pwmw7vgf",
"lts": true
},
"5.15": {
"version": "5.15.218",
"hash": "sha256:0dpjimmxs648j9gri7h3flfimb1647a8629pgsvyxsgk6k8ip063",
"version": "5.15.219",
"hash": "sha256:192ws3mf4hvhawdl6amg7a7q7d68v2ijgjsy1cbq2vy2iiwlyjnh",
"lts": true
},
"5.10": {
"version": "5.10.267",
"hash": "sha256:01migk31fib50zgqf8rqmm71cff8s93msvy20sy8mj22mi80fi2v",
"version": "5.10.268",
"hash": "sha256:0fi6a8gbj60ankrx8gcjswv52k93xcjajcb6jihkwx63vfm4s5kv",
"lts": true
},
"6.6": {
"version": "6.6.154",
"hash": "sha256:0d02xm0xglyhac9iyf01a01ab0kp0ghkar8qq6gj6l5h7pw01vpd",
"version": "6.6.155",
"hash": "sha256:10j9cm0jrjjwm8gy8h8nkyj8x3pfhaicj29125qb069c7wkajrsf",
"lts": true
},
"6.12": {
"version": "6.12.106",
"hash": "sha256:11fpivj271143v8rdk4jifbpxxrd3saphq9za027d76rc5bmb4h3",
"version": "6.12.107",
"hash": "sha256:0yih5s4xbp1hlyfha49z2j3l9x7i5ij335jfl6f6sbfy7yzcby55",
"lts": true
},
"6.18": {
"version": "6.18.47",
"hash": "sha256:0678vsivrr3qw2pdg2ch26a2kx365cm1gy3w21rm86k08gyvlgqv",
"version": "6.18.48",
"hash": "sha256:137wqvcfl8drb4n51hqc2pw4kg0hl5j7fi8wdgy0hmsb1aqsvgay",
"lts": true
},
"7.1": {
"version": "7.1.11",
"hash": "sha256:1z0s6pv34d5mk75jxj05s6hzy2x6vahc5dxxbkp5pirfiw6m8a9h",
"version": "7.1.12",
"hash": "sha256:1qaskd7g2pzh32lvfb18qh29hfy3mh2flglh1d9cvr17xnrid5rq",
"lts": false
},
"7.2": {
"version": "7.2.1",
"hash": "sha256:1csp8m7a5ws9j35x7bc2cb8067illqx5v1cc0sz8zsi8ia60jn21",
"version": "7.2.2",
"hash": "sha256:10qd3kllldrw6gbp0wfziy94bgjr98svzzqci3z3xi4q9zhpq3kx",
"lts": false
}
}

View File

@@ -15,13 +15,13 @@ let
}:
buildGoModule rec {
inherit pname;
version = "1.5.2";
version = "1.5.4";
src = fetchFromGitHub {
owner = "sigstore";
repo = "rekor";
rev = "v${version}";
hash = "sha256-imtdI8nWII2l24FgWXVU0LKg4hYmZHi6DGzenoEfOgA=";
hash = "sha256-fF48pfbQAHk81aJ4zXDpkY7u5zFmgpr/Fg44kvlmtng=";
# populate values that require us to use git. By doing this in postFetch we
# can delete .git afterwards and maintain better reproducibility of the src.
leaveDotGit = true;
@@ -34,7 +34,7 @@ let
'';
};
vendorHash = "sha256-QxIw3rGTntNpLNhLZq9G6OiuTd+UbjA5B60TYBqFiSY=";
vendorHash = "sha256-XN+wyWDPep8bdvPMsQFv6I/ULf4cE2/t2NfEFyzE+aE=";
nativeBuildInputs = [ installShellFiles ];

View File

@@ -670,7 +670,7 @@ allPkgLists
// {
# for backward compatibility
latexindent = texlive.pkgs.latexindent;
pygmentex = texlive.pkgs.pigmentex;
pygmentex = texlive.pkgs.pygmentex;
};
combine =