difftreelog
fix do not require wildcard with callPackage
in: trunk
6 files changed
cmds/fleet/src/cmds/secrets/mod.rsdiffbeforeafterboth--- a/cmds/fleet/src/cmds/secrets/mod.rs
+++ b/cmds/fleet/src/cmds/secrets/mod.rs
@@ -265,13 +265,14 @@
let generator = nix_go!(secret.generator);
let on: Option<String> = nix_go_json!(default_generator.impureOn);
+ let nixpkgs = &config.nixpkgs;
+
let host = if let Some(on) = &on {
config.host(on).await?
} else {
config.local_host()
};
let on_pkgs = host.pkgs().await?;
- let call_package = nix_go!(on_pkgs.callPackage);
let mk_secret_generators = nix_go!(on_pkgs.mkSecretGenerators);
let mut recipients = Vec::new();
@@ -280,8 +281,11 @@
recipients.push(key);
}
let generators = nix_go!(mk_secret_generators(Obj { recipients }));
+ let pkgs_and_generators = nix_go!(on_pkgs + generators);
+
+ let call_package = nix_go!(nixpkgs.lib.callPackageWith(pkgs_and_generators));
- let generator = nix_go!(call_package(generator)(generators));
+ let generator = nix_go!(call_package(generator)(Obj {}));
let generator = generator.build_maybe_batch(batch).await?;
let generator = generator
@@ -353,8 +357,8 @@
bail!("generator should be lambda, got {gen_ty}");
}
}
+ let nixpkgs = &config.nixpkgs;
let default_pkgs = &config.default_pkgs;
- let default_call_package = nix_go!(default_pkgs.callPackage);
let default_mk_secret_generators = nix_go!(default_pkgs.mkSecretGenerators);
// Generators provide additional information in passthru, to access
// passthru we should call generator, but information about where this generator is supposed to build
@@ -367,7 +371,10 @@
let generators = nix_go!(default_mk_secret_generators(Obj {
recipients: <Vec<String>>::new(),
}));
- let default_generator = nix_go!(default_call_package(generator)(generators));
+ let pkgs_and_generators = nix_go!(default_pkgs + generators);
+
+ let call_package = nix_go!(nixpkgs.lib.callPackageWith(pkgs_and_generators));
+ let default_generator = nix_go!(call_package(generator)(Obj {}));
let kind: GeneratorKind = nix_go_json!(default_generator.generatorKind);
crates/fleet-base/src/host.rsdiffbeforeafterboth--- a/crates/fleet-base/src/host.rs
+++ b/crates/fleet-base/src/host.rs
@@ -34,6 +34,7 @@
/// import nixpkgs {system = local};
pub default_pkgs: Value,
+ pub nixpkgs: Value,
pub nix_session: NixSession,
}
crates/fleet-base/src/opts.rsdiffbeforeafterboth--- a/crates/fleet-base/src/opts.rs
+++ b/crates/fleet-base/src/opts.rs
@@ -225,6 +225,7 @@
nix_args,
config_field,
default_pkgs,
+ nixpkgs,
localhost: self.localhost.to_owned(),
})))
}
crates/nix-eval/src/macros.rsdiffbeforeafterboth1use serde::Serialize;23use crate::{NixSession, Value};45#[derive(Clone)]6pub struct NixExprBuilder {7 pub(crate) out: String,8 used_fields: Vec<Value>,9}10pub trait AttrSetValue {11 fn to_builder(self) -> NixExprBuilder;12}13trait Primitive {}1415macro_rules! impl_primitive {16 ($($t:ty),+) => {17 $(18 impl Primitive for $t {}19 )+20 };21}22impl_primitive!(String, bool, &'static str);2324impl<T> AttrSetValue for T25where26 // Limited by Primitive trait to avoid orphan rules violation with Vec<T: AttrSetValue>27 T: Serialize + Primitive,28{29 fn to_builder(self) -> NixExprBuilder {30 let serialized = nixlike::serialize(self).expect("invalid value for apply");31 NixExprBuilder {32 out: serialized.trim_end().to_owned(),33 used_fields: Vec::new(),34 }35 }36}37impl AttrSetValue for Value {38 fn to_builder(self) -> NixExprBuilder {39 NixExprBuilder {40 out: format!("sess_field_{}", self.session_field_id()),41 used_fields: vec![self],42 }43 }44}45impl<T> AttrSetValue for Vec<T>46where47 T: AttrSetValue,48{49 fn to_builder(self) -> NixExprBuilder {50 let mut builder = NixExprBuilder::list();51 for v in self {52 builder.list_value(NixExprBuilder::attrset_value(v));53 }54 builder.list_end();55 builder56 }57}5859impl NixExprBuilder {60 pub fn object() -> Self {61 NixExprBuilder {62 out: "{ ".to_owned(),63 used_fields: Vec::new(),64 }65 }66 pub fn list() -> Self {67 NixExprBuilder {68 out: "[".to_owned(),69 used_fields: Vec::new(),70 }71 }72 pub fn string(s: &str) -> Self {73 NixExprBuilder {74 out: nixlike::serialize(s)75 .expect("no problems with serializing_string")76 .trim_end()77 .to_owned(),78 used_fields: Vec::new(),79 }80 }81 pub fn attrset_value(v: impl AttrSetValue) -> Self {82 v.to_builder()83 }84 pub fn serialized(v: impl Serialize) -> Self {85 let serialized = nixlike::serialize(v).expect("invalid value for apply");86 Self {87 out: serialized.trim_end().to_owned(),88 used_fields: Vec::new(),89 }90 }91 pub fn value(f: Value) -> Self {92 Self {93 out: format!("sess_field_{}", f.session_field_id()),94 used_fields: vec![f],95 }96 }97 pub fn end_obj(&mut self) {98 self.out.push('}');99 }100 pub fn obj_key(&mut self, name: Self, value: Self) {101 self.out.push_str(r#""${"#);102 self.extend(name);103 self.out.push_str(r#"}" = "#);104 self.extend(value);105 self.out.push_str("; ");106 }107 pub fn list_value(&mut self, value: Self) {108 self.extend(value);109 self.out.push(' ');110 }111 pub fn list_end(&mut self) {112 self.out.push(']');113 }114115 pub fn extend(&mut self, e: Self) {116 self.out.push_str(&e.out);117 self.used_fields.extend(e.used_fields);118 }119120 #[allow(dead_code)]121 pub fn session(&self) -> NixSession {122 let mut session = None;123 for ele in &self.used_fields {124 if session.is_none() {125 session = Some(ele.session());126 continue;127 }128 let session = session.as_ref().expect("checked");129 let ele_sess = ele.session();130 assert!(131 NixSession::ptr_eq(session, &ele_sess),132 "can't mix fields from different session"133 );134 }135 session.expect("expr without fields used")136 }137 #[allow(dead_code)]138 pub fn index_attr(&mut self, s: &str) {139 let escaped = nixlike::serialize(s).expect("string");140 self.out.push('.');141 self.out.push_str(escaped.trim_end());142 }143}144145#[macro_export]146macro_rules! nix_expr_inner {147 //(@munch_object FIXME: value should be arbitrary nix_expr_inner input... Time to write proc-macro?148 (@obj($o:ident) $field:ident$(, $($tt:tt)*)?) => {{149 $o.obj_key(150 NixExprBuilder::string(stringify!($field)),151 NixExprBuilder::attrset_value($field),152 );153 $(nix_expr_inner!(@obj($o) $($tt)*);)?154 }};155 (@obj($o:ident) $field:ident: $v:expr$(, $($tt:tt)*)?) => {{156 $o.obj_key(157 NixExprBuilder::string(stringify!($field)),158 NixExprBuilder::attrset_value($v),159 );160 $(nix_expr_inner!(@obj($o) $($tt)*);)?161 }};162 (@obj($o:ident)) => {{}};163 (Obj { $($tt:tt)* }) => {{164 use $crate::{macros::NixExprBuilder, nix_expr_inner};165 let mut out = NixExprBuilder::object();166 nix_expr_inner!(@obj(out) $($tt)*);167 out.end_obj();168 out169 }};170 (@field($o:ident) . $var:ident $($tt:tt)*) => {{171 $o.index_attr(stringify!($var));172 nix_expr_inner!(@field($o) $($tt)*);173 }};174 (@field($o:ident) [{ $v:expr }] $($tt:tt)*) => {{175 $o.push(Index::attr(&$v));176 nix_expr_inner!(@o($o) $($tt)*);177 }};178 (@field($o:ident) [ $($var:tt)+ ] $($tt:tt)*) => {{179 $o.push(Index::Expr($crate::nix_expr_inner!($($var)+)));180 nix_expr_inner!(@o($o) $($tt)*);181 }};182 (@field($o:ident) ($($var:tt)*) $($tt:tt)*) => {183 $o.push(Index::ExprApply($crate::nix_expr_inner!($($var)+)));184 nix_expr_inner!(@o($o) $($tt)*);185 };186 (@field($o:ident)) => {};187 ($field:ident $($tt:tt)*) => {{188 use $crate::{macros::NixExprBuilder, nix_expr_inner};189 // might be used if indexed190 #[allow(unused_mut)]191 let mut out = NixExprBuilder::value($field.clone());192 nix_expr_inner!(@field(out) $($tt)*);193 out194 }};195 ($v:literal) => {{196 use $crate::macros::NixExprBuilder;197 NixExprBuilder::string($v)198 }};199 ({$v:expr}) => {{200 use $crate::macros::NixExprBuilder;201 NixExprBuilder::serialized(&$v)202 }}203}204#[macro_export]205macro_rules! nix_expr {206 ($($tt:tt)+) => {{207 use $crate::{macros::{NixExprBuilder}, Value, nix_expr_inner};208 let expr = nix_expr_inner!($($tt)+);209 Field::new(expr.session(), expr.out)210 }};211}212213#[macro_export]214macro_rules! nix_go {215 (@o($o:ident) . $var:ident $($tt:tt)*) => {{216 $o.push(Index::attr(stringify!($var)));217 nix_go!(@o($o) $($tt)*);218 }};219 (@o($o:ident) [{ $v:expr }] $($tt:tt)*) => {{220 $o.push(Index::attr(&$v));221 nix_go!(@o($o) $($tt)*);222 }};223 (@o($o:ident) [ $($var:tt)+ ] $($tt:tt)*) => {{224 $o.push(Index::Expr($crate::nix_expr_inner!($($var)+)));225 nix_go!(@o($o) $($tt)*);226 }};227 (@o($o:ident) ($($var:tt)*) $($tt:tt)*) => {228 $o.push(Index::ExprApply($crate::nix_expr_inner!($($var)+)));229 nix_go!(@o($o) $($tt)*);230 };231 (@o($o:ident) | $($var:tt)*) => {232 $o.push(Index::Pipe($crate::nix_expr_inner!($($var)+)));233 };234 (@o($o:ident) + $($var:tt)*) => {235 $o.push(Index::Merge($crate::nix_expr_inner!($($var)+)));236 };237 (@o($o:ident)) => {};238 ($field:ident $($tt:tt)+) => {{239 use $crate::{nix_go, Index};240 let field = $field.clone();241 let mut out = vec![];242 nix_go!(@o(out) $($tt)*);243 field.select(out).await?244 }}245}246#[macro_export]247macro_rules! nix_go_json {248 ($($tt:tt)*) => {{249 $crate::nix_go!($($tt)*).as_json().await?250 }};251}crates/nix-eval/src/value.rsdiffbeforeafterboth--- a/crates/nix-eval/src/value.rs
+++ b/crates/nix-eval/src/value.rs
@@ -15,6 +15,7 @@
Expr(NixExprBuilder),
ExprApply(NixExprBuilder),
Pipe(NixExprBuilder),
+ Merge(NixExprBuilder),
}
impl Index {
pub fn var(v: impl AsRef<str>) -> Self {
@@ -56,6 +57,9 @@
Index::Pipe(e) => {
write!(f, "<map>({})", e.out)
}
+ Index::Merge(e) => {
+ write!(f, "//({})", e.out)
+ }
}
}
}
@@ -157,6 +161,12 @@
let index = format!("sess_field_{}", index.0.value.expect("value"));
query = format!("({index} {query})");
}
+ Index::Merge(v) => {
+ let index = Value::new(self.0.session.clone(), &v.out).await?;
+ used_fields.push(index.clone());
+ let index = format!("sess_field_{}", index.0.value.expect("value"));
+ query = format!("({query} // {index})");
+ }
}
}
lib/default.nixdiffbeforeafterboth--- a/lib/default.nix
+++ b/lib/default.nix
@@ -46,7 +46,6 @@
mkPassword = {size ? 32}: {
coreutils,
mkSecretGenerator,
- ...
}:
mkSecretGenerator {
script = ''
@@ -58,7 +57,7 @@
mkEd25519 = {
noEmbedPublic ? false,
encoding ? null,
- }: {mkSecretGenerator, ...}:
+ }: {mkSecretGenerator}:
mkSecretGenerator {
script = ''
mkdir $out
@@ -68,7 +67,7 @@
'';
};
- mkX25519 = {encoding ? null}: {mkSecretGenerator, ...}:
+ mkX25519 = {encoding ? null}: {mkSecretGenerator}:
mkSecretGenerator {
script = ''
mkdir $out
@@ -80,7 +79,6 @@
mkRsa = {size ? 4096}: {
openssl,
mkSecretGenerator,
- ...
}:
mkSecretGenerator {
script = ''
@@ -98,7 +96,7 @@
count ? 32,
encoding,
noNuls ? false,
- }: {mkSecretGenerator, ...}:
+ }: {mkSecretGenerator}:
mkSecretGenerator {
script = ''
mkdir $out