@@ -12,8 +12,6 @@ use serde::{Deserialize, Serialize};
12
12
use serde_json:: Value ;
13
13
use serde_json;
14
14
15
- // TODO: only write file when changes are made
16
-
17
15
#[ derive( Parser ) ]
18
16
#[ clap( version = "1.0" , author = "Eric Crosson <eric.s.crosson@utexas.edu>" ) ]
19
17
struct Opts {
@@ -76,43 +74,47 @@ fn read_lerna_package_manifests(root: &Path, lerna_manifest: &LernaManifest) ->
76
74
}
77
75
78
76
fn get_version_by_name ( internal_packages : & HashMap < String , PackageManifest > ) -> HashMap < String , String > {
79
- return internal_packages
77
+ internal_packages
80
78
. values ( )
81
79
. fold ( HashMap :: new ( ) , |mut acc, package_manifest| {
82
80
acc. insert ( package_manifest. name . to_string ( ) , package_manifest. version . to_string ( ) ) ;
83
81
acc
84
- } ) ;
82
+ } )
85
83
}
86
84
87
85
fn pin_version_numbers_in_internal_packages (
88
- version_by_name : HashMap < String , String > ,
89
86
mut internal_packages : HashMap < String , PackageManifest > ,
90
- ) -> HashMap < String , PackageManifest > {
87
+ ) -> Result < ( ) , Box < dyn Error > > {
91
88
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 ;
93
93
if let Some ( deps) = package_manifest. extra_fields . get_mut ( d) . and_then ( |v| Value :: as_object_mut ( v) ) {
94
94
for ( package, version) in deps. iter_mut ( ) {
95
95
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
+ }
97
100
}
98
101
}
99
102
}
103
+ return modified
100
104
} ;
101
105
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
+ }
107
116
}
108
117
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
- }
116
118
Ok ( ( ) )
117
119
}
118
120
@@ -122,8 +124,6 @@ fn main() {
122
124
123
125
let lerna_manifest = read_lerna_manifest ( & root) . expect ( "Unable to read lerna manifest" ) ;
124
126
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) ;
126
127
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" ) ;
129
129
}
0 commit comments