From 9e6d35490a6542f9c97607f93c2ef8ca8e03cbcc Mon Sep 17 00:00:00 2001 From: Dimitry Andric Date: Wed, 6 Jan 2016 20:12:03 +0000 Subject: Vendor import of lldb trunk r256945: https://llvm.org/svn/llvm-project/lldb/trunk@256945 --- utils/misc/grep-svn-log.py | 85 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100755 utils/misc/grep-svn-log.py (limited to 'utils/misc/grep-svn-log.py') diff --git a/utils/misc/grep-svn-log.py b/utils/misc/grep-svn-log.py new file mode 100755 index 0000000000000..ebbfe33f05204 --- /dev/null +++ b/utils/misc/grep-svn-log.py @@ -0,0 +1,85 @@ +#!/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: + log.finish() + 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) + sys.stdin.close() + +if __name__ == '__main__': + main() -- cgit v1.2.3