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; }; |     mpich = callPackage ./pkgs/mpich/default.nix { mpich = prev.mpich; }; | ||||||
|     nanos6 = callPackage ./pkgs/nanos6/default.nix { }; |     nanos6 = callPackage ./pkgs/nanos6/default.nix { }; | ||||||
|     nanos6Debug = final.nanos6.override { enableDebug = true; }; |     nanos6Debug = final.nanos6.override { enableDebug = true; }; | ||||||
|  |     nix = callPackage ./pkgs/nix/default.nix { nix = prev.nix; }; | ||||||
|     nixtools = callPackage ./pkgs/nixtools/default.nix { }; |     nixtools = callPackage ./pkgs/nixtools/default.nix { }; | ||||||
|     # Broken because of pkgsStatic.libcap |     # Broken because of pkgsStatic.libcap | ||||||
|     # See: https://github.com/NixOS/nixpkgs/pull/268791 |     # 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 | { nix }: | ||||||
| , storeDir ? "/nix/store" |  | ||||||
| , stateDir ? "/nix/var" |  | ||||||
| , confDir ? "/etc" |  | ||||||
| , boehmgc |  | ||||||
| , stdenv, llvmPackages_6 |  | ||||||
| }: |  | ||||||
| 
 | 
 | ||||||
| let | nix.overrideAttrs (old: { | ||||||
| 
 |   patches = (old.patches or []) ++ [ | ||||||
| common = |     ./add-catchAll.patch | ||||||
|   { 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}" |  | ||||||
|   ]; |   ]; | ||||||
| 
 | }) | ||||||
|           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