Repository: nf-core/tools

Issue:
nf-core sync should support the template.yaml
### Description of feature

The `sync` functionality should support the `template.yml` file similar to the `create` function.


Discussion:

Resolving patch:
diff --git a/nf_core/__main__.py b/nf_core/__main__.py
--- a/nf_core/__main__.py
+++ b/nf_core/__main__.py
@@ -1197,7 +1197,8 @@ def bump_version(new_version, dir, nextflow):
 @click.option("-p", "--pull-request", is_flag=True, default=False, help="Make a GitHub pull-request with the changes.")
 @click.option("-g", "--github-repository", type=str, help="GitHub PR: target repository.")
 @click.option("-u", "--username", type=str, help="GitHub PR: auth username.")
-def sync(dir, from_branch, pull_request, github_repository, username):
+@click.option("-t", "--template-yaml", help="Pass a YAML file to customize the template")
+def sync(dir, from_branch, pull_request, github_repository, username, template_yaml):
     """
     Sync a pipeline [cyan i]TEMPLATE[/] branch with the nf-core template.
 
@@ -1214,7 +1215,7 @@ def sync(dir, from_branch, pull_request, github_repository, username):
     nf_core.utils.is_pipeline_directory(dir)
 
     # Sync the given pipeline dir
-    sync_obj = nf_core.sync.PipelineSync(dir, from_branch, pull_request, github_repository, username)
+    sync_obj = nf_core.sync.PipelineSync(dir, from_branch, pull_request, github_repository, username, template_yaml)
     try:
         sync_obj.sync()
     except (nf_core.sync.SyncException, nf_core.sync.PullRequestException) as e:
diff --git a/nf_core/create.py b/nf_core/create.py
--- a/nf_core/create.py
+++ b/nf_core/create.py
@@ -39,6 +39,7 @@ class PipelineCreate(object):
         force (bool): Overwrites a given workflow directory with the same name. Defaults to False.
             May the force be with you.
         outdir (str): Path to the local output directory.
+        template_yaml (str): Path to template.yml file for pipeline creation settings.
     """
 
     def __init__(
diff --git a/nf_core/sync.py b/nf_core/sync.py
--- a/nf_core/sync.py
+++ b/nf_core/sync.py
@@ -52,6 +52,7 @@ class PipelineSync(object):
         required_config_vars (list): List of nextflow variables required to make template pipeline
         gh_username (str): GitHub username
         gh_repo (str): GitHub repository name
+        template_yaml (str): Path to template.yml file for pipeline creation settings.
     """
 
     def __init__(
@@ -61,6 +62,7 @@ def __init__(
         make_pr=False,
         gh_repo=None,
         gh_username=None,
+        template_yaml_path=None,
     ):
         """Initialise syncing object"""
 
@@ -77,6 +79,12 @@ def __init__(
         self.gh_repo = gh_repo
         self.pr_url = ""
 
+        self.template_yaml_path = template_yaml_path
+        # Save contents of template.yml for using outside of git.
+        if self.template_yaml_path is not None:
+            with open(self.template_yaml_path, "r") as template_yaml:
+                self.template_yaml_cache = template_yaml.read()
+
         # Set up the API auth if supplied on the command line
         self.gh_api = nf_core.utils.gh_api
         self.gh_api.lazy_init()
@@ -204,7 +212,7 @@ def delete_template_branch_files(self):
         # Delete everything
         log.info("Deleting all files in 'TEMPLATE' branch")
         for the_file in os.listdir(self.pipeline_dir):
-            if the_file == ".git":
+            if the_file == ".git" or the_file == self.template_yaml_path:
                 continue
             file_path = os.path.join(self.pipeline_dir, the_file)
             log.debug(f"Deleting {file_path}")
@@ -225,16 +233,29 @@ def make_template_pipeline(self):
         # Only show error messages from pipeline creation
         logging.getLogger("nf_core.create").setLevel(logging.ERROR)
 
-        nf_core.create.PipelineCreate(
-            name=self.wf_config["manifest.name"].strip('"').strip("'"),
-            description=self.wf_config["manifest.description"].strip('"').strip("'"),
-            version=self.wf_config["manifest.version"].strip('"').strip("'"),
-            no_git=True,
-            force=True,
-            outdir=self.pipeline_dir,
-            author=self.wf_config["manifest.author"].strip('"').strip("'"),
-            plain=True,
-        ).init_pipeline()
+        # Re-write the template yaml from cache which may have been updated
+        if self.template_yaml_path and self.template_yaml_cache:
+            with open(self.template_yaml_path, "w") as template_path:
+                template_path.write(self.template_yaml_cache)
+
+        try:
+            nf_core.create.PipelineCreate(
+                name=self.wf_config["manifest.name"].strip('"').strip("'"),
+                description=self.wf_config["manifest.description"].strip('"').strip("'"),
+                version=self.wf_config["manifest.version"].strip('"').strip("'"),
+                no_git=True,
+                force=True,
+                outdir=self.pipeline_dir,
+                author=self.wf_config["manifest.author"].strip('"').strip("'"),
+                template_yaml_path=self.template_yaml_path,
+                plain=True,
+            ).init_pipeline()
+        except Exception as err:
+            # If sync fails, remove template_yaml_path before raising error.
+            os.remove(self.template_yaml_path)
+            # Reset to where you were to prevent git getting messed up.
+            self.repo.git.reset("--hard")
+            raise SyncException(f"Failed to rebuild pipeline from template with error:\n{err}")
 
     def commit_template_changes(self):
         """If we have any changes with the new template files, make a git commit"""


Test patch: