commit/galaxy-central: 2 new changesets
2 new commits in galaxy-central: https://bitbucket.org/galaxy/galaxy-central/changeset/8ea1787b037b/ changeset: 8ea1787b037b user: inithello date: 2012-12-05 20:36:20 summary: More tool shed functional test enhancements. affected #: 21 files diff -r 1b6819e4598ddcc685cd8ab69667e2d8d7d952f0 -r 8ea1787b037bf957535d39ab1c834a241bb2a5e5 test/tool_shed/base/common.py --- /dev/null +++ b/test/tool_shed/base/common.py @@ -0,0 +1,15 @@ +admin_user = None +admin_user_private_role = None +admin_email = 'test@bx.psu.edu' +admin_username = 'admin-user' + +test_user_1 = None +test_user_1_private_role = None +test_user_1_email = 'test-1@bx.psu.edu' +test_user_1_name = 'user1' + +new_repository_dependencies_xml = '''<?xml version="1.0"?> +<repositories> + <repository toolshed="${toolshed_url}" name="${repository_name}" owner="${owner}" changeset_revision="${changeset_revision}" /> +</repositories> +''' diff -r 1b6819e4598ddcc685cd8ab69667e2d8d7d952f0 -r 8ea1787b037bf957535d39ab1c834a241bb2a5e5 test/tool_shed/base/twilltestcase.py --- a/test/tool_shed/base/twilltestcase.py +++ b/test/tool_shed/base/twilltestcase.py @@ -1,6 +1,7 @@ from base.twilltestcase import * from galaxy.webapps.community.util.hgweb_config import * from test_db_util import * +from common import * import string from galaxy import eggs @@ -137,6 +138,10 @@ tc.fv( "1", "selected_files_to_delete", ','.join( files_to_delete ) ) tc.submit( 'select_files_to_delete_button' ) self.check_for_strings( strings_displayed, strings_not_displayed ) + def display_manage_repository_page( self, repository, strings_displayed=[], strings_not_displayed=[] ): + url = '/repository/manage_repository?id=%s' % self.security.encode_id( repository.id ) + self.visit_url( url ) + self.check_for_strings( strings_displayed, strings_not_displayed ) def display_repository_clone_page( self, owner_name, repository_name, strings_displayed=[], strings_not_displayed=[] ): url = '/repos/%s/%s' % ( owner_name, repository_name ) self.visit_url( url ) @@ -204,6 +209,15 @@ else: string = string.replace( character, replacement ) return string + def generate_repository_dependency_xml( self, repository, xml_filename ): + changeset_revision = self.get_repository_tip( repository ) + template_parser = string.Template( new_repository_dependencies_xml ) + repository_dependency_xml = template_parser.safe_substitute( toolshed_url=self.url, + owner=repository.user.username, + repository_name=repository.name, + changeset_revision=changeset_revision ) + # Save the generated xml to test-data/emboss_5/repository_dependencies.xml. + file( xml_filename, 'w' ).write( repository_dependency_xml ) def get_latest_repository_metadata_for_repository( self, repository ): # TODO: This will not work as expected. Fix it. return repository.metadata_revisions[ 0 ] @@ -279,10 +293,6 @@ ( self.security.encode_id( repository.id ), tool_xml_path, changeset_revision ) self.visit_url( url ) self.check_for_strings( strings_displayed, strings_not_displayed ) - def display_manage_repository_page( self, repository, strings_displayed=[], strings_not_displayed=[] ): - url = '/repository/manage_repository?id=%s' % self.security.encode_id( repository.id ) - self.visit_url( url ) - self.check_for_strings( strings_displayed, strings_not_displayed ) def revoke_write_access( self, repository, username ): url = '/repository/manage_repository?user_access_button=Remove&id=%s&remove_auth=%s' % \ ( self.security.encode_id( repository.id ), username ) diff -r 1b6819e4598ddcc685cd8ab69667e2d8d7d952f0 -r 8ea1787b037bf957535d39ab1c834a241bb2a5e5 test/tool_shed/functional/test_0000_basic_repository_features.py --- a/test/tool_shed/functional/test_0000_basic_repository_features.py +++ b/test/tool_shed/functional/test_0000_basic_repository_features.py @@ -1,16 +1,6 @@ from tool_shed.base.twilltestcase import * from tool_shed.base.test_db_util import * -admin_user = None -admin_user_private_role = None -admin_email = 'test@bx.psu.edu' -admin_username = 'admin-user' - -test_user_1 = None -test_user_1_private_role = None -test_user_1_email = 'test-1@bx.psu.edu' -test_user_1_name = 'user1' - repository_name = 'filtering' repository_description = "Galaxy's filtering tool" repository_long_description = "Long description of Galaxy's filtering tool" @@ -60,7 +50,7 @@ def test_0030_upload_filtering_1_1_0( self ): """Upload filtering_1.1.0.tar to the repository""" repository = get_repository_by_name_and_owner( repository_name, admin_username ) - self.upload_file( repository, 'filtering_1.1.0.tar', commit_message="Uploaded filtering 1.1.0" ) + self.upload_file( repository, 'filtering/filtering_1.1.0.tar', commit_message="Uploaded filtering 1.1.0" ) def test_0035_verify_repository( self ): '''Display basic repository pages''' repository = get_repository_by_name_and_owner( repository_name, admin_username ) @@ -102,7 +92,7 @@ '''Upload filtering.txt file associated with tool version 1.1.0.''' repository = get_repository_by_name_and_owner( repository_name, admin_username ) self.upload_file( repository, - 'filtering.txt', + 'filtering/filtering.txt', commit_message="Uploaded filtering.txt", uncompress_file='No', remove_repo_files_not_in_tar='No' ) @@ -110,7 +100,7 @@ def test_0055_upload_filtering_test_data( self ): '''Upload filtering test data.''' repository = get_repository_by_name_and_owner( repository_name, admin_username ) - self.upload_file( repository, 'filtering_test_data.tar', commit_message="Uploaded filtering test data", remove_repo_files_not_in_tar='No' ) + self.upload_file( repository, 'filtering/filtering_test_data.tar', commit_message="Uploaded filtering test data", remove_repo_files_not_in_tar='No' ) self.display_repository_file_contents( repository=repository, filename='1.bed', filepath='test-data', @@ -121,7 +111,7 @@ '''Upload filtering version 2.2.0''' repository = get_repository_by_name_and_owner( repository_name, admin_username ) self.upload_file( repository, - 'filtering_2.2.0.tar', + 'filtering/filtering_2.2.0.tar', commit_message="Uploaded filtering 2.2.0", remove_repo_files_not_in_tar='No' ) def test_0065_verify_filtering_repository( self ): diff -r 1b6819e4598ddcc685cd8ab69667e2d8d7d952f0 -r 8ea1787b037bf957535d39ab1c834a241bb2a5e5 test/tool_shed/functional/test_0010_repository_with_tool_dependencies.py --- a/test/tool_shed/functional/test_0010_repository_with_tool_dependencies.py +++ b/test/tool_shed/functional/test_0010_repository_with_tool_dependencies.py @@ -1,16 +1,6 @@ from tool_shed.base.twilltestcase import * from tool_shed.base.test_db_util import * -admin_user = None -admin_user_private_role = None -admin_email = 'test@bx.psu.edu' -admin_username = 'admin-user' - -test_user_1 = None -test_user_1_private_role = None -test_user_1_email = 'test-1@bx.psu.edu' -test_user_1_name = 'user1' - repository_name = 'freebayes' repository_description = "Galaxy's freebayes tool" repository_long_description = "Long description of Galaxy's freebayes tool" @@ -24,11 +14,11 @@ admin_user = get_user( admin_email ) assert admin_user is not None, 'Problem retrieving user with email %s from the database' % admin_email admin_user_private_role = get_private_role( admin_user ) - def test_0005_create_categories( self ): - """Create categories""" + def test_0005_create_category( self ): + """Create SNP Analysis category.""" self.create_category( 'SNP Analysis', 'Tools for single nucleotide polymorphism data such as WGA' ) - def test_0005_create_freebayes_repository_and_upload_tool_xml( self ): - '''Upload freebayes.xml without tool_data_table_conf.xml.sample. This should result in an error and invalid tool.''' + def test_0010_create_freebayes_repository_and_upload_tool_xml( self ): + '''Create freebayes repository and upload freebayes.xml without tool_data_table_conf.xml.sample. This should result in an error message and invalid tool.''' self.create_repository( repository_name, repository_description, repository_long_description=repository_long_description, @@ -45,38 +35,42 @@ self.check_repository_invalid_tools_for_changeset_revision( repository, tip, strings_displayed=[ 'requires an entry', 'tool_data_table_conf.xml' ] ) - def test_0010_upload_missing_tool_data_table_conf_file( self ): + def test_0015_upload_missing_tool_data_table_conf_file( self ): '''Upload the missing tool_data_table_conf.xml.sample file to the repository.''' repository = get_repository_by_name_and_owner( repository_name, admin_username ) self.upload_file( repository, 'freebayes/tool_data_table_conf.xml.sample', + valid_tools_only=False, strings_displayed=[], commit_message='Uploaded the tool data table sample file.' ) - def test_0015_upload_missing_sample_loc_file( self ): + self.display_manage_repository_page( repository, strings_displayed=[ 'Invalid tools' ], strings_not_displayed=[ 'Valid tools' ] ) + tip = self.get_repository_tip( repository ) + self.check_repository_invalid_tools_for_changeset_revision( repository, + tip, + strings_displayed=[ 'refers to a file', 'sam_fa_indices.loc' ] ) + def test_0020_upload_missing_sample_loc_file( self ): '''Upload the missing sam_fa_indices.loc.sample file to the repository.''' - # Freebayes does not generate an error when the loc file is missing. - # TODO: Generate a test case for that situation. repository = get_repository_by_name_and_owner( repository_name, admin_username ) self.upload_file( repository, 'freebayes/sam_fa_indices.loc.sample', strings_displayed=[], commit_message='Uploaded tool data table .loc file.' ) - def test_0020_upload_invalid_tool_dependency_xml( self ): + def test_0025_upload_invalid_tool_dependency_xml( self ): '''Upload tool_dependencies.xml defining version 0.9.5 of the freebayes package.''' repository = get_repository_by_name_and_owner( repository_name, admin_username ) self.upload_file( repository, - os.path.join( 'freebayes', 'invalid_deps', 'tool_dependencies.xml' ), + os.path.join( 'freebayes', 'invalid_tool_dependencies', 'tool_dependencies.xml' ), strings_displayed=[ 'Name, version and type from a tool requirement tag does not match' ], commit_message='Uploaded invalid tool dependency XML.' ) - def test_0025_upload_valid_tool_dependency_xml( self ): + def test_0030_upload_valid_tool_dependency_xml( self ): '''Upload tool_dependencies.xml defining version 0.9.4_9696d0ce8a962f7bb61c4791be5ce44312b81cf8 of the freebayes package.''' repository = get_repository_by_name_and_owner( repository_name, admin_username ) self.upload_file( repository, os.path.join( 'freebayes', 'tool_dependencies.xml' ), commit_message='Uploaded valid tool dependency XML.' ) - def test_0030_verify_tool_dependencies( self ): + def test_0035_verify_tool_dependencies( self ): '''Verify that the uploaded tool_dependencies.xml specifies the correct package versions.''' repository = get_repository_by_name_and_owner( repository_name, admin_username ) self.display_manage_repository_page( repository, - strings_displayed=[ 'freebayes', '0.9.4_9696d0ce8a9', 'samtools', '0.1.18', 'Valid tools' ], - strings_not_displayed=[ 'Invalid tools' ] ) + strings_displayed=[ 'freebayes', '0.9.4_9696d0ce8a9', 'samtools', '0.1.18', 'Valid tools' ], + strings_not_displayed=[ 'Invalid tools' ] ) diff -r 1b6819e4598ddcc685cd8ab69667e2d8d7d952f0 -r 8ea1787b037bf957535d39ab1c834a241bb2a5e5 test/tool_shed/functional/test_0020_basic_repository_dependencies.py --- /dev/null +++ b/test/tool_shed/functional/test_0020_basic_repository_dependencies.py @@ -0,0 +1,71 @@ +from tool_shed.base.twilltestcase import * +from tool_shed.base.test_db_util import * + +datatypes_repository_name = 'emboss_datatypes' +datatypes_repository_description = "Galaxy applicable data formats used by Emboss tools." +datatypes_repository_long_description = "Galaxy applicable data formats used by Emboss tools. This repository contains no tools." + +emboss_repository_name = 'emboss_5' +emboss_repository_description = 'Galaxy wrappers for Emboss version 5.0.0 tools' +emboss_repository_long_description = 'Galaxy wrappers for Emboss version 5.0.0 tools' + +class TestBasicRepositoryDependencies( ShedTwillTestCase ): + '''Testing emboss 5 with repository dependencies.''' + def test_0000_initiate_users( self ): + """Create necessary user accounts and login as an admin user.""" + self.logout() + self.login( email=admin_email, username=admin_username ) + admin_user = get_user( admin_email ) + assert admin_user is not None, 'Problem retrieving user with email %s from the database' % admin_email + admin_user_private_role = get_private_role( admin_user ) + self.logout() + self.login( email=test_user_1_email, username=test_user_1_name ) + test_user_1 = get_user( test_user_1_email ) + assert test_user_1 is not None, 'Problem retrieving user with email %s from the database' % regular_email + test_user_1_private_role = get_private_role( test_user_1 ) + def test_0005_create_category( self ): + """Create Sequence Analysis category""" + self.logout() + self.login( email=admin_email, username=admin_username ) + self.create_category( 'Sequence Analysis', 'Tools for performing Protein and DNA/RNA analysis' ) + def test_0010_create_emboss_datatypes_repository_and_upload_tarball( self ): + '''Create and populate the emboss_datatypes repository.''' + self.logout() + self.login( email=test_user_1_email, username=test_user_1_name ) + self.create_repository( datatypes_repository_name, + datatypes_repository_description, + repository_long_description=datatypes_repository_long_description, + categories=[ 'Sequence Analysis' ], + strings_displayed=[] ) + repository = get_repository_by_name_and_owner( datatypes_repository_name, test_user_1_name ) + self.upload_file( repository, 'emboss/datatypes/datatypes_conf.xml', commit_message='Uploaded datatypes_conf.xml.' ) + def test_0015_verify_datatypes_in_datatypes_repository( self ): + '''Verify that the emboss_datatypes repository contains datatype entries.''' + repository = get_repository_by_name_and_owner( datatypes_repository_name, test_user_1_name ) + self.display_manage_repository_page( repository, strings_displayed=[ 'Datatypes', 'equicktandem', 'hennig86', 'vectorstrip' ] ) + def test_0020_create_emboss_5_repository_and_upload_files( self ): + '''Create and populate the emboss_5 repository.''' + self.create_repository( emboss_repository_name, + emboss_repository_description, + repository_long_description=emboss_repository_long_description, + categories=[ 'Text Manipulation' ], + strings_displayed=[] ) + repository = get_repository_by_name_and_owner( emboss_repository_name, test_user_1_name ) + self.upload_file( repository, 'emboss/5/emboss.tar', commit_message='Uploaded emboss_5.tar' ) + def test_0025_generate_and_upload_repository_dependencies_xml( self ): + '''Generate and upload the repository_dependencies.xml file''' + repository = get_repository_by_name_and_owner( emboss_repository_name, test_user_1_name ) + datatypes_repository = get_repository_by_name_and_owner( datatypes_repository_name, test_user_1_name ) + self.generate_repository_dependency_xml( datatypes_repository, self.get_filename( 'emboss/5/repository_dependencies.xml' ) ) + self.upload_file( repository, 'emboss/5/repository_dependencies.xml', commit_message='Uploaded repository_dependencies.xml' ) + def test_0030_verify_emboss_5_repository_dependency_on_emboss_datatypes( self ): + '''Verify that the emboss_5 repository now depends on the emboss_datatypes repository with correct name, owner, and changeset revision.''' + repository = get_repository_by_name_and_owner( emboss_repository_name, test_user_1_name ) + datatypes_repository = get_repository_by_name_and_owner( datatypes_repository_name, test_user_1_name ) + changeset_revision = self.get_repository_tip( datatypes_repository ) + strings_displayed = [ datatypes_repository_name, test_user_1_name, changeset_revision, 'Repository dependencies' ] + self.display_manage_repository_page( repository, strings_displayed=strings_displayed ) + def test_0035_cleanup( self ): + '''Clean up generated test data.''' + if os.path.exists( self.get_filename( 'emboss/5/repository_dependencies.xml' ) ): + os.remove( self.get_filename( 'emboss/5/repository_dependencies.xml' ) ) diff -r 1b6819e4598ddcc685cd8ab69667e2d8d7d952f0 -r 8ea1787b037bf957535d39ab1c834a241bb2a5e5 test/tool_shed/functional/test_0020_emboss_repository_dependencies.py --- a/test/tool_shed/functional/test_0020_emboss_repository_dependencies.py +++ /dev/null @@ -1,95 +0,0 @@ -from tool_shed.base.twilltestcase import * -from tool_shed.base.test_db_util import * - -admin_user = None -admin_user_private_role = None -admin_email = 'test@bx.psu.edu' -admin_username = 'admin-user' - -test_user_1 = None -test_user_1_private_role = None -test_user_1_email = 'test-1@bx.psu.edu' -test_user_1_name = 'user1' - -datatypes_repository_name = 'emboss_datatypes' -datatypes_repository_description = "Galaxy applicable data formats used by Emboss tools." -datatypes_repository_long_description = "Galaxy applicable data formats used by Emboss tools. This repository contains no tools." - -emboss_repository_name = 'emboss_5' -emboss_repository_description = 'Galaxy wrappers for Emboss version 5.0.0 tools' -emboss_repository_long_description = 'Galaxy wrappers for Emboss version 5.0.0 tools' - -new_repository_dependencies_xml = '''<?xml version="1.0"?> -<repositories> - <repository toolshed="${toolshed_url}" name="${repository_name}" owner="${owner}" changeset_revision="${changeset_revision}" /> -</repositories> -''' - -class TestEmbossRepositoryDependencies( ShedTwillTestCase ): - '''Testing emboss 5 with repository dependencies.''' - def test_0000_initiate_users( self ): - """Create necessary user accounts and login as an admin user.""" - self.logout() - self.login( email=admin_email, username=admin_username ) - admin_user = get_user( admin_email ) - assert admin_user is not None, 'Problem retrieving user with email %s from the database' % admin_email - admin_user_private_role = get_private_role( admin_user ) - self.logout() - self.login( email=test_user_1_email, username=test_user_1_name ) - test_user_1 = get_user( test_user_1_email ) - assert test_user_1 is not None, 'Problem retrieving user with email %s from the database' % regular_email - test_user_1_private_role = get_private_role( test_user_1 ) - def test_0005_create_categories( self ): - """Create categories""" - self.logout() - self.login( email=admin_email, username=admin_username ) - self.create_category( 'Sequence Analysis', 'Tools for performing Protein and DNA/RNA analysis' ) - def test_0010_create_emboss_datatypes_repository_and_upload_tarball( self ): - '''Create the emboss_datatypes repository and upload the tarball.''' - self.logout() - self.login( email=test_user_1_email, username=test_user_1_name ) - self.create_repository( datatypes_repository_name, - datatypes_repository_description, - repository_long_description=datatypes_repository_long_description, - categories=[ 'Sequence Analysis' ], - strings_displayed=[] ) - repository = get_repository_by_name_and_owner( datatypes_repository_name, test_user_1_name ) - self.upload_file( repository, - 'emboss_5/datatypes_conf.xml', - commit_message='Uploaded datatypes_conf.xml.' ) - def test_0015_verify_datatypes_in_datatypes_repository( self ): - '''Verify that the emboss_datatypes repository contains datatype entries.''' - repository = get_repository_by_name_and_owner( datatypes_repository_name, test_user_1_name ) - self.display_manage_repository_page( repository, strings_displayed=[ 'Datatypes', 'equicktandem', 'hennig86', 'vectorstrip' ] ) - def test_0020_generate_repository_dependencies_xml( self ): - '''Generate the repository_dependencies.xml file for the emboss_5 repository.''' - datatypes_repository = get_repository_by_name_and_owner( datatypes_repository_name, test_user_1_name ) - changeset_revision = self.get_repository_tip( datatypes_repository ) - template_parser = string.Template( new_repository_dependencies_xml ) - repository_dependency_xml = template_parser.safe_substitute( toolshed_url=self.url, - owner=test_user_1_name, - repository_name=datatypes_repository.name, - changeset_revision=changeset_revision ) - # Save the generated xml to test-data/emboss_5/repository_dependencies.xml. - file( self.get_filename( 'emboss_5/repository_dependencies.xml' ), 'w' ).write( repository_dependency_xml ) - def test_0025_create_emboss_5_repository_and_upload_files( self ): - '''Create the emboss_5 repository and upload a tool tarball, then generate and upload repository_dependencies.xml.''' - self.create_repository( emboss_repository_name, - emboss_repository_description, - repository_long_description=emboss_repository_long_description, - categories=[ 'Text Manipulation' ], - strings_displayed=[] ) - repository = get_repository_by_name_and_owner( emboss_repository_name, test_user_1_name ) - self.upload_file( repository, 'emboss_5/emboss_5.tar', commit_message='Uploaded emboss_5.tar' ) - self.upload_file( repository, 'emboss_5/repository_dependencies.xml', commit_message='Uploaded repository_dependencies.xml' ) - def test_0030_verify_emboss_5_repository_dependency_on_emboss_datatypes( self ): - '''Verify that the emboss_5 repository now depends on the emboss_datatypes repository with correct name, owner, and changeset revision.''' - repository = get_repository_by_name_and_owner( emboss_repository_name, test_user_1_name ) - datatypes_repository = get_repository_by_name_and_owner( datatypes_repository_name, test_user_1_name ) - changeset_revision = self.get_repository_tip( datatypes_repository ) - strings_displayed = [ datatypes_repository_name, test_user_1_name, changeset_revision, 'Repository dependencies' ] - self.display_manage_repository_page( repository, strings_displayed=strings_displayed ) - def test_0035_cleanup( self ): - '''Clean up generated test data.''' - if os.path.exists( self.get_filename( 'emboss_5/repository_dependencies.xml' ) ): - os.remove( self.get_filename( 'emboss_5/repository_dependencies.xml' ) ) diff -r 1b6819e4598ddcc685cd8ab69667e2d8d7d952f0 -r 8ea1787b037bf957535d39ab1c834a241bb2a5e5 test/tool_shed/test_data/emboss/5/emboss.tar Binary file test/tool_shed/test_data/emboss/5/emboss.tar has changed diff -r 1b6819e4598ddcc685cd8ab69667e2d8d7d952f0 -r 8ea1787b037bf957535d39ab1c834a241bb2a5e5 test/tool_shed/test_data/emboss/6/emboss.tar Binary file test/tool_shed/test_data/emboss/6/emboss.tar has changed diff -r 1b6819e4598ddcc685cd8ab69667e2d8d7d952f0 -r 8ea1787b037bf957535d39ab1c834a241bb2a5e5 test/tool_shed/test_data/emboss/datatypes/datatypes_conf.xml --- /dev/null +++ b/test/tool_shed/test_data/emboss/datatypes/datatypes_conf.xml @@ -0,0 +1,101 @@ +<?xml version="1.0"?> +<datatypes> + <registration> + <datatype extension="acedb" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="asn1" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="btwisted" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="cai" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="charge" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="checktrans" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="chips" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="clustal" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="codata" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="codcmp" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="coderet" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="compseq" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="cpgplot" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="cpgreport" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="cusp" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="cut" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="dan" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="dbmotif" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="diffseq" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="digest" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="dreg" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="einverted" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="embl" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="epestfind" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="equicktandem" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="est2genome" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="etandem" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="excel" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="feattable" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="fitch" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="freak" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="fuzznuc" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="fuzzpro" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="fuzztran" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="garnier" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="gcg" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="geecee" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="genbank" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="helixturnhelix" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="hennig86" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="hmoment" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="ig" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="isochore" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="jackknifer" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="jackknifernon" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="markx0" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="markx1" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="markx10" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="markx2" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="markx3" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="match" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="mega" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="meganon" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="motif" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="msf" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="nametable" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="ncbi" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="needle" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="newcpgreport" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="newcpgseek" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="nexus" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="nexusnon" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="noreturn" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="pair" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="palindrome" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="pepcoil" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="pepinfo" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="pepstats" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="phylip" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="phylipnon" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="pir" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="polydot" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="preg" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="prettyseq" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="primersearch" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="regions" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="score" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="selex" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="seqtable" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="showfeat" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="showorf" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="simple" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="sixpack" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="srs" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="srspair" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="staden" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="strider" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="supermatcher" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="swiss" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="syco" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="table" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="tagseq" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="textsearch" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="vectorstrip" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="wobble" type="galaxy.datatypes.data:Text" subclass="True"/> + <datatype extension="wordcount" type="galaxy.datatypes.data:Text" subclass="True"/> + </registration> +</datatypes> diff -r 1b6819e4598ddcc685cd8ab69667e2d8d7d952f0 -r 8ea1787b037bf957535d39ab1c834a241bb2a5e5 test/tool_shed/test_data/emboss_5/datatypes_conf.xml --- a/test/tool_shed/test_data/emboss_5/datatypes_conf.xml +++ /dev/null @@ -1,101 +0,0 @@ -<?xml version="1.0"?> -<datatypes> - <registration> - <datatype extension="acedb" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="asn1" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="btwisted" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="cai" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="charge" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="checktrans" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="chips" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="clustal" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="codata" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="codcmp" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="coderet" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="compseq" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="cpgplot" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="cpgreport" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="cusp" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="cut" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="dan" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="dbmotif" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="diffseq" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="digest" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="dreg" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="einverted" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="embl" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="epestfind" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="equicktandem" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="est2genome" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="etandem" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="excel" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="feattable" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="fitch" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="freak" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="fuzznuc" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="fuzzpro" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="fuzztran" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="garnier" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="gcg" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="geecee" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="genbank" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="helixturnhelix" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="hennig86" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="hmoment" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="ig" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="isochore" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="jackknifer" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="jackknifernon" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="markx0" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="markx1" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="markx10" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="markx2" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="markx3" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="match" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="mega" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="meganon" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="motif" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="msf" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="nametable" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="ncbi" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="needle" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="newcpgreport" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="newcpgseek" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="nexus" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="nexusnon" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="noreturn" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="pair" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="palindrome" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="pepcoil" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="pepinfo" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="pepstats" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="phylip" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="phylipnon" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="pir" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="polydot" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="preg" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="prettyseq" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="primersearch" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="regions" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="score" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="selex" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="seqtable" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="showfeat" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="showorf" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="simple" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="sixpack" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="srs" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="srspair" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="staden" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="strider" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="supermatcher" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="swiss" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="syco" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="table" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="tagseq" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="textsearch" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="vectorstrip" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="wobble" type="galaxy.datatypes.data:Text" subclass="True"/> - <datatype extension="wordcount" type="galaxy.datatypes.data:Text" subclass="True"/> - </registration> -</datatypes> diff -r 1b6819e4598ddcc685cd8ab69667e2d8d7d952f0 -r 8ea1787b037bf957535d39ab1c834a241bb2a5e5 test/tool_shed/test_data/emboss_5/emboss_5.tar Binary file test/tool_shed/test_data/emboss_5/emboss_5.tar has changed diff -r 1b6819e4598ddcc685cd8ab69667e2d8d7d952f0 -r 8ea1787b037bf957535d39ab1c834a241bb2a5e5 test/tool_shed/test_data/filtering.txt --- a/test/tool_shed/test_data/filtering.txt +++ /dev/null @@ -1,1 +0,0 @@ -Readme file for filtering 1.1.0 diff -r 1b6819e4598ddcc685cd8ab69667e2d8d7d952f0 -r 8ea1787b037bf957535d39ab1c834a241bb2a5e5 test/tool_shed/test_data/filtering/filtering.txt --- /dev/null +++ b/test/tool_shed/test_data/filtering/filtering.txt @@ -0,0 +1,1 @@ +Readme file for filtering 1.1.0 diff -r 1b6819e4598ddcc685cd8ab69667e2d8d7d952f0 -r 8ea1787b037bf957535d39ab1c834a241bb2a5e5 test/tool_shed/test_data/filtering/filtering_1.1.0.tar Binary file test/tool_shed/test_data/filtering/filtering_1.1.0.tar has changed diff -r 1b6819e4598ddcc685cd8ab69667e2d8d7d952f0 -r 8ea1787b037bf957535d39ab1c834a241bb2a5e5 test/tool_shed/test_data/filtering/filtering_2.2.0.tar Binary file test/tool_shed/test_data/filtering/filtering_2.2.0.tar has changed diff -r 1b6819e4598ddcc685cd8ab69667e2d8d7d952f0 -r 8ea1787b037bf957535d39ab1c834a241bb2a5e5 test/tool_shed/test_data/filtering/filtering_test_data.tar Binary file test/tool_shed/test_data/filtering/filtering_test_data.tar has changed diff -r 1b6819e4598ddcc685cd8ab69667e2d8d7d952f0 -r 8ea1787b037bf957535d39ab1c834a241bb2a5e5 test/tool_shed/test_data/filtering_1.1.0.tar Binary file test/tool_shed/test_data/filtering_1.1.0.tar has changed diff -r 1b6819e4598ddcc685cd8ab69667e2d8d7d952f0 -r 8ea1787b037bf957535d39ab1c834a241bb2a5e5 test/tool_shed/test_data/filtering_2.2.0.tar Binary file test/tool_shed/test_data/filtering_2.2.0.tar has changed diff -r 1b6819e4598ddcc685cd8ab69667e2d8d7d952f0 -r 8ea1787b037bf957535d39ab1c834a241bb2a5e5 test/tool_shed/test_data/filtering_test_data.tar Binary file test/tool_shed/test_data/filtering_test_data.tar has changed diff -r 1b6819e4598ddcc685cd8ab69667e2d8d7d952f0 -r 8ea1787b037bf957535d39ab1c834a241bb2a5e5 test/tool_shed/test_data/freebayes/invalid_deps/tool_dependencies.xml --- a/test/tool_shed/test_data/freebayes/invalid_deps/tool_dependencies.xml +++ /dev/null @@ -1,46 +0,0 @@ -<?xml version="1.0"?> -<tool_dependency> - <package name="freebayes" version="0.9.5"> - <install version="1.0"> - <actions> - <action type="shell_command">git clone --recursive git://github.com/ekg/freebayes.git</action> - <action type="shell_command">git reset --hard 9696d0ce8a962f7bb61c4791be5ce44312b81cf8</action> - <action type="shell_command">make</action> - <action type="move_directory_files"> - <source_directory>bin</source_directory> - <destination_directory>$INSTALL_DIR/bin</destination_directory> - </action> - <action type="set_environment"> - <environment_variable name="PATH" action="prepend_to">$INSTALL_DIR/bin</environment_variable> - </action> - </actions> - </install> - <readme> -FreeBayes requires g++ and the standard C and C++ development libraries. -Additionally, cmake is required for building the BamTools API. - </readme> - </package> - <package name="samtools" version="0.2.15"> - <install version="1.0"> - <actions> - <action type="download_by_url">http://sourceforge.net/projects/samtools/files/samtools/0.1.18/samtools-0.1.18.tar.bz2</action> - <action type="shell_command">sed -i .bak -e 's/-lcurses/-lncurses/g' Makefile</action> - <action type="shell_command">make</action> - <action type="move_file"> - <source>samtools</source> - <destination>$INSTALL_DIR/bin</destination> - </action> - <action type="move_file"> - <source>misc/maq2sam-long</source> - <destination>$INSTALL_DIR/bin</destination> - </action> - <action type="set_environment"> - <environment_variable name="PATH" action="prepend_to">$INSTALL_DIR/bin</environment_variable> - </action> - </actions> - </install> - <readme> -Compiling SAMtools requires the ncurses and zlib development libraries. - </readme> - </package> -</tool_dependency> diff -r 1b6819e4598ddcc685cd8ab69667e2d8d7d952f0 -r 8ea1787b037bf957535d39ab1c834a241bb2a5e5 test/tool_shed/test_data/freebayes/invalid_tool_dependencies/tool_dependencies.xml --- /dev/null +++ b/test/tool_shed/test_data/freebayes/invalid_tool_dependencies/tool_dependencies.xml @@ -0,0 +1,46 @@ +<?xml version="1.0"?> +<tool_dependency> + <package name="freebayes" version="0.9.5"> + <install version="1.0"> + <actions> + <action type="shell_command">git clone --recursive git://github.com/ekg/freebayes.git</action> + <action type="shell_command">git reset --hard 9696d0ce8a962f7bb61c4791be5ce44312b81cf8</action> + <action type="shell_command">make</action> + <action type="move_directory_files"> + <source_directory>bin</source_directory> + <destination_directory>$INSTALL_DIR/bin</destination_directory> + </action> + <action type="set_environment"> + <environment_variable name="PATH" action="prepend_to">$INSTALL_DIR/bin</environment_variable> + </action> + </actions> + </install> + <readme> +FreeBayes requires g++ and the standard C and C++ development libraries. +Additionally, cmake is required for building the BamTools API. + </readme> + </package> + <package name="samtools" version="0.2.15"> + <install version="1.0"> + <actions> + <action type="download_by_url">http://sourceforge.net/projects/samtools/files/samtools/0.1.18/samtools-0.1.18.tar.bz2</action> + <action type="shell_command">sed -i .bak -e 's/-lcurses/-lncurses/g' Makefile</action> + <action type="shell_command">make</action> + <action type="move_file"> + <source>samtools</source> + <destination>$INSTALL_DIR/bin</destination> + </action> + <action type="move_file"> + <source>misc/maq2sam-long</source> + <destination>$INSTALL_DIR/bin</destination> + </action> + <action type="set_environment"> + <environment_variable name="PATH" action="prepend_to">$INSTALL_DIR/bin</environment_variable> + </action> + </actions> + </install> + <readme> +Compiling SAMtools requires the ncurses and zlib development libraries. + </readme> + </package> +</tool_dependency> https://bitbucket.org/galaxy/galaxy-central/changeset/42a6e3f82c0d/ changeset: 42a6e3f82c0d user: inithello date: 2012-12-05 20:37:48 summary: Fix error in tool xml dynamic options parsing. affected #: 1 file diff -r 8ea1787b037bf957535d39ab1c834a241bb2a5e5 -r 42a6e3f82c0d2c5ec5bd4af1fca3bac125ffe9c9 lib/galaxy/util/shed_util_common.py --- a/lib/galaxy/util/shed_util_common.py +++ b/lib/galaxy/util/shed_util_common.py @@ -8,6 +8,7 @@ from galaxy.webapps.community.util.container_util import * from galaxy.datatypes.checkers import * from galaxy.model.orm import * +from galaxy.tools.parameters import dynamic_options from galaxy import eggs import pkg_resources @@ -249,7 +250,7 @@ if isinstance( input_param, parameters.basic.SelectToolParameter ) and input_param.is_dynamic: # If the tool refers to .loc files or requires an entry in the tool_data_table_conf.xml, make sure all requirements exist. options = input_param.dynamic_options or input_param.options - if options: + if options and isinstance( options, dynamic_options.DynamicOptions ): if options.tool_data_table or options.missing_tool_data_table_name: # Make sure the repository contains a tool_data_table_conf.xml.sample file. sample_tool_data_table_conf = get_config_from_disk( 'tool_data_table_conf.xml.sample', repo_dir ) 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.
participants (1)
-
Bitbucket