mirror of
https://gitlab.winehq.org/wine/wine-staging.git
synced 2024-09-13 09:17:20 -07:00
staging: New rebase script.
Got tired of finding bugs in the old one and being completely confused by its code, so here is a new one. It doesn't have a fancy progress bar, but at least it actually tells you what patches break.
This commit is contained in:
parent
e6e67f2aab
commit
c45c01449e
94
staging/newupdate.py
Executable file
94
staging/newupdate.py
Executable file
@ -0,0 +1,94 @@
|
||||
#!/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)
|
||||
sys.exit(0)
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
Loading…
Reference in New Issue
Block a user