Skip to content
This repository was archived by the owner on Sep 17, 2023. It is now read-only.

Commit 4d771df

Browse files
committed
fix: only write files with modifications
To avoid updating the os-level last-modified timestamp.
1 parent 338a148 commit 4d771df

File tree

1 file changed

+23
-23
lines changed

1 file changed

+23
-23
lines changed

src/main.rs

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@ use serde::{Deserialize, Serialize};
1212
use serde_json::Value;
1313
use serde_json;
1414

15-
// TODO: only write file when changes are made
16-
1715
#[derive(Parser)]
1816
#[clap(version = "1.0", author = "Eric Crosson <eric.s.crosson@utexas.edu>")]
1917
struct Opts {
@@ -76,43 +74,47 @@ fn read_lerna_package_manifests(root: &Path, lerna_manifest: &LernaManifest) ->
7674
}
7775

7876
fn get_version_by_name(internal_packages: &HashMap<String, PackageManifest>) -> HashMap<String, String> {
79-
return internal_packages
77+
internal_packages
8078
.values()
8179
.fold(HashMap::new(), |mut acc, package_manifest| {
8280
acc.insert(package_manifest.name.to_string(), package_manifest.version.to_string());
8381
acc
84-
});
82+
})
8583
}
8684

8785
fn pin_version_numbers_in_internal_packages(
88-
version_by_name: HashMap<String, String>,
8986
mut internal_packages: HashMap<String, PackageManifest>,
90-
) -> HashMap<String, PackageManifest> {
87+
) -> Result<(), Box<dyn Error>> {
9188

92-
let pin = |package_manifest: &mut PackageManifest, d| {
89+
let version_by_name = get_version_by_name(&internal_packages);
90+
91+
let pin = |package_manifest: &mut PackageManifest, d| -> bool {
92+
let mut modified = false;
9393
if let Some(deps) = package_manifest.extra_fields.get_mut(d).and_then(|v| Value::as_object_mut(v)) {
9494
for (package, version) in deps.iter_mut() {
9595
if let Some(internal_version) = version_by_name.get(package) {
96-
*version = serde_json::Value::String(internal_version.to_string());
96+
if !internal_version.eq(&*version) {
97+
modified = true;
98+
*version = serde_json::Value::String(internal_version.to_string());
99+
}
97100
}
98101
}
99102
}
103+
return modified
100104
};
101105

102-
for package_manifest in internal_packages.values_mut() {
103-
pin(package_manifest, "dependencies");
104-
pin(package_manifest, "devDependencies");
105-
pin(package_manifest, "optionalDependencies");
106-
pin(package_manifest, "peerDependencies");
106+
for (manifest_file, package_manifest) in internal_packages.iter_mut() {
107+
let updates = vec![
108+
pin(package_manifest, "dependencies"),
109+
pin(package_manifest, "devDependencies"),
110+
pin(package_manifest, "optionalDependencies"),
111+
pin(package_manifest, "peerDependencies"),
112+
];
113+
if updates.iter().any(|&update| update) {
114+
write_package_manifest(Path::new(manifest_file), package_manifest)?;
115+
}
107116
}
108117

109-
internal_packages
110-
}
111-
112-
fn write_lerna_manifests(package_manifests: &HashMap<String, PackageManifest>) -> Result<(), Box<dyn Error>> {
113-
for (manifest_file, manifest_contents) in package_manifests {
114-
write_package_manifest(Path::new(manifest_file), manifest_contents)?;
115-
}
116118
Ok(())
117119
}
118120

@@ -122,8 +124,6 @@ fn main() {
122124

123125
let lerna_manifest = read_lerna_manifest(&root).expect("Unable to read lerna manifest");
124126
let package_manifests = read_lerna_package_manifests(&root, &lerna_manifest).expect("Unable to read package manifests");
125-
let version_by_name = get_version_by_name(&package_manifests);
126127

127-
let updated_package_manifests = pin_version_numbers_in_internal_packages(version_by_name, package_manifests);
128-
write_lerna_manifests(&updated_package_manifests).expect("Unable to write package manifest");
128+
pin_version_numbers_in_internal_packages(package_manifests).expect("Unable to write package manfiests");
129129
}

0 commit comments

Comments
 (0)