def get_repo_info_dict(app, user, repository_id, changeset_revision):
    repository = suc.get_repository_in_tool_shed(app, repository_id)
    repo = hg_util.get_repo_for_repository(app,
                                           repository=repository,
                                           repo_path=None,
                                           create=False)
    repository_clone_url = common_util.generate_clone_url_for_repository_in_tool_shed(
        user, repository)
    repository_metadata = suc.get_repository_metadata_by_changeset_revision(
        app, repository_id, changeset_revision)
    if not repository_metadata:
        # The received changeset_revision is no longer installable, so get the next changeset_revision
        # in the repository's changelog.  This generally occurs only with repositories of type
        # repository_suite_definition or tool_dependency_definition.
        next_downloadable_changeset_revision = \
            suc.get_next_downloadable_changeset_revision( repository, repo, changeset_revision )
        if next_downloadable_changeset_revision:
            repository_metadata = suc.get_repository_metadata_by_changeset_revision(
                app, repository_id, next_downloadable_changeset_revision)
    if repository_metadata:
        # For now, we'll always assume that we'll get repository_metadata, but if we discover our assumption
        # is not valid we'll have to enhance the callers to handle repository_metadata values of None in the
        # returned repo_info_dict.
        metadata = repository_metadata.metadata
        if 'tools' in metadata:
            includes_tools = True
        else:
            includes_tools = False
        includes_tools_for_display_in_tool_panel = repository_metadata.includes_tools_for_display_in_tool_panel
        repository_dependencies_dict = metadata.get('repository_dependencies',
                                                    {})
        repository_dependencies = repository_dependencies_dict.get(
            'repository_dependencies', [])
        has_repository_dependencies, has_repository_dependencies_only_if_compiling_contained_td = \
            suc.get_repository_dependency_types( repository_dependencies )
        if 'tool_dependencies' in metadata:
            includes_tool_dependencies = True
        else:
            includes_tool_dependencies = False
    else:
        # Here's where we may have to handle enhancements to the callers. See above comment.
        includes_tools = False
        has_repository_dependencies = False
        has_repository_dependencies_only_if_compiling_contained_td = False
        includes_tool_dependencies = False
        includes_tools_for_display_in_tool_panel = False
    ctx = hg_util.get_changectx_for_changeset(repo, changeset_revision)
    repo_info_dict = create_repo_info_dict(
        app=app,
        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)
    return repo_info_dict, includes_tools, includes_tool_dependencies, includes_tools_for_display_in_tool_panel, \
        has_repository_dependencies, has_repository_dependencies_only_if_compiling_contained_td
示例#2
0
def get_repo_info_dict( app, user, repository_id, changeset_revision ):
    repository = suc.get_repository_in_tool_shed( app, repository_id )
    repo = hg_util.get_repo_for_repository( app, repository=repository, repo_path=None, create=False )
    repository_clone_url = common_util.generate_clone_url_for_repository_in_tool_shed( user, repository )
    repository_metadata = suc.get_repository_metadata_by_changeset_revision( app,
                                                                             repository_id,
                                                                             changeset_revision )
    if not repository_metadata:
        # The received changeset_revision is no longer installable, so get the next changeset_revision
        # in the repository's changelog.  This generally occurs only with repositories of type
        # repository_suite_definition or tool_dependency_definition.
        next_downloadable_changeset_revision = \
            suc.get_next_downloadable_changeset_revision( repository, repo, changeset_revision )
        if next_downloadable_changeset_revision:
            repository_metadata = suc.get_repository_metadata_by_changeset_revision( app,
                                                                                     repository_id,
                                                                                     next_downloadable_changeset_revision )
    if repository_metadata:
        # For now, we'll always assume that we'll get repository_metadata, but if we discover our assumption
        # is not valid we'll have to enhance the callers to handle repository_metadata values of None in the
        # returned repo_info_dict.
        metadata = repository_metadata.metadata
        if 'tools' in metadata:
            includes_tools = True
        else:
            includes_tools = False
        includes_tools_for_display_in_tool_panel = repository_metadata.includes_tools_for_display_in_tool_panel
        repository_dependencies_dict = metadata.get( 'repository_dependencies', {} )
        repository_dependencies = repository_dependencies_dict.get( 'repository_dependencies', [] )
        has_repository_dependencies, has_repository_dependencies_only_if_compiling_contained_td = \
            suc.get_repository_dependency_types( repository_dependencies )
        if 'tool_dependencies' in metadata:
            includes_tool_dependencies = True
        else:
            includes_tool_dependencies = False
    else:
        # Here's where we may have to handle enhancements to the callers. See above comment.
        includes_tools = False
        has_repository_dependencies = False
        has_repository_dependencies_only_if_compiling_contained_td = False
        includes_tool_dependencies = False
        includes_tools_for_display_in_tool_panel = False
    ctx = hg_util.get_changectx_for_changeset( repo, changeset_revision )
    repo_info_dict = create_repo_info_dict( app=app,
                                            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 )
    return repo_info_dict, includes_tools, includes_tool_dependencies, includes_tools_for_display_in_tool_panel, \
        has_repository_dependencies, has_repository_dependencies_only_if_compiling_contained_td
示例#3
0
    def get_repository_revision_install_info( self, trans, name, owner, changeset_revision, **kwd ):
        """
        GET /api/repositories/get_repository_revision_install_info

        :param name: the name of the Repository
        :param owner: the owner of the Repository
        :param changeset_revision: the changeset_revision of the RepositoryMetadata object associated with the Repository

        Returns a list of the following dictionaries::
        - a dictionary defining the Repository.  For example:
        {
            "deleted": false,
            "deprecated": false,
            "description": "add_column hello",
            "id": "f9cad7b01a472135",
            "long_description": "add_column hello",
            "name": "add_column",
            "owner": "test",
            "private": false,
            "times_downloaded": 6,
            "url": "/api/repositories/f9cad7b01a472135",
            "user_id": "f9cad7b01a472135"
        }
        - a dictionary defining the Repository revision (RepositoryMetadata).  For example:
        {
            "changeset_revision": "3a08cc21466f",
            "downloadable": true,
            "has_repository_dependencies": false,
            "has_repository_dependencies_only_if_compiling_contained_td": false,
            "id": "f9cad7b01a472135",
            "includes_datatypes": false,
            "includes_tool_dependencies": false,
            "includes_tools": true,
            "includes_tools_for_display_in_tool_panel": true,
            "includes_workflows": false,
            "malicious": false,
            "repository_id": "f9cad7b01a472135",
            "url": "/api/repository_revisions/f9cad7b01a472135"
        }
        - a dictionary including the additional information required to install the repository.  For example:
        {
            "add_column": [
                "add_column hello",
                "http://test@localhost:9009/repos/test/add_column",
                "3a08cc21466f",
                "1",
                "test",
                {},
                {}
            ]
        }
        """
        # Example URL: 
        # http://<xyz>/api/repositories/get_repository_revision_install_info?name=<n>&owner=<o>&changeset_revision=<cr>
        if name and owner and changeset_revision:
            # Get the repository information.
            repository = suc.get_repository_by_name_and_owner( trans.app, name, owner )
            if repository is None:
                log.debug( 'Cannot locate repository %s owned by %s' % ( str( name ), str( owner ) ) )
                return {}, {}, {}
            encoded_repository_id = trans.security.encode_id( repository.id )
            repository_dict = repository.to_dict( view='element',
                                                  value_mapper=self.__get_value_mapper( trans ) )
            repository_dict[ 'url' ] = web.url_for( controller='repositories',
                                                    action='show',
                                                    id=encoded_repository_id )
            # Get the repository_metadata information.
            repository_metadata = suc.get_repository_metadata_by_changeset_revision( trans.app,
                                                                                     encoded_repository_id,
                                                                                     changeset_revision )
            if repository_metadata is None:
                # The changeset_revision column in the repository_metadata table has been updated with a new
                # value value, so find the changeset_revision to which we need to update.
                repo = hg_util.get_repo_for_repository( trans.app, repository=repository, repo_path=None, create=False )
                new_changeset_revision = suc.get_next_downloadable_changeset_revision( repository, repo, changeset_revision )
                repository_metadata = suc.get_repository_metadata_by_changeset_revision( trans.app,
                                                                                         encoded_repository_id,
                                                                                         new_changeset_revision )
                changeset_revision = new_changeset_revision
            if repository_metadata is not None:
                encoded_repository_metadata_id = trans.security.encode_id( repository_metadata.id )
                repository_metadata_dict = repository_metadata.to_dict( view='collection',
                                                                        value_mapper=self.__get_value_mapper( trans ) )
                repository_metadata_dict[ 'url' ] = web.url_for( controller='repository_revisions',
                                                                 action='show',
                                                                 id=encoded_repository_metadata_id )
                # Get the repo_info_dict for installing the repository.
                repo_info_dict, \
                includes_tools, \
                includes_tool_dependencies, \
                includes_tools_for_display_in_tool_panel, \
                has_repository_dependencies, \
                has_repository_dependencies_only_if_compiling_contained_td = \
                    repository_util.get_repo_info_dict( trans.app,
                                                        trans.user,
                                                        encoded_repository_id,
                                                        changeset_revision )
                return repository_dict, repository_metadata_dict, repo_info_dict
            else:
                log.debug( "Unable to locate repository_metadata record for repository id %s and changeset_revision %s" % \
                    ( str( repository.id ), str( changeset_revision ) ) )
                return repository_dict, {}, {}
        else:
            debug_msg = "Error in the Tool Shed repositories API in get_repository_revision_install_info: "
            debug_msg += "Invalid name %s or owner %s or changeset_revision %s received." % \
                ( str( name ), str( owner ), str( changeset_revision ) )
            log.debug( debug_msg )
            return {}, {}, {}
示例#4
0
 def get_repository_revision_install_info(self, trans, name, owner,
                                          changeset_revision, **kwd):
     """
     GET /api/repositories/get_repository_revision_install_info
     
     :param name: the name of the Repository
     :param owner: the owner of the Repository
     :param changset_revision: the changset_revision of the RepositoryMetadata object associated with the Repository
     
     Returns a list of the following dictionaries::
     - a dictionary defining the Repository.  For example:
     {
         "deleted": false, 
         "deprecated": false, 
         "description": "add_column hello", 
         "id": "f9cad7b01a472135", 
         "long_description": "add_column hello", 
         "name": "add_column", 
         "owner": "test", 
         "private": false, 
         "times_downloaded": 6, 
         "url": "/api/repositories/f9cad7b01a472135", 
         "user_id": "f9cad7b01a472135"
     }
     - a dictionary defining the Repository revision (RepositoryMetadata).  For example:
     {
         "changeset_revision": "3a08cc21466f", 
         "downloadable": true, 
         "has_repository_dependencies": false, 
         "id": "f9cad7b01a472135", 
         "includes_datatypes": false, 
         "includes_tool_dependencies": false, 
         "includes_tools": true,
         "includes_tools_for_display_in_tool_panel": true,
         "includes_workflows": false, 
         "malicious": false, 
         "repository_id": "f9cad7b01a472135", 
         "url": "/api/repository_revisions/f9cad7b01a472135"
     }
     - a dictionary including the additional information required to install the repository.  For example:
     {
         "add_column": [
             "add_column hello", 
             "http://test@localhost:9009/repos/test/add_column", 
             "3a08cc21466f", 
             "1", 
             "test", 
             {}, 
             {}
         ]
     }
     """
     # Example URL: http://localhost:9009/api/repositories/get_repository_revision_install_info?name=add_column&owner=test&changeset_revision=3a08cc21466f
     try:
         # Get the repository information.
         repository = suc.get_repository_by_name_and_owner(
             trans.app, name, owner)
         encoded_repository_id = trans.security.encode_id(repository.id)
         repository_dict = repository.get_api_value(
             view='element',
             value_mapper=default_repository_value_mapper(
                 trans, repository))
         repository_dict['url'] = web.url_for(controller='repositories',
                                              action='show',
                                              id=encoded_repository_id)
         # Get the repository_metadata information.
         repository_metadata = suc.get_repository_metadata_by_changeset_revision(
             trans, encoded_repository_id, changeset_revision)
         if not repository_metadata:
             # The changeset_revision column in the repository_metadata table has been updated with a new value value, so find the
             # changeset_revision to which we need to update.
             repo_dir = repository.repo_path(trans.app)
             repo = hg.repository(suc.get_configured_ui(), repo_dir)
             new_changeset_revision = suc.get_next_downloadable_changeset_revision(
                 repository, repo, changeset_revision)
             repository_metadata = suc.get_repository_metadata_by_changeset_revision(
                 trans, encoded_repository_id, new_changeset_revision)
             changeset_revision = new_changeset_revision
         if repository_metadata:
             encoded_repository_metadata_id = trans.security.encode_id(
                 repository_metadata.id)
             repository_metadata_dict = repository_metadata.get_api_value(
                 view='collection',
                 value_mapper=default_repository_metadata_value_mapper(
                     trans, repository_metadata))
             repository_metadata_dict['url'] = web.url_for(
                 controller='repository_revisions',
                 action='show',
                 id=encoded_repository_metadata_id)
             # Get the repo_info_dict for installing the repository.
             repo_info_dict, includes_tools, includes_tool_dependencies, includes_tools_for_display_in_tool_panel, has_repository_dependencies = \
                 repository_util.get_repo_info_dict( trans, encoded_repository_id, changeset_revision )
             return repository_dict, repository_metadata_dict, repo_info_dict
         else:
             message = "Unable to locate repository_metadata record for repository id %d and changeset_revision %s" % (
                 repository.id, changeset_revision)
             log.error(message, exc_info=True)
             trans.response.status = 500
             return repository_dict, {}, {}
     except Exception, e:
         message = "Error in the Tool Shed repositories API in get_repository_revision_install_info: %s" % str(
             e)
         log.error(message, exc_info=True)
         trans.response.status = 500
         return message
示例#5
0
    def repository_dependencies(self, trans, id, **kwd):
        """
        GET /api/repository_revisions/{encoded repository_metadata id}/repository_dependencies

        Returns a list of dictionaries that each define a specific downloadable revision of a
        repository in the Tool Shed.  This method returns dictionaries with more information in
        them than other methods in this controller.  The information about repository_metdata is
        enhanced to include information about the repository (e.g., name, owner, etc) associated
        with the repository_metadata record.

        :param id: the encoded id of the `RepositoryMetadata` object
        """
        # Example URL: http://localhost:9009/api/repository_revisions/repository_dependencies/bb125606ff9ea620
        repository_dependencies_dicts = []
        repository_metadata = metadata_util.get_repository_metadata_by_id(
            trans.app, id)
        if repository_metadata is None:
            log.debug('Invalid repository_metadata id received: %s' % str(id))
            return repository_dependencies_dicts
        metadata = repository_metadata.metadata
        if metadata is None:
            log.debug(
                'The repository_metadata record with id %s has no metadata.' %
                str(id))
            return repository_dependencies_dicts
        if 'repository_dependencies' in metadata:
            rd_tups = metadata['repository_dependencies'][
                'repository_dependencies']
            for rd_tup in rd_tups:
                tool_shed, name, owner, changeset_revision = rd_tup[0:4]
                repository_dependency = suc.get_repository_by_name_and_owner(
                    trans.app, name, owner)
                if repository_dependency is None:
                    log.dbug(
                        'Cannot locate repository dependency %s owned by %s.' %
                        (name, owner))
                    continue
                repository_dependency_id = trans.security.encode_id(
                    repository_dependency.id)
                repository_dependency_repository_metadata = \
                    suc.get_repository_metadata_by_changeset_revision( trans.app, repository_dependency_id, changeset_revision )
                if repository_dependency_repository_metadata is None:
                    # The changeset_revision column in the repository_metadata table has been updated with a new
                    # value value, so find the changeset_revision to which we need to update.
                    repo = hg_util.get_repo_for_repository(
                        trans.app,
                        repository=repository_dependency,
                        repo_path=None,
                        create=False)
                    new_changeset_revision = suc.get_next_downloadable_changeset_revision(
                        repository_dependency, repo, changeset_revision)
                    repository_dependency_repository_metadata = \
                        suc.get_repository_metadata_by_changeset_revision( trans.app,
                                                                           repository_dependency_id,
                                                                           new_changeset_revision )
                    if repository_dependency_repository_metadata is None:
                        decoded_repository_dependency_id = trans.security.decode_id(
                            repository_dependency_id)
                        debug_msg = 'Cannot locate repository_metadata with id %d for repository dependency %s owned by %s ' % \
                            ( decoded_repository_dependency_id, str( name ), str( owner ) )
                        debug_msg += 'using either of these changeset_revisions: %s, %s.' % \
                            ( str( changeset_revision ), str( new_changeset_revision ) )
                        log.debug(debug_msg)
                        continue
                    else:
                        changeset_revision = new_changeset_revision
                repository_dependency_metadata_dict = \
                    repository_dependency_repository_metadata.to_dict( view='element',
                                                                       value_mapper=self.__get_value_mapper( trans ) )
                repository_dependency_dict = repository_dependency.to_dict(
                    view='element',
                    value_mapper=self.__get_value_mapper(trans))
                # We need to be careful with the entries in our repository_dependency_dict here since this Tool Shed API
                # controller is working with repository_metadata records.  The above to_dict() method returns a dictionary
                # with an id entry for the repository record.  However, all of the other methods in this controller have
                # the id entry associated with a repository_metadata record id.  To avoid confusion, we'll update the
                # repository_dependency_metadata_dict with entries from the repository_dependency_dict without using the
                # Python dictionary update() method because we do not want to overwrite existing entries.
                for k, v in repository_dependency_dict.items():
                    if k not in repository_dependency_metadata_dict:
                        repository_dependency_metadata_dict[k] = v
                repository_dependency_metadata_dict['url'] = web.url_for(
                    controller='repositories',
                    action='show',
                    id=repository_dependency_id)
                repository_dependencies_dicts.append(
                    repository_dependency_metadata_dict)
        return repository_dependencies_dicts
示例#6
0
    def get_repository_revision_install_info(self, trans, name, owner,
                                             changeset_revision, **kwd):
        """
        GET /api/repositories/get_repository_revision_install_info

        :param name: the name of the Repository
        :param owner: the owner of the Repository
        :param changeset_revision: the changeset_revision of the RepositoryMetadata object associated with the Repository

        Returns a list of the following dictionaries::
        - a dictionary defining the Repository.  For example:
        {
            "deleted": false,
            "deprecated": false,
            "description": "add_column hello",
            "id": "f9cad7b01a472135",
            "long_description": "add_column hello",
            "name": "add_column",
            "owner": "test",
            "private": false,
            "times_downloaded": 6,
            "url": "/api/repositories/f9cad7b01a472135",
            "user_id": "f9cad7b01a472135"
        }
        - a dictionary defining the Repository revision (RepositoryMetadata).  For example:
        {
            "changeset_revision": "3a08cc21466f",
            "downloadable": true,
            "has_repository_dependencies": false,
            "has_repository_dependencies_only_if_compiling_contained_td": false,
            "id": "f9cad7b01a472135",
            "includes_datatypes": false,
            "includes_tool_dependencies": false,
            "includes_tools": true,
            "includes_tools_for_display_in_tool_panel": true,
            "includes_workflows": false,
            "malicious": false,
            "repository_id": "f9cad7b01a472135",
            "url": "/api/repository_revisions/f9cad7b01a472135"
        }
        - a dictionary including the additional information required to install the repository.  For example:
        {
            "add_column": [
                "add_column hello",
                "http://test@localhost:9009/repos/test/add_column",
                "3a08cc21466f",
                "1",
                "test",
                {},
                {}
            ]
        }
        """
        # Example URL:
        # http://<xyz>/api/repositories/get_repository_revision_install_info?name=<n>&owner=<o>&changeset_revision=<cr>
        if name and owner and changeset_revision:
            # Get the repository information.
            repository = suc.get_repository_by_name_and_owner(
                trans.app, name, owner)
            if repository is None:
                log.debug('Cannot locate repository %s owned by %s' %
                          (str(name), str(owner)))
                return {}, {}, {}
            encoded_repository_id = trans.security.encode_id(repository.id)
            repository_dict = repository.to_dict(
                view='element', value_mapper=self.__get_value_mapper(trans))
            repository_dict['url'] = web.url_for(controller='repositories',
                                                 action='show',
                                                 id=encoded_repository_id)
            # Get the repository_metadata information.
            repository_metadata = suc.get_repository_metadata_by_changeset_revision(
                trans.app, encoded_repository_id, changeset_revision)
            if repository_metadata is None:
                # The changeset_revision column in the repository_metadata table has been updated with a new
                # value value, so find the changeset_revision to which we need to update.
                repo = hg_util.get_repo_for_repository(trans.app,
                                                       repository=repository,
                                                       repo_path=None,
                                                       create=False)
                new_changeset_revision = suc.get_next_downloadable_changeset_revision(
                    repository, repo, changeset_revision)
                repository_metadata = suc.get_repository_metadata_by_changeset_revision(
                    trans.app, encoded_repository_id, new_changeset_revision)
                changeset_revision = new_changeset_revision
            if repository_metadata is not None:
                encoded_repository_metadata_id = trans.security.encode_id(
                    repository_metadata.id)
                repository_metadata_dict = repository_metadata.to_dict(
                    view='collection',
                    value_mapper=self.__get_value_mapper(trans))
                repository_metadata_dict['url'] = web.url_for(
                    controller='repository_revisions',
                    action='show',
                    id=encoded_repository_metadata_id)
                # Get the repo_info_dict for installing the repository.
                repo_info_dict, \
                includes_tools, \
                includes_tool_dependencies, \
                includes_tools_for_display_in_tool_panel, \
                has_repository_dependencies, \
                has_repository_dependencies_only_if_compiling_contained_td = \
                    repository_util.get_repo_info_dict( trans.app,
                                                        trans.user,
                                                        encoded_repository_id,
                                                        changeset_revision )
                return repository_dict, repository_metadata_dict, repo_info_dict
            else:
                log.debug( "Unable to locate repository_metadata record for repository id %s and changeset_revision %s" % \
                    ( str( repository.id ), str( changeset_revision ) ) )
                return repository_dict, {}, {}
        else:
            debug_msg = "Error in the Tool Shed repositories API in get_repository_revision_install_info: "
            debug_msg += "Invalid name %s or owner %s or changeset_revision %s received." % \
                ( str( name ), str( owner ), str( changeset_revision ) )
            log.debug(debug_msg)
            return {}, {}, {}
    def repository_dependencies( self, trans, id, **kwd ):
        """
        GET /api/repository_revisions/{encoded repository_metadata id}/repository_dependencies

        Returns a list of dictionaries that each define a specific downloadable revision of a
        repository in the Tool Shed.  This method returns dictionaries with more information in
        them than other methods in this controller.  The information about repository_metdata is
        enhanced to include information about the repository (e.g., name, owner, etc) associated
        with the repository_metadata record.

        :param id: the encoded id of the `RepositoryMetadata` object
        """
        # Example URL: http://localhost:9009/api/repository_revisions/repository_dependencies/bb125606ff9ea620
        repository_dependencies_dicts = []
        repository_metadata = metadata_util.get_repository_metadata_by_id( trans, id )
        if repository_metadata is None:
            log.debug( 'Invalid repository_metadata id received: %s' % str( id ) )
            return repository_dependencies_dicts
        metadata = repository_metadata.metadata
        if metadata is None:
            log.debug( 'The repository_metadata record with id %s has no metadata.' % str ( id ) )
            return repository_dependencies_dicts
        if 'repository_dependencies' in metadata:
            rd_tups = metadata[ 'repository_dependencies' ][ 'repository_dependencies' ]
            for rd_tup in rd_tups:
                tool_shed, name, owner, changeset_revision = rd_tup[ 0:4 ]
                repository_dependency = suc.get_repository_by_name_and_owner( trans.app, name, owner )
                if repository_dependency is None:
                    log.dbug( 'Cannot locate repository dependency %s owned by %s.' % ( name, owner ) )
                    continue
                repository_dependency_id = trans.security.encode_id( repository_dependency.id )
                repository_dependency_repository_metadata = \
                    suc.get_repository_metadata_by_changeset_revision( trans, repository_dependency_id, changeset_revision )
                if repository_dependency_repository_metadata is None:
                    # The changeset_revision column in the repository_metadata table has been updated with a new
                    # value value, so find the changeset_revision to which we need to update.
                    repo_dir = repository_dependency.repo_path( trans.app )
                    repo = hg.repository( suc.get_configured_ui(), repo_dir )
                    new_changeset_revision = suc.get_next_downloadable_changeset_revision( repository_dependency,
                                                                                           repo,
                                                                                           changeset_revision )
                    repository_dependency_repository_metadata = \
                        suc.get_repository_metadata_by_changeset_revision( trans,
                                                                           repository_dependency_id,
                                                                           new_changeset_revision )
                    if repository_dependency_repository_metadata is None:
                        decoded_repository_dependency_id = trans.security.decode_id( repository_dependency_id )
                        debug_msg = 'Cannot locate repository_metadata with id %d for repository dependency %s owned by %s ' % \
                            ( decoded_repository_dependency_id, str( name ), str( owner ) )
                        debug_msg += 'using either of these changeset_revisions: %s, %s.' % \
                            ( str( changeset_revision ), str( new_changeset_revision ) )
                        log.debug( debug_msg )
                        continue
                    else:
                        changeset_revision = new_changeset_revision
                repository_dependency_repository_metadata_id = trans.security.encode_id( repository_dependency_repository_metadata.id )
                repository_dependency_metadata_dict = \
                    repository_dependency_repository_metadata.to_dict( view='element',
                                                                       value_mapper=self.__get_value_mapper( trans ) )
                repository_dependency_dict = repository_dependency.to_dict( view='element',
                                                                            value_mapper=self.__get_value_mapper( trans ) )
                # We need to be careful with the entries in our repository_dependency_dict here since this Tool Shed API
                # controller is working with repository_metadata records.  The above to_dict() method returns a dictionary
                # with an id entry for the repository record.  However, all of the other methods in this controller have
                # the id entry associated with a repository_metadata record id.  To avoid confusion, we'll update the
                # repository_dependency_metadata_dict with entries from the repository_dependency_dict without using the
                # Python dictionary update() method because we do not want to overwrite existing entries.
                for k, v in repository_dependency_dict.items():
                    if k not in repository_dependency_metadata_dict:
                        repository_dependency_metadata_dict[ k ] = v
                repository_dependency_metadata_dict[ 'url' ] = web.url_for( controller='repositories',
                                                                            action='show',
                                                                            id=repository_dependency_id )
                repository_dependencies_dicts.append( repository_dependency_metadata_dict )
        return repository_dependencies_dicts
示例#8
0
 def get_updated_changeset_revisions_for_repository_dependencies(
         self, key_rd_dicts):
     updated_key_rd_dicts = []
     for key_rd_dict in key_rd_dicts:
         key = key_rd_dict.keys()[0]
         repository_dependency = key_rd_dict[key]
         rd_toolshed, \
         rd_name, \
         rd_owner, \
         rd_changeset_revision, \
         rd_prior_installation_required, \
         rd_only_if_compiling_contained_td = \
             common_util.parse_repository_dependency_tuple( repository_dependency )
         if suc.tool_shed_is_this_tool_shed(rd_toolshed):
             repository = suc.get_repository_by_name_and_owner(
                 self.app, rd_name, rd_owner)
             if repository:
                 repository_id = self.app.security.encode_id(repository.id)
                 repository_metadata = \
                     metadata_util.get_repository_metadata_by_repository_id_changeset_revision( self.app,
                                                                                                repository_id,
                                                                                                rd_changeset_revision )
                 if repository_metadata:
                     # The repository changeset_revision is installable, so no updates are available.
                     new_key_rd_dict = {}
                     new_key_rd_dict[key] = repository_dependency
                     updated_key_rd_dicts.append(key_rd_dict)
                 else:
                     # The repository changeset_revision is no longer installable, so see if there's been an update.
                     repo = hg_util.get_repo_for_repository(
                         self.app,
                         repository=repository,
                         repo_path=None,
                         create=False)
                     changeset_revision = suc.get_next_downloadable_changeset_revision(
                         repository, repo, rd_changeset_revision)
                     repository_metadata = \
                         metadata_util.get_repository_metadata_by_repository_id_changeset_revision( self.app,
                                                                                                    repository_id,
                                                                                                    changeset_revision )
                     if repository_metadata:
                         new_key_rd_dict = {}
                         new_key_rd_dict[ key ] = \
                             [ rd_toolshed, \
                               rd_name, \
                               rd_owner, \
                               repository_metadata.changeset_revision, \
                               rd_prior_installation_required, \
                               rd_only_if_compiling_contained_td ]
                         # We have the updated changset revision.
                         updated_key_rd_dicts.append(new_key_rd_dict)
                     else:
                         repository_components_tuple = container_util.get_components_from_key(
                             key)
                         components_list = suc.extract_components_from_tuple(
                             repository_components_tuple)
                         toolshed, repository_name, repository_owner, repository_changeset_revision = components_list[
                             0:4]
                         # For backward compatibility to the 12/20/12 Galaxy release.
                         if len(components_list) == 4:
                             prior_installation_required = 'False'
                             rd_only_if_compiling_contained_td = 'False'
                         elif len(components_list) == 5:
                             rd_only_if_compiling_contained_td = 'False'
                         message = "The revision %s defined for repository %s owned by %s is invalid, so repository " % \
                             ( str( rd_changeset_revision ), str( rd_name ), str( rd_owner ) )
                         message += "dependencies defined for repository %s will be ignored." % str(
                             repository_name)
                         log.debug(message)
             else:
                 repository_components_tuple = container_util.get_components_from_key(
                     key)
                 components_list = suc.extract_components_from_tuple(
                     repository_components_tuple)
                 toolshed, repository_name, repository_owner, repository_changeset_revision = components_list[
                     0:4]
                 message = "The revision %s defined for repository %s owned by %s is invalid, so repository " % \
                     ( str( rd_changeset_revision ), str( rd_name ), str( rd_owner ) )
                 message += "dependencies defined for repository %s will be ignored." % str(
                     repository_name)
                 log.debug(message)
     return updated_key_rd_dicts
 def get_updated_changeset_revisions_for_repository_dependencies( self, key_rd_dicts ):
     updated_key_rd_dicts = []
     for key_rd_dict in key_rd_dicts:
         key = key_rd_dict.keys()[ 0 ]
         repository_dependency = key_rd_dict[ key ]
         rd_toolshed, rd_name, rd_owner, rd_changeset_revision, \
             rd_prior_installation_required, \
             rd_only_if_compiling_contained_td = \
             common_util.parse_repository_dependency_tuple( repository_dependency )
         if suc.tool_shed_is_this_tool_shed( rd_toolshed ):
             repository = suc.get_repository_by_name_and_owner( self.app, rd_name, rd_owner )
             if repository:
                 repository_id = self.app.security.encode_id( repository.id )
                 repository_metadata = \
                     metadata_util.get_repository_metadata_by_repository_id_changeset_revision( self.app,
                                                                                                repository_id,
                                                                                                rd_changeset_revision )
                 if repository_metadata:
                     # The repository changeset_revision is installable, so no updates are available.
                     new_key_rd_dict = {}
                     new_key_rd_dict[ key ] = repository_dependency
                     updated_key_rd_dicts.append( key_rd_dict )
                 else:
                     # The repository changeset_revision is no longer installable, so see if there's been an update.
                     repo = hg_util.get_repo_for_repository( self.app, repository=repository, repo_path=None, create=False )
                     changeset_revision = suc.get_next_downloadable_changeset_revision( repository, repo, rd_changeset_revision )
                     repository_metadata = \
                         metadata_util.get_repository_metadata_by_repository_id_changeset_revision( self.app,
                                                                                                    repository_id,
                                                                                                    changeset_revision )
                     if repository_metadata:
                         new_key_rd_dict = {}
                         new_key_rd_dict[ key ] = \
                             [ rd_toolshed,
                               rd_name,
                               rd_owner,
                               repository_metadata.changeset_revision,
                               rd_prior_installation_required,
                               rd_only_if_compiling_contained_td ]
                         # We have the updated changeset revision.
                         updated_key_rd_dicts.append( new_key_rd_dict )
                     else:
                         repository_components_tuple = container_util.get_components_from_key( key )
                         components_list = suc.extract_components_from_tuple( repository_components_tuple )
                         toolshed, repository_name, repository_owner, repository_changeset_revision = components_list[ 0:4 ]
                         # For backward compatibility to the 12/20/12 Galaxy release.
                         if len( components_list ) in (4, 5):
                             rd_only_if_compiling_contained_td = 'False'
                         message = "The revision %s defined for repository %s owned by %s is invalid, so repository " % \
                             ( str( rd_changeset_revision ), str( rd_name ), str( rd_owner ) )
                         message += "dependencies defined for repository %s will be ignored." % str( repository_name )
                         log.debug( message )
             else:
                 repository_components_tuple = container_util.get_components_from_key( key )
                 components_list = suc.extract_components_from_tuple( repository_components_tuple )
                 toolshed, repository_name, repository_owner, repository_changeset_revision = components_list[ 0:4 ]
                 message = "The revision %s defined for repository %s owned by %s is invalid, so repository " % \
                     ( str( rd_changeset_revision ), str( rd_name ), str( rd_owner ) )
                 message += "dependencies defined for repository %s will be ignored." % str( repository_name )
                 log.debug( message )
     return updated_key_rd_dicts
示例#10
0
 def get_repository_revision_install_info( self, trans, name, owner, changeset_revision, **kwd ):
     """
     GET /api/repositories/get_repository_revision_install_info
     
     :param name: the name of the Repository
     :param owner: the owner of the Repository
     :param changset_revision: the changset_revision of the RepositoryMetadata object associated with the Repository
     
     Returns a list of the following dictionaries::
     - a dictionary defining the Repository.  For example:
     {
         "deleted": false, 
         "deprecated": false, 
         "description": "add_column hello", 
         "id": "f9cad7b01a472135", 
         "long_description": "add_column hello", 
         "name": "add_column", 
         "owner": "test", 
         "private": false, 
         "times_downloaded": 6, 
         "url": "/api/repositories/f9cad7b01a472135", 
         "user_id": "f9cad7b01a472135"
     }
     - a dictionary defining the Repository revision (RepositoryMetadata).  For example:
     {
         "changeset_revision": "3a08cc21466f", 
         "downloadable": true, 
         "has_repository_dependencies": false, 
         "id": "f9cad7b01a472135", 
         "includes_datatypes": false, 
         "includes_tool_dependencies": false, 
         "includes_tools": true,
         "includes_tools_for_display_in_tool_panel": true,
         "includes_workflows": false, 
         "malicious": false, 
         "repository_id": "f9cad7b01a472135", 
         "url": "/api/repository_revisions/f9cad7b01a472135"
     }
     - a dictionary including the additional information required to install the repository.  For example:
     {
         "add_column": [
             "add_column hello", 
             "http://test@localhost:9009/repos/test/add_column", 
             "3a08cc21466f", 
             "1", 
             "test", 
             {}, 
             {}
         ]
     }
     """
     # Example URL: http://localhost:9009/api/repositories/get_repository_revision_install_info?name=add_column&owner=test&changeset_revision=3a08cc21466f
     try:
         # Get the repository information.
         repository = suc.get_repository_by_name_and_owner( trans.app, name, owner )
         encoded_repository_id = trans.security.encode_id( repository.id )
         repository_dict = repository.get_api_value( view='element', value_mapper=default_repository_value_mapper( trans, repository ) )
         repository_dict[ 'url' ] = web.url_for( controller='repositories',
                                                 action='show',
                                                 id=encoded_repository_id )
         # Get the repository_metadata information.
         repository_metadata = suc.get_repository_metadata_by_changeset_revision( trans, encoded_repository_id, changeset_revision )
         if not repository_metadata:
             # The changeset_revision column in the repository_metadata table has been updated with a new value value, so find the
             # changeset_revision to which we need to update.
             repo_dir = repository.repo_path( trans.app )
             repo = hg.repository( suc.get_configured_ui(), repo_dir )
             new_changeset_revision = suc.get_next_downloadable_changeset_revision( repository, repo, changeset_revision )
             repository_metadata = suc.get_repository_metadata_by_changeset_revision( trans, encoded_repository_id, new_changeset_revision )
             changeset_revision = new_changeset_revision
         if repository_metadata:
             encoded_repository_metadata_id = trans.security.encode_id( repository_metadata.id )
             repository_metadata_dict = repository_metadata.get_api_value( view='collection',
                                                                           value_mapper=default_repository_metadata_value_mapper( trans, repository_metadata ) )
             repository_metadata_dict[ 'url' ] = web.url_for( controller='repository_revisions',
                                                              action='show',
                                                              id=encoded_repository_metadata_id )
             # Get the repo_info_dict for installing the repository.
             repo_info_dict, includes_tools, includes_tool_dependencies, includes_tools_for_display_in_tool_panel, has_repository_dependencies = \
                 repository_util.get_repo_info_dict( trans, encoded_repository_id, changeset_revision )
             return repository_dict, repository_metadata_dict, repo_info_dict
         else:
             message = "Unable to locate repository_metadata record for repository id %d and changeset_revision %s" % ( repository.id, changeset_revision )
             log.error( message, exc_info=True )
             trans.response.status = 500
             return repository_dict, {}, {}
     except Exception, e:
         message = "Error in the Tool Shed repositories API in get_repository_revision_install_info: %s" % str( e )
         log.error( message, exc_info=True )
         trans.response.status = 500
         return message