diff options
Diffstat (limited to 'crates/driver/src/context.rs')
-rw-r--r-- | crates/driver/src/context.rs | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/crates/driver/src/context.rs b/crates/driver/src/context.rs index c3ca79f..ccb8581 100644 --- a/crates/driver/src/context.rs +++ b/crates/driver/src/context.rs @@ -140,13 +140,13 @@ fn platform_relation(args: &TaskArgs, from: &str, to: &str) -> Option<PlatformRe pub struct Context { platforms: HashMap<String, Arg>, globals: TaskArgs, - tasks: HashMap<TaskID, TaskDef>, + tasks: HashMap<TaskID, Vec<TaskDef>>, rootfs: (ArchiveHash, String), rootfs_tasks: HashMap<TaskID, TaskDef>, } impl Context { - pub fn new(tasks: HashMap<TaskID, TaskDef>, pins: Pins) -> error::Result<Self> { + pub fn new(tasks: HashMap<TaskID, Vec<TaskDef>>, pins: Pins) -> error::Result<Self> { let platforms: HashMap<_, _> = [ arg( "build", @@ -270,15 +270,29 @@ impl Context { Some(task_def) } + fn select_task(tasks: &[TaskDef]) -> &TaskDef { + tasks + .iter() + .max_by(|task1, task2| { + deb_version::compare_versions( + task1.meta.version.as_deref().unwrap_or_default(), + task2.meta.version.as_deref().unwrap_or_default(), + ) + }) + .unwrap() + } + fn get_with_args<'ctx>(&'ctx self, id: &'ctx TaskID, args: &TaskArgs) -> Result<&TaskDef> { if let Some(rootfs_task) = self.rootfs_task(id, args) { return Ok(rootfs_task); } - self.tasks.get(id).ok_or(Error { + let tasks = self.tasks.get(id).ok_or(Error { task: id, kind: ErrorKind::TaskNotFound, - }) + })?; + + Ok(Self::select_task(tasks)) } pub fn get<'ctx>(&'ctx self, task: &TaskRef<'ctx>) -> Result<&TaskDef> { |