Completed
Pull Request — master (#1626)
by Abdeali
01:33
created

is_applicable()   B

Complexity

Conditions 6

Size

Total Lines 12

Duplication

Lines 0
Ratio 0 %
Metric Value
cc 6
dl 0
loc 12
rs 8
1
import difflib
2
3
from pyprint.ConsolePrinter import ConsolePrinter
4
5
from coalib.results.Diff import ConflictError
6
from coalib.results.Result import Result
7
from coalib.results.result_actions.ResultAction import ResultAction
8
9
10
def format_line(line, real_nr="", sign="|", mod_nr="", symbol="", ):
11
    return "|{:>4}{}{:>4}|{:1}{}".format(real_nr,
12
                                         sign,
13
                                         mod_nr,
14
                                         symbol,
15
                                         line.rstrip("\n"))
16
17
18
def print_beautified_diff(difflines, printer):
19
    current_line_added = None
20
    current_line_subtracted = None
21
    for line in difflines:
22
        if line.startswith("@@"):
23
            values = line[line.find("-"):line.rfind(" ")]
24
            subtracted, added = tuple(values.split(" "))
25
            current_line_added = int(added.split(",")[0][1:])
26
            current_line_subtracted = int(subtracted.split(",")[0][1:])
27
        elif line.startswith("---"):
28
            printer.print(format_line(line[4:], real_nr="----"), color="red")
29
        elif line.startswith("+++"):
30
            printer.print(format_line(line[4:], mod_nr="++++"),
31
                          color="green")
32
        elif line.startswith("+"):
33
            printer.print(format_line(line[1:],
34
                                      mod_nr=current_line_added,
35
                                      symbol="+"),
36
                          color="green")
37
            current_line_added += 1
38
        elif line.startswith("-"):
39
            printer.print(format_line(line[1:],
40
                                      real_nr=current_line_subtracted,
41
                                      symbol="-"),
42
                          color="red")
43
            current_line_subtracted += 1
44
        else:
45
            printer.print(format_line(line[1:],
46
                                      real_nr=current_line_subtracted,
47
                                      mod_nr=current_line_added,
48
                                      symbol=" "))
49
            current_line_subtracted += 1
50
            current_line_added += 1
51
52
53
class ShowPatchAction(ResultAction):
54
55
    success_message = "Displayed patch successfully."
56
57
    @staticmethod
58
    def is_applicable(result, original_file_dict, file_diff_dict):
59
        if not isinstance(result, Result) or not result.diffs:
60
            return False
61
62
        try:
63
            for filename in result.diffs:
64
                if filename in file_diff_dict:
65
                    result.diffs[filename].__add__(file_diff_dict[filename])
66
            return True
67
        except ConflictError:
68
            return False
69
70
    def apply(self,
71
              result,
72
              original_file_dict,
73
              file_diff_dict,
74
              colored: bool=True):
75
        '''
76
        Print a diff of the patch that would be applied.
77
78
        :param colored: Wether or not to use colored output.
79
        '''
80
        printer = ConsolePrinter(colored)
81
82
        for filename, this_diff in sorted(result.diffs.items()):
83
            original_file = original_file_dict[filename]
84
            try:
85
                current_file = file_diff_dict[filename].modified
86
                new_file = (file_diff_dict[filename] + this_diff).modified
87
            except KeyError:
88
                current_file = original_file
89
                new_file = this_diff.modified
90
91
            print_beautified_diff(difflib.unified_diff(current_file,
92
                                                       new_file,
93
                                                       fromfile=filename,
94
                                                       tofile=filename),
95
                                  printer)
96
97
        return file_diff_dict
98