From 3f3fd66adf37b04b641014a737055d57f97fb51a Mon Sep 17 00:00:00 2001 From: Greg Von Kuster Date: Tue, 19 Feb 2013 15:01:09 -0500 Subject: [PATCH] Handle all Galaxy utilitiy types when reinstalling an uninstalled tool shed repository. The shed-related config file can now be selected when reinstalling repositories with any contents so that a differnt "tool_path" location can be selected for the location of the reinstalled repository. --- lib/galaxy/util/shed_util.py | 31 +++- .../community/controllers/repository.py | 59 +++++--- .../galaxy/controllers/admin_toolshed.py | 132 +++++++++++------- .../reselect_tool_panel_section.mako | 65 ++++++--- .../select_tool_panel_section.mako | 10 +- 5 files changed, 198 insertions(+), 99 deletions(-) diff --git a/lib/galaxy/util/shed_util.py b/lib/galaxy/util/shed_util.py index 282ee5e5873..b5b008590de 100644 --- a/lib/galaxy/util/shed_util.py +++ b/lib/galaxy/util/shed_util.py @@ -951,6 +951,7 @@ def get_tool_version_association( app, parent_tool_version, tool_version ): .first() def get_update_to_changeset_revision_and_ctx_rev( trans, repository ): """Return the changeset revision hash to which the repository can be updated.""" + changeset_revision_dict = {} tool_shed_url = suc.get_url_from_repository_tool_shed( trans.app, repository ) url = suc.url_join( tool_shed_url, 'repository/get_changeset_revision_and_ctx_rev?name=%s&owner=%s&changeset_revision=%s' % \ ( repository.name, repository.owner, repository.installed_changeset_revision ) ) @@ -959,18 +960,34 @@ def get_update_to_changeset_revision_and_ctx_rev( trans, repository ): encoded_update_dict = response.read() if encoded_update_dict: update_dict = encoding_util.tool_shed_decode( encoded_update_dict ) - changeset_revision = update_dict[ 'changeset_revision' ] - ctx_rev = update_dict[ 'ctx_rev' ] + includes_data_managers = update_dict.get( 'includes_data_managers', False ) + includes_datatypes = update_dict.get( 'includes_datatypes', False ) includes_tools = update_dict.get( 'includes_tools', False ) + includes_tool_dependencies = update_dict.get( 'includes_tool_dependencies', False ) + includes_workflows = update_dict.get( 'includes_workflows', False ) has_repository_dependencies = update_dict.get( 'has_repository_dependencies', False ) + changeset_revision = update_dict.get( 'changeset_revision', None ) + ctx_rev = update_dict.get( 'ctx_rev', None ) response.close() + changeset_revision_dict[ 'includes_data_managers' ] = includes_data_managers + changeset_revision_dict[ 'includes_datatypes' ] = includes_datatypes + changeset_revision_dict[ 'includes_tools' ] = includes_tools + changeset_revision_dict[ 'includes_tool_dependencies' ] = includes_tool_dependencies + changeset_revision_dict[ 'includes_workflows' ] = includes_workflows + changeset_revision_dict[ 'has_repository_dependencies' ] = has_repository_dependencies + changeset_revision_dict[ 'changeset_revision' ] = changeset_revision + changeset_revision_dict[ 'ctx_rev' ] = ctx_rev 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, includes_tools, has_repository_dependencies + changeset_revision_dict[ 'includes_data_managers' ] = False + changeset_revision_dict[ 'includes_datatypes' ] = False + changeset_revision_dict[ 'includes_tools' ] = False + changeset_revision_dict[ 'includes_tool_dependencies' ] = False + changeset_revision_dict[ 'includes_workflows' ] = False + changeset_revision_dict[ 'has_repository_dependencies' ] = False + changeset_revision_dict[ 'changeset_revision' ] = None + changeset_revision_dict[ 'ctx_rev' ] = None + return changeset_revision_dict 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 5995979cadc..284cd8e4eec 100644 --- a/lib/galaxy/webapps/community/controllers/repository.py +++ b/lib/galaxy/webapps/community/controllers/repository.py @@ -1298,21 +1298,29 @@ class RepositoryController( BaseUIController, common_util.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 ): + def has_galaxy_utilities( repository_metadata ): + includes_data_managers = False + includes_datatypes = False includes_tools = False has_repository_dependencies = False + includes_tool_dependencies = False + includes_workflows = False if repository_metadata: metadata = repository_metadata.metadata if metadata: + if 'data_manager' in metadata: + includes_data_managers = True + if 'datatypes' in metadata: + includes_datatypes = True if 'tools' in metadata: includes_tools = True - else: - includes_tools = False + if 'tool_dependencies' in metadata: + includes_tool_dependencies = True if 'repository_dependencies' in metadata: has_repository_dependencies = True - else: - has_repository_dependencies = False - return includes_tools, has_repository_dependencies + if 'workflows' in metadata: + includes_workflows = True + return includes_data_managers, includes_datatypes, includes_tools, includes_tool_dependencies, has_repository_dependencies, includes_workflows params = util.Params( kwd ) message = util.restore_text( params.get( 'message', '' ) ) status = params.get( 'status', 'done' ) @@ -1324,7 +1332,8 @@ class RepositoryController( BaseUIController, common_util.ItemRatings ): 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 ) + includes_data_managers, includes_datatypes, includes_tools, includes_tool_dependencies, has_repository_dependencies, includes_workflows = \ + has_galaxy_utilities( 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. @@ -1333,8 +1342,12 @@ class RepositoryController( BaseUIController, common_util.ItemRatings ): latest_changeset_revision = changeset_revision update_dict = dict( changeset_revision=changeset_revision, ctx_rev=ctx_rev, + includes_data_managers=includes_data_managers, + includes_datatypes=includes_datatypes, includes_tools=includes_tools, - has_repository_dependencies=has_repository_dependencies ) + includes_tool_dependencies=includes_tool_dependencies, + has_repository_dependencies=has_repository_dependencies, + includes_workflows=includes_workflows ) 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 ) @@ -1356,7 +1369,8 @@ class RepositoryController( BaseUIController, common_util.ItemRatings ): 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 ) + includes_data_managers, includes_datatypes, includes_tools, includes_tool_dependencies, has_repository_dependencies, includes_workflows = \ + has_galaxy_utilities( 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. @@ -1369,7 +1383,11 @@ class RepositoryController( BaseUIController, common_util.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_data_managers' ] = includes_data_managers + update_dict[ 'includes_datatypes' ] = includes_datatypes update_dict[ 'includes_tools' ] = includes_tools + update_dict[ 'includes_tool_dependencies' ] = includes_tool_dependencies + update_dict[ 'includes_workflows' ] = includes_workflows 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() ) @@ -1601,16 +1619,22 @@ class RepositoryController( BaseUIController, common_util.ItemRatings ): repository_metadata=repository_metadata, tool_dependencies=None, repository_dependencies=None ) + includes_data_managers = False + includes_datatypes = False + includes_tools = False + includes_workflows = False + readme_files_dict = None metadata = repository_metadata.metadata if metadata: - readme_files_dict = suc.build_readme_files_dict( metadata ) + if 'data_manager' in metadata: + includes_data_managers = True + if 'datatypes' in metadata: + includes_datatypes = True if 'tools' in metadata: includes_tools = True - else: - includes_tools = False - else: - readme_files_dict = None - includes_tools = False + if 'workflows' in metadata: + includes_workflows = True + readme_files_dict = suc.build_readme_files_dict( metadata ) # See if the repo_info_dict was populated with repository_dependencies or tool_dependencies. for name, repo_info_tuple in repo_info_dict.items(): description, repository_clone_url, changeset_revision, ctx_rev, repository_owner, repository_dependencies, tool_dependencies = \ @@ -1623,9 +1647,12 @@ class RepositoryController( BaseUIController, common_util.ItemRatings ): includes_tool_dependencies = True else: includes_tool_dependencies = False - return dict( includes_tools=includes_tools, + return dict( includes_data_managers=includes_data_managers, + includes_datatypes=includes_datatypes, + includes_tools=includes_tools, has_repository_dependencies=has_repository_dependencies, includes_tool_dependencies=includes_tool_dependencies, + includes_workflows=includes_workflows, readme_files_dict=readme_files_dict, repo_info_dict=repo_info_dict ) def get_versions_of_tool( self, trans, repository, repository_metadata, guid ): diff --git a/lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py b/lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py index f98921cd983..b7b4d1a535f 100644 --- a/lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py +++ b/lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py @@ -383,29 +383,23 @@ class AdminToolshed( AdminGalaxy ): if repository.uninstalled: # 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. Only allow selecting a different section in the tool panel if the repository was uninstalled. - 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: - # The uninstalled repository is current. - if repository.includes_tools or repository.has_repository_dependencies: + # will be current. Only allow selecting a different section in the tool panel if the repository was uninstalled. + changeset_revision_dict = shed_util.get_update_to_changeset_revision_and_ctx_rev( trans, repository ) + current_changeset_revision = changeset_revision_dict.get( 'changeset_revision', None ) + current_ctx_rev = changeset_revision_dict.get( 'ctx_rev', None ) + if current_changeset_revision and current_ctx_rev: + if current_ctx_rev == repository.ctx_rev: + # The uninstalled repository is current. return trans.response.send_redirect( web.url_for( controller='admin_toolshed', action='reselect_tool_panel_section', **kwd ) ) else: - return trans.response.send_redirect( web.url_for( controller='admin_toolshed', - action='reinstall_repository', - **kwd ) ) - else: - # The uninstalled repository has updates available in the tool shed. - updated_repo_info_dict = self.get_updated_repository_information( trans=trans, - repository_id=trans.security.encode_id( repository.id ), - repository_name=repository.name, - repository_owner=repository.owner, - changeset_revision=current_changeset_revision ) - has_repository_dependencies = updated_repo_info_dict.get( 'has_repository_dependencies', False ) - includes_tool_dependencies = updated_repo_info_dict.get( 'includes_tool_dependencies', False ) - if has_repository_dependencies or includes_tool_dependencies: + # The uninstalled repository has updates available in the tool shed. + updated_repo_info_dict = self.get_updated_repository_information( trans=trans, + repository_id=trans.security.encode_id( repository.id ), + repository_name=repository.name, + repository_owner=repository.owner, + changeset_revision=current_changeset_revision ) json_repo_info_dict = json.to_json_string( updated_repo_info_dict ) encoded_repo_info_dict = encoding_util.tool_shed_encode( json_repo_info_dict ) kwd[ 'latest_changeset_revision' ] = current_changeset_revision @@ -414,10 +408,14 @@ class AdminToolshed( AdminGalaxy ): return trans.response.send_redirect( web.url_for( controller='admin_toolshed', action='reselect_tool_panel_section', **kwd ) ) - else: - return trans.response.send_redirect( web.url_for( controller='admin_toolshed', - action='reinstall_repository', - **kwd ) ) + else: + message = "Unable to get latest revision for repository %s from the tool shed, so repository " % str( repository.name ) + message += "reinstallation is not possible at this time." + status = "error" + return trans.response.send_redirect( web.url_for( controller='admin_toolshed', + action='browse_repositories', + message=message, + status=status ) ) else: return trans.response.send_redirect( web.url_for( controller='admin_toolshed', action='activate_repository', @@ -903,8 +901,9 @@ 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, includes_tools, has_repository_dependencies = \ - shed_util.get_update_to_changeset_revision_and_ctx_rev( trans, tool_shed_repository ) + changeset_revision_dict = shed_util.get_update_to_changeset_revision_and_ctx_rev( trans, tool_shed_repository ) + current_changeset_revision = changeset_revision_dict.get( 'changeset_revision', None ) + current_ctx_rev = changeset_revision_dict.get( 'ctx_rev', None ) 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 ) @@ -1367,7 +1366,7 @@ class AdminToolshed( AdminGalaxy ): containers_dicts.append( containers_dict ) # Merge all containers into a single container. containers_dict = shed_util.merge_containers_dicts_for_new_install( containers_dicts ) - # Handle tool dependencies chack box. + # Handle tool dependencies check box. if trans.app.config.tool_dependency_dir is None: if includes_tool_dependencies: message = "Tool dependencies defined in this repository can be automatically installed if you set the value of your tool_dependency_dir " @@ -1566,6 +1565,7 @@ class AdminToolshed( AdminGalaxy ): Galaxy database will not be used since it is outdated. """ message = '' + status = 'done' repository_id = kwd.get( 'id', None ) latest_changeset_revision = kwd.get( 'latest_changeset_revision', None ) latest_ctx_rev = kwd.get( 'latest_ctx_rev', None ) @@ -1580,19 +1580,36 @@ class AdminToolshed( AdminGalaxy ): encoded_updated_repo_info_dict = kwd.get( 'updated_repo_info_dict', None ) updated_repo_info_dict = encoding_util.tool_shed_decode( encoded_updated_repo_info_dict ) readme_files_dict = updated_repo_info_dict.get( 'readme_files_dict', None ) + includes_data_managers = updated_repo_info_dict.get( 'includes_data_managers', False ) + includes_datatypes = updated_repo_info_dict.get( 'includes_datatypes', False ) includes_tools = updated_repo_info_dict.get( 'includes_tools', False ) + includes_workflows = updated_repo_info_dict.get( 'includes_workflows', False ) has_repository_dependencies = updated_repo_info_dict.get( 'has_repository_dependencies', False ) includes_tool_dependencies = updated_repo_info_dict.get( 'includes_tool_dependencies', False ) repo_info_dict = updated_repo_info_dict[ 'repo_info_dict' ] else: # There are no updates available from the tool shed for the repository, so use it's locally stored metadata. + has_repository_dependencies = False + includes_data_managers = False + includes_datatypes = False + includes_tool_dependencies = False + includes_tools = False + includes_workflows = False + readme_files_dict = None + tool_dependencies = None if metadata: + if 'data_manager' in metadata: + includes_data_managers = True + if 'datatypes' in metadata: + includes_datatypes = True + if 'tools' in metadata: + includes_tools = True + if 'tool_dependencies' in metadata: + includes_tool_dependencies = True + if 'workflows' in metadata: + includes_workflows = True readme_files_dict = suc.build_readme_files_dict( metadata ) tool_dependencies = metadata.get( 'tool_dependencies', None ) - else: - readme_files_dict = None - tool_dependencies = None - includes_tool_dependencies = tool_shed_repository.includes_tool_dependencies repository_dependencies = self.get_repository_dependencies( trans=trans, repository_id=repository_id, repository_name=tool_shed_repository.name, @@ -1615,33 +1632,39 @@ class AdminToolshed( AdminGalaxy ): has_repository_dependencies = True else: has_repository_dependencies = False - # Get the location in the tool panel in which the tool was originally loaded. - if 'tool_panel_section' in metadata: - tool_panel_dict = metadata[ 'tool_panel_section' ] - if tool_panel_dict: - if shed_util.panel_entry_per_tool( tool_panel_dict ): - # The following forces everything to be loaded into 1 section (or no section) in the tool panel. - tool_section_dicts = tool_panel_dict[ tool_panel_dict.keys()[ 0 ] ] - tool_section_dict = tool_section_dicts[ 0 ] - original_section_name = tool_section_dict[ 'name' ] + if includes_tools: + # Get the location in the tool panel in which the tools were originally loaded. + if 'tool_panel_section' in metadata: + tool_panel_dict = metadata[ 'tool_panel_section' ] + if tool_panel_dict: + if shed_util.panel_entry_per_tool( tool_panel_dict ): + # The following forces everything to be loaded into 1 section (or no section) in the tool panel. + tool_section_dicts = tool_panel_dict[ tool_panel_dict.keys()[ 0 ] ] + tool_section_dict = tool_section_dicts[ 0 ] + original_section_name = tool_section_dict[ 'name' ] + else: + original_section_name = tool_panel_dict[ 'name' ] else: - original_section_name = tool_panel_dict[ 'name' ] + original_section_name = '' else: original_section_name = '' + tool_panel_section_select_field = build_tool_panel_section_select_field( trans ) + no_changes_check_box = CheckboxField( 'no_changes', checked=True ) + if original_section_name: + message += "The tools contained in your %s repository were last loaded into the tool panel section %s. " \ + % ( tool_shed_repository.name, original_section_name ) + message += "Uncheck the No changes check box and select a different tool panel section to load the tools in a " + message += "different section in the tool panel. " + status = 'warning' + else: + message += "The tools contained in your %s repository were last loaded into the tool panel outside of any sections. " % tool_shed_repository.name + message += "Uncheck the No changes check box and select a tool panel section to load the tools into that section. " + status = 'warning' else: + no_changes_check_box = None original_section_name = '' - tool_panel_section_select_field = build_tool_panel_section_select_field( trans ) - no_changes_check_box = CheckboxField( 'no_changes', checked=True ) - if original_section_name: - message += "The tools contained in your %s repository were last loaded into the tool panel section %s. " \ - % ( tool_shed_repository.name, original_section_name ) - message += "Uncheck the No changes check box and select a different tool panel section to load the tools in a " - message += "different section in the tool panel. " - status = 'warning' - else: - message += "The tools contained in your %s repository were last loaded into the tool panel outside of any sections. " % tool_shed_repository.name - message += "Uncheck the No changes check box and select a tool panel section to load the tools into that section. " - status = 'warning' + tool_panel_section_select_field = None + shed_tool_conf_select_field = build_shed_tool_conf_select_field( trans ) containers_dict = shed_util.populate_containers_dict_for_new_install( trans=trans, tool_shed_url=tool_shed_url, tool_path=tool_path, @@ -1669,12 +1692,17 @@ class AdminToolshed( AdminGalaxy ): repository=tool_shed_repository, no_changes_check_box=no_changes_check_box, original_section_name=original_section_name, + includes_data_managers=includes_data_managers, + includes_datatypes=includes_datatypes, + includes_tools=includes_tools, includes_tool_dependencies=includes_tool_dependencies, + includes_workflows=includes_workflows, has_repository_dependencies=has_repository_dependencies, install_repository_dependencies_check_box=install_repository_dependencies_check_box, install_tool_dependencies_check_box=install_tool_dependencies_check_box, containers_dict=containers_dict, tool_panel_section_select_field=tool_panel_section_select_field, + shed_tool_conf_select_field=shed_tool_conf_select_field, encoded_repo_info_dict=encoding_util.tool_shed_encode( repo_info_dict ), repo_info_dict=repo_info_dict, message=message, diff --git a/templates/admin/tool_shed_repository/reselect_tool_panel_section.mako b/templates/admin/tool_shed_repository/reselect_tool_panel_section.mako index 08377f05d4e..b171db2991f 100644 --- a/templates/admin/tool_shed_repository/reselect_tool_panel_section.mako +++ b/templates/admin/tool_shed_repository/reselect_tool_panel_section.mako @@ -41,28 +41,55 @@ ${render_dependencies_section( install_repository_dependencies_check_box, install_tool_dependencies_check_box, containers_dict )} %endif -
-
- ${no_changes_check_box.get_html()} - -
- Uncheck and select a different tool panel section to load the tools into a different section in the tool panel. + %if shed_tool_conf_select_field: +
+ + +
Choose the configuration file whose tool_path setting will be used for installing repositories
-
-
- - -
- Add a new tool panel section to contain the installed tools (optional). + <% + if len( shed_tool_conf_select_field.options ) == 1: + select_help = "Your Galaxy instance is configured with 1 shed-related tool configuration file, so repositories will be " + select_help += "installed using it's tool_path setting." + else: + select_help = "Your Galaxy instance is configured with %d shed-related tool configuration files, " % len( shed_tool_conf_select_field.options ) + select_help += "so select the file whose tool_path setting you want used for installing repositories." + %> +
+ + ${shed_tool_conf_select_field.get_html()} +
+ ${select_help} +
-
-
- - ${tool_panel_section_select_field.get_html()} -
- Choose an existing section in your tool panel to contain the installed tools (optional). +
+ %else: + + %endif + %if includes_tools: +
+
+ ${no_changes_check_box.get_html()} + +
+ Uncheck and select a different tool panel section to load the tools into a different section in the tool panel. +
-
+
+ + +
+ Add a new tool panel section to contain the installed tools (optional). +
+
+
+ + ${tool_panel_section_select_field.get_html()} +
+ Choose an existing section in your tool panel to contain the installed tools (optional). +
+
+ %endif
diff --git a/templates/admin/tool_shed_repository/select_tool_panel_section.mako b/templates/admin/tool_shed_repository/select_tool_panel_section.mako index c14ad13d2bd..0659fe76a89 100644 --- a/templates/admin/tool_shed_repository/select_tool_panel_section.mako +++ b/templates/admin/tool_shed_repository/select_tool_panel_section.mako @@ -81,12 +81,12 @@ ${render_dependencies_section( install_repository_dependencies_check_box, install_tool_dependencies_check_box, containers_dict )}
%endif -
- - -
Choose the tool panel section to contain the installed tools (optional)
-
%if shed_tool_conf_select_field: +
+ + +
Choose the tool panel section to contain the installed tools (optional)
+
<% if len( shed_tool_conf_select_field.options ) == 1: select_help = "Your Galaxy instance is configured with 1 shed-related tool configuration file, so repositories will be "