2019-01-16 16:20:30 -08:00
|
|
|
#!/usr/bin/env python2
|
2018-11-26 16:31:19 -08:00
|
|
|
|
|
|
|
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)
|
2018-12-15 07:46:36 -08:00
|
|
|
subprocess.call(['./staging/patchupdate.py','--skip-checks','--skip-bugs'])
|
2018-11-26 16:31:19 -08:00
|
|
|
sys.exit(0)
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
2018-12-13 17:03:58 -08:00
|
|
|
main()
|