forked from OSchip/llvm-project
Add a utility script:
Greps and returns the first svn log entry containing a line matching the regular expression pattern passed as the only arg. Example: svn log -v | grep-svn-log.py '^ D.+why_are_you_missing.h$' llvm-svn: 143671
This commit is contained in:
parent
8a98ec4d4b
commit
e79a8d3dce
lldb/utils/misc
|
@ -0,0 +1,83 @@
|
|||
#!/usr/bin/env python
|
||||
|
||||
"""
|
||||
Greps and returns the first svn log entry containing a line matching the regular
|
||||
expression pattern passed as the only arg.
|
||||
|
||||
Example:
|
||||
|
||||
svn log -v | grep-svn-log.py '^ D.+why_are_you_missing.h$'
|
||||
"""
|
||||
|
||||
import fileinput, re, sys, StringIO
|
||||
|
||||
# Separator string for "svn log -v" output.
|
||||
separator = '-' * 72
|
||||
|
||||
usage = """Usage: grep-svn-log.py line-pattern
|
||||
Example:
|
||||
svn log -v | grep-svn-log.py '^ D.+why_are_you_missing.h'"""
|
||||
|
||||
class Log(StringIO.StringIO):
|
||||
"""Simple facade to keep track of the log content."""
|
||||
def __init__(self):
|
||||
self.reset()
|
||||
def add_line(self, a_line):
|
||||
"""Add a line to the content, if there is a previous line, commit it."""
|
||||
global separator
|
||||
if self.prev_line != None:
|
||||
print >> self, self.prev_line
|
||||
self.prev_line = a_line
|
||||
self.separator_added = (a_line == separator)
|
||||
def del_line(self):
|
||||
"""Forget about the previous line, do not commit it."""
|
||||
self.prev_line = None
|
||||
def reset(self):
|
||||
"""Forget about the previous lines entered."""
|
||||
StringIO.StringIO.__init__(self)
|
||||
self.prev_line = None
|
||||
def finish(self):
|
||||
"""Call this when you're finished with populating content."""
|
||||
if self.prev_line != None:
|
||||
print >> self, self.prev_line
|
||||
self.prev_line = None
|
||||
|
||||
def grep(regexp):
|
||||
# The log content to be written out once a match is found.
|
||||
log = Log()
|
||||
|
||||
LOOKING_FOR_MATCH = 0
|
||||
FOUND_LINE_MATCH = 1
|
||||
state = LOOKING_FOR_MATCH
|
||||
|
||||
while 1:
|
||||
line = sys.stdin.readline()
|
||||
if not line:
|
||||
return
|
||||
line = line.splitlines()[0]
|
||||
if state == FOUND_LINE_MATCH:
|
||||
# At this state, we keep on accumulating lines until the separator
|
||||
# is encountered. At which point, we can return the log content.
|
||||
if line == separator:
|
||||
print log.getvalue()
|
||||
return
|
||||
log.add_line(line)
|
||||
|
||||
elif state == LOOKING_FOR_MATCH:
|
||||
if line == separator:
|
||||
log.reset()
|
||||
log.add_line(line)
|
||||
# Update next state if necessary.
|
||||
if regexp.search(line):
|
||||
state = FOUND_LINE_MATCH
|
||||
|
||||
def main():
|
||||
if len(sys.argv) != 2:
|
||||
print usage
|
||||
sys.exit(0)
|
||||
|
||||
regexp = re.compile(sys.argv[1])
|
||||
grep(regexp)
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
Loading…
Reference in New Issue