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()