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.

This commit is contained in:
Greg Von Kuster
2013-02-19 15:01:09 -05:00
parent ea6393a1a0
commit 3f3fd66adf
5 changed files with 198 additions and 99 deletions
+24 -7
View File
@@ -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
@@ -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 ):
@@ -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 <b>%s</b> 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 <b>tool_dependency_dir</b> "
@@ -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 <b>%s</b> repository were last loaded into the tool panel section <b>%s</b>. " \
% ( tool_shed_repository.name, original_section_name )
message += "Uncheck the <b>No changes</b> 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 <b>%s</b> repository were last loaded into the tool panel outside of any sections. " % tool_shed_repository.name
message += "Uncheck the <b>No changes</b> 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 <b>%s</b> repository were last loaded into the tool panel section <b>%s</b>. " \
% ( tool_shed_repository.name, original_section_name )
message += "Uncheck the <b>No changes</b> 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 <b>%s</b> repository were last loaded into the tool panel outside of any sections. " % tool_shed_repository.name
message += "Uncheck the <b>No changes</b> 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,
@@ -41,28 +41,55 @@
</div>
${render_dependencies_section( install_repository_dependencies_check_box, install_tool_dependencies_check_box, containers_dict )}
%endif
<div style="clear: both"></div>
<div class="form-row">
${no_changes_check_box.get_html()}
<label style="display: inline;">No changes</label>
<div class="toolParamHelp" style="clear: both;">
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:
<div class="form-row">
<table class="colored" width="100%">
<th bgcolor="#EBD9B2">Choose the configuration file whose tool_path setting will be used for installing repositories</th>
</table>
</div>
</div>
<div class="form-row">
<label>Add new tool panel section:</label>
<input name="new_tool_panel_section" type="textfield" value="" size="40"/>
<div class="toolParamHelp" style="clear: both;">
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 <b>tool_path</b> 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 <b>tool_path</b> setting you want used for installing repositories."
%>
<div class="form-row">
<label>Shed tool configuration file:</label>
${shed_tool_conf_select_field.get_html()}
<div class="toolParamHelp" style="clear: both;">
${select_help}
</div>
</div>
</div>
<div class="form-row">
<label>Select existing tool panel section:</label>
${tool_panel_section_select_field.get_html()}
<div class="toolParamHelp" style="clear: both;">
Choose an existing section in your tool panel to contain the installed tools (optional).
<div style="clear: both"></div>
%else:
<input type="hidden" name="shed_tool_conf" value="${shed_tool_conf}"/>
%endif
%if includes_tools:
<div style="clear: both"></div>
<div class="form-row">
${no_changes_check_box.get_html()}
<label style="display: inline;">No changes</label>
<div class="toolParamHelp" style="clear: both;">
Uncheck and select a different tool panel section to load the tools into a different section in the tool panel.
</div>
</div>
</div>
<div class="form-row">
<label>Add new tool panel section:</label>
<input name="new_tool_panel_section" type="textfield" value="" size="40"/>
<div class="toolParamHelp" style="clear: both;">
Add a new tool panel section to contain the installed tools (optional).
</div>
</div>
<div class="form-row">
<label>Select existing tool panel section:</label>
${tool_panel_section_select_field.get_html()}
<div class="toolParamHelp" style="clear: both;">
Choose an existing section in your tool panel to contain the installed tools (optional).
</div>
</div>
%endif
<div class="form-row">
<input type="submit" name="select_tool_panel_section_button" value="Install"/>
</div>
@@ -81,12 +81,12 @@
${render_dependencies_section( install_repository_dependencies_check_box, install_tool_dependencies_check_box, containers_dict )}
<div style="clear: both"></div>
%endif
<div class="form-row">
<table class="colored" width="100%">
<th bgcolor="#EBD9B2">Choose the tool panel section to contain the installed tools (optional)</th>
</table>
</div>
%if shed_tool_conf_select_field:
<div class="form-row">
<table class="colored" width="100%">
<th bgcolor="#EBD9B2">Choose the tool panel section to contain the installed tools (optional)</th>
</table>
</div>
<%
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 "