def update_repository_record(self, repository, updated_metadata_dict,
                              updated_changeset_revision, updated_ctx_rev):
     """
     Update a tool_shed_repository database record with new information retrieved from the
     Tool Shed.  This happens when updating an installed repository to a new changeset revision.
     """
     repository.metadata = updated_metadata_dict
     tool_shed_url = common_util.get_tool_shed_url_from_tool_shed_registry(
         self.app, repository.tool_shed)
     suc.clean_dependency_relationships(self.app, updated_metadata_dict,
                                        repository, tool_shed_url)
     # Update the repository.changeset_revision column in the database.
     repository.changeset_revision = updated_changeset_revision
     repository.ctx_rev = updated_ctx_rev
     # Update the repository.tool_shed_status column in the database.
     tool_shed_status_dict = repository_util.get_tool_shed_status_for_installed_repository(
         self.app, repository)
     if tool_shed_status_dict:
         repository.tool_shed_status = tool_shed_status_dict
     else:
         repository.tool_shed_status = None
     self.app.install_model.context.add(repository)
     self.app.install_model.context.flush()
     self.app.install_model.context.refresh(repository)
     return repository
 def update_repository_record( self, repository, updated_metadata_dict, updated_changeset_revision, updated_ctx_rev ):
     """
     Update a tool_shed_repository database record with new information retrieved from the
     Tool Shed.  This happens when updating an installed repository to a new changeset revision.
     """
     repository.metadata = updated_metadata_dict
     tool_shed_url = common_util.get_tool_shed_url_from_tool_shed_registry( self.app, repository.tool_shed )
     suc.clean_dependency_relationships(self.app, updated_metadata_dict, repository, tool_shed_url)
     # Update the repository.changeset_revision column in the database.
     repository.changeset_revision = updated_changeset_revision
     repository.ctx_rev = updated_ctx_rev
     # Update the repository.tool_shed_status column in the database.
     tool_shed_status_dict = suc.get_tool_shed_status_for_installed_repository( self.app, repository )
     if tool_shed_status_dict:
         repository.tool_shed_status = tool_shed_status_dict
     else:
         repository.tool_shed_status = None
     self.app.install_model.context.add( repository )
     self.app.install_model.context.flush()
     self.app.install_model.context.refresh( repository )
     return repository
    def repair_tool_shed_repository( self, repository, repo_info_dict ):

        def add_repair_dict_entry( repository_name, error_message ):
            if repository_name in repair_dict:
                repair_dict[ repository_name ].append( error_message )
            else:
                repair_dict[ repository_name ] = [ error_message ]
            return repair_dict
        tool_shed_url = common_util.get_tool_shed_url_from_tool_shed_registry( self.app, repository.tool_shed )
        metadata = repository.metadata
        # The repository.metadata contains dependency information that corresponds to the current changeset revision,
        # which may be different from what is stored in the database
        # If any of these repository-repository dependency associations is obsolete, clean_dependency_relationships removes them.
        suc.clean_dependency_relationships(self.app, metadata, repository, tool_shed_url)
        repair_dict = {}
        tpm = tool_panel_manager.ToolPanelManager( self.app )
        if repository.status in [ self.app.install_model.ToolShedRepository.installation_status.DEACTIVATED ]:
            try:
                self.app.installed_repository_manager.activate_repository( repository )
            except Exception, e:
                error_message = "Error activating repository %s: %s" % ( repository.name, str( e ) )
                log.debug( error_message )
                repair_dict[ repository.name ] = error_message
Exemplo n.º 4
0
    def repair_tool_shed_repository(self, repository, repo_info_dict):
        def add_repair_dict_entry(repository_name, error_message):
            if repository_name in repair_dict:
                repair_dict[repository_name].append(error_message)
            else:
                repair_dict[repository_name] = [error_message]
            return repair_dict

        tool_shed_url = common_util.get_tool_shed_url_from_tool_shed_registry(
            self.app, repository.tool_shed)
        metadata = repository.metadata
        # The repository.metadata contains dependency information that corresponds to the current changeset revision,
        # which may be different from what is stored in the database
        # If any of these repository-repository dependency associations is obsolete, clean_dependency_relationships removes them.
        suc.clean_dependency_relationships(self.app, metadata, repository,
                                           tool_shed_url)
        repair_dict = {}
        tpm = tool_panel_manager.ToolPanelManager(self.app)
        if repository.status in [
                self.app.install_model.ToolShedRepository.installation_status.
                DEACTIVATED
        ]:
            try:
                self.app.installed_repository_manager.activate_repository(
                    repository)
            except Exception as e:
                error_message = "Error activating repository %s: %s" % (
                    repository.name, str(e))
                log.debug(error_message)
                repair_dict[repository.name] = error_message
        elif repository.status not in [
                self.app.install_model.ToolShedRepository.installation_status.
                INSTALLED
        ]:
            shed_tool_conf, tool_path, relative_install_dir = \
                suc.get_tool_panel_config_tool_path_install_dir( self.app, repository )
            # Reset the repository attributes to the New state for installation.
            if metadata:
                _, tool_panel_section_key = \
                    tpm.handle_tool_panel_selection( self.app.toolbox,
                                                     metadata,
                                                     no_changes_checked=True,
                                                     tool_panel_section_id=None,
                                                     new_tool_panel_section_label=None )
            else:
                # The tools will be loaded outside of any sections in the tool panel.
                tool_panel_section_key = None
            repository_util.set_repository_attributes(
                self.app,
                repository,
                status=self.app.install_model.ToolShedRepository.
                installation_status.NEW,
                error_message=None,
                deleted=False,
                uninstalled=False,
                remove_from_disk=True)
            irm = install_manager.InstallRepositoryManager(self.app, tpm)
            irm.install_tool_shed_repository(
                repository,
                repo_info_dict,
                tool_panel_section_key,
                shed_tool_conf,
                tool_path,
                install_tool_dependencies=True,
                install_resolver_dependencies=
                False,  # Assuming repairs are only necessary toolshed packages
                reinstalling=True)
            if repository.status in [
                    self.app.install_model.ToolShedRepository.
                    installation_status.ERROR
            ]:
                repair_dict = add_repair_dict_entry(repository.name,
                                                    repository.error_message)
        else:
            irm = install_manager.InstallRepositoryManager(self.app, tpm)
            # We have an installed tool shed repository, so handle tool dependencies if necessary.
            if repository.missing_tool_dependencies and metadata and 'tool_dependencies' in metadata:
                work_dir = tempfile.mkdtemp(prefix="tmp-toolshed-itdep")
                # Reset missing tool dependencies.
                for tool_dependency in repository.missing_tool_dependencies:
                    if tool_dependency.status in [
                            self.app.install_model.ToolDependency.
                            installation_status.ERROR, self.app.install_model.
                            ToolDependency.installation_status.INSTALLING
                    ]:
                        tool_dependency = \
                            tool_dependency_util.set_tool_dependency_attributes( self.app,
                                                                                 tool_dependency=tool_dependency,
                                                                                 status=self.app.install_model.ToolDependency.installation_status.UNINSTALLED )
                # Install tool dependencies.
                irm.update_tool_shed_repository_status(
                    repository, self.app.install_model.ToolShedRepository.
                    installation_status.INSTALLING_TOOL_DEPENDENCIES)
                # Get the tool_dependencies.xml file from the repository.
                tool_dependencies_config = hg_util.get_config_from_disk(
                    'tool_dependencies.xml', repository.repo_path(self.app))
                itdm = install_manager.InstallToolDependencyManager(self.app)
                installed_tool_dependencies = itdm.install_specified_tool_dependencies(
                    tool_shed_repository=repository,
                    tool_dependencies_config=tool_dependencies_config,
                    tool_dependencies=repository.tool_dependencies,
                    from_tool_migration_manager=False)
                for installed_tool_dependency in installed_tool_dependencies:
                    if installed_tool_dependency.status in [
                            self.app.install_model.ToolDependency.
                            installation_status.ERROR
                    ]:
                        repair_dict = add_repair_dict_entry(
                            repository.name,
                            installed_tool_dependency.error_message)
                basic_util.remove_dir(work_dir)
            irm.update_tool_shed_repository_status(
                repository, self.app.install_model.ToolShedRepository.
                installation_status.INSTALLED)
        return repair_dict
Exemplo n.º 5
0
    def repair_tool_shed_repository( self, repository, repo_info_dict ):

        def add_repair_dict_entry( repository_name, error_message ):
            if repository_name in repair_dict:
                repair_dict[ repository_name ].append( error_message )
            else:
                repair_dict[ repository_name ] = [ error_message ]
            return repair_dict
        tool_shed_url = common_util.get_tool_shed_url_from_tool_shed_registry( self.app, repository.tool_shed )
        metadata = repository.metadata
        # The repository.metadata contains dependency information that corresponds to the current changeset revision,
        # which may be different from what is stored in the database
        # If any of these repository-repository dependency associations is obsolete, clean_dependency_relationships removes them.
        suc.clean_dependency_relationships(self.app, metadata, repository, tool_shed_url)
        repair_dict = {}
        tpm = tool_panel_manager.ToolPanelManager( self.app )
        if repository.status in [ self.app.install_model.ToolShedRepository.installation_status.DEACTIVATED ]:
            try:
                self.app.installed_repository_manager.activate_repository( repository )
            except Exception as e:
                error_message = "Error activating repository %s: %s" % ( repository.name, str( e ) )
                log.debug( error_message )
                repair_dict[ repository.name ] = error_message
        elif repository.status not in [ self.app.install_model.ToolShedRepository.installation_status.INSTALLED ]:
            shed_tool_conf, tool_path, relative_install_dir = \
                suc.get_tool_panel_config_tool_path_install_dir( self.app, repository )
            # Reset the repository attributes to the New state for installation.
            if metadata:
                _, tool_panel_section_key = \
                    tpm.handle_tool_panel_selection( self.app.toolbox,
                                                     metadata,
                                                     no_changes_checked=True,
                                                     tool_panel_section_id=None,
                                                     new_tool_panel_section_label=None )
            else:
                # The tools will be loaded outside of any sections in the tool panel.
                tool_panel_section_key = None
            repository_util.set_repository_attributes( self.app,
                                                       repository,
                                                       status=self.app.install_model.ToolShedRepository.installation_status.NEW,
                                                       error_message=None,
                                                       deleted=False,
                                                       uninstalled=False,
                                                       remove_from_disk=True )
            irm = install_manager.InstallRepositoryManager( self.app, tpm )
            irm.install_tool_shed_repository( repository,
                                              repo_info_dict,
                                              tool_panel_section_key,
                                              shed_tool_conf,
                                              tool_path,
                                              install_tool_dependencies=True,
                                              install_resolver_dependencies=False,  # Assuming repairs are only necessary toolshed packages
                                              reinstalling=True )
            if repository.status in [ self.app.install_model.ToolShedRepository.installation_status.ERROR ]:
                repair_dict = add_repair_dict_entry( repository.name, repository.error_message )
        else:
            irm = install_manager.InstallRepositoryManager( self.app, tpm )
            # We have an installed tool shed repository, so handle tool dependencies if necessary.
            if repository.missing_tool_dependencies and metadata and 'tool_dependencies' in metadata:
                work_dir = tempfile.mkdtemp( prefix="tmp-toolshed-itdep" )
                # Reset missing tool dependencies.
                for tool_dependency in repository.missing_tool_dependencies:
                    if tool_dependency.status in [ self.app.install_model.ToolDependency.installation_status.ERROR,
                                                   self.app.install_model.ToolDependency.installation_status.INSTALLING ]:
                        tool_dependency = \
                            tool_dependency_util.set_tool_dependency_attributes( self.app,
                                                                                 tool_dependency=tool_dependency,
                                                                                 status=self.app.install_model.ToolDependency.installation_status.UNINSTALLED )
                # Install tool dependencies.
                irm.update_tool_shed_repository_status( repository,
                                                        self.app.install_model.ToolShedRepository.installation_status.INSTALLING_TOOL_DEPENDENCIES )
                # Get the tool_dependencies.xml file from the repository.
                tool_dependencies_config = hg_util.get_config_from_disk( 'tool_dependencies.xml', repository.repo_path( self.app ) )
                itdm = install_manager.InstallToolDependencyManager( self.app )
                installed_tool_dependencies = itdm.install_specified_tool_dependencies( tool_shed_repository=repository,
                                                                                        tool_dependencies_config=tool_dependencies_config,
                                                                                        tool_dependencies=repository.tool_dependencies,
                                                                                        from_tool_migration_manager=False )
                for installed_tool_dependency in installed_tool_dependencies:
                    if installed_tool_dependency.status in [ self.app.install_model.ToolDependency.installation_status.ERROR ]:
                        repair_dict = add_repair_dict_entry( repository.name, installed_tool_dependency.error_message )
                basic_util.remove_dir( work_dir )
            irm.update_tool_shed_repository_status( repository,
                                                    self.app.install_model.ToolShedRepository.installation_status.INSTALLED )
        return repair_dict