115 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			115 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
# vim: ts=8 sts=2 sw=2 tw=99 et ft=python: 
 | 
						|
import sys
 | 
						|
import subprocess
 | 
						|
import os
 | 
						|
try:
 | 
						|
  import urllib.request as urllib
 | 
						|
except ImportError:
 | 
						|
  import urllib2 as urllib
 | 
						|
 | 
						|
if len(sys.argv) < 3:
 | 
						|
  sys.stderr.write('Usage: <symbol-file> <dump-syms-cmd> <args...>\n')
 | 
						|
  sys.exit(1)
 | 
						|
 | 
						|
SYMBOL_SERVER = os.environ['BREAKPAD_SYMBOL_SERVER']
 | 
						|
symbol_file = sys.argv[1]
 | 
						|
cmd_argv = sys.argv[2:]
 | 
						|
 | 
						|
sys.stdout.write(' '.join(cmd_argv))
 | 
						|
sys.stdout.write('\n')
 | 
						|
 | 
						|
p = subprocess.Popen(
 | 
						|
  args = cmd_argv,
 | 
						|
  stdout = subprocess.PIPE,
 | 
						|
  stderr = subprocess.PIPE,
 | 
						|
  shell = False
 | 
						|
)
 | 
						|
stdout, stderr = p.communicate()
 | 
						|
out = stdout.decode('utf8')
 | 
						|
err = stdout.decode('utf8')
 | 
						|
 | 
						|
with open(symbol_file, 'w') as fp:
 | 
						|
  fp.write(out)
 | 
						|
  fp.write(err)
 | 
						|
 | 
						|
lines = out.splitlines()
 | 
						|
 | 
						|
paths = set()
 | 
						|
roots = {}
 | 
						|
 | 
						|
# Lets not even talk about this.
 | 
						|
def fixWindowsPath(path):
 | 
						|
  import ctypes
 | 
						|
  GetShortPathName = ctypes.windll.kernel32.GetShortPathNameW
 | 
						|
  shortp = ctypes.create_unicode_buffer(260)
 | 
						|
  rv = GetShortPathName(path.capitalize(), shortp, 260)
 | 
						|
  if rv == 0 or rv > 260:
 | 
						|
    return path
 | 
						|
  GetLongPathName = ctypes.windll.kernel32.GetLongPathNameW
 | 
						|
  longp = ctypes.create_unicode_buffer(260)
 | 
						|
  rv = GetLongPathName(shortp, longp, 260)
 | 
						|
  if rv == 0 or rv > 260:
 | 
						|
    return path
 | 
						|
  return longp.value
 | 
						|
 | 
						|
for i, line in enumerate(lines):
 | 
						|
  line = line.strip().split(None, 2)
 | 
						|
 | 
						|
  if line[0] != 'FILE':
 | 
						|
    continue
 | 
						|
 | 
						|
  path = line[2]
 | 
						|
 | 
						|
  if os.name == 'nt' and os.path.exists(path):
 | 
						|
    path = fixWindowsPath(path)
 | 
						|
    line = ' '.join(['FILE', line[1], path])
 | 
						|
    lines[i] = line
 | 
						|
 | 
						|
  path = os.path.dirname(path)
 | 
						|
  if path in paths:
 | 
						|
    continue
 | 
						|
 | 
						|
  paths.add(path)
 | 
						|
 | 
						|
  root = None
 | 
						|
  url = None
 | 
						|
  rev = None
 | 
						|
 | 
						|
  with open(os.devnull, 'w') as devnull:
 | 
						|
    def runCommand(argv):
 | 
						|
      proc = subprocess.Popen(argv, stdout=subprocess.PIPE, stderr=devnull, cwd=path, universal_newlines=True)
 | 
						|
      procout, procerr = proc.communicate()
 | 
						|
      if proc.returncode:
 | 
						|
        raise RuntimeError('Failed to execute \'' + ' '.join(argv) + '\' = ' + str(proc.returncode))
 | 
						|
      return procout.strip()
 | 
						|
 | 
						|
    try:
 | 
						|
      root = runCommand(['git', 'rev-parse', '--show-toplevel'])
 | 
						|
      root = os.path.normpath(root)
 | 
						|
 | 
						|
      if root in roots:
 | 
						|
        continue
 | 
						|
 | 
						|
      url = runCommand(['git', 'ls-remote', '--get-url', 'origin'])
 | 
						|
      rev = runCommand(['git', 'log', '--pretty=format:%H', '-n', '1'])
 | 
						|
    except (OSError, RuntimeError) as e:
 | 
						|
      #sys.stderr.write(str(e) + '\n')
 | 
						|
      continue
 | 
						|
 | 
						|
  roots[root] = (url, rev)
 | 
						|
 | 
						|
index = 1
 | 
						|
while lines[index].split(None, 1)[0] == 'INFO':
 | 
						|
  index += 1;
 | 
						|
 | 
						|
for root, info in roots.items():
 | 
						|
  lines.insert(index, 'INFO REPO ' + ' '.join([info[1], info[0], root]))
 | 
						|
  index += 1;
 | 
						|
 | 
						|
out = os.linesep.join(lines).encode('utf8')
 | 
						|
 | 
						|
request = urllib.Request(SYMBOL_SERVER, out)
 | 
						|
request.add_header('Content-Type', 'text/plain')
 | 
						|
server_response = urllib.urlopen(request).read().decode('utf8').strip()
 | 
						|
print(server_response)
 |