@@ -134,7 +134,7 @@ extern crate toml;
134
134
#[ cfg( unix) ]
135
135
extern crate libc;
136
136
137
- use std:: cell:: RefCell ;
137
+ use std:: cell:: { RefCell , Cell } ;
138
138
use std:: collections:: { HashSet , HashMap } ;
139
139
use std:: env;
140
140
use std:: fs:: { self , File } ;
@@ -250,6 +250,7 @@ pub struct Build {
250
250
is_sudo : bool ,
251
251
ci_env : CiEnv ,
252
252
delayed_failures : RefCell < Vec < String > > ,
253
+ prerelease_version : Cell < Option < u32 > > ,
253
254
}
254
255
255
256
#[ derive( Debug ) ]
@@ -335,6 +336,7 @@ impl Build {
335
336
is_sudo,
336
337
ci_env : CiEnv :: current ( ) ,
337
338
delayed_failures : RefCell :: new ( Vec :: new ( ) ) ,
339
+ prerelease_version : Cell :: new ( None ) ,
338
340
}
339
341
}
340
342
@@ -774,12 +776,59 @@ impl Build {
774
776
fn release ( & self , num : & str ) -> String {
775
777
match & self . config . channel [ ..] {
776
778
"stable" => num. to_string ( ) ,
777
- "beta" => format ! ( "{}-beta{}" , num, channel :: CFG_PRERELEASE_VERSION ) ,
779
+ "beta" => format ! ( "{}-beta. {}" , num, self . beta_prerelease_version ( ) ) ,
778
780
"nightly" => format ! ( "{}-nightly" , num) ,
779
781
_ => format ! ( "{}-dev" , num) ,
780
782
}
781
783
}
782
784
785
+ fn beta_prerelease_version ( & self ) -> u32 {
786
+ if let Some ( s) = self . prerelease_version . get ( ) {
787
+ return s
788
+ }
789
+
790
+ let beta = output (
791
+ Command :: new ( "git" )
792
+ . arg ( "ls-remote" )
793
+ . arg ( "origin" )
794
+ . arg ( "beta" )
795
+ . current_dir ( & self . src )
796
+ ) ;
797
+ let beta = beta. trim ( ) . split_whitespace ( ) . next ( ) . unwrap ( ) ;
798
+ let master = output (
799
+ Command :: new ( "git" )
800
+ . arg ( "ls-remote" )
801
+ . arg ( "origin" )
802
+ . arg ( "master" )
803
+ . current_dir ( & self . src )
804
+ ) ;
805
+ let master = master. trim ( ) . split_whitespace ( ) . next ( ) . unwrap ( ) ;
806
+
807
+ // Figure out where the current beta branch started.
808
+ let base = output (
809
+ Command :: new ( "git" )
810
+ . arg ( "merge-base" )
811
+ . arg ( beta)
812
+ . arg ( master)
813
+ . current_dir ( & self . src ) ,
814
+ ) ;
815
+ let base = base. trim ( ) ;
816
+
817
+ // Next figure out how many merge commits happened since we branched off
818
+ // beta. That's our beta number!
819
+ let count = output (
820
+ Command :: new ( "git" )
821
+ . arg ( "rev-list" )
822
+ . arg ( "--count" )
823
+ . arg ( "--merges" )
824
+ . arg ( format ! ( "{}...HEAD" , base) )
825
+ . current_dir ( & self . src ) ,
826
+ ) ;
827
+ let n = count. trim ( ) . parse ( ) . unwrap ( ) ;
828
+ self . prerelease_version . set ( Some ( n) ) ;
829
+ n
830
+ }
831
+
783
832
/// Returns the value of `release` above for Rust itself.
784
833
fn rust_release ( & self ) -> String {
785
834
self . release ( channel:: CFG_RELEASE_NUM )
0 commit comments