From 7812e667ce46b61e807821bc135b0bede7ec7178 Mon Sep 17 00:00:00 2001 From: randy-schuett_statista Date: Tue, 27 Jan 2026 21:33:18 +0100 Subject: [PATCH 1/6] Allow to specify if the remote envs should be kept or not --- crates/cargo-lambda-deploy/src/functions.rs | 97 ++++++++++++- .../cargo-lambda-metadata/src/cargo/deploy.rs | 133 +++++++++++++++++- crates/cargo-lambda-metadata/src/config.rs | 19 +++ docs/commands/deploy.md | 40 ++++++ tests/binaries/bootstrap.zip | Bin 1160151 -> 1163180 bytes .../fixtures/single-binary-package/Cargo.toml | 1 + 6 files changed, 286 insertions(+), 4 deletions(-) diff --git a/crates/cargo-lambda-deploy/src/functions.rs b/crates/cargo-lambda-deploy/src/functions.rs index e11c0959..4edd0786 100644 --- a/crates/cargo-lambda-deploy/src/functions.rs +++ b/crates/cargo-lambda-deploy/src/functions.rs @@ -377,7 +377,19 @@ async fn update_function_config( builder = builder.set_layers(config.function_config.layer.clone()); } - if let Some(environment) = config.lambda_environment()? { + // If merge_env is enabled, populate remote_env with existing environment variables + let config_with_remote_env = if config.merge_env.unwrap_or(false) { + let mut config_clone = config.clone(); + config_clone.remote_env = conf + .environment + .clone() + .and_then(|e| e.variables) + .unwrap_or_default(); + config_clone + } else { + config.clone() + }; + if let Some(environment) = config_with_remote_env.lambda_environment()? { if let Some(vars) = environment.variables() { if !vars.is_empty() && vars @@ -1369,4 +1381,87 @@ mod tests { assert!(result.is_ok()); http_client.assert_requests_match(&[]); } + + #[tokio::test] + async fn test_update_function_config_with_merge_env() { + use cargo_lambda_metadata::env::EnvOptions; + use std::collections::HashMap; + + // Mock request body that should contain merged environment variables + let request_body = SdkBody::from( + serde_json::json!({ + "Environment": { + "Variables": { + "REMOTE_VAR": "remote_value", + "LOCAL_VAR": "local_value", + "OVERRIDE_VAR": "overridden_value" + } + } + }) + .to_string(), + ); + + let response_body = SdkBody::from( + serde_json::json!({ + "FunctionArn": "arn:aws:lambda:us-east-1:123456789012:function:test-function", + "LastUpdateStatus": "Successful" + }) + .to_string(), + ); + + let http_client = StaticReplayClient::new(vec![ReplayEvent::new( + Request::builder() + .uri("https://lambda.us-east-1.amazonaws.com/2015-03-31/functions/test-function/configuration") + .method("PUT") + .body(request_body) + .unwrap(), + Response::builder().status(200).body(response_body).unwrap(), + )]); + + let config = LambdaConfig::builder() + .http_client(http_client.clone()) + .credentials_provider(Credentials::for_tests()) + .region(Region::new("us-east-1")) + .build(); + let client = LambdaClient::from_conf(config); + + // Setup deploy config with merge_env enabled + let mut deploy_config = Deploy::default(); + deploy_config.merge_env = Some(true); + deploy_config.function_config.env_options = Some(EnvOptions { + env_var: Some(vec![ + "LOCAL_VAR=local_value".to_string(), + "OVERRIDE_VAR=overridden_value".to_string(), + ]), + env_file: None, + }); + + let name = "test-function"; + let progress = Progress::start("deploying function"); + + // Create a function configuration with existing environment variables + let mut existing_env = HashMap::new(); + existing_env.insert("REMOTE_VAR".to_string(), "remote_value".to_string()); + existing_env.insert("OVERRIDE_VAR".to_string(), "old_value".to_string()); + + let environment = cargo_lambda_remote::aws_sdk_lambda::types::EnvironmentResponse::builder() + .set_variables(Some(existing_env)) + .build(); + + let conf = FunctionConfiguration::builder() + .function_arn("arn:aws:lambda:us-east-1:123456789012:function:test-function") + .state(State::Active) + .last_update_status(LastUpdateStatus::Successful) + .environment(environment) + .build(); + + let result = update_function_config(&deploy_config, name, &client, &progress, conf).await; + + assert!(result.is_ok()); + assert_eq!( + result.unwrap(), + "arn:aws:lambda:us-east-1:123456789012:function:test-function" + ); + http_client.assert_requests_match(&[]); + } } diff --git a/crates/cargo-lambda-metadata/src/cargo/deploy.rs b/crates/cargo-lambda-metadata/src/cargo/deploy.rs index a38e9750..537f44f2 100644 --- a/crates/cargo-lambda-metadata/src/cargo/deploy.rs +++ b/crates/cargo-lambda-metadata/src/cargo/deploy.rs @@ -110,6 +110,13 @@ pub struct Deploy { #[serde(default)] pub dry: bool, + /// Merge environment variables with existing ones instead of overwriting them. + /// When enabled, existing environment variables on AWS Lambda are preserved, + /// and only new variables are added or updated from the configuration. + #[arg(long)] + #[serde(default, skip_serializing_if = "Option::is_none")] + pub merge_env: Option, + /// Name of the function or extension to deploy #[arg(value_name = "NAME")] #[serde(default)] @@ -118,6 +125,10 @@ pub struct Deploy { #[arg(skip)] #[serde(skip)] pub base_env: HashMap, + + #[arg(skip)] + #[serde(skip)] + pub remote_env: HashMap, } impl Deploy { @@ -180,9 +191,23 @@ impl Deploy { pub fn lambda_environment(&self) -> Result, MetadataError> { let builder = Environment::builder(); - let env = match &self.function_config.env_options { - None => self.base_env.clone(), - Some(env_options) => env_options.lambda_environment(&self.base_env)?, + let mut env = if self.merge_env.unwrap_or(false) { + // Start with remote environment variables when merging + self.remote_env.clone() + } else { + HashMap::new() + }; + + // Add base environment variables + env.extend(self.base_env.clone()); + + // Add or override with environment variables from configuration + match &self.function_config.env_options { + None => {} + Some(env_options) => { + let local_env = env_options.lambda_environment(&HashMap::new())?; + env.extend(local_env); + } }; if env.is_empty() { @@ -221,6 +246,7 @@ impl Serialize for Deploy { + self.tag.is_some() as usize + self.include.is_some() as usize + self.dry as usize + + self.merge_env.is_some() as usize + self.name.is_some() as usize + self.remote_config.is_some() as usize + self.function_config.count_fields(); @@ -266,6 +292,9 @@ impl Serialize for Deploy { if self.dry { state.serialize_field("dry", &self.dry)?; } + if let Some(merge_env) = self.merge_env { + state.serialize_field("merge_env", &merge_env)?; + } if let Some(ref name) = self.name { state.serialize_field("name", name)?; } @@ -632,6 +661,104 @@ mod tests { ); } + #[test] + fn test_lambda_environment_merge_mode() { + // Test merge_env=None (default behavior - overwrites) + let deploy = Deploy { + function_config: FunctionDeployConfig { + env_options: Some(EnvOptions { + env_var: Some(vec!["LOCAL=VALUE".to_string()]), + ..Default::default() + }), + ..Default::default() + }, + remote_env: HashMap::from([ + ("REMOTE1".to_string(), "REMOTE_VALUE1".to_string()), + ("REMOTE2".to_string(), "REMOTE_VALUE2".to_string()), + ]), + merge_env: None, + ..Default::default() + }; + let env = deploy.lambda_environment().unwrap().unwrap(); + let vars = env.variables().unwrap(); + // When merge_env is None/false, only local env vars should be present + assert_eq!(vars.len(), 1); + assert_eq!(vars.get("LOCAL"), Some(&"VALUE".to_string())); + assert_eq!(vars.get("REMOTE1"), None); + assert_eq!(vars.get("REMOTE2"), None); + + // Test merge_env=Some(false) (explicit overwrite behavior) + let deploy = Deploy { + function_config: FunctionDeployConfig { + env_options: Some(EnvOptions { + env_var: Some(vec!["LOCAL=VALUE".to_string()]), + ..Default::default() + }), + ..Default::default() + }, + remote_env: HashMap::from([ + ("REMOTE1".to_string(), "REMOTE_VALUE1".to_string()), + ("REMOTE2".to_string(), "REMOTE_VALUE2".to_string()), + ]), + merge_env: Some(false), + ..Default::default() + }; + let env = deploy.lambda_environment().unwrap().unwrap(); + let vars = env.variables().unwrap(); + // When merge_env is explicitly false, only local env vars should be present + assert_eq!(vars.len(), 1); + assert_eq!(vars.get("LOCAL"), Some(&"VALUE".to_string())); + assert_eq!(vars.get("REMOTE1"), None); + assert_eq!(vars.get("REMOTE2"), None); + + // Test merge_env=Some(true) (merge behavior - preserves remote vars) + let deploy = Deploy { + function_config: FunctionDeployConfig { + env_options: Some(EnvOptions { + env_var: Some(vec!["LOCAL=VALUE".to_string()]), + ..Default::default() + }), + ..Default::default() + }, + remote_env: HashMap::from([ + ("REMOTE1".to_string(), "REMOTE_VALUE1".to_string()), + ("REMOTE2".to_string(), "REMOTE_VALUE2".to_string()), + ]), + merge_env: Some(true), + ..Default::default() + }; + let env = deploy.lambda_environment().unwrap().unwrap(); + let vars = env.variables().unwrap(); + // When merge_env is true, both remote and local vars should be present + assert_eq!(vars.len(), 3); + assert_eq!(vars.get("LOCAL"), Some(&"VALUE".to_string())); + assert_eq!(vars.get("REMOTE1"), Some(&"REMOTE_VALUE1".to_string())); + assert_eq!(vars.get("REMOTE2"), Some(&"REMOTE_VALUE2".to_string())); + + // Test merge_env=Some(true) with overlapping keys (local should win) + let deploy = Deploy { + function_config: FunctionDeployConfig { + env_options: Some(EnvOptions { + env_var: Some(vec!["REMOTE1=LOCAL_OVERRIDE".to_string()]), + ..Default::default() + }), + ..Default::default() + }, + remote_env: HashMap::from([ + ("REMOTE1".to_string(), "REMOTE_VALUE1".to_string()), + ("REMOTE2".to_string(), "REMOTE_VALUE2".to_string()), + ]), + merge_env: Some(true), + ..Default::default() + }; + let env = deploy.lambda_environment().unwrap().unwrap(); + let vars = env.variables().unwrap(); + // Local value should override remote value + assert_eq!(vars.len(), 2); + assert_eq!(vars.get("REMOTE1"), Some(&"LOCAL_OVERRIDE".to_string())); + assert_eq!(vars.get("REMOTE2"), Some(&"REMOTE_VALUE2".to_string())); + } + #[test] fn test_load_config_from_workspace() { let options = ConfigOptions { diff --git a/crates/cargo-lambda-metadata/src/config.rs b/crates/cargo-lambda-metadata/src/config.rs index 2eb33f76..e5be363a 100644 --- a/crates/cargo-lambda-metadata/src/config.rs +++ b/crates/cargo-lambda-metadata/src/config.rs @@ -352,6 +352,7 @@ mod tests { assert_eq!(config.env.get("FOO"), Some(&"BAR".to_string())); assert_eq!(config.deploy.function_config.memory, Some(512.into())); assert_eq!(config.deploy.function_config.timeout, Some(60.into())); + assert_eq!(config.deploy.merge_env, Some(true)); assert_eq!( config.deploy.function_config.layer, @@ -514,6 +515,24 @@ mod tests { assert_eq!(config.deploy.function_config.memory, Some(2048.into())); } + #[test] + fn test_cargo_toml_merge_env_not_overridden_by_cli() { + // Test that merge_env from Cargo.toml is NOT overridden when CLI doesn't set it + let metadata = load_metadata(fixture_metadata("single-binary-package")).unwrap(); + + // CLI with no merge_env set (should be None) + let args_config = Config { + deploy: Deploy::default(), + ..Default::default() + }; + + let config = load_config(&args_config, &metadata, &ConfigOptions::default()).unwrap(); + + // Should load merge_env=true from Cargo.toml + assert_eq!(config.deploy.merge_env, Some(true), + "merge_env from Cargo.toml should be preserved when CLI doesn't set it"); + } + #[test] fn test_load_metadata_from_package_workspace() { let options = ConfigOptions { diff --git a/docs/commands/deploy.md b/docs/commands/deploy.md index 3baea9d0..300efa05 100644 --- a/docs/commands/deploy.md +++ b/docs/commands/deploy.md @@ -155,6 +155,45 @@ The flag `--env-file` will read the variables from a file and add them to the fu cargo lambda deploy --env-file .env http-lambda ``` +### Merging environment variables + +By default, when you deploy a function with environment variables, Cargo Lambda will **overwrite** all existing environment variables on AWS Lambda with the ones specified in your configuration. This ensures that your configuration is the single source of truth. + +However, in some scenarios (such as hybrid workflows where infrastructure tools like AWS CDK manage some variables and Cargo Lambda manages others), you may want to preserve existing environment variables and only update or add new ones. You can use the `--merge-env` flag to enable this behavior: + +``` +cargo lambda deploy --merge-env --env-var NEW_VAR=VALUE http-lambda +``` + +When `--merge-env` is enabled: +- Existing environment variables on the Lambda function are preserved +- Variables specified in your configuration (via `--env-var`, `--env-vars`, or `--env-file`) are added or updated +- If a variable exists both remotely and in your configuration, the local value takes precedence + +**Example:** + +If your Lambda function currently has these environment variables: +``` +CDK_MANAGED_VAR=value1 +INFRA_VAR=value2 +``` + +And you deploy with: +``` +cargo lambda deploy --merge-env --env-var APP_VAR=value3 http-lambda +``` + +The final environment variables will be: +``` +CDK_MANAGED_VAR=value1 (preserved) +INFRA_VAR=value2 (preserved) +APP_VAR=value3 (added) +``` + +::: warning +Without the `--merge-env` flag, the default behavior would replace all environment variables, leaving only `APP_VAR=value3`. +::: + ## Resource tagging You can use the flag `--tags` to add resource tags to a function or layer. This flag supports a comma separated list of values. If the function is deployed via S3, the tags are also applied to the S3 object: @@ -204,6 +243,7 @@ tracing = "active" # Tracing mode role = "role-full-arn" # Function's execution role env_file = ".env.production" # File to load environment variables from env = { "VAR1" = "VAL1" } # Additional environment variables +merge_env = true # Merge environment variables with existing ones (default: false) layers = [ "layer-full-arn" ] # List of layers to deploy with your function tags = { "team" = "lambda" } # List of AWS resource tags for this function s3_bucket = "deploy-bucket" # S3 bucket to upload the Lambda function to diff --git a/tests/binaries/bootstrap.zip b/tests/binaries/bootstrap.zip index 172665a7576b927ae8921effa12b216916cab2fe..1b7ebfe0d1478119d1c88cf9ca708b8d0e6ccdd6 100644 GIT binary patch delta 16112 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 c;$-NcCPePXGV_ delta 13088 zcmZvjV{m89+U{f9wr$(CZDV5RA3GDz6?$44jL;ChyO1mmvL9BdNq?_E<`GgePh&7+XhT21*;W@5-O@Yn}28eLt$=898sSp2qPm0Hx7 zUl%HemlM`BSn5$GANV!6wRAP5ET9YIDKS5u!gwkdo=V717OAS3zrq$TPKu+H4X9%B z>O1zqc4-Qiv3di(>gryWnFDkSc(l&*GTR z>9x9oTue2{DiX-Ei&WVTj#4L*7hNIf)ElGVra+YE(Z)L7=~1ye_=V~_xP~mAA1KAe z?OU$;foW-eX2Vi39;xwQuFqN-sOAPwVogU&tkq+E=cP0dA<20;Cuh^o1p`=brovXJ z7ht)5voBQg6&mnr&7EF~mswiTW)y}a6U{nH=F;!;iu;^MG&B{x4_pO)?s!|@n%;o7 zXf#Nt1b0}eEx8)#+v?3iR2fjh7Ri!lv^Aiq;*Y6^lOt0-6RXZ})iA&1mQtqrTAVc? zN1^wViq{7CDxZzPDQd`j%LCM3=-AVMA?qTNTF`adc+-*Q*m_c*)#r$$44cB_blU49 zKTi(cTgSFPf?&+y+U(~qHlEmXhf5bydBm^FW+wMPUKsRm1PVB-S*(S+6rVTBNo%1>PkT-}|*thzDw7R9s z7*endUDhBz^&SX-m$k(tWD&XI zuJJxEig=yhJ?VE-knEw*&qK-FKW04YNvoj=L=dZ8GJUEWy9aB&Pzrzl{!!GsGS~_z zsD140SrSqW+ghxOtl@bw2d%ll$b07gC6jt>SNAgrqofPEvK}DmVUs@Oyom6?f^^#^ zdPSC#B~8km>kiuO`w*}g@cq33o^#!cg@N+UH~H2joj72NK9j}2Q6-wH^g;~&W>m+< z=1CL0e{5FwQ7RL>AhhGyZjWPpaJ6=OH$Qokt!9_F!1rzdc~ey?2)pTC1HvUVc98Ys ztl8Ct>y}v?<`eKH;lhbyN_UDO2M5bxLMweV-9NwY3D~&1JOc%7nza$ZTv4`^@66IJ zb&2A<>mMuhJB29mdR8{3?Bs?E`Q@k1>COA%&kP!audBd7d~a!x?dD6$8*e4=B)ERY zCk)d`_ULlSB>uY!H`~8#MKzdSJtJ9HxY3H){6}AB8Xe$_4%g+TVVz`R57*MF@M-RS z6S#GNP>`XC1EB~cLZnXYk~V5StTdd_&}#$_@g9H7p|$p%c`I%vet}!Cc%68=WD6mf znh_j7d`#g9KTps%^tDrYi@d-;T}vi?EocNbosW+1Azo0QmojBNWg-qF6|Am{IXp6xHE?fRO)36wN(d%^h5<9UWZ$ zYGaB<|3BK;eWS^QYa|P-tM6NM#hzUZ4pJ7lgDKi?C=wuOZzJd;%1-s5GQNub)}L z6w^FtCbJ!(+Q(aFw=P)HpIUMf{6Jzt^cdq;Jw?vKUch5-Tcq@xb}neAoBi%zxRH~D1BldC~WjvjHOGGXOS4SweJ!Z$cA{d)J@5ncnqbZo(r-2UvxI63p7 z3EA9JyR8f=WdW#AAc=v7Wpx0BoyXItahlsiA9l_SF0^3iym-Hv$?7m+fjGS02qP8_ zmqY8)m20A;Bc_-iZ~Q`sZ8}{v;dTMLHSfhrv|dUSVhYw#m+}KOfcTV@8h39)q_-(( zaBuNnylpm$yuYgMU$5ic$5yPyNoEWSs@U@orv3P({{r}x1f5@(2<{MW3KM14M-vsc z0oAV(@w|^O%b2(XgD85W;YP%D8uNfb?;G<=0JKD*)ovBJ&U}3C2!@|RKZMH(F~}X* zcUL_TH0M`}2%@f5GnPU;oTTRb*xc)&@(wU(gV8D^#+uSo|6A?UFAIn!L)#8x&+AU~ zrm_nr(mg;(rX;9^hnAhT3tdtuP!D}!Jj$dK+R70E8CwF3Zji)DU^nU%rTq`t3mBc6 z9bBfDsge4X1kB%e!AVa|?IB?tiMBw95{vFU`gN1bMiE`Y8cmZ<%E}I`Dy;Lqt(8`jWLH<`rfLxX&Fz;d?@6sB2eeL&TuhkDu`LW^vd)4E=|* zD~o@`?)5G7e+pcA4Gzf^02>I%Bozqg@6PXE+dd072UFMo5x6Vv>Z2uBFY-hV?*f(-!I!a(1EU@P6l$S_ZhZj;W(z6E4ZYv+vd`$Xy0g1da#yP$L zkC_iA3$DSf6!HyevA%nTlc`y5m*bC_sTTITQuT#+s!G5__M)<@L6R@WlR?vP)A+LgZPo|or zc{b&rLAFT54LZewlrrrEwaHH#Z#eo`{-?(amT3!Y>E{~t#zJCsmf_kWE9DeP^a^7* z##c(&SZ;uIBAaz0RbgEb6?t@*p2R%sTW^Vk_%V6nq3>j{D{EnY%2EsmWd;w zym=Po*G?MC!Imaxu}rS%(Iw(kZpaWif~gnv`Q+J#!*Z$% ziY&l@mekhq^y+(o42BRLfQ_tu5eNOBY$dipDS*QHL0!@?)krBGZFfv2g;8R4m?FQW2E5g^cgMC6_j%>&E z?_Po|?2#onWr>|#>(?jcIKL;6{DI|VNV zmt^8vVr7I;E)CYL79%i6OqV0(%PTVIswq;q8rHB2L+pNWq&G+u0%I1Vv&8ONSD<>@ zQZ%2ocVj~XLd7i*9Tqb)Z*U;GBP9gx) z1H@|LyZ8IcGBS143{SedBS%4)VP>7r(7X5R-tl`sT+#g<-U^QY_v^;@W7_vy-uL$o z0F&*`SqpQ!DVwnY&zr0F!Oc_5et~l5uq}rYe98bx=5|{Pi{|fq!teDx5lTcKWBRJ3 z%H>%Lf-&Bk{Olwk3-$*BAJT4+F2JMfTK@BEo_=03{mkA?iA0_3>)A#U5fnB_+88*D zAjM-t`o37Bv{BPh;S4Twt`Qn7ik1=6L>MfO__Qaf=mD;4JrJY_$s5;eC?N&}I!8DnJ z;fE1m{?RN@8a<!G2CR+Yy!S9R=3I%AYVCXYSfr0*@PUTW9@nGS9jqAZKY<5iW$ zQL&}0N*;aDO?wJ`U`u-wVFayWK7nb2t^uEN+{V05SLuRTwIl*jmO4Eb(3W9oKdzVvHZ+GXQk&a_EMZN+U89 zaxF`{a@3_4xPhPW$gC4!#PwPU5WcDC+G!D~Ld=SB@A}zQGQitGT?{An0bpoB^a{ZGCEQ5hoVWtD0R*UB+}f;4%I7<8lBqlD9Ih;u zZ00)TGvtrQN!lV9yNJ4i;4RQ6ZP$!^2g2lj<1! z4IB8+05HZ#?NEm1hJyJCM9NXTha$*X?chKOmB0-AOcvFO(v-zOPl`cE(L16o`_h3q za22eCk#rUb^fBS8<{X}~yp!T@9dBt+`{r=)56X>rfT8B%G)9@>klKl;o<$hzZwhWE7Z&~kc=%*q zokQ8NAFhjBO&p!*vT&|u%iJP#_+P#FS>sMB#oS06f^?G*8YT_5qL7dt%&0}AN*jTt zLzG4}kKTm?Ex^D#1AX$))fi7U&W1#8dqB!Bd{uFvV^A5UrX#=%$895IVDET3fHdR2 z?^d?{-v%8kY|PtXsZqsT)0GWE?~HSPq|Ic$CKWJeWVbXRqa8&h2;Nc`tH-gAMm{jI zu%UZ{Qza8qqI;kc{?^P)w+V?EQ3(r7;J4gh(5{8OJ&QfY@i1zJfcAg@kQGpE`dkWe zWsW=I$fOPkQC@UlR$Fmj3DT`pfH)%rJu79?9C=(o$0i_R=cpNrx(-~zyD0E1~6TT^K!1P z$w%7qSo*{JLOK9Y8n~9KC};PV{-(X9^sD3ll}0QMlG5Q)GH$<4rh+yiM$^ zI?F?@bJVxgrh`}lFc1;WjBjlD3s<2{bs80pisvOw zm5hCUhQ%oM6c5^FP6Fhowo;O+u~v*nw>2g=uzHT)D9~dQXwfNd83uD;-H>#S;cRyL zb!3b-&DBWKo8j_!v$=DCUgVOU;6c|#VEBoYh@D*IqIQGyJc~tL#hcX=pnYd*nkEn?E_>{# zU@-Q@*W-AN(02H3(ic}a=CKO+!EhJSxmA*x`7E)kTy7Vgg`8+D1D1nx=mIO)J?HD4 zI#AKey-!RS_DeVu1C{~QtA@r>XD-Xr)@i|e8_!^QzBTh^##q&ycZv+RRq0Tp-8Y7F`BK@s z#D_~Cd~dbwsO$LIyZIBAcN6tl6P=f{x5hM%#T6ODC+|{eN~dJVk=ywbHhQjGxKasW z4E*ag)GjfnOS%MuP`vxbRPLi1xUgrlX@LPkaSgW=M1bkB;*#rGt^V|$-WXGRMJk?k ztnK#J!ioZQg0$J@z~G3b1l8IkgB&!}R;S18J8;;(aS!!#U&^VDIdQ`Q*uh+Jewow{ zTlXHd!j&Y2V_i3lq*n)S2N{3&rfJ-@pRd*1_H^J+=VlG`>$8G25vFUVpI={yka{qp zsi3y|+5m!Nxygo_?5CL!6#&zlAV0-#)XI2ZY731Y5apdA0p|ve@j!D@1J5ElU_~vY z8*nve@wBLMQWJT7IKwq}=)7qAQxRLqZlh0pwo?K|yH3-j%m)RgEhmxSiK7NPPf19h zBy)OiG=HY$fz&b>;7*5>Y>tdaLBM#_9$tMtTtU0MyAwvM^n}@p+pdV;xC7 zddF8Cy>A!cx_<2S*$8{}o(d6AG!;lDwV8@3n}CZ6*5*`mS`if+cj!sv@gWoe;X=}!?62f~pwweQ7hXDAuo z!wJh45mkb|S|N(sc_H)GBrFS7dntcQz5&9lQcdvSkFXFYRkAq`oTFf=*44SLc~r>N zZV$4U^(9?3tQjh@Qh+{yO3-RreilFS@dXl+J5dR(=YaYKDJ}qv?;}%cu_dy+qyre* zHJ?8q7@gO>>N?I>rZW72>KD;v6zUI3yo2D}7%i>XCIU zd-=KT4>CXZ^6;l`Q|v_NPC9c0>AG+u$@}Ncg!QT&Plv*qfMec{_Jg{UPA;Gv6Z|!m z2iB;@x<%@~?|VvvArfM(RLCED0J4nAI_m(d?h0D%?H<>&Fk)SaP=@7~E!G1q1Pjqp za%Nn!BflMWuqUn9$L;zBs;$+1oy?HD)^RsY@LFFD!bk-MD-|@m01tcv1rPslQ0r>j zO{&wjl@n^FIHyaFj=7QAjUwPz+Y&UZU&e%cB@!n>72CMdpwgvDeH9q)8WAM7t=(h1 z#qjPC%5B=#x^SJLkJkr+BTNQ)$Bxz zlrfcRgAwxX&zN6(CWr-WeA-PNxZXEdU-uq=9$pxth1C$pmSb`x zFo7r{$nL9p@MxYWfsGW$+eC$WdKD!N?ZnZK+%d+ZEFDPnmF#;z@_BAuf)5>4f2vP( z?uk?T2%TxKWjw|M89dvgN_HNHOmVb5p#u!(!ns4*pcOCy!4g2HBhzM%{2Hy7ePxNh zzz@0i-_hcE1K|j_Na;t>vv)dbiLIVvngsy|GHOn?XSOYdv%riDV(d3O=nrROgY-~u z-L^5th*aN;AmFD%6ekZ&D%_@65GYX9bkzGVj;uW zig8K%W2>34vJrrtuO!bu&fX*r-L^lI!Wh~zC0wG&R}ozE>+_9br<0P$IOg7j?UE;> zyj4fthlGs&%)~j0$nqpR@Tox`t*e-F1Vj*#8ZutLBN9*n+fN5?!L% zS~!KrlxqR?V(*tG3yj^Oi^dI!Bkptk7Er@d5iTmJ!v5%_pNO|ZZu zWos}n4u3up-8VV~SuOc1=*UbQvBg6G@G`vfd3JLnxcXBpM~X5l1FdX>rl~p`*my0J zE1kggHd+R7y;6Rn(uwhBirQ%eJv^7hrLw-0J+13&u{Jm+nS3lq6r6tAyAXcu|HlD*8;WN>>!GZ!T?rvV0^;j zS1&%^o5P#7HbE^CB%qVz+RC)zrP>I35${(SKQ6~em^q~fs;ge~uO#$WZFx(Tm#g02 z>1Er0%SIP-hp_`Ef(Z_XUsac#?tGm^zeLaabvE^nc4-pu(9LQ|VCu43kWuyYM@u&KGHtDieS5*#!6Vtew6Ies!@eQ_%tb_vyyutZE zU^H@!&p;?Ru*dr_<9b=PafncLyEw}-9TJ7ECL8ONk3UsemFrO(eD9weQU(0iICd5W z5leS~ogxlc;6KuKx;dhM_8SaNMr;GN<&On-j>;g3#?O=XADB5DHS(jRa40^;Y96oY zqRCLq3J*`IyLuXjns?@)%B|J>_VeCn4Jjq9qLm7T4v)rq9|WBcr%T0ZxpX;A1mUJL zL&5krOz~ln3BQd_sLk1=c}F~cc4q*6#hFnX2fpeBbdYZaw>PEBDvWm%gpUKXyRaEL zc_JN`k;?R`MqXL~szW`M-45v;VRze+1aHs*v<{l?*}$z*sr+Ep+!KDwa3GoL-zXgd4&(aedzIKq+fhh zw#w(k*iE^6S-D)M2U=~fOZnOpxjpcZ{N_XtZUx^g`TcR#fAI)%pX#(FaoX9@$}oDv zFH$#P*V8Ck!>`KdrQu(MLP!i{-&@<HD;)rRE? zt~24oFx8NS7ox%Nl%JL{BR=z+ydRg2wY=cZ0fS)1(e<^VydrjvyECg$b$@(t6+d1~ zDQ7jrS=KQyVY^Y+NBrB3%|-a5Qi9Fn(&cgay->5(*9u+BI}SmBTUOp1(QCzyPyO!l zYmZw`okt!Kub<=LS}k|~;@Ti$%gu%}@uerRs^_)b;>r}~{Teb^w0LRvE9s%~l&Hq4 zq{q}bBA`vU^EQ7ck5@%BTCgX3^6GAG?tZXYv&9LHn(NFzKW!bKsOklgqh<#L)vOSl zVdb!3d}lRbiQoqC88}lMML4?N-g{qvt`jcn7Jc~?Q!(n${et_S*F_r4fAsDlfPm`J z{~Z#tvo`sA5#Ft3=(xdw1b8kpQtK;%*zj7_fRjnex7RTO?ZCJQ;71D;l1(m>C}c~N z*{Arr?j)s-Ogy5P4ge1%PXvq}++BNoFH$M2#zv`UTujWslbPrRF@GCn&u!6uZ%?AqqH4^KCrKkWG_ z(xZa~z{3gv&j9`sRj3EFkeLW8&#t4Hq>A!#jTR7jVIiNs9tGw`i7SkXiY(+(!{{a; zc?>GaeBQXwoe$W{_^s^0({oFTqqP%44MOl0O34ESTq>1mIYiK6GmqTKjA^HT+m_{E zCVc!ybkVx@Y1}6|FpFIU=~ivMqscGmM|&Ftp|rHR?vKQyh1_nt4Eh9YRO;$BmoQmq z)WQX`*xK62TA}GQJqTjGh4mpm7%f{+Jgq%Z%nLLviQjVhcdt&&8Dy@Tg(bwdu2mRi!g>Bp=#iMWMOYe0cDj;9bS)+5hUCAB+Pvt?jzcR zsk*bxA^aeEr*S*M=K4^ID&h^&1)tlEcn=lIM``29CJta*2cX`Nc|8o_bAZ1GUYzt* z%pl-%^2)s7eX_0nx%C#jR|782B^1zo_ru0;gaIIjKz3Df&ocB)sfHUq2&_RkB#_z6 zQVP?ABez}v8uvhxO!Wq97bKu1YMu`ZoNzYdumx_API&!_9~I@- zD?Z<}Coxh2k)xX{DvmwfSD~Km&W?~n)E;O<34vH9JaQjY)<;ld$sObaG}r?PYDE7bD;mj%xhDKrYf~N>5NcYAEVcPhYH$-;CIBH{2~t zJo1J-KzW26ti&c~i5kWS1|PR|faDBBlC;H}gFwBt^^CrXv*31!1WWlh9KoNPE3q4Y z{eEkuLttfW1@ef8h2}iM*?eP;NCpTX4q-}Sv@3UxXd3c^KfAl6%z60~BbEF4KoS<{ zkQSzI;PXU1&Y>0@F7h5)!`nmS!Qu~R1an_Gq5*0{%-h!?397OrEoqLU3CDfg59V*k zp3(R*NGLC-V{h55Us-X7IvnQ!qaz)E>9V19K=j1g@QBH1jR1oOM!>P7j|}kJ6If`% zxYIKt`OeiL>Zn>n6A4~A$NGx>dkg0_vo-1N^?vc^=uckfj4k00`dQmtJU^IZIS|$7 zx!cAYHVKC^+*RheC8Yqm-q2-8u-#U;9+e->)dk%~xc+t%$V|T4UL`F!lPE-INTiBa zQ(?RX?BG+MPrI*!L6ss#l5O7^JZ!p1u0$bwSDB<3jAmmfyC%A5*odHWmxcPhxRqT? zQ`Z!p)}m(FniGmRQY2>mr^gWMQuwv4XRo+ZL>MnIEw(x zDfY85(x_v-Dl&>Ak2&e0XsB7nlUde}9fHHmLg$Ds^%TU~ceT-`e_x=w*t)^Yutja< zr0HZkXQqf)=Y|~etGXfF`6f1j++;>HwH=d0u`w!19>u5=bJvhB=_M02f?6a~)LH!b zll1a=drD3{vk6$CER66#aS zvAWmQr%)KqvmKwLBTExG1U~&!I01=rIK$Q2+pDNR7VHN_PTol#EfJQlsY(j?&Du<* zJT@8;!Hyh1J}HlTzL@nY_ci}g7uLFj&Jt=de7x=G3$d5@c& z)QxdUYz-TB`L{}gZp84R$Pcil`8Ql6pLpS{nFp=x`KTTi|8rJu*ZGHT#Mz($&Mdnj$L{SAo}z*(KR$zOF{K-23c9>U}N;QVJmAcdF!DVrw56 zGgAHyJ=Lr>jF|{a%mS9})_u@{0Y|hB>Lk=DLlSlLw{l?&$w%jf2h!b_kxD=09mzgF zFPAR|H(xs5*M4YDpB|_H3=;@R-o}dO7JP2Z?V3qHO7eq+7lVV(dlLyOD9+~8pg)sp zB|~~aaWwqGP5v>8!8`yDZTU(YlK!YbIXan|{v7 zo53cd-sQPFGZc|6OEf3{iSz(6HC#MAm|8`K$=s0kcI_Dk!AJCHo(!4YU0>T<_@ySf zNf9%ZPp`nnsNX&dxO$`^ibnKixUXDlt_27OVrlNY*@~iPq;67g1Jb$cUvNSX!Jva%C zUeAbhq0aBaO2TVU=cPl)U(PpkcV^lR+q^$JER}@!oES#!K?i`)GBh0KcB&m6BsiJ= z(52c}7BCrsmqq|+YXeke3(wd|-9p{-@PRx;NTpI%)Pc-uKye4W~ppv;WxO%cbxg#{+Q~0G%F~mCylzfA-A&g*JMk-%H$R`hmEH zgOHnwzQCdFSoit$VP=UCo+s=Jtl)6f#xas7&og7cr9EM9stEU)FpapGZ!tsE!y6=) zkl_J*Iq}VHwY%X7BNwtX5e37fn>cv(;8lm3!94NAnC`P|!Rb-$O!6G-7|dVdKEtl@QpyXLu(EF|T!4@mY>XPe`0v{aKb6HIr~Z&xE|FAmeM9&O;} z_ny`nOljG?C1c0Rx(m_+jpg8lg9HoE!iz6TtFN>*lJX4WL-Y~kx(faSychjM+DkO6 zJb4Wl%_LS5e*%9nswebi^dtj1}?351#*VQE7QzvAdQ+Q8IUk z;$xr7m~c&-X`GTk9!$1hCeqSj79bs_9WV91J(80p4DhvQL`|z9l-6b1Nw2((YAq{! zmAQ_#i~S}b&_&%^_2Ok)+qV;XtY>ZqpBeG&p-jDrIk;nX{i=JDv~r#J^fmo{&VP}| z{oTtsiRdh?qH#0;hum!4u-b#kJw28-4(6Z8Y^muka`QOvh|92J;P;nqVc$!=ci{@Z8&U4>2ipRW7g- Date: Tue, 27 Jan 2026 21:48:01 +0100 Subject: [PATCH 2/6] Changed from Option to just bool for --- crates/cargo-lambda-deploy/src/functions.rs | 4 +- .../cargo-lambda-metadata/src/cargo/deploy.rs | 50 +++++-------------- crates/cargo-lambda-metadata/src/config.rs | 6 +-- 3 files changed, 18 insertions(+), 42 deletions(-) diff --git a/crates/cargo-lambda-deploy/src/functions.rs b/crates/cargo-lambda-deploy/src/functions.rs index 4edd0786..74b10466 100644 --- a/crates/cargo-lambda-deploy/src/functions.rs +++ b/crates/cargo-lambda-deploy/src/functions.rs @@ -378,7 +378,7 @@ async fn update_function_config( } // If merge_env is enabled, populate remote_env with existing environment variables - let config_with_remote_env = if config.merge_env.unwrap_or(false) { + let config_with_remote_env = if config.merge_env { let mut config_clone = config.clone(); config_clone.remote_env = conf .environment @@ -1427,7 +1427,7 @@ mod tests { // Setup deploy config with merge_env enabled let mut deploy_config = Deploy::default(); - deploy_config.merge_env = Some(true); + deploy_config.merge_env = true; deploy_config.function_config.env_options = Some(EnvOptions { env_var: Some(vec![ "LOCAL_VAR=local_value".to_string(), diff --git a/crates/cargo-lambda-metadata/src/cargo/deploy.rs b/crates/cargo-lambda-metadata/src/cargo/deploy.rs index 537f44f2..e2e00348 100644 --- a/crates/cargo-lambda-metadata/src/cargo/deploy.rs +++ b/crates/cargo-lambda-metadata/src/cargo/deploy.rs @@ -114,8 +114,8 @@ pub struct Deploy { /// When enabled, existing environment variables on AWS Lambda are preserved, /// and only new variables are added or updated from the configuration. #[arg(long)] - #[serde(default, skip_serializing_if = "Option::is_none")] - pub merge_env: Option, + #[serde(default)] + pub merge_env: bool, /// Name of the function or extension to deploy #[arg(value_name = "NAME")] @@ -191,7 +191,7 @@ impl Deploy { pub fn lambda_environment(&self) -> Result, MetadataError> { let builder = Environment::builder(); - let mut env = if self.merge_env.unwrap_or(false) { + let mut env = if self.merge_env { // Start with remote environment variables when merging self.remote_env.clone() } else { @@ -246,7 +246,7 @@ impl Serialize for Deploy { + self.tag.is_some() as usize + self.include.is_some() as usize + self.dry as usize - + self.merge_env.is_some() as usize + + self.merge_env as usize + self.name.is_some() as usize + self.remote_config.is_some() as usize + self.function_config.count_fields(); @@ -292,8 +292,8 @@ impl Serialize for Deploy { if self.dry { state.serialize_field("dry", &self.dry)?; } - if let Some(merge_env) = self.merge_env { - state.serialize_field("merge_env", &merge_env)?; + if self.merge_env { + state.serialize_field("merge_env", &self.merge_env)?; } if let Some(ref name) = self.name { state.serialize_field("name", name)?; @@ -663,31 +663,7 @@ mod tests { #[test] fn test_lambda_environment_merge_mode() { - // Test merge_env=None (default behavior - overwrites) - let deploy = Deploy { - function_config: FunctionDeployConfig { - env_options: Some(EnvOptions { - env_var: Some(vec!["LOCAL=VALUE".to_string()]), - ..Default::default() - }), - ..Default::default() - }, - remote_env: HashMap::from([ - ("REMOTE1".to_string(), "REMOTE_VALUE1".to_string()), - ("REMOTE2".to_string(), "REMOTE_VALUE2".to_string()), - ]), - merge_env: None, - ..Default::default() - }; - let env = deploy.lambda_environment().unwrap().unwrap(); - let vars = env.variables().unwrap(); - // When merge_env is None/false, only local env vars should be present - assert_eq!(vars.len(), 1); - assert_eq!(vars.get("LOCAL"), Some(&"VALUE".to_string())); - assert_eq!(vars.get("REMOTE1"), None); - assert_eq!(vars.get("REMOTE2"), None); - - // Test merge_env=Some(false) (explicit overwrite behavior) + // Test merge_env=false (default behavior - overwrites) let deploy = Deploy { function_config: FunctionDeployConfig { env_options: Some(EnvOptions { @@ -700,18 +676,18 @@ mod tests { ("REMOTE1".to_string(), "REMOTE_VALUE1".to_string()), ("REMOTE2".to_string(), "REMOTE_VALUE2".to_string()), ]), - merge_env: Some(false), + merge_env: false, ..Default::default() }; let env = deploy.lambda_environment().unwrap().unwrap(); let vars = env.variables().unwrap(); - // When merge_env is explicitly false, only local env vars should be present + // When merge_env is false, only local env vars should be present assert_eq!(vars.len(), 1); assert_eq!(vars.get("LOCAL"), Some(&"VALUE".to_string())); assert_eq!(vars.get("REMOTE1"), None); assert_eq!(vars.get("REMOTE2"), None); - // Test merge_env=Some(true) (merge behavior - preserves remote vars) + // Test merge_env=true (merge behavior - preserves remote vars) let deploy = Deploy { function_config: FunctionDeployConfig { env_options: Some(EnvOptions { @@ -724,7 +700,7 @@ mod tests { ("REMOTE1".to_string(), "REMOTE_VALUE1".to_string()), ("REMOTE2".to_string(), "REMOTE_VALUE2".to_string()), ]), - merge_env: Some(true), + merge_env: true, ..Default::default() }; let env = deploy.lambda_environment().unwrap().unwrap(); @@ -735,7 +711,7 @@ mod tests { assert_eq!(vars.get("REMOTE1"), Some(&"REMOTE_VALUE1".to_string())); assert_eq!(vars.get("REMOTE2"), Some(&"REMOTE_VALUE2".to_string())); - // Test merge_env=Some(true) with overlapping keys (local should win) + // Test merge_env=true with overlapping keys (local should win) let deploy = Deploy { function_config: FunctionDeployConfig { env_options: Some(EnvOptions { @@ -748,7 +724,7 @@ mod tests { ("REMOTE1".to_string(), "REMOTE_VALUE1".to_string()), ("REMOTE2".to_string(), "REMOTE_VALUE2".to_string()), ]), - merge_env: Some(true), + merge_env: true, ..Default::default() }; let env = deploy.lambda_environment().unwrap().unwrap(); diff --git a/crates/cargo-lambda-metadata/src/config.rs b/crates/cargo-lambda-metadata/src/config.rs index e5be363a..a28f192d 100644 --- a/crates/cargo-lambda-metadata/src/config.rs +++ b/crates/cargo-lambda-metadata/src/config.rs @@ -352,7 +352,7 @@ mod tests { assert_eq!(config.env.get("FOO"), Some(&"BAR".to_string())); assert_eq!(config.deploy.function_config.memory, Some(512.into())); assert_eq!(config.deploy.function_config.timeout, Some(60.into())); - assert_eq!(config.deploy.merge_env, Some(true)); + assert_eq!(config.deploy.merge_env, true); assert_eq!( config.deploy.function_config.layer, @@ -527,9 +527,9 @@ mod tests { }; let config = load_config(&args_config, &metadata, &ConfigOptions::default()).unwrap(); - + // Should load merge_env=true from Cargo.toml - assert_eq!(config.deploy.merge_env, Some(true), + assert_eq!(config.deploy.merge_env, true, "merge_env from Cargo.toml should be preserved when CLI doesn't set it"); } From 8bd1c3fc7019bed65ffa524b479eaa47342d07e6 Mon Sep 17 00:00:00 2001 From: randy-schuett_statista Date: Sat, 31 Jan 2026 20:34:36 +0100 Subject: [PATCH 3/6] Format --- crates/cargo-lambda-deploy/src/functions.rs | 7 ++++--- crates/cargo-lambda-metadata/src/config.rs | 8 +++++--- tests/binaries/bootstrap.zip | Bin 1163180 -> 1163173 bytes 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/crates/cargo-lambda-deploy/src/functions.rs b/crates/cargo-lambda-deploy/src/functions.rs index 74b10466..9520e6d4 100644 --- a/crates/cargo-lambda-deploy/src/functions.rs +++ b/crates/cargo-lambda-deploy/src/functions.rs @@ -1444,9 +1444,10 @@ mod tests { existing_env.insert("REMOTE_VAR".to_string(), "remote_value".to_string()); existing_env.insert("OVERRIDE_VAR".to_string(), "old_value".to_string()); - let environment = cargo_lambda_remote::aws_sdk_lambda::types::EnvironmentResponse::builder() - .set_variables(Some(existing_env)) - .build(); + let environment = + cargo_lambda_remote::aws_sdk_lambda::types::EnvironmentResponse::builder() + .set_variables(Some(existing_env)) + .build(); let conf = FunctionConfiguration::builder() .function_arn("arn:aws:lambda:us-east-1:123456789012:function:test-function") diff --git a/crates/cargo-lambda-metadata/src/config.rs b/crates/cargo-lambda-metadata/src/config.rs index a28f192d..703931a6 100644 --- a/crates/cargo-lambda-metadata/src/config.rs +++ b/crates/cargo-lambda-metadata/src/config.rs @@ -527,10 +527,12 @@ mod tests { }; let config = load_config(&args_config, &metadata, &ConfigOptions::default()).unwrap(); - + // Should load merge_env=true from Cargo.toml - assert_eq!(config.deploy.merge_env, true, - "merge_env from Cargo.toml should be preserved when CLI doesn't set it"); + assert_eq!( + config.deploy.merge_env, true, + "merge_env from Cargo.toml should be preserved when CLI doesn't set it" + ); } #[test] diff --git a/tests/binaries/bootstrap.zip b/tests/binaries/bootstrap.zip index 1b7ebfe0d1478119d1c88cf9ca708b8d0e6ccdd6..4ef1735ef1e425807da7e5fd9c83ed9178abed46 100644 GIT binary patch delta 4683 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 NzY!b;|Gg0a000@58kztA delta 4703 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 From 44d5e8273094e3eb77c1c493f3d7416157217412 Mon Sep 17 00:00:00 2001 From: randy-schuett_statista Date: Sat, 31 Jan 2026 20:35:58 +0100 Subject: [PATCH 4/6] Clippy fixes --- crates/cargo-lambda-new/src/lib.rs | 20 ++++++++----------- crates/cargo-lambda-new/src/template.rs | 5 ++--- .../cargo-lambda-new/src/template/config.rs | 2 +- .../cargo-lambda-watch/src/watcher/ignore.rs | 2 +- 4 files changed, 12 insertions(+), 17 deletions(-) diff --git a/crates/cargo-lambda-new/src/lib.rs b/crates/cargo-lambda-new/src/lib.rs index 0450f739..9646710a 100644 --- a/crates/cargo-lambda-new/src/lib.rs +++ b/crates/cargo-lambda-new/src/lib.rs @@ -433,17 +433,15 @@ fn should_render_file( return false; }; - if let Some(condition_value) = &condition.r#match { - if condition_value.to_value() == *variable { + if let Some(condition_value) = &condition.r#match + && condition_value.to_value() == *variable { return true; } - } - if let Some(condition_value) = &condition.not_match { - if condition_value.to_value() != *variable { + if let Some(condition_value) = &condition.not_match + && condition_value.to_value() != *variable { return true; } - } } false @@ -481,17 +479,15 @@ fn should_ignore_file( return false; }; - if let Some(condition_value) = &condition.r#match { - if condition_value.to_value() == *variable { + if let Some(condition_value) = &condition.r#match + && condition_value.to_value() == *variable { return true; } - } - if let Some(condition_value) = &condition.not_match { - if condition_value.to_value() != *variable { + if let Some(condition_value) = &condition.not_match + && condition_value.to_value() != *variable { return true; } - } } false diff --git a/crates/cargo-lambda-new/src/template.rs b/crates/cargo-lambda-new/src/template.rs index 453cff04..b4e87ac1 100644 --- a/crates/cargo-lambda-new/src/template.rs +++ b/crates/cargo-lambda-new/src/template.rs @@ -268,11 +268,10 @@ fn is_remote_zip_file(path: &str) -> bool { fn find_local_zip_file(value: &str) -> Option { // ignore error to fallback to other template options. - if let Ok(path) = dunce::realpath(value) { - if path.exists() && path.is_file() && path.extension().unwrap_or_default() == "zip" { + if let Ok(path) = dunce::realpath(value) + && path.exists() && path.is_file() && path.extension().unwrap_or_default() == "zip" { return Some(path); } - } None } diff --git a/crates/cargo-lambda-new/src/template/config.rs b/crates/cargo-lambda-new/src/template/config.rs index 498bd665..88be2688 100644 --- a/crates/cargo-lambda-new/src/template/config.rs +++ b/crates/cargo-lambda-new/src/template/config.rs @@ -152,7 +152,7 @@ impl TemplatePrompt { } } - fn text_prompt(&self) -> Text { + fn text_prompt(&self) -> Text<'_> { let mut prompt = Text::new(&self.message); if let Some(choices) = &self.choices { diff --git a/crates/cargo-lambda-watch/src/watcher/ignore.rs b/crates/cargo-lambda-watch/src/watcher/ignore.rs index 0374d75d..1640a1b2 100644 --- a/crates/cargo-lambda-watch/src/watcher/ignore.rs +++ b/crates/cargo-lambda-watch/src/watcher/ignore.rs @@ -142,7 +142,7 @@ pub(crate) async fn create_filter( .applies_in .clone() .unwrap_or_else(|| base.to_path_buf()); - let filter = IgnoreFilter::new(&base, &[file.clone()]) + let filter = IgnoreFilter::new(&base, std::slice::from_ref(file)) .await .map_err(ServerError::InvalidIgnoreFiles)?; filters.push(filter); From 8b0914dcfea3139121a034ff97c5d5865aa9a842 Mon Sep 17 00:00:00 2001 From: randy-schuett_statista Date: Sat, 31 Jan 2026 20:36:17 +0100 Subject: [PATCH 5/6] Format --- crates/cargo-lambda-new/src/lib.rs | 28 ++++++++++++++----------- crates/cargo-lambda-new/src/template.rs | 9 +++++--- 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/crates/cargo-lambda-new/src/lib.rs b/crates/cargo-lambda-new/src/lib.rs index 9646710a..b106089e 100644 --- a/crates/cargo-lambda-new/src/lib.rs +++ b/crates/cargo-lambda-new/src/lib.rs @@ -434,14 +434,16 @@ fn should_render_file( }; if let Some(condition_value) = &condition.r#match - && condition_value.to_value() == *variable { - return true; - } + && condition_value.to_value() == *variable + { + return true; + } if let Some(condition_value) = &condition.not_match - && condition_value.to_value() != *variable { - return true; - } + && condition_value.to_value() != *variable + { + return true; + } } false @@ -480,14 +482,16 @@ fn should_ignore_file( }; if let Some(condition_value) = &condition.r#match - && condition_value.to_value() == *variable { - return true; - } + && condition_value.to_value() == *variable + { + return true; + } if let Some(condition_value) = &condition.not_match - && condition_value.to_value() != *variable { - return true; - } + && condition_value.to_value() != *variable + { + return true; + } } false diff --git a/crates/cargo-lambda-new/src/template.rs b/crates/cargo-lambda-new/src/template.rs index b4e87ac1..544e728b 100644 --- a/crates/cargo-lambda-new/src/template.rs +++ b/crates/cargo-lambda-new/src/template.rs @@ -269,9 +269,12 @@ fn is_remote_zip_file(path: &str) -> bool { fn find_local_zip_file(value: &str) -> Option { // ignore error to fallback to other template options. if let Ok(path) = dunce::realpath(value) - && path.exists() && path.is_file() && path.extension().unwrap_or_default() == "zip" { - return Some(path); - } + && path.exists() + && path.is_file() + && path.extension().unwrap_or_default() == "zip" + { + return Some(path); + } None } From 205a7654193ab1a2bb609c8f7df73d6f2eb31e25 Mon Sep 17 00:00:00 2001 From: David Calavera <1050+calavera@users.noreply.github.com> Date: Sat, 14 Feb 2026 09:47:20 -0800 Subject: [PATCH 6/6] Fix MacOS Intel builds. --- .github/workflows/build.yml | 32 ++++++++++++++++---------------- .github/workflows/release.yml | 17 +++++++++-------- 2 files changed, 25 insertions(+), 24 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 490dabad..f0d4f8c0 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -3,23 +3,23 @@ name: Build Crates on: pull_request: paths: - - 'crates/**' - - 'tests/**' - - 'Cargo.toml' - - 'deny.toml' - - 'rustfmt.toml' - - '.github/workflows/build.yml' + - "crates/**" + - "tests/**" + - "Cargo.toml" + - "deny.toml" + - "rustfmt.toml" + - ".github/workflows/build.yml" push: - branches: [ 'main' ] - tags-ignore: [ '*' ] + branches: ["main"] + tags-ignore: ["*"] paths: - - 'crates/**' - - 'tests/**' - - 'Cargo.toml' - - 'deny.toml' - - 'rustfmt.toml' - - '.github/workflows/build.yml' + - "crates/**" + - "tests/**" + - "Cargo.toml" + - "deny.toml" + - "rustfmt.toml" + - ".github/workflows/build.yml" workflow_dispatch: @@ -37,7 +37,7 @@ jobs: matrix: os: - label: MacOS (Intel) - runner: macos-13 + runner: macos-15-intel - label: MacOS (ARM) runner: macos-latest - label: Ubuntu Latest @@ -63,7 +63,7 @@ jobs: - name: Setup cmake uses: jwlawson/actions-setup-cmake@v2 with: - cmake-version: '3.31.x' + cmake-version: "3.31.x" - name: Run cargo test run: cargo test --all-features diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7ba4febb..44d886c6 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -2,7 +2,7 @@ name: Release on: push: - tags: [ 'v*' ] + tags: ["v*"] env: MATURIN_VERSION: 1.8.2 @@ -22,7 +22,7 @@ jobs: os: macos-latest label: MacOs (ARM) - target: x86_64-apple-darwin - os: macos-13 + os: macos-15-intel label: MacOS (Intel) steps: - uses: actions/checkout@v5 @@ -67,7 +67,7 @@ jobs: - name: Setup cmake uses: jwlawson/actions-setup-cmake@v2 with: - cmake-version: '3.31.x' + cmake-version: "3.31.x" - name: Build uses: messense/maturin-action@v1 @@ -92,10 +92,11 @@ jobs: strategy: fail-fast: true matrix: - platform: [ - { target: "x86_64-unknown-linux-musl", image_tag: "x86_64-musl" }, - { target: "aarch64-unknown-linux-musl", image_tag: "aarch64-musl" }, - ] + platform: + [ + { target: "x86_64-unknown-linux-musl", image_tag: "x86_64-musl" }, + { target: "aarch64-unknown-linux-musl", image_tag: "aarch64-musl" }, + ] container: image: ghcr.io/rust-cross/rust-musl-cross:${{ matrix.platform.image_tag }} steps: @@ -128,7 +129,7 @@ jobs: release-all: name: Release all artifacts runs-on: ubuntu-latest - needs: [ release-macos, release-windows, release-linux ] + needs: [release-macos, release-windows, release-linux] steps: - uses: actions/checkout@v5 - uses: actions/download-artifact@v4