#!/usr/bin/env python3
import os
import subprocess
from common . basedir import BASEDIR
from selfdrive . swaglog import cloudlog
def run_cmd ( cmd ) :
return subprocess . check_output ( cmd , encoding = ' utf8 ' ) . strip ( )
def run_cmd_default ( cmd , default = None ) :
try :
return run_cmd ( cmd )
except subprocess . CalledProcessError :
return default
def get_git_commit ( branch = " HEAD " , default = None ) :
return run_cmd_default ( [ " git " , " rev-parse " , branch ] , default = default )
def get_git_branch ( default = None ) :
return run_cmd_default ( [ " git " , " rev-parse " , " --abbrev-ref " , " HEAD " ] , default = default )
def get_git_full_branchname ( default = None ) :
return run_cmd_default ( [ " git " , " rev-parse " , " --abbrev-ref " , " --symbolic-full-name " , " @ {u} " ] , default = default )
def get_git_remote ( default = None ) :
try :
local_branch = run_cmd ( [ " git " , " name-rev " , " --name-only " , " HEAD " ] )
tracking_remote = run_cmd ( [ " git " , " config " , " branch. " + local_branch + " .remote " ] )
return run_cmd ( [ " git " , " config " , " remote. " + tracking_remote + " .url " ] )
except subprocess . CalledProcessError : # Not on a branch, fallback
return run_cmd_default ( [ " git " , " config " , " --get " , " remote.origin.url " ] , default = default )
with open ( os . path . join ( os . path . dirname ( os . path . abspath ( __file__ ) ) , " common " , " version.h " ) ) as _versionf :
version = _versionf . read ( ) . split ( ' " ' ) [ 1 ]
prebuilt = os . path . exists ( os . path . join ( BASEDIR , ' prebuilt ' ) )
training_version = b " 0.2.0 "
terms_version = b " 2 "
dirty = True
comma_remote = False
tested_branch = False
origin = get_git_remote ( )
branch = get_git_full_branchname ( )
if ( origin is not None ) and ( branch is not None ) :
try :
comma_remote = origin . startswith ( ' git@github.com:commaai ' ) or origin . startswith ( ' https://github.com/commaai ' )
tested_branch = get_git_branch ( ) in [ ' devel ' , ' release2-staging ' , ' dashcam-staging ' , ' release2 ' , ' dashcam ' ]
dirty = False
# Actually check dirty files
if not prebuilt :
# This is needed otherwise touched files might show up as modified
try :
subprocess . check_call ( [ " git " , " update-index " , " --refresh " ] )
except subprocess . CalledProcessError :
pass
dirty = ( subprocess . call ( [ " git " , " diff-index " , " --quiet " , branch , " -- " ] ) != 0 )
# Log dirty files
if dirty and comma_remote :
try :
dirty_files = run_cmd ( [ " git " , " diff-index " , branch , " -- " ] )
cloudlog . event ( " dirty comma branch " , version = version , dirty = dirty , origin = origin , branch = branch ,
dirty_files = dirty_files , commit = get_git_commit ( ) , origin_commit = get_git_commit ( branch ) )
except subprocess . CalledProcessError :
pass
dirty = dirty or ( not comma_remote )
dirty = dirty or ( ' master ' in branch )
except subprocess . CalledProcessError :
dirty = True
cloudlog . exception ( " git subprocess failed while checking dirty " )
if __name__ == " __main__ " :
print ( " Dirty: %s " % dirty )
print ( " Version: %s " % version )
print ( " Remote: %s " % origin )
print ( " Branch: %s " % branch )
print ( " Prebuilt: %s " % prebuilt )