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
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
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 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
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
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
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
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