wine-staging/staging/newupdate.py
2018-12-15 09:46:36 -06:00

96 lines
3.2 KiB
Python
Executable File

#!/usr/bin/python2
import getopt, os, subprocess, sys
winedir = './staging/wine/'
patchdir = os.path.abspath('./patches/')
applied = []
def usage():
print 'newupdate.py - new script to rebase patches'
print 'usage: ./staging/newupdate.py'
print 'Applies every patch to a Wine tree. On failure, prints the name of'
print 'the patch that failed to apply and cleans up the index. On success,'
print 'leaves every patch applied, and then runs autoreconf -f and'
print 'tools/make_requests to prepare for a build.'
print 'Note: this program must be used on a clean git tree (empty index).'
print 'This program does not update patchinstall.sh; you will need to run'
print './staging/patchupdate.py --skip-bugs --skip-checks'
print 'to do that.'
# return a patch to be shoved in patchlist below
def parse_def_file(name, path):
deps = []
if os.path.exists(path):
with open(path) as z:
for l in z.readlines():
if l.lower().startswith('depends: '):
deps.append(l.split(' ')[1].strip())
elif l.lower().strip() == 'disabled: true':
return None
return deps
def apply_set(patchlist, name):
if name in applied:
return True
for dep in patchlist[name]:
if not apply_set(patchlist, dep):
return False
print 'Applying',name
for patch in sorted(os.listdir(patchdir+'/'+name)):
if patch.endswith('.patch') and subprocess.call(['git','-C',winedir,'apply','--index',patchdir+'/'+name+'/'+patch]):
print 'Failed to apply patch %s/%s' %(name, patch)
return False
applied.append(name)
return True
def main():
try:
opts, args = getopt.getopt(sys.argv[1:], 'h', ['help'])
except getopt.GetoptError as err:
print str(err)
sys.exit(2)
for o, a in opts:
if o == '-h':
usage()
sys.exit(0)
# Build a list of patches
# key is patch name, value is list of deps
# disabled patches are not included
patchlist = {}
for name in os.listdir(patchdir):
path = patchdir + '/' + name
if not os.path.isdir(path): continue
deps = parse_def_file(name, path + '/definition')
if deps != None: # it's not disabled
patchlist[name] = deps
# Check that all of our dependencies exist
for p in patchlist:
deps = patchlist[p]
for d in deps:
if d not in patchlist:
print 'Error: unknown or disabled dependency %s of %s.' %(d,p)
# Now try to apply each patch
for p in sorted(patchlist.keys()):
# Try to apply it
if not apply_set(patchlist, p):
# clean up
subprocess.call(['git','-C',winedir,'reset','--hard','HEAD','--quiet'])
sys.exit(1)
# we successfully applied everything, autogen some files so we can build
print 'Calling autoreconf -f...'
subprocess.call(['autoreconf','-f'],cwd=winedir)
print 'Calling tools/make_requests...'
subprocess.call(['./tools/make_requests'],cwd=winedir)
subprocess.call(['./staging/patchupdate.py','--skip-checks','--skip-bugs'])
sys.exit(0)
if __name__ == '__main__':
main()