Merge pull request #1270 from AleoHQ/feature-clean-ast-snapshots

[Feature] Removes AST snapshots on leo clean
This commit is contained in:
Alessandro Coglio 2021-08-19 09:07:30 -07:00 committed by GitHub
commit b3bcf1c6cf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 134 additions and 5 deletions

View File

@ -218,19 +218,19 @@ create_errors!(
help: None,
}
/// For when reading the prooving key failed.
/// For when reading the proving key failed.
@backtraced
failed_to_read_proving_key_file {
args: (path: impl Debug),
msg: format!("Cannot read prooving key file from the provided file path - {:?}", path),
msg: format!("Cannot read proving key file from the provided file path - {:?}", path),
help: None,
}
/// For when removing the prooving key file failed.
/// For when removing the proving key file failed.
@backtraced
failed_to_remove_proving_key_file {
args: (path: impl Debug),
msg: format!("Cannot remove prooving key file from the provided file path - {:?}", path),
msg: format!("Cannot remove proving key file from the provided file path - {:?}", path),
help: None,
}
@ -242,6 +242,22 @@ create_errors!(
help: None,
}
/// For when reading the snapshot file failed.
@backtraced
failed_to_read_snapshot_file {
args: (path: impl Debug),
msg: format!("Cannot read snapshot file from the provided file path - {:?}", path),
help: None,
}
/// For when removing the snapshot file failed.
@backtraced
failed_to_remove_snapshot_file {
args: (path: impl Debug),
msg: format!("Cannot remove snapshot file from the provided file path - {:?}", path),
help: None,
}
/// For when reading the verification key file failed.
@backtraced
failed_to_read_verification_key_file {

View File

@ -17,7 +17,9 @@
use crate::{commands::Command, context::Context};
use leo_compiler::OutputFile;
use leo_errors::Result;
use leo_package::outputs::{ChecksumFile, CircuitFile, ProofFile, ProvingKeyFile, VerificationKeyFile};
use leo_package::outputs::{
ChecksumFile, CircuitFile, ProofFile, ProvingKeyFile, Snapshot, SnapshotFile, VerificationKeyFile,
};
use structopt::StructOpt;
use tracing::span::Span;
@ -61,6 +63,11 @@ impl Command for Clean {
// Remove the proof from the output directory
ProofFile::new(&package_name).remove(&path)?;
// Remove AST snapshots from the output directory
SnapshotFile::new(&package_name, Snapshot::Initial).remove(&path)?;
SnapshotFile::new(&package_name, Snapshot::TypeInference).remove(&path)?;
SnapshotFile::new(&package_name, Snapshot::Canonicalization).remove(&path)?;
Ok(())
}
}

View File

@ -0,0 +1,103 @@
// Copyright (C) 2019-2021 Aleo Systems Inc.
// This file is part of the Leo library.
// The Leo library is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// The Leo library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with the Leo library. If not, see <https://www.gnu.org/licenses/>.
//! The serialized circuit output file.
use crate::outputs::OUTPUTS_DIRECTORY_NAME;
use leo_errors::{PackageError, Result};
use serde::Deserialize;
use std::{borrow::Cow, fmt, fs, path::Path};
/// Enum to handle all 3 types of snapshots.
#[derive(Deserialize)]
pub enum Snapshot {
Initial,
TypeInference,
Canonicalization,
}
impl fmt::Display for Snapshot {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(
f,
"{}",
match self {
Self::Initial => "initial_ast",
Self::TypeInference => "type_inferenced_ast",
Self::Canonicalization => "canonicalization_ast",
}
)
}
}
pub static AST_SNAPSHOT_FILE_EXTENSION: &str = ".json";
/// Generic Snapshot file wrapper. Each package can have up to 3
/// different snapshots: initial_ast, canonicalization_ast and type_inferenced_ast;
#[derive(Deserialize)]
pub struct SnapshotFile {
pub package_name: String,
pub snapshot: Snapshot,
}
impl SnapshotFile {
pub fn new(package_name: &str, snapshot: Snapshot) -> Self {
Self {
package_name: package_name.to_string(),
snapshot,
}
}
pub fn exists_at(&self, path: &Path) -> bool {
let path = self.snapshot_file_path(path);
path.exists()
}
/// Reads the serialized circuit from the given file path if it exists.
pub fn read_from(&self, path: &Path) -> Result<String> {
let path = self.snapshot_file_path(path);
let result =
fs::read_to_string(&path).map_err(|_| PackageError::failed_to_read_snapshot_file(path.into_owned()))?;
Ok(result)
}
/// Removes the serialized circuit at the given path if it exists. Returns `true` on success,
/// `false` if the file doesn't exist, and `Error` if the file system fails during operation.
pub fn remove(&self, path: &Path) -> Result<bool> {
let path = self.snapshot_file_path(path);
if !path.exists() {
return Ok(false);
}
fs::remove_file(&path).map_err(|_| PackageError::failed_to_remove_snapshot_file(path.into_owned()))?;
Ok(true)
}
fn snapshot_file_path<'a>(&self, path: &'a Path) -> Cow<'a, Path> {
let mut path = Cow::from(path);
if path.is_dir() {
if !path.ends_with(OUTPUTS_DIRECTORY_NAME) {
path.to_mut().push(OUTPUTS_DIRECTORY_NAME);
}
path.to_mut()
.push(format!("{}{}", self.snapshot, AST_SNAPSHOT_FILE_EXTENSION));
}
path
}
}

View File

@ -14,6 +14,9 @@
// You should have received a copy of the GNU General Public License
// along with the Leo library. If not, see <https://www.gnu.org/licenses/>.
pub mod ast_snapshot;
pub use self::ast_snapshot::*;
pub mod circuit;
pub use self::circuit::*;