1
1
use std:: collections:: HashMap ;
2
2
use std:: error:: Error ;
3
3
use std:: fs:: File ;
4
- use std:: io:: { BufReader , BufWriter } ;
4
+ use std:: io:: { BufReader , BufWriter , Write } ;
5
5
use std:: path:: Path ;
6
6
7
7
use clap:: Parser ;
8
8
9
9
use glob:: glob;
10
10
11
11
use serde:: { Deserialize , Serialize } ;
12
+ use serde_json:: Value ;
12
13
use serde_json;
13
14
15
+ // TODO: only write file when changes are made
16
+
14
17
#[ derive( Parser ) ]
15
18
#[ clap( version = "1.0" , author = "Eric Crosson <eric.s.crosson@utexas.edu>" ) ]
16
19
struct Opts {
@@ -46,21 +49,30 @@ fn read_package_manifest(manifest: &Path) -> Result<PackageManifest, Box<dyn Err
46
49
Ok ( u)
47
50
}
48
51
49
- fn read_lerna_package_manifests ( root : & Path , lerna_manifest : & LernaManifest ) -> HashMap < String , PackageManifest > {
52
+ fn write_package_manifest ( path : & Path , manifest : & PackageManifest ) -> Result < ( ) , Box < dyn Error > > {
53
+ let file = File :: create ( path) ?;
54
+ let mut writer = BufWriter :: new ( file) ;
55
+ serde_json:: to_writer_pretty ( & mut writer, manifest) ?;
56
+ writer. write_all ( b"\n " ) ?;
57
+ writer. flush ( ) ?;
58
+ Ok ( ( ) )
59
+ }
60
+
61
+ fn read_lerna_package_manifests ( root : & Path , lerna_manifest : & LernaManifest ) -> Result < HashMap < String , PackageManifest > , Box < dyn Error > > {
50
62
51
63
let mut package_manifests: HashMap < String , PackageManifest > = HashMap :: new ( ) ;
52
64
53
65
for package in & lerna_manifest. packages {
54
66
let glob_path = root. join ( package) . join ( "package.json" ) ;
55
67
let glob_str = glob_path. to_str ( ) . expect ( "Path is not a valid UTF-8 sequence" ) ;
56
68
for package_manifest_path in glob ( & glob_str) . unwrap ( ) . filter_map ( Result :: ok) {
57
- let package_manifest_contents = read_package_manifest ( & package_manifest_path) . expect ( "Unable to read package manifest" ) ;
69
+ let package_manifest_contents = read_package_manifest ( & package_manifest_path) ? ;
58
70
let package_manifest = package_manifest_path. into_os_string ( ) . into_string ( ) . unwrap ( ) ;
59
71
package_manifests. insert ( package_manifest, package_manifest_contents) ;
60
72
}
61
73
}
62
74
63
- package_manifests
75
+ Ok ( package_manifests)
64
76
}
65
77
66
78
fn get_version_by_name ( internal_packages : & HashMap < String , PackageManifest > ) -> HashMap < String , String > {
@@ -77,59 +89,41 @@ fn pin_version_numbers_in_internal_packages(
77
89
mut internal_packages : HashMap < String , PackageManifest > ,
78
90
) -> HashMap < String , PackageManifest > {
79
91
80
- for package_manifest in internal_packages. values_mut ( ) {
81
- if let Some ( deps) = package_manifest. extra_fields . get_mut ( "dependencies" ) . and_then ( |v| serde_json:: Value :: as_object_mut ( v) ) {
82
- for ( package, version) in deps. iter_mut ( ) {
83
- if let Some ( internal_version) = version_by_name. get ( package) {
84
- * version = serde_json:: Value :: String ( internal_version. to_string ( ) ) ;
85
- }
86
- }
87
- }
88
- if let Some ( deps) = package_manifest. extra_fields . get_mut ( "devDependencies" ) . and_then ( |v| serde_json:: Value :: as_object_mut ( v) ) {
89
- for ( package, version) in deps. iter_mut ( ) {
90
- if let Some ( internal_version) = version_by_name. get ( package) {
91
- * version = serde_json:: Value :: String ( internal_version. to_string ( ) ) ;
92
- }
93
- }
94
- }
95
- if let Some ( deps) = package_manifest. extra_fields . get_mut ( "optionalDependencies" ) . and_then ( |v| serde_json:: Value :: as_object_mut ( v) ) {
96
- for ( package, version) in deps. iter_mut ( ) {
97
- if let Some ( internal_version) = version_by_name. get ( package) {
98
- * version = serde_json:: Value :: String ( internal_version. to_string ( ) ) ;
99
- }
100
- }
101
- }
102
- if let Some ( deps) = package_manifest. extra_fields . get_mut ( "peerDependencies" ) . and_then ( |v| serde_json:: Value :: as_object_mut ( v) ) {
92
+ let pin = |package_manifest : & mut PackageManifest , d| {
93
+ if let Some ( deps) = package_manifest. extra_fields . get_mut ( d) . and_then ( |v| Value :: as_object_mut ( v) ) {
103
94
for ( package, version) in deps. iter_mut ( ) {
104
95
if let Some ( internal_version) = version_by_name. get ( package) {
105
96
* version = serde_json:: Value :: String ( internal_version. to_string ( ) ) ;
106
97
}
107
98
}
108
99
}
100
+ } ;
101
+
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" ) ;
109
107
}
110
108
111
109
internal_packages
112
110
}
113
111
114
112
fn write_lerna_manifests ( package_manifests : & HashMap < String , PackageManifest > ) -> Result < ( ) , Box < dyn Error > > {
115
-
116
- Ok ( for ( manifest_file, manifest_contents) in package_manifests {
117
- let file = File :: create ( manifest_file) ?;
118
- let writer = BufWriter :: new ( file) ;
119
- serde_json:: to_writer_pretty ( writer, manifest_contents) ?;
120
- } )
113
+ for ( manifest_file, manifest_contents) in package_manifests {
114
+ write_package_manifest ( Path :: new ( manifest_file) , manifest_contents) ?;
115
+ }
116
+ Ok ( ( ) )
121
117
}
122
118
123
119
fn main ( ) {
124
120
let opts: Opts = Opts :: parse ( ) ;
125
121
let root = Path :: new ( & opts. root ) ;
126
122
127
123
let lerna_manifest = read_lerna_manifest ( & root) . expect ( "Unable to read lerna manifest" ) ;
128
- let package_manifests = read_lerna_package_manifests ( & root, & lerna_manifest) ;
124
+ let package_manifests = read_lerna_package_manifests ( & root, & lerna_manifest) . expect ( "Unable to read package manifests" ) ;
129
125
let version_by_name = get_version_by_name ( & package_manifests) ;
130
126
131
127
let updated_package_manifests = pin_version_numbers_in_internal_packages ( version_by_name, package_manifests) ;
132
128
write_lerna_manifests ( & updated_package_manifests) . expect ( "Unable to write package manifest" ) ;
133
-
134
- println ! ( "{:?}" , updated_package_manifests) ;
135
129
}
0 commit comments