diff --git a/crates/fbuild-build/src/compile_backend.rs b/crates/fbuild-build/src/compile_backend.rs index 17e4111a..61aeef7b 100644 --- a/crates/fbuild-build/src/compile_backend.rs +++ b/crates/fbuild-build/src/compile_backend.rs @@ -107,7 +107,7 @@ impl fbuild_packages::library::library_compiler::LibCompileBackend for EmbeddedL &self, compiler: &std::path::Path, args: Vec, - cwd: std::path::PathBuf, + cwd: fbuild_core::path::NormalizedPath, env: Vec<(String, String)>, ) -> fbuild_core::Result { let global = get_global().ok_or_else(|| { @@ -118,7 +118,7 @@ impl fbuild_packages::library::library_compiler::LibCompileBackend for EmbeddedL ) })?; let svc = global.service(); - let compile_fut = svc.compile(compiler, args, cwd, env); + let compile_fut = svc.compile(compiler, args, cwd.into_path_buf(), env); let outcome = tokio::time::timeout(std::time::Duration::from_secs(300), compile_fut) .await .map_err(|_| { diff --git a/crates/fbuild-build/src/compiler.rs b/crates/fbuild-build/src/compiler.rs index 1e1b8a25..0a8b054e 100644 --- a/crates/fbuild-build/src/compiler.rs +++ b/crates/fbuild-build/src/compiler.rs @@ -319,14 +319,14 @@ fn object_hash_key(source: &Path, build_dir: &Path) -> String { .unwrap_or(false) { if let Some(workspace) = ancestor.parent() { - if let Ok(rel) = source.strip_prefix(workspace) { - return rel.to_string_lossy().replace('\\', "/"); - } + // The blessed compile-CWD relativization owns the + // `strip_prefix` + slash normalization (see fbuild-core). + return fbuild_core::path::path_arg_for_compile_cwd(source, workspace); } break; } } - source.to_string_lossy().replace('\\', "/") + NormalizedPath::from(source).display_slash() } /// Filter both `flags` and `extra_flags` through `unflags` using the shared diff --git a/crates/fbuild-build/src/compiler_tests.rs b/crates/fbuild-build/src/compiler_tests.rs index 544479e6..f1d0ac8c 100644 --- a/crates/fbuild-build/src/compiler_tests.rs +++ b/crates/fbuild-build/src/compiler_tests.rs @@ -123,7 +123,7 @@ fn test_needs_rebuild_missing_object() { #[test] fn test_object_path() { let path = CompilerBase::object_path(Path::new("main.cpp"), Path::new("/build")); - assert!(path.starts_with("/build")); + assert_eq!(path.parent(), Some(Path::new("/build"))); assert!(path .file_name() .unwrap_or_default() diff --git a/crates/fbuild-build/src/esp32/orchestrator/boot_artifacts.rs b/crates/fbuild-build/src/esp32/orchestrator/boot_artifacts.rs index b5bc1c38..79c9af56 100644 --- a/crates/fbuild-build/src/esp32/orchestrator/boot_artifacts.rs +++ b/crates/fbuild-build/src/esp32/orchestrator/boot_artifacts.rs @@ -3,6 +3,7 @@ use std::path::Path; use std::time::Instant; +use fbuild_core::path::NormalizedPath; use fbuild_core::Result; use super::super::mcu_config::Esp32McuConfig; @@ -132,7 +133,7 @@ pub(super) async fn prepare_boot_artifacts( let partitions_name = board.partitions.as_deref().unwrap_or("default.csv"); let parts_csv = resolve_partitions_csv( project_dir, - framework.get_partitions_csv(partitions_name), + framework.get_partitions_csv(partitions_name).into(), board.partitions.as_deref(), )?; let gen_tool = framework.get_gen_esp32part(); @@ -200,13 +201,13 @@ pub(super) async fn prepare_boot_artifacts( /// existence check keeps the historical warn-and-continue behavior. fn resolve_partitions_csv( project_dir: &Path, - framework_candidate: std::path::PathBuf, + framework_candidate: NormalizedPath, configured: Option<&str>, -) -> Result { +) -> Result { let Some(name) = configured else { return Ok(framework_candidate); }; - let project_candidate = project_dir.join(name); + let project_candidate = NormalizedPath::new(project_dir.join(name)); if project_candidate.exists() { return Ok(project_candidate); } @@ -234,11 +235,13 @@ mod tests { let resolved = resolve_partitions_csv( project, - project.join("framework/tools/partitions/config/custom.csv"), + project + .join("framework/tools/partitions/config/custom.csv") + .into(), Some("config/custom.csv"), ) .unwrap(); - assert_eq!(resolved, project.join("config/custom.csv")); + assert_eq!(resolved.as_path(), project.join("config/custom.csv")); } #[test] @@ -249,10 +252,13 @@ mod tests { std::fs::create_dir_all(&fw_dir).unwrap(); std::fs::write(fw_dir.join("huge_app.csv"), "csv").unwrap(); - let resolved = - resolve_partitions_csv(project, fw_dir.join("huge_app.csv"), Some("huge_app.csv")) - .unwrap(); - assert_eq!(resolved, fw_dir.join("huge_app.csv")); + let resolved = resolve_partitions_csv( + project, + fw_dir.join("huge_app.csv").into(), + Some("huge_app.csv"), + ) + .unwrap(); + assert_eq!(resolved.as_path(), fw_dir.join("huge_app.csv")); } #[test] @@ -262,7 +268,7 @@ mod tests { let err = resolve_partitions_csv( project, - project.join("framework/tools/partitions/nope.csv"), + project.join("framework/tools/partitions/nope.csv").into(), Some("nope.csv"), ) .unwrap_err(); @@ -275,7 +281,8 @@ mod tests { fn unconfigured_default_keeps_warn_and_continue_semantics() { let tmp = tempfile::TempDir::new().unwrap(); let missing_default = tmp.path().join("framework/tools/partitions/default.csv"); - let resolved = resolve_partitions_csv(tmp.path(), missing_default.clone(), None).unwrap(); - assert_eq!(resolved, missing_default); + let resolved = + resolve_partitions_csv(tmp.path(), missing_default.clone().into(), None).unwrap(); + assert_eq!(resolved.as_path(), missing_default.as_path()); } } diff --git a/crates/fbuild-build/src/esp32/orchestrator/build.rs b/crates/fbuild-build/src/esp32/orchestrator/build.rs index 6d21cf19..6c6847ac 100644 --- a/crates/fbuild-build/src/esp32/orchestrator/build.rs +++ b/crates/fbuild-build/src/esp32/orchestrator/build.rs @@ -793,7 +793,7 @@ impl BuildOrchestrator for Esp32Orchestrator { &flash_freq, ctx.board.max_flash, ctx.board.max_ram, - esptool_bin.clone(), + esptool_bin.clone().map(|path| path.into_path_buf()), params.verbose, ); @@ -822,7 +822,7 @@ impl BuildOrchestrator for Esp32Orchestrator { &ctx.board, &mcu_config, &flash_freq, - esptool_bin.as_deref(), + esptool_bin.as_ref().map(|path| path.as_path()), &mut perf, ) .await?; diff --git a/crates/fbuild-build/src/esp32/orchestrator/packages.rs b/crates/fbuild-build/src/esp32/orchestrator/packages.rs index a71c0987..5bfa4845 100644 --- a/crates/fbuild-build/src/esp32/orchestrator/packages.rs +++ b/crates/fbuild-build/src/esp32/orchestrator/packages.rs @@ -1,8 +1,9 @@ //! Package resolution for pioarduino (platform.json, framework, toolchain). use std::collections::HashMap; -use std::path::{Path, PathBuf}; +use std::path::Path; +use fbuild_core::path::NormalizedPath; use fbuild_core::Result; /// Resolve framework + toolchain for pioarduino mode (GCC 14 + ESP-IDF 5.x). @@ -23,7 +24,7 @@ pub(super) async fn resolve_pioarduino_packages( ) -> Result<( fbuild_packages::toolchain::Esp32Toolchain, fbuild_packages::library::Esp32Framework, - Option, + Option, )> { // Ensure pioarduino platform (contains platform.json with metadata URLs). // Honor `platform_packages = platform-espressif32@#` from the env @@ -145,7 +146,7 @@ pub(super) async fn resolve_pioarduino_packages( async fn resolve_esptool( platform: &fbuild_packages::library::Esp32Platform, project_dir: &Path, -) -> Option { +) -> Option { let url = match platform.get_package_url("tool-esptoolpy") { Ok(url) => url, Err(e) => { diff --git a/crates/fbuild-cli/src/lib_select.rs b/crates/fbuild-cli/src/lib_select.rs index 393b9e4c..343fe654 100644 --- a/crates/fbuild-cli/src/lib_select.rs +++ b/crates/fbuild-cli/src/lib_select.rs @@ -18,6 +18,7 @@ use std::path::{Path, PathBuf}; use fbuild_config::PlatformIOConfig; +use fbuild_core::path::normalize_for_key; use fbuild_core::Platform; use fbuild_library_select::{resolve, Selection}; use fbuild_packages::library::framework_library::discover_framework_libraries; @@ -333,10 +334,24 @@ fn first_reached_under(included: &[PathBuf], lib: &FrameworkLibrary) -> Option

bool { + let path_key = normalize_for_key(path); + let dir_key = normalize_for_key(dir); + if path_key == dir_key { + return true; + } + let dir_prefix = if dir_key.ends_with('/') { + dir_key + } else { + format!("{dir_key}/") + }; + path_key.starts_with(&dir_prefix) +} + fn emit_explain( project_dir: &Path, env_name: &str, @@ -433,3 +448,40 @@ fn emit_json( .expect("fbuild-cli: lib-select JSON payload is built from primitives, serialization is infallible") ); } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn normalized_path_is_under_matches_exact_path() { + assert!(normalized_path_is_under( + Path::new("/foo/bar"), + Path::new("/foo/bar") + )); + } + + #[test] + fn normalized_path_is_under_matches_nested_path() { + assert!(normalized_path_is_under( + Path::new("/foo/bar/baz.h"), + Path::new("/foo/bar") + )); + } + + #[test] + fn normalized_path_is_under_handles_dir_trailing_slash() { + assert!(normalized_path_is_under( + Path::new("/foo/bar/baz.h"), + Path::new("/foo/bar/") + )); + } + + #[test] + fn normalized_path_is_under_rejects_sibling_prefix() { + assert!(!normalized_path_is_under( + Path::new("/foo/barbaz/header.h"), + Path::new("/foo/bar") + )); + } +} diff --git a/crates/fbuild-deploy/src/lpc_debugger_reflash.rs b/crates/fbuild-deploy/src/lpc_debugger_reflash.rs index 032c6a27..8fd58a36 100644 --- a/crates/fbuild-deploy/src/lpc_debugger_reflash.rs +++ b/crates/fbuild-deploy/src/lpc_debugger_reflash.rs @@ -22,8 +22,9 @@ //! subsequent `fbuild deploy` reaches ISP mode automatically via //! `-control` alone — no more button dance. -use std::path::{Path, PathBuf}; +use std::path::Path; +use fbuild_core::path::NormalizedPath; use fbuild_core::{FbuildError, Result}; /// The vendored asset base URL — points at @@ -79,7 +80,7 @@ pub const LPC_LINK2_FIRMWARE_ENV_VAR: &str = "FBUILD_LPC_LINK2_FIRMWARE"; /// The one canonical directory fbuild caches the LPC-Link2 debugger /// tools under. Honors `FBUILD_DEV_MODE=1` for `~/.fbuild/dev/…` /// isolation, same as `find_lpc21isp` and the rest of `fbuild-paths`. -pub fn managed_tools_dir() -> Option { +pub fn managed_tools_dir() -> Option { let home = home_dir()?; let mode = if std::env::var_os("FBUILD_DEV_MODE").is_some() { "dev" @@ -109,9 +110,9 @@ pub fn asset_url(name: &str) -> String { /// Returns `None` if nothing is present; the caller emits the actionable /// "run `fbuild deploy --upgrade-debugger` once to install the tools" /// diagnostic. -pub fn find_dfu_util() -> Option { +pub fn find_dfu_util() -> Option { if let Some(env_hit) = std::env::var_os(DFU_UTIL_PATH_ENV_VAR) { - let p = PathBuf::from(env_hit); + let p = NormalizedPath::new(Path::new(&env_hit)); if p.is_file() { return Some(p); } @@ -134,9 +135,9 @@ pub fn find_dfu_util() -> Option { /// 1. `FBUILD_LPC_LINK2_FIRMWARE` env override. /// 2. `/lpc-link2-cmsis-dap-v2.hex` (preferred). /// 3. `/lpc-link2-cmsis-dap-v1.hex` (legacy fallback). -pub fn find_lpc_link2_firmware() -> Option { +pub fn find_lpc_link2_firmware() -> Option { if let Some(env_hit) = std::env::var_os(LPC_LINK2_FIRMWARE_ENV_VAR) { - let p = PathBuf::from(env_hit); + let p = NormalizedPath::new(Path::new(&env_hit)); if p.is_file() { return Some(p); } @@ -264,7 +265,7 @@ pub fn required_asset_names() -> [&'static str; 2] { /// Errors specific to the reflash flow. Wrapped into `FbuildError` at /// the deploy layer. -pub fn require_installed() -> Result<(PathBuf, PathBuf)> { +pub fn require_installed() -> Result<(NormalizedPath, NormalizedPath)> { let dfu = find_dfu_util().ok_or_else(|| FbuildError::DeployFailed(install_hint()))?; let fw = find_lpc_link2_firmware().ok_or_else(|| FbuildError::DeployFailed(install_hint()))?; Ok((dfu, fw)) @@ -273,15 +274,14 @@ pub fn require_installed() -> Result<(PathBuf, PathBuf)> { /// Resolve `$HOME` / `%USERPROFILE%`. Kept local so this module does /// not gain a `dirs` dependency for one call site — mirrors the same /// helper in `fbuild_deploy::lpc`. -fn home_dir() -> Option { +fn home_dir() -> Option { #[cfg(target_os = "windows")] { - std::env::var_os("USERPROFILE").map(PathBuf::from) - } - #[cfg(not(target_os = "windows"))] - { - std::env::var_os("HOME").map(PathBuf::from) + if let Some(value) = std::env::var_os("USERPROFILE") { + return Some(NormalizedPath::new(Path::new(&value))); + } } + std::env::var_os("HOME").map(|value| NormalizedPath::new(Path::new(&value))) } #[cfg(test)] @@ -355,7 +355,7 @@ mod tests { Some(v) => std::env::set_var(DFU_UTIL_PATH_ENV_VAR, v), None => std::env::remove_var(DFU_UTIL_PATH_ENV_VAR), } - assert_eq!(got.as_deref(), Some(fake.as_path())); + assert_eq!(got.as_ref().map(|p| p.as_path()), Some(fake.as_path())); } #[test] diff --git a/crates/fbuild-deploy/src/probe_rs.rs b/crates/fbuild-deploy/src/probe_rs.rs index 481cb675..ea90909a 100644 --- a/crates/fbuild-deploy/src/probe_rs.rs +++ b/crates/fbuild-deploy/src/probe_rs.rs @@ -31,9 +31,10 @@ //! can dispatch to it in preference to the UART-ISP path (lpc21isp), //! which requires a `SW3 + SW4` button press to enter ISP mode. -use std::path::{Path, PathBuf}; +use std::path::Path; use std::time::Duration; +use fbuild_core::path::NormalizedPath; use fbuild_core::subprocess::run_command_blocking; use fbuild_core::{FbuildError, Result}; @@ -55,7 +56,7 @@ const PROBE_RS_TIMEOUT: Duration = Duration::from_secs(120); /// /// Honors `FBUILD_DEV_MODE=1` → `~/.fbuild/dev/tools/probe-rs/` to /// match the isolation the rest of `fbuild-paths` applies. -pub fn managed_probe_rs_path() -> Option { +pub fn managed_probe_rs_path() -> Option { let exe = if cfg!(windows) { "probe-rs.exe" } else { @@ -92,9 +93,9 @@ pub fn managed_probe_rs_path() -> Option { /// distro package will lack the FastLED patches and will hang on the /// LPC-Link2 v1.0.7 firmware, which is the exact failure mode this /// module exists to avoid. -pub fn find_probe_rs() -> Option { +pub fn find_probe_rs() -> Option { if let Some(env_hit) = std::env::var_os(PROBE_RS_PATH_ENV_VAR) { - let p = PathBuf::from(env_hit); + let p = NormalizedPath::new(Path::new(&env_hit)); if p.is_file() { return Some(p); } @@ -275,14 +276,14 @@ impl ProbeRsRun { } } -fn home_dir_local() -> Option { +fn home_dir_local() -> Option { #[cfg(windows)] { if let Some(v) = std::env::var_os("USERPROFILE") { - return Some(PathBuf::from(v)); + return Some(NormalizedPath::new(Path::new(&v))); } } - std::env::var_os("HOME").map(PathBuf::from) + std::env::var_os("HOME").map(|value| NormalizedPath::new(Path::new(&value))) } #[cfg(test)] diff --git a/crates/fbuild-packages/src/library/esptool.rs b/crates/fbuild-packages/src/library/esptool.rs index 7f718861..b85dd20c 100644 --- a/crates/fbuild-packages/src/library/esptool.rs +++ b/crates/fbuild-packages/src/library/esptool.rs @@ -18,7 +18,7 @@ //! //! Flow: //! 1. The version is taken from the pioarduino `tool-esptoolpy` metadata URL -//! (`.../esptoolpy-v5.3.0.zip` → `5.3.0`) — see [`extract_esptool_version`]. +//! (`.../esptoolpy-v5.3.0.zip` → `5.3.0`) — see `extract_esptool_version`. //! 2. The host `(OS, ARCH)` maps to a tasmota platform tag //! (`linux-amd64`, `macos-arm64`, `windows-amd64`, …). An unsupported host //! yields an error, and the caller falls back to an `esptool` on PATH. @@ -26,9 +26,9 @@ //! is downloaded + extracted via the shared [`PackageBase::staged_install`] //! pattern, and the `esptool` executable is located inside it. -use std::path::{Path, PathBuf}; +use std::path::Path; -use fbuild_core::{FbuildError, Result}; +use fbuild_core::{path::NormalizedPath, FbuildError, Result}; use crate::{CacheSubdir, PackageBase}; @@ -38,7 +38,7 @@ use crate::{CacheSubdir, PackageBase}; /// pinned version) and resolved lazily in [`Self::ensure_installed`], which /// returns the path to the `esptool` executable. pub struct Esptool { - project_dir: PathBuf, + project_dir: NormalizedPath, version: String, } @@ -48,7 +48,7 @@ impl Esptool { /// embedded in the URL filename is used. pub fn from_metadata_url(project_dir: &Path, metadata_url: &str) -> Self { Self { - project_dir: project_dir.to_path_buf(), + project_dir: NormalizedPath::from(project_dir), version: extract_esptool_version(metadata_url), } } @@ -60,7 +60,7 @@ impl Esptool { /// pattern, so a warm cache costs no network I/O. Returns an error on an /// unsupported host or a missing binary, so the caller can fall back to an /// `esptool` on PATH. - pub async fn ensure_installed(&self) -> Result { + pub async fn ensure_installed(&self) -> Result { let platform = tasmota_platform_tag().ok_or_else(|| { FbuildError::PackageError(format!( "no prebuilt esptool binary for {}/{}", @@ -80,7 +80,7 @@ impl Esptool { &url, None, CacheSubdir::Toolchains, - &self.project_dir, + self.project_dir.as_path(), ); let install_path = base.staged_install(validate_esptool).await?; @@ -97,11 +97,11 @@ impl Esptool { #[cfg(unix)] { use std::os::unix::fs::PermissionsExt; - if let Ok(meta) = std::fs::metadata(&bin) { + if let Ok(meta) = std::fs::metadata(bin.as_path()) { let mut perms = meta.permissions(); if perms.mode() & 0o111 == 0 { perms.set_mode(0o755); - let _ = std::fs::set_permissions(&bin, perms); + let _ = std::fs::set_permissions(bin.as_path(), perms); } } } @@ -151,11 +151,11 @@ fn esptool_bin_name() -> &'static str { /// Locate the `esptool` executable in an extracted tree, searching the root and /// up to two levels deep (the tasmota zip nests it under /// `esptool-/esptool`). -fn find_esptool_binary(root: &Path) -> Option { - fn search(dir: &Path, depth: usize) -> Option { +fn find_esptool_binary(root: &Path) -> Option { + fn search(dir: &Path, depth: usize) -> Option { let candidate = dir.join(esptool_bin_name()); if candidate.is_file() { - return Some(candidate); + return Some(NormalizedPath::from(candidate)); } if depth == 0 { return None; @@ -250,10 +250,8 @@ mod tests { let tmp = tempfile::TempDir::new().unwrap(); let root = tmp.path(); std::fs::write(root.join(esptool_bin_name()), b"bin").unwrap(); - assert_eq!( - find_esptool_binary(root), - Some(root.join(esptool_bin_name())) - ); + let found = find_esptool_binary(root).unwrap(); + assert_eq!(found.as_path(), root.join(esptool_bin_name())); } #[test] @@ -262,10 +260,8 @@ mod tests { let inner = tmp.path().join("esptool-linux-amd64"); std::fs::create_dir_all(&inner).unwrap(); std::fs::write(inner.join(esptool_bin_name()), b"bin").unwrap(); - assert_eq!( - find_esptool_binary(tmp.path()), - Some(inner.join(esptool_bin_name())) - ); + let found = find_esptool_binary(tmp.path()).unwrap(); + assert_eq!(found.as_path(), inner.join(esptool_bin_name())); } #[test] diff --git a/crates/fbuild-packages/src/library/library_compiler.rs b/crates/fbuild-packages/src/library/library_compiler.rs index 7a1f2616..4bb2749c 100644 --- a/crates/fbuild-packages/src/library/library_compiler.rs +++ b/crates/fbuild-packages/src/library/library_compiler.rs @@ -8,6 +8,7 @@ use std::fs::Metadata; use std::path::{Path, PathBuf}; use std::time::SystemTime; +use fbuild_core::path::NormalizedPath; use fbuild_core::subprocess::run_command; use fbuild_core::{FbuildError, Result}; use sha2::{Digest, Sha256}; @@ -68,7 +69,7 @@ pub trait LibCompileBackend: Send + Sync { &self, compiler: &Path, args: Vec, - cwd: PathBuf, + cwd: NormalizedPath, env: Vec<(String, String)>, ) -> Result; } @@ -452,6 +453,7 @@ async fn compile_one_source( .map(Path::to_path_buf) .or_else(|| std::env::current_dir().ok()) .unwrap_or_else(|| PathBuf::from(".")); + let cwd = NormalizedPath::new(cwd); // No @response-file: the embedded service manages long arg lists itself. let outcome = backend.compile(compiler, sanitized, cwd, env).await?; ( @@ -723,6 +725,14 @@ fn object_path(source: &Path, obj_dir: &Path) -> PathBuf { } /// Project-workspace-relative key for the object hash (FastLED/fbuild#966). +/// +/// Relativizes the source against the project workspace (parent of the +/// `.fbuild/` component in `obj_dir`) through the blessed +/// [`fbuild_core::path::path_arg_for_compile_cwd`], which owns the +/// `strip_prefix` + slash normalization so the object name — and therefore +/// the zccache per-TU key — stays project-directory-independent. Sources +/// outside the workspace (global framework/library cache) keep their +/// absolute path, already project-independent. fn object_hash_key(source: &Path, obj_dir: &Path) -> String { for ancestor in obj_dir.ancestors() { if ancestor @@ -731,14 +741,12 @@ fn object_hash_key(source: &Path, obj_dir: &Path) -> String { .unwrap_or(false) { if let Some(workspace) = ancestor.parent() { - if let Ok(rel) = source.strip_prefix(workspace) { - return rel.to_string_lossy().replace('\\', "/"); - } + return fbuild_core::path::path_arg_for_compile_cwd(source, workspace); } break; } } - source.to_string_lossy().replace('\\', "/") + fbuild_core::path::NormalizedPath::from(source).display_slash() } #[cfg(test)] diff --git a/dylints/ban_direct_serialport/src/allowlist.txt b/dylints/ban_direct_serialport/src/allowlist.txt index df0e6c2f..61250309 100644 --- a/dylints/ban_direct_serialport/src/allowlist.txt +++ b/dylints/ban_direct_serialport/src/allowlist.txt @@ -39,6 +39,10 @@ crates/fbuild-deploy/src/reset.rs crates/fbuild-deploy/src/esp32_native/transport.rs crates/fbuild-deploy/src/esp32_native/verify.rs crates/fbuild-deploy/src/esp32_native/write.rs +crates/fbuild-deploy/src/lpc.rs + +# LPC SWD path: read-only VID/PID enumeration to decide whether probe-rs can run; no serial handle is opened. +crates/fbuild-deploy/src/probe_rs.rs crates/fbuild-deploy/src/teensy/first_byte_probe.rs crates/fbuild-deploy/src/teensy/mod.rs crates/fbuild-deploy/src/teensy/port_discovery.rs diff --git a/dylints/ban_std_pathbuf/Cargo.lock b/dylints/ban_std_pathbuf/Cargo.lock index 41969317..bf0c1559 100644 --- a/dylints/ban_std_pathbuf/Cargo.lock +++ b/dylints/ban_std_pathbuf/Cargo.lock @@ -69,7 +69,7 @@ checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" [[package]] name = "ban_std_pathbuf" -version = "0.1.0" +version = "0.2.0" dependencies = [ "dylint_linting", "dylint_testing",