tdesktop/Telegram/gyp/update_dependent.py

172 lines
4.7 KiB
Python

'''
This file is part of Telegram Desktop,
the official desktop application for the Telegram messaging service.
For license and copyright information please follow this link:
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
'''
from __future__ import print_function
import sys
import os
import re
import time
def eprint(*args, **kwargs):
print(*args, file=sys.stderr, **kwargs)
sys.exit(1)
my_path = os.path.dirname(os.path.realpath(__file__)).replace('\\', '/')
def get_qrc_dependencies(file_path):
global one_modified
dependencies = {}
if not os.path.isfile(file_path):
eprint('File not found: ' + file_path)
dir_name = os.path.dirname(file_path).replace('\\', '/')
with open(file_path) as f:
for line in f:
file_match = re.match('^\s*<file(\s[^>]*)?>([^<]+)</file>', line)
if file_match:
full_path = dir_name + '/' + file_match.group(2)
dependencies[full_path] = 1
return dependencies
def list_qrc_dependencies(file_path):
global one_modified
dependencies = get_qrc_dependencies(file_path)
for path in dependencies:
print(path)
sys.exit(0)
one_modified = 0
def handle_qrc_dependencies(file_path):
global one_modified
dependencies = get_qrc_dependencies(file_path)
file_modified = os.path.getmtime(file_path)
latest_modified = file_modified
for path in dependencies:
if os.path.isfile(path):
dependency_modified = os.path.getmtime(path)
if latest_modified < dependency_modified:
latest_modified = dependency_modified
else:
eprint('File not found: ' + path)
if file_modified < latest_modified:
os.utime(file_path, None);
one_modified = 1
def get_direct_style_dependencies(file_path):
dependencies = {}
dependencies[file_path] = 1
if not os.path.isfile(file_path):
eprint('File not found: ' + file_path)
with open(file_path) as f:
for line in f:
using_match = re.match('^\s*using "([^"]+)"', line)
if using_match:
path = using_match.group(1)
found = 0
for include_dir in include_dirs:
full_path = include_dir + '/' + path
if os.path.isfile(full_path):
try:
if dependencies[full_path]:
eprint('Cyclic dependencies: ' + full_path)
except KeyError:
dependencies[full_path] = 1
found = 1
break
if found != 1:
eprint('File not found: ' + path)
return dependencies
include_dirs = []
def handle_style_dependencies(file_path):
global one_modified
all_dependencies = {}
all_dependencies[file_path] = 1
added_from = {}
while len(added_from) != len(all_dependencies):
for dependency in all_dependencies:
try:
if added_from[dependency]:
continue
except KeyError:
added_from[dependency] = 1
add = get_direct_style_dependencies(dependency)
for new_dependency in add:
all_dependencies[new_dependency] = 1
break
file_modified = os.path.getmtime(file_path)
latest_modified = file_modified
for path in all_dependencies:
if path != file_path:
dependency_modified = os.path.getmtime(path)
if latest_modified < dependency_modified:
latest_modified = dependency_modified
if file_modified < latest_modified:
os.utime(file_path, None);
one_modified = 1
file_paths = []
request = ''
output_file = ''
next_include_dir = 0
next_output_file = 0
next_self = 1
for arg in sys.argv:
if next_self != 0:
next_self = 0
continue
if arg == '--styles' or arg == '--qrc_list' or arg == '--qrc':
if request == '':
request = arg[2:]
else:
eprint('Only one request required.')
continue
if next_include_dir != 0:
next_include_dir = 0
include_dirs.append(arg)
continue
if next_output_file != 0:
next_output_file = 0
output_file = arg
continue
include_dir_match = re.match(r'^\-I(.*)$', arg)
if include_dir_match:
include_dir = include_dir_match.group(1)
if include_dir == '':
next_include_dir = 1
else:
include_dirs.append(include_dir)
continue
output_match = re.match(r'^-o(.*)$', arg)
if output_match:
output_file = output_match.group(1)
if output_file == '':
next_output_file = 1
continue
file_paths.append(arg)
if request == 'styles':
for file_path in file_paths:
handle_style_dependencies(file_path)
elif request == 'qrc':
for file_path in file_paths:
handle_qrc_dependencies(file_path)
elif request == 'qrc_list':
for file_path in file_paths:
list_qrc_dependencies(file_path)
else:
eprint('Request required.')
if not os.path.isfile(output_file):
with open(output_file, "w") as f:
f.write('1')
elif one_modified != 0:
os.utime(output_file, None);