Source code for coalib.results.result_actions.ApplyPatchAction
import shutil
from os.path import isfile
from os import remove
from coala_utils.FileUtils import detect_encoding
from coalib.results.result_actions.ShowPatchAction import ShowPatchAction
from coalib.results.result_actions.ResultAction import ResultAction
[docs]class ApplyPatchAction(ResultAction):
SUCCESS_MESSAGE = 'Patch applied successfully.'
is_applicable = staticmethod(ShowPatchAction.is_applicable)
[docs] def apply(self,
result,
original_file_dict,
file_diff_dict,
no_orig: bool = False):
"""
(A)pply patch
:param no_orig: Whether or not to create .orig backup files
"""
for filename in result.diffs:
pre_patch_filename = filename
if filename in file_diff_dict:
diff = file_diff_dict[filename]
pre_patch_filename = (diff.rename
if diff.rename is not False
else filename)
file_diff_dict[filename] += result.diffs[filename]
else:
file_diff_dict[filename] = result.diffs[filename]
# Backup original file, only if there was no previous patch
# from this run though!
if not no_orig and isfile(pre_patch_filename):
shutil.copy2(pre_patch_filename,
pre_patch_filename + '.orig')
diff = file_diff_dict[filename]
if not diff.delete:
new_filename = (diff.rename
if diff.rename is not False
else filename)
with open(new_filename, mode='w',
encoding=detect_encoding(pre_patch_filename)) as file:
file.writelines(diff.modified)
if diff.delete or diff.rename:
if diff.rename != pre_patch_filename and isfile(
pre_patch_filename):
remove(pre_patch_filename)
return file_diff_dict