-
-
Save mrVanDalo/6a1d1aed4bd613fbdf1fa751fca47c6a to your computer and use it in GitHub Desktop.
| from git import Repo | |
| import os | |
| import json | |
| import click | |
| 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""" | |
| return { | |
| "author_email" : commit.author.email, | |
| "author_name" : commit.author.name, | |
| "authored_date" : commit.authored_datetime.isoformat(), | |
| "changes": commit.stats.files, | |
| "committed_date" : commit.committed_datetime.isoformat(), | |
| "committer_email" : commit.committer.email, | |
| "committer_name" : commit.committer.name, | |
| "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') | |
| def main(path): | |
| for entry in GitLogger(path).log(): | |
| print(json.dumps(entry)) | |
| if __name__ == '__main__': | |
| main() | |
huge judos to you!
@mrVanDalo
Any idea if GitLogger(path).log() could passing args like --no-merges and rev1..rev2 ?
@butterl I guess so. I think you'll have to pass theses arguments to the self.repo during the iter_commits() call. Documentation is here
Thanks, I format the kwargs and rev to make proper param, that works. from begining I do not understand kwargs meaning
By the way ,I modified your example for multi-repo use case, the codeline
commits = (self.repo.commit(logEntry) for logEntry in self.repo.iter_commits())
may failed to catch exception for error handel(I guess lambda made exception not catchable) , if gitpython api raised one
In my case the git rev-list may face rev not exist issue in multi repo , I modified it to list way to handle exception
Thanks, I format the kwargs and rev to make proper param, that works. from begining I do not understand kwargs meaning
Yeah I'm no python expert, I actually barley use it. I would just try and error my way through the kwargs.
By the way ,I modified your example for multi-repo use case, the codeline
commits = (self.repo.commit(logEntry) for logEntry in self.repo.iter_commits())
may failed to catch exception for error handel(I guess lambda made exception not catchable) , if gitpython api raised one
In my case the git rev-list may face rev not exist issue in multi repo , I modified it to list way to handle exception
Sounds reasonable. I used the (.. for key in ... ) form because the documentation says it's lazy. I was working with quite big repositories. Creating a list upfront was consuming to much RAM (in my cases). But if it works for you, all good :D
Dope!