From c0e8a7608351679b8ebdb71207339384161d6616 Mon Sep 17 00:00:00 2001 From: Dave B Date: Thu, 22 Sep 2016 13:59:11 -0400 Subject: [PATCH] [16.07] Fix tool dependencies handling in Tool Shed model (#2950) * Fix the cause of toolshed test 1400 failing. * Fix handling of repositories without tool dependencies. * Fix tool dependency retrieval. In some cases, a process might attempt to fetch tool dependencies for revision 1:7334f6d0ac17, but the repository has been updated, and tool dependency metadata has been reassigned to e.g. 7:ce22ceec214a. This commit resolves that issue. * Correct the logic that returns an empty string for an empty dict. * Fix getting latest revision with tool dependencies. * Use self.app instead of trans.app --- lib/galaxy/webapps/tool_shed/api/repositories.py | 2 +- lib/galaxy/webapps/tool_shed/controllers/repository.py | 4 ++-- lib/galaxy/webapps/tool_shed/model/__init__.py | 8 +++++--- lib/tool_shed/util/metadata_util.py | 2 +- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/lib/galaxy/webapps/tool_shed/api/repositories.py b/lib/galaxy/webapps/tool_shed/api/repositories.py index d671181fb0e..ea03222fae6 100644 --- a/lib/galaxy/webapps/tool_shed/api/repositories.py +++ b/lib/galaxy/webapps/tool_shed/api/repositories.py @@ -781,7 +781,7 @@ class RepositoriesController( BaseAPIController ): else: metadata_dict[ 'repository_dependencies' ] = [] if metadata.includes_tool_dependencies and recursive: - metadata_dict[ 'tool_dependencies' ] = repository.get_tool_dependencies( changehash ) + metadata_dict[ 'tool_dependencies' ] = repository.get_tool_dependencies( self.app, changehash ) else: metadata_dict[ 'tool_dependencies' ] = {} if metadata.includes_tools: diff --git a/lib/galaxy/webapps/tool_shed/controllers/repository.py b/lib/galaxy/webapps/tool_shed/controllers/repository.py index a0d86ea3198..af52a3a544f 100644 --- a/lib/galaxy/webapps/tool_shed/controllers/repository.py +++ b/lib/galaxy/webapps/tool_shed/controllers/repository.py @@ -1465,8 +1465,8 @@ class RepositoryController( BaseUIController, ratings_util.ItemRatings ): owner = kwd.get( 'owner', None ) changeset_revision = kwd.get( 'changeset_revision', None ) repository = repository_util.get_repository_by_name_and_owner( trans.app, name, owner ) - dependencies = repository.get_tool_dependencies( changeset_revision ) - if dependencies is not None: + dependencies = repository.get_tool_dependencies( trans.app, changeset_revision ) + if len( dependencies ) > 0: return encoding_util.tool_shed_encode( dependencies ) return '' diff --git a/lib/galaxy/webapps/tool_shed/model/__init__.py b/lib/galaxy/webapps/tool_shed/model/__init__.py index 61969117d78..8935aa24d33 100644 --- a/lib/galaxy/webapps/tool_shed/model/__init__.py +++ b/lib/galaxy/webapps/tool_shed/model/__init__.py @@ -245,11 +245,13 @@ class Repository( object, Dictifiable ): def get_type_class( self, app ): return app.repository_types_registry.get_class_by_label( self.type ) - def get_tool_dependencies( self, changeset_revision ): + def get_tool_dependencies( self, app, changeset_revision ): + repo = hg.repository( ui.ui(), self.repo_path( app ) ) + changeset_revision = metadata_util.get_next_downloadable_changeset_revision( self, repo, changeset_revision ) for downloadable_revision in self.downloadable_revisions: if downloadable_revision.changeset_revision == changeset_revision: - return downloadable_revision.metadata.get( 'tool_dependencies', [] ) - return [] + return downloadable_revision.metadata.get( 'tool_dependencies', {} ) + return {} def installable_revisions( self, app, sort_revisions=True ): return metadata_util.get_metadata_revisions( self, diff --git a/lib/tool_shed/util/metadata_util.py b/lib/tool_shed/util/metadata_util.py index 308247c3ae3..f204058eea4 100644 --- a/lib/tool_shed/util/metadata_util.py +++ b/lib/tool_shed/util/metadata_util.py @@ -32,7 +32,7 @@ def get_all_dependencies( app, metadata_entry, processed_dependency_links=[] ): dependency_dict[ 'tools' ] = dependency_metadata.metadata[ 'tools' ] dependency_dict[ 'repository_dependencies' ] = [] if dependency_dict['includes_tool_dependencies']: - dependency_dict['tool_dependencies'] = repository.get_tool_dependencies( dependency_dict['changeset_revision'] ) + dependency_dict['tool_dependencies'] = repository.get_tool_dependencies( app, dependency_dict['changeset_revision'] ) if dependency_dict['has_repository_dependencies']: dependency_dict['repository_dependencies'] = get_all_dependencies( app, dependency_metadata, processed_dependency_links ) else: