From f6dbe94bac8fdbc6cb972648bee1b15282c7e712 Mon Sep 17 00:00:00 2001 From: Luke Street Date: Sun, 27 Nov 2022 23:43:46 -0500 Subject: [PATCH] Add -o option to shasum --- .gitignore | 2 +- Cargo.lock | 79 +++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 3 +- src/cmd/shasum.rs | 23 ++++++++++++-- 4 files changed, 103 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index c1ee0b9..d81f12e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,2 @@ -/build +/target /.idea diff --git a/Cargo.lock b/Cargo.lock index 7af6e72..46dc2e5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -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" diff --git a/Cargo.toml b/Cargo.toml index ec136a1..9e2924f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,7 +3,7 @@ name = "decomp-toolkit" description = "GameCube/Wii decompilation project tools." authors = ["Luke Street "] 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" diff --git a/src/cmd/shasum.rs b/src/cmd/shasum.rs index ede2a94..d6f2b63 100644 --- a/src/cmd/shasum.rs +++ b/src/cmd/shasum.rs @@ -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, } 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> { hasher.update(&buf[0..read]); }) } + +fn touch>(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), + } + } +}