From 058e77bab20db90347ce1d91c41076ef56b61b26 Mon Sep 17 00:00:00 2001 From: Vincent Ambo Date: Wed, 10 Aug 2022 21:01:15 +0300 Subject: feat(tvix/eval): implement attrset update (`//`) operator The underlying implementation does a few tricks based on which pair of attrset representations is encountered. Particularly the effect of short-circuiting the empty cases might be relevant in nixpkgs/NixOS, due to the use of lib.optionalAttrs. Change-Id: I22b978b1c69af12926489a71087c6a6219c012f3 Reviewed-on: https://cl.tvl.fyi/c/depot/+/6140 Reviewed-by: sterni Tested-by: BuildkiteCI --- tvix/eval/src/tests/tvix_tests/eval-okay-attrs-update-empty-lhs.exp | 1 + tvix/eval/src/tests/tvix_tests/eval-okay-attrs-update-empty-lhs.nix | 1 + tvix/eval/src/tests/tvix_tests/eval-okay-attrs-update-empty-rhs.exp | 1 + tvix/eval/src/tests/tvix_tests/eval-okay-attrs-update-empty-rhs.nix | 1 + tvix/eval/src/tests/tvix_tests/eval-okay-attrs-update-kv-lhs.exp | 1 + tvix/eval/src/tests/tvix_tests/eval-okay-attrs-update-kv-lhs.nix | 1 + tvix/eval/src/tests/tvix_tests/eval-okay-attrs-update.exp | 1 + tvix/eval/src/tests/tvix_tests/eval-okay-attrs-update.nix | 1 + 8 files changed, 8 insertions(+) create mode 100644 tvix/eval/src/tests/tvix_tests/eval-okay-attrs-update-empty-lhs.exp create mode 100644 tvix/eval/src/tests/tvix_tests/eval-okay-attrs-update-empty-lhs.nix create mode 100644 tvix/eval/src/tests/tvix_tests/eval-okay-attrs-update-empty-rhs.exp create mode 100644 tvix/eval/src/tests/tvix_tests/eval-okay-attrs-update-empty-rhs.nix create mode 100644 tvix/eval/src/tests/tvix_tests/eval-okay-attrs-update-kv-lhs.exp create mode 100644 tvix/eval/src/tests/tvix_tests/eval-okay-attrs-update-kv-lhs.nix create mode 100644 tvix/eval/src/tests/tvix_tests/eval-okay-attrs-update.exp create mode 100644 tvix/eval/src/tests/tvix_tests/eval-okay-attrs-update.nix (limited to 'tvix/eval/src/tests/tvix_tests') diff --git a/tvix/eval/src/tests/tvix_tests/eval-okay-attrs-update-empty-lhs.exp b/tvix/eval/src/tests/tvix_tests/eval-okay-attrs-update-empty-lhs.exp new file mode 100644 index 000000000000..fedf8f25a693 --- /dev/null +++ b/tvix/eval/src/tests/tvix_tests/eval-okay-attrs-update-empty-lhs.exp @@ -0,0 +1 @@ +{ a = "ok"; } diff --git a/tvix/eval/src/tests/tvix_tests/eval-okay-attrs-update-empty-lhs.nix b/tvix/eval/src/tests/tvix_tests/eval-okay-attrs-update-empty-lhs.nix new file mode 100644 index 000000000000..9596be22b831 --- /dev/null +++ b/tvix/eval/src/tests/tvix_tests/eval-okay-attrs-update-empty-lhs.nix @@ -0,0 +1 @@ +{} // { a = "ok"; } diff --git a/tvix/eval/src/tests/tvix_tests/eval-okay-attrs-update-empty-rhs.exp b/tvix/eval/src/tests/tvix_tests/eval-okay-attrs-update-empty-rhs.exp new file mode 100644 index 000000000000..fedf8f25a693 --- /dev/null +++ b/tvix/eval/src/tests/tvix_tests/eval-okay-attrs-update-empty-rhs.exp @@ -0,0 +1 @@ +{ a = "ok"; } diff --git a/tvix/eval/src/tests/tvix_tests/eval-okay-attrs-update-empty-rhs.nix b/tvix/eval/src/tests/tvix_tests/eval-okay-attrs-update-empty-rhs.nix new file mode 100644 index 000000000000..117c01141357 --- /dev/null +++ b/tvix/eval/src/tests/tvix_tests/eval-okay-attrs-update-empty-rhs.nix @@ -0,0 +1 @@ +{ a = "ok"; } // {} diff --git a/tvix/eval/src/tests/tvix_tests/eval-okay-attrs-update-kv-lhs.exp b/tvix/eval/src/tests/tvix_tests/eval-okay-attrs-update-kv-lhs.exp new file mode 100644 index 000000000000..c2234a47e2b8 --- /dev/null +++ b/tvix/eval/src/tests/tvix_tests/eval-okay-attrs-update-kv-lhs.exp @@ -0,0 +1 @@ +{ name = "foo"; other = 42; value = "bar"; } diff --git a/tvix/eval/src/tests/tvix_tests/eval-okay-attrs-update-kv-lhs.nix b/tvix/eval/src/tests/tvix_tests/eval-okay-attrs-update-kv-lhs.nix new file mode 100644 index 000000000000..6f71684902e5 --- /dev/null +++ b/tvix/eval/src/tests/tvix_tests/eval-okay-attrs-update-kv-lhs.nix @@ -0,0 +1 @@ +{ name = "foo"; value = "bar"; } // { other = 42; } diff --git a/tvix/eval/src/tests/tvix_tests/eval-okay-attrs-update.exp b/tvix/eval/src/tests/tvix_tests/eval-okay-attrs-update.exp new file mode 100644 index 000000000000..57f4d541bd85 --- /dev/null +++ b/tvix/eval/src/tests/tvix_tests/eval-okay-attrs-update.exp @@ -0,0 +1 @@ +{ a = 15; b = "works"; } diff --git a/tvix/eval/src/tests/tvix_tests/eval-okay-attrs-update.nix b/tvix/eval/src/tests/tvix_tests/eval-okay-attrs-update.nix new file mode 100644 index 000000000000..735602fe02d5 --- /dev/null +++ b/tvix/eval/src/tests/tvix_tests/eval-okay-attrs-update.nix @@ -0,0 +1 @@ +{ a = 15; } // { b = "works"; } -- cgit 1.4.1