Merge commit '4e39fb70d8' into haskell-updates

This commit is contained in:
Michael Daniels 2026-05-19 21:10:08 -04:00
commit 9eab5d0982
No known key found for this signature in database
641 changed files with 10711 additions and 4832 deletions

View file

@ -121,6 +121,8 @@ body:
required: true
- label: "I assert that I have read the [NixOS Code of Conduct](https://github.com/NixOS/.github/blob/master/CODE_OF_CONDUCT.md) and agree to abide by it."
required: true
- label: "I assert that I have read the [automation/AI policy](https://github.com/NixOS/nixpkgs/blob/master/CONTRIBUTING.md#automationai-policy) and that this issue report complies with it."
required: true
- type: "markdown"
attributes:
value: |

View file

@ -135,6 +135,8 @@ body:
required: true
- label: "I assert that I have read the [NixOS Code of Conduct](https://github.com/NixOS/.github/blob/master/CODE_OF_CONDUCT.md) and agree to abide by it."
required: true
- label: "I assert that I have read the [automation/AI policy](https://github.com/NixOS/nixpkgs/blob/master/CONTRIBUTING.md#automationai-policy) and that this issue report complies with it."
required: true
- type: "markdown"
attributes:
value: |

View file

@ -125,6 +125,8 @@ body:
required: true
- label: "I assert that I have read the [NixOS Code of Conduct](https://github.com/NixOS/.github/blob/master/CODE_OF_CONDUCT.md) and agree to abide by it."
required: true
- label: "I assert that I have read the [automation/AI policy](https://github.com/NixOS/nixpkgs/blob/master/CONTRIBUTING.md#automationai-policy) and that this issue report complies with it."
required: true
- type: "markdown"
attributes:
value: |

View file

@ -131,6 +131,8 @@ body:
required: true
- label: "I assert that I have read the [NixOS Code of Conduct](https://github.com/NixOS/.github/blob/master/CODE_OF_CONDUCT.md) and agree to abide by it."
required: true
- label: "I assert that I have read the [automation/AI policy](https://github.com/NixOS/nixpkgs/blob/master/CONTRIBUTING.md#automationai-policy) and that this issue report complies with it."
required: true
- type: "markdown"
attributes:
value: |

View file

@ -104,6 +104,8 @@ body:
required: true
- label: "I assert that I have read the [NixOS Code of Conduct](https://github.com/NixOS/.github/blob/master/CODE_OF_CONDUCT.md) and agree to abide by it."
required: true
- label: "I assert that I have read the [automation/AI policy](https://github.com/NixOS/nixpkgs/blob/master/CONTRIBUTING.md#automationai-policy) and that this issue report complies with it."
required: true
- type: "markdown"
attributes:
value: |

View file

@ -79,6 +79,8 @@ body:
required: true
- label: "I assert that I have read the [NixOS Code of Conduct](https://github.com/NixOS/.github/blob/master/CODE_OF_CONDUCT.md) and agree to abide by it."
required: true
- label: "I assert that I have read the [automation/AI policy](https://github.com/NixOS/nixpkgs/blob/master/CONTRIBUTING.md#automationai-policy) and that this issue report complies with it."
required: true
- type: "markdown"
attributes:
value: |

View file

@ -85,6 +85,8 @@ body:
required: true
- label: "I assert that I have read the [NixOS Code of Conduct](https://github.com/NixOS/.github/blob/master/CODE_OF_CONDUCT.md) and agree to abide by it."
required: true
- label: "I assert that I have read the [automation/AI policy](https://github.com/NixOS/nixpkgs/blob/master/CONTRIBUTING.md#automationai-policy) and that this issue report complies with it."
required: true
- type: "markdown"
attributes:
value: |

View file

@ -67,6 +67,8 @@ body:
required: true
- label: "I assert that I have read the [NixOS Code of Conduct](https://github.com/NixOS/.github/blob/master/CODE_OF_CONDUCT.md) and agree to abide by it."
required: true
- label: "I assert that I have read the [automation/AI policy](https://github.com/NixOS/nixpkgs/blob/master/CONTRIBUTING.md#automationai-policy) and that this issue report complies with it."
required: true
- type: "markdown"
attributes:
value: |

View file

@ -137,6 +137,8 @@ body:
required: true
- label: "I assert that I have read the [NixOS Code of Conduct](https://github.com/NixOS/.github/blob/master/CODE_OF_CONDUCT.md) and agree to abide by it."
required: true
- label: "I assert that I have read the [automation/AI policy](https://github.com/NixOS/nixpkgs/blob/master/CONTRIBUTING.md#automationai-policy) and that this issue report complies with it."
required: true
- type: "markdown"
attributes:
value: |

View file

@ -27,12 +27,14 @@ For new packages please briefly describe the package or provide a link to its ho
- [ ] Module addition: when adding a new NixOS module.
- [ ] Module update: when the change is significant.
- [ ] Fits [CONTRIBUTING.md], [pkgs/README.md], [maintainers/README.md] and other READMEs.
- [ ] Follows the [automation/AI policy].
[NixOS tests]: https://nixos.org/manual/nixos/unstable/index.html#sec-nixos-tests
[Package tests]: https://github.com/NixOS/nixpkgs/blob/master/pkgs/README.md#package-tests
[nixpkgs-review usage]: https://github.com/Mic92/nixpkgs-review#usage
[CONTRIBUTING.md]: https://github.com/NixOS/nixpkgs/blob/master/CONTRIBUTING.md
[automation/AI policy]: https://github.com/NixOS/nixpkgs/blob/master/CONTRIBUTING.md#automationai-policy
[lib/tests]: https://github.com/NixOS/nixpkgs/blob/master/lib/tests
[maintainers/README.md]: https://github.com/NixOS/nixpkgs/blob/master/maintainers/README.md
[nixos/tests]: https://github.com/NixOS/nixpkgs/blob/master/nixos/tests

View file

@ -206,7 +206,7 @@ For example, if you make a change to `texlive`, you probably would only check th
#### Meets Nixpkgs contribution standards
The last checkbox is about whether it fits the guidelines in this `CONTRIBUTING.md` file.
The last two checkboxes are about whether it fits the guidelines in this `CONTRIBUTING.md` file.
This document details our standards for commit messages, reviews, licensing of contributions, etc...
Everyone should read and understand these standards before submitting a pull request.
@ -888,3 +888,77 @@ As mentioned previously, it is unfortunately perfectly normal for a PR to sit ar
Please don't blow up situations where progress is happening but is merely not going fast enough for your tastes.
Honking in a traffic jam will not make you go any faster.
# Automation/AI policy
Every contribution to Nixpkgs and related development venues, including code, documentation, and communication on GitHub and Matrix, must have a **responsible person in the loop** who is accountable for that contribution and reviews it before submission, and must **transparently disclose** any nontrivial use of automation to produce it, including but not limited to LLMbased AI tools.
The following sections give more detail.
## Scope
Any use of automated tools to generate nontrivial amounts of output as part of a contribution, in whole or in part, verbatim or edited, is covered by this policy, except as listed in the Exemptions section.
Both LLMbased AI tools and handwritten automation are covered.
Contributions include code and documentation in commits, commit messages, pull request summaries and reviews, issue and vulnerability reports, GitHub comments, Matrix messages, and Discourse posts.
The covered venues are the GitHub repositories for Nixpkgs and [related projects](https://github.com/orgs/NixOS/teams/nixpkgs-core/repositories) under the jurisdiction of the Nixpkgs core team, Matrix rooms that are focused on development of those projects, and Discourse topics about Nixpkgs development.
## Accountability
Everyone who submits a contribution to Nixpkgs is responsible for it, regardless of the use of automated tooling.
Before submission, they must establish a reasonable level of understanding of the contribution and expectation of its correctness.
A contributor submitting a contribution intended for inclusion in Nixpkgs is also responsible for ensuring that it is [appropriately licensed](https://github.com/NixOS/nixpkgs/blob/master/COPYING) and credited, and not encumbered by any incompatible copyright.
When output from automated tooling is used in contributions, a contributor must establish confidence in that output.
This can be achieved by establishing confidence in the correctness of the toolings logic, manual review of the included output, or using further automation to verify the output (e.g. programmatically checking whether a refactor avoids causing rebuilds).
As the inner workings of LLMbased AI tools cannot be sufficiently understood at present, only the latter two options are available when those are used; vibe coding without review is not permitted.
When automation is used to verify output, the verification tooling itself must be disclosed and reviewed in line with this policy.
This policy applies equally to any further discussion of a contribution.
Comments and reviews must separately satisfy the same requirements of understanding, review, and disclosure.
Contributors are expected to be able to answer questions about their contribution and respond to feedback appropriately, without simply forwarding messages back and forth to automated tools.
It is not permitted to submit automated contributions without any manual review or intervention, outside of standard community automation.
Automation without any manual review must not be used as the sole arbiter of whether to merge a change.
## Transparency
All covered use of automated tooling for a contribution must be disclosed as part of that contribution.
In the case of LLMbased AI tooling used for commits, this **must** be in the form of an `Assisted-by:` Git commit trailer, including at least the tool name and the primary model name and version used for the contribution.
A `Co-authored-by:` trailer does not satisfy this policy.
Any adequate form of disclosure is permitted for other kinds of tooling and contribution.
Pull request summaries and review comments must be disclosed separately to commits.
## Exemptions
The following situations are fully or partially exempt:
* Use of standard deterministic editor/IDE/formatter/text transformation tooling to produce changes that the author manually reviews and understands is exempt, including inline “autocompletion” (even if LLMbased) of short, rote snippets of text that do not contribute anything beyond boilerplate the author would have written anyway.
* Use of standard community automation is exempt, such as `nix-update`, the official Nixpkgs CI bots, the @r-ryantm update bot, other maintainerapproved bots that run update scripts, and the Nixpkgs security tracker bot.
* Use of AI tools for research, testing, debugging, or private review is out of scope, if no substantial amount of their output is included in the resulting contribution.
However, if these tools had a significant technical influence on your contribution, you are still responsible for it per the Accountability section, and are expected to disclose this where relevant.
* Use of machine translation is exempt from the requirement to understand the translated output.
However, the requirements of appropriate confidence in the original text, responsibility, and disclosure still apply, and you are encouraged to additionally include the original untranslated contribution.
* Use of automation in a contribution clearly marked as not being ready for merge (e.g. a draft pull request) is exempt from the requirement for full selfreview, as long as some amount of review has been done and it is expected that the requirements will be met by the time it is marked as ready.
This does not waive any other requirement.
* Use of automated tools to develop upstream software packaged inside Nixpkgs is not in scope.
## Enforcement
If you believe that someone is using automation without appropriate disclosure and review, you can politely ask them if thats the case and point them to this policy as appropriate.
Please assume good faith and remain civil; its not always possible to determine, and it is more likely that someone overlooked this policy than deliberately violated it.
If you think someone is continuing to break the policy after this, please escalate to the [Nixpkgs core team](https://nixos.org/community/teams/nixpkgs-core/) rather than fighting over it.
If a contribution is clearly in violation of the policy (e.g. the contributor admits it was not followed, or there are AI tool attributions that do not meet our required format), it can be closed or hidden, preferably after informing the contributor of the policy and giving them a chance to address the violations.
Deliberate violations of this policy are considered to break the [Code of Conduct](https://github.com/NixOS/.github/blob/master/CODE_OF_CONDUCT.md) clause against “Wasting other peoples time with low quality contributions, including but not limited to LLM and bot spam”.
Repeated violations are grounds for further moderation action.
## Credits
This policy takes inspiration from similar policies in [LLVM](https://llvm.org/docs/AIToolPolicy.html), [Mesa](https://gitlab.freedesktop.org/mesa/mesa/-/blob/mesa-26.1.0-rc1/docs/submittingpatches.rst?ref_type=tags), [Fedora](https://docs.fedoraproject.org/en-US/council/policy/ai-contribution-policy/), and the [Linux kernel](https://docs.kernel.org/7.0/process/coding-assistants.html), along with [a proposal by the author of Anubis](https://xeiaso.net/notes/2025/assisted-by-footer/).

View file

@ -483,7 +483,6 @@ module.exports = async ({ github, context, core, dry }) => {
dry,
pull_request,
reviews,
events,
// TODO: Use maintainer map instead of the artifact.
user_maintainers: Object.keys(
JSON.parse(

View file

@ -6,7 +6,6 @@ async function handleReviewers({
dry,
pull_request,
reviews,
events,
user_maintainers,
team_maintainers,
owners,
@ -15,28 +14,20 @@ async function handleReviewers({
}) {
const pull_number = pull_request.number
// Users currently requested for review (pending).
const pending_users = new Set(
pull_request.requested_reviewers.map(({ login }) => login.toLowerCase()),
)
// Users who actually submitted a review in this PR (any state, including DISMISSED).
const users_engaged = new Set(
reviews.map(({ user }) => user.login.toLowerCase()),
)
// Users the PR has already reached: pending OR engaged.
const users_reached = pending_users.union(users_engaged)
// Users that the PR has already reached, e.g. they've left a review or have been requested for one
const users_reached = new Set([
...pull_request.requested_reviewers.map(({ login }) => login.toLowerCase()),
...reviews.map(({ user }) => user.login.toLowerCase()),
])
log('reviewers - users_reached', Array.from(users_reached).join(', '))
// Same for teams. A team is engaged only via `onBehalfOf` reviews.
const pending_teams = new Set(
pull_request.requested_teams.map(({ slug }) => slug.toLowerCase()),
)
const teams_engaged = new Set(
reviews.flatMap(({ onBehalfOf }) =>
// Same for teams
const teams_reached = new Set([
...pull_request.requested_teams.map(({ slug }) => slug.toLowerCase()),
...reviews.flatMap(({ onBehalfOf }) =>
onBehalfOf.nodes.map(({ slug }) => slug.toLowerCase()),
),
)
const teams_reached = pending_teams.union(teams_engaged)
])
log('reviewers - teams_reached', Array.from(teams_reached).join(', '))
// Early sanity check, before we start making any API requests. The list of maintainers
@ -158,101 +149,37 @@ async function handleReviewers({
)
log('reviewers - teams_not_yet_reached', teams_not_yet_reached.join(', '))
// The usernames of bots that make review requests we may auto-revoke.
const revokable_requesters = ['github-actions[bot]', 'nixpkgs-ci[bot]']
// Find latest `review_requested` actor per reviewer / team.
const last_request_actor_for_user = new Map()
const last_request_actor_for_team = new Map()
for (const ev of events) {
if (ev.event !== 'review_requested') continue
if (ev.requested_reviewer?.login) {
last_request_actor_for_user.set(
ev.requested_reviewer.login.toLowerCase(),
ev.actor?.login ?? '',
)
}
if (ev.requested_team?.slug) {
last_request_actor_for_team.set(
ev.requested_team.slug.toLowerCase(),
ev.actor?.login ?? '',
)
}
}
// Pending requests no longer in the to_reach set, excluding the engaged
// and anything not requested by our own bot.
const users_to_remove = Array.from(
pending_users.difference(users_to_reach).difference(users_engaged),
).filter((login) =>
revokable_requesters.includes(last_request_actor_for_user.get(login)),
)
log('reviewers - users_to_remove', users_to_remove.join(', '))
// Same for teams.
const teams_to_remove = Array.from(
pending_teams.difference(teams_to_reach).difference(teams_engaged),
).filter((slug) =>
revokable_requesters.includes(last_request_actor_for_team.get(slug)),
)
log('reviewers - teams_to_remove', teams_to_remove.join(', '))
const has_adds =
users_not_yet_reached.length > 0 || teams_not_yet_reached.length > 0
const has_removals = users_to_remove.length > 0 || teams_to_remove.length > 0
if (!has_adds && !has_removals) {
if (
users_not_yet_reached.length === 0 &&
teams_not_yet_reached.length === 0
) {
log('Has reviewer changes', 'false (skipped)')
} else if (dry) {
if (has_adds) {
core.info(
`Requesting user reviewers for #${pull_number}: ${users_not_yet_reached.join(', ')} (dry)`,
)
core.info(
`Requesting team reviewers for #${pull_number}: ${teams_not_yet_reached.join(', ')} (dry)`,
)
}
if (has_removals) {
core.info(
`Revoking stale reviewers for #${pull_number}: users=[${users_to_remove.join(', ')}], teams=[${teams_to_remove.join(', ')}] (dry)`,
)
}
core.info(
`Requesting user reviewers for #${pull_number}: ${users_not_yet_reached.join(', ')} (dry)`,
)
core.info(
`Requesting team reviewers for #${pull_number}: ${teams_not_yet_reached.join(', ')} (dry)`,
)
} else {
// We had tried the "request all reviewers at once" thing in the past, but it didn't work out:
// https://github.com/NixOS/nixpkgs/commit/034613f860fcd339bd2c20c8f6bc259a2f9dc034
// If we're hitting API errors here again, we'll need to investigate - and possibly reverse
// course.
// Add and remove sets are disjoint by construction. Parallel is safe.
await Promise.all(
[
has_adds &&
github.rest.pulls.requestReviewers({
...context.repo,
pull_number,
reviewers: users_not_yet_reached,
team_reviewers: teams_not_yet_reached,
}),
has_removals &&
github.rest.pulls.removeRequestedReviewers({
...context.repo,
pull_number,
reviewers: users_to_remove,
team_reviewers: teams_to_remove,
}),
].filter(Boolean),
)
await github.rest.pulls.requestReviewers({
...context.repo,
pull_number,
reviewers: users_not_yet_reached,
team_reviewers: teams_not_yet_reached,
})
}
// Subtract the just-revoked so revoking the last pending reviewer flips the label.
const users_still_reached = users_reached.difference(new Set(users_to_remove))
const teams_still_reached = teams_reached.difference(new Set(teams_to_remove))
// Return a boolean on whether the "needs: reviewers" label should be set.
return (
users_not_yet_reached.length === 0 &&
teams_not_yet_reached.length === 0 &&
users_still_reached.size === 0 &&
teams_still_reached.size === 0
users_reached.size === 0 &&
teams_reached.size === 0
)
}

View file

@ -37,16 +37,16 @@ runCommand "manual.epub"
</book>
'';
passAsFile = [ "epub" ];
__structuredAttrs = true;
}
''
mkdir scratch
xsltproc \
printf "%s" "$epub" | xsltproc \
--param chapter.autolabel 0 \
--nonet \
--output scratch/ \
${docbook_xsl_ns}/xml/xsl/docbook/epub/docbook.xsl \
$epubPath
-
echo "application/epub+zip" > mimetype
zip -0Xq -b "$TMPDIR" "$out" mimetype

View file

@ -871,6 +871,15 @@ general. A number of other parameters can be overridden:
(hello { }).override { extraRustcOpts = "-Z debuginfo=2"; }
```
- Extra arguments passed to `rustc` when the crate is a proc-macro,
replacing `extraRustcOpts`. Useful to keep instrumentation flags
(sanitizers, coverage) off host dylibs. Defaults to `null`, which
inherits `extraRustcOpts`:
```nix
(myProcMacro { }).override { extraRustcOptsForProcMacro = [ ]; }
```
- The lint level cap passed to `rustc`. Defaults to `null`, which
auto-resolves to `"allow"` (silences all lints) when `lints` is
empty, or `"forbid"` (no cap) when `lints` is set. Because `rustc`

View file

@ -204,8 +204,8 @@ lib.mapAttrs mkLicense (
};
bola11 = {
url = "https://blitiri.com.ar/p/bola/";
fullName = "Buena Onda License Agreement 1.1";
spdxId = "BOLA-1.1";
fullName = "Buena Onda License Agreement v1.1";
};
boost = {
@ -326,8 +326,8 @@ lib.mapAttrs mkLicense (
};
capec = {
fullName = "Common Attack Pattern Enumeration and Classification";
url = "https://capec.mitre.org/about/termsofuse.html";
fullName = "Common Attack Pattern Enumeration and Classification License";
spdxId = "CAPEC-tou";
};
clArtistic = {
@ -475,6 +475,11 @@ lib.mapAttrs mkLicense (
fullName = "CeCILL-C Free Software License Agreement";
};
cfitsio = {
spdxId = "CFITSIO";
fullName = "CFITSIO License";
};
classpathException20 = {
spdxId = "Classpath-exception-2.0";
fullName = "Classpath exception 2.0";
@ -760,14 +765,7 @@ lib.mapAttrs mkLicense (
hpndSellVariantSafetyClause = {
fullName = "HPND - sell variant with safety critical systems clause";
url = "https://gitlab.freedesktop.org/xorg/driver/xf86-video-voodoo/-/blob/68a5b6d98ae34749cca889f4373b4043d00bfe6a/src/voodoo_dga.c#L12-33";
# TODO: if the license gets accepted to spdx then
# add spdxId
# else
# remove license
# && replace reference with whatever this license is supposed to be then
# https://github.com/spdx/license-list-XML/issues/2922
# spdxId = "HPND-sell-variant-safety-clause";
spdxId = "HPND-sell-variant-critical-systems";
};
hpndDec = {
@ -1257,8 +1255,8 @@ lib.mapAttrs mkLicense (
};
paratype = {
fullName = "ParaType Free Font Licensing Agreement";
url = "https://web.archive.org/web/20161209023955/http://www.paratype.ru/public/pt_openlicense_eng.asp";
spdxId = "ParaType-Free-Font-1.3";
fullName = "ParaType Free Font Licensing Agreement v1.3";
};
parity70 = {
@ -1337,7 +1335,8 @@ lib.mapAttrs mkLicense (
# Gentoo seems to treat it as a license:
# https://gitweb.gentoo.org/repo/gentoo.git/tree/licenses/SGMLUG?id=7d999af4a47bf55e53e54713d98d145f935935c1
sgmlug = {
fullName = "SGML UG SGML Parser Materials license";
spdxId = "SGMLUG-PM";
fullName = "SGMLUG Parser Materials License";
};
sissl11 = {
@ -1434,11 +1433,8 @@ lib.mapAttrs mkLicense (
};
tekHvcLicense = {
spdxId = "TekHVC";
fullName = "TekHVC License";
url = "https://gitlab.freedesktop.org/xorg/lib/libx11/-/blob/7f8305c779ac6948d7261764f5ffb8ae9aa975b1/COPYING#L138-171";
# TODO: add spdxId when it gets accepted to spdx
# https://tools.spdx.org/app/license_requests/458
# https://github.com/spdx/license-list-XML/issues/2757
};
torque11 = {
@ -1459,8 +1455,8 @@ lib.mapAttrs mkLicense (
};
tost = {
spdxId = "Pixar";
fullName = "Tomorrow Open Source Technology License 1.0";
url = "https://github.com/PixarAnimationStudios/OpenUSD/blob/release/LICENSE.txt";
};
ubdlException = {

View file

@ -1101,11 +1101,10 @@ in
```
*/
functionArgs =
f:
if f ? __functor then
f.__functionArgs or (functionArgs (f.__functor f))
else
builtins.functionArgs f;
let
functionArgs = builtins.functionArgs;
in
f: if f ? __functor then f.__functionArgs or (functionArgs (f.__functor f)) else functionArgs f;
/**
Check whether something is a function or something
@ -1123,7 +1122,11 @@ in
isFunction : Any -> Bool
```
*/
isFunction = f: builtins.isFunction f || (f ? __functor && isFunction (f.__functor f));
isFunction =
let
isFunction = builtins.isFunction;
in
f: isFunction f || (f ? __functor && isFunction (f.__functor f));
/**
`mirrorFunctionArgs f g` creates a new function `g'` with the same behavior as `g` (`g' x == g x`)

View file

@ -11203,13 +11203,6 @@
githubId = 2332070;
name = "Serge Baltic";
};
hyshka = {
name = "Bryan Hyshka";
email = "bryan@hyshka.com";
github = "hyshka";
githubId = 2090758;
keys = [ { fingerprint = "24F4 1925 28C4 8797 E539 F247 DB2D 93D1 BFAA A6EA"; } ];
};
hythera = {
name = "Hythera";
github = "Hythera";
@ -11386,6 +11379,12 @@
githubId = 12570166;
name = "Igor Ramazanov";
};
igorcafe = {
email = "igoracmelo@protonmail.com";
github = "igorcafe";
githubId = 85039990;
name = "Igor Melo";
};
igsha = {
email = "igor.sharonov@gmail.com";
github = "igsha";
@ -11675,6 +11674,12 @@
name = "Silvan Mosberger";
keys = [ { fingerprint = "6C2B 55D4 4E04 8266 6B7D DA1A 422E 9EDA E015 7170"; } ];
};
iniw = {
email = "git@vini.cat";
github = "iniw";
githubId = 30220881;
name = "Vinicius Deolindo";
};
insipx = {
email = "github@andrewplaza.dev";
github = "insipx";
@ -25672,6 +25677,11 @@
github = "skohtv";
githubId = 101289702;
};
skonotopov = {
name = "Sergey Konotopov";
github = "kinkou";
githubId = 931329;
};
skovati = {
github = "skovati";
githubId = 49844593;
@ -28697,6 +28707,12 @@
github = "usrfriendly";
githubId = 2502060;
};
usu171 = {
email = "usu171@proton.me";
github = "Usu171";
githubId = 52230991;
name = "Usu171";
};
utdemir = {
email = "me@utdemir.com";
github = "utdemir";
@ -29086,12 +29102,6 @@
githubId = 59029586;
name = "Vitor Pavan";
};
vizanto = {
email = "danny@prime.vc";
github = "vizanto";
githubId = 326263;
name = "Danny Wilson";
};
vizid = {
email = "mail@vizqq.cc";
github = "ViZiD";
@ -29329,6 +29339,11 @@
githubId = 115360611;
name = "Wölfchen";
};
w1lldu = {
name = "William Du";
github = "w1lldu";
githubId = 70287641;
};
waelwindows = {
email = "waelwindows9922@gmail.com";
github = "Waelwindows";
@ -29627,6 +29642,12 @@
githubId = 5185341;
name = "Will Cohen";
};
WillemToorenburgh = {
email = "willemtoorenburgh@gmail.com";
github = "willemtoorenburgh";
githubId = 50425141;
name = "Willem Toorenburgh";
};
willfish = {
email = "willfish@pescado.mozmail.com";
github = "willfish";

View file

@ -435,6 +435,7 @@ with lib.maintainers;
libretro = {
members = [
aanderse
igorcafe
thiagokokada
];
scope = "Maintain Libretro, RetroArch and related packages.";

View file

@ -250,17 +250,17 @@ rec {
</chapter>
</book>
'';
passAsFile = [ "doc" ];
__structuredAttrs = true;
}
''
# Generate the epub manual.
dst=$out/${common.outputPath}
xsltproc \
printf "%s" "$doc" | xsltproc \
--param chapter.autolabel 0 \
--nonet --xinclude --output $dst/epub/ \
${docbook_xsl_ns}/xml/xsl/docbook/epub/docbook.xsl \
$docPath
-
echo "application/epub+zip" > mimetype
manual="$dst/nixos-manual.epub"

View file

@ -98,6 +98,8 @@
- [nohang](https://github.com/hakavlad/nohang), a daemon for Linux that prevents out of memory (OOM) situations from affecting system responsiveness. Available as [services.nohang](#opt-services.nohang.enable)
- [clevis-luks-askpass](https://github.com/latchset/clevis), automatic LUKS unlocking in initrd using clevis token bindings stored in LUKS headers. Available as [boot.initrd.clevisLuksAskpass](#opt-boot.initrd.clevisLuksAskpass.enable).
- [bentopdf](https://github.com/alam00000/bentopdf), a privacy-first PDF toolkit running completely in-browser. Available as [services.bentopdf](#opt-services.bentopdf.enable).
- [hyprwhspr-rs](https://github.com/better-slop/hyprwhspr-rs), a keybind activated speech-to-text voice dictation utility built for use with Hyprland. Available as `services.hyprwhspr-rs`

View file

@ -36,16 +36,23 @@ in
i18n = {
glibcLocales = lib.mkOption {
type = lib.types.path;
default = pkgs.glibcLocales.override {
allLocales = lib.elem "all" cfg.supportedLocales;
locales = cfg.supportedLocales;
};
type = lib.types.nullOr lib.types.path;
default =
if pkgs.glibcLocales != null then
pkgs.glibcLocales.override {
allLocales = lib.elem "all" cfg.supportedLocales;
locales = cfg.supportedLocales;
}
else
null;
defaultText = lib.literalExpression ''
pkgs.glibcLocales.override {
allLocales = lib.elem "all" config.i18n.supportedLocales;
locales = config.i18n.supportedLocales;
}
if pkgs.glibcLocales != null then
pkgs.glibcLocales.override {
allLocales = lib.elem "all" config.i18n.supportedLocales;
locales = config.i18n.supportedLocales;
}
else
null
'';
example = lib.literalExpression "pkgs.glibcLocales";
description = ''
@ -186,7 +193,9 @@ in
environment.systemPackages =
# We increase the priority a little, so that plain glibc in systemPackages can't win.
lib.optional (cfg.supportedLocales != [ ]) (lib.setPrio (-1) cfg.glibcLocales);
lib.optional (cfg.glibcLocales != null && cfg.supportedLocales != [ ]) (
lib.setPrio (-1) cfg.glibcLocales
);
environment.sessionVariables = {
LOCALE_ARCHIVE = "/run/current-system/sw/lib/locale/locale-archive";
@ -200,7 +209,7 @@ in
// cfg.extraLocaleSettings
);
systemd.globalEnvironment = lib.mkIf (cfg.supportedLocales != [ ]) {
systemd.globalEnvironment = lib.mkIf (cfg.glibcLocales != null && cfg.supportedLocales != [ ]) {
LOCALE_ARCHIVE = "${cfg.glibcLocales}/lib/locale/locale-archive";
};

View file

@ -1366,6 +1366,7 @@
./services/networking/rdnssd.nix
./services/networking/realm.nix
./services/networking/redsocks.nix
./services/networking/reframe.nix
./services/networking/resilio.nix
./services/networking/robustirc-bridge.nix
./services/networking/rosenpass.nix
@ -1896,6 +1897,7 @@
./system/activation/switchable-system.nix
./system/activation/top-level.nix
./system/boot/binfmt.nix
./system/boot/clevis-luks-askpass.nix
./system/boot/clevis.nix
./system/boot/emergency-mode.nix
./system/boot/grow-partition.nix

View file

@ -83,6 +83,15 @@ in
{
environment.systemPackages = [ cfg.package ];
# Hyprland needs permissions to give itself SCHED_RR on startup:
# https://github.com/hyprwm/Hyprland/blob/main/src/init/initHelpers.cpp
security.wrappers.Hyprland = {
owner = "root";
group = "root";
capabilities = "cap_sys_nice+ep";
source = lib.getExe cfg.package;
};
xdg.portal = {
enable = true;
extraPortals = [ cfg.portalPackage ];

View file

@ -95,7 +95,9 @@ in
include "${pkgs.apparmor-profiles}/etc/apparmor.d/abstractions/base"
${pkgs.stdenv.cc.libc}/share/locale/** r,
${pkgs.stdenv.cc.libc}/share/locale.alias r,
${config.i18n.glibcLocales}/lib/locale/locale-archive r,
${lib.optionalString (
config.i18n.glibcLocales != null
) "${config.i18n.glibcLocales}/lib/locale/locale-archive r,"}
${etcRule "localtime"}
${pkgs.tzdata}/share/zoneinfo/** r,
${pkgs.stdenv.cc.libc}/share/i18n/** r,

View file

@ -77,6 +77,8 @@ let
BindReadOnlyPaths = [
"/etc"
"/run/systemd"
]
++ lib.optionals (config.i18n.glibcLocales != null) [
"${config.i18n.glibcLocales}"
]
++ mapAttrsToList (name: inbox: inbox.description) cfg.inboxes

View file

@ -10,6 +10,12 @@ let
format = pkgs.formats.keyValue { listsAsDuplicateKeys = true; };
cfgfile = format.generate "minidlna.conf" cfg.settings;
# Match a media_dir entry under /home, allowing an optional `A,`/`V,`/`P,`
# media-type prefix.
mediaDirsUnderHome = lib.any (
dir: builtins.match "([AVP],)?/home/.*" dir != null
) cfg.settings.media_dir;
in
{
options.services.minidlna.enable = lib.mkEnableOption "MiniDLNA, a simple DLNA server. Consider adding `openFirewall = true` into your config";
@ -133,6 +139,49 @@ in
RuntimeDirectory = "minidlna";
PIDFile = "/run/minidlna/pid";
ExecStart = "${lib.getExe cfg.package} -S -P /run/minidlna/pid -f ${cfgfile}";
# Hardening
AmbientCapabilities = [ "" ];
CapabilityBoundingSet = [ "" ];
DeviceAllow = [ "" ];
LockPersonality = true;
MemoryDenyWriteExecute = true;
NoNewPrivileges = true;
PrivateDevices = true;
PrivateTmp = true;
PrivateUsers = true;
ProcSubset = "pid";
ProtectClock = true;
ProtectControlGroups = true;
# Many users keep media under /home; auto-disable ProtectHome when
# any media_dir entry is under /home. Override explicitly to force.
ProtectHome = lib.mkDefault (!mediaDirsUnderHome);
ProtectHostname = true;
ProtectKernelLogs = true;
ProtectKernelModules = true;
ProtectKernelTunables = true;
ProtectProc = "invisible";
ProtectSystem = "strict";
RemoveIPC = true;
# AF_NETLINK is required for getifaddrs() to enumerate interfaces
# for SSDP multicast (239.255.255.250:1900) advertisements.
RestrictAddressFamilies = [
"AF_INET"
"AF_INET6"
"AF_NETLINK"
"AF_UNIX"
];
RestrictNamespaces = true;
RestrictRealtime = true;
RestrictSUIDSGID = true;
SystemCallArchitectures = "native";
SystemCallErrorNumber = "EPERM";
SystemCallFilter = [
"@system-service"
"~@privileged"
"~@resources"
];
UMask = "0077";
};
};
};

View file

@ -41,7 +41,8 @@ in
local payload="$1"
echo "Adding list: $payload"
local result=$(PostFTLData "lists" "$payload")
local type=$($jq -r '.type' <<< "$payload")
local result=$(PostFTLData "lists?type=$type" "$payload")
local error="$($jq '.error' <<< "$result")"
if [[ "$error" != "null" ]]; then

View file

@ -1010,12 +1010,11 @@ in
{
User = cfg.user;
Group = cfg.group;
Type = "simple";
Type = "notify-reload";
RuntimeDirectory = "prosody";
PIDFile = "/run/prosody/prosody.pid";
Environment = "PROSODY_CONFIG=/run/prosody/prosody.cfg.lua";
ExecStart = "${lib.getExe cfg.package} -F";
ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID";
Restart = "on-abnormal";
AmbientCapabilities = [ "CAP_NET_BIND_SERVICE" ];

View file

@ -6,160 +6,47 @@
}:
let
cfg = config.services.reframe;
iniFmt = pkgs.formats.ini { };
settingsFormat = pkgs.formats.ini { };
in
{
options.services.reframe = {
enable = lib.mkEnableOption "DRM/KMS based remote desktop for Linux that supports Wayland/NVIDIA/headless/login";
package = lib.mkPackageOption pkgs "reframe" { };
configs = lib.mkOption {
type = lib.types.attrsOf (
lib.types.submodule {
options = {
type = lib.types.submodule {
freeformType = settingsFormat.type;
};
default = { };
description = "Configurations for ReFrame";
example = ''
{
main = {
reframe = {
card = lib.mkOption {
type = lib.types.str;
default = "";
description = "Select monitor via DRM card. All available cards and connectors can be found in `/sys/class/drm/`.";
example = "card0";
};
connector = lib.mkOption {
type = lib.types.str;
default = "";
description = "Select monitor via connector. All available cards and connectors can be found in `/sys/class/drm/`.";
example = "eDP-1";
};
rotation = lib.mkOption {
type = lib.types.enum [
0
90
180
270
];
default = 0;
description = ''
This is the angle you rotate the monitor, not the angle of display content relative to the monitor!
Valid angles are clockwise `0`, `90`, `180`, `270`.
'';
};
desktop-width = lib.mkOption {
type = lib.types.int;
default = 0;
description = ''
If you have more than 1 monitor, set those values to the logical size of the whole virtual desktop.
You can get those value by finding the pointer position of the right most and bottom most border of your monitors.
'';
};
desktop-height = lib.mkOption {
type = lib.types.int;
default = 0;
description = ''
If you have more than 1 monitor, set those values to the logical size of the whole virtual desktop.
You can get those value by finding the pointer position of the right most and bottom most border of your monitors.
'';
};
monitor-x = lib.mkOption {
type = lib.types.int;
default = 0;
description = ''
If you have more than 1 monitor, set those values to the logical position of the top left corner of your selected monitor.
'';
};
monitor-y = lib.mkOption {
type = lib.types.int;
default = 0;
description = ''
If you have more than 1 monitor, set those values to the logical position of the top left corner of your selected monitor.
'';
};
default-width = lib.mkOption {
type = lib.types.int;
default = 0;
description = ''
If your client does not support resizing, use those to force a size. Empty or `0` means monitor size.
'';
};
default-height = lib.mkOption {
type = lib.types.int;
default = 0;
description = ''
If your client does not support resizing, use those to force a size. Empty or `0` means monitor size.
'';
};
resize = lib.mkOption {
type = lib.types.bool;
default = true;
description = ''
Set to `false` to prohibit client resizing.
'';
};
cursor = lib.mkOption {
type = lib.types.bool;
default = true;
description = ''
Set to `false` to ignore DRM cursor plane.
'';
};
wakeup = lib.mkOption {
type = lib.types.bool;
default = true;
description = ''
Set to `false` if you already disabled automatic screen blank.
'';
};
damage = lib.mkOption {
type = lib.types.enum [
""
"cpu"
"gpu"
];
default = "cpu";
description = ''
Set to `gpu` to use GPU damage region detection, which may be more efficiency but may cause artifacts depending on GPU vendors.
Set to `cpu` to use CPU damage region detection if you get bugs with `gpu`.
Empty to disable damage region detection, which may require higher network bandwidth.
'';
};
fps = lib.mkOption {
type = lib.types.int;
default = 30;
};
card = "card0";
connector = "eDP-1";
rotation = 0;
desktop-width = 1920;
desktop-height = 1080;
monitor-x = 0;
monitor-y = 0;
default-width = 1920;
default-height = 1080;
resize = true;
cursor = true;
wakeup = true;
damage = "cpu";
fps = 30;
};
vnc = {
ip = lib.mkOption {
type = lib.types.str;
default = "";
description = ''
Empty means accept all incoming connections.
'';
};
port = lib.mkOption {
type = lib.types.port;
default = 5933;
};
password = lib.mkOption {
type = lib.types.str;
default = "";
description = ''
Empty means no password.
'';
};
type = lib.mkOption {
type = lib.types.enum [
"libvncserver"
"neatvnc"
];
default = "libvncserver";
description = ''
Set to `neatvnc` to prefer neatvnc, which provides more efficient encoding methods but maybe more unstable.
'';
};
ip = "0.0.0.0";
port = 5933;
password = "password";
type = "libvncserver";
};
};
}
);
default = { };
description = "Configurations for ReFrame";
'';
};
};
@ -179,7 +66,7 @@ in
mode = "0644";
user = "root";
group = "root";
source = iniFmt.generate "${name}.conf" value;
source = settingsFormat.generate "${name}.conf" value;
}
) cfg.configs;
systemd.services = lib.mapAttrs' (

View file

@ -39,8 +39,12 @@ let
# Ensure that clipboard works for non-ASCII characters
sed -i -e '/.*SessionVariables.*/ a\
LANG=${config.i18n.defaultLocale}\
LOCALE_ARCHIVE=${config.i18n.glibcLocales}/lib/locale/locale-archive
LANG=${config.i18n.defaultLocale}${
lib.optionalString (config.i18n.glibcLocales != null) ''
\
LOCALE_ARCHIVE=${config.i18n.glibcLocales}/lib/locale/locale-archive
''
}
' $out/sesman.ini
${cfg.extraConfDirCommands}

View file

@ -174,7 +174,7 @@ in
ProtectControlGroups = true;
MemoryAccounting = true;
ExecStart = "${pkgs.prefect}/bin/prefect server start --host ${cfg.host} --port ${toString cfg.port}";
ExecStart = "${lib.getExe cfg.package} server start --host ${cfg.host} --port ${toString cfg.port}";
Restart = "always";
WorkingDirectory = cfg.dataDir;
};
@ -216,7 +216,7 @@ in
ProtectControlGroups = true;
MemoryAccounting = true;
ExecStart = ''
${pkgs.prefect}/bin/prefect worker start \
${lib.getExe cfg.package} worker start \
--pool ${poolName} \
--type process \
--install-policy ${poolCfg.installPolicy}

View file

@ -60,7 +60,8 @@ in
hostName = lib.mkOption {
type = lib.types.str;
default = "goupile";
default = config.networking.fqdnOrHostName;
defaultText = lib.literalExpression "config.networking.fqdnOrHostName";
description = "Nginx service name for goupile service.";
};
};
@ -70,7 +71,7 @@ in
services.nginx = {
enable = lib.mkDefault true;
virtualHosts.${cfg.hostName} = {
locations."/".proxyPass = "http://${cfg.hostName}:${builtins.toString cfg.settings.HTTP.Port}";
locations."/".proxyPass = "http://127.0.0.1:${builtins.toString cfg.settings.HTTP.Port}";
};
};
}

View file

@ -149,7 +149,10 @@ in
systemd.services.miniflux = {
description = "Miniflux service";
wantedBy = [ "multi-user.target" ];
requires = lib.optional cfg.createDatabaseLocally "miniflux-dbsetup.service";
requires = lib.optionals cfg.createDatabaseLocally [
"miniflux-dbsetup.service"
"postgresql.target"
];
after = [
"network.target"
]

View file

@ -50,7 +50,7 @@ in
epkgs: [
epkgs.emms
epkgs.magit
epkgs.proofgeneral
epkgs.proof-general
]
'';
description = ''

View file

@ -58,7 +58,11 @@
--set DISTRO_ID ${lib.escapeShellArg config.system.nixos.distroId} \
--set INSTALL_BOOTLOADER ${lib.escapeShellArg config.system.build.installBootLoader} \
--set PRE_SWITCH_CHECK ${lib.escapeShellArg config.system.preSwitchChecksScript} \
--set LOCALE_ARCHIVE ${config.i18n.glibcLocales}/lib/locale/locale-archive \
${
lib.optionalString (
config.i18n.glibcLocales != null
) "--set LOCALE_ARCHIVE ${config.i18n.glibcLocales}/lib/locale/locale-archive"
} \
--set SYSTEMD ${config.systemd.package}
)
'';

View file

@ -353,7 +353,6 @@ in
# Legacy environment variables. These were used by the activation script,
# but some other script might still depend on them, although unlikely.
installBootLoader = config.system.build.installBootLoader;
localeArchive = "${config.i18n.glibcLocales}/lib/locale/locale-archive";
distroId = config.system.nixos.distroId;
perl = pkgs.perl.withPackages (
p: with p; [
@ -376,6 +375,9 @@ in
# option, as opposed to `system.extraDependencies`.
passedChecks = concatStringsSep " " config.system.checks;
}
// lib.optionalAttrs (config.i18n.glibcLocales != null) {
localeArchive = "${config.i18n.glibcLocales}/lib/locale/locale-archive";
}
// lib.optionalAttrs (config.system.forbiddenDependenciesRegexes != [ ]) {
closureInfo = pkgs.closureInfo {
rootPaths = [

View file

@ -0,0 +1,84 @@
{
config,
lib,
pkgs,
...
}:
let
cfg = config.boot.initrd.clevisLuksAskpass;
in
{
options = {
boot.initrd.clevisLuksAskpass.enable = lib.mkEnableOption ''
clevis-luks-askpass in initrd.
Watches for systemd password requests during boot and answers them
using clevis tokens bound to LUKS headers. Runs in parallel with
the interactive password prompt. If clevis cannot unlock a device
(tang unreachable, no binding, etc.) the user can still type the
passphrase.
Prerequisites:
- Bind clevis to each LUKS device:
clevis luks bind -d /dev/xxx tang '{"url":"..."}'
- Configure networking in the initrd so tang servers are reachable
'';
boot.initrd.clevisLuksAskpass.package = lib.mkPackageOption pkgs "clevis" { };
boot.initrd.clevisLuksAskpass.useTang = lib.mkOption {
description = "Whether the Clevis headers used to decrypt the devices uses a Tang server as a pin.";
default = false;
type = lib.types.bool;
};
};
config = lib.mkIf cfg.enable {
assertions = [
{
assertion = config.boot.initrd.systemd.enable;
message = "clevis-luks-askpass requires boot.initrd.systemd.enable = true";
}
];
warnings =
if
cfg.useTang && !config.boot.initrd.network.enable && !config.boot.initrd.systemd.network.enable
then
[ "In order to use a Tang pinned secret you must configure networking in initrd" ]
else
[ ];
boot.initrd.systemd = {
# Install upstream clevis-luks-askpass.path and clevis-luks-askpass.service into the initrd
packages = [ cfg.package ];
storePaths = [
cfg.package
"${pkgs.systemd}/lib/systemd/systemd-reply-password"
"${pkgs.jose}/bin/jose"
"${pkgs.curl}/bin/curl"
"${pkgs.cryptsetup}/bin/cryptsetup"
"${pkgs.gnused}/bin/sed"
"${pkgs.gnugrep}/bin/grep"
"${pkgs.gawk}/bin/gawk"
"${pkgs.coreutils}/bin/cat"
"${pkgs.luksmeta}/bin/luksmeta"
"${pkgs.tpm2-tools}/bin/tpm2_createprimary"
"${pkgs.tpm2-tools}/bin/tpm2_flushcontext"
"${pkgs.tpm2-tools}/bin/tpm2_load"
"${pkgs.tpm2-tools}/bin/tpm2_unseal"
];
# This is in the [Install] section of clevis-luks-askpass.path but that's not processed in nixos so we add it here
paths.clevis-luks-askpass = {
wantedBy = [ "cryptsetup.target" ];
};
services.clevis-luks-askpass = {
wants = lib.optional cfg.useTang "network-online.target";
after = lib.optional cfg.useTang "network-online.target";
};
};
};
}

View file

@ -1114,7 +1114,6 @@ in
-> all (dev: dev.preOpenCommands == "" && dev.postOpenCommands == "") (attrValues luks.devices);
message = "boot.initrd.luks.devices.<name>.preOpenCommands and postOpenCommands is not supported by systemd stage 1. Please bind a service to cryptsetup.target or cryptsetup-pre.target instead.";
}
# TODO
{
assertion = config.boot.initrd.systemd.enable -> !luks.gpgSupport;
message = systemdStage1HardwareKeyAssertionMessage "boot.initrd.luks.gpgSupport";
@ -1123,7 +1122,6 @@ in
assertion = config.boot.initrd.systemd.enable -> !luks.fido2Support;
message = systemdStage1HardwareKeyAssertionMessage "boot.initrd.luks.fido2Support";
}
# TODO
{
assertion = config.boot.initrd.systemd.enable -> !luks.yubikeySupport;
message = systemdStage1HardwareKeyAssertionMessage "boot.initrd.luks.yubikeySupport";

View file

@ -9,19 +9,8 @@
imports = [
(lib.mkRenamedOptionModule
[
"boot"
"initrd"
"systemd"
"enableTpm2"
]
[
"boot"
"initrd"
"systemd"
"tpm2"
"enable"
]
[ "boot" "initrd" "systemd" "enableTpm2" ]
[ "boot" "initrd" "systemd" "tpm2" "enable" ]
)
];
@ -31,13 +20,18 @@
defaultText = "systemd.package.withTpm2Units";
};
systemd.tpm2.pcrphases.enable = lib.mkEnableOption "systemd boot phase measurements";
boot.initrd.systemd.tpm2.enable = lib.mkEnableOption "systemd initrd TPM2 support" // {
default = config.boot.initrd.systemd.package.withTpm2Units;
defaultText = "boot.initrd.systemd.package.withTpm2Units";
};
boot.initrd.systemd.tpm2.pcrphases.enable =
lib.mkEnableOption "systemd initrd boot phase measurements";
};
# TODO: pcrphase, pcrextend, pcrfs, pcrmachine
# TODO: pcrextend, pcrfs, pcrmachine
config = lib.mkMerge [
# Stage 2
(
@ -52,6 +46,19 @@
];
}
)
(
let
cfg = config.systemd;
in
lib.mkIf (cfg.tpm2.enable && cfg.tpm2.pcrphases.enable) {
systemd.additionalUpstreamSystemUnits = [
"systemd-pcrphase.service"
"systemd-pcrphase-sysinit.service"
];
systemd.services.systemd-pcrphase.wantedBy = [ "sysinit.target" ];
systemd.services.systemd-pcrphase-sysinit.wantedBy = [ "sysinit.target" ];
}
)
# Stage 1
(
@ -77,5 +84,15 @@
];
}
)
(
let
cfg = config.boot.initrd.systemd;
in
lib.mkIf (cfg.enable && cfg.tpm2.enable && cfg.tpm2.pcrphases.enable) {
boot.initrd.systemd.additionalUpstreamUnits = [ "systemd-pcrphase-initrd.service" ];
boot.initrd.systemd.services.systemd-pcrphase-initrd.wantedBy = [ "initrd.target" ];
boot.initrd.systemd.storePaths = [ "${cfg.package}/lib/systemd/systemd-pcrextend" ];
}
)
];
}

View file

@ -337,11 +337,7 @@ in
done
# Move the new temporary /etc mount underneath the current /etc mount.
#
# This should eventually use util-linux to perform this move beneath,
# however, this functionality is not yet in util-linux. See this
# tracking issue: https://github.com/util-linux/util-linux/issues/2604
${pkgs.move-mount-beneath}/bin/move-mount --move --beneath "$tmpEtcMount" /etc
mount --move --beneath "$tmpEtcMount" /etc
# Unmount the top /etc mount to atomically reveal the new mount.
umount --lazy --recursive /etc

View file

@ -119,7 +119,6 @@ in
);
forceLuksSupportInInitrd = true;
};
# TODO: systemd stage 1
postMountCommands = lib.mkIf (!config.boot.initrd.systemd.enable) (
concatMapStrings (
dev:

View file

@ -273,6 +273,10 @@ in
"bcachefs" = "${cfg.package}/bin/bcachefs";
"mount.bcachefs" = "${cfg.package}/bin/mount.bcachefs";
};
boot.initrd.systemd.storePaths = [
# Used by the ExecStart= in bcachefs-wait-devices@.service.
"${cfg.package}/sbin/bcachefs"
];
boot.initrd.extraUtilsCommands = lib.mkIf (!config.boot.initrd.systemd.enable) ''
copy_bin_and_libs ${cfg.package}/bin/bcachefs
copy_bin_and_libs ${cfg.package}/bin/mount.bcachefs
@ -285,6 +289,7 @@ in
commonFunctions + lib.concatStrings (lib.mapAttrsToList openCommand bootFs)
);
boot.initrd.systemd.packages = [ cfg.package ];
boot.initrd.systemd.services = lib.mapAttrs' (mkUnits "/sysroot") bootFs;
})

View file

@ -3,7 +3,7 @@
{
name = "buildbot";
nodes = {
containers = {
bbmaster =
{ pkgs, ... }:
{

View file

@ -124,47 +124,55 @@ in
environment.systemPackages =
let
replyToEmail = pkgs.writeScriptBin "reply-to-email" ''
#!${pkgs.python3.interpreter}
import imaplib
import smtplib
import ssl
import email.header
from email import message_from_bytes
from email.message import EmailMessage
replyToEmail =
pkgs.writeScriptBin "reply-to-email"
# python
''
#!${pkgs.python3.interpreter}
import imaplib
import smtplib
import ssl
import email.header
import sys
from email import message_from_bytes
from email.message import EmailMessage
with imaplib.IMAP4('localhost') as imap:
imap.login('alice', 'foobar')
imap.select()
status, data = imap.search(None, 'ALL')
assert status == 'OK'
with imaplib.IMAP4('localhost') as imap:
imap.login('alice', 'foobar')
imap.select()
status, data = imap.search(None, 'ALL')
assert status == 'OK'
nums = data[0].split()
assert len(nums) == 1
nums = data[0].split()
try:
assert len(nums) == 1
except AssertionError:
print("No mail in IMAP mailbox yet...", file=sys.stderr)
sys.exit(1)
status, msg_data = imap.fetch(nums[0], '(RFC822)')
assert status == 'OK'
status, msg_data = imap.fetch(nums[0], '(RFC822)')
assert status == 'OK'
msg = email.message_from_bytes(msg_data[0][1])
subject = str(email.header.make_header(email.header.decode_header(msg['Subject'])))
reply_to = email.header.decode_header(msg['Reply-To'])[0][0]
message_id = email.header.decode_header(msg['Message-ID'])[0][0]
date = email.header.decode_header(msg['Date'])[0][0]
msg = email.message_from_bytes(msg_data[0][1])
subject = str(email.header.make_header(email.header.decode_header(msg['Subject'])))
reply_to = email.header.decode_header(msg['Reply-To'])[0][0]
message_id = email.header.decode_header(msg['Message-ID'])[0][0]
date = email.header.decode_header(msg['Date'])[0][0]
ctx = ssl.create_default_context()
with smtplib.SMTP_SSL(host='${discourseDomain}', context=ctx) as smtp:
reply = EmailMessage()
reply['Subject'] = 'Re: ' + subject
reply['To'] = reply_to
reply['From'] = 'alice@${clientDomain}'
reply['In-Reply-To'] = message_id
reply['References'] = message_id
reply['Date'] = date
reply.set_content("Test reply.")
ctx = ssl.create_default_context()
with smtplib.SMTP_SSL(host='${discourseDomain}', context=ctx) as smtp:
reply = EmailMessage()
reply['Subject'] = 'Re: ' + subject
reply['To'] = reply_to
reply['From'] = 'alice@${clientDomain}'
reply['In-Reply-To'] = message_id
reply['References'] = message_id
reply['Date'] = date
reply.set_content("Test reply.")
smtp.send_message(reply)
smtp.quit()
'';
smtp.send_message(reply)
smtp.quit()
'';
in
[ replyToEmail ];

View file

@ -21,6 +21,7 @@ let
forceGrubReinstallCount ? 0,
withTestInstrumentation ? true,
clevisTest,
clevisAskpassTest ? false,
}:
pkgs.writeText "configuration.nix" ''
{ config, lib, pkgs, modulesPath, ... }:
@ -73,7 +74,12 @@ let
boot.kernelParams = [ "console=tty0" "ip=192.168.1.1:::255.255.255.0::eth1:none" ];
boot.initrd = {
availableKernelModules = [ "tpm_tis" ];
clevis = { enable = true; useTang = true; };
${
if clevisAskpassTest then
"clevisLuksAskpass = { enable = true; useTang = true; };"
else
"clevis = { enable = true; useTang = true; };"
}
network.enable = true;
};
''}
@ -108,6 +114,7 @@ let
testFlakeSwitch,
testByAttrSwitch,
clevisTest,
clevisAskpassTest ? false,
clevisFallbackTest,
disableFileSystems,
}:
@ -190,6 +197,7 @@ let
grubUseEfi
extraConfig
clevisTest
clevisAskpassTest
;
}
}",
@ -197,11 +205,20 @@ let
)
installer.copy_from_host("${pkgs.writeText "secret" "secret"}", "/mnt/etc/nixos/secret")
${optionalString clevisTest ''
with subtest("Create the Clevis secret with Tang"):
${optionalString (clevisTest && !clevisAskpassTest)
''
with subtest("Create the Clevis secret with Tang"):
installer.systemctl("start network-online.target")
installer.wait_for_unit("network-online.target")
installer.succeed('echo -n password | clevis encrypt sss \'{"t": 2, "pins": {"tpm2": {}, "tang": {"url": "http://192.168.1.2"}}}\' -y > /mnt/etc/nixos/clevis-secret.jwe')''
}
${optionalString clevisAskpassTest ''
with subtest("Bind Clevis to LUKS header"):
installer.systemctl("start network-online.target")
installer.wait_for_unit("network-online.target")
installer.succeed('echo -n password | clevis encrypt sss \'{"t": 2, "pins": {"tpm2": {}, "tang": {"url": "http://192.168.1.2"}}}\' -y > /mnt/etc/nixos/clevis-secret.jwe')''}
installer.succeed("echo -n password | clevis luks bind -y -k - -d /dev/vda3 sss '{\"t\": 2, \"pins\": {\"tpm2\": {}, \"tang\": {\"url\": \"http://192.168.1.2\"}}}'")
''}
${optionalString clevisFallbackTest ''
with subtest("Shutdown Tang to check fallback to interactive prompt"):
@ -283,6 +300,7 @@ let
grubUseEfi
extraConfig
clevisTest
clevisAskpassTest
;
forceGrubReinstallCount = 1;
}
@ -316,6 +334,7 @@ let
grubUseEfi
extraConfig
clevisTest
clevisAskpassTest
;
forceGrubReinstallCount = 2;
}
@ -384,6 +403,7 @@ let
grubUseEfi
extraConfig
clevisTest
clevisAskpassTest
;
forceGrubReinstallCount = 1;
withTestInstrumentation = false;
@ -482,6 +502,7 @@ let
grubUseEfi
extraConfig
clevisTest
clevisAskpassTest
;
forceGrubReinstallCount = 1;
}
@ -518,6 +539,7 @@ let
grubUseEfi
extraConfig
clevisTest
clevisAskpassTest
;
forceGrubReinstallCount = 1;
withTestInstrumentation = false;
@ -637,6 +659,7 @@ let
testFlakeSwitch ? false,
testByAttrSwitch ? false,
clevisTest ? false,
clevisAskpassTest ? false,
clevisFallbackTest ? false,
disableFileSystems ? false,
selectNixPackage ? pkgs: pkgs.nixVersions.stable,
@ -820,6 +843,7 @@ let
testFlakeSwitch
testByAttrSwitch
clevisTest
clevisAskpassTest
clevisFallbackTest
disableFileSystems
;
@ -1044,6 +1068,43 @@ let
'';
};
mkClevisLuksAskpassTest =
{
fallback ? false,
}:
makeInstallerTest "clevis-luks-askpass${optionalString fallback "-fallback"}" {
clevisTest = true;
clevisAskpassTest = true;
clevisFallbackTest = fallback;
enableOCR = fallback;
extraInstallerConfig = {
environment.systemPackages = with pkgs; [ clevis ];
};
createPartitions = ''
installer.succeed(
"flock /dev/vda parted --script /dev/vda -- mklabel msdos"
+ " mkpart primary ext2 1M 100MB"
+ " mkpart primary linux-swap 100M 1024M"
+ " mkpart primary 1024M -1s",
"udevadm settle",
"mkswap /dev/vda2 -L swap",
"swapon -L swap",
"modprobe dm_mod dm_crypt",
"echo -n password | cryptsetup luksFormat -q /dev/vda3 -",
"echo -n password | cryptsetup luksOpen --key-file - /dev/vda3 crypt-root",
"mkfs.ext3 -L nixos /dev/mapper/crypt-root",
"mount LABEL=nixos /mnt",
"mkfs.ext3 -L boot /dev/vda1",
"mkdir -p /mnt/boot",
"mount LABEL=boot /mnt/boot",
"udevadm settle")
'';
postBootCommands = optionalString fallback ''
target.wait_for_text("Please enter")
target.send_chars("password\n")
'';
};
mkClevisZfsTest =
{
fallback ? false,
@ -1741,6 +1802,9 @@ in
};
}
// optionalAttrs systemdStage1 {
clevisLuksAskpass = mkClevisLuksAskpassTest { };
clevisLuksAskpassFallback = mkClevisLuksAskpassTest { fallback = true; };
stratisRoot = makeInstallerTest "stratisRoot" {
createPartitions = ''
installer.succeed(

View file

@ -7,7 +7,7 @@
name = "music-assistant";
meta.maintainers = with lib.maintainers; [ hexa ];
nodes.machine = {
containers.machine = {
services.music-assistant = {
enable = true;
};

View file

@ -815,6 +815,7 @@ let
};
# initialize wallet, creates macaroon needed by exporter
systemd.services.lnd.postStart = ''
until [ -f /var/lib/lnd/tls.cert ]; do sleep 1; done
${pkgs.curl}/bin/curl \
--retry 20 \
--retry-delay 1 \
@ -2051,7 +2052,7 @@ let
{
exporterConfig = {
enable = true;
instance = "/run/varnish/varnish";
instance = "/var/run/varnishd";
group = "varnish";
};
metricProvider = {

View file

@ -5,7 +5,7 @@
maintainers = [ mic92 ];
};
nodes.machine =
containers.machine =
{ ... }:
{
services.telegraf.enable = true;

View file

@ -64,9 +64,9 @@ let
codium_running.wait() # type: ignore[union-attr]
with codium_running: # type: ignore[union-attr]
# Wait until vscodium is visible. "File" is in the menu bar.
machine.wait_for_text('(Get|Started|with|Customize|theme)')
machine.screenshot('start_screen')
# Wait until vscodium is visible.
machine.wait_for_text('Search')
machine.screenshot('screen')
test_string = 'testfile'

View file

@ -1,7 +1,7 @@
import os
import openpyxl
import tempfile
from playwright.sync_api import sync_playwright
from playwright.sync_api import sync_playwright, Page
BASE_URL = "http://localhost:8889"
@ -10,6 +10,15 @@ ADMIN_PASSWD = "car-shop-in-the-mall"
ALICE_PASSWD = "user-goes-to-the-car-shop"
def click_save_and_wait(page: Page):
save_btn = page.get_by_role("button", name="Save")
with page.expect_response(
lambda r: r.request.method in ["POST", "PUT", "PATCH"] and r.status < 400
):
save_btn.click()
page.wait_for_selector(".ui_busy", state="hidden", timeout=30000)
def run_test():
is_headful = os.getenv("HEADFUL") == "1"
@ -20,6 +29,8 @@ def run_test():
)
# more default timeout for slow nixos test vms
context.set_default_timeout(90 * 1000)
context.tracing.start(screenshots=True, snapshots=True, sources=True)
page = context.new_page()
page.goto(f"{BASE_URL}/admin")
@ -48,10 +59,17 @@ def run_test():
page.get_by_role("button", name="No", exact=True).click()
page.get_by_role("textbox", name="Password *").fill(ALICE_PASSWD)
page.get_by_role("textbox", name="Confirmation").fill(ALICE_PASSWD)
page.get_by_role("button", name="Create").click()
with page.expect_response(
lambda r: r.request.method == "POST" and r.status < 400
):
page.get_by_role("button", name="Create").click()
# give alice, permissions to access the project
page.get_by_role("button", name="Assign").nth(1).click()
assign_button = page.get_by_role("button", name="Assign").nth(1)
assign_button.wait_for(state="visible")
assign_button.click()
page.get_by_text("Read", exact=True).click()
page.get_by_text("Save", exact=True).click()
page.get_by_text("Export", exact=True).click()
@ -71,25 +89,23 @@ def run_test():
page1.get_by_role("textbox", name="Inclusion date *").fill("2000-01-01")
page1.get_by_role("spinbutton", name="Age *").click()
page1.get_by_role("spinbutton", name="Age *").fill("1")
page1.get_by_role("button", name="Save").click()
page1.wait_for_timeout(1000)
click_save_and_wait(page1)
page1.get_by_role("button", name="Advanced").click()
page1.get_by_role("spinbutton", name="Age *").click()
page1.get_by_role("spinbutton", name="Age *").fill("1")
page1.get_by_role("button", name="Save").click()
page1.wait_for_timeout(1000)
click_save_and_wait(page1)
page1.get_by_role("button", name="Page layout").click()
page1.get_by_role("spinbutton", name="Variable A1").fill("1")
page1.get_by_role("button", name="Save").click()
page1.wait_for_timeout(1000)
click_save_and_wait(page1)
# create export #1
page1.get_by_role("button", name="Data").click()
page1.wait_for_timeout(1000)
page1.get_by_role("button", name="Data exports").wait_for(state="visible")
page1.get_by_role("button", name="Data exports").click()
with page1.expect_download() as download_info:
page1.get_by_role("button", name="Create export").click()
@ -115,26 +131,24 @@ def run_test():
page2.get_by_role("textbox", name="Inclusion date *").fill("2000-01-01")
page2.get_by_role("spinbutton", name="Age *").click()
page2.get_by_role("spinbutton", name="Age *").fill("2")
page2.get_by_role("button", name="Save").click()
page2.wait_for_timeout(1000)
click_save_and_wait(page2)
page2.get_by_role("button", name="Advanced").click()
page2.get_by_role("spinbutton", name="Age *").click()
page2.get_by_role("spinbutton", name="Age *").fill("2")
page2.get_by_role("button", name="Save").click()
page2.wait_for_timeout(1000)
click_save_and_wait(page2)
page2.get_by_role("button", name="Page layout").click()
page2.get_by_role("spinbutton", name="Variable A1").click()
page2.get_by_role("spinbutton", name="Variable A1").fill("2")
page2.get_by_role("button", name="Save").click()
page2.wait_for_timeout(1000)
click_save_and_wait(page2)
# create export #2
page2.get_by_role("button", name="Data").click()
page2.wait_for_timeout(1000)
page2.get_by_role("button", name="Data exports").wait_for(state="visible")
page2.get_by_role("button", name="Data exports").click()
page2.get_by_role("button", name="Previous exports").click()
with page2.expect_download() as download1_info:
@ -156,18 +170,19 @@ def run_test():
print(f"exported all records to {save_path2}")
context.tracing.stop(path="/tmp/videos/trace.zip")
context.close()
browser.close()
# check that exported files have correct entries
wb1 = openpyxl.load_workbook(save_path1)
for sheet, cell in zip(["intro", "advanced", "layout"], ["D2", "D2", "C2"]):
for sheet, cell in zip(["intro", "advanced", "layout"], ["E2", "E2", "D2"]):
val = wb1[sheet][cell].value
assert val == 1, f"Sheet {sheet}, Cell {cell}: Expected 1 (admin), got {val}"
wb2 = openpyxl.load_workbook(save_path2)
for sheet, cell in zip(["intro", "advanced", "layout"], ["D3", "D3", "C3"]):
for sheet, cell in zip(["intro", "advanced", "layout"], ["E3", "E3", "D3"]):
val = wb2[sheet][cell].value
assert val == 2, f"Sheet {sheet}, Cell {cell}: Expected 2 (alice), got {val}"

View file

@ -73,7 +73,6 @@ in
#systemd.services.goupile.environment.DEFAULT_SECCOMP_ACTION = "Log"; # Block|Log|Kill
networking = {
firewall.allowedTCPPorts = [ config.services.nginx.defaultHTTPListenPort ];
hostName = "goupile";
domain = "local";
};
@ -108,12 +107,14 @@ in
machine.wait_for_open_port(${port})
machine.succeed("curl -q http://localhost:${port}")
machine.succeed("curl -q http://goupile.local")
machine.succeed("curl -q http://machine.local")
machine.succeed("curl -q http://localhost")
machine.succeed("run-goupile-test")
out_dir = os.environ.get("out", os.getcwd())
machine.copy_from_machine("/tmp/videos", out_dir)
try:
machine.succeed("run-goupile-test")
finally:
out_dir = os.environ.get("out", os.getcwd())
machine.copy_from_vm("/tmp/videos", out_dir)
'';
# Debug interactively with:

View file

@ -14,12 +14,9 @@ in
soyouzpanda
];
nodes.machine =
containers.machine =
{ pkgs, ... }:
{
virtualisation.diskSize = 4 * 1024;
virtualisation.memorySize = 4 * 1024;
networking.hosts."127.0.0.1" = [ domain ];
environment.systemPackages = with pkgs; [

View file

@ -0,0 +1,53 @@
{
lib,
stdenv,
fetchFromGitHub,
pkg-config,
deadbeef,
vgmstream,
mpg123,
libvorbis,
ffmpeg,
nix-update-script,
}:
stdenv.mkDerivation (finalAttrs: {
pname = "deadbeef-vgmstream-plugin";
version = "2026-05-09.1";
src = fetchFromGitHub {
owner = "jchv";
repo = "deadbeef-vgmstream";
rev = finalAttrs.version;
hash = "sha256-dR1TEx61jnprEQokHRX/mi3WvbS+CVp4VIMlutX6uS8=";
};
nativeBuildInputs = [ pkg-config ];
buildInputs = [
deadbeef
mpg123
libvorbis
ffmpeg.dev
];
enableParallelBuilding = true;
makeFlags = [ "DEADBEEF_ROOT=${deadbeef}" ];
installFlags = [ "DEADBEEF_ROOT=$(out)" ];
postUnpack = ''
rm -rf $sourceRoot/vgmstream
cp --no-preserve=mode,ownership -LR ${vgmstream.src} $sourceRoot/vgmstream
'';
passthru.updateScript = nix-update-script { };
meta = {
description = "Streaming video game music decoder plugin for the DeaDBeeF music player";
homepage = "https://github.com/jchv/deadbeef-vgmstream";
license = lib.licenses.isc;
maintainers = [ lib.maintainers.jchw ];
platforms = lib.platforms.linux;
};
})

View file

@ -23,6 +23,7 @@
common-updater-scripts,
curl,
openssl_1_1,
openssl_3_5,
bzip2,
sqlite,
}:
@ -33,7 +34,7 @@ let
binaries = [
"sublime_text"
"plugin_host-3.3"
"plugin_host-3.8"
"plugin_host-3.${if lib.versionAtLeast buildVersion "4205" then "14" else "8"}"
crashHandlerBinary
];
primaryBinary = "sublime_text";
@ -90,12 +91,20 @@ let
for binary in ${builtins.concatStringsSep " " binaries}; do
patchelf \
--interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" \
--set-rpath ${lib.makeLibraryPath neededLibraries}:${lib.getLib stdenv.cc.cc}/lib${lib.optionalString stdenv.hostPlatform.is64bit "64"} \
--set-rpath ${lib.makeLibraryPath neededLibraries}:${lib.getLib stdenv.cc.cc}/lib${lib.optionalString stdenv.hostPlatform.is64bit "64"}:$out \
$binary
done
# Unable to get plugin_host-3.14 not crash with Python from Nixpkgs
${lib.optionalString (lib.versionAtLeast buildVersion "4205") "patchelf --set-rpath ${
lib.makeLibraryPath [
sqlite
openssl_3_5
]
} libpython3.14.so.1.0"}
# Rewrite pkexec argument. Note that we cannot delete bytes in binary.
sed -i -e 's,/bin/cp\x00,cp\x00\x00\x00\x00\x00\x00,g' ${primaryBinary}
${lib.optionalString (lib.versionOlder buildVersion "4205") "sed -i -e 's,/bin/cp\\x00,cp\\x00\\x00\\x00\\x00\\x00\\x00,g' ${primaryBinary}"}
runHook postBuild
'';
@ -106,6 +115,7 @@ let
# No need to patch these libraries, it works well with our own
rm libcrypto.so.1.1 libssl.so.1.1
${lib.optionalString (lib.versionAtLeast buildVersion "4145") "rm libsqlite3.so"}
${lib.optionalString (lib.versionAtLeast buildVersion "4205") "rm libcrypto.so.3 libssl.so.3"}
mkdir -p $out
cp -r * $out/
@ -116,7 +126,7 @@ let
dontWrapGApps = true; # non-standard location, need to wrap the executables manually
postFixup = ''
sed -i 's#/usr/bin/pkexec#pkexec\x00\x00\x00\x00\x00\x00\x00\x00\x00#g' "$out/${primaryBinary}"
${lib.optionalString (lib.versionOlder buildVersion "4205") "sed -i 's#/usr/bin/pkexec#pkexec\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00#g' \"$out/${primaryBinary}\""}
wrapProgram $out/${primaryBinary} \
--set LOCALE_ARCHIVE "${glibcLocales.out}/lib/locale/locale-archive" \

View file

@ -11,9 +11,9 @@ in
} { };
sublime4-dev = common {
buildVersion = "4199";
buildVersion = "4205";
dev = true;
x64sha256 = "Nrhwv+ox/SW21c8wZtuX9mzHQ+o9ghsI50dU2kDvCX0=";
aarch64sha256 = "3vCXj53f2Qlt/Ab3hNNng+Y4Ch85Dp0G8srTVBtd6zU=";
x64sha256 = "1Tg8m4FNrVOeHK6VSmlua30pW4Bu7Gz+sT0t/w01UyM=";
aarch64sha256 = "K94UipUVZRh8xJKYW35be0u9L/VHpZ+FYhC26v41b3U=";
} { };
}

File diff suppressed because it is too large Load diff

View file

@ -11,13 +11,13 @@
}:
vimUtils.buildVimPlugin rec {
pname = "codediff.nvim";
version = "2.43.15";
version = "2.45.0";
src = fetchFromGitHub {
owner = "esmuellert";
repo = "codediff.nvim";
tag = "v${version}";
hash = "sha256-gaPLjH33+nBgpSZJ8b/4aneodt8wg+Jy44yXAjemToA=";
hash = "sha256-Up4vH5yk13don0HrmHHpqrPIKtc1MTtDbZ6QcMHQYAU=";
};
dependencies = [ vimPlugins.nui-nvim ];

View file

@ -3285,12 +3285,6 @@ assertNoAdditions {
];
};
nvim-sioyek-highlights = super.nvim-sioyek-highlights.overrideAttrs (old: {
meta = old.meta // {
license = lib.licenses.mit;
};
});
nvim-snippets = super.nvim-snippets.overrideAttrs {
checkInputs = [
# Optional cmp integration

View file

@ -1820,7 +1820,7 @@ https://github.com/natecraddock/workspaces.nvim/,,
https://github.com/andrewferrier/wrapping.nvim/,,
https://github.com/tweekmonster/wstrip.vim/,,
https://github.com/piersolenski/wtf.nvim/,,
https://github.com/kyza0d/xeno.nvim/,,
https://github.com/kyzadev/xeno.nvim/,,
https://github.com/Mythos-404/xmake.nvim/,,
https://github.com/drmingdrmer/xptemplate/,,
https://github.com/guns/xterm-color-table.vim/,,

View file

@ -21,26 +21,26 @@ vscode-utils.buildVscodeMarketplaceExtension (finalAttrs: {
sources = {
"x86_64-linux" = {
arch = "linux-x64";
hash = "sha256-pGJ1coic0kdjXUI6HCEkQsyQC5YU0jnA1hmN6MaPfwg=";
hash = "sha256-VTbeOLAGmaVy9PL5/Y+ebbCNa6ki4cx0VGXhzLuz1ow=";
};
"aarch64-linux" = {
arch = "linux-arm64";
hash = "sha256-NppbZ/gCZYGZna8bs/nUASxyqd6Bv0AOYTEbfaqJWyI=";
hash = "sha256-j8cDVoxT38/dmorTlPQjrd2GQS+BkoatIbQQzB1c7GA=";
};
"x86_64-darwin" = {
arch = "darwin-x64";
hash = "sha256-oM2H7CJBS0G8ieiI6twqpA257QWWytdbpkV2Q2D7R6o=";
hash = "sha256-Kl23fdHFlh9cvfMtXNr6GI+AWknPFMM1lGFCuJY5kXw=";
};
"aarch64-darwin" = {
arch = "darwin-arm64";
hash = "sha256-lRChL8hGIc4zJ/CBwPkLYY1U5YhfM0DrW//C1dNi//A=";
hash = "sha256-M1dfKzjfHeH4xmvnuRmBsnhaQryL6c84nPrl2NGQT5k=";
};
};
in
{
name = "claude-code";
publisher = "anthropic";
version = "2.1.141";
version = "2.1.143";
}
// sources.${stdenvNoCC.hostPlatform.system}
or (throw "Unsupported system ${stdenvNoCC.hostPlatform.system}");

View file

@ -2068,8 +2068,8 @@ let
mktplcRef = {
name = "vscode-graphql";
publisher = "GraphQL";
version = "0.13.2";
hash = "sha256-9G6iIYjZE6s5EGRTc0Y6gUN1cK9Gm2ohnl3oYqBWGqs=";
version = "0.13.4";
hash = "sha256-zPc+jNbXfuXMWXxbKhaOpjgDu96jg5C+CCQ3HXEQ7fw=";
};
meta = {
description = "GraphQL extension for VSCode built with the aim to tightly integrate the GraphQL Ecosystem with VSCode for an awesome developer experience";
@ -2084,8 +2084,8 @@ let
mktplcRef = {
name = "vscode-graphql-syntax";
publisher = "GraphQL";
version = "1.3.8";
hash = "sha256-10x2kX9Gc7O/tGRDPZfy1cKdCIvGTCXcD2bDokIz7TU=";
version = "1.3.10";
hash = "sha256-EY6BHl5ICcs3FuuenoadDXLLPSe8+2VAAydqo/YrtaE=";
};
meta = {
description = "Adds full GraphQL syntax highlighting and language support such as bracket matching";
@ -5200,8 +5200,8 @@ let
mktplcRef = {
name = "volar";
publisher = "Vue";
version = "3.2.8";
hash = "sha256-lbTE5UP4JSpqoXHzS6HPBX2pOQjeBSmHhxqy0thawfc=";
version = "3.2.9";
hash = "sha256-LkoytGAAZwjm3Mm3EixCHjnh1dkxB0lKMv5KJVYSwGY=";
};
meta = {
changelog = "https://github.com/vuejs/language-tools/blob/master/CHANGELOG.md";

View file

@ -27,12 +27,12 @@ let
hash =
{
x86_64-linux = "sha256-CP4tIZhDoC56T6N0RUebNRw3CjxG82odHt4WY8rgmS8=";
x86_64-darwin = "sha256-4EWKIXc+CKQLot7eN6Bkd/xigByEGafLMKJ832EOSwA=";
aarch64-linux = "sha256-5EwENP1lpHzqiWWeXNQzQOp/zAAEanSbDhWcMeup2sY=";
aarch64-darwin = "sha256-9n7kVtknqfSfTc2MmFps5bxSqMnL6KNhZgTb+DVUkhY=";
armv7l-linux = "sha256-aXGqp7ljvqDJNb5BMiBIm2CluIr70oiNPmR7BULLsv8=";
loongarch64-linux = "sha256-XPEssw+7NVKljyrWcc+Q2HzRr31seDwbdNn3EtyHlSY=";
x86_64-linux = "sha256-gscXPWqnQV9nd9XWbL5YkCdyxxnDDEY4WpFAgx5G7a0=";
x86_64-darwin = "sha256-H6sKVtQi++U7NvSkKWipjDDJQsTu0Zg3tp9kijL85eU=";
aarch64-linux = "sha256-09C5ER/nZBphWHZRRAf9o/hyB6qc2mqIuxOLNdlVSfU=";
aarch64-darwin = "sha256-utDPI80JCPcXTFvK65UR5CBlyb+EsocpHM0KWeojaUI=";
armv7l-linux = "sha256-voNvX40YWm7oYrgNAIhoRE/9zZlIq/MgaGVlumDUaz4=";
loongarch64-linux = "sha256-T7QGiIilEL2lR01yUZ70ubQ2XGgnL7NQ4xkt0MeDD3s=";
}
.${system} or throwSystem;
@ -43,7 +43,7 @@ buildVscode rec {
# Please backport all compatible updates to the stable release.
# This is important for the extension ecosystem.
version = "1.112.01907";
version = "1.116.02821";
pname = "vscodium";
executableName = "codium";

View file

@ -5,13 +5,13 @@
}:
mkLibretroCore rec {
core = "atari800";
version = "0-unstable-2026-04-20";
version = "0-unstable-2026-05-11";
src = fetchFromGitHub {
owner = "libretro";
repo = "libretro-atari800";
rev = "7f3456f16109c34915d0bad7393b6c4df66c3850";
hash = "sha256-7C/0i7LUGHY8bz5wp9ut+5EtvLrAUasn0xQzslQQ1fM=";
rev = "1851228de23b47cb74fbc8ea589a1c7c5e02ea98";
hash = "sha256-s7M7yezPWzRokrxpoo8JbgOzi5R18yOQNgmHkTQR7S4=";
};
makefile = "Makefile";

View file

@ -8,13 +8,13 @@
}:
mkLibretroCore {
core = "mednafen-psx" + lib.optionalString withHw "-hw";
version = "0-unstable-2026-05-09";
version = "0-unstable-2026-05-15";
src = fetchFromGitHub {
owner = "libretro";
repo = "beetle-psx-libretro";
rev = "c699953afa01bc3f179edbcb14c4cfbeee6107a2";
hash = "sha256-s009GuPnsufDT70dBmhwfZmYjdf7pYO13FjycYvUF4c=";
rev = "c194d8c7d9cef77b653f688f1293746aa71a928e";
hash = "sha256-lIvVk0a+lwBF+BtX2KT2MwOUguTGm/pKi8s9IbZqwsU=";
};
extraBuildInputs = lib.optionals withHw [

View file

@ -5,13 +5,13 @@
}:
mkLibretroCore {
core = "bluemsx";
version = "0-unstable-2026-04-11";
version = "0-unstable-2026-05-18";
src = fetchFromGitHub {
owner = "libretro";
repo = "bluemsx-libretro";
rev = "0b23b79f6b8c19f300d2d86958e89fbe2f6d30bc";
hash = "sha256-/rILuViKZBKZFZkCjuFuuuOE3AvDiHQqHtWq4Q8XSMA=";
rev = "175438e5fe68ae0cfb7d04c29f81eed17635e6b4";
hash = "sha256-crFrG6OsmW3nNnQ+OHFtYz7cRuU9hTjWe3vq4PdYJqA=";
};
meta = {

View file

@ -10,13 +10,13 @@
}:
mkLibretroCore {
core = "desmume";
version = "0-unstable-2026-05-03";
version = "0-unstable-2026-05-16";
src = fetchFromGitHub {
owner = "libretro";
repo = "desmume";
rev = "a55c393de8ecf19df8111f65b8e12d08b9616520";
hash = "sha256-0+uSOg1asszgnDbdRsfWQY/E2Ky2tK3KxkcNV2mGjBQ=";
rev = "ae0f7f51f96d9b5741b47b425505a4a4224b91fa";
hash = "sha256-M8Z2Zk9wjEuOOg++Tk68A8hgCmE63nh9+oJhu4fsQsk=";
};
extraBuildInputs = [

View file

@ -5,13 +5,13 @@
}:
mkLibretroCore {
core = "fbneo";
version = "0-unstable-2026-05-09";
version = "0-unstable-2026-05-18";
src = fetchFromGitHub {
owner = "libretro";
repo = "fbneo";
rev = "776ae715211d3ef2413b2828e9e9d50d869a6822";
hash = "sha256-NgPs8H8/ysD18J2G9StaLM5e05EzgjLW8c2kTrcOXZI=";
rev = "1a2d079aac28c540c20a9e4cac87bb02021c3eec";
hash = "sha256-4q1q20Us7HVZr2CWsqujQWiqryc/xS9/bVBt/x7Y5H8=";
};
makefile = "Makefile";

View file

@ -8,13 +8,13 @@
}:
mkLibretroCore {
core = "flycast";
version = "0-unstable-2026-05-10";
version = "0-unstable-2026-05-15";
src = fetchFromGitHub {
owner = "flyinghead";
repo = "flycast";
rev = "4be8a484665fb5684ccb780ed2165018a679c622";
hash = "sha256-kjQcKdxUMdUc+70OPzEtDeSKy/m2e0FyPDa4XR3nHmM=";
rev = "3e60beb69e557287c704dc310f42286258d68a2b";
hash = "sha256-Ew3YjR92NnbvGoNFhSZSNNeSrMMWEeUAfnJSp6/tnIY=";
fetchSubmodules = true;
};

View file

@ -0,0 +1,109 @@
{
lib,
fetchFromGitHub,
glm,
libslirp,
fmt_11,
span-lite,
howard-hinnant-date,
libGL,
libGLU,
cmake,
mkLibretroCore,
}:
let
# https://github.com/JesseTG/melonds-ds/blob/33c48260402865ef77667487528efd5ca7ce1233/cmake/FetchDependencies.cmake#L44
melonDS-src = fetchFromGitHub {
owner = "JesseTG";
repo = "melonDS";
rev = "f6692dff8c0c53f77639a08e5e746a286312bb41";
hash = "sha256-+bMqpjspQzyRci3u0PEpR9oX3S9LBqP223y6VfI2j14=";
};
libretro-common-src = fetchFromGitHub {
owner = "JesseTG";
repo = "libretro-common";
rev = "8e2b884db16711a999a0e46a02a3dc0be294b048";
hash = "sha256-NYxi1BADUgMAtLfmYcOIhTAnmJ/LYd0OyfPKx6lorw4=";
};
embed-binaries-src = fetchFromGitHub {
owner = "andoalon";
repo = "embed-binaries";
rev = "21f28cabbba02cd657578c70b7aedd0f141467ff";
hash = "sha256-iW3DBGdp/ykE3EoGcuirq5V5lKV0vemzIjDFrINzQPM=";
};
pntr-src = fetchFromGitHub {
owner = "robloach";
repo = "pntr";
rev = "650237a524ea4fc953de7223a1587c83f2696794";
hash = "sha256-qGWPlHkcW/wavxRN76SHiEKCl2b1VZR+O9YrZOFZL0I=";
};
yamc-src = fetchFromGitHub {
owner = "yohhoy";
repo = "yamc";
rev = "4e015a7e8eb0d61c34e6928676c8c78881a72d73";
hash = "sha256-J5wAqF5yQ5KYArJJyKzaqscWsXq+KAPKXybYfVgasXs=";
};
# using nixpkgs zlib gives a linking error
zlib-src = fetchFromGitHub {
owner = "madler";
repo = "zlib";
rev = "570720b0c24f9686c33f35a1b3165c1f568b96be";
hash = "sha256-5g/Jo8M/jvkgV0NofSAV4JdwJSk5Lyv9iGRb2Kz/CC0=";
};
in
mkLibretroCore rec {
core = "melondsds";
version = "1.2.0";
src = fetchFromGitHub {
owner = "JesseTG";
repo = "melonds-ds";
rev = "33c48260402865ef77667487528efd5ca7ce1233";
hash = "sha256-n5MZ6BWUWRi+jz34EbL+SeSkjFZeqQNXE3hS6JzS424=";
};
patches = [ ./patches/melondsds-noslirpcopy.patch ];
postPatch = ''
substituteInPlace CMakeLists.txt \
--replace-fail "find_package(Git REQUIRED)" ""
substituteInPlace src/libretro/CMakeLists.txt \
--replace-fail "include(embed-binaries)" "include(${embed-binaries-src}/cmake/embed-binaries.cmake)"
substituteInPlace cmake/FetchDependencies.cmake \
--replace-fail "set_target_properties(example" "set_target_properties(zlib_example" \
--replace-fail "set_target_properties(zlib_example64 minigzip64" "set_target_properties(zlib_example64"
'';
makefile = "";
extraBuildInputs = [
libGL
libGLU
];
extraNativeBuildInputs = [ cmake ];
cmakeFlags = [
(lib.cmakeBool "ENABLE_LTO_RELEASE" false) # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121831
(lib.cmakeFeature "CMAKE_POLICY_VERSION_MINIMUM" "3.5") # required by yamc
(lib.cmakeFeature "FETCHCONTENT_SOURCE_DIR_MELONDS" "${melonDS-src}")
(lib.cmakeFeature "FETCHCONTENT_SOURCE_DIR_LIBRETRO-COMMON" "${libretro-common-src}")
(lib.cmakeFeature "FETCHCONTENT_SOURCE_DIR_EMBED-BINARIES" "${embed-binaries-src}")
(lib.cmakeFeature "FETCHCONTENT_SOURCE_DIR_GLM" "${glm.src}")
(lib.cmakeFeature "FETCHCONTENT_SOURCE_DIR_ZLIB" "${zlib-src}")
(lib.cmakeFeature "FETCHCONTENT_SOURCE_DIR_LIBSLIRP" "${libslirp.src}")
(lib.cmakeFeature "FETCHCONTENT_SOURCE_DIR_PNTR" "${pntr-src}")
(lib.cmakeFeature "FETCHCONTENT_SOURCE_DIR_FMT" "${fmt_11.src}")
(lib.cmakeFeature "FETCHCONTENT_SOURCE_DIR_YAMC" "${yamc-src}")
(lib.cmakeFeature "FETCHCONTENT_SOURCE_DIR_SPAN-LITE" "${span-lite.src}")
(lib.cmakeFeature "FETCHCONTENT_SOURCE_DIR_DATE" "${howard-hinnant-date.src}")
];
postBuild = "cd src/libretro";
meta = {
description = "A remake of the libretro MelonDS core";
homepage = "https://github.com/JesseTG/melonds-ds";
changelog = "https://github.com/JesseTG/melonds-ds/releases/tag/v${version}";
license = lib.licenses.gpl3Only;
};
}

View file

@ -0,0 +1,17 @@
diff --git a/cmake/libslirp.cmake b/cmake/libslirp.cmake
index 1cb6758..bef1793 100644
--- a/cmake/libslirp.cmake
+++ b/cmake/libslirp.cmake
@@ -2,12 +2,6 @@ add_library(slirp STATIC
src/glib-stub/glib.c
)
-# Copy libslirp's files to another directory so that we can include it as <slirp/libslirp.h>
-file(MAKE_DIRECTORY "${libslirp_BINARY_DIR}/include")
-file(REMOVE_RECURSE "${libslirp_BINARY_DIR}/include/slirp")
-file(COPY "${libslirp_SOURCE_DIR}/src" DESTINATION "${libslirp_BINARY_DIR}/include")
-file(RENAME "${libslirp_BINARY_DIR}/include/src" "${libslirp_BINARY_DIR}/include/slirp")
-
target_include_directories(slirp PUBLIC
"${libslirp_BINARY_DIR}/include"
"${libslirp_SOURCE_DIR}/src"

View file

@ -5,13 +5,13 @@
}:
mkLibretroCore {
core = "puae";
version = "0-unstable-2026-05-01";
version = "0-unstable-2026-05-18";
src = fetchFromGitHub {
owner = "libretro";
repo = "libretro-uae";
rev = "20e019d4405e33472a3c20824c53bcd79f474a1b";
hash = "sha256-4yQtwE7Ghm2/43u2Xcht4WctTNkQjAhMTZtXj4EoJTA=";
rev = "6fbf272e342387281484ae84f690fa129f0ab86e";
hash = "sha256-JwFIQfWaorQmDxYgHvpq/CEFMc0LVAsX6TyiGN6FhZA=";
};
makefile = "Makefile";

View file

@ -5,13 +5,13 @@
}:
mkLibretroCore {
core = "quicknes";
version = "0-unstable-2026-04-20";
version = "0-unstable-2026-05-11";
src = fetchFromGitHub {
owner = "libretro";
repo = "QuickNES_Core";
rev = "7848e1ac22b1c69d056ae4cb57710651ff1dd169";
hash = "sha256-cgoLO1572XoDDBJiEFglWtbo3vk5EXu/U3Pn7zrxqM8=";
rev = "a0ec494c417f365c578f3dacadb04383e4a99ade";
hash = "sha256-q1AS4mASF2gaiGyuM6a/Z57bp0DPRQADlM+snb3iNSg=";
};
makefile = "Makefile";

View file

@ -5,13 +5,13 @@
}:
mkLibretroCore rec {
core = "snes9x2010";
version = "0-unstable-2026-05-05";
version = "0-unstable-2026-05-16";
src = fetchFromGitHub {
owner = "libretro";
repo = "snes9x2010";
rev = "d9cba8a41b3407ebb929816a7033e0407fd7b2d0";
hash = "sha256-OdJStJK823PayWS+bmwG+kDrdx6KeVWYiSAu61C9UFs=";
rev = "bc82e8281ddbbd487875866f5db27cdb9838d319";
hash = "sha256-laAXE4U5ROKe2QnYbUrvJ4xRPv1hzllDZ8ei01IwqKA=";
};
makeFlags = [ "GIT_VERSION=${builtins.substring 0 7 src.rev}" ];

View file

@ -5,13 +5,13 @@
}:
mkLibretroCore {
core = "virtualjaguar";
version = "0-unstable-2026-05-01";
version = "0-unstable-2026-05-09";
src = fetchFromGitHub {
owner = "libretro";
repo = "virtualjaguar-libretro";
rev = "e04f953915731c15f5f9cb9b8ae44630c901f23f";
hash = "sha256-jjF3vyVuxViyZP1wbxZduBhURYylGdS3BKxzKnPBm7Q=";
rev = "18828045f76a803206ebffc9b8d57842287b7552";
hash = "sha256-lHQsApSoZNvyTp6D3lOBHyLCQ321cirUVXZRHXvIdP4=";
};
makefile = "Makefile";

View file

@ -106,6 +106,8 @@ lib.makeScope newScope (self: {
melonds = self.callPackage ./cores/melonds.nix { };
melondsds = self.callPackage ./cores/melondsds.nix { };
mesen = self.callPackage ./cores/mesen.nix { };
mesen-s = self.callPackage ./cores/mesen-s.nix { };

View file

@ -9,11 +9,11 @@
buildMozillaMach rec {
pname = "firefox";
version = "140.10.2esr";
version = "140.11.0esr";
applicationName = "Firefox ESR";
src = fetchurl {
url = "mirror://mozilla/firefox/releases/${version}/source/firefox-${version}.source.tar.xz";
sha512 = "bda7d5e6d59a2ad310e3f3e6e8ec05c78222edce266671d5d454dfa3e8f0086add3b9c0099db907cb62b2587ed47026ba7b3aa4f0406693d142d8d91b818d551";
sha512 = "d06adb3ef4de1324e3d61872d70de31ab08ac013f33903549bed28c6ebcc5b4dee94bb36388282c1935d77d1a564079f3adbf08d6bb80284a899cbb3d861300c";
};
meta = {

View file

@ -9,10 +9,10 @@
buildMozillaMach rec {
pname = "firefox";
version = "150.0.3";
version = "151.0";
src = fetchurl {
url = "mirror://mozilla/firefox/releases/${version}/source/firefox-${version}.source.tar.xz";
sha512 = "8452da61200f8ee66790d3fff230ca84b2ac9291af2b57e018486c50f938c53c6fb4943fe6cfe1e99b9783466fb00bf707fa006293753ac698618fc1e3b70a4a";
sha512 = "5e6b01236c6aad17889c1d33614637a13e41d659c3306b2dadf13ab50d91a36d1269fae6d405d31351e4defe589f47f31c0798b66ad87438720f5779bcb90401";
};
meta = {

View file

@ -80,6 +80,7 @@ let
# https://mozilla.github.io/policy-templates/
extraPolicies ? { },
extraPoliciesFiles ? [ ],
extraAutoConfig ? "",
libName ? browser.libName or applicationName, # Important for tor package or the like
nixExtensions ? null,
hasMozSystemDirPatch ? (lib.hasPrefix "firefox" pname && !lib.hasSuffix "-bin" pname),
@ -553,8 +554,11 @@ let
prefsDir="$out/${prefsDir}"
mkdir -p "$prefsDir"
echo 'pref("general.config.filename", "mozilla.cfg");' > "$prefsDir/autoconfig.js"
echo 'pref("general.config.obscure_value", 0);' >> "$prefsDir/autoconfig.js"
cat > "$prefsDir/autoconfig.js" << EOF
pref("general.config.filename", "mozilla.cfg");
pref("general.config.obscure_value", 0);
${extraAutoConfig}
EOF
cat > "$libDir/mozilla.cfg" << EOF
${mozillaCfg}

View file

@ -499,13 +499,13 @@
"vendorHash": null
},
"hashicorp_archive": {
"hash": "sha256-nR8bgFvhENwC3L3w580FBtDK5l8WDfJqxDQZeUvWyl0=",
"hash": "sha256-6Fw2D9PMCcYzu7i3WdloRWbtJlE1tvbiC+/UBSMg9wA=",
"homepage": "https://registry.terraform.io/providers/hashicorp/archive",
"owner": "hashicorp",
"repo": "terraform-provider-archive",
"rev": "v2.7.1",
"rev": "v2.8.0",
"spdx": "MPL-2.0",
"vendorHash": "sha256-MYVkNvJ+rbwGw0htClIbmxk3YX2OK/ZO/QOTyMRFiug="
"vendorHash": "sha256-ikBqIxD5aTOcwNHCMN6EaOwSHCAP5n/SULuqQXPLpOc="
},
"hashicorp_aws": {
"hash": "sha256-+MvxcQn0pnsNDR6ERXFW85fLwQ+AG+UcBo5F25WN4mQ=",
@ -544,13 +544,13 @@
"vendorHash": null
},
"hashicorp_cloudinit": {
"hash": "sha256-xDHp2bG0/T4pE3j8L4zTVnaQ9te5MuAbiGmopFedOpk=",
"hash": "sha256-qSPGHjxaeYYhWDerzOf4bh7JKzuX6Cb1TBrERzMlfaI=",
"homepage": "https://registry.terraform.io/providers/hashicorp/cloudinit",
"owner": "hashicorp",
"repo": "terraform-provider-cloudinit",
"rev": "v2.3.7",
"rev": "v2.4.0",
"spdx": "MPL-2.0",
"vendorHash": "sha256-bD8BHhP4jxBRnFjmZE1MMkBn2/sMqNEaxTlQRMj2Crw="
"vendorHash": "sha256-z/47aZ1u0t6n8FMvdSxzE7tUJe1KHNXhd+UjRTjtaBM="
},
"hashicorp_consul": {
"hash": "sha256-iYt4TxyVQIYjrOgVS+olDcDgTddaVmYVy8M/Y9IkTpQ=",
@ -562,31 +562,31 @@
"vendorHash": "sha256-tCwe8TDqwq3lY7so//tHhbTh51EtfIE1UkBylJ8JhoU="
},
"hashicorp_dns": {
"hash": "sha256-ErvlkaFiIHEXUZYDJZmqEgGpZ75mnLRhhsULRvTm7Rc=",
"hash": "sha256-sdJpv5Am1tlKyaUkmByrZauzRGZUeAirf7k9a/Fv0S0=",
"homepage": "https://registry.terraform.io/providers/hashicorp/dns",
"owner": "hashicorp",
"repo": "terraform-provider-dns",
"rev": "v3.5.0",
"rev": "v3.6.0",
"spdx": "MPL-2.0",
"vendorHash": "sha256-P4018IUQ4MfdPHP20rHvuzeFSxLHBcoJuLHS/TNAHLk="
"vendorHash": "sha256-01tI68RBp6Qpveqo6Jdynd7SWypbUsY6buPNwdcoPkc="
},
"hashicorp_external": {
"hash": "sha256-rHMmGzYvsE5GT0E71UUIXjDG9+v52LI69/gdP2xuI7w=",
"hash": "sha256-/uBQaDqZBNmIOkwYD+zOPo7ZHiHKDZO2MmD0q52KM4k=",
"homepage": "https://registry.terraform.io/providers/hashicorp/external",
"owner": "hashicorp",
"repo": "terraform-provider-external",
"rev": "v2.3.5",
"rev": "v2.4.0",
"spdx": "MPL-2.0",
"vendorHash": "sha256-xIagZvWtlNpz5SQfxbA7r9ojAeS3CW2pwV337ObKOwU="
"vendorHash": "sha256-sPQR+LDZRMXygLUd9xj6/bI+8DhAPKbkytlTzmrEOBU="
},
"hashicorp_google": {
"hash": "sha256-6cvRvVQmKRi4kyNAo/UAGN00bO+uCJYvf661xYW/QCQ=",
"hash": "sha256-EXE9etM8gPdrWriF2HJmD5QZY9tDU8dgsusqnvupnKI=",
"homepage": "https://registry.terraform.io/providers/hashicorp/google",
"owner": "hashicorp",
"repo": "terraform-provider-google",
"rev": "v7.31.0",
"rev": "v7.32.0",
"spdx": "MPL-2.0",
"vendorHash": "sha256-UoS4iIVHhCQ+Zk+SJmsMHJgJBKLMbfMVmtm4MDmzT68="
"vendorHash": "sha256-xCWhCYD+YKyEB55uMm2p+eCtSlg65nSfGFMlX0qIiMQ="
},
"hashicorp_google-beta": {
"hash": "sha256-/HxUOhDATteiUDIeA8zvGI9xQ5rOWJAhLN9PLHiBFfI=",
@ -968,13 +968,13 @@
"vendorHash": "sha256-OAd8SeTqTrH0kMoM2LsK3vM2PI23b3gl57FaJYM9hM0="
},
"newrelic_newrelic": {
"hash": "sha256-m8KZQUmDyMTR3S1BC5nmo15j5TUDV3ZZsy4hg16VZlc=",
"hash": "sha256-UByjO3/TE/b3kncFVMuTpWvTfC5Oof+Z5+9KdOEs7JU=",
"homepage": "https://registry.terraform.io/providers/newrelic/newrelic",
"owner": "newrelic",
"repo": "terraform-provider-newrelic",
"rev": "v3.87.1",
"rev": "v3.87.3",
"spdx": "MPL-2.0",
"vendorHash": "sha256-W/a04lDiPVh/tkcWz9eJp/pupI46cXxqukdv1h17xYY="
"vendorHash": "sha256-2nDiNYX8iwu4u5gaaIYJC8a/Jw/MBdTgNxmyw+RLB+c="
},
"ns1-terraform_ns1": {
"hash": "sha256-MX/Wd9Lztjn7uwDzJjs4bsSSp0PFzUgsu4jXke9jHL8=",
@ -1058,11 +1058,11 @@
"vendorHash": null
},
"oracle_oci": {
"hash": "sha256-Yt46N9wVwgz8VbPSHQF1UQ4XT1ENIcE+yeKmO0JqnlM=",
"hash": "sha256-+/7ie5SBYMQ+fEvnrFvVRHnEJ6DGtcjKNzBpsYKItP0=",
"homepage": "https://registry.terraform.io/providers/oracle/oci",
"owner": "oracle",
"repo": "terraform-provider-oci",
"rev": "v8.13.0",
"rev": "v8.14.0",
"spdx": "MPL-2.0",
"vendorHash": null
},
@ -1130,11 +1130,11 @@
"vendorHash": "sha256-L1wufPa7LPPyOPTL+jFQgiWzJoJYS+fCdw3N0KZqKtc="
},
"rancher_rancher2": {
"hash": "sha256-T7nX+sD3FOqXgoNzzGJfIKvMvJ5hkYoHCyzR5Sm08IE=",
"hash": "sha256-OFLEDwDDD02FKMldpkRxbj2gRQzhmVb2+3dG3Hq2AG4=",
"homepage": "https://registry.terraform.io/providers/rancher/rancher2",
"owner": "rancher",
"repo": "terraform-provider-rancher2",
"rev": "v14.1.0",
"rev": "v14.1.1",
"spdx": "MPL-2.0",
"vendorHash": "sha256-WpI4OZ7BUVgHwQY+7ct+K6CnwXFFuiRbI+iTFSJ8a5A="
},
@ -1292,13 +1292,13 @@
"vendorHash": "sha256-HjrB7C0KaLJz9NVLfZdq5EZbNbF9lJPxSkQwnWUF978="
},
"tailscale_tailscale": {
"hash": "sha256-yR65w/o/VpwKINcvz4SBybAwsphGC7A/B+baKRcIT3I=",
"hash": "sha256-c1Hz8srHNaZJq1kJrSwm8ruoHcebM11yX2wQhWavoWE=",
"homepage": "https://registry.terraform.io/providers/tailscale/tailscale",
"owner": "tailscale",
"repo": "terraform-provider-tailscale",
"rev": "v0.28.0",
"rev": "v0.29.0",
"spdx": "MIT",
"vendorHash": "sha256-+q2KR3ctotT30fBE0lcpQlUXQS7nfi5VACWYxwluuMc="
"vendorHash": "sha256-hl9govsnEXMd4VbOPqoSGLgSnImDA55enYTaDz2wKH0="
},
"telmate_proxmox": {
"hash": "sha256-1aKKlOIk1mH4yx66eD635d1IaUWXIiBGHEt4A2F2mGM=",

View file

@ -43,14 +43,14 @@
python3.pkgs.buildPythonApplication rec {
pname = "gajim";
version = "2.4.5";
version = "2.4.6";
src = fetchFromGitLab {
domain = "dev.gajim.org";
owner = "gajim";
repo = "gajim";
tag = version;
hash = "sha256-5daPMlC2Ejfi5UXsRLaLWwEZHHEC0szbfkqavIisoUQ=";
hash = "sha256-QHfJ52uMDlE/rqqy7y2JIQLMOPaTp7eh4DEsPLBx6p8=";
};
pyproject = true;

View file

@ -35,6 +35,9 @@ stdenv.mkDerivation rec {
"--without-libfam"
];
# gcc 15 C23 default breaks K&R () prototypes and errors on -Wincompatible-pointer-types
env.NIX_CFLAGS_COMPILE = "-std=gnu17";
nativeBuildInputs = [
autoreconfHook
groff

View file

@ -17,13 +17,13 @@
buildGoModule (finalAttrs: {
pname = "cri-o";
version = "1.35.0";
version = "1.36.0";
src = fetchFromGitHub {
owner = "cri-o";
repo = "cri-o";
tag = "v${finalAttrs.version}";
hash = "sha256-aP3qhD2d1x+VPDifkg9lXgVD38UcongyN6vHkn8oYos=";
hash = "sha256-I+oqb8TeI7dBX4ecmEEWNKM7EAdCfGWYv6dpz8emvuA=";
};
vendorHash = null;

View file

@ -332,14 +332,31 @@ buildStdenv.mkDerivation {
# https://hg-edge.mozilla.org/mozilla-central/rev/aa8a29bd1fb9
./139-wayland-drag-animation.patch
]
# Revert apple sdk bump to 26.1 and 26.2
# Revert apple sdk bump to 26.1, 26.2 and 26.4
++
lib.optionals (lib.versionAtLeast version "151" && lib.versionOlder apple-sdk_26.version "26.4")
[
(fetchpatch {
url = "https://github.com/mozilla-firefox/firefox/commit/d06b47c9e398ceb04193f904e090f23a5a1f4906.patch";
hash = "sha256-N458KSOOiotmji5VjgdbhueZ3yTVx47UtsWnmOe8XFQ=";
revert = true;
includes = [
"build/moz.configure/toolchain.configure"
"python/mozbuild/mozbuild/test/configure/macos_fake_sdk/SDKSettings.plist"
];
})
]
++
lib.optionals (lib.versionAtLeast version "148" && lib.versionOlder apple-sdk_26.version "26.2")
[
(fetchpatch {
url = "https://github.com/mozilla-firefox/firefox/commit/73cbb9ff0fdbf8b13f38d078ce01ef6ec0794f9c.patch";
hash = "sha256-ghdddJxsaxXzLZpOOfwss+2S/UUcbLqKGzWWqKy9h/k=";
hash = "sha256-3eBhCuiT61pbeCrvK13vg0OFV4gn/JTvsGXmLN4MBTQ=";
revert = true;
includes = [
"build/moz.configure/toolchain.configure"
"python/mozbuild/mozbuild/test/configure/macos_fake_sdk/SDKSettings.plist"
];
})
]
++
@ -347,8 +364,12 @@ buildStdenv.mkDerivation {
[
(fetchpatch {
url = "https://github.com/mozilla-firefox/firefox/commit/c1cd0d56e047a40afb2a59a56e1fd8043e448e05.patch";
hash = "sha256-bFHLy3b0jOcROqltIwHwSAqWYve8OZHbiPMOdhLUCLc=";
hash = "sha256-NPaA5tYz3BUxB2ads5HZyYWJ+aS9pTzQp+AKFkfmdXA=";
revert = true;
includes = [
"build/moz.configure/toolchain.configure"
"python/mozbuild/mozbuild/test/configure/macos_fake_sdk/SDKSettings.plist"
];
})
]
++ extraPatches;

View file

@ -128,9 +128,9 @@ in
export pnpm_config_pm_on_fail=ignore
# Some packages produce platform dependent outputs. We do not want to cache those in the global store
export pnpm_config_side_effects_cache false
export pnpm_config_side_effects_cache=false
export pnpm_config_update_notifier false
export pnpm_config_update_notifier=false
else
pnpm config set manage-package-manager-versions false
pnpm config set side-effects-cache false

View file

@ -255,6 +255,12 @@ lib.makeOverridable
# Example: [ "-Z debuginfo=2" ]
# Default: []
extraRustcOptsForBuildRs,
# Extra rustc options for proc-macro crates, replacing
# `extraRustcOpts`. Lets callers keep instrumentation flags
# (sanitizers, coverage) off host dylibs, mirroring Cargo's
# behaviour of not applying RUSTFLAGS to host artifacts.
# Default: null (inherit `extraRustcOpts`)
extraRustcOptsForProcMacro,
# The lint level cap passed to rustc via `--cap-lints`.
# See <https://doc.rust-lang.org/rustc/lints/levels.html#capping-lints>.
#
@ -353,7 +359,21 @@ lib.makeOverridable
buildInputs_ = buildInputs;
extraRustcOpts_ = extraRustcOpts;
extraRustcOptsForBuildRs_ = extraRustcOptsForBuildRs;
extraRustcOptsForProcMacro_ = extraRustcOptsForProcMacro;
buildTests_ = buildTests;
procMacro = lib.attrByPath [ "procMacro" ] false crate;
# For proc-macros, prefer the *ForProcMacro variant at each level
# (crate attr, override arg) and fall back to extraRustcOpts.
crateExtraRustcOpts =
if procMacro && crate ? extraRustcOptsForProcMacro then
crate.extraRustcOptsForProcMacro
else
crate.extraRustcOpts or [ ];
overrideExtraRustcOpts =
if procMacro && extraRustcOptsForProcMacro_ != null then
extraRustcOptsForProcMacro_
else
extraRustcOpts_;
resolvedLints = crate.lints or lints;
lintFlags = lintsToRustcFlags resolvedLints;
resolvedCapLints =
@ -486,7 +506,7 @@ lib.makeOverridable
crateRustVersion = crate.rust-version or "";
crateVersion = crate.version;
crateType =
if lib.attrByPath [ "procMacro" ] false crate then
if procMacro then
[ "proc-macro" ]
else if lib.attrByPath [ "plugin" ] false crate then
[ "dylib" ]
@ -497,8 +517,8 @@ lib.makeOverridable
edition = crate.edition or null;
codegenUnits = if crate ? codegenUnits then crate.codegenUnits else defaultCodegenUnits;
extraRustcOpts =
lib.optionals (crate ? extraRustcOpts) crate.extraRustcOpts
++ extraRustcOpts_
crateExtraRustcOpts
++ overrideExtraRustcOpts
++ lintFlags
++ (lib.optional (edition != null) "--edition ${edition}");
extraRustcOptsForBuildRs =
@ -598,6 +618,7 @@ lib.makeOverridable
verbose = crate_.verbose or true;
extraRustcOpts = [ ];
extraRustcOptsForBuildRs = [ ];
extraRustcOptsForProcMacro = null;
capLints = null;
lints = { };
features = [ ];

View file

@ -836,6 +836,32 @@ rec {
];
};
};
# Default (null) inherits extraRustcOpts for proc-macros.
procMacroExtraOptsInherit = {
procMacro = true;
edition = "2018";
extraRustcOpts = [ "--cfg=target_only" ];
src = mkFile "src/lib.rs" ''
#[cfg(not(target_only))]
compile_error!("extraRustcOpts not inherited by proc-macro");
use proc_macro as _;
'';
};
# When set, extraRustcOptsForProcMacro replaces extraRustcOpts
# for proc-macro crates.
procMacroExtraOptsOverride = {
procMacro = true;
edition = "2018";
extraRustcOpts = [ "--cfg=target_only" ];
extraRustcOptsForProcMacro = [ "--cfg=host_only" ];
src = mkFile "src/lib.rs" ''
#[cfg(target_only)]
compile_error!("extraRustcOpts leaked into proc-macro");
#[cfg(not(host_only))]
compile_error!("extraRustcOptsForProcMacro not applied");
use proc_macro as _;
'';
};
# The `lints` attr mirrors Cargo.toml's `[lints]` table and is
# translated to rustc `-A`/`-W`/`-D`/`-F` flags. Lower-priority
# entries are emitted first so that higher-priority specific lints

View file

@ -6,13 +6,13 @@
buildGoModule (finalAttrs: {
pname = "air";
version = "1.65.1";
version = "1.65.2";
src = fetchFromGitHub {
owner = "air-verse";
repo = "air";
tag = "v${finalAttrs.version}";
hash = "sha256-omyWDW5bE+HfXQ2EQZKthB9t+jBEFcPSVtPss5qeoMI=";
hash = "sha256-kQqWIqGJx8396rALn87ykdA3g+1IH+XGOpaICD02j2U=";
};
vendorHash = "sha256-03xZ3P/7xjznYdM9rv+8ZYftQlnjJ6ZTq0HdSvGpaWw=";

View file

@ -11,16 +11,16 @@
buildGoModule (finalAttrs: {
pname = "aks-mcp-server";
version = "0.0.17";
version = "0.0.18";
src = fetchFromGitHub {
owner = "Azure";
repo = "aks-mcp";
rev = "v${finalAttrs.version}";
hash = "sha256-3G7IDHDY3HfjGYM8aKK4Egey1/urDVeWv99PJcCaiSo=";
hash = "sha256-h/zLbnc2ffcQkx+KE6vglaSG6QAySZSg8EB4zyqH4sg=";
};
vendorHash = "sha256-aMs7vABZwRPPIaP6BdTau1oFfGqnzYt8wxUk2mQSVlE=";
vendorHash = "sha256-HYIEGnQOVNNVJxzoOiLTXwRFOBvCwikAwqky18VqFSQ=";
subPackages = [ "cmd/aks-mcp" ];

View file

@ -15,12 +15,12 @@
stdenv.mkDerivation (finalAttrs: {
pname = "algol68g";
version = "3.12.0";
version = "3.12.1";
src = fetchurl {
# Uses archive.org because the original site removes older versions.
url = "https://web.archive.org/web/20260503173638/https://algol68genie.nl/algol68g-3.12.0.tar.gz";
hash = "sha256-fYjuivr6AKRK4Nn45Q+oglpTMnp+PhO6KOkGZjwVKn0=";
url = "https://web.archive.org/web/20260515052918/https://algol68genie.nl/algol68g-3.12.1.tar.gz";
hash = "sha256-Mdoca6W1Wyyv7WrmzaAW/fn0uLkXy6MwSDImVwB+mBk";
};
outputs = [

View file

@ -8,13 +8,13 @@
buildGoModule (finalAttrs: {
pname = "aliyun-cli";
version = "3.3.12";
version = "3.3.15";
src = fetchFromGitHub {
owner = "aliyun";
repo = "aliyun-cli";
tag = "v${finalAttrs.version}";
hash = "sha256-U6vEQwlj0jNYnkZyZmmelEf/WJIHmaffJ+Y1NRU0IiI=";
hash = "sha256-7DkVhFGUvAAFWUiFTOaYARIGCyAW3UqMCLUs5F55vfM=";
fetchSubmodules = true;
};

View file

@ -1,246 +0,0 @@
{
"name": "amp-cli",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"dependencies": {
"@sourcegraph/amp": "^0.0.1778343260-gb9a37d"
}
},
"node_modules/@napi-rs/keyring": {
"version": "1.1.10",
"resolved": "https://registry.npmjs.org/@napi-rs/keyring/-/keyring-1.1.10.tgz",
"integrity": "sha512-PTMyX7FVZGP4s0LcjgrFonek7Sr9ZTdi0TgpR4/4RQmC2TiDcjpdZOXxRMe2aP+5N89Ix9RG9QWclgqRHLk/Xw==",
"license": "MIT",
"engines": {
"node": ">= 10"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/Brooooooklyn"
},
"optionalDependencies": {
"@napi-rs/keyring-darwin-arm64": "1.1.10",
"@napi-rs/keyring-darwin-x64": "1.1.10",
"@napi-rs/keyring-freebsd-x64": "1.1.10",
"@napi-rs/keyring-linux-arm-gnueabihf": "1.1.10",
"@napi-rs/keyring-linux-arm64-gnu": "1.1.10",
"@napi-rs/keyring-linux-arm64-musl": "1.1.10",
"@napi-rs/keyring-linux-riscv64-gnu": "1.1.10",
"@napi-rs/keyring-linux-x64-gnu": "1.1.10",
"@napi-rs/keyring-linux-x64-musl": "1.1.10",
"@napi-rs/keyring-win32-arm64-msvc": "1.1.10",
"@napi-rs/keyring-win32-ia32-msvc": "1.1.10",
"@napi-rs/keyring-win32-x64-msvc": "1.1.10"
}
},
"node_modules/@napi-rs/keyring-darwin-arm64": {
"version": "1.1.10",
"resolved": "https://registry.npmjs.org/@napi-rs/keyring-darwin-arm64/-/keyring-darwin-arm64-1.1.10.tgz",
"integrity": "sha512-qdXBVypPNgTzso5F/YXWy5dOfFEb9eo43uROMlvwlhj7Aw137iwqwHiqlxR0teFKA33cWnem+ZKeVSIPoobtNA==",
"cpu": [
"arm64"
],
"license": "MIT",
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": ">= 10"
}
},
"node_modules/@napi-rs/keyring-darwin-x64": {
"version": "1.1.10",
"resolved": "https://registry.npmjs.org/@napi-rs/keyring-darwin-x64/-/keyring-darwin-x64-1.1.10.tgz",
"integrity": "sha512-53DgSzhTAJwxR3KCyggHWcLwp+cw2v1zAhBiqNn1P8XwSJSba7HzFwsei6zZMn7bn3UY1ngIHEtaA74UUJVJyw==",
"cpu": [
"x64"
],
"license": "MIT",
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": ">= 10"
}
},
"node_modules/@napi-rs/keyring-freebsd-x64": {
"version": "1.1.10",
"resolved": "https://registry.npmjs.org/@napi-rs/keyring-freebsd-x64/-/keyring-freebsd-x64-1.1.10.tgz",
"integrity": "sha512-pI6lect/Dp8NnV+g3w1hmYLt69FbSwKFAHn77vjeUaIT5H9C0ikAgwLk89Sd8/Ei/AHHldGkrLeWkNjnIiHfoQ==",
"cpu": [
"x64"
],
"license": "MIT",
"optional": true,
"os": [
"freebsd"
],
"engines": {
"node": ">= 10"
}
},
"node_modules/@napi-rs/keyring-linux-arm-gnueabihf": {
"version": "1.1.10",
"resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-arm-gnueabihf/-/keyring-linux-arm-gnueabihf-1.1.10.tgz",
"integrity": "sha512-w4psOx5m1ltvNLABT/BpIzP5roVcglR1kDhzZgSEOIIrf2i4FKPQqUIo5UQtjsu+AqhhYwnlnketKDf4h+D06g==",
"cpu": [
"arm"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">= 10"
}
},
"node_modules/@napi-rs/keyring-linux-arm64-gnu": {
"version": "1.1.10",
"resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-arm64-gnu/-/keyring-linux-arm64-gnu-1.1.10.tgz",
"integrity": "sha512-YMC+ZLj3RldGD2Q5wzlZbc8vTh5Fteln+FpB2lw7EbDib3mmIribNH1NG21E4SwculFRDkVJqYGzwIhafloT8Q==",
"cpu": [
"arm64"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">= 10"
}
},
"node_modules/@napi-rs/keyring-linux-arm64-musl": {
"version": "1.1.10",
"resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-arm64-musl/-/keyring-linux-arm64-musl-1.1.10.tgz",
"integrity": "sha512-X/Gr5q2vJW7HMpcWRKj7eXer00a1PYb3zt3xsEG/VbcEo5A973pJANTBhYuoW098O/b7ORkunFt9WSbCgenw2A==",
"cpu": [
"arm64"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">= 10"
}
},
"node_modules/@napi-rs/keyring-linux-riscv64-gnu": {
"version": "1.1.10",
"resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-riscv64-gnu/-/keyring-linux-riscv64-gnu-1.1.10.tgz",
"integrity": "sha512-vA3R4NVBlU0TVDHavwr5hSqePSs9OwTzzzFlTbZzqgh9s7OqcSwNT096nbr5dRjuQfG9o4/xvjfvVJ4v5z0Egg==",
"cpu": [
"riscv64"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">= 10"
}
},
"node_modules/@napi-rs/keyring-linux-x64-gnu": {
"version": "1.1.10",
"resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-x64-gnu/-/keyring-linux-x64-gnu-1.1.10.tgz",
"integrity": "sha512-qbKE72UeVOrIoiYYHh7joTpDIgQCZpW5OJHG4Ir19GHLdQwNZGKLfFxrTT2DvZ5EXwFJWbOp4Dew4OvvQ0E63g==",
"cpu": [
"x64"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">= 10"
}
},
"node_modules/@napi-rs/keyring-linux-x64-musl": {
"version": "1.1.10",
"resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-x64-musl/-/keyring-linux-x64-musl-1.1.10.tgz",
"integrity": "sha512-niLWyjD/JxQwlOTPeldIx8Xnf03Mp4ooorpWJMWbMuVz/6hSyLVghY/BDYu2Oaxhc+XlTEjmqwhoTWYhmti5eA==",
"cpu": [
"x64"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">= 10"
}
},
"node_modules/@napi-rs/keyring-win32-arm64-msvc": {
"version": "1.1.10",
"resolved": "https://registry.npmjs.org/@napi-rs/keyring-win32-arm64-msvc/-/keyring-win32-arm64-msvc-1.1.10.tgz",
"integrity": "sha512-VBlqZ0MF5ksc/Z+yxoL2+p6TDu2rqBOcgZ+HwXzSfgFnfnuPds7xOVdFwwaiJbj9CsCrgnByr1jtHRvfEQ6Iiw==",
"cpu": [
"arm64"
],
"license": "MIT",
"optional": true,
"os": [
"win32"
],
"engines": {
"node": ">= 10"
}
},
"node_modules/@napi-rs/keyring-win32-ia32-msvc": {
"version": "1.1.10",
"resolved": "https://registry.npmjs.org/@napi-rs/keyring-win32-ia32-msvc/-/keyring-win32-ia32-msvc-1.1.10.tgz",
"integrity": "sha512-0AvwivxgtjdpTCZCFAQUCxFA45DNKXOsdZYXBCIDfPIpUPgLxhIAsg6q7NJK00r1M24StwwfD+AzZDu14J1PKQ==",
"cpu": [
"ia32"
],
"license": "MIT",
"optional": true,
"os": [
"win32"
],
"engines": {
"node": ">= 10"
}
},
"node_modules/@napi-rs/keyring-win32-x64-msvc": {
"version": "1.1.10",
"resolved": "https://registry.npmjs.org/@napi-rs/keyring-win32-x64-msvc/-/keyring-win32-x64-msvc-1.1.10.tgz",
"integrity": "sha512-T02DfUUvp3epOJ5lC7hcM5ff6xaLhIfymBf0LEa0oQMi+yCVoDrgjeKeGCUGwtVJWfphu58Tf9twX+hRiAD0dg==",
"cpu": [
"x64"
],
"license": "MIT",
"optional": true,
"os": [
"win32"
],
"engines": {
"node": ">= 10"
}
},
"node_modules/@sourcegraph/amp": {
"version": "0.0.1778343260-gb9a37d",
"resolved": "https://registry.npmjs.org/@sourcegraph/amp/-/amp-0.0.1778343260-gb9a37d.tgz",
"integrity": "sha512-TY4lL2lqwt+NtBa3ngKZSYfY5Z1qBAOd4UQMCT0nsUKatQGtSOIMec+zQSv6tr0L+z2jrDUzD0cpRkBDkLQjsQ==",
"license": "Amp Commercial License",
"dependencies": {
"@napi-rs/keyring": "1.1.10"
},
"bin": {
"amp": "dist/main.js"
},
"engines": {
"node": ">=20"
}
}
}
}

View file

@ -1,90 +1,106 @@
{
stdenvNoCC,
lib,
buildNpmPackage,
fetchzip,
ripgrep,
fetchurl,
autoPatchelfHook,
gzip,
makeWrapper,
testers,
ripgrep,
versionCheckHook,
writableTmpDirAsHomeHook,
cctools,
darwin,
rcodesign,
}:
buildNpmPackage (finalAttrs: {
pname = "amp-cli";
version = "0.0.1778343260-gb9a37d";
src = fetchzip {
url = "https://registry.npmjs.org/@sourcegraph/amp/-/amp-${finalAttrs.version}.tgz";
hash = "sha256-48FyPDniLNQoeZ+SaheTvzLCYL3r95e9VDCW4Y5gMq8=";
let
platforms = {
# Upstream also publishes linux-x64, which is optimized for AVX2. Use the
# baseline build for nixpkgs so the x86_64-linux package works on all
# supported x86_64 CPUs instead of depending on the build user's CPU flags.
x86_64-linux = "linux-x64-baseline";
aarch64-linux = "linux-arm64";
x86_64-darwin = "darwin-x64";
aarch64-darwin = "darwin-arm64";
};
postPatch = ''
cp ${./package-lock.json} package-lock.json
in
stdenvNoCC.mkDerivation (finalAttrs: {
pname = "amp-cli";
version = "0.0.1779094967-g3f6594";
# Create a minimal package.json with just the dependency we need (without devDependencies)
cat > package.json <<EOF
{
"name": "amp-cli",
"version": "0.0.0",
"license": "UNLICENSED",
"dependencies": {
"@sourcegraph/amp": "${finalAttrs.version}"
},
"bin": {
"amp": "./bin/amp-wrapper.js"
}
}
EOF
# Create wrapper bin directory
mkdir -p bin
# Create a wrapper script that will be installed by npm
cat > bin/amp-wrapper.js << EOF
#!/usr/bin/env node
import('@sourcegraph/amp/dist/main.js')
EOF
chmod +x bin/amp-wrapper.js
'';
npmDepsHash = "sha256-Ce7TaJuSrha+NcFmppMm/byAFosBR2I/zMY4KA5JXuE=";
propagatedBuildInputs = [
ripgrep
];
src = finalAttrs.passthru.sources.${stdenvNoCC.hostPlatform.system};
nativeBuildInputs = [
gzip
makeWrapper
];
]
++ lib.optionals stdenvNoCC.hostPlatform.isLinux [ autoPatchelfHook ];
strictDeps = true;
npmFlags = [
"--no-audit"
"--no-fund"
"--ignore-scripts"
];
dontUnpack = true;
dontStrip = true;
dontFixup = !stdenvNoCC.hostPlatform.isLinux;
# Disable build and prune steps
dontNpmBuild = true;
installPhase = ''
runHook preInstall
postInstall = ''
wrapProgram $out/bin/amp \
--prefix PATH : ${lib.makeBinPath [ ripgrep ]} \
--set AMP_SKIP_UPDATE_CHECK 1
mkdir -p $out/bin $out/libexec/amp-cli
gunzip -c $src > $out/libexec/amp-cli/amp
chmod +x $out/libexec/amp-cli/amp
makeWrapper $out/libexec/amp-cli/amp $out/bin/amp \
--set AMP_SKIP_UPDATE_CHECK 1 \
--prefix PATH : ${lib.makeBinPath [ ripgrep ]}
runHook postInstall
'';
passthru.updateScript = ./update.sh;
passthru.tests.version = testers.testVersion {
package = finalAttrs.finalPackage;
command = "HOME=$(mktemp -d) amp --version";
postPhases = lib.optionals stdenvNoCC.hostPlatform.isDarwin [ "postPatchelf" ];
postPatchelf = lib.optionalString stdenvNoCC.hostPlatform.isDarwin ''
'${lib.getExe' cctools "${cctools.targetPrefix}install_name_tool"}' $out/libexec/amp-cli/amp \
-change /usr/lib/libicucore.A.dylib '${lib.getLib darwin.ICU}/lib/libicucore.A.dylib'
'${lib.getExe rcodesign}' sign --code-signature-flags linker-signed $out/libexec/amp-cli/amp
'';
doInstallCheck = stdenvNoCC.buildPlatform.canExecute stdenvNoCC.hostPlatform;
nativeInstallCheckInputs = [
writableTmpDirAsHomeHook
versionCheckHook
];
versionCheckProgram = "${placeholder "out"}/bin/amp";
versionCheckProgramArg = "--version";
versionCheckKeepEnvironment = [ "HOME" ];
passthru = {
sources = lib.mapAttrs (
system': platform:
fetchurl {
url = "https://static.ampcode.com/cli/${finalAttrs.version}/amp-${platform}.gz";
hash =
{
x86_64-linux = "sha256-ZBqt8UWDY0SlYOOrJZib+UXdZ1cQxyRNp3T7fr+gcNs=";
aarch64-linux = "sha256-qztHMb4EJBOuEQh0OZ33dqx/MUy5LEPgLry6h+rmwVo=";
x86_64-darwin = "sha256-meedgFtc+DA4NoR0XJuLSX/gmiMKCZLACfPBbk6wfLk=";
aarch64-darwin = "sha256-0v3yM9zQ6ToWBHyPvrmPTP0lfPb1tCoAd6eNgHs3ZkM=";
}
.${system'};
}
) platforms;
updateScript = ./update.sh;
};
meta = {
description = "CLI for Amp, an agentic coding agent in research preview from Sourcegraph";
homepage = "https://ampcode.com/";
downloadPage = "https://www.npmjs.com/package/@sourcegraph/amp";
downloadPage = "https://ampcode.com/install";
license = lib.licenses.unfree;
maintainers = with lib.maintainers; [
keegancsmith
burmudar
];
mainProgram = "amp";
platforms = builtins.attrNames platforms;
sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ];
};
})

View file

@ -1,15 +1,20 @@
#!/usr/bin/env nix-shell
#!nix-shell -i bash -p nodejs nix-update
#!nix-shell -i bash -p curl common-updater-scripts
set -euo pipefail
version=$(npm view @sourcegraph/amp version)
version=$(curl -fsSL https://static.ampcode.com/cli/cli-version.txt)
# Generate updated lock file
cd "$(dirname "${BASH_SOURCE[0]}")"
npm i --package-lock-only @sourcegraph/amp@"$version"
rm -f package.json # package.json is not used by buildNpmPackage
cd "$(dirname "${BASH_SOURCE[0]}")/../../../.."
# Update version and hashes
cd -
nix-update amp-cli --version "$version"
for system in \
x86_64-linux \
aarch64-linux \
x86_64-darwin \
aarch64-darwin
do
update-source-version amp-cli "$version" \
--source-key="sources.$system" \
--ignore-same-version \
--ignore-same-hash
done

View file

@ -27,11 +27,11 @@ let
rec {
x86_64-linux = {
urlSuffix = "linux-x86_64.tar.gz";
hash = "sha256-6akFImNU5EQLW6f2dQRUXUC8srM32xyVI14pjVxV6Sw=";
hash = "sha256-A8JUYzEMQH1sEKYrKZ84QZAgYbz0OvpHa3t9RIUVE9c=";
};
x86_64-darwin = {
urlSuffix = "macos-universal.zip";
hash = "sha256-sJ4mXSYsJICXMpDZemqRF3uYgB9SWNdbzcT1s2gHpZA=";
hash = "sha256-LSNvFL1ud/FkzNSGk17ZqN2debnqsjlVDHd4NBjTds0=";
};
aarch64-darwin = x86_64-darwin;
}
@ -40,7 +40,7 @@ let
in
stdenvNoCC.mkDerivation (finalAttrs: {
pname = "appflowy";
version = "0.11.8";
version = "0.11.9";
src = fetchzip {
url = "https://github.com/AppFlowy-IO/appflowy/releases/download/${finalAttrs.version}/AppFlowy-${finalAttrs.version}-${dist.urlSuffix}";

View file

@ -9,16 +9,16 @@
}:
rustPlatform.buildRustPackage (finalAttrs: {
pname = "argon";
version = "2.0.28";
version = "2.0.29";
src = fetchFromGitHub {
owner = "argon-rbx";
repo = "argon";
tag = finalAttrs.version;
hash = "sha256-QXGiDcn5BM1psCZf88gEyKqoK9EDFquLgyzJeZOhwMU=";
hash = "sha256-i2YWAXgrcS759+iNtSzjIHU1FmY22Xx6sy2q9ErGsnw=";
};
cargoHash = "sha256-okfQn/dgBN6s1aO1cnU/bY7BIqwM9iq1iPZ321ez4C4=";
cargoHash = "sha256-wj+T1XBLVQsDNMT9d/0ybR+L7fDZj4Ijhqv0fH+f7HA=";
nativeBuildInputs = [ pkg-config ];

View file

@ -8,13 +8,13 @@
buildGoModule (finalAttrs: {
pname = "asccli";
version = "1.4.0";
version = "1.5.0";
src = fetchFromGitHub {
owner = "rorkai";
repo = "App-Store-Connect-CLI";
tag = "${finalAttrs.version}";
hash = "sha256-VMLLziuLV7F95mTdEmaUxwMC9vKSTejJZgw3KFHr7sg=";
hash = "sha256-junTdPz0gtfmDPycuitYo06a0D25yi3E2uVPaaQtWBQ=";
};
vendorHash = "sha256-XBEDMUGwSh8P+dVKMebN3zD83e1odAN+Wy15yys0+2M=";

View file

@ -1,5 +1,6 @@
{
lib,
stdenv,
rustPlatform,
fetchFromGitHub,
versionCheckHook,
@ -7,24 +8,28 @@
rustPlatform.buildRustPackage (finalAttrs: {
pname = "agg";
version = "1.7.0";
version = "1.8.1";
src = fetchFromGitHub {
owner = "asciinema";
repo = "agg";
tag = "v${finalAttrs.version}";
hash = "sha256-6UenPE6mmmvliaIuGdQj/FrlmoJvmBJgfo0hW+uRaxM=";
hash = "sha256-64VyCTGjzey6AHEAfk5V/Qoffe5+sDaDNve54M7tmf4=";
};
strictDeps = true;
cargoHash = "sha256-VpbjvrMhzS1zrcMNWBjTLda6o3ea2cwpnEDUouwyp8w=";
cargoHash = "sha256-/WS5nAFKnP/CsU5+Pf5rtNN4LWaXVjlidLzH7DWYds0=";
__impureHostDeps = lib.optionals stdenv.hostPlatform.isDarwin [
"/System/Library/Fonts"
];
doInstallCheck = true;
nativeInstallCheckInputs = [ versionCheckHook ];
meta = {
description = "Command-line tool for generating animated GIF files from asciicast v2 files produced by asciinema terminal recorder";
description = "Command-line tool for generating animated GIF files from asciicast files produced by asciinema terminal recorder";
homepage = "https://github.com/asciinema/agg";
changelog = "https://github.com/asciinema/agg/releases/tag/${finalAttrs.src.tag}";
license = lib.licenses.asl20;

View file

@ -33,7 +33,7 @@
}:
stdenv.mkDerivation (finalAttrs: {
version = "3.10";
version = "3.11";
pname = "asymptote";
outputs = [
@ -46,7 +46,7 @@ stdenv.mkDerivation (finalAttrs: {
src = fetchurl {
url = "mirror://sourceforge/asymptote/${finalAttrs.version}/asymptote-${finalAttrs.version}.src.tgz";
hash = "sha256-0nvo/vJQ1dwzhgK/cj4dCejNHoXBmatMgHQwif2M0sc=";
hash = "sha256-U36fImIb+E8J7g1E3EVcTqkboZODDx12JKB9RxDX59E=";
};
# override with TeX Live containers to avoid building sty, docs from source

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