Add -o option to shasum

This commit is contained in:
Luke Street 2022-11-27 23:43:46 -05:00
parent a1cf93e605
commit f6dbe94bac
4 changed files with 103 additions and 4 deletions

2
.gitignore vendored
View File

@ -1,2 +1,2 @@
/build
/target
/.idea

79
Cargo.lock generated
View File

@ -129,6 +129,7 @@ dependencies = [
"argh",
"base16ct",
"cwdemangle",
"filetime",
"hex",
"lazy_static",
"log",
@ -186,6 +187,18 @@ dependencies = [
"termcolor",
]
[[package]]
name = "filetime"
version = "0.2.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4b9663d381d07ae25dc88dbdf27df458faa83a9b25336bcac83d5e452b5fc9d3"
dependencies = [
"cfg-if",
"libc",
"redox_syscall",
"windows-sys",
]
[[package]]
name = "form_urlencoded"
version = "1.1.0"
@ -433,6 +446,15 @@ dependencies = [
"proc-macro2",
]
[[package]]
name = "redox_syscall"
version = "0.2.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
dependencies = [
"bitflags",
]
[[package]]
name = "regex"
version = "1.7.0"
@ -657,3 +679,60 @@ name = "winapi-x86_64-pc-windows-gnu"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
[[package]]
name = "windows-sys"
version = "0.42.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7"
dependencies = [
"windows_aarch64_gnullvm",
"windows_aarch64_msvc",
"windows_i686_gnu",
"windows_i686_msvc",
"windows_x86_64_gnu",
"windows_x86_64_gnullvm",
"windows_x86_64_msvc",
]
[[package]]
name = "windows_aarch64_gnullvm"
version = "0.42.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "41d2aa71f6f0cbe00ae5167d90ef3cfe66527d6f613ca78ac8024c3ccab9a19e"
[[package]]
name = "windows_aarch64_msvc"
version = "0.42.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dd0f252f5a35cac83d6311b2e795981f5ee6e67eb1f9a7f64eb4500fbc4dcdb4"
[[package]]
name = "windows_i686_gnu"
version = "0.42.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fbeae19f6716841636c28d695375df17562ca208b2b7d0dc47635a50ae6c5de7"
[[package]]
name = "windows_i686_msvc"
version = "0.42.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "84c12f65daa39dd2babe6e442988fc329d6243fdce47d7d2d155b8d874862246"
[[package]]
name = "windows_x86_64_gnu"
version = "0.42.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bf7b1b21b5362cbc318f686150e5bcea75ecedc74dd157d874d754a2ca44b0ed"
[[package]]
name = "windows_x86_64_gnullvm"
version = "0.42.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "09d525d2ba30eeb3297665bd434a54297e4170c7f1a44cad4ef58095b4cd2028"
[[package]]
name = "windows_x86_64_msvc"
version = "0.42.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f40009d85759725a34da6d89a94e63d7bdc50a862acf0dbc7c8e488f1edcb6f5"

View File

@ -3,7 +3,7 @@ name = "decomp-toolkit"
description = "GameCube/Wii decompilation project tools."
authors = ["Luke Street <luke@street.dev>"]
license = "MIT OR Apache-2.0"
version = "0.1.0"
version = "0.1.1"
edition = "2021"
publish = false
build = "build.rs"
@ -20,6 +20,7 @@ anyhow = "1.0.64"
argh = "0.1.8"
base16ct = "0.1.1"
cwdemangle = "0.1.3"
filetime = "0.2.18"
hex = "0.4.3"
lazy_static = "1.4.0"
log = "0.4.17"

View File

@ -1,10 +1,12 @@
use std::{
fs::File,
fs::{File, OpenOptions},
io::{BufRead, BufReader, Read},
path::Path,
};
use anyhow::{Context, Error, Result};
use argh::FromArgs;
use filetime::{set_file_mtime, FileTime};
use sha1::{Digest, Sha1};
#[derive(FromArgs, PartialEq, Eq, Debug)]
@ -17,6 +19,9 @@ pub struct Args {
#[argh(positional)]
/// path to file
file: String,
#[argh(option, short = 'o')]
/// touch output file on successful check
output: Option<String>,
}
const DEFAULT_BUF_SIZE: usize = 8192;
@ -31,7 +36,7 @@ pub fn run(args: Args) -> Result<()> {
}
}
fn check(_args: Args, file: File) -> Result<()> {
fn check(args: Args, file: File) -> Result<()> {
let reader = BufReader::new(file);
let mut mismatches = 0usize;
for line in reader.lines() {
@ -63,6 +68,9 @@ fn check(_args: Args, file: File) -> Result<()> {
eprintln!("WARNING: {} computed checksum did NOT match", mismatches);
std::process::exit(1);
}
if let Some(out_path) = args.output {
touch(&out_path).with_context(|| format!("Failed to touch output file '{}'", out_path))?;
}
Ok(())
}
@ -86,3 +94,14 @@ fn file_sha1(mut file: File) -> Result<sha1::digest::Output<Sha1>> {
hasher.update(&buf[0..read]);
})
}
fn touch<P: AsRef<Path>>(path: P) -> std::io::Result<()> {
if path.as_ref().exists() {
set_file_mtime(path, FileTime::now())
} else {
match OpenOptions::new().create(true).write(true).open(path) {
Ok(_) => Ok(()),
Err(e) => Err(e),
}
}
}