Merge "Sort output in generated legacy files" into feature/zuulv3
diff --git a/zuul/cmd/migrate.py b/zuul/cmd/migrate.py
index 8ed098b..567980c 100644
--- a/zuul/cmd/migrate.py
+++ b/zuul/cmd/migrate.py
@@ -29,6 +29,7 @@
 import getopt
 import logging
 import os
+import operator
 import subprocess
 import tempfile
 import re
@@ -1181,15 +1182,17 @@
         zuul_yaml = os.path.join(self.outdir, 'zuul.yaml')
         zuul_d = os.path.join(self.outdir, 'zuul.d')
         orig = os.path.join(zuul_d, '01zuul.yaml')
-        job_outfile = os.path.join(zuul_d, '99converted-jobs.yaml')
-        project_outfile = os.path.join(zuul_d, '99converted-projects.yaml')
+        job_outfile = os.path.join(zuul_d, '99legacy-jobs.yaml')
+        project_outfile = os.path.join(zuul_d, '99legacy-projects.yaml')
+        project_template_outfile = os.path.join(
+            zuul_d, '99legacy-project-templates.yaml')
         if not os.path.exists(self.outdir):
             os.makedirs(self.outdir)
         if not os.path.exists(zuul_d):
             os.makedirs(zuul_d)
         if os.path.exists(zuul_yaml) and self.move:
             os.rename(zuul_yaml, orig)
-        return job_outfile, project_outfile
+        return job_outfile, project_outfile, project_template_outfile
 
     def makeNewJobs(self, old_job, parent: Job=None):
         self.log.debug("makeNewJobs(%s)", old_job)
@@ -1417,22 +1420,28 @@
         return new_project
 
     def writeJobs(self):
-        job_outfile, project_outfile = self.setupDir()
+        job_outfile, project_outfile, template_outfile = self.setupDir()
         job_config = []
         project_config = []
+        template_config = []
 
         for template in self.layout.get('project-templates', []):
             self.log.debug("Processing template: %s", template)
             new_template = self.writeProjectTemplate(template)
             self.new_templates[new_template['name']] = new_template
             if not self.mapping.hasProjectTemplate(template['name']):
-                job_config.append({'project-template': new_template})
+                template_config.append({'project-template': new_template})
+        template_config = sorted(
+            template_config,
+            key=lambda template: template['project-template']['name'])
 
         project_names = []
         for project in self.layout.get('projects', []):
             project_names.append(project['name'])
             project_config.append(
                 {'project': self.writeProject(project)})
+        project_config = sorted(
+            project_config, key=lambda project: project['project']['name'])
 
         seen_jobs = []
         for job in sorted(self.job_objects, key=lambda job: job.name):
@@ -1444,11 +1453,18 @@
                 job_config.append({'job': job.toJobDict(
                     has_artifacts, has_post, has_draft, project_names)})
                 seen_jobs.append(job.name)
+        job_config = sorted(
+            job_config, key=lambda job: job['job']['name'])
 
         with open(job_outfile, 'w') as yamlout:
             # Insert an extra space between top-level list items
             yamlout.write(ordered_dump(job_config).replace('\n-', '\n\n-'))
 
+        with open(template_outfile, 'w') as yamlout:
+            # Insert an extra space between top-level list items
+            yamlout.write(
+                ordered_dump(template_config).replace('\n-', '\n\n-'))
+
         with open(project_outfile, 'w') as yamlout:
             # Insert an extra space between top-level list items
             yamlout.write(ordered_dump(project_config).replace('\n-', '\n\n-'))