def save_patch_file(self):
     diff = self.repo.diff(self.base_branch)
     result = PatchUtils.save_diff_to_patch_file(diff,
                                                 self.new_patch_filename)
     if not result:
         raise ValueError(
             "Failed to save patch file. See previous error messages for details."
         )
     LOG.info(
         "Created patch file: '%s' [size: %s]",
         self.new_patch_filename,
         FileUtils.get_file_size(self.new_patch_filename),
     )
    def run(self):
        branch_results = {}
        for branch in self.branches:
            LOG.info("Processing branch: %s", branch)

            exists = self.upstream_repo.is_branch_exist(branch)
            commits = self.upstream_repo.log(branch,
                                             grep=self.jira_id,
                                             oneline=True)
            commit_hashes = GitWrapper.extract_commit_hash_from_gitlog_results(
                commits)
            branch_result = BranchResults(branch, exists, commits,
                                          commit_hashes)
            branch_results[branch] = branch_result

            # Only store diff if number of matched commits for this branch is 1
            if branch_result.number_of_commits == 1:
                commit_hash = branch_result.single_commit_hash
                # TODO create diff_with_parent helper method to GitWrapper
                diff = self.upstream_repo.diff_between_refs(
                    commit_hash + "^", commit_hash)
                branch_result.git_diff = diff
                PatchUtils.save_diff_to_patch_file(
                    diff,
                    FileUtils.join_path(self.basedir,
                                        f"{self.jira_id}-{branch}.diff"))

        # Validate results
        branch_does_not_exist = [
            b_res.branch_name for br, b_res in branch_results.items()
            if not b_res.exists
        ]
        zero_commit = [
            b_res.branch_name for br, b_res in branch_results.items()
            if b_res.number_of_commits == 0
        ]
        multiple_commits = [
            b_res.branch_name for br, b_res in branch_results.items()
            if b_res.number_of_commits > 1
        ]

        LOG.debug("Branch result objects: %s", branch_results)
        if branch_does_not_exist:
            raise ValueError(
                "The following branches are not existing for Jira ID '{}': {}",
                branch_does_not_exist)

        if zero_commit:
            raise ValueError(
                "The following branches do not contain commit for Jira ID '{}': {}",
                self.jira_id, zero_commit)

        if multiple_commits:
            raise ValueError(
                "The following branches contain multiple commits for Jira ID '{}': {}",
                self.jira_id, multiple_commits)

        LOG.info("Generated diff files: ")
        diff_files = FileUtils.find_files(self.basedir,
                                          self.jira_id + "-.*",
                                          single_level=True,
                                          full_path_result=True)
        for f in diff_files:
            LOG.info("%s: %s", f, FileUtils.get_file_size(f))