Skip to content

Commit

Permalink
restrict naming of jobs
Browse files Browse the repository at this point in the history
  • Loading branch information
Canop committed Jan 29, 2022
1 parent 92c5230 commit 0077701
Show file tree
Hide file tree
Showing 7 changed files with 101 additions and 88 deletions.
4 changes: 3 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
### next
<a name="v1.5.2"></a>
### v1.5.2 - 2022/01/29
- fix missing output of "no_run" doctests - Fix #64
- restrict naming of jobs to [\w-]+ regex (you were unlikely to use other chars due to the TOML format anyway)

<a name="v1.2.4"></a>
### v1.2.4 - 2021/11/27
Expand Down
10 changes: 5 additions & 5 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "bacon"
version = "1.2.5-dev"
version = "1.2.5"
authors = ["dystroy <[email protected]>"]
repository = "https://github.com/Canop/bacon"
description = "background rust compiler"
Expand Down
2 changes: 2 additions & 0 deletions src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ mod line_analysis;
mod line_type;
mod list_jobs;
mod mission;
mod mission_location;
mod package_config;
mod prefs;
mod report;
Expand All @@ -39,6 +40,7 @@ pub use {
line_type::*,
list_jobs::*,
mission::*,
mission_location::*,
package_config::*,
prefs::*,
report::*,
Expand Down
81 changes: 1 addition & 80 deletions src/mission.rs
Original file line number Diff line number Diff line change
@@ -1,94 +1,15 @@
use {
crate::*,
anyhow::{bail, Result},
cargo_metadata::MetadataCommand,
anyhow::Result,
notify::{RecommendedWatcher, RecursiveMode, Watcher},
std::{
collections::HashSet,
env,
fs,
iter,
path::PathBuf,
process::Command,
},
};

pub struct MissionLocation {
pub intended_dir: PathBuf,
pub package_directory: PathBuf,
pub cargo_toml_file: PathBuf,
pub intended_is_package: bool,
pub packages: Vec<cargo_metadata::Package>,
}

impl MissionLocation {
pub fn new(args: &Args) -> Result<Self> {
let intended_dir = args
.path
.as_ref()
.map_or_else(|| env::current_dir().unwrap(), PathBuf::from);
let metadata = match MetadataCommand::new().current_dir(&intended_dir).exec() {
Ok(m) => m,
Err(cargo_metadata::Error::CargoMetadata { stderr }) if cargo_manifest_not_found(&stderr) => {
bail!(
"Cargo.toml file not found.\n\
bacon must be launched \n\
* in a rust project directory\n\
* or with a rust project directory given in argument\n\
(a rust project directory contains a Cargo.toml file or has such parent)\n\
"
);
}
Err(other) => bail!(other),
};
let resolve = metadata
.resolve
.expect("cargo metadata should resolve workspace without --no-deps");
let cargo_toml_file;
let package_directory;
if let Some(resolved_root) = resolve.root {
// resolved to a single package
cargo_toml_file = metadata
.packages
.iter()
.find(|p| p.id == resolved_root)
.map(|p| p.manifest_path.as_std_path().to_path_buf())
.expect("resolved manifest was not in package list");
package_directory = cargo_toml_file
.parent()
.expect("file has no parent")
.to_path_buf();
} else {
// resolved to a virtual manifest (of a workspace)
package_directory = metadata.workspace_root.as_std_path().to_path_buf();
cargo_toml_file = package_directory.join("Cargo.toml");
}
let intended_is_package =
fs::canonicalize(&intended_dir)? == fs::canonicalize(&package_directory)?;
Ok(Self {
intended_dir,
package_directory,
cargo_toml_file,
intended_is_package,
packages: metadata.packages,
})
}
pub fn name(&self) -> String {
self.package_directory
.file_name()
.unwrap_or_else(|| self.package_directory.as_os_str())
.to_string_lossy()
.to_string()
}
pub fn package_config_path(&self) -> PathBuf {
self.package_directory.join("bacon.toml")
}
}

fn cargo_manifest_not_found(err: &str) -> bool {
err.starts_with("error: could not find `Cargo.toml`")
}

/// the description of the mission of bacon
/// after analysis of the args, env, and surroundings
#[derive(Debug)]
Expand Down
87 changes: 87 additions & 0 deletions src/mission_location.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
use {
crate::*,
anyhow::{bail, Result},
cargo_metadata::MetadataCommand,
std::{
env,
fs,
path::PathBuf,
},
};

pub struct MissionLocation {
pub intended_dir: PathBuf,
pub package_directory: PathBuf,
pub cargo_toml_file: PathBuf,
pub intended_is_package: bool,
pub packages: Vec<cargo_metadata::Package>,
}

impl MissionLocation {
pub fn new(args: &Args) -> Result<Self> {
let intended_dir = args
.path
.as_ref()
.map_or_else(|| env::current_dir().unwrap(), PathBuf::from);
let metadata = match MetadataCommand::new().current_dir(&intended_dir).exec() {
Ok(m) => m,
Err(cargo_metadata::Error::CargoMetadata { stderr }) if cargo_manifest_not_found(&stderr) => {
bail!(
"Cargo.toml file not found.\n\
bacon must be launched \n\
* in a rust project directory\n\
* or with a rust project directory given in argument\n\
(a rust project directory contains a Cargo.toml file or has such parent)\n\
"
);
}
Err(other) => bail!(other),
};
let resolve = metadata
.resolve
.expect("cargo metadata should resolve workspace without --no-deps");
let cargo_toml_file;
let package_directory;
if let Some(resolved_root) = resolve.root {
// resolved to a single package
cargo_toml_file = metadata
.packages
.iter()
.find(|p| p.id == resolved_root)
.map(|p| p.manifest_path.as_std_path().to_path_buf())
.expect("resolved manifest was not in package list");
package_directory = cargo_toml_file
.parent()
.expect("file has no parent")
.to_path_buf();
} else {
// resolved to a virtual manifest (of a workspace)
package_directory = metadata.workspace_root.as_std_path().to_path_buf();
cargo_toml_file = package_directory.join("Cargo.toml");
}
let intended_is_package =
fs::canonicalize(&intended_dir)? == fs::canonicalize(&package_directory)?;
Ok(Self {
intended_dir,
package_directory,
cargo_toml_file,
intended_is_package,
packages: metadata.packages,
})
}
pub fn name(&self) -> String {
self.package_directory
.file_name()
.unwrap_or_else(|| self.package_directory.as_os_str())
.to_string_lossy()
.to_string()
}
pub fn package_config_path(&self) -> PathBuf {
self.package_directory.join("bacon.toml")
}
}

fn cargo_manifest_not_found(err: &str) -> bool {
err.starts_with("error: could not find `Cargo.toml`")
}

3 changes: 2 additions & 1 deletion src/package_config.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
use {
crate::*,
anyhow::*,
lazy_regex::regex_is_match,
serde::Deserialize,
std::{collections::HashMap, fs, path::Path},
};
Expand All @@ -26,7 +27,7 @@ impl PackageConfig {
bail!("Invalid bacon.toml : no job found");
}
for (name, job) in &conf.jobs {
if name.is_empty() || name.contains('.') || name.contains('/') {
if !regex_is_match!(r#"^[\w-]+$"#, name) {
bail!(
"Invalid bacon.toml : Illegal job name : {:?}",
name
Expand Down

0 comments on commit 0077701

Please sign in to comment.