1
0
mirror of https://github.com/alliedmodders/metamod-source.git synced 2024-11-29 11:24:19 +01:00
HLMetaModOfficial/support/buildbot/upload_symbols.py

115 lines
2.8 KiB
Python
Raw Normal View History

# 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)