evobench_tools/run/
dataset_dir_env_var.rs

1use std::path::{Path, PathBuf};
2
3use anyhow::{Result, bail};
4use run_git::git::GitWorkingDir;
5
6use crate::{
7    git::GitHash,
8    run::{
9        custom_parameter::CustomParameterType, key::CustomParameters,
10        versioned_dataset_dir::VersionedDatasetDir, working_directory::FetchedTags,
11    },
12};
13
14macro_rules! try_ok {
15    { $e:expr } =>  {
16        match $e {
17            Some(v) => v,
18            None => return Ok(None)
19        }
20    }
21}
22
23/// Find the matching dataset if both the
24/// `versioned_datasets_base_dir` config and the `DATASET` custom
25/// parameter values are provided. Wants to be assured via
26/// `fetched_tags` that `git fetch --tags` was run (see methods that
27/// return a `FetchedTags`).
28pub fn dataset_dir_for(
29    // If those two are given:
30    versioned_datasets_base_dir: Option<&Path>,
31    custom_parameters: &CustomParameters,
32    // then calculate the result using them and those:
33    versioned_dataset_dir: &VersionedDatasetDir,
34    git_working_dir: &GitWorkingDir,
35    commit_id: &GitHash,
36    fetched_tags: FetchedTags,
37) -> Result<Option<PathBuf>> {
38    if fetched_tags != FetchedTags::Yes {
39        bail!("dataset_dir_for: require updated tags, but got {fetched_tags:?}")
40    }
41
42    let versioned_datasets_base_dir = try_ok!(versioned_datasets_base_dir);
43
44    let key = "DATASET";
45    let dataset_name = try_ok!(
46        custom_parameters
47            .btree_map()
48            .get(&key.parse().expect("fits requirements"))
49    );
50
51    let ty = dataset_name.r#type();
52    if ty != CustomParameterType::Dirname {
53        bail!("custom parameter {key:?} is expected to be a Dirname, but is defined as {ty:?}")
54    }
55
56    let vdirlock = versioned_dataset_dir.updated_git_graph(git_working_dir, commit_id)?;
57
58    Ok(Some(vdirlock.dataset_dir_for_commit(
59        versioned_datasets_base_dir,
60        dataset_name.as_str(),
61    )?))
62}