def generate_ifdefined(all_patches): """Update autogenerated ifdefined patches, which can be used to selectively disable features at compile time.""" enabled_patches = dict([(i, patch) for i, patch in all_patches.iteritems() if not patch.disabled]) for i, patch in enabled_patches.iteritems(): if patch.ifdefined is None: continue filename = os.path.join(patch.directory, config.path_IfDefined) with open(filename, "wb") as fp: fp.write("From: Wine Staging Team <*****@*****.**>\n") fp.write("Subject: Autogenerated #ifdef patch for %s.\n" % patch.name) fp.write("\n") depends = resolve_dependencies(enabled_patches, i) for f in patch.modified_files: # Reconstruct the state after applying the dependencies original = get_wine_file(f) for _, (_, p) in select_patches(enabled_patches, depends, f).iteritems(): original = patchutils.apply_patch(original, p, fuzz=0) # Now apply the main patch p = extract_patch(patch, f)[1] patched = patchutils.apply_patch(original, p, fuzz=0) # Now get the diff between both diff = patchutils.generate_ifdef_patch(original, patched, ifdef=patch.ifdefined) if diff is not None: fp.write("diff --git a/%s b/%s\n" % (f, f)) fp.write("--- a/%s\n" % f) fp.write("+++ b/%s\n" % f) while True: buf = diff.read(16384) if buf == "": break fp.write(buf) diff.close() # Close the file fp.close() # Add changes to git subprocess.call(["git", "add", filename]) # Add the autogenerated file as a last patch patch.files.append(os.path.basename(filename)) for p in patchutils.read_patch(filename): assert p.modified_file in patch.modified_files patch.patches.append(p)
def generate_ifdefined(all_patches, skip_checks=False): """Update autogenerated ifdefined patches, which can be used to selectively disable features at compile time.""" for i, patch in all_patches.iteritems(): if patch.ifdefined is None: continue if patch.disabled: continue filename = os.path.join(patch.directory, config.path_IfDefined) headers = { 'author': "Wine Staging Team", 'email': "*****@*****.**", 'subject': "Autogenerated #ifdef patch for %s." % patch.name } if skip_checks: patch.files = [os.path.basename(filename)] continue with open(filename, "wb") as fp: fp.write("From: %s <%s>\n" % (headers['author'], headers['email'])) fp.write("Subject: %s\n" % headers['subject']) fp.write("\n") fp.write("Based on patches by:\n") for author, email in sorted(set([(p.patch_author, p.patch_email) for p in patch.patches])): fp.write(" %s <%s>\n" % (author, email)) fp.write("\n") depends = resolve_dependencies(all_patches, i) for f in sorted(patch.modified_files): # Reconstruct the state after applying the dependencies original = get_wine_file(f) selected_patches = select_patches(all_patches, depends, f) failed = [] try: for j in depends: failed.append(j) original = patchutils.apply_patch(original, selected_patches[j][1], fuzz=0) except patchutils.PatchApplyError: raise PatchUpdaterError("Changes to file %s don't apply: %s" % (f, ", ".join([all_patches[j].name for j in failed]))) # Now apply the main patch p = extract_patch(patch, f)[1] try: failed.append(i) patched = patchutils.apply_patch(original, p, fuzz=0) except patchutils.PatchApplyError: raise PatchUpdaterError("Changes to file %s don't apply: %s" % (f, ", ".join([all_patches[j].name for j in failed]))) # Now get the diff between both diff = patchutils.generate_ifdef_patch(original, patched, ifdef=patch.ifdefined) if diff is not None: fp.write("diff --git a/%s b/%s\n" % (f, f)) fp.write("--- a/%s\n" % f) fp.write("+++ b/%s\n" % f) while True: buf = diff.read(16384) if buf == "": break fp.write(buf) diff.close() # Close the file fp.close() # Add changes to git subprocess.call(["git", "add", filename]) # Add the autogenerated file as a last patch patch.files = [os.path.basename(filename)] for p in patch.patches: p.filename = None p.modified_file = None for p in patchutils.read_patch(filename): assert p.modified_file in patch.modified_files p.patch_author = None patch.patches.append(p)
def generate_ifdefined(all_patches, skip_checks=False): """Update autogenerated ifdefined patches, which can be used to selectively disable features at compile time.""" enabled_patches = dict([(i, patch) for i, patch in all_patches.iteritems() if not patch.disabled]) for i, patch in enabled_patches.iteritems(): if patch.ifdefined is None: continue filename = os.path.join(patch.directory, config.path_IfDefined) headers = { 'author': "Wine Staging Team", 'email': "*****@*****.**", 'subject': "Autogenerated #ifdef patch for %s." % patch.name } if skip_checks: patch.files = [os.path.basename(filename)] continue with open(filename, "wb") as fp: fp.write("From: %s <%s>\n" % (headers['author'], headers['email'])) fp.write("Subject: %s\n" % headers['subject']) fp.write("\n") fp.write("Based on patches by:\n") for author, email in sorted(set([(p.patch_author, p.patch_email) for p in patch.patches])): fp.write(" %s <%s>\n" % (author, email)) fp.write("\n") depends = resolve_dependencies(enabled_patches, i) for f in sorted(patch.modified_files): # Reconstruct the state after applying the dependencies original = get_wine_file(f) selected_patches = select_patches(enabled_patches, depends, f) failed = [] try: for j in depends: failed.append(j) original = patchutils.apply_patch(original, selected_patches[j][1], fuzz=0) except patchutils.PatchApplyError: raise PatchUpdaterError("Changes to file %s don't apply: %s" % (f, ", ".join([all_patches[j].name for j in failed]))) # Now apply the main patch p = extract_patch(patch, f)[1] try: failed.append(i) patched = patchutils.apply_patch(original, p, fuzz=0) except patchutils.PatchApplyError: raise PatchUpdaterError("Changes to file %s don't apply: %s" % (f, ", ".join([all_patches[j].name for j in failed]))) # Now get the diff between both diff = patchutils.generate_ifdef_patch(original, patched, ifdef=patch.ifdefined) if diff is not None: fp.write("diff --git a/%s b/%s\n" % (f, f)) fp.write("--- a/%s\n" % f) fp.write("+++ b/%s\n" % f) while True: buf = diff.read(16384) if buf == "": break fp.write(buf) diff.close() # Close the file fp.close() # Add changes to git subprocess.call(["git", "add", filename]) # Add the autogenerated file as a last patch patch.files = [os.path.basename(filename)] for p in patch.patches: p.filename = None p.modified_file = None for p in patchutils.read_patch(filename): assert p.modified_file in patch.modified_files p.patch_author = None patch.patches.append(p)