Files
gitdm/logparser.py
Germán Póo-Caamaño 7b26ae2109 Move out the grabpatch from the parser
The class LogPatchSplitter provides an iterator per patch.  This
makes the code cleaner, easier to read and more pythonic.
The class only gets each commit set as lines.

It is possible to test it separately by:
   $ git log | python logparser.py | more

Signed-off-by: Germán Póo-Caamaño <gpoo@gnome.org>
2011-06-22 19:27:47 -07:00

91 lines
2.4 KiB
Python

#!/usr/bin/env python
#-*- coding:utf-8 -*-
#
# Copyright © 2009 Germán Póo-Caamaño <gpoo@gnome.org>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Library General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
import sys
from patterns import patterns
class LogPatchSplitter:
"""
LogPatchSplitters provides a iterator to extract every
changeset from a git log output.
Typical use case:
patches = LogPatchSplitter(sys.stdin)
for patch in patches:
parse_patch(patch)
"""
def __init__(self, fd):
self.fd = fd
self.buffer = None
self.patch = []
def __iter__(self):
return self
def next(self):
patch = self.__grab_patch__()
if not patch:
raise StopIteration
return patch
def __grab_patch__(self):
"""
Extract a patch from the file descriptor and the
patch is returned as a list of lines.
"""
patch = []
line = self.buffer or self.fd.readline()
while line:
m = patterns['commit'].match(line)
if m:
patch = [line]
break
line = self.fd.readline()
if not line:
return None
line = self.fd.readline()
while line:
# If this line starts a new commit, drop out.
m = patterns['commit'].match(line)
if m:
self.buffer = line
break
patch.append(line)
self.buffer = None
line = self.fd.readline()
return patch
if __name__ == '__main__':
patches = LogPatchSplitter(sys.stdin)
for patch in patches:
print '---------- NEW PATCH ----------'
for line in patch:
print line,