Add doc impact notifier to Gerrit.

Add a doc impact notifier to Gerrit that will email the documentation
team whenever changes with "DocImpact" in their commit messages are
pushed to Gerrit.

Change-Id: Ibbb4ac740efa60ef44fd4753ad8459437d98e592
diff --git a/notify_doc_impact.py b/notify_doc_impact.py
new file mode 100755
index 0000000..d969eb0
--- /dev/null
+++ b/notify_doc_impact.py
@@ -0,0 +1,89 @@
+#!/usr/bin/env python
+# Copyright (c) 2012 OpenStack, LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+# This is designed to be called by a gerrit hook.  It searched new
+# patchsets for strings like "bug FOO" and updates corresponding Launchpad
+# bugs status.
+
+import argparse
+import re
+import subprocess
+import smtplib
+
+from email.mime.text import MIMEText
+
+BASE_DIR = '/home/gerrit2/review_site'
+EMAIL_TEMPLATE = """
+Hi, I'd like you to take a look at this patch for potential
+documentation impact.
+%s
+
+Log:
+%s
+"""
+DEST_ADDRESS = 'openstack-doc-core@lists.launchpad.net'
+
+def process_impact(git_log, args):
+    """Notify doc team of doc impact"""
+    email_content = EMAIL_TEMPLATE % (args.change_url, git_log)
+    msg = MIMEText(email_content)
+    msg['Subject'] = '[%s] DocImpact review request' % args.project
+    msg['From'] = 'gerrit2@review.openstack.org'
+    msg['To'] = DEST_ADDRESS
+
+    s = smtplib.SMTP('localhost')
+    s.sendmail('gerrit2@review.openstack.org', DEST_ADDRESS, msg.as_string())
+    s.quit()
+
+def docs_impacted(git_log):
+    """Determine if a changes log indicates there is a doc impact"""
+    impact_regexp = r'DocImpact'
+    return re.search(impact_regexp, git_log, re.IGNORECASE)
+
+def extract_git_log(args):
+    """Extract git log of all merged commits"""
+    cmd = ['git',
+           '--git-dir=' + BASE_DIR + '/git/' + args.project + '.git',
+           'log', '--no-merges', args.commit + '^1..' + args.commit]
+    return subprocess.Popen(cmd, stdout=subprocess.PIPE).communicate()[0]
+
+
+def main():
+    parser = argparse.ArgumentParser()
+    parser.add_argument('hook')
+    #common
+    parser.add_argument('--change', default=None)
+    parser.add_argument('--change-url', default=None)
+    parser.add_argument('--project', default=None)
+    parser.add_argument('--branch', default=None)
+    parser.add_argument('--commit', default=None)
+    #change-merged
+    parser.add_argument('--submitter', default=None)
+    #patchset-created
+    parser.add_argument('--uploader', default=None)
+    parser.add_argument('--patchset', default=None)
+
+    args = parser.parse_args()
+
+    # Get git log
+    git_log = extract_git_log(args)
+
+    # Process doc_impacts found in git log
+    if docs_impacted(git_log):
+        process_impact(git_log, args)
+
+
+if __name__ == '__main__':
+    main()