Add nix patch to implement builtins.catchAll
This commit is contained in:
		
							parent
							
								
									019826d09e
								
							
						
					
					
						commit
						59d7374f78
					
				| @ -36,6 +36,7 @@ let | ||||
|     mpich = callPackage ./pkgs/mpich/default.nix { mpich = prev.mpich; }; | ||||
|     nanos6 = callPackage ./pkgs/nanos6/default.nix { }; | ||||
|     nanos6Debug = final.nanos6.override { enableDebug = true; }; | ||||
|     nix = callPackage ./pkgs/nix/default.nix { nix = prev.nix; }; | ||||
|     nixtools = callPackage ./pkgs/nixtools/default.nix { }; | ||||
|     # Broken because of pkgsStatic.libcap | ||||
|     # See: https://github.com/NixOS/nixpkgs/pull/268791 | ||||
|  | ||||
							
								
								
									
										64
									
								
								pkgs/nix/add-catchAll.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								pkgs/nix/add-catchAll.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,64 @@ | ||||
| From 3aa73c21e3afc91522a6121b0d591af6925b4ba6 Mon Sep 17 00:00:00 2001 | ||||
| From: Rodrigo Arias Mallo <rodarima@gmail.com> | ||||
| Date: Mon, 13 Oct 2025 16:05:30 +0200 | ||||
| Subject: [PATCH] Add builtins.catchAll to catch all types of errors | ||||
| 
 | ||||
| Allows fetching multiple Git repositories with builtin.fetchGit and | ||||
| catching any errors thrown by the builtin, in opposition to the builtin | ||||
| tryEval. | ||||
| ---
 | ||||
|  src/libexpr/primops.cc | 38 ++++++++++++++++++++++++++++++++++++++ | ||||
|  1 file changed, 38 insertions(+) | ||||
| 
 | ||||
| diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc
 | ||||
| index 36a67a39d..3b26f9f43 100644
 | ||||
| --- a/src/libexpr/primops.cc
 | ||||
| +++ b/src/libexpr/primops.cc
 | ||||
| @@ -849,6 +849,44 @@ static RegisterPrimOp primop_tryEval({
 | ||||
|      .fun = prim_tryEval, | ||||
|  }); | ||||
|   | ||||
| +/* Like tryEval but catch all errors. Success => {success=true; value=something;},
 | ||||
| + * else => {success=false; value=false;} */
 | ||||
| +static void prim_catchAll(EvalState & state, const PosIdx pos, Value * * args, Value & v)
 | ||||
| +{
 | ||||
| +    auto attrs = state.buildBindings(3);
 | ||||
| +    try {
 | ||||
| +        state.forceValue(*args[0], pos);
 | ||||
| +        attrs.insert(state.sValue, args[0]);
 | ||||
| +        attrs.alloc("success").mkBool(true);
 | ||||
| +        attrs.alloc("msg").mkNull();
 | ||||
| +    } catch (Error & e) {
 | ||||
| +        attrs.alloc(state.sValue).mkBool(false);
 | ||||
| +        attrs.alloc("success").mkBool(false);
 | ||||
| +        attrs.alloc("msg").mkString(e.msg());
 | ||||
| +    }
 | ||||
| +    v.mkAttrs(attrs);
 | ||||
| +}
 | ||||
| +
 | ||||
| +static RegisterPrimOp primop_catchAll({
 | ||||
| +    .name = "__catchAll",
 | ||||
| +    .args = {"e"},
 | ||||
| +    .doc = R"(
 | ||||
| +      Try to shallowly evaluate *e*. Return a set containing the
 | ||||
| +      attributes `success` (`true` if *e* evaluated successfully,
 | ||||
| +      `false` if an error was thrown) and `value`, equalling *e* if
 | ||||
| +      successful and `false` otherwise. In contrast with `tryEval`,
 | ||||
| +      `catchAll` will prevent all errors from being thrown, including
 | ||||
| +      for those created by `abort` and type errors generated by
 | ||||
| +      builtins. Also note that this doesn't evaluate *e* deeply, so
 | ||||
| +      `let e = { x = throw ""; }; in (builtins.catchAll e).success`
 | ||||
| +      will be `true`. Using `builtins.deepSeq` one can get the expected
 | ||||
| +      result: `let e = { x = throw ""; }; in
 | ||||
| +      (builtins.catchAll (builtins.deepSeq e e)).success` will be
 | ||||
| +      `false`.
 | ||||
| +    )",
 | ||||
| +    .fun = prim_catchAll,
 | ||||
| +});
 | ||||
| +
 | ||||
|  /* Return an environment variable.  Use with care. */ | ||||
|  static void prim_getEnv(EvalState & state, const PosIdx pos, Value * * args, Value & v) | ||||
|  { | ||||
| -- 
 | ||||
| 2.51.0 | ||||
| 
 | ||||
| @ -1,219 +1,7 @@ | ||||
| { lib, fetchurl, fetchFromGitHub, callPackage | ||||
| , storeDir ? "/nix/store" | ||||
| , stateDir ? "/nix/var" | ||||
| , confDir ? "/etc" | ||||
| , boehmgc | ||||
| , stdenv, llvmPackages_6 | ||||
| }: | ||||
| { nix }: | ||||
| 
 | ||||
| let | ||||
| 
 | ||||
| common = | ||||
|   { lib, stdenv, fetchpatch, perl, curl, bzip2, sqlite, openssl ? null, xz | ||||
|   , bash, coreutils, gzip, gnutar | ||||
|   , pkg-config, boehmgc, perlPackages, libsodium, brotli, boost, editline, nlohmann_json | ||||
|   , autoreconfHook, autoconf-archive, bison, flex, libxml2, libxslt, docbook5, docbook_xsl_ns | ||||
|   , jq, libarchive, rustc, cargo | ||||
|   # Used by tests | ||||
|   , gmock | ||||
|   , busybox-sandbox-shell | ||||
|   , storeDir | ||||
|   , stateDir | ||||
|   , confDir | ||||
|   , withLibseccomp ? lib.any (lib.meta.platformMatch stdenv.hostPlatform) libseccomp.meta.platforms, libseccomp | ||||
|   , withAWS ? stdenv.isLinux || stdenv.isDarwin, aws-sdk-cpp | ||||
| 
 | ||||
|   , name, suffix ? "", src, crates ? null | ||||
| 
 | ||||
|   }: | ||||
|   let | ||||
|      sh = busybox-sandbox-shell; | ||||
|      nix = stdenv.mkDerivation rec { | ||||
|       inherit name src; | ||||
|       version = lib.getVersion name; | ||||
| 
 | ||||
|       is24 = lib.versionAtLeast version "2.4pre"; | ||||
|       isExactly23 = lib.versionAtLeast version "2.3" && lib.versionOlder version "2.4"; | ||||
| 
 | ||||
|       VERSION_SUFFIX = suffix; | ||||
| 
 | ||||
|       outputs = [ "out" "dev" "man" "doc" ]; | ||||
| 
 | ||||
|       nativeBuildInputs = | ||||
|         [ pkg-config ] | ||||
|         ++ lib.optionals is24 [ autoreconfHook autoconf-archive bison flex libxml2 libxslt | ||||
|                                 docbook5 docbook_xsl_ns jq gmock ]; | ||||
| 
 | ||||
|       buildInputs = | ||||
|         [ curl openssl sqlite xz bzip2 nlohmann_json | ||||
|           brotli boost editline | ||||
|         ] | ||||
|         ++ lib.optional (stdenv.isLinux || stdenv.isDarwin) libsodium | ||||
|         ++ lib.optionals is24 [ libarchive rustc cargo ] | ||||
|         ++ lib.optional withLibseccomp libseccomp | ||||
|         ++ lib.optional withAWS | ||||
|             ((aws-sdk-cpp.override { | ||||
|               apis = ["s3" "transfer"]; | ||||
|               customMemoryManagement = false; | ||||
|             }).overrideDerivation (args: { | ||||
|               patches = args.patches or [] ++ [(fetchpatch { | ||||
|                 url = "https://github.com/edolstra/aws-sdk-cpp/commit/7d58e303159b2fb343af9a1ec4512238efa147c7.patch"; | ||||
|                 sha256 = "103phn6kyvs1yc7fibyin3lgxz699qakhw671kl207484im55id1"; | ||||
|               })]; | ||||
|             })); | ||||
| 
 | ||||
|       propagatedBuildInputs = [ boehmgc ]; | ||||
| 
 | ||||
|       # Seems to be required when using std::atomic with 64-bit types | ||||
|       NIX_LDFLAGS = lib.optionalString (stdenv.hostPlatform.system == "armv5tel-linux" || stdenv.hostPlatform.system == "armv6l-linux") "-latomic"; | ||||
| 
 | ||||
|       preConfigure = | ||||
|         # Copy libboost_context so we don't get all of Boost in our closure. | ||||
|         # https://github.com/NixOS/nixpkgs/issues/45462 | ||||
|         '' | ||||
|           mkdir -p $out/lib | ||||
|           cp -pd ${boost}/lib/{libboost_context*,libboost_thread*,libboost_system*} $out/lib | ||||
|           rm -f $out/lib/*.a | ||||
|           ${lib.optionalString stdenv.isLinux '' | ||||
|             chmod u+w $out/lib/*.so.* | ||||
|             patchelf --set-rpath $out/lib:${stdenv.cc.cc.lib}/lib $out/lib/libboost_thread.so.* | ||||
|           ''} | ||||
|         '' + | ||||
|         # Unpack the Rust crates. | ||||
|         lib.optionalString is24 '' | ||||
|           tar xvf ${crates} -C nix-rust/ | ||||
|           mv nix-rust/nix-vendored-crates* nix-rust/vendor | ||||
|         '' + | ||||
|         # For Nix-2.3, patch around an issue where the Nix configure step pulls in the | ||||
|         # build system's bash and other utilities when cross-compiling | ||||
|         lib.optionalString (stdenv.buildPlatform != stdenv.hostPlatform && isExactly23) '' | ||||
|           mkdir tmp/ | ||||
|           substitute corepkgs/config.nix.in tmp/config.nix.in \ | ||||
|             --subst-var-by bash ${bash}/bin/bash \ | ||||
|             --subst-var-by coreutils ${coreutils}/bin \ | ||||
|             --subst-var-by bzip2 ${bzip2}/bin/bzip2 \ | ||||
|             --subst-var-by gzip ${gzip}/bin/gzip \ | ||||
|             --subst-var-by xz ${xz}/bin/xz \ | ||||
|             --subst-var-by tar ${gnutar}/bin/tar \ | ||||
|             --subst-var-by tr ${coreutils}/bin/tr | ||||
|           mv tmp/config.nix.in corepkgs/config.nix.in | ||||
|           ''; | ||||
| 
 | ||||
|       configureFlags = | ||||
|         [ "--with-store-dir=${storeDir}" | ||||
|           "--localstatedir=${stateDir}" | ||||
|           "--sysconfdir=${confDir}" | ||||
|           "--disable-init-state" | ||||
|           "--enable-gc" | ||||
|         ] | ||||
|         ++ lib.optionals stdenv.isLinux [ | ||||
|           "--with-sandbox-shell=${sh}/bin/busybox" | ||||
|         ] | ||||
|         ++ lib.optional ( | ||||
|             stdenv.hostPlatform != stdenv.buildPlatform && stdenv.hostPlatform ? nix && stdenv.hostPlatform.nix ? system | ||||
|         ) ''--with-system=${stdenv.hostPlatform.nix.system}'' | ||||
|            # RISC-V support in progress https://github.com/seccomp/libseccomp/pull/50 | ||||
|         ++ lib.optional (!withLibseccomp) "--disable-seccomp-sandboxing"; | ||||
| 
 | ||||
|       makeFlags = [ "profiledir=$(out)/etc/profile.d" ]; | ||||
| 
 | ||||
|       installFlags = [ "sysconfdir=$(out)/etc" ]; | ||||
| 
 | ||||
|       doInstallCheck = false; | ||||
| 
 | ||||
|       # socket path becomes too long otherwise | ||||
|       #preInstallCheck = lib.optional stdenv.isDarwin '' | ||||
|       #  export TMPDIR=$NIX_BUILD_TOP | ||||
|       #''; | ||||
| 
 | ||||
|       separateDebugInfo = stdenv.isLinux; | ||||
| 
 | ||||
|       enableParallelBuilding = true; | ||||
| 
 | ||||
|       meta = { | ||||
|         description = "Powerful package manager that makes package management reliable and reproducible"; | ||||
|         longDescription = '' | ||||
|           Nix is a powerful package manager for Linux and other Unix systems that | ||||
|           makes package management reliable and reproducible. It provides atomic | ||||
|           upgrades and rollbacks, side-by-side installation of multiple versions of | ||||
|           a package, multi-user package management and easy setup of build | ||||
|           environments. | ||||
|         ''; | ||||
|         homepage = "https://nixos.org/"; | ||||
|         license = lib.licenses.lgpl2Plus; | ||||
|         maintainers = [ lib.maintainers.eelco ]; | ||||
|         platforms = lib.platforms.unix; | ||||
|         outputsToInstall = [ "out" "man" ]; | ||||
|       }; | ||||
| 
 | ||||
|       passthru = { | ||||
|         perl-bindings = stdenv.mkDerivation { | ||||
|           pname = "nix-perl"; | ||||
|           inherit version; | ||||
| 
 | ||||
|           inherit src; | ||||
| 
 | ||||
|           postUnpack = "sourceRoot=$sourceRoot/perl"; | ||||
| 
 | ||||
|           # This is not cross-compile safe, don't have time to fix right now | ||||
|           # but noting for future travellers. | ||||
|           nativeBuildInputs = | ||||
|             [ perl pkg-config curl nix libsodium boost autoreconfHook autoconf-archive ]; | ||||
| 
 | ||||
|           configureFlags = | ||||
|             [ "--with-dbi=${perlPackages.DBI}/${perl.libPrefix}" | ||||
|               "--with-dbd-sqlite=${perlPackages.DBDSQLite}/${perl.libPrefix}" | ||||
| nix.overrideAttrs (old: { | ||||
|   patches = (old.patches or []) ++ [ | ||||
|     ./add-catchAll.patch | ||||
|   ]; | ||||
| 
 | ||||
|           preConfigure = "export NIX_STATE_DIR=$TMPDIR"; | ||||
| 
 | ||||
|           preBuild = "unset NIX_INDENT_MAKE"; | ||||
|         }; | ||||
|       }; | ||||
|     }; | ||||
|   in nix; | ||||
| 
 | ||||
| in rec { | ||||
| 
 | ||||
|   nix = nixUnstable; | ||||
| 
 | ||||
|   nixUnstable = lib.lowPrio (callPackage common rec { | ||||
|     name = "nix-2.4${suffix}"; | ||||
|     suffix = "pre7534_b92f58f6"; | ||||
| 
 | ||||
|     #src = /home/Computational/rarias/nix/nix-rodarima; | ||||
|     src = fetchFromGitHub { | ||||
|       owner = "rodarima"; | ||||
|       repo = "nix"; | ||||
|       rev = "3a642187c33ed46d952d3a50a83b2576b704fab7"; | ||||
|       sha256 = "0s8is2czpkcj1x1kcjqgbnsbbl03w3fwjjiclsd44zh1ij3wb90s"; | ||||
|     }; | ||||
| 
 | ||||
|     crates = fetchurl { | ||||
|       url = "https://hydra.nixos.org/build/118797694/download/1/nix-vendored-crates-2.4pre7534_b92f58f6.tar.xz"; | ||||
|       sha256 = "a4c2612bbd81732bbb899bc0c230e07b16f6b6150ffbb19c4907dedbbc2bf9fc"; | ||||
|     }; | ||||
| 
 | ||||
|     inherit storeDir stateDir confDir boehmgc; | ||||
|   }); | ||||
| 
 | ||||
|   nixFlakes = lib.lowPrio (callPackage common rec { | ||||
|     name = "nix-2.4${suffix}"; | ||||
|     suffix = "pre20200521_00b562c"; | ||||
| 
 | ||||
|     src = fetchFromGitHub { | ||||
|       owner = "NixOS"; | ||||
|       repo = "nix"; | ||||
|       rev = "00b562c87ec4c3bbe514f5dc1f4d1c41f66f66bf"; | ||||
|       sha256 = "0s8is2czpkcj1x1kcjqgbnsbbl03w3fwjjiclsd44zh1ij3wb90s"; | ||||
|     }; | ||||
| 
 | ||||
|     crates = fetchurl { | ||||
|       url = "https://hydra.nixos.org/build/118093786/download/1/nix-vendored-crates-2.4pre20200501_941f952.tar.xz"; | ||||
|       sha256 = "060f4n5srdbb8vsj0m14aqch7im79a4h5g3nrs41p1xc602vhcdl"; | ||||
|     }; | ||||
| 
 | ||||
|     inherit storeDir stateDir confDir boehmgc; | ||||
|   }); | ||||
| 
 | ||||
| } | ||||
| }) | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user