Merge "Clone jobdir git repos from the launcher's cache" into feature/zuulv3
diff --git a/zuul/launcher/server.py b/zuul/launcher/server.py
index cb4dee1..2827d83 100644
--- a/zuul/launcher/server.py
+++ b/zuul/launcher/server.py
@@ -27,6 +27,7 @@
 import yaml
 
 import gear
+import git
 
 import zuul.merger.merger
 import zuul.ansible.action
@@ -250,6 +251,10 @@
             self.merge_name = None
 
         self.connections = connections
+        # This merger and its git repos are used to maintain
+        # up-to-date copies of all the repos that are used by jobs, as
+        # well as to support the merger:cat functon to supply
+        # configuration information to Zuul when it starts.
         self.merger = self._getMerger(self.merge_root)
         self.update_queue = DeduplicateQueue()
 
@@ -378,7 +383,7 @@
                 self.log.exception("Exception in update thread:")
 
     def _innerUpdateLoop(self):
-        # Inside of a loop that keeps the main repository up to date
+        # Inside of a loop that keeps the main repositories up to date
         task = self.update_queue.get()
         if task is None:
             # We are asked to stop
@@ -390,6 +395,7 @@
         task.setComplete()
 
     def update(self, project, url):
+        # Update a repository in the main merger
         task = UpdateTask(project, url)
         task = self.update_queue.put(task)
         return task
@@ -540,6 +546,16 @@
             task.wait()
 
         self.log.debug("Job %s: git updates complete" % (self.job.unique,))
+        for project in args['projects']:
+            self.log.debug("Cloning %s" % (project['name'],))
+            repo = git.Repo.clone_from(
+                os.path.join(self.launcher_server.merge_root,
+                             project['name']),
+                os.path.join(self.jobdir.git_root,
+                             project['name']))
+            repo.remotes.origin.config_writer.set('url', project['url'])
+
+        # Get a merger in order to update the repos involved in this job.
         merger = self.launcher_server._getMerger(self.jobdir.git_root)
         merge_items = [i for i in args['items'] if i.get('refspec')]
         if merge_items: