kriti21

Untitled

Jun 23rd, 2018
30
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.47 KB | None | 0 0
  1. import abc
  2. import re
  3.  
  4. from coalib.bears.GlobalBear import GlobalBear
  5. from coalib.results.HiddenResult import HiddenResult
  6. from coalib.results.Result import Result
  7. from coalib.misc.Shell import run_shell_command
  8. from collections import namedtuple
  9. from coala_utils.decorators import (enforce_signature, generate_ordering,
  10.                                     generate_repr)
  11.  
  12.  
  13. @generate_repr(('id', hex),
  14.                'origin',
  15.                'raw_commit_message',
  16.                'commit_sha',
  17.                'commit_type',
  18.                'modified_files',
  19.                'added_files',
  20.                'deleted_files',
  21.                'message')
  22. @generate_ordering('raw_commit_message',
  23.                'commit_sha',
  24.                'commit_type',
  25.                'modified_files',
  26.                'added_files',
  27.                'deleted_files',
  28.                'severity',
  29.                'confidence',
  30.                'origin',
  31.                'message_base',
  32.                'message_arguments',
  33.                'aspect',
  34.                'additional_info',
  35.                'debug_msg')
  36. class CommitResult(HiddenResult):
  37.  
  38.     @enforce_signature
  39.     def __init__(self, origin, raw_commit_message: str,
  40.                  commit_sha: str, commit_type: list, modified_files: list,
  41.                  added_files: list, deleted_files: list):
  42.         Result.__init__(self, origin, 'HEAD commit information')
  43.         self.raw_commit_message = raw_commit_message
  44.         self.commit_sha = commit_sha
  45.         self.commit_type = commit_type
  46.         self.modified_files = modified_files
  47.         self.added_files = added_files
  48.         self.deleted_files = deleted_files
  49.  
  50.  
  51. class VCSCommitBear(GlobalBear):
  52.     __metaclass__ = abc.ABCMeta
  53.     LANGUAGES = {'Git'}
  54.     AUTHORS = {'The coala developers'}
  55.     AUTHORS_EMAILS = {'coala-devel@googlegroups.com'}
  56.     LICENSE = 'AGPL-3.0'
  57.  
  58.     @abc.abstractmethod
  59.     def get_head_commit(self):
  60.         """
  61.        Return the commit message from the head commit
  62.        """
  63.  
  64.     def analyze_git_commit(self, head_commit):
  65.         commit_info = namedtuple('Commit_Info',
  66.                                  'raw_commit_message commit_sha commit_type '
  67.                                  'modified_files added_files deleted_files')
  68.  
  69.         raw_commit_message = head_commit
  70.  
  71.         commit_sha = run_shell_command('git rev-parse HEAD')[0].strip('\n')
  72.  
  73.         commit_type = []
  74.  
  75.         head_commit = head_commit.strip('\n')
  76.  
  77.         ciskip_regex = re.compile(r'\[ci skip\]|\[skip ci\]')
  78.         match = re.search(ciskip_regex, head_commit)
  79.         if match:
  80.             commit_type.append('ci_skip_commit')
  81.  
  82.         get_parent_commits = 'git log --pretty=%P -n 1 ' + commit_sha
  83.         parent_commits = run_shell_command(get_parent_commits)[0]
  84.         parent_commits_list = parent_commits.split('\n')
  85.  
  86.         if len(parent_commits_list) >= 2:
  87.             commit_type.append('merge_commit')
  88.  
  89.         get_all_committed_files = ('git show --pretty="" --name-status ' +
  90.                                    commit_sha)
  91.         all_committed_files = run_shell_command(get_all_committed_files)[0]
  92.         all_committed_files = all_committed_files.split('\n')
  93.  
  94.         modified_files_list = []
  95.         added_files_list = []
  96.         deleted_files_list = []
  97.  
  98.         for line in all_committed_files:
  99.             pos = line.find('\t')
  100.             change = line[:pos]
  101.             if change == 'M':
  102.                 modified_files_list.append(line[pos+1:])
  103.             elif change == 'A':
  104.                 added_files_list.append(line[pos+1:])
  105.             elif change == 'D':
  106.                 deleted_files_list.append(line[pos+1:])
  107.  
  108.         commit_info.raw_commit_message = raw_commit_message
  109.         commit_info.commit_sha = commit_sha
  110.         commit_info.commit_type = commit_type
  111.         commit_info.modified_files = modified_files_list
  112.         commit_info.added_files = added_files_list
  113.         commit_info.deleted_files = deleted_files_list
  114.  
  115.         return (raw_commit_message, commit_sha, commit_type,
  116.                 modified_files_list, added_files_list, deleted_files_list)
  117.  
  118.     def run(self, **kwargs):
  119.         head_commit, _ = self.get_head_commit()
  120.  
  121.         raw_commit_message, commit_sha, commit_type, modified_files, added_files, deleted_files = self.analyze_git_commit(
  122.             head_commit)
  123.  
  124.         yield CommitResult(self, raw_commit_message, commit_sha, commit_type,
  125.                            modified_files, added_files, deleted_files)
Add Comment
Please, Sign In to add comment