Merge "Set default branch in .gitreview files when creating project"
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 8d875fe..0760a5c 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,16 +1,16 @@
-If you would like to contribute to the development of OpenStack,
+If you would like to contribute to the development of OpenDev,
 you must follow the steps in this page:
 
-   [https://docs.openstack.org/infra/manual/developers.html](https://docs.openstack.org/infra/manual/developers.html)
+   [https://docs.opendev.org/opendev/infra-manual/latest/developers.html](https://docs.opendev.org/opendev/infra-manual/latest/developers.html)
 
 If you already have a good understanding of how the system works and your
-OpenStack accounts are set up, you can skip to the development workflow section
-of this documentation to learn how changes to OpenStack should be submitted for
+OpenDev accounts are set up, you can skip to the development workflow section
+of this documentation to learn how changes to OpenDev should be submitted for
 review via the Gerrit tool:
 
-   [https://docs.openstack.org/infra/manual/developers.html#development-workflow](https://docs.openstack.org/infra/manual/developers.html#development-workflow)
+   [https://docs.opendev.org/opendev/infra-manual/latest/developers.html#development-workflow](https://docs.opendev.org/opendev/infra-manual/latest/developers.html#development-workflow)
 
 Pull requests submitted through GitHub will be ignored.
 
-Bugs should be filed [on StoryBoard](https://storyboard.openstack.org/#!/project/722),
+Bugs should be filed [on StoryBoard](https://storyboard.openstack.org/#!/project/opendev/jeepyb),
 not in GitHub's issue tracker.
diff --git a/jeepyb/cmd/close_pull_requests.py b/jeepyb/cmd/close_pull_requests.py
index 4ead4ad..e8265df 100644
--- a/jeepyb/cmd/close_pull_requests.py
+++ b/jeepyb/cmd/close_pull_requests.py
@@ -1,5 +1,5 @@
 #! /usr/bin/env python
-# Copyright (C) 2011 OpenStack, LLC.
+# Copyright (C) 2011 OpenStack Foundation
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -16,15 +16,9 @@
 # Github pull requests closer reads a project config file called projects.yaml
 # It should look like:
 
-# - homepage: http://openstack.org
-#   team-id: 153703
-#   has-wiki: False
-#   has-issues: False
-#   has-downloads: False
-# ---
 # - project: PROJECT_NAME
 #   options:
-#   - has-pull-requests
+#     - has-pull-requests
 
 # Github authentication information is read from github.secure.config,
 # which should look like:
@@ -44,20 +38,20 @@
 import logging
 import os
 
-import jeepyb.log as l
+import jeepyb.log
 import jeepyb.projects as p
 import jeepyb.utils as u
 
-MESSAGE = """Thank you for contributing to %(project)s!
+MESSAGE = """Thank you for your interest in %(project)s!
 
 %(project)s uses Gerrit for code review.
 
-If you have never contributed to OpenStack before make sure you have read the
-getting started documentation:
-https://docs.openstack.org/infra/manual/developers.html#getting-started
+If you have never contributed to an OpenDev hosted project before
+make sure you have read the getting started documentation:
+https://docs.opendev.org/opendev/infra-manual/latest/developers.html#getting-started
 
 Otherwise please visit
-https://docs.openstack.org/infra/manual/developers.html#development-workflow
+https://docs.opendev.org/opendev/infra-manual/latest/developers.html#development-workflow
 and follow the instructions there to upload your change to Gerrit.
 """
 
@@ -67,12 +61,12 @@
 def main():
 
     parser = argparse.ArgumentParser()
-    l.setup_logging_arguments(parser)
+    jeepyb.log.setup_logging_arguments(parser)
     parser.add_argument('--message-file', dest='message_file', default=None,
                         help='The close pull request message')
 
     args = parser.parse_args()
-    l.configure_logging(args)
+    jeepyb.log.configure_logging(args)
 
     if args.message_file:
         try:
@@ -136,5 +130,6 @@
             issue.create_comment(pull_request_text % vars)
             req.edit(state="closed")
 
+
 if __name__ == "__main__":
     main()
diff --git a/jeepyb/cmd/create_hound_config.py b/jeepyb/cmd/create_hound_config.py
index 601ba74..373ae02 100644
--- a/jeepyb/cmd/create_hound_config.py
+++ b/jeepyb/cmd/create_hound_config.py
@@ -19,14 +19,14 @@
 import json
 import os
 
+import jeepyb.utils as u
+
 # Python2 has unicode as a builtin
 # Python3 does not
 import sys
 if sys.version_info[0] >= 3:
     unicode = str
 
-import jeepyb.utils as u
-
 
 PROJECTS_YAML = os.environ.get('PROJECTS_YAML', '/home/hound/projects.yaml')
 GIT_SERVER = os.environ.get('GIT_BASE', 'opendev.org')
diff --git a/jeepyb/cmd/expire_old_reviews.py b/jeepyb/cmd/expire_old_reviews.py
index 5a62c05..2dbd015 100644
--- a/jeepyb/cmd/expire_old_reviews.py
+++ b/jeepyb/cmd/expire_old_reviews.py
@@ -1,5 +1,5 @@
 #!/usr/bin/env python
-# Copyright (c) 2012 OpenStack, LLC.
+# Copyright (c) 2012 OpenStack Foundation
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -22,16 +22,16 @@
 import logging
 import paramiko
 
-import jeepyb.log as l
+import jeepyb.log
 
 logger = logging.getLogger('expire_reviews')
 
 
 def expire_patch_set(ssh, patch_id, patch_subject):
-    message = ('Code review expired due to no recent activity'
-               ' after a negative review. It can be restored using'
-               ' the \`Restore Change\` button under the Patch Set'
-               ' on the web interface.')
+    message = ("Code review expired due to no recent activity"
+               " after a negative review. It can be restored using"
+               " the 'Restore Change' button under the Patch Set"
+               " on the web interface.")
     command = ('gerrit review --abandon '
                '--message="{message}" {patch_id}').format(
                    message=message,
@@ -50,9 +50,9 @@
     parser.add_argument('ssh_key', help='The gerrit admin SSH key file')
     parser.add_argument('--age', dest='age', default='1w',
                         help='The minimum age of a review to expire')
-    l.setup_logging_arguments(parser)
+    jeepyb.log.setup_logging_arguments(parser)
     options = parser.parse_args()
-    l.configure_logging(options)
+    jeepyb.log.configure_logging(options)
 
     GERRIT_USER = options.user
     GERRIT_SSH_KEY = options.ssh_key
@@ -85,5 +85,6 @@
 
     logger.info('End expire review')
 
+
 if __name__ == "__main__":
     main()
diff --git a/jeepyb/cmd/manage_projects.py b/jeepyb/cmd/manage_projects.py
index 4b29e56..212d899 100644
--- a/jeepyb/cmd/manage_projects.py
+++ b/jeepyb/cmd/manage_projects.py
@@ -1,5 +1,5 @@
 #! /usr/bin/env python
-# Copyright (C) 2011 OpenStack, LLC.
+# Copyright (C) 2011 OpenStack Foundation
 # Copyright (c) 2012 Hewlett-Packard Development Company, L.P.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
@@ -16,20 +16,17 @@
 
 # manage_projects.py reads a config file called projects.ini
 # It should look like:
-
+#
 # [projects]
-# homepage=http://openstack.org
-# gerrit-host=review.openstack.org
-# local-git-dir=/var/lib/git
-# gerrit-key=/home/gerrit2/review_site/etc/ssh_host_rsa_key
-# gerrit-committer=Project Creator <openstack-infra@lists.openstack.org>
-# gerrit-replicate=True
-# has-github=True
-# has-wiki=False
-# has-issues=False
-# has-downloads=False
+# homepage=https://opendev.org
 # acl-dir=/home/gerrit2/acls
-# acl-base=/home/gerrit2/acls/project.config
+# local-git-dir=/opt/lib/git
+# jeepyb-cache-dir=/opt/lib/jeepyb
+# gerrit-host=review.opendev.org
+# gerrit-user=project-creator
+# gerrit-committer=Project Creator <project-creator@opendev.org>
+# gerrit-key=/home/gerrit2/review_site/etc/ssh_project_rsa_key
+# has-github=false
 #
 # manage_projects.py reads a project listing file called projects.yaml
 # It should look like:
@@ -40,7 +37,7 @@
 #    - has-downloads
 #    - has-pull-requests
 #    - track-upstream
-#   homepage: Some homepage that isn't http://openstack.org
+#   homepage: Some homepage that isn't http://opendev.org
 #   description: This is a great project
 #   upstream: https://gerrit.googlesource.com/gerrit
 #   upstream-prefix: upstream
@@ -65,7 +62,7 @@
 import gerritlib.gerrit
 import github
 
-import jeepyb.log as l
+import jeepyb.log
 import jeepyb.utils as u
 
 registry = u.ProjectsRegistry()
@@ -74,7 +71,7 @@
 orgs = None
 
 # Gerrit system groups as defined:
-# https://review.openstack.org/Documentation/access-control.html#system_groups
+# https://review.opendev.org/Documentation/access-control.html#system_groups
 # Need to set Gerrit system group's uuid to the format it expects.
 GERRIT_SYSTEM_GROUPS = {
     'Anonymous Users': 'global:Anonymous-Users',
@@ -421,17 +418,17 @@
 
 def main():
     parser = argparse.ArgumentParser(description='Manage projects')
-    l.setup_logging_arguments(parser)
+    jeepyb.log.setup_logging_arguments(parser)
     parser.add_argument('--nocleanup', action='store_true',
                         help='do not remove temp directories')
     parser.add_argument('projects', metavar='project', nargs='*',
                         help='name of project(s) to process')
     args = parser.parse_args()
-    l.configure_logging(args)
+    jeepyb.log.configure_logging(args)
 
     default_has_github = registry.get_defaults('has-github', True)
 
-    LOCAL_GIT_DIR = registry.get_defaults('local-git-dir', '/var/lib/git')
+    LOCAL_GIT_DIR = registry.get_defaults('local-git-dir', None)
     JEEPYB_CACHE_DIR = registry.get_defaults('jeepyb-cache-dir',
                                              '/var/lib/jeepyb')
     ACL_DIR = registry.get_defaults('acl-dir')
@@ -550,9 +547,12 @@
                         gerrit.replicate(project)
 
                 # Create the repo for the local git mirror
-                create_local_mirror(
-                    LOCAL_GIT_DIR, project_git,
-                    GERRIT_OS_SYSTEM_USER, GERRIT_OS_SYSTEM_GROUP)
+                if LOCAL_GIT_DIR:
+                    # This is conditional because new gerrit url pathing
+                    # has made local git mirrors less straightfoward.
+                    create_local_mirror(
+                        LOCAL_GIT_DIR, project_git,
+                        GERRIT_OS_SYSTEM_USER, GERRIT_OS_SYSTEM_GROUP)
 
                 if acl_config:
                     acl_sha = acl_cache.get(acl_config)
diff --git a/jeepyb/cmd/notify_impact.py b/jeepyb/cmd/notify_impact.py
index 5b402f5..0636c06 100644
--- a/jeepyb/cmd/notify_impact.py
+++ b/jeepyb/cmd/notify_impact.py
@@ -1,5 +1,5 @@
 #!/usr/bin/env python
-# Copyright (c) 2012 OpenStack, LLC.
+# Copyright (c) 2012 OpenStack Foundation
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -19,7 +19,7 @@
 
 # You want to test this? I use a command line a bit like this:
 #     python notify_impact.py --change 55607 \
-#     --change-url https://review.openstack.org/55607 --project nova/ \
+#     --change-url https://review.opendev.org/55607 --project nova/ \
 #     --branch master --commit c262de4417d48be599c3a7496ef94de5c84b188c \
 #     --impact DocImpact --dest-address none@localhost --dryrun \
 #     --config foo.yaml \
@@ -132,7 +132,7 @@
                    'the documentation bugs against it. If this needs '
                    'changing, the docimpact-group option needs to be added '
                    'for the project. You can ask the '
-                   'OpenStack infra team (#openstack-infra on freenode) for '
+                   'OpenStack TaCT SIG (#openstack-infra on freenode) for '
                    'help if you need to.\n'
                    % args.project)
         lp_project = project_name
@@ -291,7 +291,7 @@
 
     # SMTP configuration
     parser.add_argument('--smtp-from', dest='smtp_from',
-                        default='gerrit2@review.openstack.org')
+                        default='gerrit2@review.opendev.org')
 
     parser.add_argument('--smtp-host', dest='smtp_host', default="localhost")
     parser.add_argument('--smtp-port', dest='smtp_port')
@@ -334,5 +334,6 @@
     if impacted(git_log, args.impact):
         process_impact(git_log, args, config)
 
+
 if __name__ == "__main__":
     main()
diff --git a/jeepyb/cmd/openstackwatch.py b/jeepyb/cmd/openstackwatch.py
index c9d6a54..264112f 100644
--- a/jeepyb/cmd/openstackwatch.py
+++ b/jeepyb/cmd/openstackwatch.py
@@ -78,6 +78,7 @@
                                     OUTPUT_MODE)
     return ret
 
+
 try:
     conffile = sys.argv[1]
 except IndexError:
@@ -174,5 +175,6 @@
             else:
                 print(content)
 
+
 if __name__ == '__main__':
     main()
diff --git a/jeepyb/cmd/register_zanata_projects.py b/jeepyb/cmd/register_zanata_projects.py
index 6d64625..b737909 100644
--- a/jeepyb/cmd/register_zanata_projects.py
+++ b/jeepyb/cmd/register_zanata_projects.py
@@ -18,7 +18,7 @@
 import logging
 import os
 
-import jeepyb.log as l
+import jeepyb.log
 import jeepyb.projects as p
 import jeepyb.translations as t
 import jeepyb.utils as u
@@ -33,9 +33,9 @@
 
 def main():
     parser = argparse.ArgumentParser(description='Register projects in Zanata')
-    l.setup_logging_arguments(parser)
+    jeepyb.log.setup_logging_arguments(parser)
     args = parser.parse_args()
-    l.configure_logging(args)
+    jeepyb.log.configure_logging(args)
 
     registry = u.ProjectsRegistry(PROJECTS_YAML)
     rest_service = t.ZanataRestService(ZANATA_URL, ZANATA_USER, ZANATA_KEY)
diff --git a/jeepyb/cmd/track_upstream.py b/jeepyb/cmd/track_upstream.py
index 846dc96..4a30c61 100644
--- a/jeepyb/cmd/track_upstream.py
+++ b/jeepyb/cmd/track_upstream.py
@@ -1,5 +1,5 @@
 #! /usr/bin/env python
-# Copyright (C) 2011 OpenStack, LLC.
+# Copyright (C) 2011 OpenStack Foundation
 # Copyright (c) 2012 Hewlett-Packard Development Company, L.P.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
@@ -18,18 +18,15 @@
 # It should look like:
 
 # [projects]
-# homepage=http://openstack.org
-# gerrit-host=review.openstack.org
-# local-git-dir=/var/lib/git
-# gerrit-key=/home/gerrit2/review_site/etc/ssh_host_rsa_key
-# gerrit-committer=Project Creator <openstack-infra@lists.openstack.org>
-# gerrit-replicate=True
-# has-github=True
-# has-wiki=False
-# has-issues=False
-# has-downloads=False
+# homepage=https://opendev.org
 # acl-dir=/home/gerrit2/acls
-# acl-base=/home/gerrit2/acls/project.config
+# local-git-dir=/opt/lib/git
+# jeepyb-cache-dir=/opt/lib/jeepyb
+# gerrit-host=review.opendev.org
+# gerrit-user=project-creator
+# gerrit-committer=Project Creator <project-creator@opendev.org>
+# gerrit-key=/home/gerrit2/review_site/etc/ssh_project_rsa_key
+# has-github=false
 #
 # manage_projects.py reads a project listing file called projects.yaml
 # It should look like:
@@ -40,7 +37,7 @@
 #    - has-downloads
 #    - has-pull-requests
 #    - track-upstream
-#   homepage: Some homepage that isn't http://openstack.org
+#   homepage: Some homepage that isn't http://opendev.org
 #   description: This is a great project
 #   upstream: https://gerrit.googlesource.com/gerrit
 #   upstream-prefix: upstream
@@ -57,7 +54,7 @@
 
 import gerritlib.gerrit
 
-import jeepyb.log as l
+import jeepyb.log
 import jeepyb.utils as u
 
 registry = u.ProjectsRegistry()
@@ -142,13 +139,13 @@
 
 def main():
     parser = argparse.ArgumentParser(description='Manage projects')
-    l.setup_logging_arguments(parser)
+    jeepyb.log.setup_logging_arguments(parser)
     parser.add_argument('--nocleanup', action='store_true',
                         help='do not remove temp directories')
     parser.add_argument('projects', metavar='project', nargs='*',
                         help='name of project(s) to process')
     args = parser.parse_args()
-    l.configure_logging(args)
+    jeepyb.log.configure_logging(args)
 
     JEEPYB_CACHE_DIR = registry.get_defaults('jeepyb-cache-dir',
                                              '/var/lib/jeepyb')
@@ -227,5 +224,6 @@
     finally:
         os.unlink(ssh_env['GIT_SSH'])
 
+
 if __name__ == "__main__":
     main()
diff --git a/jeepyb/cmd/trivial_rebase.py b/jeepyb/cmd/trivial_rebase.py
index 19e192b..2c8bfef 100644
--- a/jeepyb/cmd/trivial_rebase.py
+++ b/jeepyb/cmd/trivial_rebase.py
@@ -282,5 +282,6 @@
         SuExec(options, approval["account_id"], ' '.join(gerrit_approve_cmd))
     sys.exit(0)
 
+
 if __name__ == "__main__":
     main()
diff --git a/jeepyb/cmd/update_blueprint.py b/jeepyb/cmd/update_blueprint.py
index 22efa84..07bcce9 100644
--- a/jeepyb/cmd/update_blueprint.py
+++ b/jeepyb/cmd/update_blueprint.py
@@ -1,5 +1,5 @@
 #!/usr/bin/env python
-# Copyright (c) 2011 OpenStack, LLC.
+# Copyright (c) 2011 OpenStack Foundation
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -60,6 +60,7 @@
     c.readfp(fp)
     return c
 
+
 GERRIT_CONFIG = get_broken_config(GERRIT_CONFIG)
 SECURE_CONFIG = get_broken_config(GERRIT_SECURE_CONFIG)
 DB_HOST = GERRIT_CONFIG.get("database", "hostname")
@@ -173,5 +174,6 @@
 
     find_specs(lpconn, conn, args)
 
+
 if __name__ == "__main__":
     main()
diff --git a/jeepyb/cmd/update_bug.py b/jeepyb/cmd/update_bug.py
index 64fa536..31fecf7 100644
--- a/jeepyb/cmd/update_bug.py
+++ b/jeepyb/cmd/update_bug.py
@@ -1,5 +1,5 @@
 #!/usr/bin/env python
-# Copyright (c) 2011 OpenStack, LLC.
+# Copyright (c) 2011 OpenStack Foundation
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -25,7 +25,6 @@
 from launchpadlib import launchpad
 from launchpadlib import uris
 
-import jeepyb.gerritdb
 from jeepyb import projects as p
 from jeepyb import utils as u
 
@@ -73,8 +72,7 @@
                               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 = 'https://git.openstack.org/cgit/%s/commit/?id=%s' % (project,
-                                                                   commit)
+    git_url = 'https://opendev.org/%s/commit/%s' % (project, commit)
     body = '''Reviewed:  %s
 Committed: %s
 Submitter: %s
@@ -83,51 +81,8 @@
     bugtask.bug.newMessage(subject=subject, content=body)
 
 
-def set_in_progress(bugtask, launchpad, uploader, change_url):
-    """Set bug In progress with assignee being the uploader"""
-
-    # Retrieve uploader from Launchpad by correlating Gerrit E-mail
-    # address to OpenID, and only set if there is a clear match.
-    try:
-        searchkey = uploader[uploader.rindex("(") + 1:-1]
-    except ValueError:
-        searchkey = uploader
-
-    # The counterintuitive query is due to odd database schema choices
-    # in Gerrit. For example, an account with a secondary E-mail
-    # address added looks like...
-    # select email_address,external_id from account_external_ids
-    #     where account_id=1234;
-    # +-----------------+-----------------------------------------+
-    # | email_address   | external_id                             |
-    # +-----------------+-----------------------------------------+
-    # | plugh@xyzzy.com | https://login.ubuntu.com/+id/fR0bnU1 |
-    # | bar@foo.org     | mailto:bar@foo.org                      |
-    # | NULL            | username:quux                           |
-    # +-----------------+-----------------------------------------+
-    # ...thus we need a join on a secondary query to search against
-    # all the user's configured E-mail addresses.
-    #
-    # Worse, we also need to filter by active accounts only since
-    # picking an inactive account could result in using the wrong
-    # OpenId entirely.
-    #
-    query = """SELECT t.external_id FROM account_external_ids t
-            INNER JOIN (
-                SELECT t.account_id FROM account_external_ids t
-                WHERE t.email_address = %s )
-            original ON t.account_id = original.account_id
-            AND t.external_id LIKE 'https://login.ubuntu.com%%'
-            JOIN accounts a ON a.account_id = t.account_id
-            WHERE a.inactive = 'N'"""
-
-    cursor = jeepyb.gerritdb.connect().cursor()
-    cursor.execute(query, searchkey)
-    data = cursor.fetchone()
-    if data:
-        assignee = launchpad.people.getByOpenIDIdentifier(identifier=data[0])
-        if assignee:
-            bugtask.assignee = assignee
+def set_in_progress(bugtask, launchpad, change_url):
+    """Set bug In progress"""
 
     bugtask.status = "In Progress"
     bugtask.lp_save()
@@ -256,8 +211,7 @@
         if args.branch == 'master':
             if (bugtask.status not in [u'Fix Committed', u'Fix Released'] and
                     task.needs_change('set_in_progress')):
-                set_in_progress(bugtask, launchpad,
-                                args.uploader, args.change_url)
+                set_in_progress(bugtask, launchpad, args.change_url)
         else:
             series = args.branch.rsplit('/', 1)[-1]
 
@@ -268,8 +222,7 @@
                         task.needs_change('set_in_progress') and
                         reltask.status not in [u'Fix Committed',
                                                u'Fix Released']):
-                    set_in_progress(reltask, launchpad,
-                                    args.uploader, args.change_url)
+                    set_in_progress(reltask, launchpad, args.change_url)
                     break
 
         if args.patchset == '1' and (task.needs_change('add_comment') or
@@ -350,16 +303,19 @@
     parser.add_argument('--commit', default=None)
     parser.add_argument('--topic', default=None)
     parser.add_argument('--change-owner', default=None)
+    parser.add_argument('--change-owner-username', default=None)
     # change-abandoned
     parser.add_argument('--abandoner', default=None)
+    parser.add_argument('--abandoner-username', default=None)
     parser.add_argument('--reason', default=None)
     # change-merged
     parser.add_argument('--submitter', default=None)
+    parser.add_argument('--submitter-username', default=None)
     parser.add_argument('--newrev', default=None)
     # patchset-created
     parser.add_argument('--uploader', default=None)
+    parser.add_argument('--uploader-username', default=None)
     parser.add_argument('--patchset', default=None)
-    parser.add_argument('--is-draft', default=None)
     parser.add_argument('--kind', default=None)
 
     args = parser.parse_args()
diff --git a/jeepyb/cmd/welcome_message.py b/jeepyb/cmd/welcome_message.py
index b28f5e1..d09397d 100644
--- a/jeepyb/cmd/welcome_message.py
+++ b/jeepyb/cmd/welcome_message.py
@@ -18,7 +18,7 @@
 #
 # 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 \
+# --change-url \ https://review-dev.opendev.org/81 --project gtest-org/test \
 # --branch master --uploader User A. Example (user@example.com) --commit \
 # 05508ae633852469d2fd7786a3d6f1d06f87055b --patchset 1 patchset-merged \
 # --ssh-user=user --ssh-key=/home/user/.ssh/id_rsa
@@ -31,7 +31,7 @@
 import paramiko
 
 import jeepyb.gerritdb
-import jeepyb.log as l
+import jeepyb.log
 
 logger = logging.getLogger('welcome_reviews')
 
@@ -88,7 +88,8 @@
 Thanks again for participating in OpenDev, we look forward to seeing you
 around.
 
-Workflow Guide: https://docs.openstack.org/infra/manual/developers.html
+Workflow Guide:
+https://docs.opendev.org/opendev/infra-manual/latest/developers.html
 """
 
     if message_file:
@@ -154,16 +155,17 @@
     parser.add_argument('--dryrun', dest='dryrun', action='store_true')
     parser.add_argument('--no-dryrun', dest='dryrun', action='store_false')
     parser.set_defaults(dryrun=False)
-    l.setup_logging_arguments(parser)
+    jeepyb.log.setup_logging_arguments(parser)
 
     args = parser.parse_args()
 
-    l.configure_logging(args)
+    jeepyb.log.configure_logging(args)
 
     # they're a first-timer, post the message on 1st patchset
     if is_newbie(args.uploader) and args.patchset == '1' and not args.dryrun:
         post_message(args.commit, args.ssh_user, args.ssh_key,
                      args.message_file)
 
+
 if __name__ == "__main__":
     main()
diff --git a/jeepyb/gerritdb.py b/jeepyb/gerritdb.py
index 8c06d2c..dade73c 100644
--- a/jeepyb/gerritdb.py
+++ b/jeepyb/gerritdb.py
@@ -1,5 +1,5 @@
 #! /usr/bin/env python
-# Copyright (C) 2011 OpenStack, LLC.
+# Copyright (C) 2011 OpenStack Foundation
 # Copyright (c) 2012 Hewlett-Packard Development Company, L.P.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/requirements.txt b/requirements.txt
index 62d2223..679b9ec 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -3,7 +3,7 @@
 # process, which may cause wedges in the gate later.
 pbr>=1.6
 
-gerritlib>=0.3.0
+gerritlib>=0.10.0
 PyMySQL
 paramiko>=1.13.0
 PyGithub
diff --git a/setup.cfg b/setup.cfg
index 24207d0..73ab438 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -3,9 +3,9 @@
 summary = Tools for managing gerrit projects and external sources.
 description-file =
     README.rst
-author = OpenStack Infrastructure Team
-author-email = openstack-infra@lists.openstack.org
-home-page = https://docs.openstack.org/infra/system-config/
+author = OpenDev Contributors
+author-email = service-discuss@lists.opendev.org
+home-page = https://docs.opendev.org/opendev/system-config/
 classifier =
     Intended Audience :: Information Technology
     Intended Audience :: System Administrators
diff --git a/test-requirements.txt b/test-requirements.txt
index d528919..117f7a3 100644
--- a/test-requirements.txt
+++ b/test-requirements.txt
@@ -1,4 +1,4 @@
 # The order of packages is significant, because pip processes them in the order
 # of appearance. Changing the order has an impact on the overall integration
 # process, which may cause wedges in the gate later.
-hacking<0.11,>=0.10.2
+flake8
diff --git a/tox.ini b/tox.ini
index 835b4ac..46bd1ce 100644
--- a/tox.ini
+++ b/tox.ini
@@ -18,6 +18,7 @@
 
 [flake8]
 # E125 and H are intentionally ignored
-ignore = E125,H
+# W503 is a mistake in flake8
+ignore = E125,H,W503,W504
 show-source = True
 exclude = .venv,.tox,dist,doc,build,*.egg