def get_list_of_copied_sample_files(self, repo, changeset_revision, dir): """ Find all sample files (files in the repository with the special .sample extension) in the reversed repository manifest up to changeset_revision. Copy each discovered file to dir and return the list of filenames. If a .sample file was added in a changeset and then deleted in a later changeset, it will be returned in the deleted_sample_files list. The caller will set the value of app.config.tool_data_path to dir in order to load the tools and generate metadata for them. """ deleted_sample_files = [] sample_files = [] for changeset in hg_util.reversed_upper_bounded_changelog( repo, changeset_revision): changeset_ctx = repo[changeset] for ctx_file in changeset_ctx.files(): ctx_file = unicodify(ctx_file) ctx_file_name = basic_util.strip_path(ctx_file) # If we decide in the future that files deleted later in the changelog should # not be used, we can use the following if statement. if ctx_file_name.endswith( '.sample' ) # and ctx_file_name not in sample_files and ctx_file_name not in deleted_sample_files: if ctx_file_name.endswith( '.sample') and ctx_file_name not in sample_files: fctx = hg_util.get_file_context_from_ctx( changeset_ctx, ctx_file) if fctx in ['DELETED']: # Since the possibly future used if statement above is commented out, the # same file that was initially added will be discovered in an earlier changeset # in the change log and fall through to the else block below. In other words, # if a file named blast2go.loc.sample was added in change set 0 and then deleted # in changeset 3, the deleted file in changeset 3 will be handled here, but the # later discovered file in changeset 0 will be handled in the else block below. # In this way, the file contents will always be found for future tools even though # the file was deleted. if ctx_file_name not in deleted_sample_files: deleted_sample_files.append(ctx_file_name) else: sample_files.append(ctx_file_name) tmp_ctx_file_name = os.path.join( dir, ctx_file_name.replace('.sample', '')) with open(tmp_ctx_file_name, 'wb') as fh: fh.write(fctx.data()) return sample_files, deleted_sample_files
def get_list_of_copied_sample_files( self, repo, ctx, dir ): """ Find all sample files (files in the repository with the special .sample extension) in the reversed repository manifest up to ctx. Copy each discovered file to dir and return the list of filenames. If a .sample file was added in a changeset and then deleted in a later changeset, it will be returned in the deleted_sample_files list. The caller will set the value of app.config.tool_data_path to dir in order to load the tools and generate metadata for them. """ deleted_sample_files = [] sample_files = [] for changeset in hg_util.reversed_upper_bounded_changelog( repo, ctx ): changeset_ctx = repo.changectx( changeset ) for ctx_file in changeset_ctx.files(): ctx_file_name = basic_util.strip_path( ctx_file ) # If we decide in the future that files deleted later in the changelog should # not be used, we can use the following if statement. if ctx_file_name.endswith( '.sample' ) # and ctx_file_name not in sample_files and ctx_file_name not in deleted_sample_files: if ctx_file_name.endswith( '.sample' ) and ctx_file_name not in sample_files: fctx = hg_util.get_file_context_from_ctx( changeset_ctx, ctx_file ) if fctx in [ 'DELETED' ]: # Since the possibly future used if statement above is commented out, the # same file that was initially added will be discovered in an earlier changeset # in the change log and fall through to the else block below. In other words, # if a file named blast2go.loc.sample was added in change set 0 and then deleted # in changeset 3, the deleted file in changeset 3 will be handled here, but the # later discovered file in changeset 0 will be handled in the else block below. # In this way, the file contents will always be found for future tools even though # the file was deleted. if ctx_file_name not in deleted_sample_files: deleted_sample_files.append( ctx_file_name ) else: sample_files.append( ctx_file_name ) tmp_ctx_file_name = os.path.join( dir, ctx_file_name.replace( '.sample', '' ) ) fh = open( tmp_ctx_file_name, 'wb' ) fh.write( fctx.data() ) fh.close() return sample_files, deleted_sample_files
def build_readme_files_dict(app, repository, changeset_revision, metadata, tool_path=None): """ Return a dictionary of valid readme file name <-> readme file content pairs for all readme files defined in the received metadata. Since the received changeset_revision (which is associated with the received metadata) may not be the latest installable changeset revision, the README file contents may not be available on disk. This method is used by both Galaxy and the Tool Shed. """ if app.name == 'galaxy': can_use_disk_files = True else: latest_downloadable_changeset_revision = metadata_util.get_latest_downloadable_changeset_revision(app, repository) can_use_disk_files = changeset_revision == latest_downloadable_changeset_revision readme_files_dict = {} if metadata: if 'readme_files' in metadata: for relative_path_to_readme_file in metadata['readme_files']: readme_file_name = os.path.split(relative_path_to_readme_file)[1] if can_use_disk_files: if tool_path: full_path_to_readme_file = os.path.abspath(os.path.join(tool_path, relative_path_to_readme_file)) else: full_path_to_readme_file = os.path.abspath(relative_path_to_readme_file) text = None try: with open(full_path_to_readme_file, encoding='utf-8') as f: text = f.read() except Exception: log.exception("Error reading README file '%s' from disk", relative_path_to_readme_file) text = None if text: text_of_reasonable_length = basic_util.size_string(text) if text_of_reasonable_length.find('.. image:: ') >= 0: # Handle image display for README files that are contained in repositories in the tool shed or installed into Galaxy. try: text_of_reasonable_length = suc.set_image_paths(app, text_of_reasonable_length, encoded_repository_id=app.security.encode_id(repository.id)) except Exception: log.exception("Exception in build_readme_files_dict, so images may not be properly displayed") if readme_file_name.endswith('.rst'): text_of_reasonable_length = Template(rst_to_html(text_of_reasonable_length), input_encoding='utf-8', default_filters=['decode.utf8'], encoding_errors='replace') text_of_reasonable_length = text_of_reasonable_length.render(static_path=web.url_for('/static'), host_url=web.url_for('/', qualified=True)) text_of_reasonable_length = unicodify(text_of_reasonable_length) else: text_of_reasonable_length = basic_util.to_html_string(text_of_reasonable_length) readme_files_dict[readme_file_name] = text_of_reasonable_length else: # We must be in the tool shed and have an old changeset_revision, so we need to retrieve the file contents from the repository manifest. repo = repository.hg_repo ctx = hg_util.get_changectx_for_changeset(repo, changeset_revision) if ctx: fctx = hg_util.get_file_context_from_ctx(ctx, readme_file_name) if fctx and fctx not in ['DELETED']: try: text = unicodify(fctx.data()) readme_files_dict[readme_file_name] = basic_util.size_string(text) except Exception: log.exception("Error reading README file '%s' from repository manifest", relative_path_to_readme_file) return readme_files_dict
def build_readme_files_dict( app, repository, changeset_revision, metadata, tool_path=None ): """ Return a dictionary of valid readme file name <-> readme file content pairs for all readme files defined in the received metadata. Since the received changeset_revision (which is associated with the received metadata) may not be the latest installable changeset revision, the README file contents may not be available on disk. This method is used by both Galaxy and the Tool Shed. """ if app.name == 'galaxy': can_use_disk_files = True else: repo = hg_util.get_repo_for_repository( app, repository=repository, repo_path=None, create=False ) latest_downloadable_changeset_revision = metadata_util.get_latest_downloadable_changeset_revision( app, repository, repo ) can_use_disk_files = changeset_revision == latest_downloadable_changeset_revision readme_files_dict = {} if metadata: if 'readme_files' in metadata: for relative_path_to_readme_file in metadata[ 'readme_files' ]: readme_file_name = os.path.split( relative_path_to_readme_file )[ 1 ] if can_use_disk_files: if tool_path: full_path_to_readme_file = os.path.abspath( os.path.join( tool_path, relative_path_to_readme_file ) ) else: full_path_to_readme_file = os.path.abspath( relative_path_to_readme_file ) text = None try: f = open( full_path_to_readme_file, 'r' ) text = unicodify( f.read() ) f.close() except Exception as e: log.exception( "Error reading README file '%s' from disk", str( relative_path_to_readme_file ) ) text = None if text: text_of_reasonable_length = basic_util.size_string( text ) if text_of_reasonable_length.find( '.. image:: ' ) >= 0: # Handle image display for README files that are contained in repositories in the tool shed or installed into Galaxy. lock = threading.Lock() lock.acquire( True ) try: text_of_reasonable_length = suc.set_image_paths( app, app.security.encode_id( repository.id ), text_of_reasonable_length ) except Exception as e: log.exception( "Exception in build_readme_files_dict, so images may not be properly displayed" ) finally: lock.release() if readme_file_name.endswith( '.rst' ): text_of_reasonable_length = Template( rst_to_html( text_of_reasonable_length ), input_encoding='utf-8', output_encoding='utf-8', default_filters=[ 'decode.utf8' ], encoding_errors='replace' ) text_of_reasonable_length = text_of_reasonable_length.render( static_path=web.url_for( '/static' ), host_url=web.url_for( '/', qualified=True ) ) text_of_reasonable_length = unicodify( text_of_reasonable_length ) else: text_of_reasonable_length = basic_util.to_html_string( text_of_reasonable_length ) readme_files_dict[ readme_file_name ] = text_of_reasonable_length else: # We must be in the tool shed and have an old changeset_revision, so we need to retrieve the file contents from the repository manifest. ctx = hg_util.get_changectx_for_changeset( repo, changeset_revision ) if ctx: fctx = hg_util.get_file_context_from_ctx( ctx, readme_file_name ) if fctx and fctx not in [ 'DELETED' ]: try: text = unicodify( fctx.data() ) readme_files_dict[ readme_file_name ] = basic_util.size_string( text ) except Exception as e: log.exception( "Error reading README file '%s' from repository manifest: %s" % ( str( relative_path_to_readme_file ), str( e ) ) ) return readme_files_dict
text_of_reasonable_length = Template( rst_to_html( text_of_reasonable_length ), input_encoding='utf-8', output_encoding='utf-8', default_filters=[ 'decode.utf8' ], encoding_errors='replace' ) text_of_reasonable_length = text_of_reasonable_length.render( static_path=web.url_for( '/static' ), host_url=web.url_for( '/', qualified=True ) ) text_of_reasonable_length = unicodify( text_of_reasonable_length ) else: text_of_reasonable_length = basic_util.to_html_string( text_of_reasonable_length ) readme_files_dict[ readme_file_name ] = text_of_reasonable_length else: # We must be in the tool shed and have an old changeset_revision, so we need to retrieve the file contents from the repository manifest. ctx = hg_util.get_changectx_for_changeset( repo, changeset_revision ) if ctx: fctx = hg_util.get_file_context_from_ctx( ctx, readme_file_name ) if fctx and fctx not in [ 'DELETED' ]: try: text = unicodify( fctx.data() ) readme_files_dict[ readme_file_name ] = basic_util.size_string( text ) except Exception, e: log.exception( "Error reading README file '%s' from repository manifest: %s" % ( str( relative_path_to_readme_file ), str( e ) ) ) return readme_files_dict def get_readme_files_dict_for_display( app, tool_shed_url, repo_info_dict ): """ Return a dictionary of README files contained in the single repository being installed so they can be displayed on the tool panel section selection page. """
text_of_reasonable_length = text_of_reasonable_length.render( static_path=web.url_for('/static'), host_url=web.url_for('/', qualified=True)) text_of_reasonable_length = unicodify( text_of_reasonable_length) else: text_of_reasonable_length = basic_util.to_html_string( text_of_reasonable_length) readme_files_dict[ readme_file_name] = text_of_reasonable_length else: # We must be in the tool shed and have an old changeset_revision, so we need to retrieve the file contents from the repository manifest. ctx = hg_util.get_changectx_for_changeset( repo, changeset_revision) if ctx: fctx = hg_util.get_file_context_from_ctx( ctx, readme_file_name) if fctx and fctx not in ['DELETED']: try: text = unicodify(fctx.data()) readme_files_dict[ readme_file_name] = basic_util.size_string( text) except Exception, e: log.exception( "Error reading README file '%s' from repository manifest: %s" % \ ( str( relative_path_to_readme_file ), str( e ) ) ) return readme_files_dict def get_readme_files_dict_for_display(app, tool_shed_url, repo_info_dict): """ Return a dictionary of README files contained in the single repository being installed so they can be displayed on the tool panel section