Merge "Allow configurable mappings to different LP projects"
diff --git a/jeepyb/cmd/notify_impact.py b/jeepyb/cmd/notify_impact.py
index 7038c8f..b6e123c 100644
--- a/jeepyb/cmd/notify_impact.py
+++ b/jeepyb/cmd/notify_impact.py
@@ -22,7 +22,7 @@
 #     --change-url https://review.openstack.org/55607 --project nova/ \
 #     --branch master --commit c262de4417d48be599c3a7496ef94de5c84b188c \
 #     --impact DocImpact --dest-address none@localhost --dryrun \
-#     --ignore-duplicates \
+#     --ignore-duplicates --config foo.yaml \
 #     change-merged
 #
 # But you'll need a git repository at /home/gerrit2/review_site/git/nova.git
@@ -41,6 +41,8 @@
 from launchpadlib import uris
 import yaml
 
+from jeepyb import projects
+
 BASE_DIR = '/home/gerrit2/review_site'
 EMAIL_TEMPLATE = """
 Hi, I'd like you to take a look at this patch for potential
@@ -83,7 +85,10 @@
         self.lpconn = lpconn
 
     def create(self, project, bug_title, bug_descr, args):
-        print('I would have created a bug, but I am in dry run mode')
+        print('I would have created a bug in %s, but I am in dry run mode.\n\n'
+              'Title: %s\n'
+              'Description:\n'
+              '%s' % (project, bug_title, bug_descr))
         return None, None
 
     def subscribe(self, buginfo, subscriber):
@@ -91,14 +96,29 @@
               'but I am in dry run mode' % subscriber)
 
 
-def create_bug(git_log, args, lp_project, config):
+def create_bug(git_log, args, config):
     """Create a bug for a change.
 
-    Create a launchpad bug in lp_project, titled with the first line of
+    Create a launchpad bug in a LP project, titled with the first line of
     the git commit message, with the content of the git_log prepended
     with the Gerrit review URL. Tag the bug with the name of the repository
     it came from. Don't create a duplicate bug. Returns link to the bug.
     """
+
+    # Determine what LP project to use
+    prelude = ''
+    project_name = args.project.rstrip('/')
+    lp_project = projects.docimpact_target(project_name)
+    if lp_project == 'unknown':
+        prelude = ('\n\nDear documentation bug triager. This bug was created '
+                   'here because we did not know how to map the project name '
+                   '"%s" to a launchpad project name. This indicates that the '
+                   'notify_impact config needs tweaks. You can ask the '
+                   'OpenStack infra team (#openstack-infra on freenode) for '
+                   'help if you need to.\n'
+                   % args.project)
+        lp_project = 'openstack-manuals'
+
     lpconn = launchpad.Launchpad.login_with(
         'Gerrit User Sync',
         uris.LPNET_SERVICE_ROOT,
@@ -111,9 +131,9 @@
     else:
         actions = BugActionsReal(lpconn)
 
-    lines_in_log = git_log.split("\n")
+    lines_in_log = git_log.split('\n')
     bug_title = lines_in_log[4]
-    bug_descr = args.change_url + '\n' + git_log
+    bug_descr = args.change_url + prelude + '\n' + git_log
     project = lpconn.projects[lp_project]
 
     # check for existing bugs by searching for the title, to avoid
@@ -153,7 +173,7 @@
     """
     if args.impact.lower() == 'docimpact':
         if args.hook == "change-merged":
-            create_bug(git_log, args, 'openstack-manuals', config)
+            create_bug(git_log, args, config)
         return
 
     email_content = EMAIL_TEMPLATE % (args.impact,
@@ -206,7 +226,8 @@
     parser.add_argument('--impact', default=None)
     parser.add_argument('--dest-address', default=None)
 
-    # Automatic config
+    # Automatic config: config contains a mapping of email addresses to
+    # subscribers.
     parser.add_argument('--config', type=argparse.FileType('r'),
                         default=None)
 
diff --git a/jeepyb/projects.py b/jeepyb/projects.py
index 083da4d..da898b9 100644
--- a/jeepyb/projects.py
+++ b/jeepyb/projects.py
@@ -64,6 +64,10 @@
     return direct or _hardcoded_is_direct_release(project_full_name)
 
 
+def docimpact_target(project_full_name):
+    return registry.get('docimpact-group', 'unknown')
+
+
 # The following functions should be deleted when projects.yaml will be updated
 
 def _hardcoded_is_direct_release(project_full_name):
diff --git a/jeepyb/utils.py b/jeepyb/utils.py
index 5ff3830..92e0445 100644
--- a/jeepyb/utils.py
+++ b/jeepyb/utils.py
@@ -45,3 +45,6 @@
 
     def __getitem__(self, item):
         return self.configs[item]
+
+    def get(self, item, default=None):
+        return self.configs.get(item, default)