BuildScript/scripts/instruments.py

113 lines
2.8 KiB
Python

from subprocess import call
import shutil
import os
import re
def MapToBackupName(origin_path):
backup_path = "{0}.build_backup".format(origin_path)
return backup_path
def FetchAbsOriginBackupInfo(base_dir, rel_path_to_origin_files):
abs_path_to_origin_files = [os.path.join(base_dir, rel) for rel in rel_path_to_origin_files]
abs_origin_backup_infos = [{'origin': p, 'backup': MapToBackupName(p)} for p in abs_path_to_origin_files]
return abs_origin_backup_infos
def CreateOrRestoreFromBackup(base_dir, relative_path_to_files):
abs_origin_backup_infos = FetchAbsOriginBackupInfo(base_dir, relative_path_to_files)
for aobi in abs_origin_backup_infos:
abs_original = aobi['origin']
abs_backup = aobi['backup']
if os.path.exists(abs_backup):
# restore from backup
shutil.copyfile(abs_backup, abs_original)
else:
# create backup
shutil.copyfile(abs_original, abs_backup)
return None
def DeleteBackups(base_dir, relative_path_to_files):
abs_origin_backup_infos = FetchAbsOriginBackupInfo(base_dir, relative_path_to_files)
for aobi in abs_origin_backup_infos:
abs_backup = aobi['backup']
if os.path.exists(abs_backup):
os.remove(abs_backup)
return None
def ResetDirectory(base_dir, relative_path_to_files):
CreateOrRestoreFromBackup(base_dir, relative_path_to_files)
DeleteBackups(base_dir, relative_path_to_files)
return None
def RemoveProjectFromSolution(abs_path_to_sln, project_names):
sln_file = open(abs_path_to_sln, 'r+')
content = sln_file.read()
for pn in project_names:
reg_pattern = r'\n*Project.*?"{0}".*?\n*EndProject'.format(pn)
content = re.sub(reg_pattern, "", content)
# override file
sln_file.seek(0)
sln_file.write(content)
sln_file.truncate()
sln_file.close()
def CleanSolution(mdtool, abs_path_to_sln):
clean_cmd_pattern = '{0} -v build "--target:Clean" {1}'
clean_cmd_text = clean_cmd_pattern.format(mdtool, abs_path_to_sln)
print(clean_cmd_text)
ret_code = call(clean_cmd_text, shell=True)
print('finished with return code: {0}'.format(ret_code))
def BuildSolution(mdtool, abs_path_to_sln, config):
build_cmd_pattern = '{0} -v build "--configuration:{1}" "--target:Build" {2}'
build_cmd_text = build_cmd_pattern.format(mdtool, config, abs_path_to_sln)
print(build_cmd_text)
ret_code = call(build_cmd_text, shell=True)
print('finished with return code: {0}'.format(ret_code))
def CompileConfigs(configs_lst, cmd_args):
for c_dict in configs_lst:
ancestors = GetAncestorsFromRootTo(c_dict)
ancestors.append(cmd_args)
union_config = {}
for a in ancestors:
union_config.update(a)
c_dict.clear()
c_dict.update(union_config)
def GetAncestorsFromRootTo(config):
ancestors = []
c = config
while c is not None:
ancestors.append(c)
c = c['parent']
ancestors.reverse()
return ancestors