1
1
use semver:: Version ;
2
- use serde_json:: Value ;
3
2
use std:: io:: ErrorKind ;
3
+ use std:: path:: Path ;
4
4
use std:: process:: { Command , Stdio } ;
5
5
6
- pub fn check ( bad : & mut bool ) {
6
+ pub fn check ( root : & Path , cargo : & Path , bad : & mut bool ) {
7
7
let result = Command :: new ( "x" ) . arg ( "--wrapper-version" ) . stdout ( Stdio :: piped ( ) ) . spawn ( ) ;
8
8
// This runs the command inside a temporary directory.
9
9
// This allows us to compare output of result to see if `--wrapper-version` is not a recognized argument to x.
@@ -35,7 +35,7 @@ pub fn check(bad: &mut bool) {
35
35
let version = String :: from_utf8_lossy ( & output. stdout ) ;
36
36
let version = Version :: parse ( version. trim_end ( ) ) . unwrap ( ) ;
37
37
38
- if let Some ( expected) = get_x_wrapper_version ( ) {
38
+ if let Some ( expected) = get_x_wrapper_version ( root , cargo ) {
39
39
if version < expected {
40
40
return tidy_error ! (
41
41
bad,
@@ -54,27 +54,11 @@ pub fn check(bad: &mut bool) {
54
54
}
55
55
56
56
// Parse latest version out of `x` Cargo.toml
57
- fn get_x_wrapper_version ( ) -> Option < Version > {
58
- let cmd = Command :: new ( "cargo" )
59
- . arg ( "metadata" )
60
- . args ( [ "--no-deps" , "--format-version" , "1" , "--manifest-path" , "src/tools/x/Cargo.toml" ] )
61
- . stdout ( Stdio :: piped ( ) )
62
- . spawn ( ) ;
63
-
64
- let child = match cmd {
65
- Ok ( child) => child,
66
- Err ( e) => {
67
- println ! ( "failed to get version of `x`: {}" , e) ;
68
- return None ;
69
- }
70
- } ;
71
-
72
- let cargo_output = child. wait_with_output ( ) . unwrap ( ) ;
73
- let cargo_output_str =
74
- String :: from_utf8 ( cargo_output. stdout ) . expect ( "Unable to parse `src/tools/x/Cargo.toml`" ) ;
75
-
76
- let v: Value = serde_json:: from_str ( & cargo_output_str) . unwrap ( ) ;
77
- let vesrion_str = & v[ "packages" ] [ 0 ] [ "version" ] . as_str ( ) ?;
78
-
79
- Some ( Version :: parse ( vesrion_str) . unwrap ( ) )
57
+ fn get_x_wrapper_version ( root : & Path , cargo : & Path ) -> Option < Version > {
58
+ let mut cmd = cargo_metadata:: MetadataCommand :: new ( ) ;
59
+ cmd. cargo_path ( cargo)
60
+ . manifest_path ( root. join ( "src/tools/x/Cargo.toml" ) )
61
+ . features ( cargo_metadata:: CargoOpt :: AllFeatures ) ;
62
+ let mut metadata = t ! ( cmd. exec( ) ) ;
63
+ metadata. packages . pop ( ) . map ( |x| x. version )
80
64
}
0 commit comments