#!/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()