diff --git a/lib/galaxy/util/shed_util.py b/lib/galaxy/util/shed_util.py index 4f0714c0ef8..f7b27e2bf0e 100644 --- a/lib/galaxy/util/shed_util.py +++ b/lib/galaxy/util/shed_util.py @@ -952,12 +952,16 @@ def get_update_to_changeset_revision_and_ctx_rev( trans, repository ): update_dict = encoding_util.tool_shed_decode( encoded_update_dict ) changeset_revision = update_dict[ 'changeset_revision' ] ctx_rev = update_dict[ 'ctx_rev' ] + includes_tools = update_dict.get( 'includes_tools', False ) + has_repository_dependencies = update_dict.get( 'has_repository_dependencies', False ) response.close() except Exception, e: log.debug( "Error getting change set revision for update from the tool shed for repository '%s': %s" % ( repository.name, str( e ) ) ) + includes_tools = False + has_repository_dependencies = False changeset_revision = None ctx_rev = None - return changeset_revision, ctx_rev + return changeset_revision, ctx_rev, includes_tools, has_repository_dependencies def handle_missing_data_table_entry( app, relative_install_dir, tool_path, repository_tools_tups ): """ Inspect each tool to see if any have input parameters that are dynamically generated select lists that require entries in the diff --git a/lib/galaxy/webapps/community/controllers/repository.py b/lib/galaxy/webapps/community/controllers/repository.py index 51b9d0cfca1..0e8611ccb74 100644 --- a/lib/galaxy/webapps/community/controllers/repository.py +++ b/lib/galaxy/webapps/community/controllers/repository.py @@ -1256,6 +1256,21 @@ class RepositoryController( BaseUIController, common.ItemRatings ): @web.expose def get_changeset_revision_and_ctx_rev( self, trans, **kwd ): """Handle a request from a local Galaxy instance to retrieve the changeset revision hash to which an installed repository can be updated.""" + def has_tools_and_repository_dependencies( repository_metadata ): + includes_tools = False + has_repository_dependencies = False + if repository_metadata: + metadata = repository_metadata.metadata + if metadata: + if 'tools' in metadata: + includes_tools = True + else: + includes_tools = False + if 'repository_dependencies' in metadata: + has_repository_dependencies = True + else: + has_repository_dependencies = False + return includes_tools, has_repository_dependencies params = util.Params( kwd ) message = util.restore_text( params.get( 'message', '' ) ) status = params.get( 'status', 'done' ) @@ -1264,20 +1279,24 @@ class RepositoryController( BaseUIController, common.ItemRatings ): owner = params.get( 'owner', None ) changeset_revision = params.get( 'changeset_revision', None ) repository = suc.get_repository_by_name_and_owner( trans, name, owner ) + repository_metadata = suc.get_repository_metadata_by_changeset_revision( trans, + trans.security.encode_id( repository.id ), + changeset_revision ) + includes_tools, has_repository_dependencies = has_tools_and_repository_dependencies( repository_metadata ) repo_dir = repository.repo_path( trans.app ) repo = hg.repository( suc.get_configured_ui(), repo_dir ) # Default to the received changeset revision and ctx_rev. update_to_ctx = suc.get_changectx_for_changeset( repo, changeset_revision ) ctx_rev = str( update_to_ctx.rev() ) latest_changeset_revision = changeset_revision - update_dict = dict( changeset_revision=changeset_revision, ctx_rev=ctx_rev ) + update_dict = dict( changeset_revision=changeset_revision, + ctx_rev=ctx_rev, + includes_tools=includes_tools, + has_repository_dependencies=has_repository_dependencies ) if changeset_revision == repository.tip( trans.app ): # If changeset_revision is the repository tip, there are no additional updates. return encoding_util.tool_shed_encode( update_dict ) else: - repository_metadata = suc.get_repository_metadata_by_changeset_revision( trans, - trans.security.encode_id( repository.id ), - changeset_revision ) if repository_metadata: # If changeset_revision is in the repository_metadata table for this repository, there are no additional updates. return encoding_util.tool_shed_encode( update_dict ) @@ -1286,10 +1305,16 @@ class RepositoryController( BaseUIController, common.ItemRatings ): # repository was installed. We need to find the changeset_revision to which we need to update. update_to_changeset_hash = None for changeset in repo.changelog: + includes_tools = False + has_repository_dependencies = False changeset_hash = str( repo.changectx( changeset ) ) ctx = suc.get_changectx_for_changeset( repo, changeset_hash ) if update_to_changeset_hash: - if suc.get_repository_metadata_by_changeset_revision( trans, trans.security.encode_id( repository.id ), changeset_hash ): + update_to_repository_metadata = suc.get_repository_metadata_by_changeset_revision( trans, + trans.security.encode_id( repository.id ), + changeset_hash ) + if update_to_repository_metadata: + includes_tools, has_repository_dependencies = has_tools_and_repository_dependencies( update_to_repository_metadata ) # We found a RepositoryMetadata record. if changeset_hash == repository.tip( trans.app ): # The current ctx is the repository tip, so use it. @@ -1302,6 +1327,8 @@ class RepositoryController( BaseUIController, common.ItemRatings ): elif not update_to_changeset_hash and changeset_hash == changeset_revision: # We've found the changeset in the changelog for which we need to get the next update. update_to_changeset_hash = changeset_hash + update_dict[ 'includes_tools' ] = includes_tools + update_dict[ 'has_repository_dependencies' ] = has_repository_dependencies update_dict[ 'changeset_revision' ] = str( latest_changeset_revision ) update_dict[ 'ctx_rev' ] = str( update_to_ctx.rev() ) return encoding_util.tool_shed_encode( update_dict ) diff --git a/lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py b/lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py index b352b2d096f..4e44db45e0a 100644 --- a/lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py +++ b/lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py @@ -372,27 +372,15 @@ class AdminToolshed( AdminGalaxy ): if operation == "activate or reinstall": repository = suc.get_installed_tool_shed_repository( trans, kwd[ 'id' ] ) if repository.uninstalled: - # Since we're reinstalling the repository we need to find the latest changeset revision to which is can be updated so that we + # Since we're reinstalling the repository we need to find the latest changeset revision to which it can be updated so that we # can reset the metadata if necessary. This will ensure that information about repository dependencies and tool dependencies # will be current. - current_changeset_revision, current_ctx_rev = shed_util.get_update_to_changeset_revision_and_ctx_rev( trans, repository ) - if current_ctx_rev != repository.ctx_rev: - repo = hg.repository( suc.get_configured_ui(), path=os.path.abspath( repository.repo_path( trans.app ) ) ) - repository_clone_url = suc.generate_clone_url_for_installed_repository( trans.app, repository ) - shed_util.pull_repository( repo, repository_clone_url, current_changeset_revision ) - suc.update_repository( repo, ctx_rev=current_ctx_rev ) - shed_tool_conf, tool_path, relative_install_dir = suc.get_tool_panel_config_tool_path_install_dir( trans.app, repository ) - shed_config_dict = trans.app.toolbox.get_shed_config_dict_by_filename( shed_tool_conf ) - metadata_dict, invalid_file_tups = suc.generate_metadata_for_changeset_revision( app=trans.app, - repository=repository, - repository_clone_url=repository_clone_url, - shed_config_dict=shed_config_dict, - relative_install_dir=relative_install_dir, - repository_files_dir=None, - resetting_all_metadata_on_repository=False, - updating_installed_repository=True, - persist=True ) - if repository.includes_tools or repository.has_repository_dependencies: + current_changeset_revision, current_ctx_rev, includes_tools, has_repository_dependencies = \ + shed_util.get_update_to_changeset_revision_and_ctx_rev( trans, repository ) + if current_ctx_rev == repository.ctx_rev: + includes_tools = repository.includes_tools + has_repository_dependencies = repository.has_repository_dependencies + if includes_tools or has_repository_dependencies: # Only allow selecting a different section in the tool panel if the repository was uninstalled. return trans.response.send_redirect( web.url_for( controller='admin_toolshed', action='reselect_tool_panel_section', @@ -859,12 +847,12 @@ class AdminToolshed( AdminGalaxy ): if cloned_ok: if reinstalling: # Since we're reinstalling the repository we need to find the latest changeset revision to which is can be updated. - current_changeset_revision, current_ctx_rev = shed_util.get_update_to_changeset_revision_and_ctx_rev( trans, tool_shed_repository ) + current_changeset_revision, current_ctx_rev, includes_tools, has_repository_dependencies = \ + shed_util.get_update_to_changeset_revision_and_ctx_rev( trans, tool_shed_repository ) if current_ctx_rev != ctx_rev: repo = hg.repository( suc.get_configured_ui(), path=os.path.abspath( install_dir ) ) shed_util.pull_repository( repo, repository_clone_url, current_changeset_revision ) suc.update_repository( repo, ctx_rev=current_ctx_rev ) - self.handle_repository_contents( trans, tool_shed_repository=tool_shed_repository, tool_path=tool_path,