diff --git a/pydiffchecker/line_shift_checker.py b/pydiffchecker/line_shift_checker.py index 913a2c7..8180cf3 100644 --- a/pydiffchecker/line_shift_checker.py +++ b/pydiffchecker/line_shift_checker.py @@ -33,18 +33,26 @@ class LineShiftChecker: return file_list def __get_shifted_lines_in_file(self, file_info) -> 'Dict[str, str | None]': - lines_in_source_file = self.__count_lines_in_source_file(file_info['src']) - process_output = subprocess_readlines(['git', 'diff', f'-U{lines_in_source_file}', + process_output = subprocess_readlines(['git', 'diff', self.revision_since, self.revision_until, '--', file_info['src'], file_info['dst']]) diff_started = False shifted_lines = {} + old_start = 1 + new_start = 1 for line in process_output: matches = re.search(LineShiftChecker.DIFF_BLOCK_REGEX, line) if matches: - old_start = int(matches.group(1)) - new_start = int(matches.group(3)) + diff_block_src_start = int(matches.group(1)) + diff_block_dst_start = int(matches.group(3)) + + # fill shifted lines between 2 diff blocks + for i in range(0, diff_block_src_start - old_start): + shifted_lines[f'{file_info["src"]}:{old_start+i}'] = f'{file_info["dst"]}:{new_start+i}' + + old_start = diff_block_src_start + new_start = diff_block_dst_start diff_started = True continue @@ -61,11 +69,10 @@ class LineShiftChecker: shifted_lines[f'{file_info["src"]}:{old_start}'] = None old_start += 1 - if not diff_started: - # it was a pure rename, so no diff blocks were returned, - # we just put the lines into the dict - shifted_lines = {f'{file_info["src"]}:{i}': f'{file_info["dst"]}:{i}' - for i in range(0, lines_in_source_file)} + # fill shifted lines until end of file + lines_in_source_file = self.__count_lines_in_source_file(file_info['src']) + for i in range(0, lines_in_source_file - old_start + 1): + shifted_lines[f'{file_info["src"]}:{old_start+i}'] = f'{file_info["dst"]}:{new_start+i}' assert lines_in_source_file == len(shifted_lines)