From 20027ab626f3d6a43e72b357bce7c9ec37011b7d Mon Sep 17 00:00:00 2001 From: omegaStag <57331513+omegaStag@users.noreply.github.com> Date: Wed, 27 Oct 2021 21:20:05 -0400 Subject: [PATCH 1/9] Add allow-online switch to new-project new-project now has an --allow-online/--no-online switch that allows for creating a project with or without remote templates. also, made a helper _create_project function that new_project calls FIXME: ConnectionErrors are not being caught (to make projects with local templates if no internet), unpoggers! --- .vs/ProjectSettings.json | 3 +++ .vs/slnx.sqlite | Bin 0 -> 176128 bytes pros/cli/conductor.py | 51 ++++++++++++++++++++++++++---------- pros/conductor/conductor.py | 5 ++-- 4 files changed, 43 insertions(+), 16 deletions(-) create mode 100644 .vs/ProjectSettings.json create mode 100644 .vs/slnx.sqlite diff --git a/.vs/ProjectSettings.json b/.vs/ProjectSettings.json new file mode 100644 index 00000000..f8b48885 --- /dev/null +++ b/.vs/ProjectSettings.json @@ -0,0 +1,3 @@ +{ + "CurrentProjectSetting": null +} \ No newline at end of file diff --git a/.vs/slnx.sqlite b/.vs/slnx.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..2521c29ad71c763e350397710300d0fcf9dd05b7 GIT binary patch literal 176128 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 literal 0 HcmV?d00001 diff --git a/pros/cli/conductor.py b/pros/cli/conductor.py index 4ac64d56..551fbffb 100644 --- a/pros/cli/conductor.py +++ b/pros/cli/conductor.py @@ -178,6 +178,8 @@ def uninstall_template(project: c.Project, query: c.BaseTemplate, remove_user: b @click.argument('path', type=click.Path()) @click.argument('target', default=c.Conductor().default_target, type=click.Choice(['v5', 'cortex'])) @click.argument('version', default='latest') +@click.option('--allow-online/--no-online', 'allow_online', default=True, show_default=True, + help='(Dis)allow use of remote templates in new projects') @click.option('--force-user', 'force_user', default=False, is_flag=True, help='Replace all user files in a template') @click.option('--force-system', '-f', 'force_system', default=False, is_flag=True, @@ -206,25 +208,46 @@ def new_project(ctx: click.Context, path: str, target: str, version: str, logger(__name__).error('A project already exists in this location! Delete it first', extra={'sentry': False}) ctx.exit(-1) try: - _conductor = c.Conductor() - if target is None: - target = _conductor.default_target - project = _conductor.new_project(path, target=target, version=version, - force_user=force_user, force_system=force_system, - no_default_libs=no_default_libs, **kwargs) - ui.echo('New PROS Project was created:', output_machine=False) - ctx.invoke(info_project, project=project) - - if compile_after or build_cache: - with ui.Notification(): - ui.echo('Building project...') - ctx.exit(project.compile([], scan_build=build_cache)) - + _create_project(ctx=ctx, path=path,target=target, version=version, + force_user=force_user, force_system=force_system, + compile_after=compile_after, build_cache=build_cache, **kwargs) + except ConnectionError as e: # FIXME: ConnectionError is NOT being caught here, lines 214-223 won't run + try: + logger(__name__).error('Could not connect to GitHub." + "Check your internet connection or consult a network administrator.', + extra={'sentry': False}) + kwargs['allow_online'] = False + _create_project(ctx=ctx, path=path,target=target, version=version, + force_user=force_user, force_system=force_system, + compile_after=compile_after, build_cache=build_cache, **kwargs) + except Exception as _e: + raise _e except Exception as e: pros.common.logger(__name__).exception(e) ctx.exit(-1) +def _create_project(ctx: click.Context, path: str, target: str, version: str, + force_user: bool = False, force_system: bool = False, + no_default_libs: bool = False, compile_after: bool = True, build_cache: bool = None, **kwargs): + """ + Helper function for new_project + + Visit https://pros.cs.purdue.edu/v5/cli/conductor.html to learn more + """ + _conductor = c.Conductor() + if target is None: + target = _conductor.default_target + project = _conductor.new_project(path, target=target, version=version, + force_user=force_user, force_system=force_system, + no_default_libs=no_default_libs, **kwargs) + ui.echo('New PROS Project was created:', output_machine=False) + ctx.invoke(info_project, project=project) + if compile_after or build_cache: + with ui.Notification(): + ui.echo('Building project...') + ctx.exit(project.compile([], scan_build=build_cache)) + + @conductor.command('query-templates', aliases=['search-templates', 'ls-templates', 'lstemplates', 'querytemplates', 'searchtemplates'], context_settings={'ignore_unknown_options': True}) diff --git a/pros/conductor/conductor.py b/pros/conductor/conductor.py index ebe3f43a..af43d1a8 100644 --- a/pros/conductor/conductor.py +++ b/pros/conductor/conductor.py @@ -97,11 +97,12 @@ def purge_template(self, template: LocalTemplate): shutil.rmtree(template.location) self.save() - def resolve_templates(self, identifier: Union[str, BaseTemplate], allow_online: bool = True, + def resolve_templates(self, identifier: Union[str, BaseTemplate], allow_offline: bool = True, force_refresh: bool = False, unique: bool = True, **kwargs) -> List[BaseTemplate]: results = list() if not unique else set() kernel_version = kwargs.get('kernel_version', None) + allow_online = kwargs.get('allow_online', True) if isinstance(identifier, str): query = BaseTemplate.create_query(name=identifier, **kwargs) else: @@ -173,7 +174,7 @@ def apply_template(self, project: Project, identifier: Union[str, BaseTemplate], if 'kernel' in project.templates: # support_kernels for backwards compatibility, but kernel_version should be getting most of the exposure kwargs['kernel_version'] = kwargs['supported_kernels'] = project.templates['kernel'].version - template = self.resolve_template(identifier=identifier, allow_online=download_ok, **kwargs) + template = self.resolve_template(identifier=identifier, **kwargs) if template is None: raise dont_send( InvalidTemplateException(f'Could not find a template satisfying {identifier} for {project.target}')) From 9867e0abb6fb5dfcffa871e524d264d5dfa654ce Mon Sep 17 00:00:00 2001 From: omegaStag <57331513+omegaStag@users.noreply.github.com> Date: Wed, 27 Oct 2021 21:22:35 -0400 Subject: [PATCH 2/9] Update conductor.py --- pros/cli/conductor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pros/cli/conductor.py b/pros/cli/conductor.py index 551fbffb..c7fed1a2 100644 --- a/pros/cli/conductor.py +++ b/pros/cli/conductor.py @@ -211,7 +211,7 @@ def new_project(ctx: click.Context, path: str, target: str, version: str, _create_project(ctx=ctx, path=path,target=target, version=version, force_user=force_user, force_system=force_system, compile_after=compile_after, build_cache=build_cache, **kwargs) - except ConnectionError as e: # FIXME: ConnectionError is NOT being caught here, lines 214-223 won't run + except ConnectionError as e: # BUG: ConnectionError is NOT being caught here, lines 214-223 won't run try: logger(__name__).error('Could not connect to GitHub." + "Check your internet connection or consult a network administrator.', extra={'sentry': False}) From 1d9f6bae72b7e44ca4329d337b3921b7c41ae6df Mon Sep 17 00:00:00 2001 From: omegaStag <57331513+omegaStag@users.noreply.github.com> Date: Thu, 28 Oct 2021 21:51:56 -0400 Subject: [PATCH 3/9] Added download-ok switch Will elaborate in PR --- pros/cli/conductor.py | 52 +++++++++++++++++++++++++++---------- pros/conductor/conductor.py | 8 +++--- 2 files changed, 43 insertions(+), 17 deletions(-) diff --git a/pros/cli/conductor.py b/pros/cli/conductor.py index 1a1d2f66..d9d3cc89 100644 --- a/pros/cli/conductor.py +++ b/pros/cli/conductor.py @@ -178,6 +178,8 @@ def uninstall_template(project: c.Project, query: c.BaseTemplate, remove_user: b @click.argument('path', type=click.Path()) @click.argument('target', default=c.Conductor().default_target, type=click.Choice(['v5', 'cortex'])) @click.argument('version', default='latest') +@click.option('--download/--no-download', 'download_ok', default=True, show_default=True, + help='(Dis)allow download and use of remote templates in new projects') @click.option('--force-user', 'force_user', default=False, is_flag=True, help='Replace all user files in a template') @click.option('--force-system', '-f', 'force_system', default=False, is_flag=True, @@ -207,23 +209,45 @@ def new_project(ctx: click.Context, path: str, target: str, version: str, '! Delete it first. Are you creating a project in an existing one?', extra={'sentry': False}) ctx.exit(-1) try: - _conductor = c.Conductor() - if target is None: + project = _create_project(ctx=ctx, path=path,target=target, version=version, + force_user=force_user, force_system=force_system, + compile_after=compile_after, build_cache=build_cache, **kwargs) + ctx.exit(project.compile([], scan_build=build_cache)) + except Exception as e: + try: + kwargs['allow_online'] = False + project = _create_project(ctx=ctx, path=path,target=target, version=version, + force_user=force_user, force_system=force_system, + compile_after=compile_after, build_cache=build_cache, **kwargs) + logger(__name__).error('Could not connect to GitHub. Check your internet connection or consult a network administrator.', + extra={'sentry': False}) + ctx.exit(project.compile([], scan_build=build_cache)) + except Exception as _e: + pros.common.logger(__name__).exception(e) + ctx.exit(-1) + + +def _create_project(ctx: click.Context, path: str, target: str, version: str, + force_user: bool = False, force_system: bool = False, + no_default_libs: bool = False, compile_after: bool = True, build_cache: bool = None, **kwargs): + """ + Helper function for new_project + + Visit https://pros.cs.purdue.edu/v5/cli/conductor.html to learn more + """ + _conductor = c.Conductor() + if target is None: target = _conductor.default_target - project = _conductor.new_project(path, target=target, version=version, + project = _conductor.new_project(path, target=target, version=version, force_user=force_user, force_system=force_system, no_default_libs=no_default_libs, **kwargs) - ui.echo('New PROS Project was created:', output_machine=False) - ctx.invoke(info_project, project=project) - - if compile_after or build_cache: - with ui.Notification(): - ui.echo('Building project...') - ctx.exit(project.compile([], scan_build=build_cache)) - - except Exception as e: - pros.common.logger(__name__).exception(e) - ctx.exit(-1) + ui.echo('New PROS Project was created:', output_machine=False) + ctx.invoke(info_project, project=project) + if compile_after or build_cache: + with ui.Notification(): + ui.echo('Building project...') + return project + @conductor.command('query-templates', diff --git a/pros/conductor/conductor.py b/pros/conductor/conductor.py index ebe3f43a..f8c5cb7f 100644 --- a/pros/conductor/conductor.py +++ b/pros/conductor/conductor.py @@ -97,11 +97,13 @@ def purge_template(self, template: LocalTemplate): shutil.rmtree(template.location) self.save() - def resolve_templates(self, identifier: Union[str, BaseTemplate], allow_online: bool = True, + def resolve_templates(self, identifier: Union[str, BaseTemplate], allow_offline: bool = True, force_refresh: bool = False, unique: bool = True, **kwargs) -> List[BaseTemplate]: results = list() if not unique else set() kernel_version = kwargs.get('kernel_version', None) + allow_online = kwargs.get('allow_online', True) + download_ok = kwargs.get('download_ok', True) if isinstance(identifier, str): query = BaseTemplate.create_query(name=identifier, **kwargs) else: @@ -112,7 +114,7 @@ def resolve_templates(self, identifier: Union[str, BaseTemplate], allow_online: results.update(offline_results) else: results.extend(offline_results) - if allow_online: + if allow_online and download_ok: for depot in self.depots.values(): online_results = filter(lambda t: t.satisfies(query, kernel_version=kernel_version), depot.get_remote_templates(force_check=force_refresh, **kwargs)) @@ -173,7 +175,7 @@ def apply_template(self, project: Project, identifier: Union[str, BaseTemplate], if 'kernel' in project.templates: # support_kernels for backwards compatibility, but kernel_version should be getting most of the exposure kwargs['kernel_version'] = kwargs['supported_kernels'] = project.templates['kernel'].version - template = self.resolve_template(identifier=identifier, allow_online=download_ok, **kwargs) + template = self.resolve_template(identifier=identifier, **kwargs) if template is None: raise dont_send( InvalidTemplateException(f'Could not find a template satisfying {identifier} for {project.target}')) From 0d1bf132d6b03a8092dc2f691e337c8639566c50 Mon Sep 17 00:00:00 2001 From: omegaStag Date: Mon, 29 Nov 2021 17:05:18 -0500 Subject: [PATCH 4/9] Move try block to resolve_templates --- pros/cli/conductor.py | 13 ++----------- pros/conductor/conductor.py | 21 ++++++++++++++++----- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/pros/cli/conductor.py b/pros/cli/conductor.py index d9d3cc89..b7e6570e 100644 --- a/pros/cli/conductor.py +++ b/pros/cli/conductor.py @@ -214,17 +214,8 @@ def new_project(ctx: click.Context, path: str, target: str, version: str, compile_after=compile_after, build_cache=build_cache, **kwargs) ctx.exit(project.compile([], scan_build=build_cache)) except Exception as e: - try: - kwargs['allow_online'] = False - project = _create_project(ctx=ctx, path=path,target=target, version=version, - force_user=force_user, force_system=force_system, - compile_after=compile_after, build_cache=build_cache, **kwargs) - logger(__name__).error('Could not connect to GitHub. Check your internet connection or consult a network administrator.', - extra={'sentry': False}) - ctx.exit(project.compile([], scan_build=build_cache)) - except Exception as _e: - pros.common.logger(__name__).exception(e) - ctx.exit(-1) + pros.common.logger(__name__).exception(e) + ctx.exit(-1) def _create_project(ctx: click.Context, path: str, target: str, version: str, diff --git a/pros/conductor/conductor.py b/pros/conductor/conductor.py index f8c5cb7f..d10262a4 100644 --- a/pros/conductor/conductor.py +++ b/pros/conductor/conductor.py @@ -116,12 +116,23 @@ def resolve_templates(self, identifier: Union[str, BaseTemplate], results.extend(offline_results) if allow_online and download_ok: for depot in self.depots.values(): - online_results = filter(lambda t: t.satisfies(query, kernel_version=kernel_version), + try: + online_results = filter(lambda t: t.satisfies(query, kernel_version=kernel_version), depot.get_remote_templates(force_check=force_refresh, **kwargs)) - if unique: - results.update(online_results) - else: - results.extend(online_results) + if unique: + results.update(online_results) + else: + results.extend(online_results) + except Exception as e: + try: + logger(__name__).error("Failed to connect to GitHub. Check your internet connection or consult a network administrator.", extra={'sentry': False}) + kwargs['allow_online'] = False + try: + resolve_templates(self, identifier, allow_offline, force_refresh, unique, **kwargs) + except Exception as __e: + logger(__name__).error(__e) + except Exception as _e: + logger(__name__).error(_e) logger(__name__).debug('Saving Conductor config after checking for remote updates') self.save() # Save self since there may have been some updates from the depots return list(results) From e0c5b357d107b73038f41ea15aeecf06b0c1fe2b Mon Sep 17 00:00:00 2001 From: omegaStag Date: Thu, 2 Dec 2021 19:12:42 -0500 Subject: [PATCH 5/9] Use urllib.request to check for internet This thing spits out duplicate warnings (2 for kernel and 2 for okapilib) dunno why --- pros/conductor/conductor.py | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/pros/conductor/conductor.py b/pros/conductor/conductor.py index d10262a4..24c70928 100644 --- a/pros/conductor/conductor.py +++ b/pros/conductor/conductor.py @@ -2,6 +2,7 @@ import shutil from pathlib import Path from typing import * +import urllib.request import click from semantic_version import Spec, Version @@ -104,6 +105,12 @@ def resolve_templates(self, identifier: Union[str, BaseTemplate], kernel_version = kwargs.get('kernel_version', None) allow_online = kwargs.get('allow_online', True) download_ok = kwargs.get('download_ok', True) + try: + urllib.request.urlopen(MAINLINE_URL) + except: + logger(__name__).warn("Failed to connect to GitHub. Check your internet connection or consult a network administrator.") + allow_online = False + allow_offline = True if isinstance(identifier, str): query = BaseTemplate.create_query(name=identifier, **kwargs) else: @@ -124,15 +131,7 @@ def resolve_templates(self, identifier: Union[str, BaseTemplate], else: results.extend(online_results) except Exception as e: - try: - logger(__name__).error("Failed to connect to GitHub. Check your internet connection or consult a network administrator.", extra={'sentry': False}) - kwargs['allow_online'] = False - try: - resolve_templates(self, identifier, allow_offline, force_refresh, unique, **kwargs) - except Exception as __e: - logger(__name__).error(__e) - except Exception as _e: - logger(__name__).error(_e) + logger(__name__).error(e) logger(__name__).debug('Saving Conductor config after checking for remote updates') self.save() # Save self since there may have been some updates from the depots return list(results) From 9b9aa1c9ff083ff68de798f0a3af07b5db6e30de Mon Sep 17 00:00:00 2001 From: omegaStag <57331513+omegaStag@users.noreply.github.com> Date: Fri, 3 Dec 2021 09:47:44 -0500 Subject: [PATCH 6/9] Shorten warning --- pros/conductor/conductor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pros/conductor/conductor.py b/pros/conductor/conductor.py index 24c70928..a2d11336 100644 --- a/pros/conductor/conductor.py +++ b/pros/conductor/conductor.py @@ -108,7 +108,7 @@ def resolve_templates(self, identifier: Union[str, BaseTemplate], try: urllib.request.urlopen(MAINLINE_URL) except: - logger(__name__).warn("Failed to connect to GitHub. Check your internet connection or consult a network administrator.") + logger(__name__).warn("Failed to connect to GitHub.") allow_online = False allow_offline = True if isinstance(identifier, str): From 73154080c57c9d6421b1d5bdcbc286ef2bb1175e Mon Sep 17 00:00:00 2001 From: omegaStag Date: Tue, 21 Dec 2021 14:37:05 -0600 Subject: [PATCH 7/9] Modify offline check --- pros/conductor/conductor.py | 44 ++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/pros/conductor/conductor.py b/pros/conductor/conductor.py index a2d11336..80d1d741 100644 --- a/pros/conductor/conductor.py +++ b/pros/conductor/conductor.py @@ -3,7 +3,7 @@ from pathlib import Path from typing import * import urllib.request - +import urllib.error import click from semantic_version import Spec, Version @@ -105,35 +105,33 @@ def resolve_templates(self, identifier: Union[str, BaseTemplate], kernel_version = kwargs.get('kernel_version', None) allow_online = kwargs.get('allow_online', True) download_ok = kwargs.get('download_ok', True) - try: - urllib.request.urlopen(MAINLINE_URL) - except: - logger(__name__).warn("Failed to connect to GitHub.") - allow_online = False - allow_offline = True if isinstance(identifier, str): query = BaseTemplate.create_query(name=identifier, **kwargs) else: query = identifier - if allow_offline: - offline_results = filter(lambda t: t.satisfies(query, kernel_version=kernel_version), self.local_templates) - if unique: - results.update(offline_results) - else: - results.extend(offline_results) - if allow_online and download_ok: - for depot in self.depots.values(): - try: - online_results = filter(lambda t: t.satisfies(query, kernel_version=kernel_version), + try: + urllib.request(MAINLINE_URL, timeout=1) + if allow_online and download_ok: + for depot in self.depots.values(): + try: + online_results = filter(lambda t: t.satisfies(query, kernel_version=kernel_version), depot.get_remote_templates(force_check=force_refresh, **kwargs)) - if unique: - results.update(online_results) - else: - results.extend(online_results) - except Exception as e: - logger(__name__).error(e) + if unique: + results.update(online_results) + else: + results.extend(online_results) + except Exception as e: + logger(__name__).error(e) logger(__name__).debug('Saving Conductor config after checking for remote updates') self.save() # Save self since there may have been some updates from the depots + except Exception as e: + logger(__name__).warn("Failed to connect to Github.") + if allow_offline: + offline_results = filter(lambda t: t.satisfies(query, kernel_version=kernel_version), self.local_templates) + if unique: + results.update(offline_results) + else: + results.extend(offline_results) return list(results) def resolve_template(self, identifier: Union[str, BaseTemplate], **kwargs) -> Optional[BaseTemplate]: From f497a72cab001c6d9e0d726824004efb5670208e Mon Sep 17 00:00:00 2001 From: omegaStag Date: Mon, 27 Dec 2021 08:59:48 -0600 Subject: [PATCH 8/9] Update conductor.py --- pros/conductor/conductor.py | 34 ++++++++++++++++------------------ 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/pros/conductor/conductor.py b/pros/conductor/conductor.py index 80d1d741..46bf6781 100644 --- a/pros/conductor/conductor.py +++ b/pros/conductor/conductor.py @@ -110,28 +110,26 @@ def resolve_templates(self, identifier: Union[str, BaseTemplate], else: query = identifier try: - urllib.request(MAINLINE_URL, timeout=1) - if allow_online and download_ok: - for depot in self.depots.values(): - try: - online_results = filter(lambda t: t.satisfies(query, kernel_version=kernel_version), - depot.get_remote_templates(force_check=force_refresh, **kwargs)) - if unique: - results.update(online_results) - else: - results.extend(online_results) - except Exception as e: - logger(__name__).error(e) + urllib.request('http://216.58.192.142', timeout=1) + for depot in self.depots.values(): + try: + online_results = filter(lambda t: t.satisfies(query, kernel_version=kernel_version), + depot.get_remote_templates(force_check=force_refresh, **kwargs)) + if unique: + results.update(online_results) + else: + results.extend(online_results) + except Exception as e: + logger(__name__).error(e) logger(__name__).debug('Saving Conductor config after checking for remote updates') self.save() # Save self since there may have been some updates from the depots except Exception as e: logger(__name__).warn("Failed to connect to Github.") - if allow_offline: - offline_results = filter(lambda t: t.satisfies(query, kernel_version=kernel_version), self.local_templates) - if unique: - results.update(offline_results) - else: - results.extend(offline_results) + offline_results = filter(lambda t: t.satisfies(query, kernel_version=kernel_version), self.local_templates) + if unique: + results.update(offline_results) + else: + results.extend(offline_results) return list(results) def resolve_template(self, identifier: Union[str, BaseTemplate], **kwargs) -> Optional[BaseTemplate]: From 2640d38a1775f83561c4b05ab54462fb88bcdf38 Mon Sep 17 00:00:00 2001 From: omegaStag Date: Mon, 27 Dec 2021 09:14:42 -0600 Subject: [PATCH 9/9] Update conductor.py --- pros/conductor/conductor.py | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/pros/conductor/conductor.py b/pros/conductor/conductor.py index 46bf6781..da3af5c5 100644 --- a/pros/conductor/conductor.py +++ b/pros/conductor/conductor.py @@ -98,32 +98,27 @@ def purge_template(self, template: LocalTemplate): shutil.rmtree(template.location) self.save() - def resolve_templates(self, identifier: Union[str, BaseTemplate], - allow_offline: bool = True, force_refresh: bool = False, + def resolve_templates(self, identifier: Union[str, BaseTemplate], force_refresh: bool = False, unique: bool = True, **kwargs) -> List[BaseTemplate]: results = list() if not unique else set() kernel_version = kwargs.get('kernel_version', None) - allow_online = kwargs.get('allow_online', True) - download_ok = kwargs.get('download_ok', True) if isinstance(identifier, str): query = BaseTemplate.create_query(name=identifier, **kwargs) else: query = identifier + try: urllib.request('http://216.58.192.142', timeout=1) for depot in self.depots.values(): - try: - online_results = filter(lambda t: t.satisfies(query, kernel_version=kernel_version), - depot.get_remote_templates(force_check=force_refresh, **kwargs)) - if unique: - results.update(online_results) - else: - results.extend(online_results) - except Exception as e: - logger(__name__).error(e) + online_results = filter(lambda t: t.satisfies(query, kernel_version=kernel_version), + depot.get_remote_templates(force_check=force_refresh, **kwargs)) + if unique: + results.update(online_results) + else: + results.extend(online_results) logger(__name__).debug('Saving Conductor config after checking for remote updates') self.save() # Save self since there may have been some updates from the depots - except Exception as e: + except Exception as err: logger(__name__).warn("Failed to connect to Github.") offline_results = filter(lambda t: t.satisfies(query, kernel_version=kernel_version), self.local_templates) if unique: