mirror of https://github.com/bitcoin/bitcoin
Merge bitcoin/bitcoin#28076: util: Replace std::filesystem with util/fs.h
pull/28862/headbbbbdb0cd5
ci: Add filesystem lint check (MarcoFalke)fada2f9110
refactor: Replace <filesystem> with <util/fs.h> (MarcoFalke) Pull request description: Using `std::filesystem` is problematic: * There is a `fs` namespace wrapper for it. So having two ways to achieve the same is confusing. * Not using the `fs` wrapper is dangerous and buggy, because it disables known bugs by deleting problematic functions. Fix all issues by removing use of it and adding a linter to avoid using it again in the future. ACKs for top commit: TheCharlatan: ACKbbbbdb0cd5
fanquake: ACKbbbbdb0cd5
🦀 Tree-SHA512: 0e2d49742b08eb2635e6fce41485277cb9c40fe20b81017c391d3472a43787db1278a236825714ca1e41c9d2f59913865cfb0c649e3c8ab1fb598c849f80c660
commit
6342348072
@ -0,0 +1,7 @@
|
||||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
version = 3
|
||||
|
||||
[[package]]
|
||||
name = "test_runner"
|
||||
version = "0.1.0"
|
@ -0,0 +1,12 @@
|
||||
# Copyright (c) The Bitcoin Core developers
|
||||
# Distributed under the MIT software license, see the accompanying
|
||||
# file COPYING or https://opensource.org/license/mit/.
|
||||
|
||||
[package]
|
||||
name = "test_runner"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
@ -0,0 +1,77 @@
|
||||
// Copyright (c) The Bitcoin Core developers
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or https://opensource.org/license/mit/.
|
||||
|
||||
use std::env;
|
||||
use std::path::PathBuf;
|
||||
use std::process::Command;
|
||||
use std::process::ExitCode;
|
||||
|
||||
use String as LintError;
|
||||
|
||||
/// Return the git command
|
||||
fn git() -> Command {
|
||||
Command::new("git")
|
||||
}
|
||||
|
||||
/// Return stdout
|
||||
fn check_output(cmd: &mut std::process::Command) -> Result<String, LintError> {
|
||||
let out = cmd.output().expect("command error");
|
||||
if !out.status.success() {
|
||||
return Err(String::from_utf8_lossy(&out.stderr).to_string());
|
||||
}
|
||||
Ok(String::from_utf8(out.stdout)
|
||||
.map_err(|e| format!("{e}"))?
|
||||
.trim()
|
||||
.to_string())
|
||||
}
|
||||
|
||||
/// Return the git root as utf8, or panic
|
||||
fn get_git_root() -> String {
|
||||
check_output(git().args(["rev-parse", "--show-toplevel"])).unwrap()
|
||||
}
|
||||
|
||||
fn lint_std_filesystem() -> Result<(), LintError> {
|
||||
let found = git()
|
||||
.args([
|
||||
"grep",
|
||||
"std::filesystem",
|
||||
"--",
|
||||
"./src/",
|
||||
":(exclude)src/util/fs.h",
|
||||
])
|
||||
.status()
|
||||
.expect("command error")
|
||||
.success();
|
||||
if found {
|
||||
Err(r#"
|
||||
^^^
|
||||
Direct use of std::filesystem may be dangerous and buggy. Please include <util/fs.h> and use the
|
||||
fs:: namespace, which has unsafe filesystem functions marked as deleted.
|
||||
"#
|
||||
.to_string())
|
||||
} else {
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
fn main() -> ExitCode {
|
||||
let test_list = [("std::filesystem check", lint_std_filesystem)];
|
||||
|
||||
let git_root = PathBuf::from(get_git_root());
|
||||
|
||||
let mut test_failed = false;
|
||||
for (lint_name, lint_fn) in test_list {
|
||||
// chdir to root before each lint test
|
||||
env::set_current_dir(&git_root).unwrap();
|
||||
if let Err(err) = lint_fn() {
|
||||
println!("{err}\n^---- Failure generated from {lint_name}!");
|
||||
test_failed = true;
|
||||
}
|
||||
}
|
||||
if test_failed {
|
||||
ExitCode::FAILURE
|
||||
} else {
|
||||
ExitCode::SUCCESS
|
||||
}
|
||||
}
|
Loading…
Reference in new issue