mirror of
https://github.com/galaxyproject/galaxy.git
synced 2026-09-24 16:30:27 +08:00
Properly handle updates which have become available for tool shed repositories while they were ninstalled when reinstalling them.
This commit is contained in:
@@ -596,8 +596,7 @@ def get_dependencies_for_repository( trans, tool_shed_url, repo_info_dict, inclu
|
||||
# In this case, a record for the repository will exist in the database with the status of 'New'.
|
||||
repository = suc.get_repository_for_dependency_relationship( trans.app, tool_shed_url, name, repository_owner, changeset_revision )
|
||||
if repository and repository.metadata:
|
||||
installed_rd, missing_rd = \
|
||||
get_installed_and_missing_repository_dependencies( trans, repository )
|
||||
installed_rd, missing_rd = get_installed_and_missing_repository_dependencies( trans, repository )
|
||||
else:
|
||||
installed_rd, missing_rd = get_installed_and_missing_repository_dependencies_for_new_install( trans, repo_info_tuple )
|
||||
# Discover all repository dependencies and retrieve information for installing them.
|
||||
|
||||
@@ -66,7 +66,7 @@ def add_installation_directories_to_tool_dependencies( trans, tool_dependencies
|
||||
tool_dependencies[ dependency_key ] = requirements_dict
|
||||
return tool_dependencies
|
||||
def build_readme_files_dict( metadata, tool_path=None ):
|
||||
"""Return a dictionary of valid readme file name <-> readme file content pairs for all readme files contained in the received repository_metadata."""
|
||||
"""Return a dictionary of valid readme file name <-> readme file content pairs for all readme files contained in the received metadata."""
|
||||
readme_files_dict = {}
|
||||
if metadata:
|
||||
if 'readme_files' in metadata:
|
||||
@@ -128,10 +128,14 @@ def build_repository_containers_for_galaxy( trans, repository, datatypes, invali
|
||||
containers_dict[ 'readme_files' ] = readme_files_root_folder
|
||||
# Installed repository dependencies container.
|
||||
if repository_dependencies:
|
||||
if new_install:
|
||||
label = 'Repository dependencies'
|
||||
else:
|
||||
label = 'Installed repository dependencies'
|
||||
folder_id, repository_dependencies_root_folder = container_util.build_repository_dependencies_folder( trans=trans,
|
||||
folder_id=folder_id,
|
||||
repository_dependencies=repository_dependencies,
|
||||
label='Installed repository dependencies',
|
||||
label=label,
|
||||
installed=True )
|
||||
containers_dict[ 'repository_dependencies' ] = repository_dependencies_root_folder
|
||||
# Missing repository dependencies container.
|
||||
@@ -777,17 +781,20 @@ def create_or_update_tool_shed_repository( app, name, description, installed_cha
|
||||
sa_session.flush()
|
||||
return tool_shed_repository
|
||||
def create_repo_info_dict( trans, repository_clone_url, changeset_revision, ctx_rev, repository_owner, repository_name=None, repository=None,
|
||||
repository_metadata=None, metadata=None, repository_dependencies=None ):
|
||||
repository_metadata=None, tool_dependencies=None, repository_dependencies=None ):
|
||||
"""
|
||||
Return a dictionary that includes all of the information needed to install a repository into a local Galaxy instance. The dictionary will also
|
||||
contain the recursive list of repository dependencies defined for the repository, as well as the defined tool dependencies.
|
||||
|
||||
This method is called from Galaxy in two places:
|
||||
1. During the tool shed repository installation process (via the tool shed's get_repository_information() method)- in this case both the received
|
||||
repository and repository_metadata will be objects.
|
||||
2. When a tool shed repository that was uninstalled from a Galaxy instance is being re-installed - in this case, both repository and
|
||||
repository_metadata will be None, but metadata will be the tool_shed_repository metadata on the Galaxy side, and the repository_dependencies will
|
||||
be an object previously retrieved from the tool shed.
|
||||
This method is called from Galaxy unser three scenarios:
|
||||
1. During the tool shed repository installation process via the tool shed's get_repository_information() method. In this case both the received
|
||||
repository and repository_metadata will be objects., but tool_dependencies and repository_dependencies will be None
|
||||
2. When a tool shed repository that was uninstalled from a Galaxy instance is being reinstalled with no updates available. In this case, both
|
||||
repository and repository_metadata will be None, but tool_dependencies and repository_dependencies will be objects previously retrieved from the
|
||||
tool shed if the repository includes definitions for them.
|
||||
3. When a tool shed repository that was uninstalled from a Galaxy instance is being reinstalled with updates available. In this case, this
|
||||
method is reached via the tool shed's get_updated_repository_information() method, and both repository and repository_metadata will be objects
|
||||
but tool_dependencies and repository_dependencies will be None.
|
||||
"""
|
||||
repo_info_dict = {}
|
||||
repository = get_repository_by_name_and_owner( trans, repository_name, repository_owner )
|
||||
@@ -806,27 +813,24 @@ def create_repo_info_dict( trans, repository_clone_url, changeset_revision, ctx_
|
||||
all_repository_dependencies=None,
|
||||
handled_key_rd_dicts=None,
|
||||
circular_repository_dependencies=None )
|
||||
if metadata:
|
||||
tool_dependencies = metadata.get( 'tool_dependencies', None )
|
||||
if tool_dependencies:
|
||||
new_tool_dependencies = {}
|
||||
for dependency_key, requirements_dict in tool_dependencies.items():
|
||||
if dependency_key in [ 'set_environment' ]:
|
||||
new_set_environment_dict_list = []
|
||||
for set_environment_dict in requirements_dict:
|
||||
set_environment_dict[ 'repository_name' ] = repository_name
|
||||
set_environment_dict[ 'repository_owner' ] = repository_owner
|
||||
set_environment_dict[ 'changeset_revision' ] = changeset_revision
|
||||
new_set_environment_dict_list.append( set_environment_dict )
|
||||
new_tool_dependencies[ dependency_key ] = new_set_environment_dict_list
|
||||
else:
|
||||
requirements_dict[ 'repository_name' ] = repository_name
|
||||
requirements_dict[ 'repository_owner' ] = repository_owner
|
||||
requirements_dict[ 'changeset_revision' ] = changeset_revision
|
||||
new_tool_dependencies[ dependency_key ] = requirements_dict
|
||||
tool_dependencies = new_tool_dependencies
|
||||
else:
|
||||
tool_dependencies = None
|
||||
tool_dependencies = metadata.get( 'tool_dependencies', None )
|
||||
if tool_dependencies:
|
||||
new_tool_dependencies = {}
|
||||
for dependency_key, requirements_dict in tool_dependencies.items():
|
||||
if dependency_key in [ 'set_environment' ]:
|
||||
new_set_environment_dict_list = []
|
||||
for set_environment_dict in requirements_dict:
|
||||
set_environment_dict[ 'repository_name' ] = repository_name
|
||||
set_environment_dict[ 'repository_owner' ] = repository_owner
|
||||
set_environment_dict[ 'changeset_revision' ] = changeset_revision
|
||||
new_set_environment_dict_list.append( set_environment_dict )
|
||||
new_tool_dependencies[ dependency_key ] = new_set_environment_dict_list
|
||||
else:
|
||||
requirements_dict[ 'repository_name' ] = repository_name
|
||||
requirements_dict[ 'repository_owner' ] = repository_owner
|
||||
requirements_dict[ 'changeset_revision' ] = changeset_revision
|
||||
new_tool_dependencies[ dependency_key ] = requirements_dict
|
||||
tool_dependencies = new_tool_dependencies
|
||||
# Cast unicode to string.
|
||||
repo_info_dict[ str( repository.name ) ] = ( str( repository.description ),
|
||||
str( repository_clone_url ),
|
||||
|
||||
@@ -1406,7 +1406,7 @@ class RepositoryController( BaseUIController, common.ItemRatings ):
|
||||
a local Galaxy instance.
|
||||
"""
|
||||
includes_tools = False
|
||||
includes_repository_dependencies = False
|
||||
has_repository_dependencies = False
|
||||
includes_tool_dependencies = False
|
||||
repo_info_dicts = []
|
||||
for tup in zip( util.listify( repository_ids ), util.listify( changeset_revisions ) ):
|
||||
@@ -1417,8 +1417,8 @@ class RepositoryController( BaseUIController, common.ItemRatings ):
|
||||
metadata = repository_metadata.metadata
|
||||
if not includes_tools and 'tools' in metadata:
|
||||
includes_tools = True
|
||||
if not includes_repository_dependencies and 'repository_dependencies' in metadata:
|
||||
includes_repository_dependencies = True
|
||||
if not has_repository_dependencies and 'repository_dependencies' in metadata:
|
||||
has_repository_dependencies = True
|
||||
if not includes_tool_dependencies and 'tool_dependencies' in metadata:
|
||||
includes_tool_dependencies = True
|
||||
repo_dir = repository.repo_path( trans.app )
|
||||
@@ -1431,11 +1431,12 @@ class RepositoryController( BaseUIController, common.ItemRatings ):
|
||||
repository_owner=repository.user.username,
|
||||
repository_name=repository.name,
|
||||
repository=repository,
|
||||
metadata=None,
|
||||
repository_metadata=repository_metadata )
|
||||
repository_metadata=repository_metadata,
|
||||
tool_dependencies=None,
|
||||
repository_dependencies=None )
|
||||
repo_info_dicts.append( encoding_util.tool_shed_encode( repo_info_dict ) )
|
||||
return dict( includes_tools=includes_tools,
|
||||
includes_repository_dependencies=includes_repository_dependencies,
|
||||
has_repository_dependencies=has_repository_dependencies,
|
||||
includes_tool_dependencies=includes_tool_dependencies,
|
||||
repo_info_dicts=repo_info_dicts )
|
||||
@web.json
|
||||
@@ -1465,10 +1466,6 @@ class RepositoryController( BaseUIController, common.ItemRatings ):
|
||||
def get_tool_dependencies( self, trans, **kwd ):
|
||||
"""Handle a request from a Galaxy instance."""
|
||||
params = util.Params( kwd )
|
||||
message = util.restore_text( params.get( 'message', '' ) )
|
||||
status = params.get( 'status', 'done' )
|
||||
# If the request originated with the UpdateManager, it will not include a galaxy_url.
|
||||
galaxy_url = kwd.get( 'galaxy_url', '' )
|
||||
name = params.get( 'name', None )
|
||||
owner = params.get( 'owner', None )
|
||||
changeset_revision = params.get( 'changeset_revision', None )
|
||||
@@ -1478,10 +1475,8 @@ class RepositoryController( BaseUIController, common.ItemRatings ):
|
||||
break
|
||||
metadata = downloadable_revision.metadata
|
||||
tool_dependencies = metadata.get( 'tool_dependencies', '' )
|
||||
from_install_manager = kwd.get( 'from_install_manager', False )
|
||||
if from_install_manager:
|
||||
if tool_dependencies:
|
||||
return encoding_util.tool_shed_encode( tool_dependencies )
|
||||
if tool_dependencies:
|
||||
return encoding_util.tool_shed_encode( tool_dependencies )
|
||||
return ''
|
||||
@web.expose
|
||||
def get_tool_versions( self, trans, **kwd ):
|
||||
@@ -1506,6 +1501,53 @@ class RepositoryController( BaseUIController, common.ItemRatings ):
|
||||
if tool_version_dicts:
|
||||
return json.to_json_string( tool_version_dicts )
|
||||
return ''
|
||||
@web.json
|
||||
def get_updated_repository_information( self, trans, name, owner, changeset_revision, **kwd ):
|
||||
"""Generate a disctionary that contains the information about a repository that is necessary for installing it into a local Galaxy instance."""
|
||||
repository = suc.get_repository_by_name_and_owner( trans, name, owner )
|
||||
repository_id = trans.security.encode_id( repository.id )
|
||||
repository_clone_url = suc.generate_clone_url_for_repository_in_tool_shed( trans, repository )
|
||||
repository_metadata = suc.get_repository_metadata_by_changeset_revision( trans, repository_id, changeset_revision )
|
||||
repo_dir = repository.repo_path( trans.app )
|
||||
repo = hg.repository( suc.get_configured_ui(), repo_dir )
|
||||
ctx = suc.get_changectx_for_changeset( repo, changeset_revision )
|
||||
repo_info_dict = suc.create_repo_info_dict( trans=trans,
|
||||
repository_clone_url=repository_clone_url,
|
||||
changeset_revision=changeset_revision,
|
||||
ctx_rev=str( ctx.rev() ),
|
||||
repository_owner=repository.user.username,
|
||||
repository_name=repository.name,
|
||||
repository=repository,
|
||||
repository_metadata=repository_metadata,
|
||||
tool_dependencies=None,
|
||||
repository_dependencies=None )
|
||||
metadata = repository_metadata.metadata
|
||||
if metadata:
|
||||
readme_files_dict = suc.build_readme_files_dict( metadata )
|
||||
if 'tools' in metadata:
|
||||
includes_tools = True
|
||||
else:
|
||||
includes_tools = False
|
||||
else:
|
||||
readme_files_dict = None
|
||||
includes_tools = False
|
||||
# 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 = \
|
||||
suc.get_repo_info_tuple_contents( repo_info_tuple )
|
||||
if repository_dependencies:
|
||||
has_repository_dependencies = True
|
||||
else:
|
||||
has_repository_dependencies = False
|
||||
if tool_dependencies:
|
||||
includes_tool_dependencies = True
|
||||
else:
|
||||
includes_tool_dependencies = False
|
||||
return dict( includes_tools=includes_tools,
|
||||
has_repository_dependencies=has_repository_dependencies,
|
||||
includes_tool_dependencies=includes_tool_dependencies,
|
||||
readme_files_dict=readme_files_dict,
|
||||
repo_info_dict=repo_info_dict )
|
||||
def get_versions_of_tool( self, trans, repository, repository_metadata, guid ):
|
||||
"""Return the tool lineage in descendant order for the received guid contained in the received repsitory_metadata.tool_versions."""
|
||||
encoded_id = trans.security.encode_id( repository.id )
|
||||
|
||||
@@ -485,10 +485,14 @@ def handle_repository_dependencies_container_entry( trans, repository_dependenci
|
||||
sub_folder.repository_dependencies.append( repository_dependency )
|
||||
for repository_dependency in rd_value:
|
||||
if trans.webapp.name == 'galaxy':
|
||||
# We have two extra items in the tuple, repository.id and repository.status.
|
||||
tool_shed_repository_id = repository_dependency[ 4 ]
|
||||
installation_status = repository_dependency[ 5 ]
|
||||
repository_dependency = repository_dependency[ 0:4 ]
|
||||
if len( repository_dependency ) == 6:
|
||||
# We have two extra items in the tuple, repository.id and repository.status.
|
||||
tool_shed_repository_id = repository_dependency[ 4 ]
|
||||
installation_status = repository_dependency[ 5 ]
|
||||
repository_dependency = repository_dependency[ 0:4 ]
|
||||
else:
|
||||
tool_shed_repository_id = None
|
||||
installation_status = 'unknown'
|
||||
else:
|
||||
tool_shed_repository_id = None
|
||||
installation_status = None
|
||||
|
||||
@@ -711,8 +711,7 @@ class AdminGalaxy( BaseUIController, Admin, AdminActions, UsesQuotaMixin, QuotaP
|
||||
tool_dependencies_dict = {}
|
||||
repository_name = elem.get( 'name' )
|
||||
changeset_revision = elem.get( 'changeset_revision' )
|
||||
url = '%s/repository/get_tool_dependencies?name=%s&owner=devteam&changeset_revision=%s&from_install_manager=True' % \
|
||||
( tool_shed_url, repository_name, changeset_revision )
|
||||
url = '%s/repository/get_tool_dependencies?name=%s&owner=devteam&changeset_revision=%s' % ( tool_shed_url, repository_name, changeset_revision )
|
||||
response = urllib2.urlopen( url )
|
||||
text = response.read()
|
||||
response.close()
|
||||
|
||||
@@ -374,21 +374,41 @@ 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.
|
||||
# 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:
|
||||
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',
|
||||
**kwd ) )
|
||||
# The uninstalled repository is current.
|
||||
if repository.includes_tools or repository.has_repository_dependencies:
|
||||
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:
|
||||
return trans.response.send_redirect( web.url_for( controller='admin_toolshed',
|
||||
action='reinstall_repository',
|
||||
**kwd ) )
|
||||
# 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:
|
||||
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
|
||||
kwd[ 'latest_ctx_rev' ] = current_ctx_rev
|
||||
kwd[ 'updated_repo_info_dict' ] = encoded_repo_info_dict
|
||||
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:
|
||||
return trans.response.send_redirect( web.url_for( controller='admin_toolshed',
|
||||
action='activate_repository',
|
||||
@@ -581,6 +601,45 @@ class AdminToolshed( AdminGalaxy ):
|
||||
else:
|
||||
text = ''
|
||||
return text
|
||||
@web.expose
|
||||
@web.require_admin
|
||||
def get_tool_dependencies( self, trans, repository_id, repository_name, repository_owner, changeset_revision ):
|
||||
"""
|
||||
Send a request to the appropriate tool shed to retrieve the dictionary of tool dependencies defined for the received repository name,
|
||||
owner and changeset revision. The received repository_id is the encoded id of the installed tool shed repository in Galaxy. We need
|
||||
it so that we can derive the tool shed from which it was installed.
|
||||
"""
|
||||
repository = suc.get_installed_tool_shed_repository( trans, repository_id )
|
||||
tool_shed_url = suc.get_url_from_repository_tool_shed( trans.app, repository )
|
||||
url = suc.url_join( tool_shed_url,
|
||||
'repository/get_tool_dependencies?name=%s&owner=%s&changeset_revision=%s' % \
|
||||
( repository_name, repository_owner, changeset_revision ) )
|
||||
response = urllib2.urlopen( url )
|
||||
raw_text = response.read()
|
||||
response.close()
|
||||
if len( raw_text ) > 2:
|
||||
encoded_text = json.from_json_string( raw_text )
|
||||
text = encoding_util.tool_shed_decode( encoded_text )
|
||||
else:
|
||||
text = ''
|
||||
return text
|
||||
@web.expose
|
||||
@web.require_admin
|
||||
def get_updated_repository_information( self, trans, repository_id, repository_name, repository_owner, changeset_revision ):
|
||||
"""
|
||||
Send a request to the appropriate tool shed to retrieve the dictionary of information required to reinstall an updated revision of an
|
||||
uninstalled tool shed repository.
|
||||
"""
|
||||
repository = suc.get_installed_tool_shed_repository( trans, repository_id )
|
||||
tool_shed_url = suc.get_url_from_repository_tool_shed( trans.app, repository )
|
||||
url = suc.url_join( tool_shed_url,
|
||||
'repository/get_updated_repository_information?name=%s&owner=%s&changeset_revision=%s' % \
|
||||
( repository_name, repository_owner, changeset_revision ) )
|
||||
response = urllib2.urlopen( url )
|
||||
raw_text = response.read()
|
||||
response.close()
|
||||
repo_information_dict = json.from_json_string( raw_text )
|
||||
return repo_information_dict
|
||||
def get_versions_of_tool( self, app, guid ):
|
||||
tool_version = shed_util.get_tool_version( app, guid )
|
||||
return tool_version.get_version_ids( app, reverse=True )
|
||||
@@ -1149,7 +1208,7 @@ class AdminToolshed( AdminGalaxy ):
|
||||
status = kwd.get( 'status', 'done' )
|
||||
tool_shed_url = kwd[ 'tool_shed_url' ]
|
||||
# Handle repository dependencies.
|
||||
includes_repository_dependencies = util.string_as_bool( kwd.get( 'includes_repository_dependencies', False ) )
|
||||
has_repository_dependencies = util.string_as_bool( kwd.get( 'has_repository_dependencies', False ) )
|
||||
install_repository_dependencies = kwd.get( 'install_repository_dependencies', '' )
|
||||
# Every repository will be installed into the same tool panel section or all will be installed outside of any sections.
|
||||
new_tool_panel_section = kwd.get( 'new_tool_panel_section', '' )
|
||||
@@ -1173,12 +1232,12 @@ class AdminToolshed( AdminGalaxy ):
|
||||
response.close()
|
||||
repo_information_dict = json.from_json_string( raw_text )
|
||||
includes_tools = util.string_as_bool( repo_information_dict.get( 'includes_tools', False ) )
|
||||
includes_repository_dependencies = util.string_as_bool( repo_information_dict.get( 'includes_repository_dependencies', False ) )
|
||||
has_repository_dependencies = util.string_as_bool( repo_information_dict.get( 'has_repository_dependencies', False ) )
|
||||
includes_tool_dependencies = util.string_as_bool( repo_information_dict.get( 'includes_tool_dependencies', False ) )
|
||||
encoded_repo_info_dicts = util.listify( repo_information_dict.get( 'repo_info_dicts', [] ) )
|
||||
repo_info_dicts = [ encoding_util.tool_shed_decode( encoded_repo_info_dict ) for encoded_repo_info_dict in encoded_repo_info_dicts ]
|
||||
if ( not includes_tools and not includes_repository_dependencies ) or \
|
||||
( ( includes_tools or includes_repository_dependencies ) and kwd.get( 'select_tool_panel_section_button', False ) ):
|
||||
if ( not includes_tools and not has_repository_dependencies ) or \
|
||||
( ( includes_tools or has_repository_dependencies ) and kwd.get( 'select_tool_panel_section_button', False ) ):
|
||||
install_repository_dependencies = CheckboxField.is_checked( install_repository_dependencies )
|
||||
if includes_tools:
|
||||
shed_tool_conf = kwd[ 'shed_tool_conf' ]
|
||||
@@ -1241,7 +1300,7 @@ class AdminToolshed( AdminGalaxy ):
|
||||
for tsr in created_or_updated_tool_shed_repositories:
|
||||
tool_panel_section_keys.append( tool_panel_section_key )
|
||||
new_kwd = dict( includes_tools=includes_tools,
|
||||
includes_repository_dependencies=includes_repository_dependencies,
|
||||
has_repository_dependencies=has_repository_dependencies,
|
||||
install_repository_dependencies=install_repository_dependencies,
|
||||
includes_tool_dependencies=includes_tool_dependencies,
|
||||
install_tool_dependencies=install_tool_dependencies,
|
||||
@@ -1331,7 +1390,7 @@ class AdminToolshed( AdminGalaxy ):
|
||||
includes_tools=includes_tools,
|
||||
includes_tool_dependencies=includes_tool_dependencies,
|
||||
install_tool_dependencies_check_box=install_tool_dependencies_check_box,
|
||||
includes_repository_dependencies=includes_repository_dependencies,
|
||||
has_repository_dependencies=has_repository_dependencies,
|
||||
install_repository_dependencies_check_box=install_repository_dependencies_check_box,
|
||||
new_tool_panel_section=new_tool_panel_section,
|
||||
containers_dict=containers_dict,
|
||||
@@ -1364,7 +1423,7 @@ class AdminToolshed( AdminGalaxy ):
|
||||
tool_panel_section_key = None
|
||||
tool_panel_section_keys = []
|
||||
metadata = tool_shed_repository.metadata
|
||||
# Keep track of tool dependencies define dfor the current repository or those defined for any of it's repository dependencies.
|
||||
# Keep track of tool dependencies defined for the current repository or those defined for any of it's repository dependencies.
|
||||
includes_tool_dependencies = tool_shed_repository.includes_tool_dependencies
|
||||
if tool_shed_repository.includes_tools:
|
||||
# Handle the selected tool panel location for loading tools included in the tool shed repository.
|
||||
@@ -1381,7 +1440,7 @@ class AdminToolshed( AdminGalaxy ):
|
||||
tool_shed_repository.installed_changeset_revision,
|
||||
tool_shed_repository.ctx_rev,
|
||||
repository_clone_url,
|
||||
tool_shed_repository.metadata,
|
||||
metadata,
|
||||
trans.model.ToolShedRepository.installation_status.NEW,
|
||||
tool_shed_repository.installed_changeset_revision,
|
||||
tool_shed_repository.owner,
|
||||
@@ -1402,6 +1461,10 @@ class AdminToolshed( AdminGalaxy ):
|
||||
changeset_revision=tool_shed_repository.changeset_revision )
|
||||
else:
|
||||
repository_dependencies = None
|
||||
if metadata:
|
||||
tool_dependencies = metadata.get( 'tool_dependencies', None )
|
||||
else:
|
||||
tool_dependencies = None
|
||||
repo_info_dict = suc.create_repo_info_dict( trans=trans,
|
||||
repository_clone_url=repository_clone_url,
|
||||
changeset_revision=tool_shed_repository.changeset_revision,
|
||||
@@ -1410,15 +1473,15 @@ class AdminToolshed( AdminGalaxy ):
|
||||
repository_name=tool_shed_repository.name,
|
||||
repository=None,
|
||||
repository_metadata=None,
|
||||
metadata=metadata,
|
||||
tool_dependencies=tool_dependencies,
|
||||
repository_dependencies=repository_dependencies )
|
||||
repo_info_dicts.append( repo_info_dict )
|
||||
# Make sure all tool_shed_repository records exist.
|
||||
created_or_updated_tool_shed_repositories, tool_panel_section_keys, repo_info_dicts, filtered_repo_info_dicts, message = \
|
||||
shed_util.create_repository_dependency_objects( trans,
|
||||
tool_path,
|
||||
tool_shed_url,
|
||||
repo_info_dicts,
|
||||
shed_util.create_repository_dependency_objects( trans=trans,
|
||||
tool_path=tool_path,
|
||||
tool_shed_url=tool_shed_url,
|
||||
repo_info_dicts=repo_info_dicts,
|
||||
reinstalling=True,
|
||||
install_repository_dependencies=install_repository_dependencies,
|
||||
no_changes_checked=no_changes_checked,
|
||||
@@ -1472,40 +1535,62 @@ class AdminToolshed( AdminGalaxy ):
|
||||
@web.expose
|
||||
@web.require_admin
|
||||
def reselect_tool_panel_section( self, trans, **kwd ):
|
||||
"""Select or change the tool panel section to contain the tools included in the tool shed repositories being reinstalled."""
|
||||
"""
|
||||
Select or change the tool panel section to contain the tools included in the tool shed repository being reinstalled. If there are updates
|
||||
available for the repository in the tool shed, the tool_dependencies and repository_dependencies associated with the updated changeset revision
|
||||
will have been retrieved from the tool shed and passed in the received kwd. In this case, the stored tool shed repository metqdata from the
|
||||
Galaxy database will not be used since it is outdated.
|
||||
"""
|
||||
message = ''
|
||||
repository_id = kwd[ 'id' ]
|
||||
repository_id = kwd.get( 'id', None )
|
||||
latest_changeset_revision = kwd.get( 'latest_changeset_revision', None )
|
||||
latest_ctx_rev = kwd.get( 'latest_ctx_rev', None )
|
||||
tool_shed_repository = suc.get_installed_tool_shed_repository( trans, repository_id )
|
||||
repository_clone_url = suc.generate_clone_url_for_installed_repository( trans.app, tool_shed_repository )
|
||||
metadata = tool_shed_repository.metadata
|
||||
tool_shed_url = suc.get_url_from_repository_tool_shed( trans.app, tool_shed_repository )
|
||||
ctx_rev = suc.get_ctx_rev( tool_shed_url, tool_shed_repository.name, tool_shed_repository.owner, tool_shed_repository.installed_changeset_revision )
|
||||
repository_clone_url = suc.generate_clone_url_for_installed_repository( trans.app, tool_shed_repository )
|
||||
tool_path, relative_install_dir = tool_shed_repository.get_tool_relative_path( trans.app )
|
||||
repository_dependencies = self.get_repository_dependencies( trans=trans,
|
||||
repository_id=repository_id,
|
||||
repository_name=tool_shed_repository.name,
|
||||
repository_owner=tool_shed_repository.owner,
|
||||
changeset_revision=tool_shed_repository.changeset_revision )
|
||||
if repository_dependencies:
|
||||
includes_repository_dependencies = True
|
||||
if latest_changeset_revision and latest_ctx_rev:
|
||||
# There are updates available in the tool shed for the repository, so use the receieved dependency information which was retrieved from
|
||||
# the tool shed.
|
||||
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_tools = updated_repo_info_dict.get( 'includes_tools', 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:
|
||||
includes_repository_dependencies = False
|
||||
includes_tool_dependencies = tool_shed_repository.includes_tool_dependencies
|
||||
repo_info_dict = suc.create_repo_info_dict( trans=trans,
|
||||
repository_clone_url=repository_clone_url,
|
||||
changeset_revision=tool_shed_repository.changeset_revision,
|
||||
ctx_rev=ctx_rev,
|
||||
repository_owner=tool_shed_repository.owner,
|
||||
repository_name=tool_shed_repository.name,
|
||||
repository=None,
|
||||
repository_metadata=None,
|
||||
metadata=metadata,
|
||||
repository_dependencies=repository_dependencies )
|
||||
if includes_repository_dependencies:
|
||||
# Discover all repository dependencies and retrieve information for installing them.
|
||||
required_repo_info_dicts = shed_util.get_required_repo_info_dicts( tool_shed_url, util.listify( repo_info_dict ) )
|
||||
# There are no updates available from the tool shed for the repository, so use it's locally stored metadata.
|
||||
if metadata:
|
||||
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,
|
||||
repository_owner=tool_shed_repository.owner,
|
||||
changeset_revision=tool_shed_repository.changeset_revision )
|
||||
repo_info_dict = suc.create_repo_info_dict( trans=trans,
|
||||
repository_clone_url=repository_clone_url,
|
||||
changeset_revision=tool_shed_repository.changeset_revision,
|
||||
ctx_rev=tool_shed_repository.ctx_rev,
|
||||
repository_owner=tool_shed_repository.owner,
|
||||
repository_name=tool_shed_repository.name,
|
||||
repository=None,
|
||||
repository_metadata=None,
|
||||
tool_dependencies=tool_dependencies,
|
||||
repository_dependencies=repository_dependencies )
|
||||
repository_name, repository_owner, changeset_revision, includes_tool_dependencies, installed_repository_dependencies, \
|
||||
missing_repository_dependencies, installed_tool_dependencies, missing_tool_dependencies = \
|
||||
shed_util.get_dependencies_for_repository( trans, tool_shed_url, repo_info_dict, includes_tool_dependencies )
|
||||
if installed_repository_dependencies or missing_repository_dependencies:
|
||||
has_repository_dependencies = True
|
||||
else:
|
||||
required_repo_info_dicts = None
|
||||
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' ]
|
||||
@@ -1533,14 +1618,14 @@ class AdminToolshed( AdminGalaxy ):
|
||||
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'
|
||||
# Populate the containers_dict from the metadata for the tool shed repository we're reinstalling, but make sure to include tool dependencies defined for
|
||||
# all of the repository's repository dependencies.
|
||||
containers_dict = shed_util.populate_containers_dict_from_repository_metadata( trans=trans,
|
||||
tool_shed_url=tool_shed_url,
|
||||
tool_path=tool_path,
|
||||
repository=tool_shed_repository,
|
||||
reinstalling=True,
|
||||
required_repo_info_dicts=required_repo_info_dicts )
|
||||
containers_dict = shed_util.populate_containers_dict_for_new_install( trans=trans,
|
||||
tool_shed_url=tool_shed_url,
|
||||
tool_path=tool_path,
|
||||
readme_files_dict=readme_files_dict,
|
||||
installed_repository_dependencies=installed_repository_dependencies,
|
||||
missing_repository_dependencies=missing_repository_dependencies,
|
||||
installed_tool_dependencies=installed_tool_dependencies,
|
||||
missing_tool_dependencies=missing_tool_dependencies )
|
||||
# Since we're reinstalling we'll merge the list of missing repository dependencies into the list of installed repository dependencies since each displayed
|
||||
# repository dependency will display a status, whether installed or missing.
|
||||
containers_dict = suc.merge_missing_repository_dependencies_to_installed_container( containers_dict )
|
||||
@@ -1561,7 +1646,7 @@ class AdminToolshed( AdminGalaxy ):
|
||||
no_changes_check_box=no_changes_check_box,
|
||||
original_section_name=original_section_name,
|
||||
includes_tool_dependencies=includes_tool_dependencies,
|
||||
includes_repository_dependencies=includes_repository_dependencies,
|
||||
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,
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
${render_readme_section( containers_dict )}
|
||||
<div style="clear: both"></div>
|
||||
%endif
|
||||
%if includes_repository_dependencies or includes_tool_dependencies:
|
||||
%if has_repository_dependencies or includes_tool_dependencies:
|
||||
<div class="form-row">
|
||||
<table class="colored" width="100%">
|
||||
<th bgcolor="#EBD9B2">Confirm dependency installation</th>
|
||||
|
||||
@@ -17,10 +17,10 @@
|
||||
|
||||
<%
|
||||
# Handle the case where an uninstalled repository encountered errors during the process of being reinstalled. In
|
||||
# this case, the repository metadata is an empty dictionary, but one or both of includes_repository_dependencies
|
||||
# this case, the repository metadata is an empty dictionary, but one or both of has_repository_dependencies
|
||||
# and includes_tool_dependencies may be True. If either of these are True but we have no metadata, we cannot install
|
||||
# repository dependencies on this pass.
|
||||
if includes_repository_dependencies:
|
||||
if has_repository_dependencies:
|
||||
repository_dependencies = containers_dict[ 'repository_dependencies' ]
|
||||
missing_repository_dependencies = containers_dict[ 'missing_repository_dependencies' ]
|
||||
if repository_dependencies or missing_repository_dependencies:
|
||||
|
||||
Reference in New Issue
Block a user