48 lines
1.4 KiB
Python
48 lines
1.4 KiB
Python
from typing import List
|
|
|
|
from src.analyzers.git_repository import GitRepository
|
|
from src.models import RiskyCommitAnalysis
|
|
|
|
|
|
class RiskyCommitDetector:
|
|
"""Detect risky and potentially problematic commits."""
|
|
|
|
def __init__(
|
|
self,
|
|
repo: GitRepository,
|
|
days: int = 30,
|
|
large_commit_threshold: int = 500,
|
|
) -> None:
|
|
"""Initialize RiskyCommitDetector."""
|
|
self.repo = repo
|
|
self.days = days
|
|
self.large_commit_threshold = large_commit_threshold
|
|
|
|
def analyze(self) -> RiskyCommitAnalysis:
|
|
"""Detect risky commits."""
|
|
commits = self.repo.get_commits(since_days=self.days)
|
|
|
|
if not commits:
|
|
return RiskyCommitAnalysis()
|
|
|
|
large_commits = []
|
|
merge_commits = []
|
|
revert_commits = []
|
|
|
|
for commit in commits:
|
|
if commit.lines_changed_count >= self.large_commit_threshold:
|
|
large_commits.append(commit)
|
|
|
|
if commit.is_merge:
|
|
merge_commits.append(commit)
|
|
|
|
if "revert" in commit.message.lower():
|
|
revert_commits.append(commit)
|
|
|
|
return RiskyCommitAnalysis(
|
|
large_commits=large_commits[:20],
|
|
merge_commits=merge_commits[:20],
|
|
revert_commits=revert_commits[:20],
|
|
total_risky=len(large_commits) + len(merge_commits) + len(revert_commits),
|
|
)
|