Merge "Remove launchpad mappings for cookbook-* repos"
diff --git a/jeepyb/cmd/update_bug.py b/jeepyb/cmd/update_bug.py
index fdf2b5a..f714e18 100644
--- a/jeepyb/cmd/update_bug.py
+++ b/jeepyb/cmd/update_bug.py
@@ -59,7 +59,8 @@
                               submitter, branch, git_log, related=False):
     subject = '%s merged to %s (%s)' % (fix_or_related_fix(related),
                                         u.short_project_name(project), branch)
-    git_url = 'http://github.com/%s/commit/%s' % (project, commit)
+    git_url = 'https://git.openstack.org/cgit/%s/commit/?id=%s' % (project,
+                                                                   commit)
     body = '''Reviewed:  %s
 Committed: %s
 Submitter: %s
diff --git a/jeepyb/cmd/welcome_message.py b/jeepyb/cmd/welcome_message.py
new file mode 100644
index 0000000..31df892
--- /dev/null
+++ b/jeepyb/cmd/welcome_message.py
@@ -0,0 +1,142 @@
+#!/usr/bin/env python
+#
+# 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 those from a first time commiter, then posts a helpful
+# message welcoming them to the community and explaining the review process
+#
+# For example, this might be called as follows
+# python welcome_message.py -change Ia1fea1eab3976f1a9cb89ceb3ce1c6c6a7e79c42
+# --change-url \ https://review-dev.openstack.org/81 --project gtest-org/test \
+# --branch master --uploader User A. Example (user@example.com) --commit \
+# 05508ae633852469d2fd7786a3d6f1d06f87055b --patchset 1 patchset-merged user \
+# ~/.ssh/id_rsa
+# and if this was the first commit from "user@example.com", a message
+# would be posted on review 81.
+
+
+import argparse
+import logging
+import paramiko
+
+import jeepyb.gerritdb
+
+BASE_DIR = '/home/gerrit2/review_site'
+
+logger = logging.getLogger('welcome_reviews')
+logger.setLevel(logging.INFO)
+
+
+def is_newbie(uploader):
+    """Determine if the owner of the patch is a first-timer."""
+
+    # Retrieve uploader email
+    try:
+        searchkey = uploader[uploader.rindex("(") + 1:-1]
+    except ValueError:
+        logger.info('Couldnt get email for %s', uploader)
+        return False
+
+    # this query looks for all distinct patchsets for the given
+    # user. If there's only 1, they're a first-timer.
+    query = """SELECT COUNT(DISTINCT p.change_id + p.patch_set_id)
+               FROM patch_sets p, account_external_ids a
+               WHERE a.email_address = %s
+               AND a.account_id = p.uploader_account_id;"""
+
+    cursor = jeepyb.gerritdb.connect().cursor()
+    cursor.execute(query, searchkey)
+    data = cursor.fetchone()
+    if data:
+        if data[0] == "1":
+            return True
+        else:
+            return False
+
+
+def post_message(change_id, gerrit_user, gerrit_ssh_key):
+    """Post a welcome message on the patch set specified by the change_id."""
+
+    welcome_text = """Thank you for your first contribution to OpenStack.
+
+    Your patch will now be tested automatically by OpenStack testing frameworks
+    and once the automatic tests pass, it will be reviewed by other friendly
+    developers. They will give you feedback and may require you to refine it.
+
+    People seldom get their patch approved on the first try, so don't be
+    concerned if requested to make corrections. Feel free to modify your patch
+    and resubmit a new change-set.
+
+    Patches usually take 3 to 7 days to be reviewed so be patient and be
+    available on IRC to ask and answer questions about your work. The more you
+    participate in the community the more rewarding it is for you. You may also
+    notice that the more you get to know people and get to be known, the faster
+    your patches will be reviewed and eventually approved. Get to know others
+    and become known by doing code reviews: anybody can do it, and it's a
+    great way to learn the code base.
+
+    Thanks again for supporting OpenStack, we look forward to working with you.
+
+    IRC: https://wiki.openstack.org/wiki/IRC
+    Workflow: https://wiki.openstack.org/wiki/Gerrit_Workflow
+    """
+    # get the patch_id
+    query = """SELECT change_id FROM patch_sets WHERE change_id = %s;"""
+
+    cursor = jeepyb.gerritdb.connect().cursor()
+    cursor.execute(query, change_id)
+    data = cursor.fetchone()
+    if data[0]:
+        # post the above message, using ssh.
+        command = ('gerrit review '
+                   '--message="{message}" {patch_id}').format(
+                       message=welcome_text,
+                       patch_id=data)
+        logger.info('Welcoming: %s', data[0])
+        ssh = paramiko.SSHClient()
+        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
+        ssh.connect('localhost', username=gerrit_user,
+                    key_filename=gerrit_ssh_key, port=29418)
+        stdin, stdout, stderr = ssh.exec_command(command)
+
+    else:
+        logger.info('Unable to find patch_id for change_id=%s', change_id)
+
+
+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)
+    # for Welcome Message
+    parser.add_argument('user', help='The gerrit admin user')
+    parser.add_argument('ssh_key', help='The gerrit admin SSH key file')
+
+    args = parser.parse_args()
+
+    # they're a first-timer, post the message on 1st patchset
+    if is_newbie(args.uploader) and args.patchset == 1:
+        post_message(args.change, args.user, args.ssh_key)
+
+if __name__ == "__main__":
+    main()