Skip to content

Commit bac9e6f

Browse files
jamesadevineCopilot
andcommitted
refactor(marker): emit ado-aw marker via prepare_steps, not setup_steps
The always-on `ado-aw-marker` extension was emitting its metadata step via `setup_steps`, which forced `generate_setup_job` to spin up a dedicated `- job: Setup` block in every compiled pipeline. Minimal agentic pipelines with no user `setup:` declarations, no PR/pipeline filters, and no other Setup-contributing extensions were paying for a whole extra pool agent + agent boot just to emit a single-line metadata comment. Move the marker emission to `prepare_steps` so the step lands inside the always-present Agent job's `{{ prepare_steps }}` block. No extra job, no extra pool time — the marker is still parsed by `parse_marker_step` the same way (scans for the `# ado-aw-metadata:` line anywhere in the YAML). The change requires extending the `CompilerExtension::prepare_steps` signature to accept `&CompileContext` — the marker needs `input_path`, `ado_context`, and `front_matter.target` to build its JSON. All five existing `prepare_steps` implementors (cache_memory, lean, python, node, dotnet) gain an unused `_ctx: &CompileContext` parameter. The macro dispatcher and `generate_prepare_steps` propagate ctx through. Tests: * All five existing `prepare_steps` unit tests in `extensions/tests.rs` updated to construct a `CompileContext` via the existing `ctx_from` helper. * All seven `generate_prepare_steps` tests in `common.rs` updated to pass a `CompileContext::for_test(&fm)`. * All seven marker-emit unit tests in `ado_aw_marker.rs` updated to call `prepare_steps(&ctx)` (now returns `Vec<String>` directly, no `Result` wrapper). * New regression test `test_marker_does_not_create_setup_job_for_minimal_pipeline` asserts a minimal compiled pipeline contains the marker line but no `- job: Setup` block — guards against future re-introduction of the unnecessary Setup job. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 4d77d5b commit bac9e6f

10 files changed

Lines changed: 105 additions & 40 deletions

File tree

src/compile/common.rs

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2221,12 +2221,13 @@ pub fn generate_teardown_job(
22212221
pub fn generate_prepare_steps(
22222222
prepare_steps: &[serde_yaml::Value],
22232223
extensions: &[super::extensions::Extension],
2224+
ctx: &CompileContext,
22242225
) -> Result<String> {
22252226
let mut parts = Vec::new();
22262227

22272228
// Extension prepare steps and prompt supplements (runtimes + first-party tools)
22282229
for ext in extensions {
2229-
for step in ext.prepare_steps() {
2230+
for step in ext.prepare_steps(ctx) {
22302231
parts.push(step);
22312232
}
22322233
if let Some(prompt) = ext.prompt_supplement() {
@@ -3048,7 +3049,7 @@ pub async fn compile_shared(
30483049
.is_some_and(|cm| cm.is_enabled());
30493050
let parameters = build_parameters(&front_matter.parameters, has_memory);
30503051
let parameters_yaml = generate_parameters(&parameters)?;
3051-
let prepare_steps = generate_prepare_steps(&front_matter.steps, extensions)?;
3052+
let prepare_steps = generate_prepare_steps(&front_matter.steps, extensions, ctx)?;
30523053
let finalize_steps = generate_finalize_steps(&front_matter.post_steps);
30533054
let pr_expression = pr_filters.and_then(|f| f.expression.as_deref());
30543055
let pipeline_expression = pipeline_filters.and_then(|f| f.expression.as_deref());
@@ -6008,7 +6009,8 @@ safe-outputs:
60086009
"---\nname: test\ndescription: test\ntools:\n cache-memory: true\n---\n",
60096010
).unwrap();
60106011
let exts = crate::compile::extensions::collect_extensions(&fm);
6011-
let result = generate_prepare_steps(&[], &exts).unwrap();
6012+
let ctx = crate::compile::extensions::CompileContext::for_test(&fm);
6013+
let result = generate_prepare_steps(&[], &exts, &ctx).unwrap();
60126014
assert!(
60136015
!result.is_empty(),
60146016
"memory steps must be emitted when cache-memory enabled"
@@ -6023,7 +6025,8 @@ safe-outputs:
60236025
fn test_generate_prepare_steps_without_memory_and_no_steps_has_safeoutputs_prompt() {
60246026
let fm = minimal_front_matter();
60256027
let exts = crate::compile::extensions::collect_extensions(&fm);
6026-
let result = generate_prepare_steps(&[], &exts).unwrap();
6028+
let ctx = crate::compile::extensions::CompileContext::for_test(&fm);
6029+
let result = generate_prepare_steps(&[], &exts, &ctx).unwrap();
60276030
// SafeOutputs always contributes a prompt supplement
60286031
assert!(
60296032
result.contains("Safe Outputs"),
@@ -6037,7 +6040,8 @@ safe-outputs:
60376040
"---\nname: test\ndescription: test\ntools:\n cache-memory: true\n---\n",
60386041
).unwrap();
60396042
let exts = crate::compile::extensions::collect_extensions(&fm);
6040-
let result = generate_prepare_steps(&[], &exts).unwrap();
6043+
let ctx = crate::compile::extensions::CompileContext::for_test(&fm);
6044+
let result = generate_prepare_steps(&[], &exts, &ctx).unwrap();
60416045
assert!(
60426046
result.contains("DownloadPipelineArtifact"),
60436047
"memory steps must include the artifact download task"
@@ -6052,9 +6056,10 @@ safe-outputs:
60526056
fn test_generate_prepare_steps_without_memory_with_user_steps() {
60536057
let fm = minimal_front_matter();
60546058
let exts = crate::compile::extensions::collect_extensions(&fm);
6059+
let ctx = crate::compile::extensions::CompileContext::for_test(&fm);
60556060
let step: serde_yaml::Value =
60566061
serde_yaml::from_str("bash: echo hello\ndisplayName: greet").unwrap();
6057-
let result = generate_prepare_steps(&[step], &exts).unwrap();
6062+
let result = generate_prepare_steps(&[step], &exts, &ctx).unwrap();
60586063
assert!(!result.is_empty(), "user steps should be present");
60596064
assert!(
60606065
!result.contains("agent_memory"),
@@ -6068,9 +6073,10 @@ safe-outputs:
60686073
"---\nname: test\ndescription: test\ntools:\n cache-memory: true\n---\n",
60696074
).unwrap();
60706075
let exts = crate::compile::extensions::collect_extensions(&fm);
6076+
let ctx = crate::compile::extensions::CompileContext::for_test(&fm);
60716077
let step: serde_yaml::Value =
60726078
serde_yaml::from_str("bash: echo hello\ndisplayName: greet").unwrap();
6073-
let result = generate_prepare_steps(&[step], &exts).unwrap();
6079+
let result = generate_prepare_steps(&[step], &exts, &ctx).unwrap();
60746080
assert!(
60756081
result.contains("agent_memory"),
60766082
"memory reference must be present"
@@ -6087,7 +6093,8 @@ safe-outputs:
60876093
"---\nname: test\ndescription: test\nruntimes:\n lean: true\n---\n",
60886094
).unwrap();
60896095
let exts = crate::compile::extensions::collect_extensions(&fm);
6090-
let result = generate_prepare_steps(&[], &exts).unwrap();
6096+
let ctx = crate::compile::extensions::CompileContext::for_test(&fm);
6097+
let result = generate_prepare_steps(&[], &exts, &ctx).unwrap();
60916098
assert!(result.contains("elan-init.sh"), "should include elan installer");
60926099
assert!(result.contains("Lean 4"), "should include Lean prompt");
60936100
assert!(result.contains("--default-toolchain stable"), "should default to stable");
@@ -6100,7 +6107,8 @@ safe-outputs:
61006107
"---\nname: test\ndescription: test\nruntimes:\n lean:\n toolchain: \"leanprover/lean4:v4.29.1\"\n---\n",
61016108
).unwrap();
61026109
let exts = crate::compile::extensions::collect_extensions(&fm);
6103-
let result = generate_prepare_steps(&[], &exts).unwrap();
6110+
let ctx = crate::compile::extensions::CompileContext::for_test(&fm);
6111+
let result = generate_prepare_steps(&[], &exts, &ctx).unwrap();
61046112
assert!(
61056113
result.contains("--default-toolchain leanprover/lean4:v4.29.1"),
61066114
"should use specified toolchain"
@@ -6113,7 +6121,8 @@ safe-outputs:
61136121
"---\nname: test\ndescription: test\nruntimes:\n lean: true\ntools:\n cache-memory: true\n---\n",
61146122
).unwrap();
61156123
let exts = crate::compile::extensions::collect_extensions(&fm);
6116-
let result = generate_prepare_steps(&[], &exts).unwrap();
6124+
let ctx = crate::compile::extensions::CompileContext::for_test(&fm);
6125+
let result = generate_prepare_steps(&[], &exts, &ctx).unwrap();
61176126
assert!(result.contains("agent_memory"), "memory steps present");
61186127
assert!(result.contains("elan-init.sh"), "lean install present");
61196128
assert!(result.contains("Lean 4"), "lean prompt present");
@@ -6125,6 +6134,7 @@ safe-outputs:
61256134
fn test_generate_awf_mounts_no_extensions() {
61266135
let fm = minimal_front_matter();
61276136
let exts = crate::compile::extensions::collect_extensions(&fm);
6137+
let ctx = crate::compile::extensions::CompileContext::for_test(&fm);
61286138
let result = generate_awf_mounts(&exts);
61296139
assert_eq!(result, "\\", "no mounts should produce bare continuation");
61306140
}
@@ -6135,6 +6145,7 @@ safe-outputs:
61356145
"---\nname: test\ndescription: test\nruntimes:\n lean: true\n---\n",
61366146
).unwrap();
61376147
let exts = crate::compile::extensions::collect_extensions(&fm);
6148+
let ctx = crate::compile::extensions::CompileContext::for_test(&fm);
61386149
let result = generate_awf_mounts(&exts);
61396150
assert!(result.contains("--mount"), "should contain --mount flag");
61406151
assert!(result.contains(".elan"), "should reference .elan directory");

src/compile/extensions/ado_aw_marker.rs

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
//! older parsers, mirroring gh-aw's `# gh-aw-metadata: {...}` shape.
1818
1919
use super::{CompileContext, CompilerExtension, ExtensionPhase};
20-
use anyhow::Result;
2120

2221
// ─── ado-aw marker (always-on, internal) ─────────────────────────────
2322

@@ -43,13 +42,22 @@ impl CompilerExtension for AdoAwMarkerExtension {
4342
ExtensionPhase::Tool
4443
}
4544

46-
fn setup_steps(&self, ctx: &CompileContext) -> Result<Vec<String>> {
45+
fn prepare_steps(&self, ctx: &CompileContext) -> Vec<String> {
46+
// Inject the marker step into the Agent job's prepare phase
47+
// (NOT a separate Setup job). Setup-job injection would force
48+
// every compiled pipeline to spin up an extra agent pool job
49+
// just to emit a metadata comment — wasteful for pipelines
50+
// that have no other reason to need a Setup job. prepare_steps
51+
// lands inside the always-present Agent job's
52+
// `{{ prepare_steps }}` block, so it costs zero extra
53+
// jobs/agents/pool time.
54+
//
4755
// In unit-test contexts that build a CompileContext without an
4856
// input_path (e.g. CompileContext::for_test), skip the marker.
4957
// Production paths always populate input_path via
5058
// CompileContext::new.
5159
let Some(input_path) = ctx.input_path else {
52-
return Ok(vec![]);
60+
return vec![];
5361
};
5462

5563
let source = super::super::common::normalize_source_path(input_path);
@@ -129,7 +137,7 @@ impl CompilerExtension for AdoAwMarkerExtension {
129137
target = target,
130138
);
131139

132-
Ok(vec![step])
140+
vec![step]
133141
}
134142
}
135143

@@ -155,7 +163,7 @@ mod tests {
155163
fn returns_no_step_when_input_path_absent() {
156164
let fm = parse_fm("name: t\ndescription: x\n");
157165
let ctx = CompileContext::for_test(&fm);
158-
let steps = AdoAwMarkerExtension.setup_steps(&ctx).unwrap();
166+
let steps = AdoAwMarkerExtension.prepare_steps(&ctx);
159167
assert!(steps.is_empty(), "expected no marker when input_path is None");
160168
}
161169

@@ -173,7 +181,7 @@ mod tests {
173181
compile_dir: None,
174182
input_path: Some(input_path),
175183
};
176-
let steps = AdoAwMarkerExtension.setup_steps(&ctx).unwrap();
184+
let steps = AdoAwMarkerExtension.prepare_steps(&ctx);
177185
assert_eq!(steps.len(), 1);
178186
let step = &steps[0];
179187
assert!(step.contains("displayName: \"ado-aw\""), "step missing displayName:\n{step}");
@@ -206,7 +214,7 @@ mod tests {
206214
compile_dir: None,
207215
input_path: Some(input_path),
208216
};
209-
let steps = AdoAwMarkerExtension.setup_steps(&ctx).unwrap();
217+
let steps = AdoAwMarkerExtension.prepare_steps(&ctx);
210218
assert_eq!(steps.len(), 1);
211219
let step = &steps[0];
212220
// ADO identifiers are case-insensitive; lowercase to make
@@ -245,7 +253,7 @@ mod tests {
245253
compile_dir: None,
246254
input_path: Some(input_path),
247255
};
248-
let steps = AdoAwMarkerExtension.setup_steps(&ctx).unwrap();
256+
let steps = AdoAwMarkerExtension.prepare_steps(&ctx);
249257
assert_eq!(steps.len(), 1, "target={raw_target}");
250258
assert!(
251259
steps[0].contains(&format!("\"target\":\"{expected}\"")),
@@ -279,7 +287,7 @@ mod tests {
279287
compile_dir: None,
280288
input_path: Some(input_path),
281289
};
282-
let steps = AdoAwMarkerExtension.setup_steps(&ctx).unwrap();
290+
let steps = AdoAwMarkerExtension.prepare_steps(&ctx);
283291
assert_eq!(steps.len(), 1);
284292
let step = &steps[0];
285293
assert!(
@@ -316,7 +324,7 @@ mod tests {
316324
compile_dir: None,
317325
input_path: Some(input_path),
318326
};
319-
let steps = AdoAwMarkerExtension.setup_steps(&ctx).unwrap();
327+
let steps = AdoAwMarkerExtension.prepare_steps(&ctx);
320328
assert_eq!(steps.len(), 1);
321329
let step = &steps[0];
322330

@@ -365,7 +373,7 @@ mod tests {
365373
compile_dir: None,
366374
input_path: Some(input_path),
367375
};
368-
let steps = AdoAwMarkerExtension.setup_steps(&ctx).unwrap();
376+
let steps = AdoAwMarkerExtension.prepare_steps(&ctx);
369377
assert_eq!(steps.len(), 1);
370378

371379
// Parse the marker step back via the canonical discovery parser

src/compile/extensions/mod.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,11 @@ pub trait CompilerExtension {
288288
/// Pipeline steps (YAML strings) to run before the agent.
289289
///
290290
/// Each element is a complete YAML step (e.g., `- bash: |...`).
291-
fn prepare_steps(&self) -> Vec<String> {
291+
/// These are injected into the Agent job's `{{ prepare_steps }}`
292+
/// block — no new job/stage is created, so always-on extensions
293+
/// (like `ado-aw-marker`) can emit metadata steps with zero impact
294+
/// on pipeline structure.
295+
fn prepare_steps(&self, _ctx: &CompileContext) -> Vec<String> {
292296
vec![]
293297
}
294298

@@ -561,8 +565,8 @@ macro_rules! extension_enum {
561565
fn prompt_supplement(&self) -> Option<String> {
562566
match self { $( $Enum::$Variant(e) => e.prompt_supplement(), )+ }
563567
}
564-
fn prepare_steps(&self) -> Vec<String> {
565-
match self { $( $Enum::$Variant(e) => e.prepare_steps(), )+ }
568+
fn prepare_steps(&self, ctx: &CompileContext) -> Vec<String> {
569+
match self { $( $Enum::$Variant(e) => e.prepare_steps(ctx), )+ }
566570
}
567571
fn setup_steps(&self, ctx: &CompileContext) -> Result<Vec<String>> {
568572
match self { $( $Enum::$Variant(e) => e.setup_steps(ctx), )+ }

src/compile/extensions/tests.rs

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,9 @@ fn test_lean_prompt_supplement() {
207207
#[test]
208208
fn test_lean_prepare_steps() {
209209
let ext = LeanExtension::new(LeanRuntimeConfig::Enabled(true));
210-
let steps = ext.prepare_steps();
210+
let fm = minimal_front_matter();
211+
let ctx = ctx_from(&fm);
212+
let steps = ext.prepare_steps(&ctx);
211213
assert_eq!(steps.len(), 1);
212214
assert!(steps[0].contains("elan-init.sh"));
213215
}
@@ -324,7 +326,9 @@ fn test_ado_validate_duplicate_mcp_warning() {
324326
#[test]
325327
fn test_cache_memory_prepare_steps() {
326328
let ext = CacheMemoryExtension::new(CacheMemoryToolConfig::Enabled(true));
327-
let steps = ext.prepare_steps();
329+
let fm = minimal_front_matter();
330+
let ctx = ctx_from(&fm);
331+
let steps = ext.prepare_steps(&ctx);
328332
assert_eq!(steps.len(), 1);
329333
assert!(steps[0].contains("DownloadPipelineArtifact"));
330334
}
@@ -401,7 +405,9 @@ fn test_python_prepare_steps() {
401405
let ext = crate::runtimes::python::PythonExtension::new(
402406
crate::runtimes::python::PythonRuntimeConfig::Enabled(true),
403407
);
404-
let steps = ext.prepare_steps();
408+
let fm = minimal_front_matter();
409+
let ctx = ctx_from(&fm);
410+
let steps = ext.prepare_steps(&ctx);
405411
assert_eq!(steps.len(), 1, "no auth step without feed-url/config");
406412
assert!(steps[0].contains("UsePythonVersion@0"));
407413
}
@@ -413,7 +419,9 @@ fn test_python_prepare_steps_with_feed_url() {
413419
).unwrap();
414420
let python = fm.runtimes.as_ref().unwrap().python.as_ref().unwrap();
415421
let ext = crate::runtimes::python::PythonExtension::new(python.clone());
416-
let steps = ext.prepare_steps();
422+
let fm = minimal_front_matter();
423+
let ctx = ctx_from(&fm);
424+
let steps = ext.prepare_steps(&ctx);
417425
assert_eq!(steps.len(), 2);
418426
assert!(steps[0].contains("UsePythonVersion@0"));
419427
assert!(steps[1].contains("PipAuthenticate@1"));
@@ -543,7 +551,9 @@ fn test_node_prepare_steps() {
543551
let ext = crate::runtimes::node::NodeExtension::new(
544552
crate::runtimes::node::NodeRuntimeConfig::Enabled(true),
545553
);
546-
let steps = ext.prepare_steps();
554+
let fm = minimal_front_matter();
555+
let ctx = ctx_from(&fm);
556+
let steps = ext.prepare_steps(&ctx);
547557
assert_eq!(steps.len(), 1, "no auth steps without feed-url/config");
548558
assert!(steps[0].contains("NodeTool@0"));
549559
}
@@ -555,7 +565,9 @@ fn test_node_prepare_steps_with_feed_url() {
555565
).unwrap();
556566
let node = fm.runtimes.as_ref().unwrap().node.as_ref().unwrap();
557567
let ext = crate::runtimes::node::NodeExtension::new(node.clone());
558-
let steps = ext.prepare_steps();
568+
let fm = minimal_front_matter();
569+
let ctx = ctx_from(&fm);
570+
let steps = ext.prepare_steps(&ctx);
559571
assert_eq!(steps.len(), 3);
560572
assert!(steps[0].contains("NodeTool@0"));
561573
assert!(steps[1].contains("Ensure .npmrc"));
@@ -708,7 +720,9 @@ fn test_dotnet_prepare_steps() {
708720
let ext = crate::runtimes::dotnet::DotnetExtension::new(
709721
crate::runtimes::dotnet::DotnetRuntimeConfig::Enabled(true),
710722
);
711-
let steps = ext.prepare_steps();
723+
let fm = minimal_front_matter();
724+
let ctx = ctx_from(&fm);
725+
let steps = ext.prepare_steps(&ctx);
712726
assert_eq!(steps.len(), 1, "no auth steps without feed-url/config");
713727
assert!(steps[0].contains("UseDotNet@2"));
714728
assert!(steps[0].contains("packageType: 'sdk'"));
@@ -721,7 +735,9 @@ fn test_dotnet_prepare_steps_with_feed_url() {
721735
).unwrap();
722736
let dotnet = fm.runtimes.as_ref().unwrap().dotnet.as_ref().unwrap();
723737
let ext = crate::runtimes::dotnet::DotnetExtension::new(dotnet.clone());
724-
let steps = ext.prepare_steps();
738+
let fm = minimal_front_matter();
739+
let ctx = ctx_from(&fm);
740+
let steps = ext.prepare_steps(&ctx);
725741
assert_eq!(steps.len(), 3);
726742
assert!(steps[0].contains("UseDotNet@2"));
727743
assert!(steps[1].contains("Ensure nuget.config"));
@@ -735,7 +751,9 @@ fn test_dotnet_prepare_steps_with_config_only() {
735751
).unwrap();
736752
let dotnet = fm.runtimes.as_ref().unwrap().dotnet.as_ref().unwrap();
737753
let ext = crate::runtimes::dotnet::DotnetExtension::new(dotnet.clone());
738-
let steps = ext.prepare_steps();
754+
let fm = minimal_front_matter();
755+
let ctx = ctx_from(&fm);
756+
let steps = ext.prepare_steps(&ctx);
739757
// config: alone trusts the user-checked-in nuget.config — no shim,
740758
// just the auth step.
741759
assert_eq!(steps.len(), 2);
@@ -796,7 +814,9 @@ fn test_dotnet_global_json_sentinel_emits_use_global_json() {
796814
let dotnet = fm.runtimes.as_ref().unwrap().dotnet.as_ref().unwrap();
797815
assert!(dotnet.use_global_json());
798816
let ext = crate::runtimes::dotnet::DotnetExtension::new(dotnet.clone());
799-
let steps = ext.prepare_steps();
817+
let fm = minimal_front_matter();
818+
let ctx = ctx_from(&fm);
819+
let steps = ext.prepare_steps(&ctx);
800820
assert!(steps[0].contains("useGlobalJson: true"));
801821
assert!(!steps[0].contains("version:"), "explicit version must be omitted in global.json mode");
802822
assert!(steps[0].contains("from global.json"));

src/runtimes/dotnet/extension.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ in the repository.\n"
6262
)
6363
}
6464

65-
fn prepare_steps(&self) -> Vec<String> {
65+
fn prepare_steps(&self, _ctx: &CompileContext) -> Vec<String> {
6666
let mut steps = vec![generate_dotnet_install(&self.config)];
6767
// Emit ensure-nuget.config + NuGetAuthenticate when an internal feed
6868
// is configured. When only `config:` is set, the user-checked-in

src/runtimes/lean/extension.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ the toolchain. Lean files use the `.lean` extension.\n"
5252
)
5353
}
5454

55-
fn prepare_steps(&self) -> Vec<String> {
55+
fn prepare_steps(&self, _ctx: &CompileContext) -> Vec<String> {
5656
vec![generate_lean_install(&self.config)]
5757
}
5858

src/runtimes/node/extension.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ Node.js is installed and available. Use `node` to run scripts, \
5454
)
5555
}
5656

57-
fn prepare_steps(&self) -> Vec<String> {
57+
fn prepare_steps(&self, _ctx: &CompileContext) -> Vec<String> {
5858
let mut steps = vec![generate_node_install(&self.config)];
5959
// Emit ensure-npmrc + npmAuthenticate only when an internal feed is configured
6060
if self.config.feed_url().is_some() || self.config.config().is_some() {

src/runtimes/python/extension.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ management, install it first with `pip install uv`.\n"
5555
)
5656
}
5757

58-
fn prepare_steps(&self) -> Vec<String> {
58+
fn prepare_steps(&self, _ctx: &CompileContext) -> Vec<String> {
5959
let mut steps = vec![generate_python_install(&self.config)];
6060
// Emit PipAuthenticate only when feed-url is set (config alone is not
6161
// sufficient — PipAuthenticate needs a feed to authenticate against)

0 commit comments

Comments
 (0)