6 new commits in galaxy-central: https://bitbucket.org/galaxy/galaxy-central/commits/be7d6bac2fb1/ Changeset: be7d6bac2fb1 User: nsoranzo Date: 2014-04-10 18:22:32 Summary: Remove unused method. Affected #: 1 file diff -r 165927888055c164e493a948e05d10c00d018458 -r be7d6bac2fb115bad61d92db0efeef24deafc73a lib/galaxy/webapps/galaxy/api/tools.py --- a/lib/galaxy/webapps/galaxy/api/tools.py +++ b/lib/galaxy/webapps/galaxy/api/tools.py @@ -152,48 +152,6 @@ # -- Helper methods -- # - def _run_tool( self, trans, tool_id, target_dataset_id, **kwargs ): - """ - Run a tool. This method serves as a general purpose way to run tools asynchronously. - """ - - # - # Set target history (the history that tool will use for outputs) using - # target dataset. If user owns dataset, put new data in original - # dataset's history; if user does not own dataset (and hence is accessing - # dataset via sharing), put new data in user's current history. - # - target_dataset = self.get_dataset( trans, target_dataset_id, check_ownership=False, check_accessible=True ) - if target_dataset.history.user == trans.user: - target_history = target_dataset.history - else: - target_history = trans.get_history( create=True ) - - # HACK: tools require unencoded parameters but kwargs are typically - # encoded, so try decoding all parameter values. - for key, value in kwargs.items(): - try: - value = trans.security.decode_id( value ) - kwargs[ key ] = value - except: - pass - - # - # Execute tool. - # - tool = trans.app.toolbox.get_tool( tool_id ) - if not tool: - return trans.app.model.Dataset.conversion_messages.NO_TOOL - - # HACK: add run button so that tool.handle_input will run tool. - kwargs['runtool_btn'] = 'Execute' - params = util.Params( kwargs, sanitize=False ) - template, vars = tool.handle_input( trans, params.__dict__, history=target_history ) - - # TODO: check for errors and ensure that output dataset is available. - output_datasets = vars[ 'out_data' ].values() - return self.add_track_async( trans, output_datasets[0].id ) - def _rerun_tool( self, trans, payload, **kwargs ): """ Rerun a tool to produce a new output dataset that corresponds to a @@ -318,7 +276,7 @@ else: # Recursive search. return_val = False - for name, value in param_dict.items(): + for value in param_dict.values(): if isinstance( value, dict ): return_val = set_value( value, group_name, group_index, param_name, param_value) if return_val: https://bitbucket.org/galaxy/galaxy-central/commits/f5901304ca0f/ Changeset: f5901304ca0f User: nsoranzo Date: 2014-04-10 18:35:18 Summary: Remove unused method. Cleanup imports. Affected #: 1 file diff -r be7d6bac2fb115bad61d92db0efeef24deafc73a -r f5901304ca0f5aaeb1c745fad0b2e1990246701c lib/galaxy/webapps/galaxy/api/folder_contents.py --- a/lib/galaxy/webapps/galaxy/api/folder_contents.py +++ b/lib/galaxy/webapps/galaxy/api/folder_contents.py @@ -1,12 +1,9 @@ """ API operations on the contents of a folder. """ -import logging, os, string, shutil, urllib, re, socket -from cgi import escape, FieldStorage -from galaxy import util, datatypes, jobs, web, util -from galaxy.web.base.controller import * -from galaxy.util.sanitize_html import sanitize_html -from galaxy.model.orm import * +import logging +from galaxy import web +from galaxy.web.base.controller import BaseAPIController, UsesLibraryMixin, UsesLibraryMixinItems log = logging.getLogger( __name__ ) @@ -70,8 +67,7 @@ trans.response.status = 400 return "Invalid folder id ( %s ) specified." % str( folder_id ) - path_to_root = [] - def build_path ( folder ): + def build_path( folder ): """ Search the path upwards recursively and load the whole route of names and ids for breadcrumb purposes. """ @@ -148,12 +144,3 @@ PUT /api/folders/{encoded_folder_id}/contents """ pass - - # TODO: Move to library_common. - def __decode_library_content_id( self, trans, content_id ): - if ( len( content_id ) % 16 == 0 ): - return 'LibraryDataset', content_id - elif ( content_id.startswith( 'F' ) ): - return 'LibraryFolder', content_id[1:] - else: - raise HTTPBadRequest( 'Malformed library content id ( %s ) specified, unable to decode.' % str( content_id ) ) https://bitbucket.org/galaxy/galaxy-central/commits/2d94528383ff/ Changeset: 2d94528383ff User: nsoranzo Date: 2014-04-10 19:56:43 Summary: PEP8 whitespace fixes. Affected #: 1 file diff -r f5901304ca0f5aaeb1c745fad0b2e1990246701c -r 2d94528383ff8115a0fa54ba48b395e5d9f2b3ed lib/galaxy/webapps/galaxy/api/group_users.py --- a/lib/galaxy/webapps/galaxy/api/group_users.py +++ b/lib/galaxy/webapps/galaxy/api/group_users.py @@ -58,7 +58,7 @@ email = user.email, url = url_for( 'group_user', group_id=group_id, id=user_id) ) # TODO Fix This if not item: - item = "user %s not in group %s" % (user.email,group.name) + item = "user %s not in group %s" % (user.email, group.name) except Exception, e: item = "Error in group_user API group %s user %s" % (group.name, user.email) log.error(item + ": %s" % str(e)) @@ -92,7 +92,7 @@ email = user.email, url = url_for( 'group_user', group_id=group_id, id=user_id) ) except Exception, e: - item = "Error in group_user API Adding user %s to group %s" % (user.email,group.name) + item = "Error in group_user API Adding user %s to group %s" % (user.email, group.name) log.error(item + ": %s" % str(e)) return item @@ -117,8 +117,8 @@ email = user.email, url = url_for( 'group_user', group_id=group_id, id=user_id) ) if not item: - item = "user %s not in group %s" % (user.email,group.name) + item = "user %s not in group %s" % (user.email, group.name) except Exception, e: - item = "Error in group_user API Removing user %s from group %s" % (user.email,group.name) + item = "Error in group_user API Removing user %s from group %s" % (user.email, group.name) log.error(item + ": %s" % str(e)) return item https://bitbucket.org/galaxy/galaxy-central/commits/e27648dda033/ Changeset: e27648dda033 User: nsoranzo Date: 2014-04-10 19:57:25 Summary: Fix a broken import. Cleanup imports. Affected #: 4 files diff -r 2d94528383ff8115a0fa54ba48b395e5d9f2b3ed -r e27648dda033d38c8db07d1353ad1193411d2751 lib/galaxy/webapps/galaxy/api/genomes.py --- a/lib/galaxy/webapps/galaxy/api/genomes.py +++ b/lib/galaxy/webapps/galaxy/api/genomes.py @@ -1,7 +1,7 @@ -from galaxy import config, tools, web, util -from galaxy.web.base.controller import BaseController, BaseAPIController -from galaxy.util.bunch import Bunch +from galaxy import web, util +from galaxy.web.base.controller import BaseAPIController from galaxy.web.framework.helpers import is_true +from galaxy.webapps.galaxy.controllers.data_admin import build_param_dict as massage def get_id( base, format ): if format: @@ -76,7 +76,6 @@ # 'download' Download and index # 'index' Index only params = util.Params( payload ) - from galaxy.web.controllers.data_admin import build_param_dict as massage paramdict = massage( params, trans ) func = params.get( 'func', 'download' ) if func == 'download': diff -r 2d94528383ff8115a0fa54ba48b395e5d9f2b3ed -r e27648dda033d38c8db07d1353ad1193411d2751 lib/galaxy/webapps/galaxy/api/histories.py --- a/lib/galaxy/webapps/galaxy/api/histories.py +++ b/lib/galaxy/webapps/galaxy/api/histories.py @@ -8,7 +8,6 @@ pkg_resources.require( "Paste" ) from galaxy import exceptions -from galaxy import web from galaxy.web import _future_expose_api as expose_api from galaxy.web import _future_expose_api_anonymous as expose_api_anonymous from galaxy.web import _future_expose_api_raw as expose_api_raw diff -r 2d94528383ff8115a0fa54ba48b395e5d9f2b3ed -r e27648dda033d38c8db07d1353ad1193411d2751 lib/galaxy/webapps/galaxy/api/history_contents.py --- a/lib/galaxy/webapps/galaxy/api/history_contents.py +++ b/lib/galaxy/webapps/galaxy/api/history_contents.py @@ -4,7 +4,6 @@ from galaxy import exceptions from galaxy import util -from galaxy import web from galaxy.web import _future_expose_api as expose_api from galaxy.web import _future_expose_api_anonymous as expose_api_anonymous @@ -18,7 +17,6 @@ from galaxy.web.base.controller import UsesTagsMixin from galaxy.web.base.controller import url_for -from galaxy.util.sanitize_html import sanitize_html from galaxy.webapps.galaxy.api import histories diff -r 2d94528383ff8115a0fa54ba48b395e5d9f2b3ed -r e27648dda033d38c8db07d1353ad1193411d2751 lib/galaxy/webapps/galaxy/api/metrics.py --- a/lib/galaxy/webapps/galaxy/api/metrics.py +++ b/lib/galaxy/webapps/galaxy/api/metrics.py @@ -7,7 +7,6 @@ import datetime from galaxy import exceptions -from galaxy import web from galaxy.web import require_admin from galaxy.web import _future_expose_api as expose_api from galaxy.web import _future_expose_api_anonymous as expose_api_anonymous https://bitbucket.org/galaxy/galaxy-central/commits/6e2eaa8626b2/ Changeset: 6e2eaa8626b2 User: nsoranzo Date: 2014-04-10 20:00:45 Summary: Fix old wiki links. Affected #: 14 files diff -r e27648dda033d38c8db07d1353ad1193411d2751 -r 6e2eaa8626b218edb9e738a3b489fede6c627b85 eggs.ini --- a/eggs.ini +++ b/eggs.ini @@ -3,7 +3,7 @@ ; ; This file is version controlled and should not be edited by hand! ; For more information, see: -; http://wiki.g2.bx.psu.edu/Admin/Config/Eggs +; https://wiki.galaxyproject.org/Admin/Config/Eggs ; [general] diff -r e27648dda033d38c8db07d1353ad1193411d2751 -r 6e2eaa8626b218edb9e738a3b489fede6c627b85 lib/galaxy/config.py --- a/lib/galaxy/config.py +++ b/lib/galaxy/config.py @@ -217,7 +217,7 @@ self.message_box_visible = kwargs.get( 'message_box_visible', False ) self.message_box_content = kwargs.get( 'message_box_content', None ) self.message_box_class = kwargs.get( 'message_box_class', 'info' ) - self.support_url = kwargs.get( 'support_url', 'http://wiki.g2.bx.psu.edu/Support' ) + self.support_url = kwargs.get( 'support_url', 'https://wiki.galaxyproject.org/Support' ) self.wiki_url = kwargs.get( 'wiki_url', 'http://wiki.galaxyproject.org/' ) self.blog_url = kwargs.get( 'blog_url', None ) self.screencasts_url = kwargs.get( 'screencasts_url', None ) diff -r e27648dda033d38c8db07d1353ad1193411d2751 -r 6e2eaa8626b218edb9e738a3b489fede6c627b85 lib/galaxy/webapps/demo_sequencer/config.py --- a/lib/galaxy/webapps/demo_sequencer/config.py +++ b/lib/galaxy/webapps/demo_sequencer/config.py @@ -50,7 +50,7 @@ self.smtp_server = kwargs.get( 'smtp_server', None ) self.log_actions = string_as_bool( kwargs.get( 'log_actions', 'False' ) ) self.brand = kwargs.get( 'brand', None ) - self.wiki_url = kwargs.get( 'wiki_url', 'http://wiki.g2.bx.psu.edu/FrontPage' ) + self.wiki_url = kwargs.get( 'wiki_url', 'https://wiki.galaxyproject.org/' ) self.blog_url = kwargs.get( 'blog_url', None ) self.screencasts_url = kwargs.get( 'screencasts_url', None ) self.log_events = False diff -r e27648dda033d38c8db07d1353ad1193411d2751 -r 6e2eaa8626b218edb9e738a3b489fede6c627b85 lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py --- a/lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py +++ b/lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py @@ -941,7 +941,7 @@ message += 'attribute value which is a directory relative to the Galaxy installation directory in order ' message += 'to automatically install tools from a Galaxy Tool Shed (e.g., the file name <b>shed_tool_conf.xml</b> ' message += 'whose <b><toolbox></b> tag is <b><toolbox tool_path="../shed_tools"></b>).<p/>See the ' - message += '<a href="http://wiki.g2.bx.psu.edu/InstallingRepositoriesToGalaxy" target="_blank">Installation ' + message += '<a href="https://wiki.galaxyproject.org/InstallingRepositoriesToGalaxy" target="_blank">Installation ' message += 'of Galaxy Tool Shed repository tools into a local Galaxy instance</a> section of the Galaxy Tool ' message += 'Shed wiki for all of the details.' return trans.show_error_message( message ) diff -r e27648dda033d38c8db07d1353ad1193411d2751 -r 6e2eaa8626b218edb9e738a3b489fede6c627b85 lib/galaxy/webapps/reports/config.py --- a/lib/galaxy/webapps/reports/config.py +++ b/lib/galaxy/webapps/reports/config.py @@ -39,7 +39,7 @@ self.message_box_visible = kwargs.get( 'message_box_visible', False ) self.message_box_content = kwargs.get( 'message_box_content', None ) self.message_box_class = kwargs.get( 'message_box_class', 'info' ) - self.wiki_url = kwargs.get( 'wiki_url', 'http://wiki.g2.bx.psu.edu/FrontPage' ) + self.wiki_url = kwargs.get( 'wiki_url', 'https://wiki.galaxyproject.org/' ) self.blog_url = kwargs.get( 'blog_url', None ) self.screencasts_url = kwargs.get( 'screencasts_url', None ) self.log_events = False diff -r e27648dda033d38c8db07d1353ad1193411d2751 -r 6e2eaa8626b218edb9e738a3b489fede6c627b85 lib/galaxy/webapps/tool_shed/config.py --- a/lib/galaxy/webapps/tool_shed/config.py +++ b/lib/galaxy/webapps/tool_shed/config.py @@ -96,8 +96,8 @@ self.message_box_visible = kwargs.get( 'message_box_visible', False ) self.message_box_content = kwargs.get( 'message_box_content', None ) self.message_box_class = kwargs.get( 'message_box_class', 'info' ) - self.support_url = kwargs.get( 'support_url', 'http://wiki.g2.bx.psu.edu/Support' ) - self.wiki_url = kwargs.get( 'wiki_url', 'http://wiki.g2.bx.psu.edu/FrontPage' ) + self.support_url = kwargs.get( 'support_url', 'https://wiki.galaxyproject.org/Support' ) + self.wiki_url = kwargs.get( 'wiki_url', 'https://wiki.galaxyproject.org/' ) self.blog_url = kwargs.get( 'blog_url', None ) self.biostar_url = kwargs.get( 'biostar_url', None ) self.screencasts_url = kwargs.get( 'screencasts_url', None ) diff -r e27648dda033d38c8db07d1353ad1193411d2751 -r 6e2eaa8626b218edb9e738a3b489fede6c627b85 scripts/dist-scramble.py --- a/scripts/dist-scramble.py +++ b/scripts/dist-scramble.py @@ -1,7 +1,7 @@ """ Scrambles eggs for distribution on multiple platforms. -(from http://wiki.g2.bx.psu.edu/Admin/Config/Eggs) +(from https://wiki.galaxyproject.org/Admin/Config/Eggs ) This is mostly designed for use by Galaxy Developers at Penn State who are building eggs for distribution via the Galaxy Eggs distribution site. dist-scramble.py uses the dist-eggs.ini config file to determine what platforms diff -r e27648dda033d38c8db07d1353ad1193411d2751 -r 6e2eaa8626b218edb9e738a3b489fede6c627b85 static/scripts/viz/phyloviz.js --- a/static/scripts/viz/phyloviz.js +++ b/static/scripts/viz/phyloviz.js @@ -737,7 +737,7 @@ $("#nodeSelectionView").show(); } }, { icon_class: 'information', title: 'Phyloviz Help', on_click: function() { - window.open('http://wiki.g2.bx.psu.edu/Learn/Visualization/PhylogeneticTree'); + window.open('https://wiki.galaxyproject.org/Learn/Visualization/PhylogeneticTree'); // https://docs.google.com/document/d/1AXFoJgEpxr21H3LICRs3EyMe1B1X_KFPouzIgrCz... } } ], diff -r e27648dda033d38c8db07d1353ad1193411d2751 -r 6e2eaa8626b218edb9e738a3b489fede6c627b85 templates/admin/tool_shed_repository/select_shed_tool_panel_config.mako --- a/templates/admin/tool_shed_repository/select_shed_tool_panel_config.mako +++ b/templates/admin/tool_shed_repository/select_shed_tool_panel_config.mako @@ -50,11 +50,11 @@ repository tools may include code that produces malicious behavior, so be aware of what you are installing. </p><p> - If you discover a repository that causes problems after installation, contact <a href="http://wiki.g2.bx.psu.edu/Support" target="_blank">Galaxy support</a>, + If you discover a repository that causes problems after installation, contact <a href="https://wiki.galaxyproject.org/Support" target="_blank">Galaxy support</a>, sending all necessary information, and appropriate action will be taken. </p><p> - <a href="http://wiki.g2.bx.psu.edu/Tool%20Shed#Contacting_the_owner_of_a_repository" target="_blank">Contact the repository owner</a> for + <a href="https://wiki.galaxyproject.org/ToolShedRepositoryFeatures#Contact_repository..." target="_blank">Contact the repository owner</a> for general questions or concerns. </p></div> diff -r e27648dda033d38c8db07d1353ad1193411d2751 -r 6e2eaa8626b218edb9e738a3b489fede6c627b85 templates/admin/tool_shed_repository/select_tool_panel_section.mako --- a/templates/admin/tool_shed_repository/select_tool_panel_section.mako +++ b/templates/admin/tool_shed_repository/select_tool_panel_section.mako @@ -50,11 +50,11 @@ repository tools may include code that produces malicious behavior, so be aware of what you are installing. </p><p> - If you discover a repository that causes problems after installation, contact <a href="http://wiki.g2.bx.psu.edu/Support" target="_blank">Galaxy support</a>, + If you discover a repository that causes problems after installation, contact <a href="https://wiki.galaxyproject.org/Support" target="_blank">Galaxy support</a>, sending all necessary information, and appropriate action will be taken. </p><p> - <a href="http://wiki.g2.bx.psu.edu/Tool%20Shed#Contacting_the_owner_of_a_repository" target="_blank">Contact the repository owner</a> for + <a href="https://wiki.galaxyproject.org/ToolShedRepositoryFeatures#Contact_repository..." target="_blank">Contact the repository owner</a> for general questions or concerns. </p></div> diff -r e27648dda033d38c8db07d1353ad1193411d2751 -r 6e2eaa8626b218edb9e738a3b489fede6c627b85 templates/user/index.mako --- a/templates/user/index.mako +++ b/templates/user/index.mako @@ -37,7 +37,7 @@ %if trans.app.config.enable_quotas: Your disk quota is: <strong>${trans.app.quota_agent.get_quota( trans.user, nice_size=True )}</strong>. %endif - Is your usage more than expected? See the <a href="http://wiki.g2.bx.psu.edu/Learn/Managing%20Datasets" target="_blank">documentation</a> for tips on how to find all of the data in your account. + Is your usage more than expected? See the <a href="https://wiki.galaxyproject.org/Learn/ManagingDatasets" target="_blank">documentation</a> for tips on how to find all of the data in your account. </p> %endif %else: diff -r e27648dda033d38c8db07d1353ad1193411d2751 -r 6e2eaa8626b218edb9e738a3b489fede6c627b85 tool_shed_wsgi.ini.sample --- a/tool_shed_wsgi.ini.sample +++ b/tool_shed_wsgi.ini.sample @@ -55,7 +55,7 @@ # User authentication can be delegated to an upstream proxy server (usually # Apache). The upstream proxy should set a REMOTE_USER header in the request. # Enabling remote user disables regular logins. For more information, see: -# http://wiki.g2.bx.psu.edu/Admin/Config/Apache%20Proxy +# https://wiki.galaxyproject.org/Admin/Config/ApacheProxy #use_remote_user = False # Configuration for debugging middleware @@ -82,7 +82,7 @@ #email_from = your_tool_shed_email@server # The URL linked by the "Support" link in the "Help" menu. -#support_url = http://wiki.g2.bx.psu.edu/Support +#support_url = https://wiki.galaxyproject.org/Support # Write thread status periodically to 'heartbeat.log' (careful, uses disk space rapidly!) ## use_heartbeat = True diff -r e27648dda033d38c8db07d1353ad1193411d2751 -r 6e2eaa8626b218edb9e738a3b489fede6c627b85 tools/data_source/microbial_import.xml --- a/tools/data_source/microbial_import.xml +++ b/tools/data_source/microbial_import.xml @@ -109,7 +109,6 @@ **Note:** Having trouble locating your organism? Click here_ for a list of available species and their location. -.. _here: http://wiki.g2.bx.psu.edu/Main/Data%20Libraries/Microbes - +.. _here: https://wiki.galaxyproject.org/Main/Data%20Libraries/Microbes </help></tool> diff -r e27648dda033d38c8db07d1353ad1193411d2751 -r 6e2eaa8626b218edb9e738a3b489fede6c627b85 tools/next_gen_conversion/fastq_gen_conv.xml --- a/tools/next_gen_conversion/fastq_gen_conv.xml +++ b/tools/next_gen_conversion/fastq_gen_conv.xml @@ -75,7 +75,7 @@ A good description of fastq datasets can be found `here`__, while a description of Galaxy's fastq "logic" can be found `here`__. Because ranges of quality values within different types of fastq datasets overlap it very difficult to detect them automatically. This tool supports conversion of two commonly found types (Solexa/Illumina 1.0 and Illumina 1.3+) into fastq Sanger. .. __: http://en.wikipedia.org/wiki/FASTQ_format - .. __: http://wiki.g2.bx.psu.edu/Admin/NGS%20Local%20Setup + .. __: https://wiki.galaxyproject.org/Learn/Datatypes#Fastq .. class:: warningmark https://bitbucket.org/galaxy/galaxy-central/commits/2c6c7971d666/ Changeset: 2c6c7971d666 User: nsoranzo Date: 2014-04-11 12:00:39 Summary: Merge galaxy/galaxy-central default branch. Affected #: 77 files diff -r 6e2eaa8626b218edb9e738a3b489fede6c627b85 -r 2c6c7971d666166eb41ea4bd5838f31f3caabd41 lib/galaxy/exceptions/__init__.py --- a/lib/galaxy/exceptions/__init__.py +++ b/lib/galaxy/exceptions/__init__.py @@ -60,6 +60,10 @@ status_code = 400 err_code = error_codes.MALFORMED_ID +class UnknownContentsType( MessageException ): + status_code = 400 + err_code = error_codes.UNKNOWN_CONTENTS_TYPE + class RequestParameterMissingException( MessageException ): status_code = 400 err_code = error_codes.USER_REQUEST_MISSING_PARAMETER diff -r 6e2eaa8626b218edb9e738a3b489fede6c627b85 -r 2c6c7971d666166eb41ea4bd5838f31f3caabd41 lib/galaxy/exceptions/error_codes.json --- a/lib/galaxy/exceptions/error_codes.json +++ b/lib/galaxy/exceptions/error_codes.json @@ -50,6 +50,11 @@ "message": "The id of the resource is malformed." }, { + "name": "UNKNOWN_CONTENTS_TYPE", + "code": 400010, + "message": "The request contains unknown type of contents." + }, + { "name": "USER_NO_API_KEY", "code": 403001, "message": "API authentication required for this request" diff -r 6e2eaa8626b218edb9e738a3b489fede6c627b85 -r 2c6c7971d666166eb41ea4bd5838f31f3caabd41 lib/galaxy/model/tool_shed_install/__init__.py --- a/lib/galaxy/model/tool_shed_install/__init__.py +++ b/lib/galaxy/model/tool_shed_install/__init__.py @@ -4,6 +4,7 @@ from galaxy.util.bunch import Bunch from galaxy.util import asbool from tool_shed.util import common_util +from urlparse import urljoin log = logging.getLogger( __name__ ) @@ -73,6 +74,12 @@ def can_reinstall_or_activate( self ): return self.deleted + def get_sharable_url( self, app ): + tool_shed_url = common_util.get_tool_shed_url_from_tool_shed_registry( app, self.tool_shed ) + if tool_shed_url: + return urljoin( tool_shed_url, 'view/%s/%s' % ( self.owner, self.name ) ) + return tool_shed_url + def get_shed_config_filename( self ): shed_config_filename = None if self.metadata: diff -r 6e2eaa8626b218edb9e738a3b489fede6c627b85 -r 2c6c7971d666166eb41ea4bd5838f31f3caabd41 lib/galaxy/tools/errors.py --- a/lib/galaxy/tools/errors.py +++ b/lib/galaxy/tools/errors.py @@ -28,7 +28,9 @@ ----------------------------------------------------------------------------- job id: ${job_id} tool id: ${job_tool_id} +tool version: ${tool_version} job pid or drm id: ${job_runner_external_id} +job tool version: ${job_tool_version} ----------------------------------------------------------------------------- job command line: ${job_command_line} @@ -86,7 +88,9 @@ history_item_name=hda.get_display_name(), history_view_link=history_view_link, job_id=job.id, + tool_version=job.tool_version, job_tool_id=job.tool_id, + job_tool_version=hda.tool_version, job_runner_external_id=job.job_runner_external_id, job_command_line=job.command_line, job_stderr=util.unicodify( job.stderr ), diff -r 6e2eaa8626b218edb9e738a3b489fede6c627b85 -r 2c6c7971d666166eb41ea4bd5838f31f3caabd41 lib/galaxy/tools/parameters/basic.py --- a/lib/galaxy/tools/parameters/basic.py +++ b/lib/galaxy/tools/parameters/basic.py @@ -979,7 +979,7 @@ if option[2]: # Found selected option. value = option[1] - d[ 'value' ] = options + d[ 'value' ] = value return d diff -r 6e2eaa8626b218edb9e738a3b489fede6c627b85 -r 2c6c7971d666166eb41ea4bd5838f31f3caabd41 lib/galaxy/util/biostar.py --- a/lib/galaxy/util/biostar.py +++ b/lib/galaxy/util/biostar.py @@ -86,7 +86,14 @@ def populate_tool_payload( payload=None, tool=None ): payload = populate_tag_payload( payload=payload, tool=tool ) payload[ 'title' ] = 'Need help with "%s" tool' % ( tool.name ) - payload[ 'content' ] = '<br /><hr /><p>Tool name: %s</br>Tool version: %s</br>Tool ID: %s</p>' % ( tool.name, tool.version, tool.id ) + tool_url = None + if tool.tool_shed_repository: + tool_url = tool.tool_shed_repository.get_sharable_url( tool.app ) + if tool_url: + tool_url = '</br>ToolShed URL: <a href="%s">%s</a>' % ( tool_url, tool_url ) + if not tool_url: + tool_url = '' + payload[ 'content' ] = '<br /><hr /><p>Tool name: %s</br>Tool version: %s</br>Tool ID: %s%s</p></br>' % ( tool.name, tool.version, tool.id, tool_url ) return payload def determine_cookie_domain( galaxy_hostname, biostar_hostname ): diff -r 6e2eaa8626b218edb9e738a3b489fede6c627b85 -r 2c6c7971d666166eb41ea4bd5838f31f3caabd41 lib/galaxy/webapps/galaxy/api/folder_contents.py --- a/lib/galaxy/webapps/galaxy/api/folder_contents.py +++ b/lib/galaxy/webapps/galaxy/api/folder_contents.py @@ -1,10 +1,15 @@ """ -API operations on the contents of a folder. +API operations on the contents of a library folder. """ -import logging from galaxy import web +from galaxy import exceptions +from galaxy.web import _future_expose_api as expose_api +from galaxy.web import _future_expose_api_anonymous as expose_api_anonymous +from sqlalchemy.orm.exc import MultipleResultsFound +from sqlalchemy.orm.exc import NoResultFound from galaxy.web.base.controller import BaseAPIController, UsesLibraryMixin, UsesLibraryMixinItems +import logging log = logging.getLogger( __name__ ) class FolderContentsController( BaseAPIController, UsesLibraryMixin, UsesLibraryMixinItems ): @@ -12,7 +17,111 @@ Class controls retrieval, creation and updating of folder contents. """ - def load_folder_contents( self, trans, folder ): + @expose_api_anonymous + def index( self, trans, folder_id, **kwd ): + """ + GET /api/folders/{encoded_folder_id}/contents + Displays a collection (list) of a folder's contents (files and folders). + Encoded folder ID is prepended with 'F' if it is a folder as opposed to a data set which does not have it. + Full path is provided in response as a separate object providing data for breadcrumb path building. + """ + + if ( len( folder_id ) == 17 and folder_id.startswith( 'F' ) ): + try: + decoded_folder_id = trans.security.decode_id( folder_id[ 1: ] ) + except TypeError: + raise exceptions.MalformedId( 'Malformed folder id ( %s ) specified, unable to decode.' % str( folder_id ) ) + else: + raise exceptions.MalformedId( 'Malformed folder id ( %s ) specified, unable to decode.' % str( folder_id ) ) + + try: + folder = trans.sa_session.query( trans.app.model.LibraryFolder ).filter( trans.app.model.LibraryFolder.table.c.id == decoded_folder_id ).one() + except MultipleResultsFound: + raise exceptions.InconsistentDatabase( 'Multiple folders with same id found.' ) + except NoResultFound: + raise exceptions.ObjectNotFound( 'Folder with the id provided ( %s ) was not found' % str( folder_id ) ) + except Exception: + raise exceptions.InternalServerError( 'Error loading from the database.' ) + + current_user_roles = trans.get_current_user_roles() + can_add_library_item = trans.user_is_admin() or trans.app.security_agent.can_add_library_item( current_user_roles, folder ) + + if not ( trans.user_is_admin() or trans.app.security_agent.can_access_library_item( current_user_roles, folder, trans.user ) ): + if folder.parent_id == None: + try: + library = trans.sa_session.query( trans.app.model.Library ).filter( trans.app.model.Library.table.c.root_folder_id == decoded_folder_id ).one() + except Exception: + raise exceptions.InternalServerError( 'Error loading from the database.' ) + if trans.app.security_agent.library_is_public( library, contents=False ): + pass + else: + if trans.user: + log.warning( "SECURITY: User (id: %s) without proper access rights is trying to load folder with ID of %s" % ( trans.user.id, decoded_folder_id ) ) + else: + log.warning( "SECURITY: Anonymous user without proper access rights is trying to load folder with ID of %s" % ( decoded_folder_id ) ) + raise exceptions.ObjectNotFound( 'Folder with the id provided ( %s ) was not found' % str( folder_id ) ) + else: + if trans.user: + log.warning( "SECURITY: User (id: %s) without proper access rights is trying to load folder with ID of %s" % ( trans.user.id, decoded_folder_id ) ) + else: + log.warning( "SECURITY: Anonymous user without proper access rights is trying to load folder with ID of %s" % ( decoded_folder_id ) ) + raise exceptions.ObjectNotFound( 'Folder with the id provided ( %s ) was not found' % str( folder_id ) ) + + def build_path( folder ): + """ + Search the path upwards recursively and load the whole route of names and ids for breadcrumb building purposes. + """ + path_to_root = [] + # We are almost in root + if folder.parent_id is None: + path_to_root.append( ( 'F' + trans.security.encode_id( folder.id ), folder.name ) ) + else: + # We add the current folder and traverse up one folder. + path_to_root.append( ( 'F' + trans.security.encode_id( folder.id ), folder.name ) ) + upper_folder = trans.sa_session.query( trans.app.model.LibraryFolder ).get( folder.parent_id ) + path_to_root.extend( build_path( upper_folder ) ) + return path_to_root + + # Return the reversed path so it starts with the library node. + full_path = build_path( folder )[::-1] + + folder_contents = [] + time_updated = '' + time_created = '' + # Go through every accessible item in the folder and include its meta-data. + for content_item in self._load_folder_contents( trans, folder ): + if trans.app.security_agent.can_access_library_item( current_user_roles, content_item, trans.user ): + return_item = {} + encoded_id = trans.security.encode_id( content_item.id ) + time_updated = content_item.update_time.strftime( "%Y-%m-%d %I:%M %p" ) + time_created = content_item.create_time.strftime( "%Y-%m-%d %I:%M %p" ) + + # For folder return also hierarchy values + if content_item.api_type == 'folder': + encoded_id = 'F' + encoded_id + return_item.update ( dict ( item_count = content_item.item_count ) ) + + if content_item.api_type == 'file': + library_dataset_dict = content_item.to_dict() + library_dataset_dict['data_type'] + library_dataset_dict['file_size'] + library_dataset_dict['date_uploaded'] + return_item.update ( dict ( data_type = library_dataset_dict['data_type'], + file_size = library_dataset_dict['file_size'], + date_uploaded = library_dataset_dict['date_uploaded'] ) ) + + # For every item return also the default meta-data + return_item.update( dict( id = encoded_id, + type = content_item.api_type, + name = content_item.name, + time_updated = time_updated, + time_created = time_created + ) ) + folder_contents.append( return_item ) + + return { 'metadata' : { 'full_path' : full_path, 'can_add_library_item': can_add_library_item }, 'folder_contents' : folder_contents } + + def _load_folder_contents( self, trans, folder ): """ Loads all contents of the folder (folders and data sets) but only in the first level. """ @@ -34,100 +143,11 @@ return content_items @web.expose_api - def index( self, trans, folder_id, **kwd ): - """ - GET /api/folders/{encoded_folder_id}/contents - Displays a collection (list) of a folder's contents (files and folders). - Encoded folder ID is prepended with 'F' if it is a folder as opposed to a data set which does not have it. - Full path is provided as a separate object in response providing data for breadcrumb path building. - """ - folder_container = [] - current_user_roles = trans.get_current_user_roles() - - if ( folder_id.startswith( 'F' ) ): - try: - decoded_folder_id = trans.security.decode_id( folder_id[1:] ) - except TypeError: - trans.response.status = 400 - return "Malformed folder id ( %s ) specified, unable to decode." % str( folder_id ) - - try: - folder = trans.sa_session.query( trans.app.model.LibraryFolder ).get( decoded_folder_id ) - except: - folder = None - log.error( "FolderContentsController.index: Unable to retrieve folder with ID: %s" % folder_id ) - - # We didn't find the folder or user does not have an access to it. - if not folder: - trans.response.status = 400 - return "Invalid folder id ( %s ) specified." % str( folder_id ) - - if not ( trans.user_is_admin() or trans.app.security_agent.can_access_library_item( current_user_roles, folder, trans.user ) ): - log.warning( "SECURITY: User (id: %s) without proper access rights is trying to load folder with ID of %s" % ( trans.user.id, folder.id ) ) - trans.response.status = 400 - return "Invalid folder id ( %s ) specified." % str( folder_id ) - - def build_path( folder ): - """ - Search the path upwards recursively and load the whole route of names and ids for breadcrumb purposes. - """ - path_to_root = [] - # We are almost in root - if folder.parent_id is None: - path_to_root.append( ( 'F' + trans.security.encode_id( folder.id ), folder.name ) ) - else: - # We add the current folder and traverse up one folder. - path_to_root.append( ( 'F' + trans.security.encode_id( folder.id ), folder.name ) ) - upper_folder = trans.sa_session.query( trans.app.model.LibraryFolder ).get( folder.parent_id ) - path_to_root.extend( build_path( upper_folder ) ) - return path_to_root - - # Return the reversed path so it starts with the library node. - full_path = build_path( folder )[::-1] - folder_container.append( dict( full_path = full_path ) ) - - folder_contents = [] - time_updated = '' - time_created = '' - # Go through every item in the folder and include its meta-data. - for content_item in self.load_folder_contents( trans, folder ): - return_item = {} - encoded_id = trans.security.encode_id( content_item.id ) - time_updated = content_item.update_time.strftime( "%Y-%m-%d %I:%M %p" ) - time_created = content_item.create_time.strftime( "%Y-%m-%d %I:%M %p" ) - - # For folder return also hierarchy values - if content_item.api_type == 'folder': - encoded_id = 'F' + encoded_id - return_item.update ( dict ( item_count = content_item.item_count ) ) - - if content_item.api_type == 'file': - library_dataset_dict = content_item.to_dict() - library_dataset_dict['data_type'] - library_dataset_dict['file_size'] - library_dataset_dict['date_uploaded'] - return_item.update ( dict ( data_type = library_dataset_dict['data_type'], - file_size = library_dataset_dict['file_size'], - date_uploaded = library_dataset_dict['date_uploaded'] ) ) - - # For every item return also the default meta-data - return_item.update( dict( id = encoded_id, - type = content_item.api_type, - name = content_item.name, - time_updated = time_updated, - time_created = time_created - ) ) - folder_contents.append( return_item ) - # Put the data in the container - folder_container.append( dict( folder_contents = folder_contents ) ) - return folder_container - - @web.expose_api def show( self, trans, id, library_id, **kwd ): """ GET /api/folders/{encoded_folder_id}/ """ - pass + raise exceptions.NotImplemented( 'Showing the library folder content is not implemented.' ) @web.expose_api def create( self, trans, library_id, payload, **kwd ): @@ -136,11 +156,11 @@ Creates a new folder. This should be superseded by the LibraryController. """ - pass + raise exceptions.NotImplemented( 'Creating the library folder content is not implemented.' ) @web.expose_api def update( self, trans, id, library_id, payload, **kwd ): """ PUT /api/folders/{encoded_folder_id}/contents """ - pass + raise exceptions.NotImplemented( 'Updating the library folder content is not implemented.' ) diff -r 6e2eaa8626b218edb9e738a3b489fede6c627b85 -r 2c6c7971d666166eb41ea4bd5838f31f3caabd41 lib/galaxy/webapps/galaxy/api/folders.py --- a/lib/galaxy/webapps/galaxy/api/folders.py +++ b/lib/galaxy/webapps/galaxy/api/folders.py @@ -1,14 +1,17 @@ """ -API operations on folders +API operations on library folders """ -import logging, os, string, shutil, urllib, re, socket, traceback +import os, string, shutil, urllib, re, socket, traceback from galaxy import datatypes, jobs, web, security +from galaxy.web import _future_expose_api as expose_api +from galaxy.web import _future_expose_api_anonymous as expose_api_anonymous from galaxy.web.base.controller import BaseAPIController,UsesLibraryMixin,UsesLibraryMixinItems from galaxy.util.sanitize_html import sanitize_html from cgi import escape, FieldStorage from paste.httpexceptions import HTTPBadRequest +import logging log = logging.getLogger( __name__ ) class FoldersController( BaseAPIController, UsesLibraryMixin, UsesLibraryMixinItems ): @@ -18,9 +21,9 @@ """ GET /api/folders/ This would normally display a list of folders. However, that would - be across multiple libraries, so it's not implemented yet. + be across multiple libraries, so it's not implemented. """ - pass + raise exceptions.NotImplemented( 'Listing all accessible library folders is not implemented.' ) @web.expose_api def show( self, trans, id, **kwd ): diff -r 6e2eaa8626b218edb9e738a3b489fede6c627b85 -r 2c6c7971d666166eb41ea4bd5838f31f3caabd41 lib/galaxy/webapps/galaxy/api/history_contents.py --- a/lib/galaxy/webapps/galaxy/api/history_contents.py +++ b/lib/galaxy/webapps/galaxy/api/history_contents.py @@ -188,8 +188,7 @@ hda_dict[ 'display_apps' ] = self.get_display_apps( trans, hda ) return hda_dict - #TODO: allow anon users to copy hdas, ldas - @expose_api + @expose_api_anonymous def create( self, trans, history_id, payload, **kwd ): """ create( self, trans, history_id, payload, **kwd ) @@ -434,10 +433,7 @@ return validated_payload def __handle_unknown_contents_type( self, trans, contents_type ): - # TODO: raise a message exception instead of setting status and returning dict. - trans.response.status = 400 - return { 'error': 'Unknown contents type %s' % type } - + raise exceptions.UnknownContentsType('Unknown contents type: %s' % type) class HDAManager( object ): diff -r 6e2eaa8626b218edb9e738a3b489fede6c627b85 -r 2c6c7971d666166eb41ea4bd5838f31f3caabd41 lib/galaxy/webapps/galaxy/api/lda_datasets.py --- a/lib/galaxy/webapps/galaxy/api/lda_datasets.py +++ b/lib/galaxy/webapps/galaxy/api/lda_datasets.py @@ -12,9 +12,13 @@ import urllib import urllib2 import zipfile -from paste.httpexceptions import HTTPBadRequest -from galaxy import util, web -from galaxy.exceptions import ItemAccessibilityException, MessageException, ItemDeletionException, ObjectNotFound +from galaxy import exceptions +from galaxy.web import _future_expose_api as expose_api +from galaxy.web import _future_expose_api_anonymous as expose_api_anonymous +# from paste.httpexceptions import HTTPBadRequest +from galaxy import util +from galaxy import web +# from galaxy.exceptions import ItemAccessibilityException, MessageException, ItemDeletionException, ObjectNotFound from galaxy.security import Action from galaxy.util.streamball import StreamBall from galaxy.web.base.controller import BaseAPIController, UsesVisualizationMixin @@ -24,7 +28,7 @@ class LibraryDatasetsController( BaseAPIController, UsesVisualizationMixin ): - @web.expose_api + @expose_api_anonymous def show( self, trans, id, **kwd ): """ show( self, trans, id, **kwd ) @@ -41,19 +45,20 @@ try: dataset = self.get_library_dataset( trans, id = id, check_ownership=False, check_accessible=True ) except Exception, e: - trans.response.status = 500 - return str( e ) - try: - rval = dataset.to_dict() - except Exception, e: - rval = "Error in dataset API at listing contents: " + str( e ) - log.error( rval + ": %s" % str(e), exc_info=True ) - trans.response.status = 500 - return "Error in dataset API at listing contents: " + str( e ) + raise exceptions.ObjectNotFound( 'Requested dataset was not found.' ) + # trans.response.status = 500 + # return str( e ) + # try: + rval = dataset.to_dict() + # except Exception, e: + # rval = "Error in dataset API at listing contents: " + str( e ) + # log.error( rval + ": %s" % str(e), exc_info=True ) + # trans.response.status = 500 + # return "Error in dataset API at listing contents: " + str( e ) rval['id'] = trans.security.encode_id(rval['id']); rval['ldda_id'] = trans.security.encode_id(rval['ldda_id']); - rval['folder_id'] = 'f' + trans.security.encode_id(rval['folder_id']) + rval['folder_id'] = 'F' + trans.security.encode_id(rval['folder_id']) return rval @web.expose diff -r 6e2eaa8626b218edb9e738a3b489fede6c627b85 -r 2c6c7971d666166eb41ea4bd5838f31f3caabd41 lib/galaxy/webapps/galaxy/api/libraries.py --- a/lib/galaxy/webapps/galaxy/api/libraries.py +++ b/lib/galaxy/webapps/galaxy/api/libraries.py @@ -7,7 +7,7 @@ from galaxy.web import _future_expose_api as expose_api from galaxy.web import _future_expose_api_anonymous as expose_api_anonymous from galaxy.model.orm import and_, not_, or_ -from galaxy.web.base.controller import BaseAPIController, url_for +from galaxy.web.base.controller import BaseAPIController import logging log = logging.getLogger( __name__ ) @@ -61,7 +61,6 @@ if trans.app.security_agent.library_is_public( library, contents=False ): item[ 'public' ] = True current_user_roles = trans.get_current_user_roles() - # can_user_add = trans.app.security_agent.can_add_library_item( current_user_roles, library.root_folder ) if not trans.user_is_admin(): item['can_user_add'] = trans.app.security_agent.can_add_library_item( current_user_roles, library ) item['can_user_modify'] = trans.app.security_agent.can_modify_library_item( current_user_roles, library ) @@ -98,7 +97,7 @@ deleted = util.string_as_bool( deleted ) try: decoded_library_id = trans.security.decode_id( library_id ) - except Exception: + except TypeError: raise exceptions.MalformedId( 'Malformed library id ( %s ) specified, unable to decode.' % id ) try: library = trans.sa_session.query( trans.app.model.Library ).get( decoded_library_id ) @@ -144,7 +143,14 @@ library.root_folder = root_folder trans.sa_session.add_all( ( library, root_folder ) ) trans.sa_session.flush() - return library.to_dict( view='element', value_mapper={ 'id' : trans.security.encode_id , 'root_folder_id' : trans.security.encode_id } ) + + item = library.to_dict( view='element', value_mapper={ 'id' : trans.security.encode_id , 'root_folder_id' : trans.security.encode_id } ) + item['can_user_add'] = True + item['can_user_modify'] = True + item['can_user_manage'] = True + if trans.app.security_agent.library_is_public( library, contents=False ): + item[ 'public' ] = True + return item @expose_api def update( self, trans, id, **kwd ): diff -r 6e2eaa8626b218edb9e738a3b489fede6c627b85 -r 2c6c7971d666166eb41ea4bd5838f31f3caabd41 lib/galaxy/webapps/galaxy/api/library_contents.py --- a/lib/galaxy/webapps/galaxy/api/library_contents.py +++ b/lib/galaxy/webapps/galaxy/api/library_contents.py @@ -17,8 +17,7 @@ log = logging.getLogger( __name__ ) -class LibraryContentsController( BaseAPIController, UsesLibraryMixin, UsesLibraryMixinItems, - UsesHistoryDatasetAssociationMixin ): +class LibraryContentsController( BaseAPIController, UsesLibraryMixin, UsesLibraryMixinItems, UsesHistoryDatasetAssociationMixin ): @expose_api def index( self, trans, library_id, **kwd ): diff -r 6e2eaa8626b218edb9e738a3b489fede6c627b85 -r 2c6c7971d666166eb41ea4bd5838f31f3caabd41 lib/galaxy/webapps/galaxy/buildapp.py --- a/lib/galaxy/webapps/galaxy/buildapp.py +++ b/lib/galaxy/webapps/galaxy/buildapp.py @@ -284,7 +284,7 @@ # ==================== # Handle displaying tool help images and README file images contained in repositories installed from the tool shed. - webapp.add_route( '/admin_toolshed/static/images/:repository_id/:image_file', + webapp.add_route( '/admin_toolshed/static/images/:repository_id/{image_file:.+?}', controller='admin_toolshed', action='display_image_in_repository', repository_id=None, diff -r 6e2eaa8626b218edb9e738a3b489fede6c627b85 -r 2c6c7971d666166eb41ea4bd5838f31f3caabd41 lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py --- a/lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py +++ b/lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py @@ -16,6 +16,7 @@ from tool_shed.util import data_manager_util from tool_shed.util import datatype_util from tool_shed.util import encoding_util +from tool_shed.util import hg_util from tool_shed.util import metadata_util from tool_shed.util import readme_util from tool_shed.util import repository_dependency_util @@ -1851,7 +1852,7 @@ repo_files_dir = os.path.abspath( os.path.join( tool_path, relative_install_dir, name ) ) else: repo_files_dir = os.path.abspath( os.path.join( relative_install_dir, name ) ) - repo = hg.repository( suc.get_configured_ui(), path=repo_files_dir ) + repo = hg.repository( hg_util.get_configured_ui(), path=repo_files_dir ) repository_clone_url = os.path.join( tool_shed_url, 'repos', owner, name ) repository_util.pull_repository( repo, repository_clone_url, latest_ctx_rev ) suc.update_repository( repo, latest_ctx_rev ) diff -r 6e2eaa8626b218edb9e738a3b489fede6c627b85 -r 2c6c7971d666166eb41ea4bd5838f31f3caabd41 lib/galaxy/webapps/tool_shed/api/repositories.py --- a/lib/galaxy/webapps/tool_shed/api/repositories.py +++ b/lib/galaxy/webapps/tool_shed/api/repositories.py @@ -13,6 +13,7 @@ import tool_shed.util.shed_util_common as suc from tool_shed.galaxy_install import repository_util from tool_shed.util import encoding_util +from tool_shed.util import hg_util from tool_shed.util import import_util from tool_shed.util import metadata_util from tool_shed.util import repository_maintenance_util @@ -49,7 +50,7 @@ log.debug( error_message ) return [] repo_dir = repository.repo_path( trans.app ) - repo = hg.repository( suc.get_configured_ui(), repo_dir ) + repo = hg.repository( hg_util.get_configured_ui(), repo_dir ) ordered_installable_revisions = suc.get_ordered_metadata_changeset_revisions( repository, repo, downloadable=True ) return ordered_installable_revisions else: @@ -133,7 +134,7 @@ # 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 ) + repo = hg.repository( hg_util.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, diff -r 6e2eaa8626b218edb9e738a3b489fede6c627b85 -r 2c6c7971d666166eb41ea4bd5838f31f3caabd41 lib/galaxy/webapps/tool_shed/api/repository_revisions.py --- a/lib/galaxy/webapps/tool_shed/api/repository_revisions.py +++ b/lib/galaxy/webapps/tool_shed/api/repository_revisions.py @@ -6,6 +6,7 @@ from galaxy.model.orm import and_, not_, select from galaxy.web.base.controller import BaseAPIController, HTTPBadRequest from tool_shed.util import export_util +from tool_shed.util import hg_util import tool_shed.util.shed_util_common as suc from galaxy import eggs @@ -168,7 +169,7 @@ # 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 ) + repo = hg.repository( hg_util.get_configured_ui(), repo_dir ) new_changeset_revision = suc.get_next_downloadable_changeset_revision( repository_dependency, repo, changeset_revision ) diff -r 6e2eaa8626b218edb9e738a3b489fede6c627b85 -r 2c6c7971d666166eb41ea4bd5838f31f3caabd41 lib/galaxy/webapps/tool_shed/controllers/repository.py --- a/lib/galaxy/webapps/tool_shed/controllers/repository.py +++ b/lib/galaxy/webapps/tool_shed/controllers/repository.py @@ -19,6 +19,7 @@ from tool_shed.util import container_util from tool_shed.util import encoding_util from tool_shed.util import export_util +from tool_shed.util import hg_util from tool_shed.util import import_util from tool_shed.util import metadata_util from tool_shed.util import readme_util @@ -719,7 +720,7 @@ status = kwd.get( 'status', 'done' ) commit_message = kwd.get( 'commit_message', 'Deleted selected files' ) repository = suc.get_repository_in_tool_shed( trans, id ) - repo = hg.repository( suc.get_configured_ui(), repository.repo_path( trans.app ) ) + repo = hg.repository( hg_util.get_configured_ui(), repository.repo_path( trans.app ) ) # Update repository files for browsing. suc.update_repository( repo ) changeset_revision = repository.tip( trans.app ) @@ -891,9 +892,9 @@ changeset_revision = kwd.get( 'changeset_revision', None ) repository = suc.get_repository_by_name_and_owner( trans.app, name, owner ) repo_dir = repository.repo_path( trans.app ) - repo = hg.repository( suc.get_configured_ui(), repo_dir ) + repo = hg.repository( hg_util.get_configured_ui(), repo_dir ) # Default to the current changeset revision. - update_to_ctx = suc.get_changectx_for_changeset( repo, changeset_revision ) + update_to_ctx = hg_util.get_changectx_for_changeset( repo, changeset_revision ) latest_changeset_revision = changeset_revision from_update_manager = kwd.get( 'from_update_manager', False ) if from_update_manager: @@ -937,10 +938,10 @@ update_to_changeset_hash = None for changeset in repo.changelog: changeset_hash = str( repo.changectx( changeset ) ) - ctx = suc.get_changectx_for_changeset( repo, changeset_hash ) + ctx = hg_util.get_changectx_for_changeset( repo, changeset_hash ) if update_to_changeset_hash: if changeset_hash == repository.tip( trans.app ): - update_to_ctx = suc.get_changectx_for_changeset( repo, changeset_hash ) + update_to_ctx = hg_util.get_changectx_for_changeset( repo, changeset_hash ) latest_changeset_revision = changeset_hash break else: @@ -949,7 +950,7 @@ changeset_hash ) if repository_metadata: # We found a RepositoryMetadata record. - update_to_ctx = suc.get_changectx_for_changeset( repo, changeset_hash ) + update_to_ctx = hg_util.get_changectx_for_changeset( repo, changeset_hash ) latest_changeset_revision = changeset_hash break else: @@ -1213,7 +1214,7 @@ else: containers_dict = None export_repository_dependencies_check_box = None - revision_label = suc.get_revision_label( trans, repository, changeset_revision, include_date=True ) + revision_label = hg_util.get_revision_label( trans, repository, changeset_revision, include_date=True ) return trans.fill_template( "/webapps/tool_shed/repository/export_repository.mako", changeset_revision=changeset_revision, containers_dict=containers_dict, @@ -1466,9 +1467,9 @@ has_repository_dependencies_only_if_compiling_contained_td = has_galaxy_utilities_dict[ 'has_repository_dependencies_only_if_compiling_contained_td' ] includes_workflows = has_galaxy_utilities_dict[ 'includes_workflows' ] repo_dir = repository.repo_path( trans.app ) - repo = hg.repository( suc.get_configured_ui(), repo_dir ) + repo = hg.repository( hg_util.get_configured_ui(), repo_dir ) # Default to the received changeset revision and ctx_rev. - update_to_ctx = suc.get_changectx_for_changeset( repo, changeset_revision ) + update_to_ctx = hg_util.get_changectx_for_changeset( repo, changeset_revision ) ctx_rev = str( update_to_ctx.rev() ) latest_changeset_revision = changeset_revision update_dict = dict( changeset_revision=changeset_revision, @@ -1497,7 +1498,7 @@ has_repository_dependencies = False has_repository_dependencies_only_if_compiling_contained_td = False changeset_hash = str( repo.changectx( changeset ) ) - ctx = suc.get_changectx_for_changeset( repo, changeset_hash ) + ctx = hg_util.get_changectx_for_changeset( repo, changeset_hash ) if update_to_changeset_hash: update_to_repository_metadata = suc.get_repository_metadata_by_changeset_revision( trans, trans.security.encode_id( repository.id ), @@ -1515,10 +1516,10 @@ # We found a RepositoryMetadata record. if changeset_hash == repository.tip( trans.app ): # The current ctx is the repository tip, so use it. - update_to_ctx = suc.get_changectx_for_changeset( repo, changeset_hash ) + update_to_ctx = hg_util.get_changectx_for_changeset( repo, changeset_hash ) latest_changeset_revision = changeset_hash else: - update_to_ctx = suc.get_changectx_for_changeset( repo, update_to_changeset_hash ) + update_to_ctx = hg_util.get_changectx_for_changeset( repo, update_to_changeset_hash ) latest_changeset_revision = update_to_changeset_hash break elif not update_to_changeset_hash and changeset_hash == changeset_revision: @@ -1544,8 +1545,8 @@ changeset_revision = kwd[ 'changeset_revision' ] repository = suc.get_repository_by_name_and_owner( trans.app, repository_name, repository_owner ) repo_dir = repository.repo_path( trans.app ) - repo = hg.repository( suc.get_configured_ui(), repo_dir ) - ctx = suc.get_changectx_for_changeset( repo, changeset_revision ) + repo = hg.repository( hg_util.get_configured_ui(), repo_dir ) + ctx = hg_util.get_changectx_for_changeset( repo, changeset_revision ) if ctx: return str( ctx.rev() ) return '' @@ -1560,8 +1561,8 @@ def get_file_from_changeset_revision( self, repo_files_dir, changeset_revision, file_name, dir ): """Return file_name from the received changeset_revision of the repository manifest.""" stripped_file_name = suc.strip_path( file_name ) - repo = hg.repository( suc.get_configured_ui(), repo_files_dir ) - ctx = suc.get_changectx_for_changeset( repo, changeset_revision ) + repo = hg.repository( hg_util.get_configured_ui(), repo_files_dir ) + ctx = hg_util.get_changectx_for_changeset( repo, changeset_revision ) named_tmp_file = suc.get_named_tmpfile_from_ctx( ctx, file_name, dir ) return named_tmp_file @@ -1604,7 +1605,7 @@ trans.model.Repository.table.c.user_id == user.id ) ): repository = repository_metadata.repository repo_dir = repository.repo_path( trans.app ) - repo = hg.repository( suc.get_configured_ui(), repo_dir ) + repo = hg.repository( hg_util.get_configured_ui(), repo_dir ) latest_downloadable_changeset_revsion = suc.get_latest_downloadable_changeset_revision( trans, repository, repo ) if repository_metadata.changeset_revision == latest_downloadable_changeset_revsion: # We'll display only the test run for the latest installable revision in the rss feed. @@ -1672,7 +1673,7 @@ if repository_name is not None and repository_owner is not None: repository = suc.get_repository_by_name_and_owner( trans.app, repository_name, repository_owner ) if repository: - repo = hg.repository( suc.get_configured_ui(), repository.repo_path( trans.app ) ) + repo = hg.repository( hg_util.get_configured_ui(), repository.repo_path( trans.app ) ) return suc.get_latest_downloadable_changeset_revision( trans, repository, repo ) return suc.INITIAL_CHANGELOG_HASH @@ -1855,7 +1856,7 @@ changeset_revision = kwd[ 'changeset_revision' ] repository = suc.get_repository_by_name_and_owner( trans.app, name, owner ) repo_dir = repository.repo_path( trans.app ) - repo = hg.repository( suc.get_configured_ui(), repo_dir ) + repo = hg.repository( hg_util.get_configured_ui(), repo_dir ) tool_version_dicts = [] for changeset in repo.changelog: current_changeset_revision = str( repo.changectx( changeset ) ) @@ -1880,7 +1881,7 @@ repository_id = trans.security.encode_id( repository.id ) repository_clone_url = common_util.generate_clone_url_for_repository_in_tool_shed( trans, repository ) repo_dir = repository.repo_path( trans.app ) - repo = hg.repository( suc.get_configured_ui(), repo_dir ) + repo = hg.repository( hg_util.get_configured_ui(), repo_dir ) repository_metadata = suc.get_repository_metadata_by_changeset_revision( trans, repository_id, changeset_revision ) if not repository_metadata: # The received changeset_revision is no longer associated with metadata, so get the next changeset_revision in the repository @@ -1889,7 +1890,7 @@ repo, after_changeset_revision=changeset_revision ) repository_metadata = suc.get_repository_metadata_by_changeset_revision( trans, repository_id, changeset_revision ) - ctx = suc.get_changectx_for_changeset( repo, changeset_revision ) + ctx = hg_util.get_changectx_for_changeset( repo, changeset_revision ) repo_info_dict = repository_util.create_repo_info_dict( trans=trans, repository_clone_url=repository_clone_url, changeset_revision=changeset_revision, @@ -2165,7 +2166,7 @@ repository = suc.get_repository_in_tool_shed( trans, id ) repository_type = kwd.get( 'repository_type', str( repository.type ) ) repo_dir = repository.repo_path( trans.app ) - repo = hg.repository( suc.get_configured_ui(), repo_dir ) + repo = hg.repository( hg_util.get_configured_ui(), repo_dir ) repo_name = kwd.get( 'repo_name', repository.name ) changeset_revision = kwd.get( 'changeset_revision', repository.tip( trans.app ) ) description = kwd.get( 'description', repository.description ) @@ -2317,7 +2318,7 @@ selected_value=changeset_revision, add_id_to_name=False, downloadable=False ) - revision_label = suc.get_revision_label( trans, repository, repository.tip( trans.app ), include_date=False ) + revision_label = hg_util.get_revision_label( trans, repository, repository.tip( trans.app ), include_date=False ) repository_metadata = None metadata = None is_malicious = False @@ -2326,7 +2327,7 @@ if changeset_revision != suc.INITIAL_CHANGELOG_HASH: repository_metadata = suc.get_repository_metadata_by_changeset_revision( trans, id, changeset_revision ) if repository_metadata: - revision_label = suc.get_revision_label( trans, repository, changeset_revision, include_date=False ) + revision_label = hg_util.get_revision_label( trans, repository, changeset_revision, include_date=False ) metadata = repository_metadata.metadata is_malicious = repository_metadata.malicious else: @@ -2337,7 +2338,7 @@ if previous_changeset_revision != suc.INITIAL_CHANGELOG_HASH: repository_metadata = suc.get_repository_metadata_by_changeset_revision( trans, id, previous_changeset_revision ) if repository_metadata: - revision_label = suc.get_revision_label( trans, repository, previous_changeset_revision, include_date=False ) + revision_label = hg_util.get_revision_label( trans, repository, previous_changeset_revision, include_date=False ) metadata = repository_metadata.metadata is_malicious = repository_metadata.malicious changeset_revision = previous_changeset_revision @@ -2443,7 +2444,7 @@ # There is no repository_metadata defined for the changeset_revision, so see if it was defined # in a previous changeset in the changelog. repo_dir = repository.repo_path( trans.app ) - repo = hg.repository( suc.get_configured_ui(), repo_dir ) + repo = hg.repository( hg_util.get_configured_ui(), repo_dir ) previous_changeset_revision = \ suc.get_previous_metadata_changeset_revision( repository, repo, @@ -2520,7 +2521,7 @@ changeset_revision = kwd.get( 'changeset_revision', None ) repository = suc.get_repository_by_name_and_owner( trans.app, name, owner ) repo_dir = repository.repo_path( trans.app ) - repo = hg.repository( suc.get_configured_ui(), repo_dir ) + repo = hg.repository( hg_util.get_configured_ui(), repo_dir ) # Get the next installable changeset_revision beyond the received changeset_revision. changeset_revision = suc.get_next_downloadable_changeset_revision( repository, repo, changeset_revision ) if changeset_revision: @@ -2540,7 +2541,7 @@ status = kwd.get( 'status', 'done' ) repository = suc.get_repository_in_tool_shed( trans, repository_id ) repo_dir = repository.repo_path( trans.app ) - repo = hg.repository( suc.get_configured_ui(), repo_dir ) + repo = hg.repository( hg_util.get_configured_ui(), repo_dir ) changeset_revision = kwd.get( 'changeset_revision', repository.tip( trans.app ) ) repository_metadata = suc.get_repository_metadata_by_changeset_revision( trans, repository_id, changeset_revision ) if repository_metadata: @@ -2577,7 +2578,7 @@ repository_metadata_id = None metadata = None repository_dependencies = None - revision_label = suc.get_revision_label( trans, repository, changeset_revision, include_date=True ) + revision_label = hg_util.get_revision_label( trans, repository, changeset_revision, include_date=True ) changeset_revision_select_field = grids_util.build_changeset_revision_select_field( trans, repository, selected_value=changeset_revision, @@ -2607,7 +2608,7 @@ changeset_revision = kwd.get( 'changeset_revision', None ) repository = suc.get_repository_by_name_and_owner( trans.app, name, owner ) repo_dir = repository.repo_path( trans.app ) - repo = hg.repository( suc.get_configured_ui(), repo_dir ) + repo = hg.repository( hg_util.get_configured_ui(), repo_dir ) # Get the lower bound changeset revision. lower_bound_changeset_revision = suc.get_previous_metadata_changeset_revision( repository, repo, changeset_revision, downloadable=True ) # Build the list of changeset revision hashes. @@ -2633,7 +2634,7 @@ status='error' ) ) repository = suc.get_repository_in_tool_shed( trans, id ) changeset_revision = repository.tip( trans.app ) - repo = hg.repository( suc.get_configured_ui(), repository.repo_path( trans.app ) ) + repo = hg.repository( hg_util.get_configured_ui(), repository.repo_path( trans.app ) ) if repository.user == trans.user: return trans.response.send_redirect( web.url_for( controller='repository', action='browse_repositories', @@ -2651,7 +2652,7 @@ changeset_revision, metadata_only=True ) repository_type_select_field = rt_util.build_repository_type_select_field( trans, repository=repository ) - revision_label = suc.get_revision_label( trans, repository, changeset_revision, include_date=True ) + revision_label = hg_util.get_revision_label( trans, repository, changeset_revision, include_date=True ) return trans.fill_template( '/webapps/tool_shed/repository/rate_repository.mako', repository=repository, metadata=metadata, @@ -2702,7 +2703,7 @@ commit_message = kwd.get( 'commit_message', 'Deleted selected files' ) repository = suc.get_repository_in_tool_shed( trans, id ) repo_dir = repository.repo_path( trans.app ) - repo = hg.repository( suc.get_configured_ui(), repo_dir ) + repo = hg.repository( hg_util.get_configured_ui(), repo_dir ) selected_files_to_delete = kwd.get( 'selected_files_to_delete', '' ) if kwd.get( 'select_files_to_delete_button', False ): if selected_files_to_delete: @@ -2742,7 +2743,7 @@ # Update the repository files for browsing. suc.update_repository( repo ) # Get the new repository tip. - repo = hg.repository( suc.get_configured_ui(), repo_dir ) + repo = hg.repository( hg_util.get_configured_ui(), repo_dir ) if tip == repository.tip( trans.app ): message += 'No changes to repository. ' kwd[ 'message' ] = message @@ -2931,7 +2932,7 @@ if not repository_metadata: # Get updates to the received changeset_revision if any exist. repo_dir = repository.repo_path( trans.app ) - repo = hg.repository( suc.get_configured_ui(), repo_dir ) + repo = hg.repository( hg_util.get_configured_ui(), repo_dir ) upper_bound_changeset_revision = suc.get_next_downloadable_changeset_revision( repository, repo, changeset_revision ) if upper_bound_changeset_revision: changeset_revision = upper_bound_changeset_revision @@ -2971,7 +2972,7 @@ trans.security.encode_id( repository.id ), changeset_revision ) repo_dir = repository.repo_path( trans.app ) - repo = hg.repository( suc.get_configured_ui(), repo_dir ) + repo = hg.repository( hg_util.get_configured_ui(), repo_dir ) tool_shed_status_dict = {} # Handle repository deprecation. tool_shed_status_dict[ 'repository_deprecated' ] = str( repository.deprecated ) @@ -3063,7 +3064,7 @@ message = kwd.get( 'message', '' ) status = kwd.get( 'status', 'done' ) repository = suc.get_repository_in_tool_shed( trans, id ) - repo = hg.repository( suc.get_configured_ui(), repository.repo_path( trans.app ) ) + repo = hg.repository( hg_util.get_configured_ui(), repository.repo_path( trans.app ) ) changesets = [] for changeset in repo.changelog: ctx = repo.changectx( changeset ) @@ -3074,7 +3075,7 @@ change_dict = { 'ctx' : ctx, 'rev' : str( ctx.rev() ), 'date' : date, - 'display_date' : suc.get_readable_ctx_date( ctx ), + 'display_date' : hg_util.get_readable_ctx_date( ctx ), 'description' : ctx.description(), 'files' : ctx.files(), 'user' : ctx.user(), @@ -3098,8 +3099,8 @@ message = kwd.get( 'message', '' ) status = kwd.get( 'status', 'done' ) repository = suc.get_repository_in_tool_shed( trans, id ) - repo = hg.repository( suc.get_configured_ui(), repository.repo_path( trans.app ) ) - ctx = suc.get_changectx_for_changeset( repo, ctx_str ) + repo = hg.repository( hg_util.get_configured_ui(), repository.repo_path( trans.app ) ) + ctx = hg_util.get_changectx_for_changeset( repo, ctx_str ) if ctx is None: message = "Repository does not include changeset revision '%s'." % str( ctx_str ) status = 'error' @@ -3129,7 +3130,7 @@ metadata = metadata_util.get_repository_metadata_by_repository_id_changeset_revision( trans, id, ctx_str, metadata_only=True ) # For rendering the prev button. if ctx_parent: - ctx_parent_date = suc.get_readable_ctx_date( ctx_parent ) + ctx_parent_date = hg_util.get_readable_ctx_date( ctx_parent ) ctx_parent_rev = ctx_parent.rev() if ctx_parent_rev < 0: prev = None @@ -3138,7 +3139,7 @@ else: prev = None if ctx_child: - ctx_child_date = suc.get_readable_ctx_date( ctx_child ) + ctx_child_date = hg_util.get_readable_ctx_date( ctx_child ) ctx_child_rev = ctx_child.rev() next = "<b>%s:%s</b><i>(%s)</i>" % ( ctx_child_rev, ctx_child, ctx_child_date ) else: @@ -3187,7 +3188,7 @@ message = kwd.get( 'message', '' ) status = kwd.get( 'status', 'done' ) repository = suc.get_repository_in_tool_shed( trans, id ) - repo = hg.repository( suc.get_configured_ui(), repository.repo_path( trans.app ) ) + repo = hg.repository( hg_util.get_configured_ui(), repository.repo_path( trans.app ) ) avg_rating, num_ratings = self.get_ave_item_rating_data( trans.sa_session, repository, webapp_model=trans.model ) changeset_revision = kwd.get( 'changeset_revision', repository.tip( trans.app ) ) display_reviews = kwd.get( 'display_reviews', False ) @@ -3221,7 +3222,7 @@ selected_value=changeset_revision, add_id_to_name=False, downloadable=False ) - revision_label = suc.get_revision_label( trans, repository, changeset_revision, include_date=False ) + revision_label = hg_util.get_revision_label( trans, repository, changeset_revision, include_date=False ) repository_metadata = suc.get_repository_metadata_by_changeset_revision( trans, id, changeset_revision ) if repository_metadata: metadata = repository_metadata.metadata @@ -3277,13 +3278,13 @@ render_repository_actions_for = kwd.get( 'render_repository_actions_for', 'tool_shed' ) repository = suc.get_repository_in_tool_shed( trans, repository_id ) repo_files_dir = repository.repo_path( trans.app ) - repo = hg.repository( suc.get_configured_ui(), repo_files_dir ) + repo = hg.repository( hg_util.get_configured_ui(), repo_files_dir ) tool_metadata_dict = {} tool_lineage = [] tool = None guid = None original_tool_data_path = trans.app.config.tool_data_path - revision_label = suc.get_revision_label( trans, repository, changeset_revision, include_date=False ) + revision_label = hg_util.get_revision_label( trans, repository, changeset_revision, include_date=False ) repository_metadata = suc.get_repository_metadata_by_changeset_revision( trans, repository_id, changeset_revision ) if repository_metadata: repository_metadata_id = trans.security.encode_id( repository_metadata.id ) diff -r 6e2eaa8626b218edb9e738a3b489fede6c627b85 -r 2c6c7971d666166eb41ea4bd5838f31f3caabd41 lib/galaxy/webapps/tool_shed/controllers/repository_review.py --- a/lib/galaxy/webapps/tool_shed/controllers/repository_review.py +++ b/lib/galaxy/webapps/tool_shed/controllers/repository_review.py @@ -7,6 +7,7 @@ from galaxy.webapps.tool_shed.util import ratings_util from tool_shed.util.container_util import STRSEP import tool_shed.util.shed_util_common as suc +from tool_shed.util import hg_util from tool_shed.util import review_util from galaxy.util.odict import odict import tool_shed.grids.repository_review_grids as repository_review_grids @@ -72,8 +73,8 @@ status = kwd.get( 'status', 'done' ) review = review_util.get_review( trans, kwd[ 'id' ] ) repository = review.repository - repo = hg.repository( suc.get_configured_ui(), repository.repo_path( trans.app ) ) - rev, changeset_revision_label = suc.get_rev_label_from_changeset_revision( repo, review.changeset_revision ) + repo = hg.repository( hg_util.get_configured_ui(), repository.repo_path( trans.app ) ) + rev, changeset_revision_label = hg_util.get_rev_label_from_changeset_revision( repo, review.changeset_revision ) return trans.fill_template( '/webapps/tool_shed/repository_review/browse_review.mako', repository=repository, changeset_revision_label=changeset_revision_label, @@ -232,7 +233,7 @@ for component in review_util.get_components( trans ): components_dict[ component.name ] = dict( component=component, component_review=None ) repository = review.repository - repo = hg.repository( suc.get_configured_ui(), repository.repo_path( trans.app ) ) + repo = hg.repository( hg_util.get_configured_ui(), repository.repo_path( trans.app ) ) for component_review in review.component_reviews: if component_review and component_review.component: component_name = component_review.component.name @@ -337,7 +338,7 @@ name='revision_approved', selected_value=selected_value, for_component=False ) - rev, changeset_revision_label = suc.get_rev_label_from_changeset_revision( repo, review.changeset_revision ) + rev, changeset_revision_label = hg_util.get_rev_label_from_changeset_revision( repo, review.changeset_revision ) return trans.fill_template( '/webapps/tool_shed/repository_review/edit_review.mako', repository=repository, review=review, @@ -470,7 +471,7 @@ if repository_id: repository = suc.get_repository_in_tool_shed( trans, repository_id ) repo_dir = repository.repo_path( trans.app ) - repo = hg.repository( suc.get_configured_ui(), repo_dir ) + repo = hg.repository( hg_util.get_configured_ui(), repo_dir ) metadata_revision_hashes = [ metadata_revision.changeset_revision for metadata_revision in repository.metadata_revisions ] reviewed_revision_hashes = [ review.changeset_revision for review in repository.reviews ] reviews_dict = odict() @@ -478,7 +479,7 @@ ctx = repo.changectx( changeset ) changeset_revision = str( ctx ) if changeset_revision in metadata_revision_hashes or changeset_revision in reviewed_revision_hashes: - rev, changeset_revision_label = suc.get_rev_label_from_changeset_revision( repo, changeset_revision ) + rev, changeset_revision_label = hg_util.get_rev_label_from_changeset_revision( repo, changeset_revision ) if changeset_revision in reviewed_revision_hashes: # Find the review for this changeset_revision repository_reviews = review_util.get_reviews_by_repository_id_changeset_revision( trans, repository_id, changeset_revision ) @@ -517,9 +518,9 @@ changeset_revision = kwd.get( 'changeset_revision', None ) repository = suc.get_repository_in_tool_shed( trans, repository_id ) repo_dir = repository.repo_path( trans.app ) - repo = hg.repository( suc.get_configured_ui(), repo_dir ) + repo = hg.repository( hg_util.get_configured_ui(), repo_dir ) installable = changeset_revision in [ metadata_revision.changeset_revision for metadata_revision in repository.metadata_revisions ] - rev, changeset_revision_label = suc.get_rev_label_from_changeset_revision( repo, changeset_revision ) + rev, changeset_revision_label = hg_util.get_rev_label_from_changeset_revision( repo, changeset_revision ) reviews = review_util.get_reviews_by_repository_id_changeset_revision( trans, repository_id, changeset_revision ) return trans.fill_template( '/webapps/tool_shed/repository_review/reviews_of_changeset_revision.mako', repository=repository, @@ -582,9 +583,9 @@ status = kwd.get( 'status', 'done' ) repository = suc.get_repository_in_tool_shed( trans, kwd[ 'id' ] ) changeset_revision = kwd.get( 'changeset_revision', None ) - repo = hg.repository( suc.get_configured_ui(), repository.repo_path( trans.app ) ) + repo = hg.repository( hg_util.get_configured_ui(), repository.repo_path( trans.app ) ) previous_reviews_dict = review_util.get_previous_repository_reviews( trans, repository, changeset_revision ) - rev, changeset_revision_label = suc.get_rev_label_from_changeset_revision( repo, changeset_revision ) + rev, changeset_revision_label = hg_util.get_rev_label_from_changeset_revision( repo, changeset_revision ) return trans.fill_template( '/webapps/tool_shed/repository_review/select_previous_review.mako', repository=repository, changeset_revision=changeset_revision, diff -r 6e2eaa8626b218edb9e738a3b489fede6c627b85 -r 2c6c7971d666166eb41ea4bd5838f31f3caabd41 lib/galaxy/webapps/tool_shed/controllers/upload.py --- a/lib/galaxy/webapps/tool_shed/controllers/upload.py +++ b/lib/galaxy/webapps/tool_shed/controllers/upload.py @@ -11,6 +11,7 @@ import tool_shed.repository_types.util as rt_util import tool_shed.util.shed_util_common as suc from tool_shed.util import commit_util +from tool_shed.util import hg_util from tool_shed.util import metadata_util from tool_shed.util import repository_dependency_util from tool_shed.util import tool_dependency_util @@ -39,7 +40,7 @@ repository_id = kwd.get( 'repository_id', '' ) repository = suc.get_repository_in_tool_shed( trans, repository_id ) repo_dir = repository.repo_path( trans.app ) - repo = hg.repository( suc.get_configured_ui(), repo_dir ) + repo = hg.repository( hg_util.get_configured_ui(), repo_dir ) uncompress_file = util.string_as_bool( kwd.get( 'uncompress_file', 'true' ) ) remove_repo_files_not_in_tar = util.string_as_bool( kwd.get( 'remove_repo_files_not_in_tar', 'true' ) ) uploaded_file = None @@ -63,7 +64,7 @@ repo_url = 'http%s' % url[ len( 'hg' ): ] repo_url = repo_url.encode( 'ascii', 'replace' ) try: - commands.clone( suc.get_configured_ui(), repo_url, uploaded_directory ) + commands.clone( hg_util.get_configured_ui(), repo_url, uploaded_directory ) except Exception, e: message = 'Error uploading via mercurial clone: %s' % suc.to_html_string( str( e ) ) status = 'error' @@ -323,7 +324,7 @@ def upload_directory( self, trans, repository, uploaded_directory, upload_point, remove_repo_files_not_in_tar, commit_message, new_repo_alert ): repo_dir = repository.repo_path( trans.app ) - repo = hg.repository( suc.get_configured_ui(), repo_dir ) + repo = hg.repository( hg_util.get_configured_ui(), repo_dir ) undesirable_dirs_removed = 0 undesirable_files_removed = 0 if upload_point is not None: @@ -387,7 +388,7 @@ def upload_tar( self, trans, repository, tar, uploaded_file, upload_point, remove_repo_files_not_in_tar, commit_message, new_repo_alert ): # Upload a tar archive of files. repo_dir = repository.repo_path( trans.app ) - repo = hg.repository( suc.get_configured_ui(), repo_dir ) + repo = hg.repository( hg_util.get_configured_ui(), repo_dir ) undesirable_dirs_removed = 0 undesirable_files_removed = 0 ok, message = commit_util.check_archive( repository, tar ) diff -r 6e2eaa8626b218edb9e738a3b489fede6c627b85 -r 2c6c7971d666166eb41ea4bd5838f31f3caabd41 lib/tool_shed/galaxy_install/repository_util.py --- a/lib/tool_shed/galaxy_install/repository_util.py +++ b/lib/tool_shed/galaxy_install/repository_util.py @@ -15,6 +15,7 @@ from tool_shed.util import data_manager_util from tool_shed.util import datatype_util from tool_shed.util import encoding_util +from tool_shed.util import hg_util from tool_shed.util import repository_dependency_util from tool_shed.util import metadata_util from tool_shed.util import tool_dependency_util @@ -186,7 +187,7 @@ def get_repo_info_dict( trans, repository_id, changeset_revision ): repository = suc.get_repository_in_tool_shed( trans, repository_id ) repo_dir = repository.repo_path( trans.app ) - repo = hg.repository( suc.get_configured_ui(), repo_dir ) + repo = hg.repository( hg_util.get_configured_ui(), repo_dir ) repository_clone_url = common_util.generate_clone_url_for_repository_in_tool_shed( trans, repository ) repository_metadata = suc.get_repository_metadata_by_changeset_revision( trans, repository_id, @@ -225,7 +226,7 @@ has_repository_dependencies_only_if_compiling_contained_td = False includes_tool_dependencies = False includes_tools_for_display_in_tool_panel = False - ctx = suc.get_changectx_for_changeset( repo, changeset_revision ) + ctx = hg_util.get_changectx_for_changeset( repo, changeset_revision ) repo_info_dict = create_repo_info_dict( trans=trans, repository_clone_url=repository_clone_url, changeset_revision=changeset_revision, @@ -574,7 +575,7 @@ current_changeset_revision = changeset_revision_dict.get( 'changeset_revision', None ) current_ctx_rev = changeset_revision_dict.get( 'ctx_rev', None ) if current_ctx_rev != ctx_rev: - repo = hg.repository( suc.get_configured_ui(), path=os.path.abspath( install_dir ) ) + repo = hg.repository( hg_util.get_configured_ui(), path=os.path.abspath( install_dir ) ) pull_repository( repo, repository_clone_url, current_changeset_revision ) suc.update_repository( repo, ctx_rev=current_ctx_rev ) handle_repository_contents( trans, @@ -804,7 +805,7 @@ def pull_repository( repo, repository_clone_url, ctx_rev ): """Pull changes from a remote repository to a local one.""" - commands.pull( suc.get_configured_ui(), repo, source=repository_clone_url, rev=[ ctx_rev ] ) + commands.pull( hg_util.get_configured_ui(), repo, source=repository_clone_url, rev=[ ctx_rev ] ) def repair_tool_shed_repository( trans, repository, repo_info_dict ): diff -r 6e2eaa8626b218edb9e738a3b489fede6c627b85 -r 2c6c7971d666166eb41ea4bd5838f31f3caabd41 lib/tool_shed/grids/admin_grids.py --- a/lib/tool_shed/grids/admin_grids.py +++ b/lib/tool_shed/grids/admin_grids.py @@ -5,6 +5,7 @@ from galaxy.webapps.tool_shed import model from galaxy.model.orm import and_ import tool_shed.util.shed_util_common as suc +from tool_shed.util import hg_util from tool_shed.grids.repository_grids import CategoryGrid from tool_shed.grids.repository_grids import RepositoryGrid @@ -425,9 +426,11 @@ def get_value( self, trans, grid, repository_metadata ): repository = repository_metadata.repository - repo = hg.repository( suc.get_configured_ui(), repository.repo_path( trans.app ) ) - ctx = suc.get_changectx_for_changeset( repo, repository_metadata.changeset_revision ) - return suc.get_revision_label( trans, repository, repository_metadata.changeset_revision, include_date=True ) + return hg_util.get_revision_label( trans, + repository, + repository_metadata.changeset_revision, + include_date=True, + include_hash=True ) class ToolsColumn( grids.TextColumn ): diff -r 6e2eaa8626b218edb9e738a3b489fede6c627b85 -r 2c6c7971d666166eb41ea4bd5838f31f3caabd41 lib/tool_shed/grids/repository_grids.py --- a/lib/tool_shed/grids/repository_grids.py +++ b/lib/tool_shed/grids/repository_grids.py @@ -6,6 +6,7 @@ from galaxy.model.orm import or_ from galaxy.util import json from galaxy.util import listify +from tool_shed.util import hg_util import tool_shed.util.shed_util_common as suc import tool_shed.grids.util as grids_util import tool_shed.repository_types.util as rt_util @@ -116,7 +117,7 @@ def get_value( self, trans, grid, repository ): """Display the current repository heads.""" repo_dir = repository.repo_path( trans.app ) - repo = hg.repository( suc.get_configured_ui(), repo_dir ) + repo = hg.repository( hg_util.get_configured_ui(), repo_dir ) heads = suc.get_repository_heads( repo ) multiple_heads = len( heads ) > 1 if multiple_heads: @@ -124,7 +125,7 @@ else: heads_str = '' for ctx in heads: - heads_str += '%s<br/>' % suc.get_revision_label_from_ctx( ctx, include_date=True ) + heads_str += '%s<br/>' % hg_util.get_revision_label_from_ctx( ctx, include_date=True ) heads_str.rstrip( '<br/>' ) if multiple_heads: heads_str += '</font>' @@ -1338,7 +1339,7 @@ def get_value( self, trans, grid, repository_metadata ): repository = repository_metadata.repository changeset_revision = repository_metadata.changeset_revision - changeset_revision_label = suc.get_revision_label( trans, repository, changeset_revision, include_date=True ) + changeset_revision_label = hg_util.get_revision_label( trans, repository, changeset_revision, include_date=True ) return changeset_revision_label @@ -1482,7 +1483,7 @@ changeset_revision ) if not required_repository_metadata: repo_dir = required_repository.repo_path( trans.app ) - repo = hg.repository( suc.get_configured_ui(), repo_dir ) + repo = hg.repository( hg_util.get_configured_ui(), repo_dir ) updated_changeset_revision = suc.get_next_downloadable_changeset_revision( required_repository, repo, changeset_revision ) required_repository_metadata = metadata_util.get_repository_metadata_by_repository_id_changeset_revision( trans, required_repository_id, @@ -2029,7 +2030,7 @@ tool_dependency_definition. """ encoded_repository_id = trans.security.encode_id( repository.id ) - repo = hg.repository( suc.get_configured_ui(), repository.repo_path( trans.app ) ) + repo = hg.repository( hg_util.get_configured_ui(), repository.repo_path( trans.app ) ) tip_ctx = str( repo.changectx( repo.changelog.tip() ) ) repository_metadata = None try: @@ -2077,7 +2078,7 @@ tool_dependency_definition. """ encoded_repository_id = trans.security.encode_id( repository.id ) - repo = hg.repository( suc.get_configured_ui(), repository.repo_path( trans.app ) ) + repo = hg.repository( hg_util.get_configured_ui(), repository.repo_path( trans.app ) ) tip_ctx = str( repo.changectx( repo.changelog.tip() ) ) try: repository_metadata = suc.get_repository_metadata_by_changeset_revision( trans, encoded_repository_id, tip_ctx ) diff -r 6e2eaa8626b218edb9e738a3b489fede6c627b85 -r 2c6c7971d666166eb41ea4bd5838f31f3caabd41 lib/tool_shed/grids/repository_review_grids.py --- a/lib/tool_shed/grids/repository_review_grids.py +++ b/lib/tool_shed/grids/repository_review_grids.py @@ -6,6 +6,7 @@ from galaxy.model.orm import or_ from tool_shed.grids.repository_grids import RepositoryGrid import tool_shed.util.shed_util_common as suc +from tool_shed.util import hg_util from tool_shed.util import metadata_util from galaxy import eggs @@ -66,10 +67,10 @@ # Restrict to revisions that have been reviewed. if repository.reviews: rval = '' - repo = hg.repository( suc.get_configured_ui(), repository.repo_path( trans.app ) ) + repo = hg.repository( hg_util.get_configured_ui(), repository.repo_path( trans.app ) ) for review in repository.reviews: changeset_revision = review.changeset_revision - rev, label = suc.get_rev_label_from_changeset_revision( repo, changeset_revision ) + rev, label = hg_util.get_rev_label_from_changeset_revision( repo, changeset_revision ) rval += '<a href="manage_repository_reviews_of_revision?id=%s&changeset_revision=%s">%s</a><br/>' % \ ( trans.security.encode_id( repository.id ), changeset_revision, label ) return rval @@ -85,9 +86,11 @@ rval = '' for repository_metadata in repository_metadata_revisions: rev, label, changeset_revision = \ - metadata_util.get_rev_label_changeset_revision_from_repository_metadata( trans, - repository_metadata, - repository=repository ) + hg_util.get_rev_label_changeset_revision_from_repository_metadata( trans, + repository_metadata, + repository=repository, + include_date=True, + include_hash=False ) rval += '<a href="manage_repository_reviews_of_revision?id=%s&changeset_revision=%s">%s</a><br/>' % \ ( trans.security.encode_id( repository.id ), changeset_revision, label ) return rval @@ -308,7 +311,11 @@ rval += 'edit_review' else: rval +='browse_review' - revision_label = suc.get_revision_label( trans, review.repository, review.changeset_revision, include_date=True ) + revision_label = hg_util.get_revision_label( trans, + review.repository, + review.changeset_revision, + include_date=True, + include_hash=False ) rval += '?id=%s">%s</a>' % ( encoded_review_id, revision_label ) return rval diff -r 6e2eaa8626b218edb9e738a3b489fede6c627b85 -r 2c6c7971d666166eb41ea4bd5838f31f3caabd41 lib/tool_shed/grids/util.py --- a/lib/tool_shed/grids/util.py +++ b/lib/tool_shed/grids/util.py @@ -1,7 +1,7 @@ import logging import os import tool_shed.util.shed_util_common as suc -import tool_shed.util.metadata_util as metadata_util +from tool_shed.util import hg_util from galaxy.web.form_builder import SelectField from galaxy.util.bunch import Bunch @@ -96,9 +96,11 @@ repository_metadata_revisions = repository.metadata_revisions for repository_metadata in repository_metadata_revisions: rev, label, changeset_revision = \ - metadata_util.get_rev_label_changeset_revision_from_repository_metadata( trans, - repository_metadata, - repository=repository ) + hg_util.get_rev_label_changeset_revision_from_repository_metadata( trans, + repository_metadata, + repository=repository, + include_date=True, + include_hash=False ) changeset_tups.append( ( rev, label, changeset_revision ) ) refresh_on_change_values.append( changeset_revision ) # Sort options by the revision label. Even though the downloadable_revisions query sorts by update_time, diff -r 6e2eaa8626b218edb9e738a3b489fede6c627b85 -r 2c6c7971d666166eb41ea4bd5838f31f3caabd41 lib/tool_shed/scripts/check_repositories_for_functional_tests.py --- a/lib/tool_shed/scripts/check_repositories_for_functional_tests.py +++ b/lib/tool_shed/scripts/check_repositories_for_functional_tests.py @@ -14,6 +14,7 @@ import ConfigParser import galaxy.webapps.tool_shed.config as tool_shed_config +from tool_shed.util import hg_util import tool_shed.util.shed_util_common as suc import logging import shutil @@ -109,7 +110,7 @@ if tool_dicts is not None: # Clone the repository up to the changeset revision we're checking. repo_dir = repository.repo_path( app ) - repo = hg.repository( suc.get_configured_ui(), repo_dir ) + repo = hg.repository( hg_util.get_configured_ui(), repo_dir ) work_dir = tempfile.mkdtemp( prefix="tmp-toolshed-cafr" ) cloned_ok, error_message = suc.clone_repository( repo_dir, work_dir, changeset_revision ) if cloned_ok: @@ -368,7 +369,7 @@ """ if not testable_revision: repo_dir = repository.repo_path( app ) - repo = hg.repository( suc.get_configured_ui(), repo_dir ) + repo = hg.repository( hg_util.get_configured_ui(), repo_dir ) changeset_revisions = suc.get_ordered_metadata_changeset_revisions( repository, repo, downloadable=True ) if len( changeset_revisions ) > 1: latest_downloadable_revision = changeset_revisions[ -1 ] diff -r 6e2eaa8626b218edb9e738a3b489fede6c627b85 -r 2c6c7971d666166eb41ea4bd5838f31f3caabd41 lib/tool_shed/util/commit_util.py --- a/lib/tool_shed/util/commit_util.py +++ b/lib/tool_shed/util/commit_util.py @@ -12,6 +12,7 @@ from galaxy.util.odict import odict from galaxy.web import url_for import tool_shed.util.shed_util_common as suc +from tool_shed.util import hg_util from tool_shed.util import tool_util from tool_shed.util import xml_util import tool_shed.repository_types.util as rt_util @@ -156,7 +157,7 @@ def handle_directory_changes( trans, repository, full_path, filenames_in_archive, remove_repo_files_not_in_tar, new_repo_alert, commit_message, undesirable_dirs_removed, undesirable_files_removed ): repo_dir = repository.repo_path( trans.app ) - repo = hg.repository( suc.get_configured_ui(), repo_dir ) + repo = hg.repository( hg_util.get_configured_ui(), repo_dir ) content_alert_str = '' files_to_remove = [] filenames_in_archive = [ os.path.join( full_path, name ) for name in filenames_in_archive ] @@ -342,7 +343,7 @@ repository = suc.get_repository_by_name_and_owner( trans.app, name, owner ) if repository: repo_dir = repository.repo_path( trans.app ) - repo = hg.repository( suc.get_configured_ui(), repo_dir ) + repo = hg.repository( hg_util.get_configured_ui(), repo_dir ) lastest_installable_changeset_revision = suc.get_latest_downloadable_changeset_revision( trans, repository, repo ) if lastest_installable_changeset_revision != suc.INITIAL_CHANGELOG_HASH: elem.attrib[ 'changeset_revision' ] = lastest_installable_changeset_revision diff -r 6e2eaa8626b218edb9e738a3b489fede6c627b85 -r 2c6c7971d666166eb41ea4bd5838f31f3caabd41 lib/tool_shed/util/export_util.py --- a/lib/tool_shed/util/export_util.py +++ b/lib/tool_shed/util/export_util.py @@ -14,6 +14,7 @@ from tool_shed.util import common_install_util from tool_shed.util import common_util from tool_shed.util import encoding_util +from tool_shed.util import hg_util from tool_shed.util import repository_dependency_util from tool_shed.util import xml_util @@ -37,7 +38,7 @@ def archive_repository_revision( trans, ui, repository, archive_dir, changeset_revision ): '''Create an un-versioned archive of a repository.''' - repo = hg.repository( suc.get_configured_ui(), repository.repo_path( trans.app ) ) + repo = hg.repository( hg_util.get_configured_ui(), repository.repo_path( trans.app ) ) options_dict = suc.get_mercurial_default_options_dict( 'archive' ) options_dict[ 'rev' ] = changeset_revision error_message = '' @@ -233,8 +234,8 @@ key_rd_dicts_to_be_processed=None, all_repository_dependencies=None, handled_key_rd_dicts=None ) - repo = hg.repository( suc.get_configured_ui(), repository.repo_path( trans.app ) ) - ctx = suc.get_changectx_for_changeset( repo, changeset_revision ) + repo = hg.repository( hg_util.get_configured_ui(), repository.repo_path( trans.app ) ) + ctx = hg_util.get_changectx_for_changeset( repo, changeset_revision ) repo_info_dict = {} # Cast unicode to string. repo_info_dict[ str( repository.name ) ] = ( str( repository.description ), diff -r 6e2eaa8626b218edb9e738a3b489fede6c627b85 -r 2c6c7971d666166eb41ea4bd5838f31f3caabd41 lib/tool_shed/util/hg_util.py --- /dev/null +++ b/lib/tool_shed/util/hg_util.py @@ -0,0 +1,108 @@ +import logging +from datetime import datetime +from time import gmtime +from time import strftime + +from galaxy import eggs +eggs.require( 'mercurial' ) + +from mercurial import cmdutil +from mercurial import commands +from mercurial import hg +from mercurial import ui + +def get_changectx_for_changeset( repo, changeset_revision, **kwd ): + """Retrieve a specified changectx from a repository.""" + for changeset in repo.changelog: + ctx = repo.changectx( changeset ) + if str( ctx ) == changeset_revision: + return ctx + return None + +def get_configured_ui(): + """Configure any desired ui settings.""" + _ui = ui.ui() + # The following will suppress all messages. This is + # the same as adding the following setting to the repo + # hgrc file' [ui] section: + # quiet = True + _ui.setconfig( 'ui', 'quiet', True ) + return _ui + +def get_readable_ctx_date( ctx ): + """Convert the date of the changeset (the received ctx) to a human-readable date.""" + t, tz = ctx.date() + date = datetime( *gmtime( float( t ) - tz )[ :6 ] ) + ctx_date = date.strftime( "%Y-%m-%d" ) + return ctx_date + +def get_revision_label( trans, repository, changeset_revision, include_date=True, include_hash=True ): + """ + Return a string consisting of the human read-able changeset rev and the changeset revision string + which includes the revision date if the receive include_date is True. + """ + repo = hg.repository( get_configured_ui(), repository.repo_path( trans.app ) ) + ctx = get_changectx_for_changeset( repo, changeset_revision ) + if ctx: + return get_revision_label_from_ctx( ctx, include_date=include_date, include_hash=include_hash ) + else: + if include_hash: + return "-1:%s" % changeset_revision + else: + return "-1" + +def get_rev_label_changeset_revision_from_repository_metadata( trans, repository_metadata, repository=None, + include_date=True, include_hash=True ): + if repository is None: + repository = repository_metadata.repository + repo = hg.repository( get_configured_ui(), repository.repo_path( trans.app ) ) + changeset_revision = repository_metadata.changeset_revision + ctx = get_changectx_for_changeset( repo, changeset_revision ) + if ctx: + rev = '%04d' % ctx.rev() + if include_date: + changeset_revision_date = get_readable_ctx_date( ctx ) + if include_hash: + label = "%s:%s (%s)" % ( str( ctx.rev() ), changeset_revision, changeset_revision_date ) + else: + label = "%s (%s)" % ( str( ctx.rev() ), changeset_revision_date ) + else: + if include_hash: + label = "%s:%s" % ( str( ctx.rev() ), changeset_revision ) + else: + label = "%s" % str( ctx.rev() ) + else: + rev = '-1' + if include_hash: + label = "-1:%s" % changeset_revision + else: + label = "-1" + return rev, label, changeset_revision + +def get_revision_label_from_ctx( ctx, include_date=True, include_hash=True ): + if include_date: + if include_hash: + return '%s:%s <i><font color="#666666">(%s)</font></i>' % \ + ( str( ctx.rev() ), str( ctx ), str( get_readable_ctx_date( ctx ) ) ) + else: + return '%s <i><font color="#666666">(%s)</font></i>' % \ + ( str( ctx.rev() ), str( get_readable_ctx_date( ctx ) ) ) + else: + if include_hash: + return '%s:%s' % ( str( ctx.rev() ), str( ctx ) ) + else: + return '%s' % str( ctx.rev() ) + +def get_rev_label_from_changeset_revision( repo, changeset_revision, include_date=True, include_hash=True ): + """ + Given a changeset revision hash, return two strings, the changeset rev and the changeset revision hash + which includes the revision date if the receive include_date is True. + """ + ctx = get_changectx_for_changeset( repo, changeset_revision ) + if ctx: + rev = '%04d' % ctx.rev() + label = get_revision_label_from_ctx( ctx, include_date=include_date ) + else: + rev = '-1' + label = "-1:%s" % changeset_revision + return rev, label diff -r 6e2eaa8626b218edb9e738a3b489fede6c627b85 -r 2c6c7971d666166eb41ea4bd5838f31f3caabd41 lib/tool_shed/util/import_util.py --- a/lib/tool_shed/util/import_util.py +++ b/lib/tool_shed/util/import_util.py @@ -8,6 +8,7 @@ from galaxy.datatypes import checkers from tool_shed.util import commit_util from tool_shed.util import encoding_util +from tool_shed.util import hg_util from tool_shed.util import metadata_util from tool_shed.util import xml_util import tool_shed.util.shed_util_common as suc @@ -212,7 +213,7 @@ archive_file_path = os.path.join( file_path, archive_file_name ) archive = tarfile.open( archive_file_path, 'r:*' ) repo_dir = repository.repo_path( trans.app ) - repo = hg.repository( suc.get_configured_ui(), repo_dir ) + repo = hg.repository( hg_util.get_configured_ui(), repo_dir ) undesirable_dirs_removed = 0 undesirable_files_removed = 0 ok, error_message = commit_util.check_archive( repository, archive ) diff -r 6e2eaa8626b218edb9e738a3b489fede6c627b85 -r 2c6c7971d666166eb41ea4bd5838f31f3caabd41 lib/tool_shed/util/metadata_util.py --- a/lib/tool_shed/util/metadata_util.py +++ b/lib/tool_shed/util/metadata_util.py @@ -15,6 +15,7 @@ from tool_shed.util import common_util from tool_shed.util import common_install_util from tool_shed.util import container_util +from tool_shed.util import hg_util from tool_shed.util import readme_util from tool_shed.util import tool_dependency_util from tool_shed.util import tool_util @@ -347,7 +348,7 @@ # changeset revision in the received repository's changelog (up to the received changeset revision) to see if it is contained in the # skip_tool_test table. If it is, but is not associated with a repository_metadata record, reset that skip_tool_test record to the # newly created repository_metadata record. - repo = hg.repository( suc.get_configured_ui(), repository.repo_path( trans.app ) ) + repo = hg.repository( hg_util.get_configured_ui(), repository.repo_path( trans.app ) ) for changeset in repo.changelog: changeset_hash = str( repo.changectx( changeset ) ) skip_tool_test = suc.get_skip_tool_test_by_changeset_revision( trans, changeset_hash ) @@ -1048,7 +1049,7 @@ def get_latest_repository_metadata( trans, decoded_repository_id, downloadable=False ): """Get last metadata defined for a specified repository from the database.""" repository = trans.sa_session.query( trans.model.Repository ).get( decoded_repository_id ) - repo = hg.repository( suc.get_configured_ui(), repository.repo_path( trans.app ) ) + repo = hg.repository( hg_util.get_configured_ui(), repository.repo_path( trans.app ) ) if downloadable: changeset_revision = suc.get_latest_downloadable_changeset_revision( trans, repository, repo ) else: @@ -1121,21 +1122,6 @@ repository_metadata_revisions.append( metadata_revision ) return repository_metadata_revisions -def get_rev_label_changeset_revision_from_repository_metadata( trans, repository_metadata, repository=None ): - if repository is None: - repository = repository_metadata.repository - repo = hg.repository( suc.get_configured_ui(), repository.repo_path( trans.app ) ) - changeset_revision = repository_metadata.changeset_revision - ctx = suc.get_changectx_for_changeset( repo, changeset_revision ) - if ctx: - changeset_revision_date = suc.get_readable_ctx_date( ctx ) - rev = '%04d' % ctx.rev() - label = "%s:%s (%s)" % ( str( ctx.rev() ), changeset_revision, changeset_revision_date ) - else: - rev = '-1' - label = "-1:%s" % changeset_revision - return rev, label, changeset_revision - def get_sample_files_from_disk( repository_files_dir, tool_path=None, relative_install_dir=None, resetting_all_metadata_on_repository=False ): if resetting_all_metadata_on_repository: @@ -1294,7 +1280,7 @@ log.debug( error_message ) is_valid = False return repository_dependency_tup, is_valid, error_message - repo = hg.repository( suc.get_configured_ui(), repository.repo_path( app ) ) + repo = hg.repository( hg_util.get_configured_ui(), repository.repo_path( app ) ) # The received changeset_revision may be None since defining it in the dependency definition is optional. # If this is the case, the default will be to set it's value to the repository dependency tip revision. # This probably occurs only when handling circular dependency definitions. @@ -1360,7 +1346,7 @@ """ if repository.deleted: return ( None, False ) - repo = hg.repository( suc.get_configured_ui(), repository.repo_path( trans.app ) ) + repo = hg.repository( hg_util.get_configured_ui(), repository.repo_path( trans.app ) ) # Get the latest installable changeset revision since that is all that is currently configured for testing. latest_installable_changeset_revision = suc.get_latest_downloadable_changeset_revision( trans, repository, repo ) if latest_installable_changeset_revision not in [ None, suc.INITIAL_CHANGELOG_HASH ]: @@ -1797,7 +1783,7 @@ repository = suc.get_repository_in_tool_shed( trans, id ) log.debug( "Resetting all metadata on repository: %s" % repository.name ) repo_dir = repository.repo_path( trans.app ) - repo = hg.repository( suc.get_configured_ui(), repo_dir ) + repo = hg.repository( hg_util.get_configured_ui(), repo_dir ) repository_clone_url = common_util.generate_clone_url_for_repository_in_tool_shed( trans, repository ) # The list of changeset_revisions refers to repository_metadata records that have been created or updated. When the following loop # completes, we'll delete all repository_metadata records for this repository that do not have a changeset_revision value in this list. @@ -1978,7 +1964,7 @@ encoded_id = trans.security.encode_id( repository.id ) repository_clone_url = common_util.generate_clone_url_for_repository_in_tool_shed( trans, repository ) repo_dir = repository.repo_path( trans.app ) - repo = hg.repository( suc.get_configured_ui(), repo_dir ) + repo = hg.repository( hg_util.get_configured_ui(), repo_dir ) metadata_dict, invalid_file_tups = generate_metadata_for_changeset_revision( app=trans.app, repository=repository, changeset_revision=repository.tip( trans.app ), diff -r 6e2eaa8626b218edb9e738a3b489fede6c627b85 -r 2c6c7971d666166eb41ea4bd5838f31f3caabd41 lib/tool_shed/util/readme_util.py --- a/lib/tool_shed/util/readme_util.py +++ b/lib/tool_shed/util/readme_util.py @@ -9,6 +9,7 @@ from galaxy.util import unicodify import tool_shed.util.shed_util_common as suc from tool_shed.util import common_util +from tool_shed.util import hg_util eggs.require( 'mercurial' ) @@ -25,7 +26,7 @@ if trans.webapp.name == 'galaxy': can_use_disk_files = True else: - repo = hg.repository( suc.get_configured_ui(), repository.repo_path( trans.app ) ) + repo = hg.repository( hg_util.get_configured_ui(), repository.repo_path( trans.app ) ) latest_downloadable_changeset_revision = suc.get_latest_downloadable_changeset_revision( trans, repository, repo ) can_use_disk_files = changeset_revision == latest_downloadable_changeset_revision readme_files_dict = {} @@ -74,7 +75,7 @@ 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 = suc.get_changectx_for_changeset( repo, changeset_revision ) + ctx = hg_util.get_changectx_for_changeset( repo, changeset_revision ) if ctx: fctx = suc.get_file_context_from_ctx( ctx, readme_file_name ) if fctx and fctx not in [ 'DELETED' ]: diff -r 6e2eaa8626b218edb9e738a3b489fede6c627b85 -r 2c6c7971d666166eb41ea4bd5838f31f3caabd41 lib/tool_shed/util/repository_dependency_util.py --- a/lib/tool_shed/util/repository_dependency_util.py +++ b/lib/tool_shed/util/repository_dependency_util.py @@ -9,6 +9,7 @@ from tool_shed.util import common_install_util from tool_shed.util import container_util from tool_shed.util import encoding_util +from tool_shed.util import hg_util from tool_shed.util import metadata_util from tool_shed.util import tool_util @@ -532,7 +533,7 @@ else: # The repository changeset_revision is no longer installable, so see if there's been an update. repo_dir = repository.repo_path( trans.app ) - repo = hg.repository( suc.get_configured_ui(), repo_dir ) + repo = hg.repository( hg_util.get_configured_ui(), repo_dir ) 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( trans, trans.security.encode_id( repository.id ), diff -r 6e2eaa8626b218edb9e738a3b489fede6c627b85 -r 2c6c7971d666166eb41ea4bd5838f31f3caabd41 lib/tool_shed/util/repository_maintenance_util.py --- a/lib/tool_shed/util/repository_maintenance_util.py +++ b/lib/tool_shed/util/repository_maintenance_util.py @@ -3,6 +3,7 @@ import os import re import tool_shed.util.shed_util_common as suc +from tool_shed.util import hg_util from tool_shed.util import import_util from galaxy import util from galaxy.web.form_builder import build_select_field @@ -47,7 +48,7 @@ # Since we support both http and https, we set push_ssl to False to override the default (which is True) in the mercurial api. The hg # purge extension purges all files and directories not being tracked by mercurial in the current repository. It'll remove unknown files # and empty directories. This is not currently used because it is not supported in the mercurial API. - repo = hg.repository( suc.get_configured_ui(), path=repository.repo_path( trans.app ) ) + repo = hg.repository( hg_util.get_configured_ui(), path=repository.repo_path( trans.app ) ) fp = repo.opener( 'hgrc', 'wb' ) fp.write( '[paths]\n' ) fp.write( 'default = .\n' ) @@ -83,7 +84,7 @@ if not os.path.exists( repository_path ): os.makedirs( repository_path ) # Create the local repository. - repo = hg.repository( suc.get_configured_ui(), repository_path, create=True ) + repo = hg.repository( hg_util.get_configured_ui(), repository_path, create=True ) # Add an entry in the hgweb.config file for the local repository. lhs = "repos/%s/%s" % ( repository.user.username, repository.name ) trans.app.hgweb_config_manager.add_entry( lhs, repository_path ) diff -r 6e2eaa8626b218edb9e738a3b489fede6c627b85 -r 2c6c7971d666166eb41ea4bd5838f31f3caabd41 lib/tool_shed/util/review_util.py --- a/lib/tool_shed/util/review_util.py +++ b/lib/tool_shed/util/review_util.py @@ -3,6 +3,7 @@ from galaxy import eggs from galaxy.model.orm import and_ from galaxy.util.odict import odict +from tool_shed.util import hg_util import tool_shed.util.shed_util_common as suc eggs.require( 'mercurial' ) @@ -58,13 +59,13 @@ def get_previous_repository_reviews( trans, repository, changeset_revision ): """Return an ordered dictionary of repository reviews up to and including the received changeset revision.""" - repo = hg.repository( suc.get_configured_ui(), repository.repo_path( trans.app ) ) + repo = hg.repository( hg_util.get_configured_ui(), repository.repo_path( trans.app ) ) reviewed_revision_hashes = [ review.changeset_revision for review in repository.reviews ] previous_reviews_dict = odict() for changeset in suc.reversed_upper_bounded_changelog( repo, changeset_revision ): previous_changeset_revision = str( repo.changectx( changeset ) ) if previous_changeset_revision in reviewed_revision_hashes: - previous_rev, previous_changeset_revision_label = suc.get_rev_label_from_changeset_revision( repo, previous_changeset_revision ) + previous_rev, previous_changeset_revision_label = hg_util.get_rev_label_from_changeset_revision( repo, previous_changeset_revision ) revision_reviews = get_reviews_by_repository_id_changeset_revision( trans, trans.security.encode_id( repository.id ), previous_changeset_revision ) @@ -93,7 +94,7 @@ def has_previous_repository_reviews( trans, repository, changeset_revision ): """Determine if a repository has a changeset revision review prior to the received changeset revision.""" - repo = hg.repository( suc.get_configured_ui(), repository.repo_path( trans.app ) ) + repo = hg.repository( hg_util.get_configured_ui(), repository.repo_path( trans.app ) ) reviewed_revision_hashes = [ review.changeset_revision for review in repository.reviews ] for changeset in suc.reversed_upper_bounded_changelog( repo, changeset_revision ): previous_changeset_revision = str( repo.changectx( changeset ) ) diff -r 6e2eaa8626b218edb9e738a3b489fede6c627b85 -r 2c6c7971d666166eb41ea4bd5838f31f3caabd41 lib/tool_shed/util/shed_util_common.py --- a/lib/tool_shed/util/shed_util_common.py +++ b/lib/tool_shed/util/shed_util_common.py @@ -4,9 +4,6 @@ import shutil import string import tempfile -from datetime import datetime -from time import gmtime -from time import strftime from galaxy import util from galaxy.util import asbool from galaxy.util import json @@ -19,6 +16,7 @@ import sqlalchemy.orm.exc from tool_shed.util import common_util from tool_shed.util import encoding_util +from tool_shed.util import hg_util from tool_shed.util import xml_util import tool_shed.repository_types.util as rt_util from xml.etree import ElementTree as XmlET @@ -143,7 +141,7 @@ def changeset_is_valid( app, repository, changeset_revision ): """Make sure a changeset hash is valid for a specified repository.""" - repo = hg.repository( get_configured_ui(), repository.repo_path( app ) ) + repo = hg.repository( hg_util.get_configured_ui(), repository.repo_path( app ) ) for changeset in repo.changelog: changeset_hash = str( repo.changectx( changeset ) ) if changeset_revision == changeset_hash: @@ -167,7 +165,7 @@ def clone_repository( repository_clone_url, repository_file_dir, ctx_rev ): """Clone the repository up to the specified changeset_revision. No subsequent revisions will be present in the cloned repository.""" try: - commands.clone( get_configured_ui(), + commands.clone( hg_util.get_configured_ui(), str( repository_clone_url ), dest=str( repository_file_dir ), pull=True, @@ -469,14 +467,6 @@ except sqlalchemy.orm.exc.NoResultFound: return None -def get_changectx_for_changeset( repo, changeset_revision, **kwd ): - """Retrieve a specified changectx from a repository.""" - for changeset in repo.changelog: - ctx = repo.changectx( changeset ) - if str( ctx ) == changeset_revision: - return ctx - return None - def get_config( config_file, repo, ctx, dir ): """Return the latest version of config_filename from the repository manifest.""" config_file = strip_path( config_file ) @@ -496,16 +486,6 @@ return os.path.abspath( os.path.join( root, name ) ) return None -def get_configured_ui(): - """Configure any desired ui settings.""" - _ui = ui.ui() - # The following will suppress all messages. This is - # the same as adding the following setting to the repo - # hgrc file' [ui] section: - # quiet = True - _ui.setconfig( 'ui', 'quiet', True ) - return _ui - def get_ctx_rev( app, tool_shed_url, name, owner, changeset_revision ): """ Send a request to the tool shed to retrieve the ctx_rev for a repository defined by the @@ -539,7 +519,7 @@ if repository_metadata: return repository_metadata # The installable changeset_revision may have been changed because it was "moved ahead" in the repository changelog. - repo = hg.repository( get_configured_ui(), repository.repo_path( trans.app ) ) + repo = hg.repository( hg_util.get_configured_ui(), repository.repo_path( trans.app ) ) updated_changeset_revision = get_next_downloadable_changeset_revision( repository, repo, after_changeset_revision=changeset_revision ) if updated_changeset_revision: repository_metadata = get_repository_metadata_by_changeset_revision( trans, encoded_repository_id, updated_changeset_revision ) @@ -590,7 +570,7 @@ # record, so updates must be necessary. defined_repository = get_repository_by_name_and_owner( trans.app, name, owner ) defined_repo_dir = defined_repository.repo_path( trans.app ) - defined_repo = hg.repository( get_configured_ui(), defined_repo_dir ) + defined_repo = hg.repository( hg_util.get_configured_ui(), defined_repo_dir ) updated_changeset_revision = \ get_next_downloadable_changeset_revision( defined_repository, defined_repo, @@ -799,7 +779,7 @@ changeset_tups = [] for repository_metadata in metadata_revisions: changeset_revision = repository_metadata.changeset_revision - ctx = get_changectx_for_changeset( repo, changeset_revision ) + ctx = hg_util.get_changectx_for_changeset( repo, changeset_revision ) if ctx: rev = '%04d' % ctx.rev() else: @@ -913,13 +893,6 @@ return trans.install_model.context.query( trans.install_model.ToolShedRepository ) \ .filter( trans.install_model.ToolShedRepository.table.c.uninstalled == False ) -def get_readable_ctx_date( ctx ): - """Convert the date of the changeset (the received ctx) to a human-readable date.""" - t, tz = ctx.date() - date = datetime( *gmtime( float( t ) - tz )[ :6 ] ) - ctx_date = date.strftime( "%Y-%m-%d" ) - return ctx_date - def get_repo_info_tuple_contents( repo_info_tuple ): """Take care in handling the repo_info_tuple as it evolves over time as new tool shed features are introduced.""" if len( repo_info_tuple ) == 6: @@ -1211,38 +1184,6 @@ reversed_changelog.insert( 0, changeset ) return reversed_changelog -def get_revision_label( trans, repository, changeset_revision, include_date=True ): - """ - Return a string consisting of the human read-able changeset rev and the changeset revision string - which includes the revision date if the receive include_date is True. - """ - repo = hg.repository( get_configured_ui(), repository.repo_path( trans.app ) ) - ctx = get_changectx_for_changeset( repo, changeset_revision ) - if ctx: - return get_revision_label_from_ctx( ctx, include_date=include_date ) - else: - return "-1:%s" % changeset_revision - -def get_revision_label_from_ctx( ctx, include_date=True ): - if include_date: - return '%s:%s <i><font color="#666666">(%s)</font></i>' % \ - ( str( ctx.rev() ), str( ctx ), str( get_readable_ctx_date( ctx ) ) ) - return '%s:%s' % ( str( ctx.rev() ), str( ctx ) ) - -def get_rev_label_from_changeset_revision( repo, changeset_revision, include_date=True ): - """ - Given a changeset revision hash, return two strings, the changeset rev and the changeset revision hash - which includes the revision date if the receive include_date is True. - """ - ctx = get_changectx_for_changeset( repo, changeset_revision ) - if ctx: - rev = '%04d' % ctx.rev() - label = get_revision_label_from_ctx( ctx, include_date=include_date ) - else: - rev = '-1' - label = "-1:%s" % changeset_revision - return rev, label - def get_shed_tool_conf_dict( app, shed_tool_conf ): """Return the in-memory version of the shed_tool_conf file, which is stored in the config_elems entry in the shed_tool_conf_dict associated with the file.""" for index, shed_tool_conf_dict in enumerate( app.toolbox.shed_tool_confs ): @@ -1434,7 +1375,7 @@ """ repository = get_repository_by_name_and_owner( trans.app, name, owner ) repo_dir = repository.repo_path( trans.app ) - repo = hg.repository( get_configured_ui(), repo_dir ) + repo = hg.repository( hg_util.get_configured_ui(), repo_dir ) # Get the upper bound changeset revision. upper_bound_changeset_revision = get_next_downloadable_changeset_revision( repository, repo, changeset_revision ) # Build the list of changeset revision hashes defining each available update up to, but excluding, upper_bound_changeset_revision. @@ -1487,7 +1428,7 @@ that was included in the change set. """ repo_dir = repository.repo_path( trans.app ) - repo = hg.repository( get_configured_ui(), repo_dir ) + repo = hg.repository( hg_util.get_configured_ui(), repo_dir ) sharable_link = generate_sharable_link_for_repository_in_tool_shed( trans, repository, changeset_revision=None ) smtp_server = trans.app.config.smtp_server if smtp_server and ( new_repo_alert or repository.email_alerts ): @@ -1510,7 +1451,7 @@ template = new_repo_email_alert_template else: template = email_alert_template - display_date = get_readable_ctx_date( ctx ) + display_date = hg_util.get_readable_ctx_date( ctx ) admin_body = string.Template( template ).safe_substitute( host=trans.request.host, sharable_link=sharable_link, repository_name=repository.name, @@ -1859,7 +1800,7 @@ # I = ignored # It would be nice if we could use mercurial's purge extension to remove untracked files. The problem is that # purging is not supported by the mercurial API. - commands.update( get_configured_ui(), repo, rev=ctx_rev ) + commands.update( hg_util.get_configured_ui(), repo, rev=ctx_rev ) def update_tool_shed_repository_status( app, tool_shed_repository, status, error_message=None ): """Update the status of a tool shed repository in the process of being installed into Galaxy.""" diff -r 6e2eaa8626b218edb9e738a3b489fede6c627b85 -r 2c6c7971d666166eb41ea4bd5838f31f3caabd41 lib/tool_shed/util/tool_util.py --- a/lib/tool_shed/util/tool_util.py +++ b/lib/tool_shed/util/tool_util.py @@ -15,6 +15,7 @@ from galaxy.web.form_builder import SelectField from galaxy.tools.actions.upload import UploadToolAction from tool_shed.util import common_util +from tool_shed.util import hg_util from tool_shed.util import xml_util import tool_shed.util.shed_util_common as suc from xml.etree import ElementTree as XmlET @@ -538,7 +539,7 @@ """ repository = suc.get_repository_by_id( trans, repository_id ) repo_dir = repository.repo_path( trans.app ) - repo = hg.repository( suc.get_configured_ui(), repo_dir ) + repo = hg.repository( hg_util.get_configured_ui(), repo_dir ) # Initialize the tool lineage version_lineage = [ guid ] # Get all ancestor guids of the received guid. @@ -637,7 +638,7 @@ def handle_sample_files_and_load_tool_from_tmp_config( trans, repo, repository_id, changeset_revision, tool_config_filename, work_dir ): tool = None message = '' - ctx = suc.get_changectx_for_changeset( repo, changeset_revision ) + ctx = hg_util.get_changectx_for_changeset( repo, changeset_revision ) # We're not currently doing anything with the returned list of deleted_sample_files here. It is intended to help handle sample files that are in # the manifest, but have been deleted from disk. sample_files, deleted_sample_files = get_list_of_copied_sample_files( repo, ctx, dir=work_dir ) @@ -866,7 +867,7 @@ original_tool_data_path = trans.app.config.tool_data_path repository = suc.get_repository_in_tool_shed( trans, repository_id ) repo_files_dir = repository.repo_path( trans.app ) - repo = hg.repository( suc.get_configured_ui(), repo_files_dir ) + repo = hg.repository( hg_util.get_configured_ui(), repo_files_dir ) message = '' tool = None can_use_disk_file = False This diff is so big that we needed to truncate the remainder. Repository URL: https://bitbucket.org/galaxy/galaxy-central/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email.