@ -29,6 +29,14 @@ import sys
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				from  third_party  import  httplib2 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				# These build configs affect build performance a lot. 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				# TODO(tikuta): Add 'blink_symbol_level', 'closure_compile' and 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				#               'use_jumbo_build'. 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				WHITELISTED_CONFIGS  =  ( 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    ' symbol_level ' ,  ' use_goma ' ,  ' is_debug ' ,  ' is_component_build ' ,  ' enable_nacl ' , 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    ' host_os ' ,  ' host_cpu ' ,  ' target_os ' ,  ' target_cpu ' 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				def  IsGoogler ( server ) : 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    """ Check whether this script run inside corp network. """ 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    try : 
 
			
		 
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
			
			 
			 
			
				@ -42,8 +50,16 @@ def ParseGNArgs(gn_args):
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    """ Parse gn_args as json and return config dictionary. """ 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    configs  =  json . loads ( gn_args ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    build_configs  =  { } 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    for  config  in  configs : 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        build_configs [ config [ " name " ] ]  =  config [ " current " ] [ " value " ] 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        key  =  config [ " name " ] 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        if  key  not  in  WHITELISTED_CONFIGS : 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				            continue 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        if  ' current '  in  config : 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				            build_configs [ key ]  =  config [ ' current ' ] [ ' value ' ] 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        else : 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				            build_configs [ key ]  =  config [ ' default ' ] [ ' value ' ] 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    return  build_configs 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				def  GetBuildTargetFromCommandLine ( cmdline ) : 
 
			
		 
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
			
			 
			 
			
				@ -74,17 +90,34 @@ def GetBuildTargetFromCommandLine(cmdline):
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    return  targets 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				def  GetJflag ( cmdline ) : 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    """ Parse cmdline to get flag value for -j """ 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    for  i  in  range ( len ( cmdline ) ) : 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        if  ( cmdline [ i ]  ==  ' -j '  and  i  +  1  <  len ( cmdline )  and 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				            cmdline [ i + 1 ] . isdigit ( ) ) : 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				            return  int ( cmdline [ i + 1 ] ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        if  ( cmdline [ i ] . startswith ( ' -j ' )  and 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				            cmdline [ i ] [ len ( ' -j ' ) : ] . isdigit ( ) ) : 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				            return  int ( cmdline [ i ] [ len ( ' -j ' ) : ] ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				def  GetMetadata ( cmdline ,  ninjalog ) : 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    """ Get metadata for uploaded ninjalog. """ 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    """ Get metadata for uploaded ninjalog. 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    Returned  metadata  has  schema  defined  in 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    https : / / cs . chromium . org ? q = " type+Metadata+struct+ % 7B " + file : % 5 Einfra / go / src / infra / appengine / chromium_build_stats / ninjalog / 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    TODO ( tikuta ) :  Collect  GOMA_ *  env  var . 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    """ 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    build_dir  =  os . path . dirname ( ninjalog ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    build_configs  =  { } 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    try : 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        args  =  [ ' gn ' ,  ' args ' ,  build_dir ,  ' --list ' ,  ' --overrides-only ' , 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				                ' --short ' ,  ' --json ' ] 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        args  =  [ ' gn ' ,  ' args ' ,  build_dir ,  ' --list ' ,  ' --short ' ,  ' --json ' ] 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        if  sys . platform  ==  ' win32 ' : 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				            # gn in PATH is bat file in windows environment (except cygwin). 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				            args  =  [ ' cmd ' ,  ' /c ' ]  +  args 
 
			
		 
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
			
			 
			 
			
				@ -101,13 +134,15 @@ def GetMetadata(cmdline, ninjalog):
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    metadata  =  { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        ' platform ' :  platform . system ( ) , 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        ' cwd ' :  build_dir , 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        ' hostname ' :  socket . gethostname ( ) , 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        ' cpu_core ' :  multiprocessing . cpu_count ( ) , 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        ' cmdline ' :  cmdline , 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        ' build_configs ' :  build_configs , 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        ' targets ' :  GetBuildTargetFromCommandLine ( cmdline ) , 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    } 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    jflag  =  GetJflag ( cmdline ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    if  jflag  is  not  None : 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        metadata [ ' jobs ' ]  =  jflag 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    return  metadata 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				def  GetNinjalog ( cmdline ) : 
 
			
		 
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
			
			 
			 
			
				@ -165,7 +200,7 @@ def main():
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				            g . write ( ' # end of ninja log \n ' ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				            metadata  =  GetMetadata ( args . cmdline ,  ninjalog ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				            logging . info ( ' send metadata:  %s ' ,   metadata) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				            logging . info ( ' send metadata:  %s ' ,  json. dumps (  metadata) ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				            g . write ( json . dumps ( metadata ) ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    h  =  httplib2 . Http ( )