Sempre digo que os repositórios são as “redes sociais” dos desenvolvedores. Nos repositórios, desenvolvedores compartilham código, acessam o código de outras pessoas. Mais do que isso, em uma organização de engenharia, repositórios são a “fonte da verdade”.
Recentemente, desenvolvi um notebook para que os consultores da EximiaCo fizessem análises sobre repositórios. A ideia era identificar arquivos modificados com maior frequência e os contribuidores mais ativos. Para isso, utilizei uma biblioteca, bem bacana, chamada GitPython.
! pip install GitPython --quiet
Abaixo uma método de apoio que retorna a relação de modificações em arquivos realizadas em um repositório nos últimos três meses.
import git
from datetime import datetime, timedelta
def get_commits_last_three_months(repo_path, branch_name):
repo = git.Repo(repo_path)
three_months_ago = datetime.now() - timedelta(days=90)
commits = []
# Iterar sobre os commits na branch especificada
for commit in repo.iter_commits(branch_name, since=three_months_ago.isoformat()):
for file_stat in commit.stats.files.items():
file_name, stats = file_stat
entry = safe_get(commit.tree, file_name)
lines = entry.data_stream.read().count(b'\n') + 1 if entry else 0
commit_info = {
'sha': commit.hexsha,
'author': commit.author.name,
'file': file_name,
'changes': stats['lines'],
'insertions' : stats['insertions'],
'deletions': stats['deletions'],
'bytes': entry.size if entry else 0,
'lines': lines
}
commits.append(commit_info)
return commits
O código em si é bastante simples. Além das informações que a própria biblioteca fornece, resolvi calcular também o número de linhas de cada arquivo em um commit específico.
A ideia completa de como utilizo esse código está no notebook.