171 lines
		
	
	
	
		
			4.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			171 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);
 |