Skip to content

Commit d5ccd3c

Browse files
committed
add common incremental_create_execution_output_dir
1 parent 0ae965c commit d5ccd3c

File tree

3 files changed

+33
-44
lines changed

3 files changed

+33
-44
lines changed

extensions/scarb-execute/src/lib.rs

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ use cairo_vm::{Felt252, cairo_run};
1919
use camino::{Utf8Path, Utf8PathBuf};
2020
use create_output_dir::{
2121
EXECUTE_PRINT_OUTPUT_FILENAME, EXECUTE_PROGRAM_OUTPUT_FILENAME, create_output_dir,
22+
incremental_create_execution_output_dir,
2223
};
2324
use indoc::formatdoc;
2425
use scarb_extensions_cli::execute::{
@@ -38,7 +39,6 @@ mod profiler;
3839

3940
pub(crate) mod output;
4041

41-
const MAX_ITERATION_COUNT: usize = 10000;
4242
const EXECUTION_ID_ENV: &str = "SCARB_EXECUTION_ID";
4343

4444
pub fn main_inner(args: Args, ui: Ui) -> Result<()> {
@@ -478,24 +478,7 @@ fn get_or_create_output_dir(output_dir: &Utf8Path) -> Result<Utf8PathBuf> {
478478
);
479479
return Ok(execution_output_dir);
480480
}
481-
incremental_create_output_dir(output_dir)
482-
}
483-
484-
fn incremental_create_output_dir(path: &Utf8Path) -> Result<Utf8PathBuf> {
485-
for i in 1..=MAX_ITERATION_COUNT {
486-
let filepath = path.join(format!("execution{i}"));
487-
let result = fs::create_dir(&filepath);
488-
return match result {
489-
Err(e) => {
490-
if e.kind() == io::ErrorKind::AlreadyExists {
491-
continue;
492-
}
493-
Err(e.into())
494-
}
495-
Ok(_) => Ok(filepath),
496-
};
497-
}
498-
bail!("failed to create output directory")
481+
incremental_create_execution_output_dir(output_dir).map(|(path, _execution_id)| path)
499482
}
500483

501484
/// Writer implementation for a file.

extensions/scarb-prove/src/main.rs

Lines changed: 5 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
#![deny(clippy::dbg_macro)]
22
#![deny(clippy::disallowed_methods)]
33

4-
use anyhow::{Context, Result, bail, ensure};
4+
use anyhow::{Context, Result, ensure};
55
use camino::{Utf8Path, Utf8PathBuf};
66
use clap::Parser;
7-
use create_output_dir::create_output_dir;
7+
use create_output_dir::{create_output_dir, incremental_create_execution_output_dir};
88
use indoc::{formatdoc, indoc};
99
use mimalloc::MiMalloc;
1010
use scarb_extensions_cli::execute::ToArgs;
@@ -13,9 +13,9 @@ use scarb_metadata::{Metadata, MetadataCommand, ScarbCommand};
1313
use scarb_ui::args::{PackagesFilter, ToEnvVars};
1414
use scarb_ui::components::Status;
1515
use scarb_ui::{OutputFormat, Ui};
16+
use std::env;
1617
use std::fs;
1718
use std::process::ExitCode;
18-
use std::{env, io};
1919
use stwo_cairo_adapter::vm_import::adapt_vm_output;
2020
use stwo_cairo_prover::cairo_air::prover::{
2121
ProverConfig, ProverParameters, default_prod_prover_parameters, prove_cairo,
@@ -25,8 +25,6 @@ use stwo_cairo_prover::stwo_prover::core::vcs::blake2_merkle::Blake2sMerkleChann
2525
#[global_allocator]
2626
static GLOBAL: MiMalloc = MiMalloc;
2727

28-
const MAX_ITERATION_COUNT: usize = 10000;
29-
3028
fn main() -> ExitCode {
3129
let args = Args::parse();
3230
let ui = Ui::new(args.verbose.clone().into(), OutputFormat::Text);
@@ -65,7 +63,8 @@ fn main_inner(args: Args, ui: Ui) -> Result<()> {
6563
let scarb_target_dir = Utf8PathBuf::from(env::var("SCARB_TARGET_DIR")?);
6664
let output_dir = scarb_target_dir.join("execute").join(&package.name);
6765
create_output_dir(output_dir.as_std_path())?;
68-
let (_execution_output_dir, execution_id) = incremental_create_output_dir(&output_dir)?;
66+
let (_execution_output_dir, execution_id) =
67+
incremental_create_execution_output_dir(&output_dir)?;
6968

7069
let filter = PackagesFilter::generate_for::<Metadata>(vec![package.clone()].iter());
7170
ScarbCommand::new()
@@ -163,20 +162,3 @@ fn display_path(scarb_target_dir: &Utf8Path, output_path: &Utf8Path) -> String {
163162
Err(_) => output_path.to_string(),
164163
}
165164
}
166-
167-
fn incremental_create_output_dir(path: &Utf8Path) -> Result<(Utf8PathBuf, usize)> {
168-
for i in 1..=MAX_ITERATION_COUNT {
169-
let filepath = path.join(format!("execution{i}"));
170-
let result = fs::create_dir(&filepath);
171-
return match result {
172-
Err(e) => {
173-
if e.kind() == io::ErrorKind::AlreadyExists {
174-
continue;
175-
}
176-
Err(e.into())
177-
}
178-
Ok(_) => Ok((filepath, i)),
179-
};
180-
}
181-
bail!("failed to create output directory")
182-
}

utils/create-output-dir/src/lib.rs

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,13 @@
66
//!
77
//! [cargo-util-fn]: https://docs.rs/cargo-util/latest/cargo_util/paths/fn.create_dir_all_excluded_from_backups_atomic.html
88
9-
use anyhow::{Context, Result};
9+
use anyhow::{bail, Context, Result};
1010
use std::ffi::OsStr;
1111
use std::path::Path;
12-
use std::{env, fs};
12+
use std::{env, fs, io};
13+
use camino::{Utf8Path, Utf8PathBuf};
14+
15+
const MAX_ITERATION_COUNT: usize = 10000;
1316

1417
/// Maximum number of iterations to try when creating an incremental output directory using [`incremental_create_execution_output_dir`].
1518
const MAX_ITERATION_COUNT: usize = 10000;
@@ -63,6 +66,27 @@ pub fn create_output_dir(path: &Path) -> Result<()> {
6366
Ok(())
6467
}
6568

69+
/// Creates an incremental execution output dir inside the given path.
70+
/// The dir name is `execution{N}` with the lowest `N` without existing dir.
71+
///
72+
/// Returns the path to the created directory and corresponding `N`.
73+
pub fn incremental_create_execution_output_dir(path: &Utf8Path) -> Result<(Utf8PathBuf, usize)> {
74+
for i in 1..=MAX_ITERATION_COUNT {
75+
let filepath = path.join(format!("execution{i}"));
76+
let result = fs::create_dir(&filepath);
77+
return match result {
78+
Err(e) => {
79+
if e.kind() == io::ErrorKind::AlreadyExists {
80+
continue;
81+
}
82+
Err(e.into())
83+
}
84+
Ok(_) => Ok((filepath, i)),
85+
};
86+
}
87+
bail!("failed to create output directory")
88+
}
89+
6690
/// Marks the directory as excluded from archives/backups.
6791
///
6892
/// This is recommended to prevent derived/temporary files from bloating backups.

0 commit comments

Comments
 (0)