@@ -134,7 +134,7 @@ extern crate toml;
134134#[ cfg( unix) ]
135135extern crate libc;
136136
137- use std:: cell:: RefCell ;
137+ use std:: cell:: { RefCell , Cell } ;
138138use std:: collections:: { HashSet , HashMap } ;
139139use std:: env;
140140use std:: fs:: { self , File } ;
@@ -250,6 +250,7 @@ pub struct Build {
250250 is_sudo : bool ,
251251 ci_env : CiEnv ,
252252 delayed_failures : RefCell < Vec < String > > ,
253+ prerelease_version : Cell < Option < u32 > > ,
253254}
254255
255256#[ derive( Debug ) ]
@@ -335,6 +336,7 @@ impl Build {
335336 is_sudo,
336337 ci_env : CiEnv :: current ( ) ,
337338 delayed_failures : RefCell :: new ( Vec :: new ( ) ) ,
339+ prerelease_version : Cell :: new ( None ) ,
338340 }
339341 }
340342
@@ -774,12 +776,59 @@ impl Build {
774776 fn release ( & self , num : & str ) -> String {
775777 match & self . config . channel [ ..] {
776778 "stable" => num. to_string ( ) ,
777- "beta" => format ! ( "{}-beta{}" , num, channel :: CFG_PRERELEASE_VERSION ) ,
779+ "beta" => format ! ( "{}-beta. {}" , num, self . beta_prerelease_version ( ) ) ,
778780 "nightly" => format ! ( "{}-nightly" , num) ,
779781 _ => format ! ( "{}-dev" , num) ,
780782 }
781783 }
782784
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+
783832 /// Returns the value of `release` above for Rust itself.
784833 fn rust_release ( & self ) -> String {
785834 self . release ( channel:: CFG_RELEASE_NUM )
0 commit comments