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$'


git-svn-id: https://llvm.org/svn/llvm-project/lldb/trunk@143671 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/utils/misc/grep-svn-log.py b/utils/misc/grep-svn-log.py
new file mode 100755
index 0000000..a29df3f
--- /dev/null
+++ b/utils/misc/grep-svn-log.py
@@ -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()