def get_or_create_tool_shed_repository( self, tool_shed, name, owner, changeset_revision ):
     """
     Return a tool shed repository database record defined by the combination of
     tool shed, repository name, repository owner and changeset_revision or
     installed_changeset_revision.  A new tool shed repository record will be
     created if one is not located.
     """
     install_model = self.app.install_model
     # We store the port in the database.
     tool_shed = common_util.remove_protocol_from_tool_shed_url( tool_shed )
     # This method is used only in Galaxy, not the tool shed.
     repository = suc.get_repository_for_dependency_relationship( self.app, tool_shed, name, owner, changeset_revision )
     if not repository:
         tool_shed_url = common_util.get_tool_shed_url_from_tool_shed_registry( self.app, tool_shed )
         repository_clone_url = os.path.join( tool_shed_url, 'repos', owner, name )
         ctx_rev = suc.get_ctx_rev( self.app, tool_shed_url, name, owner, changeset_revision )
         repository = suc.create_or_update_tool_shed_repository( app=self.app,
                                                                 name=name,
                                                                 description=None,
                                                                 installed_changeset_revision=changeset_revision,
                                                                 ctx_rev=ctx_rev,
                                                                 repository_clone_url=repository_clone_url,
                                                                 metadata_dict={},
                                                                 status=install_model.ToolShedRepository.installation_status.NEW,
                                                                 current_changeset_revision=None,
                                                                 owner=owner,
                                                                 dist_to_shed=False )
     return repository
 def get_or_create_tool_shed_repository( self, tool_shed, name, owner, changeset_revision ):
     """
     Return a tool shed repository database record defined by the combination of
     tool shed, repository name, repository owner and changeset_revision or
     installed_changeset_revision.  A new tool shed repository record will be
     created if one is not located.
     """
     install_model = self.app.install_model
     # We store the port in the database.
     tool_shed = common_util.remove_protocol_from_tool_shed_url( tool_shed )
     # This method is used only in Galaxy, not the tool shed.
     repository = suc.get_repository_for_dependency_relationship( self.app, tool_shed, name, owner, changeset_revision )
     if not repository:
         tool_shed_url = common_util.get_tool_shed_url_from_tool_shed_registry( self.app, tool_shed )
         repository_clone_url = os.path.join( tool_shed_url, 'repos', owner, name )
         ctx_rev = suc.get_ctx_rev( self.app, tool_shed_url, name, owner, changeset_revision )
         repository = suc.create_or_update_tool_shed_repository( app=self.app,
                                                                 name=name,
                                                                 description=None,
                                                                 installed_changeset_revision=changeset_revision,
                                                                 ctx_rev=ctx_rev,
                                                                 repository_clone_url=repository_clone_url,
                                                                 metadata_dict={},
                                                                 status=install_model.ToolShedRepository.installation_status.NEW,
                                                                 current_changeset_revision=None,
                                                                 owner=owner,
                                                                 dist_to_shed=False )
     return repository
Example #3
0
def get_env_shell_file_paths( app, elem ):
    # Currently only the following tag set is supported.
    #    <repository toolshed="http://localhost:9009/" name="package_numpy_1_7" owner="test" changeset_revision="c84c6a8be056">
    #        <package name="numpy" version="1.7.1" />
    #    </repository>
    env_shell_file_paths = []
    toolshed = elem.get( 'toolshed', None )
    repository_name = elem.get( 'name', None )
    repository_owner = elem.get( 'owner', None )
    changeset_revision = elem.get( 'changeset_revision', None )
    if toolshed and repository_name and repository_owner and changeset_revision:
        toolshed = clean_tool_shed_url( toolshed )
        repository = suc.get_repository_for_dependency_relationship( app, toolshed, repository_name, repository_owner, changeset_revision )
        if repository:
            for sub_elem in elem:
                tool_dependency_type = sub_elem.tag
                tool_dependency_name = sub_elem.get( 'name' )
                tool_dependency_version = sub_elem.get( 'version' )
                if tool_dependency_type and tool_dependency_name and tool_dependency_version:
                    # Get the tool_dependency so we can get it's installation directory.
                    tool_dependency = None
                    for tool_dependency in repository.tool_dependencies:
                        if tool_dependency.type == tool_dependency_type and tool_dependency.name == tool_dependency_name and tool_dependency.version == tool_dependency_version:
                            break
                    if tool_dependency:
                        tool_dependency_key = '%s/%s' % ( tool_dependency_name, tool_dependency_version )
                        installation_directory = tool_dependency.installation_directory( app )
                        env_shell_file_path = get_env_shell_file_path( installation_directory )
                        if env_shell_file_path:
                            env_shell_file_paths.append( env_shell_file_path )
                        else:
                            error_message = "Skipping tool dependency definition because unable to locate env.sh file for tool dependency "
                            error_message += "type %s, name %s, version %s for repository %s" % \
                                ( str( tool_dependency_type ), str( tool_dependency_name ), str( tool_dependency_version ), str( repository.name ) )
                            log.debug( error_message )
                            continue
                    else:
                        error_message = "Skipping tool dependency definition because unable to locate tool dependency "
                        error_message += "type %s, name %s, version %s for repository %s" % \
                            ( str( tool_dependency_type ), str( tool_dependency_name ), str( tool_dependency_version ), str( repository.name ) )
                        log.debug( error_message )
                        continue
                else:
                    error_message = "Skipping invalid tool dependency definition: type %s, name %s, version %s." % \
                        ( str( tool_dependency_type ), str( tool_dependency_name ), str( tool_dependency_version ) )
                    log.debug( error_message )
                    continue
        else:
            error_message = "Skipping set_environment_for_install definition because unable to locate required installed tool shed repository: "
            error_message += "toolshed %s, name %s, owner %s, changeset_revision %s." % \
                ( str( toolshed ), str( repository_name ), str( repository_owner ), str( changeset_revision ) )
            log.debug( error_message )
    else:
        error_message = "Skipping invalid set_environment_for_install definition: toolshed %s, name %s, owner %s, changeset_revision %s." % \
            ( str( toolshed ), str( repository_name ), str( repository_owner ), str( changeset_revision ) )
        log.debug( error_message )
    return env_shell_file_paths
Example #4
0
 def handle_complex_repository_dependency_for_package(
         self,
         elem,
         package_name,
         package_version,
         tool_shed_repository,
         from_tool_migration_manager=False):
     """
     Inspect the repository defined by a complex repository dependency definition and take certain steps to
     enable installation of the received package name and version to proceed.  The received elem is the
     <repository> tag set which defines the complex repository dependency.  The received tool_shed_repository
     is the installed tool shed repository for which the tool dependency defined by the received package_name
     and package_version is being installed.
     """
     handled_tool_dependencies = []
     tool_shed_url = elem.attrib['toolshed']
     required_repository_name = elem.attrib['name']
     required_repository_owner = elem.attrib['owner']
     default_required_repository_changeset_revision = elem.attrib[
         'changeset_revision']
     required_repository = suc.get_repository_for_dependency_relationship(
         self.app, tool_shed_url, required_repository_name,
         required_repository_owner,
         default_required_repository_changeset_revision)
     tool_shed = common_util.remove_protocol_from_tool_shed_url(
         tool_shed_url)
     tmp_filename = None
     if required_repository:
         required_repository_changeset_revision = required_repository.installed_changeset_revision
         # Define the installation directory for the required tool dependency package in the required repository.
         required_repository_package_install_dir = \
             tool_dependency_util.get_tool_dependency_install_dir( app=self.app,
                                                                   repository_name=required_repository_name,
                                                                   repository_owner=required_repository_owner,
                                                                   repository_changeset_revision=required_repository_changeset_revision,
                                                                   tool_dependency_type='package',
                                                                   tool_dependency_name=package_name,
                                                                   tool_dependency_version=package_version )
         # Define this dependent repository's tool dependency installation directory that will contain
         # the env.sh file with a path to the required repository's installed tool dependency package.
         dependent_install_dir = \
             tool_dependency_util.get_tool_dependency_install_dir( app=self.app,
                                                                   repository_name=tool_shed_repository.name,
                                                                   repository_owner=tool_shed_repository.owner,
                                                                   repository_changeset_revision=tool_shed_repository.installed_changeset_revision,
                                                                   tool_dependency_type='package',
                                                                   tool_dependency_name=package_name,
                                                                   tool_dependency_version=package_version )
         if os.path.exists(dependent_install_dir):
             # The install manager handles tool migration stages and the sync_database_with_file_system()
             # method handles two scenarios: (1) where a Galaxy file system environment related to installed
             # Tool Shed repositories and tool dependencies has somehow gotten out of sync with the Galaxy
             # database tables associated with these installed items, and (2) the Tool Shed's install and test
             # framework which installs repositories in 2 stages, those of type tool_dependency_definition
             # followed by those containing valid tools and tool functional test components.  Neither of these
             # scenarios apply when the install manager is running.
             if from_tool_migration_manager:
                 can_install_tool_dependency = True
             else:
                 # Notice that we'll throw away the following tool_dependency if it can be installed.
                 tool_dependency, can_install_tool_dependency = self.sync_database_with_file_system(
                     self.app,
                     tool_shed_repository,
                     package_name,
                     package_version,
                     dependent_install_dir,
                     tool_dependency_type='package')
                 if not can_install_tool_dependency:
                     log.debug(
                         "Tool dependency %s version %s cannot be installed (it was probably previously installed), "
                         "so appending it to the list of handled tool dependencies.",
                         str(tool_dependency.name),
                         str(tool_dependency.version))
                     handled_tool_dependencies.append(tool_dependency)
         else:
             can_install_tool_dependency = True
         if can_install_tool_dependency:
             # Set this dependent repository's tool dependency env.sh file with a path to the required repository's
             # installed tool dependency package.  We can get everything we need from the discovered installed
             # required_repository.
             if required_repository.is_deactivated_or_installed:
                 if not os.path.exists(
                         required_repository_package_install_dir):
                     log.error(
                         'Missing required tool dependency directory %s' %
                         str(required_repository_package_install_dir))
                 repo_files_dir = required_repository.repo_files_directory(
                     self.app)
                 if not repo_files_dir:
                     message = "Unable to locate the repository directory for revision %s of installed repository %s owned by %s." % \
                         ( str( required_repository.changeset_revision ), str( required_repository.name ), str( required_repository.owner ) )
                     raise Exception(message)
                 tool_dependencies_config = suc.get_absolute_path_to_file_in_repository(
                     repo_files_dir, 'tool_dependencies.xml')
                 if tool_dependencies_config:
                     config_to_use = tool_dependencies_config
                 else:
                     message = "Unable to locate required tool_dependencies.xml file for revision %s of installed repository %s owned by %s." % \
                         ( str( required_repository.changeset_revision ), str( required_repository.name ), str( required_repository.owner ) )
                     raise Exception(message)
             else:
                 # Make a call to the tool shed to get the changeset revision to which the current value of required_repository_changeset_revision
                 # should be updated if it's not current.
                 text = suc.get_updated_changeset_revisions_from_tool_shed(
                     app=self.app,
                     tool_shed_url=tool_shed,
                     name=required_repository_name,
                     owner=required_repository_owner,
                     changeset_revision=
                     required_repository_changeset_revision)
                 if text:
                     updated_changeset_revisions = listify(text)
                     # The list of changeset revisions is in reverse order, so the newest will be first.
                     required_repository_changeset_revision = updated_changeset_revisions[
                         0]
                 # Make a call to the tool shed to get the required repository's tool_dependencies.xml file.
                 tmp_filename = self.create_temporary_tool_dependencies_config(
                     tool_shed, required_repository_name,
                     required_repository_owner,
                     required_repository_changeset_revision)
                 config_to_use = tmp_filename
             handled_tool_dependencies = \
                 self.create_tool_dependency_with_initialized_env_sh_file( dependent_install_dir=dependent_install_dir,
                                                                           tool_shed_repository=tool_shed_repository,
                                                                           required_repository=required_repository,
                                                                           package_name=package_name,
                                                                           package_version=package_version,
                                                                           tool_dependencies_config=config_to_use )
             self.remove_file(tmp_filename)
     else:
         message = "Unable to locate required tool shed repository named %s owned by %s with revision %s." % \
             ( str( required_repository_name ), str( required_repository_owner ), str( default_required_repository_changeset_revision ) )
         raise Exception(message)
     return handled_tool_dependencies
Example #5
0
def get_dependencies_for_repository( trans, tool_shed_url, repo_info_dict, includes_tool_dependencies ):
    """
    Return dictionaries containing the sets of installed and missing tool dependencies and repository dependencies associated with the repository defined
    by the received repo_info_dict.
    """
    name = repo_info_dict.keys()[ 0 ]
    repo_info_tuple = repo_info_dict[ name ]
    description, repository_clone_url, changeset_revision, ctx_rev, repository_owner, repository_dependencies, installed_td = \
        suc.get_repo_info_tuple_contents( repo_info_tuple )
    if repository_dependencies:
        # We have a repository with one or more defined repository dependencies.
        missing_td = {}
        # Handle the scenario where a repository was installed, then uninstalled and an error occurred during the re-installation process.
        # 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 )
        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.
        all_repo_info_dict = get_required_repo_info_dicts( trans, tool_shed_url, util.listify( repo_info_dict ) )
        has_repository_dependencies = all_repo_info_dict.get( 'has_repository_dependencies', False )
        includes_tools_for_display_in_tool_panel = all_repo_info_dict.get( 'includes_tools_for_display_in_tool_panel', False )
        includes_tool_dependencies = all_repo_info_dict.get( 'includes_tool_dependencies', False )
        includes_tools = all_repo_info_dict.get( 'includes_tools', False )        
        required_repo_info_dicts = all_repo_info_dict.get( 'all_repo_info_dicts', [] )
        # Display tool dependencies defined for each of the repository dependencies.
        if required_repo_info_dicts:
            all_tool_dependencies = {}
            for rid in required_repo_info_dicts:
                for name, repo_info_tuple in rid.items():
                    description, repository_clone_url, changeset_revision, ctx_rev, repository_owner, repository_dependencies, rid_installed_td = \
                        suc.get_repo_info_tuple_contents( repo_info_tuple )
                    if rid_installed_td:
                        for td_key, td_dict in rid_installed_td.items():
                            if td_key not in all_tool_dependencies:
                                all_tool_dependencies[ td_key ] = td_dict
            if all_tool_dependencies:
                if installed_td is None:
                    installed_td = {}
                else:
                    # Move all tool dependencies to the missing_tool_dependencies container.
                    for td_key, td_dict in installed_td.items():
                        if td_key not in missing_td:
                            missing_td[ td_key ] = td_dict
                    installed_td = {}
                # Discover and categorize all tool dependencies defined for this repository's repository dependencies.
                required_tool_dependencies, required_missing_tool_dependencies = \
                    get_installed_and_missing_tool_dependencies_for_new_install( trans, all_tool_dependencies )
                if required_tool_dependencies:
                    if not includes_tool_dependencies:
                        includes_tool_dependencies = True
                    for td_key, td_dict in required_tool_dependencies.items():
                        if td_key not in installed_td:
                            installed_td[ td_key ] = td_dict
                if required_missing_tool_dependencies:
                    if not includes_tool_dependencies:
                        includes_tool_dependencies = True
                    for td_key, td_dict in required_missing_tool_dependencies.items():
                        if td_key not in missing_td:
                            missing_td[ td_key ] = td_dict
    else:
        # We have a single repository with no defined repository dependencies.
        all_repo_info_dict = get_required_repo_info_dicts( trans, tool_shed_url, util.listify( repo_info_dict ) )
        has_repository_dependencies = all_repo_info_dict.get( 'has_repository_dependencies', False )
        includes_tools_for_display_in_tool_panel = all_repo_info_dict.get( 'includes_tools_for_display_in_tool_panel', False )
        includes_tool_dependencies = all_repo_info_dict.get( 'includes_tool_dependencies', False )
        includes_tools = all_repo_info_dict.get( 'includes_tools', False )        
        required_repo_info_dicts = all_repo_info_dict.get( 'all_repo_info_dicts', [] )
        installed_rd = None
        missing_rd = None
        missing_td = None
    dependencies_for_repository_dict = dict( changeset_revision=changeset_revision,
                                             has_repository_dependencies=has_repository_dependencies,
                                             includes_tool_dependencies=includes_tool_dependencies,
                                             includes_tools=includes_tools,
                                             includes_tools_for_display_in_tool_panel=includes_tools_for_display_in_tool_panel,
                                             installed_repository_dependencies=installed_rd,
                                             installed_tool_dependencies=installed_td,
                                             missing_repository_dependencies=missing_rd,
                                             missing_tool_dependencies=missing_td,
                                             name=name,
                                             repository_owner=repository_owner )
    return dependencies_for_repository_dict
Example #6
0
 def handle_complex_repository_dependency_for_package( self, elem, package_name, package_version, tool_shed_repository,
                                                       from_tool_migration_manager=False ):
     """
     Inspect the repository defined by a complex repository dependency definition and take certain steps to
     enable installation of the received package name and version to proceed.  The received elem is the
     <repository> tag set which defines the complex repository dependency.  The received tool_shed_repository
     is the installed tool shed repository for which the tool dependency defined by the received package_name
     and package_version is being installed.
     """
     handled_tool_dependencies = []
     tool_shed_url = elem.attrib[ 'toolshed' ]
     required_repository_name = elem.attrib[ 'name' ]
     required_repository_owner = elem.attrib[ 'owner' ]
     default_required_repository_changeset_revision = elem.attrib[ 'changeset_revision' ]
     required_repository = suc.get_repository_for_dependency_relationship( self.app, tool_shed_url,
                                                                           required_repository_name,
                                                                           required_repository_owner,
                                                                           default_required_repository_changeset_revision )
     tool_shed = common_util.remove_protocol_from_tool_shed_url( tool_shed_url )
     tmp_filename = None
     if required_repository:
         required_repository_changeset_revision = required_repository.installed_changeset_revision
         # Define the installation directory for the required tool dependency package in the required repository.
         required_repository_package_install_dir = \
             tool_dependency_util.get_tool_dependency_install_dir( app=self.app,
                                                                   repository_name=required_repository_name,
                                                                   repository_owner=required_repository_owner,
                                                                   repository_changeset_revision=required_repository_changeset_revision,
                                                                   tool_dependency_type='package',
                                                                   tool_dependency_name=package_name,
                                                                   tool_dependency_version=package_version )
         # Define this dependent repository's tool dependency installation directory that will contain
         # the env.sh file with a path to the required repository's installed tool dependency package.
         dependent_install_dir = \
             tool_dependency_util.get_tool_dependency_install_dir( app=self.app,
                                                                   repository_name=tool_shed_repository.name,
                                                                   repository_owner=tool_shed_repository.owner,
                                                                   repository_changeset_revision=tool_shed_repository.installed_changeset_revision,
                                                                   tool_dependency_type='package',
                                                                   tool_dependency_name=package_name,
                                                                   tool_dependency_version=package_version )
         if os.path.exists( dependent_install_dir ):
             # The install manager handles tool migration stages and the sync_database_with_file_system()
             # method handles two scenarios: (1) where a Galaxy file system environment related to installed
             # Tool Shed repositories and tool dependencies has somehow gotten out of sync with the Galaxy
             # database tables associated with these installed items, and (2) the Tool Shed's install and test
             # framework which installs repositories in 2 stages, those of type tool_dependency_definition
             # followed by those containing valid tools and tool functional test components.  Neither of these
             # scenarios apply when the install manager is running.
             if from_tool_migration_manager:
                 can_install_tool_dependency = True
             else:
                 # Notice that we'll throw away the following tool_dependency if it can be installed.
                 tool_dependency, can_install_tool_dependency = self.sync_database_with_file_system( self.app,
                                                                                                     tool_shed_repository,
                                                                                                     package_name,
                                                                                                     package_version,
                                                                                                     dependent_install_dir,
                                                                                                     tool_dependency_type='package' )
                 if not can_install_tool_dependency:
                     log.debug( "Tool dependency %s version %s cannot be installed (it was probably previously installed), " %
                         ( str( tool_dependency.name, str( tool_dependency.version ) ) ) )
                     log.debug( "so appending it to the list of handled tool dependencies." )
                     handled_tool_dependencies.append( tool_dependency )
         else:
             can_install_tool_dependency = True
         if can_install_tool_dependency:
             # Set this dependent repository's tool dependency env.sh file with a path to the required repository's
             # installed tool dependency package.  We can get everything we need from the discovered installed
             # required_repository.
             if required_repository.is_deactivated_or_installed:
                 if not os.path.exists( required_repository_package_install_dir ):
                     log.error( 'Missing required tool dependency directory %s' % str( required_repository_package_install_dir ) )
                 repo_files_dir = required_repository.repo_files_directory( self.app )
                 if not repo_files_dir:
                     message = "Unable to locate the repository directory for revision %s of installed repository %s owned by %s." % \
                         ( str( required_repository.changeset_revision ), str( required_repository.name ), str( required_repository.owner ) )
                     raise Exception( message )
                 tool_dependencies_config = suc.get_absolute_path_to_file_in_repository( repo_files_dir, 'tool_dependencies.xml' )
                 if tool_dependencies_config:
                     config_to_use = tool_dependencies_config
                 else:
                     message = "Unable to locate required tool_dependencies.xml file for revision %s of installed repository %s owned by %s." % \
                         ( str( required_repository.changeset_revision ), str( required_repository.name ), str( required_repository.owner ) )
                     raise Exception( message )
             else:
                 # Make a call to the tool shed to get the changeset revision to which the current value of required_repository_changeset_revision
                 # should be updated if it's not current.
                 text = suc.get_updated_changeset_revisions_from_tool_shed( app=self.app,
                                                                            tool_shed_url=tool_shed,
                                                                            name=required_repository_name,
                                                                            owner=required_repository_owner,
                                                                            changeset_revision=required_repository_changeset_revision )
                 if text:
                     updated_changeset_revisions = listify( text )
                     # The list of changeset revisions is in reverse order, so the newest will be first.
                     required_repository_changeset_revision = updated_changeset_revisions[ 0 ]
                 # Make a call to the tool shed to get the required repository's tool_dependencies.xml file.
                 tmp_filename = self.create_temporary_tool_dependencies_config( tool_shed,
                                                                                required_repository_name,
                                                                                required_repository_owner,
                                                                                required_repository_changeset_revision )
                 config_to_use = tmp_filename
             handled_tool_dependencies = \
                 self.create_tool_dependency_with_initialized_env_sh_file( dependent_install_dir=dependent_install_dir,
                                                                           tool_shed_repository=tool_shed_repository,
                                                                           required_repository=required_repository,
                                                                           package_name=package_name,
                                                                           package_version=package_version,
                                                                           tool_dependencies_config=config_to_use )
             self.remove_file( tmp_filename )
     else:
         message = "Unable to locate required tool shed repository named %s owned by %s with revision %s." % \
             ( str( required_repository_name ), str( required_repository_owner ), str( default_required_repository_changeset_revision ) )
         raise Exception( message )
     return handled_tool_dependencies
Example #7
0
 def get_env_shell_file_paths(self, elem):
     # Currently only the following tag set is supported.
     #    <repository toolshed="http://localhost:9009/" name="package_numpy_1_7" owner="test" changeset_revision="c84c6a8be056">
     #        <package name="numpy" version="1.7.1" />
     #    </repository>
     env_shell_file_paths = []
     toolshed = elem.get('toolshed', None)
     repository_name = elem.get('name', None)
     repository_owner = elem.get('owner', None)
     changeset_revision = elem.get('changeset_revision', None)
     if toolshed and repository_name and repository_owner and changeset_revision:
         # The protocol is not stored, but the port is if it exists.
         toolshed = common_util.remove_protocol_from_tool_shed_url(toolshed)
         repository = suc.get_repository_for_dependency_relationship(
             self.app, toolshed, repository_name, repository_owner,
             changeset_revision)
         if repository:
             for sub_elem in elem:
                 tool_dependency_type = sub_elem.tag
                 tool_dependency_name = sub_elem.get('name')
                 tool_dependency_version = sub_elem.get('version')
                 if tool_dependency_type and tool_dependency_name and tool_dependency_version:
                     # Get the tool_dependency so we can get its installation directory.
                     tool_dependency = None
                     for tool_dependency in repository.tool_dependencies:
                         if tool_dependency.type == tool_dependency_type and \
                             tool_dependency.name == tool_dependency_name and \
                             tool_dependency.version == tool_dependency_version:
                             break
                     if tool_dependency:
                         tool_dependency_key = '%s/%s' % (
                             tool_dependency_name, tool_dependency_version)
                         installation_directory = tool_dependency.installation_directory(
                             self.app)
                         env_shell_file_path = self.get_env_shell_file_path(
                             installation_directory)
                         if env_shell_file_path:
                             env_shell_file_paths.append(
                                 env_shell_file_path)
                         else:
                             error_message = "Skipping tool dependency definition because unable to locate env.sh file for tool dependency "
                             error_message += "type %s, name %s, version %s for repository %s" % \
                                 ( str( tool_dependency_type ), str( tool_dependency_name ), str( tool_dependency_version ), str( repository.name ) )
                             log.debug(error_message)
                             continue
                     else:
                         error_message = "Skipping tool dependency definition because unable to locate tool dependency "
                         error_message += "type %s, name %s, version %s for repository %s" % \
                             ( str( tool_dependency_type ), str( tool_dependency_name ), str( tool_dependency_version ), str( repository.name ) )
                         log.debug(error_message)
                         continue
                 else:
                     error_message = "Skipping invalid tool dependency definition: type %s, name %s, version %s." % \
                         ( str( tool_dependency_type ), str( tool_dependency_name ), str( tool_dependency_version ) )
                     log.debug(error_message)
                     continue
         else:
             error_message = "Skipping set_environment_for_install definition because unable to locate required installed tool shed repository: "
             error_message += "toolshed %s, name %s, owner %s, changeset_revision %s." % \
                 ( str( toolshed ), str( repository_name ), str( repository_owner ), str( changeset_revision ) )
             log.debug(error_message)
     else:
         error_message = "Skipping invalid set_environment_for_install definition: toolshed %s, name %s, owner %s, changeset_revision %s." % \
             ( str( toolshed ), str( repository_name ), str( repository_owner ), str( changeset_revision ) )
         log.debug(error_message)
     return env_shell_file_paths
def get_dependencies_for_repository( trans, tool_shed_url, repo_info_dict, includes_tool_dependencies ):
    """
    Return dictionaries containing the sets of installed and missing tool dependencies and repository dependencies associated
    with the repository defined by the received repo_info_dict.
    """
    repository = None
    installed_rd = {}
    installed_td = {}
    missing_rd = {}
    missing_td = {}
    name = repo_info_dict.keys()[ 0 ]
    repo_info_tuple = repo_info_dict[ name ]
    description, repository_clone_url, changeset_revision, ctx_rev, repository_owner, repository_dependencies, tool_dependencies = \
        suc.get_repo_info_tuple_contents( repo_info_tuple )
    if tool_dependencies:
        if not includes_tool_dependencies:
            includes_tool_dependencies = True
        # Inspect the tool_dependencies dictionary to separate the installed and missing tool dependencies.  We don't add to installed_td
        # and missing_td here because at this point they are empty.
        installed_td, missing_td = get_installed_and_missing_tool_dependencies_for_installing_repository( trans, tool_shed_url, tool_dependencies )
    # In cases where a repository dependency is required only for compiling a dependent repository's tool dependency, the value of
    # repository_dependencies will be an empty dictionary here.
    if repository_dependencies:
        # We have a repository with one or more defined repository dependencies.
        if not repository:
            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 )
        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.
        all_repo_info_dict = get_required_repo_info_dicts( trans, tool_shed_url, util.listify( repo_info_dict ) )
        has_repository_dependencies = all_repo_info_dict.get( 'has_repository_dependencies', False )
        has_repository_dependencies_only_if_compiling_contained_td = \
            all_repo_info_dict.get( 'has_repository_dependencies_only_if_compiling_contained_td', False )
        includes_tools_for_display_in_tool_panel = all_repo_info_dict.get( 'includes_tools_for_display_in_tool_panel', False )
        includes_tool_dependencies = all_repo_info_dict.get( 'includes_tool_dependencies', False )
        includes_tools = all_repo_info_dict.get( 'includes_tools', False )
        required_repo_info_dicts = all_repo_info_dict.get( 'all_repo_info_dicts', [] )
        # Display tool dependencies defined for each of the repository dependencies.
        if required_repo_info_dicts:
            required_tool_dependencies = {}
            for rid in required_repo_info_dicts:
                for name, repo_info_tuple in rid.items():
                    description, repository_clone_url, changeset_revision, ctx_rev, repository_owner, rid_repository_dependencies, rid_tool_dependencies = \
                        suc.get_repo_info_tuple_contents( repo_info_tuple )
                    if rid_tool_dependencies:
                        for td_key, td_dict in rid_tool_dependencies.items():
                            if td_key not in required_tool_dependencies:
                                required_tool_dependencies[ td_key ] = td_dict
            if required_tool_dependencies:
                # Discover and categorize all tool dependencies defined for this repository's repository dependencies.
                required_installed_td, required_missing_td = \
                    get_installed_and_missing_tool_dependencies_for_installing_repository( trans, tool_shed_url, required_tool_dependencies )
                if required_installed_td:
                    if not includes_tool_dependencies:
                        includes_tool_dependencies = True
                    for td_key, td_dict in required_installed_td.items():
                        if td_key not in installed_td:
                            installed_td[ td_key ] = td_dict
                if required_missing_td:
                    if not includes_tool_dependencies:
                        includes_tool_dependencies = True
                    for td_key, td_dict in required_missing_td.items():
                        if td_key not in missing_td:
                            missing_td[ td_key ] = td_dict
    else:
        # We have a single repository with (possibly) no defined repository dependencies.
        all_repo_info_dict = get_required_repo_info_dicts( trans, tool_shed_url, util.listify( repo_info_dict ) )
        has_repository_dependencies = all_repo_info_dict.get( 'has_repository_dependencies', False )
        has_repository_dependencies_only_if_compiling_contained_td = \
            all_repo_info_dict.get( 'has_repository_dependencies_only_if_compiling_contained_td', False )
        includes_tools_for_display_in_tool_panel = all_repo_info_dict.get( 'includes_tools_for_display_in_tool_panel', False )
        includes_tool_dependencies = all_repo_info_dict.get( 'includes_tool_dependencies', False )
        includes_tools = all_repo_info_dict.get( 'includes_tools', False )
        required_repo_info_dicts = all_repo_info_dict.get( 'all_repo_info_dicts', [] )
    dependencies_for_repository_dict = \
        dict( changeset_revision=changeset_revision,
              has_repository_dependencies=has_repository_dependencies,
              has_repository_dependencies_only_if_compiling_contained_td=has_repository_dependencies_only_if_compiling_contained_td,
              includes_tool_dependencies=includes_tool_dependencies,
              includes_tools=includes_tools,
              includes_tools_for_display_in_tool_panel=includes_tools_for_display_in_tool_panel,
              installed_repository_dependencies=installed_rd,
              installed_tool_dependencies=installed_td,
              missing_repository_dependencies=missing_rd,
              missing_tool_dependencies=missing_td,
              name=name,
              repository_owner=repository_owner )
    return dependencies_for_repository_dict