76 lines
2.5 KiB
Python
76 lines
2.5 KiB
Python
|
import datetime
|
||
|
from git import Repo
|
||
|
import os
|
||
|
import json
|
||
|
import click
|
||
|
|
||
|
from elasticsearch import Elasticsearch
|
||
|
|
||
|
|
||
|
class GitLogger:
|
||
|
"""to provide a log as dict of commits which are json printable"""
|
||
|
|
||
|
def __init__(self, path):
|
||
|
"""Create a GitStepper with the path to the git repository (not a bare repository)"""
|
||
|
self.repo = Repo(path)
|
||
|
|
||
|
def log(self):
|
||
|
"""return a dict of commits"""
|
||
|
commits = (self.repo.commit(logEntry) for logEntry in self.repo.iter_commits())
|
||
|
return (self.to_dict(x) for x in commits)
|
||
|
|
||
|
def to_dict(self,commit):
|
||
|
"""create a dict out of a commit that is easy to json serialize"""
|
||
|
time_difference = commit.authored_datetime - commit.committed_datetime
|
||
|
return {
|
||
|
"author_email" : commit.author.email,
|
||
|
"author_name" : commit.author.name,
|
||
|
"authored_date" : commit.authored_datetime.isoformat(),
|
||
|
"files": [{"file":file,"changes":changes} for file,changes in commit.stats.files.items()],
|
||
|
"committed_date" : commit.committed_datetime.isoformat(),
|
||
|
"committer_email" : commit.committer.email,
|
||
|
"committer_name" : commit.committer.name,
|
||
|
"date_difference_in_seconds" : abs( time_difference.total_seconds() ),
|
||
|
"encoding" : commit.encoding,
|
||
|
"hash" : commit.hexsha,
|
||
|
"message" : commit.message ,
|
||
|
"summary" : commit.summary,
|
||
|
"size" : commit.size,
|
||
|
"stats_total" : commit.stats.total,
|
||
|
"parents" : [parent.hexsha for parent in commit.parents],
|
||
|
}
|
||
|
|
||
|
@click.command()
|
||
|
@click.argument("path", type=click.Path(exists=True), envvar='PWD')
|
||
|
@click.option("--host")
|
||
|
@click.option("--index")
|
||
|
@click.option("--port", default=9200)
|
||
|
def main(path, host, index, port):
|
||
|
if host:
|
||
|
if not index:
|
||
|
print("--index need to be set")
|
||
|
exit(1)
|
||
|
|
||
|
print("Sending commits from %s to %s on index %s" % (path, host, index))
|
||
|
es = Elasticsearch([
|
||
|
{'host': host, 'port': port}
|
||
|
])
|
||
|
for entry in GitLogger(path).log():
|
||
|
try:
|
||
|
es.index(
|
||
|
index=index,
|
||
|
doc_type="commit",
|
||
|
id=entry["hash"],
|
||
|
body=entry
|
||
|
)
|
||
|
except Exception as e:
|
||
|
print(json.dumps(entry))
|
||
|
print(e.info)
|
||
|
exit(1)
|
||
|
else:
|
||
|
for entry in GitLogger(path).log():
|
||
|
print(json.dumps( entry ))
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
main()
|