···29293030- We don't want workflows of different Pull Requests to cancel each other, so we include `github.event.pull_request.number`. The [GitHub docs](https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/control-the-concurrency-of-workflows-and-jobs#example-using-a-fallback-value) show using `github.head_ref` for this purpose, but this doesn't work well with forks: Different users could have the same head branch name in their forks and run CI for their PRs at the same time.
31313232-- Sometimes, there is no `pull_request.number`. That's the case for `push` or `workflow_run` events. To ensure non-PR runs are never cancelled, we add a fallback of `github.run_id`. This is a unique value for each workflow run.
3232+- Sometimes, there is no `pull_request.number`. To ensure non-PR runs are never cancelled, we add a fallback of `github.run_id`. This is a unique value for each workflow run.
33333434- Of course, we run multiple workflows at the same time, so we add `github.workflow` to the key. Otherwise workflows would cancel each other.
3535
···11name: Eval
2233on:
44- pull_request:
55- paths:
66- - .github/workflows/eval.yml
77- - .github/workflows/reviewers.yml # needs eval results from the same event type
88- pull_request_target:
99- push:
1010- # Keep this synced with ci/request-reviews/dev-branches.txt
1111- branches:
1212- - master
1313- - staging
1414- - release-*
1515- - staging-*
1616- - haskell-updates
1717- - python-updates
1818-1919-concurrency:
2020- group: eval-${{ github.workflow }}-${{ github.event_name }}-${{ github.event.pull_request.number || github.run_id }}
2121- cancel-in-progress: true
44+ workflow_call:
55+ secrets:
66+ OWNER_APP_PRIVATE_KEY:
77+ required: false
228239permissions: {}
2410···28142915jobs:
3016 prepare:
3131- name: Prepare
3217 runs-on: ubuntu-24.04-arm
3318 outputs:
3419 mergedSha: ${{ steps.get-merge-commit.outputs.mergedSha }}
···4934 run: |
5035 echo "systems=$(jq -c <ci/supportedSystems.json)" >> "$GITHUB_OUTPUT"
51365252- outpaths:
5353- name: Outpaths
3737+ eval:
5438 runs-on: ubuntu-24.04-arm
5539 needs: [prepare]
5640 strategy:
5741 fail-fast: false
5842 matrix:
5943 system: ${{ fromJSON(needs.prepare.outputs.systems) }}
4444+ name: ${{ matrix.system }}
6045 steps:
6146 - name: Enable swap
6247 run: |
···10994 run_id = (await github.rest.actions.listWorkflowRuns({
11095 owner: context.repo.owner,
11196 repo: context.repo.repo,
112112- workflow_id: 'eval.yml',
9797+ workflow_id: 'push.yml',
11398 event: 'push',
11499 head_sha: targetSha
115100 })).data.workflow_runs[0].id
116101 } catch {
117117- throw new Error(`Could not find an eval.yml workflow run for ${targetSha}.`)
102102+ throw new Error(`Could not find an push.yml workflow run for ${targetSha}.`)
118103 }
119104120105 core.setOutput('targetRunId', run_id)
···161146 path: diff/*
162147163148 compare:
164164- name: Comparison
165149 runs-on: ubuntu-24.04-arm
166166- needs: [prepare, outpaths]
150150+ needs: [prepare, eval]
167151 if: needs.prepare.outputs.targetSha
168152 permissions:
169153 issues: write # needed to create *new* labels
···262246 # No dependency on "compare", so that it can start at the same time.
263247 # We only wait for the "comparison" artifact to be available, which makes the start-to-finish time
264248 # for the eval workflow considerably faster.
265265- needs: [prepare, outpaths]
249249+ needs: [prepare, eval]
266250 if: needs.prepare.outputs.targetSha
267251 uses: ./.github/workflows/reviewers.yml
268268- secrets: inherit
252252+ secrets:
253253+ OWNER_APP_PRIVATE_KEY: ${{ secrets.OWNER_APP_PRIVATE_KEY }}
254254+255255+ misc:
256256+ if: ${{ github.event_name != 'push' }}
257257+ runs-on: ubuntu-24.04-arm
258258+ steps:
259259+ - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
260260+ with:
261261+ sparse-checkout: .github/actions
262262+ - name: Check if the PR can be merged and checkout the merge commit
263263+ uses: ./.github/actions/get-merge-commit
264264+ with:
265265+ merged-as-untrusted: true
266266+267267+ - name: Install Nix
268268+ uses: cachix/install-nix-action@17fe5fb4a23ad6cbbe47d6b3f359611ad276644c # v31
269269+ with:
270270+ extra_nix_config: sandbox = true
271271+272272+ - name: Ensure flake outputs on all systems still evaluate
273273+ run: nix flake check --all-systems --no-build ./untrusted
274274+275275+ - name: Query nixpkgs with aliases enabled to check for basic syntax errors
276276+ run: |
277277+ time nix-env -I ./untrusted -f ./untrusted -qa '*' --option restrict-eval true --option allow-import-from-derivation false >/dev/null
+3-4
.github/workflows/labels.yml
···33# access to the GitHub API. This means that it should not evaluate user input in
44# a way that allows code injection.
5566-name: "Label PR"
66+name: Labels
7788on:
99 schedule:
···3333 shell: bash
34343535jobs:
3636- labels:
3737- name: label-pr
3636+ update:
3837 runs-on: ubuntu-24.04-arm
3938 if: github.event_name != 'schedule' || github.repository_owner == 'NixOS'
4039 steps:
···147146148147 const run_id = (await github.rest.actions.listWorkflowRuns({
149148 ...context.repo,
150150- workflow_id: 'eval.yml',
149149+ workflow_id: 'pr.yml',
151150 event: 'pull_request_target',
152151 // For PR events, the workflow run is still in progress with this job itself.
153152 status: prEventCondition ? 'in_progress' : 'success',
···11+commit c9282b73f3d09daff23a2603addd94605596ebe7
22+Author: Robert Schiele <rschiele@gmail.com>
33+Date: Thu May 8 19:16:46 2025 +0200
44+55+ remove forcing GDK_BACKEND to x11
66+77+ It seems the problems on Wayland from the past are removed meanwhile.
88+99+diff --git a/src/CLI/GuiParams.cpp b/src/CLI/GuiParams.cpp
1010+index f44b91651f..41b42ff368 100644
1111+--- a/src/CLI/GuiParams.cpp
1212++++ b/src/CLI/GuiParams.cpp
1313+@@ -107,9 +107,8 @@ int start_gui_with_params(GUI::GUI_InitParams& params)
1414+ #if !defined(_WIN32) && !defined(__APPLE__)
1515+ // likely some linux / unix system
1616+ const char* display = boost::nowide::getenv("DISPLAY");
1717+- // const char *wayland_display = boost::nowide::getenv("WAYLAND_DISPLAY");
1818+- //if (! ((display && *display) || (wayland_display && *wayland_display))) {
1919+- if (!(display && *display)) {
2020++ const char *wayland_display = boost::nowide::getenv("WAYLAND_DISPLAY");
2121++ if (! ((display && *display) || (wayland_display && *wayland_display))) {
2222+ // DISPLAY not set.
2323+ boost::nowide::cerr << "DISPLAY not set, GUI mode not available." << std::endl << std::endl;
2424+ print_help(false);
2525+@@ -141,4 +140,4 @@ int start_as_gcode_viewer(GUI::GUI_InitParams& gui_params)
2626+ }
2727+ #else // SLIC3R_GUI
2828+ // If there is no GUI, we shall ignore the parameters. Remove them from the list.
2929+-#endif // SLIC3R_GUI
3030+\ No newline at end of file
3131++#endif // SLIC3R_GUI
3232+diff --git a/src/CLI/Setup.cpp b/src/CLI/Setup.cpp
3333+index 82e03d466d..95acdf3477 100644
3434+--- a/src/CLI/Setup.cpp
3535++++ b/src/CLI/Setup.cpp
3636+@@ -212,11 +212,6 @@ static bool setup_common()
3737+ save_main_thread_id();
3838+3939+ #ifdef __WXGTK__
4040+- // On Linux, wxGTK has no support for Wayland, and the app crashes on
4141+- // startup if gtk3 is used. This env var has to be set explicitly to
4242+- // instruct the window manager to fall back to X server mode.
4343+- ::setenv("GDK_BACKEND", "x11", /* replace */ true);
4444+-
4545+ // https://github.com/prusa3d/PrusaSlicer/issues/12969
4646+ ::setenv("WEBKIT_DISABLE_COMPOSITING_MODE", "1", /* replace */ false);
4747+ ::setenv("WEBKIT_DISABLE_DMABUF_RENDERER", "1", /* replace */ false);
4848+@@ -338,4 +333,4 @@ bool setup(Data& cli, int argc, char** argv)
4949+ return true;
5050+ }
5151+5252+-}
5353+\ No newline at end of file
5454++}
+7
pkgs/applications/misc/prusa-slicer/default.nix
···7070 rev = "version_${finalAttrs.version}";
7171 };
72727373+ # only applies to prusa slicer because super-slicer overrides *all* patches
7474+ patches = [
7575+ # https://github.com/NixOS/nixpkgs/issues/415703
7676+ # https://gitlab.archlinux.org/archlinux/packaging/packages/prusa-slicer/-/merge_requests/5
7777+ ./allow_wayland.patch
7878+ ];
7979+7380 # (not applicable to super-slicer fork)
7481 postPatch = lib.optionalString (finalAttrs.pname == "prusa-slicer") (
7582 # Patch required for GCC 14, but breaks on clang
···3232 url = "https://github.com/pyodide/pyodide/releases/download/${pyodideVersion}/pyodide-${pyodideVersion}.tar.bz2";
3333 };
34343535- npmDepsHash = "sha256-bt0Q6/ajrMA2yfdWyF+/NeImomRMspLiX3wu+EJ8mTU=";
3535+ npmDepsHash = "sha256-rUFCFYbthr0IJ5oIMgb3tr5kTqmZN40EPn05xR3LL+A=";
36363737 # Disabling `pyodide:fetch` as it downloads packages during `buildPhase`
3838 # Until this is solved, running python packages from the browser will not work.
···77 kcoreaddons,
88 kwidgetsaddons,
99 wrapQtAppsHook,
1010+ kdbusaddons,
1111+ kde-cli-tools,
1212+ plasma-workspace,
1313+ qtstyleplugin-kvantum,
1014}:
1111-stdenv.mkDerivation rec {
1515+stdenv.mkDerivation (finalAttrs: {
1216 pname = "koi";
1313- version = "0.4";
1717+ version = "0.5.1";
14181519 src = fetchFromGitHub {
1620 owner = "baduhai";
1721 repo = "Koi";
1818- rev = version;
1919- sha256 = "sha256-ip7e/Sz/l5UiTFUTLJPorPO7NltE2Isij2MCmvHZV40=";
2222+ tag = finalAttrs.version;
2323+ hash = "sha256-fXLGlq41Qwdp0cYJcNqPlYnlpVXsZk0imYxP7Bgdcvw=";
2024 };
21252222- # See https://github.com/baduhai/Koi/blob/master/development/Nix%20OS/dev.nix
2323- sourceRoot = "${src.name}/src";
2626+ patches = [
2727+ # koi tries to access KDE utility binaries at their absolute paths or by using `whereis`.
2828+ # We patch the absolute paths below in `postPatch` and replace the `whereis` invocations
2929+ # here with a placeholder that is also substituted in `postPatch`.
3030+ ./0001-locate-plasma-tools.patch
3131+ ];
3232+3333+ postPatch = ''
3434+ substituteInPlace src/utils.cpp \
3535+ --replace-fail /usr/bin/kquitapp6 ${lib.getExe' kdbusaddons "kquitapp6"} \
3636+ --replace-fail /usr/bin/kstart ${lib.getExe' kde-cli-tools "kstart"}
3737+ substituteInPlace src/plugins/plasmastyle.cpp \
3838+ --replace-fail /usr/bin/plasma-apply-desktoptheme ${lib.getExe' plasma-workspace "plasma-apply-desktoptheme"}
3939+ substituteInPlace src/plugins/colorscheme.cpp \
4040+ --replace-fail '@plasma-apply-colorscheme@' ${lib.getExe' plasma-workspace "plasma-apply-colorscheme"}
4141+ substituteInPlace src/plugins/icons.cpp \
4242+ --replace-fail '@plasma-changeicons@' ${plasma-workspace}/libexec/plasma-changeicons
4343+ substituteInPlace src/plugins/kvantumstyle.cpp \
4444+ --replace-fail /usr/bin/kvantummanager ${lib.getExe' qtstyleplugin-kvantum "kvantummanager"}
4545+ '';
4646+2447 nativeBuildInputs = [
2548 cmake
2649 wrapQtAppsHook
···3154 kwidgetsaddons
3255 ];
33563434- meta = with lib; {
5757+ meta = {
3558 description = "Scheduling LIGHT/DARK Theme Converter for the KDE Plasma Desktop";
3659 longDescription = ''
3760 Koi is a program designed to provide the KDE Plasma Desktop functionality to automatically switch between light and dark themes. Koi is under semi-active development, and while it is stable enough to use daily, expect bugs. Koi is designed to be used with Plasma, and while some features may function under different desktop environments, they are unlikely to work and untested.
···4770 - Hide application to system tray
4871 - Toggle between LIGHT/DARK themes by clicking mouse wheel
4972 '';
5050- license = licenses.lgpl3;
5151- platforms = platforms.linux;
7373+ license = lib.licenses.lgpl3;
7474+ platforms = lib.platforms.linux;
7575+ changelog = "https://github.com/baduhai/Koi/releases/tag/${finalAttrs.version}";
5276 homepage = "https://github.com/baduhai/Koi";
5377 maintainers = with lib.maintainers; [ fnune ];
5478 };
5555-}
7979+})
+1-1
pkgs/misc/tmux-plugins/default.nix
···1616 rtp = "${derivation}/${path}/${rtpFilePath}";
1717 }
1818 // {
1919- overrideAttrs = f: mkTmuxPlugin (attrs // f attrs);
1919+ overrideAttrs = f: mkTmuxPlugin (attrs // (if lib.isFunction f then f attrs else f));
2020 };
21212222 mkTmuxPlugin =
-285
pkgs/servers/web-apps/bookstack/composer-env.nix
···11-# This file originates from composer2nix
22-33-{
44- stdenv,
55- lib,
66- writeTextFile,
77- fetchurl,
88- php,
99- unzip,
1010- phpPackages,
1111-}:
1212-1313-let
1414- inherit (phpPackages) composer;
1515-1616- filterSrc =
1717- src:
1818- builtins.filterSource (
1919- path: type:
2020- type != "directory"
2121- || (baseNameOf path != ".git" && baseNameOf path != ".git" && baseNameOf path != ".svn")
2222- ) src;
2323-2424- buildZipPackage =
2525- { name, src }:
2626- stdenv.mkDerivation {
2727- inherit name src;
2828- nativeBuildInputs = [ unzip ];
2929- buildCommand = ''
3030- shopt -s dotglob
3131- unzip $src
3232- baseDir=$(find . -type d -mindepth 1 -maxdepth 1)
3333- cd $baseDir
3434- mkdir -p $out
3535- mv * $out
3636- '';
3737- };
3838-3939- buildPackage =
4040- {
4141- name,
4242- src,
4343- packages ? { },
4444- devPackages ? { },
4545- buildInputs ? [ ],
4646- symlinkDependencies ? false,
4747- executable ? false,
4848- removeComposerArtifacts ? false,
4949- postInstall ? "",
5050- noDev ? false,
5151- composerExtraArgs ? "",
5252- unpackPhase ? "true",
5353- buildPhase ? "true",
5454- ...
5555- }@args:
5656-5757- let
5858- reconstructInstalled = writeTextFile {
5959- name = "reconstructinstalled.php";
6060- executable = true;
6161- text = ''
6262- #! ${php}/bin/php
6363- <?php
6464- if(file_exists($argv[1]))
6565- {
6666- $composerLockStr = file_get_contents($argv[1]);
6767-6868- if($composerLockStr === false)
6969- {
7070- fwrite(STDERR, "Cannot open composer.lock contents\n");
7171- exit(1);
7272- }
7373- else
7474- {
7575- $config = json_decode($composerLockStr, true);
7676-7777- if(array_key_exists("packages", $config))
7878- $allPackages = $config["packages"];
7979- else
8080- $allPackages = array();
8181-8282- ${lib.optionalString (!noDev) ''
8383- if(array_key_exists("packages-dev", $config))
8484- $allPackages = array_merge($allPackages, $config["packages-dev"]);
8585- ''}
8686-8787- $packagesStr = json_encode($allPackages, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
8888- print($packagesStr);
8989- }
9090- }
9191- else
9292- print("[]");
9393- ?>
9494- '';
9595- };
9696-9797- constructBin = writeTextFile {
9898- name = "constructbin.php";
9999- executable = true;
100100- text = ''
101101- #! ${php}/bin/php
102102- <?php
103103- $composerJSONStr = file_get_contents($argv[1]);
104104-105105- if($composerJSONStr === false)
106106- {
107107- fwrite(STDERR, "Cannot open composer.json contents\n");
108108- exit(1);
109109- }
110110- else
111111- {
112112- $config = json_decode($composerJSONStr, true);
113113-114114- if(array_key_exists("bin-dir", $config))
115115- $binDir = $config["bin-dir"];
116116- else
117117- $binDir = "bin";
118118-119119- if(array_key_exists("bin", $config))
120120- {
121121- if(!file_exists("vendor/".$binDir))
122122- mkdir("vendor/".$binDir);
123123-124124- foreach($config["bin"] as $bin)
125125- symlink("../../".$bin, "vendor/".$binDir."/".basename($bin));
126126- }
127127- }
128128- ?>
129129- '';
130130- };
131131-132132- bundleDependencies =
133133- dependencies:
134134- lib.concatMapStrings (
135135- dependencyName:
136136- let
137137- dependency = dependencies.${dependencyName};
138138- in
139139- ''
140140- ${
141141- if dependency.targetDir == "" then
142142- ''
143143- vendorDir="$(dirname ${dependencyName})"
144144- mkdir -p "$vendorDir"
145145- ${
146146- if symlinkDependencies then
147147- ''ln -s "${dependency.src}" "$vendorDir/$(basename "${dependencyName}")"''
148148- else
149149- ''cp -av "${dependency.src}" "$vendorDir/$(basename "${dependencyName}")"''
150150- }
151151- ''
152152- else
153153- ''
154154- namespaceDir="${dependencyName}/$(dirname "${dependency.targetDir}")"
155155- mkdir -p "$namespaceDir"
156156- ${
157157- if symlinkDependencies then
158158- ''ln -s "${dependency.src}" "$namespaceDir/$(basename "${dependency.targetDir}")"''
159159- else
160160- ''cp -av "${dependency.src}" "$namespaceDir/$(basename "${dependency.targetDir}")"''
161161- }
162162- ''
163163- }
164164- ''
165165- ) (builtins.attrNames dependencies);
166166-167167- extraArgs = removeAttrs args [
168168- "packages"
169169- "devPackages"
170170- "buildInputs"
171171- ];
172172- in
173173- stdenv.mkDerivation (
174174- {
175175- buildInputs = [
176176- php
177177- composer
178178- ] ++ buildInputs;
179179-180180- inherit unpackPhase buildPhase;
181181-182182- installPhase = ''
183183- ${
184184- if executable then
185185- ''
186186- mkdir -p $out/share/php
187187- cp -av $src $out/share/php/$name
188188- chmod -R u+w $out/share/php/$name
189189- cd $out/share/php/$name
190190- ''
191191- else
192192- ''
193193- cp -av $src $out
194194- chmod -R u+w $out
195195- cd $out
196196- ''
197197- }
198198-199199- # Remove unwanted files
200200- rm -f *.nix
201201-202202- export HOME=$TMPDIR
203203-204204- # Remove the provided vendor folder if it exists
205205- rm -Rf vendor
206206-207207- # If there is no composer.lock file, compose a dummy file.
208208- # Otherwise, composer attempts to download the package.json file from
209209- # the registry which we do not want.
210210- if [ ! -f composer.lock ]
211211- then
212212- cat > composer.lock <<EOF
213213- {
214214- "packages": []
215215- }
216216- EOF
217217- fi
218218-219219- # Reconstruct the installed.json file from the lock file
220220- mkdir -p vendor/composer
221221- ${php}/bin/php ${reconstructInstalled} composer.lock > vendor/composer/installed.json
222222-223223- # Copy or symlink the provided dependencies
224224- cd vendor
225225- ${bundleDependencies packages}
226226- ${lib.optionalString (!noDev) (bundleDependencies devPackages)}
227227- cd ..
228228-229229- # Reconstruct autoload scripts
230230- # We use the optimize feature because Nix packages cannot change after they have been built
231231- # Using the dynamic loader for a Nix package is useless since there is nothing to dynamically reload.
232232- composer dump-autoload --optimize ${lib.optionalString noDev "--no-dev"} ${composerExtraArgs}
233233-234234- # Run the install step as a validation to confirm that everything works out as expected
235235- composer install --optimize-autoloader ${lib.optionalString noDev "--no-dev"} ${composerExtraArgs}
236236-237237- ${lib.optionalString executable ''
238238- # Reconstruct the bin/ folder if we deploy an executable project
239239- ${php}/bin/php ${constructBin} composer.json
240240- ln -s $(pwd)/vendor/bin $out/bin
241241- ''}
242242-243243- ${lib.optionalString (!symlinkDependencies) ''
244244- # Patch the shebangs if possible
245245- if [ -d $(pwd)/vendor/bin ]
246246- then
247247- # Look for all executables in bin/
248248- for i in $(pwd)/vendor/bin/*
249249- do
250250- # Look for their location
251251- realFile=$(readlink -f "$i")
252252-253253- # Restore write permissions
254254- chmod u+wx "$(dirname "$realFile")"
255255- chmod u+w "$realFile"
256256-257257- # Patch shebang
258258- sed -e "s|#!/usr/bin/php|#!${php}/bin/php|" \
259259- -e "s|#!/usr/bin/env php|#!${php}/bin/php|" \
260260- "$realFile" > tmp
261261- mv tmp "$realFile"
262262- chmod u+x "$realFile"
263263- done
264264- fi
265265- ''}
266266-267267- if [ "$removeComposerArtifacts" = "1" ]
268268- then
269269- # Remove composer stuff
270270- rm -f composer.json composer.lock
271271- fi
272272-273273- # Execute post install hook
274274- runHook postInstall
275275- '';
276276- }
277277- // extraArgs
278278- );
279279-in
280280-{
281281- inherit filterSrc;
282282- composer = lib.makeOverridable composer;
283283- buildZipPackage = lib.makeOverridable buildZipPackage;
284284- buildPackage = lib.makeOverridable buildPackage;
285285-}