mirror of
https://github.com/astral-sh/uv
synced 2026-01-22 05:50:25 -05:00
Cargo is currently recompiling uv-python on every invocation because the minified JSON output file is getting a mod time newer than the last run. Instead, set the mod time of the output file to the same as the input file.
76 lines
2.2 KiB
Rust
76 lines
2.2 KiB
Rust
#[allow(clippy::disallowed_types)]
|
|
use std::fs::{File, FileTimes};
|
|
use std::io::Write;
|
|
use std::path::PathBuf;
|
|
use std::{env, fs};
|
|
|
|
fn process_json(data: &serde_json::Value) -> serde_json::Value {
|
|
let mut out_data = serde_json::Map::new();
|
|
|
|
if let Some(obj) = data.as_object() {
|
|
for (key, value) in obj {
|
|
out_data.insert(key.clone(), value.clone());
|
|
}
|
|
}
|
|
|
|
serde_json::Value::Object(out_data)
|
|
}
|
|
|
|
fn main() {
|
|
let version_metadata = PathBuf::from_iter([
|
|
env::var("CARGO_MANIFEST_DIR").unwrap(),
|
|
"download-metadata.json".into(),
|
|
]);
|
|
|
|
let version_metadata_minified = PathBuf::from_iter([
|
|
env::var("OUT_DIR").unwrap(),
|
|
"download-metadata-minified.json".into(),
|
|
]);
|
|
|
|
println!(
|
|
"cargo::rerun-if-changed={}",
|
|
version_metadata.to_str().unwrap()
|
|
);
|
|
|
|
println!(
|
|
"cargo::rerun-if-changed={}",
|
|
version_metadata_minified.to_str().unwrap()
|
|
);
|
|
|
|
let json_data: serde_json::Value = serde_json::from_str(
|
|
#[allow(clippy::disallowed_methods)]
|
|
&fs::read_to_string(&version_metadata).expect("Failed to read download-metadata.json"),
|
|
)
|
|
.expect("Failed to parse JSON");
|
|
|
|
let filtered_data = process_json(&json_data);
|
|
|
|
#[allow(clippy::disallowed_types)]
|
|
let mut out_file = File::create(version_metadata_minified)
|
|
.expect("failed to open download-metadata-minified.json");
|
|
|
|
#[allow(clippy::disallowed_methods)]
|
|
out_file
|
|
.write_all(
|
|
serde_json::to_string(&filtered_data)
|
|
.expect("Failed to serialize JSON")
|
|
.as_bytes(),
|
|
)
|
|
.expect("Failed to write minified JSON");
|
|
|
|
// Cargo uses the modified times of the paths specified in
|
|
// `rerun-if-changed`, so fetch the current file times and set them the same
|
|
// on the output file.
|
|
#[allow(clippy::disallowed_methods)]
|
|
let meta =
|
|
fs::metadata(version_metadata).expect("failed to read metadata for download-metadata.json");
|
|
|
|
out_file
|
|
.set_times(
|
|
FileTimes::new()
|
|
.set_accessed(meta.accessed().unwrap())
|
|
.set_modified(meta.modified().unwrap()),
|
|
)
|
|
.expect("failed to write file times to download-metadata-minified.json");
|
|
}
|