infocalypse
 
(Steve Dougherty)
2013-07-26: Give local directory matching target for pull requests. bab-reviewed

Give local directory matching target for pull requests.

diff --git a/infocalypse/config.py b/infocalypse/config.py
--- a/infocalypse/config.py
+++ b/infocalypse/config.py
@@ -179,6 +179,31 @@ class Config:
         repo_dir = norm_path(repo_dir)
         self.request_usks[repo_dir] = usk
 
+    def get_repo_dir(self, request_uri):
+        """
+        Return the normalized path for a repo with the given request URI.
+        Abort if the request URI does not match exactly one directory.
+        """
+        normalized = normalize(request_uri)
+        match = None
+
+        for repo_dir, uri in self.request_usks.iteritems():
+            if normalized == normalize(uri):
+                if match:
+                    raise util.Abort("Multiple directories match {0}."
+                                     .format(request_uri))
+                else:
+                    match = repo_dir
+
+        if not match:
+            raise util.Abort("No repository matches {0}.".format(request_uri))
+
+        # Assuming path has not become un-normalized since being set with
+        # update_dir().
+        assert norm_path(match) == match
+
+        return match
+
     def get_request_uri(self, for_dir):
         """ Get the repo USK used to pull changes into for_dir or None. """
         uri = self.request_usks.get(norm_path(for_dir))
diff --git a/infocalypse/wot.py b/infocalypse/wot.py
--- a/infocalypse/wot.py
+++ b/infocalypse/wot.py
@@ -209,6 +209,8 @@ def read_message_yaml(ui, from_address, 
     end_token = '...'
     yaml_end = body.rfind(end_token)
 
+    cfg = Config.from_ui(ui)
+
     if not yaml_end == -1:
         # Better to point to the end of the end token, but don't confuse
         # failure.
@@ -256,7 +258,7 @@ def read_message_yaml(ui, from_address, 
 
         ui.status("To accept this request, pull from: %s\n"
                   "               To your repository: %s\n" %
-                  (request['source'], request['target']))
+                  (request['source'], cfg.get_repo_dir(request['target'])))
         return
 
     ui.status("Notification '%s' has an unrecognized request of type '%s'"