From 1aa8eb980aac5503a6cf585241fe974899922557 Mon Sep 17 00:00:00 2001 From: Dave Bouvier Date: Mon, 4 Apr 2016 15:45:15 -0400 Subject: [PATCH 01/10] Attempted fix for server error on repo preview. This should handle cases where the database record specifies a repository dependency, but the repository in question (and its downloadable changeset) has been updated since the dependency was created. --- lib/tool_shed/util/metadata_util.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/tool_shed/util/metadata_util.py b/lib/tool_shed/util/metadata_util.py index 19f430a59d7..8e0c9a387d5 100644 --- a/lib/tool_shed/util/metadata_util.py +++ b/lib/tool_shed/util/metadata_util.py @@ -39,6 +39,10 @@ def get_dependencies_for_metadata_revision( app, metadata ): dependencies = [] for shed, name, owner, changeset, prior, _ in metadata[ 'repository_dependencies' ]: required_repository = suc.get_repository_by_name_and_owner( app, name, owner ) + repo = hg_util.get_repo_for_repository( app, repository=required_repository, repo_path=None, create=False ) + changeset = suc.get_next_downloadable_changeset_revision( required_repository, repo, changeset ) + if changeset is None: + continue metadata_entry = suc.get_repository_metadata_by_changeset_revision( app, app.security.encode_id( required_repository.id ), changeset ) dependencies.append( metadata_entry ) return dependencies From ad929f231076706167cd88274bcf7c074e74fac4 Mon Sep 17 00:00:00 2001 From: Dave Bouvier Date: Tue, 5 Apr 2016 11:05:33 -0400 Subject: [PATCH 02/10] Add test for server error with updated repository. --- ...test_0550_metadata_updated_dependencies.py | 158 ++++++++++++++++++ .../test_data/0550_files/filtering_1.0.tgz | Bin 0 -> 3650 bytes .../0550_files/package_freebayes_1_0550.tgz | Bin 0 -> 452 bytes .../0550_files/package_freebayes_2_0550.tgz | Bin 0 -> 461 bytes .../0550_files/package_samtools_1_0550.tgz | Bin 0 -> 407 bytes .../0550_files/package_samtools_2_0550.tgz | Bin 0 -> 419 bytes .../0550_files/temp/tool_dependencies.xml | 17 ++ 7 files changed, 175 insertions(+) create mode 100644 test/shed_functional/functional/test_0550_metadata_updated_dependencies.py create mode 100644 test/shed_functional/test_data/0550_files/filtering_1.0.tgz create mode 100644 test/shed_functional/test_data/0550_files/package_freebayes_1_0550.tgz create mode 100644 test/shed_functional/test_data/0550_files/package_freebayes_2_0550.tgz create mode 100644 test/shed_functional/test_data/0550_files/package_samtools_1_0550.tgz create mode 100644 test/shed_functional/test_data/0550_files/package_samtools_2_0550.tgz create mode 100644 test/shed_functional/test_data/0550_files/temp/tool_dependencies.xml diff --git a/test/shed_functional/functional/test_0550_metadata_updated_dependencies.py b/test/shed_functional/functional/test_0550_metadata_updated_dependencies.py new file mode 100644 index 00000000000..effaaf99f29 --- /dev/null +++ b/test/shed_functional/functional/test_0550_metadata_updated_dependencies.py @@ -0,0 +1,158 @@ +import logging + +from shed_functional.base.twilltestcase import common, ShedTwillTestCase + +log = logging.getLogger( __name__ ) + +repositories = dict( freebayes=dict( name='package_freebayes_0550', + description='Description for package_freebayes_0550', + long_description='Long description for package_freebayes_0550' ), + samtools=dict( name='package_samtools_0550', + description='Description for package_samtools_0550', + long_description='Long description for package_samtools_0550' ), + filtering=dict( name='filtering_0550', + description='Description for filtering_0550', + long_description='Long description for filtering_0550' ) ) + +category_name = 'Test 0540' +category_description = 'Verify API endpoint to retrieve all metadata' + +''' +1. Create repository package_freebayes_0550. + +2. Create repository package_samtools_0550. + +3. Create repository filtering_0550. + +4. Create dependency on package_freebayes_0550 for filtering_0550. + +5. Create dependency on package_samtools_0550 for filtering_0550. + +6. Update package_freebayes_0550 and package_samtools_0550. + +5. Load /api/repositories/{filtering_0550}.id/metadata and verify contents. +''' + + +class TestGetAllMetadata( ShedTwillTestCase ): + '''Verify that the code correctly handles the repository admin role.''' + + def test_0000_initiate_users( self ): + """Create necessary user accounts.""" + self.login( email=common.test_user_1_email, username=common.test_user_1_name ) + test_user_1 = self.test_db_util.get_user( common.test_user_1_email ) + assert test_user_1 is not None, 'Problem retrieving user with email %s from the database' % common.test_user_1_email + self.test_db_util.get_private_role( test_user_1 ) + self.login( email=common.admin_email, username=common.admin_username ) + admin_user = self.test_db_util.get_user( common.admin_email ) + assert admin_user is not None, 'Problem retrieving user with email %s from the database' % common.admin_email + self.test_db_util.get_private_role( admin_user ) + + def test_0005_freebayes_repository( self ): + '''Create and populate package_freebayes_0550.''' + category = self.create_category( name=category_name, description=category_description ) + self.login( email=common.test_user_1_email, username=common.test_user_1_name ) + # Create a repository named package_freebayes_0550 owned by user1. + freebayes = self.get_or_create_repository( name=repositories['freebayes']['name'], + description=repositories['freebayes']['description'], + long_description=repositories['freebayes']['long_description'], + owner=common.test_user_1_name, + category_id=self.security.encode_id( category.id ), + strings_displayed=[] ) + assert freebayes is not None, 'Error creating freebayes %s' % repositories['freebayes']['name'] + self.upload_file( freebayes, + filename='0550_files/package_freebayes_1_0550.tgz', + filepath=None, + valid_tools_only=True, + uncompress_file=False, + remove_repo_files_not_in_tar=False, + commit_message='Uploaded.', + strings_displayed=[ 'has been successfully uploaded to the repository', 'contains a single file' ], + strings_not_displayed=None ) + # Visit the manage repository page for package_freebayes_0_5_9_0100. + self.display_manage_repository_page( freebayes, strings_displayed=[ 'Tool dependencies', 'will not be', 'to this repository' ] ) + + def test_0010_create_samtools_repository( self ): + '''Create the package_samtools_0550 repository.''' + category = self.create_category( name=category_name, description=category_description ) + samtools = self.get_or_create_repository( name=repositories['samtools']['name'], + description=repositories['samtools']['description'], + long_description=repositories['samtools']['long_description'], + owner=common.test_user_1_name, + category_id=self.security.encode_id( category.id ), + strings_displayed=[] ) + assert samtools is not None, 'Error creating samtools %s' % repositories['samtools']['name'] + self.upload_file( samtools, + filename='0550_files/package_samtools_1_0550.tgz', + filepath=None, + valid_tools_only=True, + uncompress_file=True, + remove_repo_files_not_in_tar=False, + commit_message='Uploaded samtools 1.0.', + strings_displayed=[ 'has been successfully uncompressed and uploaded to the repository' ], + strings_not_displayed=[] ) + + def test_0015_create_filtering_repository( self ): + '''Create the filtering_0550 repository.''' + category = self.create_category( name=category_name, description=category_description ) + repository = self.get_or_create_repository( name=repositories['filtering']['name'], + description=repositories['filtering']['description'], + long_description=repositories['filtering']['long_description'], + owner=common.test_user_1_name, + category_id=self.security.encode_id( category.id ), + strings_displayed=[] ) + assert repository is not None, 'Error creating repository %s' % repositories['filtering']['name'] + self.upload_file( repository, + filename='0550_files/filtering_1.0.tgz', + filepath=None, + valid_tools_only=True, + uncompress_file=True, + remove_repo_files_not_in_tar=False, + commit_message='Uploaded filtering 1.0.', + strings_displayed=[ 'has been successfully uncompressed and uploaded to the repository' ], + strings_not_displayed=[] ) + + def test_0020_check_repository_dependency( self ): + '''Make filtering depend on samtools and freebayes.''' + freebayes = self.test_db_util.get_repository_by_name_and_owner( repositories[ 'freebayes' ][ 'name' ], + common.test_user_1_name ) + samtools = self.test_db_util.get_repository_by_name_and_owner( repositories[ 'samtools' ][ 'name' ], + common.test_user_1_name ) + filtering = self.test_db_util.get_repository_by_name_and_owner( repositories[ 'filtering' ][ 'name' ], + common.test_user_1_name ) + strings_displayed = [ self.security.encode_id( freebayes.id ), self.security.encode_id( samtools.id ) ] + self.display_manage_repository_page( filtering, strings_displayed=strings_displayed ) + + def test_0025_update_dependent_repositories( self ): + ''' + Update freebayes and samtools, load the API endpoint again. + ''' + freebayes = self.test_db_util.get_repository_by_name_and_owner( repositories[ 'freebayes' ][ 'name' ], + common.test_user_1_name ) + samtools = self.test_db_util.get_repository_by_name_and_owner( repositories[ 'samtools' ][ 'name' ], + common.test_user_1_name ) + filtering = self.test_db_util.get_repository_by_name_and_owner( repositories[ 'filtering' ][ 'name' ], + common.test_user_1_name ) + self.upload_file( freebayes, + filename='0550_files/package_freebayes_2_0550.tgz', + filepath=None, + valid_tools_only=True, + uncompress_file=True, + remove_repo_files_not_in_tar=False, + commit_message='Uploaded freebayes 2.0.', + strings_displayed=[ 'has been successfully uncompressed and uploaded to the repository' ], + strings_not_displayed=[] ) + self.upload_file( samtools, + filename='0550_files/package_samtools_2_0550.tgz', + filepath=None, + valid_tools_only=True, + uncompress_file=True, + remove_repo_files_not_in_tar=False, + commit_message='Uploaded samtools 2.0.', + strings_displayed=[ 'has been successfully uncompressed and uploaded to the repository' ], + strings_not_displayed=[] ) + strings_displayed = [ repositories[ 'freebayes' ][ 'name' ], + repositories[ 'samtools' ][ 'name' ], + repositories[ 'filtering' ][ 'name' ] ] + self.fetch_repository_metadata( filtering, strings_displayed=strings_displayed, strings_not_displayed=None ) + diff --git a/test/shed_functional/test_data/0550_files/filtering_1.0.tgz b/test/shed_functional/test_data/0550_files/filtering_1.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..c2a061272238a83306d05d78012bb74427a56fdb GIT binary patch literal 3650 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 UqZ!R;#&0?P1KJ-A!vIhK0OrUEmjD0& literal 0 HcmV?d00001 diff --git a/test/shed_functional/test_data/0550_files/package_freebayes_1_0550.tgz b/test/shed_functional/test_data/0550_files/package_freebayes_1_0550.tgz new file mode 100644 index 0000000000000000000000000000000000000000..2befe2b7bc32606c2c2d05778878d235ee3bb702 GIT binary patch literal 452 zcmV;#0XzO5iwFRRyaQJN1MSmMPunmM0N_0LSDdW9F(pocMo4Kfa4h#IHt&LNg!i=Mr#=kZy5!gk^P5@o{q>VI~4neSsn z)rKkmdUP-Y?Y0T~`R@3O%GR|olFhKXx4>@KRfXQiEKhd9?`FZaK(kTKni@^Z-p2Q9 z1|h{pI3-HG|KB(B%m{7y<`^5jsO0~H>ueLp%l zm^^tt&%uyGA?uLzXSj}w?mEEXpS5z~$Li<^!dXFRTnNjI6i&irKXe(UByLdKrYjD# zDqW~AeE*}ll&ae|Y_t6iRV^M6)ZeTU?yQ4yt+Z5T)u+A?^)mE}hxyGS9@M(8Z1?uu uJfXRgH{CV*?9YG@LI@#*5JCtcgb+dqA%qY@2qA=!FX;)euSrq>C;$M($>;_E literal 0 HcmV?d00001 diff --git a/test/shed_functional/test_data/0550_files/package_freebayes_2_0550.tgz b/test/shed_functional/test_data/0550_files/package_freebayes_2_0550.tgz new file mode 100644 index 0000000000000000000000000000000000000000..eaeaefb82480c7dcec503790d69e6d59bc753db6 GIT binary patch literal 461 zcmV;;0W$s{iwFSZzXMkQ1MSpbYuhjo0B}F&QygM%9sbj%2?Zx5?I;VBQP#X0*}A5p zvgFBjSib$vPSd(;#^@*;gZmM1BArf$bWY=($rM&-71}~$9eyuO@V;U)nT)$)eyQ~CsPGKt5>0mScI$3bn~NDmNbtDAc?#{DAhck}`WwKEY9bnw0Y4M+xZAcTFK%;t`V#(aVG9OVlKB>i|6%mcovSuF1%l&EuF9VX@}?e zK1LP|P1P?)2Q$!YE84H_jz240SxT$K9E*Dg;s)#Ca(`?UNT<=Upv zp)?07JXrgFba1?B^mr?SA&*j(l=O-&^`g5}@c6COp1!P)j)2YzsQrPKStY%K%YNvR zrW9__xT-4-jLtpPNB<(Dg;KiPm$un{grbxW2>L0jf;;CSZ?#d{uKUy%vRqNu)v&l( zhJ#x7mF<2#wji}=^r}Zk|N3QOj4{R-V~jDz7-Nhv#u#IaF~%5U>@WKP{REhd04M+e D6szr_ literal 0 HcmV?d00001 diff --git a/test/shed_functional/test_data/0550_files/package_samtools_1_0550.tgz b/test/shed_functional/test_data/0550_files/package_samtools_1_0550.tgz new file mode 100644 index 0000000000000000000000000000000000000000..db60638275d4c10bc804bb3b1527efa919541ecd GIT binary patch literal 407 zcmV;I0cidoiwFRcyaQJN1MSnnPUA2T2H>9i6qdy~aSF5?(xM6uAi-+2?LBgn5m-2O zu-yuH`gKw&0u*sULWuvnq_M|icRUH!>Y}2COhu+t+@n{ssv#}T*4w(4jbL_SDK|00;%BXNlTH6oeKAZoc^3!o&~um*pbKlI(g@VjRIcsV%fxnOM*7QP( zjdV(`^zMKEoi8sq+a{gz#&uOHg5|S=%Rh_d{OYPWzxyNv+=0000000000000000001frT;a&R9XNi007D- B(#!w= literal 0 HcmV?d00001 diff --git a/test/shed_functional/test_data/0550_files/package_samtools_2_0550.tgz b/test/shed_functional/test_data/0550_files/package_samtools_2_0550.tgz new file mode 100644 index 0000000000000000000000000000000000000000..6567721d117b64a5278684690cdd47eb7497d248 GIT binary patch literal 419 zcmV;U0bKqciwFRtyaQJN1MSpNYuhjo2XH^|L?`IbUGa;#lc!#*3^=z$yADb`lHdw+Y-@y{-J;7i&HUv z_VQ_dn&i`k5R2J-I$Ir)ZRJbFp?Qi1#H2+Q&XYst*j+|H4 zEP0*^ezuwv;l;IhSWQ?|w6gjxZ;2V%(2{%E^kJSqFBfT^<{$Y!d|0AP?63Z1hv)er zMphwC`In=k85SPee!sr`Wo4U2nwqbuy0eULx~d}YQ(k2I;D5^UNh;kr`im?SN-{g; ztZB#u{yKhGGYTnp(kZ#shwgn{-+bn5pLEGvH}tv;mak4Ozie*SS6Ai5<+p6BOpzT+ zbELwfwI4=D?JcsWQyC38l64c4p4+BXTA5q6Sziyw%N*Tz%8_UB{xef`&d1-edF)ZE zEvsoq+O~adEWW!~Ui^rR_Bv$Vzdc={c*U|;cWm;%{|o>C0000000000000000002* N%ulH(lU)EP007gL&f@?8 literal 0 HcmV?d00001 diff --git a/test/shed_functional/test_data/0550_files/temp/tool_dependencies.xml b/test/shed_functional/test_data/0550_files/temp/tool_dependencies.xml new file mode 100644 index 00000000000..1e754894aab --- /dev/null +++ b/test/shed_functional/test_data/0550_files/temp/tool_dependencies.xml @@ -0,0 +1,17 @@ + + + + + + echo "Success." + + $INSTALL_DIR/bin + + + + +Compiling SAMtools requires the ncurses and zlib development libraries. + + + + From 8c3f458bca948fc5efda027a4e09b8b5b8289276 Mon Sep 17 00:00:00 2001 From: Dave Bouvier Date: Tue, 5 Apr 2016 13:01:46 -0400 Subject: [PATCH 03/10] Correct docs and names. --- ...test_0550_metadata_updated_dependencies.py | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/test/shed_functional/functional/test_0550_metadata_updated_dependencies.py b/test/shed_functional/functional/test_0550_metadata_updated_dependencies.py index effaaf99f29..07ab84f6180 100644 --- a/test/shed_functional/functional/test_0550_metadata_updated_dependencies.py +++ b/test/shed_functional/functional/test_0550_metadata_updated_dependencies.py @@ -14,8 +14,8 @@ repositories = dict( freebayes=dict( name='package_freebayes_0550', description='Description for filtering_0550', long_description='Long description for filtering_0550' ) ) -category_name = 'Test 0540' -category_description = 'Verify API endpoint to retrieve all metadata' +category_name = 'Test 0550' +category_description = 'Verify metadata updates' ''' 1. Create repository package_freebayes_0550. @@ -34,8 +34,8 @@ category_description = 'Verify API endpoint to retrieve all metadata' ''' -class TestGetAllMetadata( ShedTwillTestCase ): - '''Verify that the code correctly handles the repository admin role.''' +class TestGetUpdatedMetadata( ShedTwillTestCase ): + '''Verify that updated repositories still have correct dependency links.''' def test_0000_initiate_users( self ): """Create necessary user accounts.""" @@ -54,11 +54,11 @@ class TestGetAllMetadata( ShedTwillTestCase ): self.login( email=common.test_user_1_email, username=common.test_user_1_name ) # Create a repository named package_freebayes_0550 owned by user1. freebayes = self.get_or_create_repository( name=repositories['freebayes']['name'], - description=repositories['freebayes']['description'], - long_description=repositories['freebayes']['long_description'], - owner=common.test_user_1_name, - category_id=self.security.encode_id( category.id ), - strings_displayed=[] ) + description=repositories['freebayes']['description'], + long_description=repositories['freebayes']['long_description'], + owner=common.test_user_1_name, + category_id=self.security.encode_id( category.id ), + strings_displayed=[] ) assert freebayes is not None, 'Error creating freebayes %s' % repositories['freebayes']['name'] self.upload_file( freebayes, filename='0550_files/package_freebayes_1_0550.tgz', @@ -73,7 +73,7 @@ class TestGetAllMetadata( ShedTwillTestCase ): self.display_manage_repository_page( freebayes, strings_displayed=[ 'Tool dependencies', 'will not be', 'to this repository' ] ) def test_0010_create_samtools_repository( self ): - '''Create the package_samtools_0550 repository.''' + '''Create and populate the package_samtools_0550 repository.''' category = self.create_category( name=category_name, description=category_description ) samtools = self.get_or_create_repository( name=repositories['samtools']['name'], description=repositories['samtools']['description'], From f4993b782679096f2576e749b146c76b45397314 Mon Sep 17 00:00:00 2001 From: Dave Bouvier Date: Wed, 6 Apr 2016 09:19:28 -0400 Subject: [PATCH 04/10] Fix one more travis error. --- .../test_0550_metadata_updated_dependencies.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/test/shed_functional/functional/test_0550_metadata_updated_dependencies.py b/test/shed_functional/functional/test_0550_metadata_updated_dependencies.py index 07ab84f6180..e36a4258c02 100644 --- a/test/shed_functional/functional/test_0550_metadata_updated_dependencies.py +++ b/test/shed_functional/functional/test_0550_metadata_updated_dependencies.py @@ -76,11 +76,11 @@ class TestGetUpdatedMetadata( ShedTwillTestCase ): '''Create and populate the package_samtools_0550 repository.''' category = self.create_category( name=category_name, description=category_description ) samtools = self.get_or_create_repository( name=repositories['samtools']['name'], - description=repositories['samtools']['description'], - long_description=repositories['samtools']['long_description'], - owner=common.test_user_1_name, - category_id=self.security.encode_id( category.id ), - strings_displayed=[] ) + description=repositories['samtools']['description'], + long_description=repositories['samtools']['long_description'], + owner=common.test_user_1_name, + category_id=self.security.encode_id( category.id ), + strings_displayed=[] ) assert samtools is not None, 'Error creating samtools %s' % repositories['samtools']['name'] self.upload_file( samtools, filename='0550_files/package_samtools_1_0550.tgz', From 78e2eef2fcb4bcc51f26307ee351a3c5a679c300 Mon Sep 17 00:00:00 2001 From: Dave Bouvier Date: Wed, 6 Apr 2016 09:20:46 -0400 Subject: [PATCH 05/10] Fix another travis error that escaped my notice. --- .../functional/test_0550_metadata_updated_dependencies.py | 1 - 1 file changed, 1 deletion(-) diff --git a/test/shed_functional/functional/test_0550_metadata_updated_dependencies.py b/test/shed_functional/functional/test_0550_metadata_updated_dependencies.py index e36a4258c02..7313b4e2500 100644 --- a/test/shed_functional/functional/test_0550_metadata_updated_dependencies.py +++ b/test/shed_functional/functional/test_0550_metadata_updated_dependencies.py @@ -155,4 +155,3 @@ class TestGetUpdatedMetadata( ShedTwillTestCase ): repositories[ 'samtools' ][ 'name' ], repositories[ 'filtering' ][ 'name' ] ] self.fetch_repository_metadata( filtering, strings_displayed=strings_displayed, strings_not_displayed=None ) - From afa353b6fd00eb0ecf1d4bac9d64751537cae12a Mon Sep 17 00:00:00 2001 From: Dave Bouvier Date: Fri, 15 Apr 2016 10:30:08 -0400 Subject: [PATCH 06/10] Return current changeset if it is latest. --- lib/tool_shed/util/shed_util_common.py | 2 +- .../functional/test_0540_get_all_metadata_from_api.py | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/tool_shed/util/shed_util_common.py b/lib/tool_shed/util/shed_util_common.py index 51467fc6ed0..edc4b1f8a24 100644 --- a/lib/tool_shed/util/shed_util_common.py +++ b/lib/tool_shed/util/shed_util_common.py @@ -397,7 +397,7 @@ def get_next_downloadable_changeset_revision( repository, repo, after_changeset_ if len( changeset_revisions ) == 1: changeset_revision = changeset_revisions[ 0 ] if changeset_revision == after_changeset_revision: - return None + return after_changeset_revision found_after_changeset_revision = False for changeset in repo.changelog: changeset_revision = str( repo.changectx( changeset ) ) diff --git a/test/shed_functional/functional/test_0540_get_all_metadata_from_api.py b/test/shed_functional/functional/test_0540_get_all_metadata_from_api.py index 5e4fb20bd09..b4d94b5b9d4 100644 --- a/test/shed_functional/functional/test_0540_get_all_metadata_from_api.py +++ b/test/shed_functional/functional/test_0540_get_all_metadata_from_api.py @@ -87,6 +87,7 @@ class TestGetAllMetadata( ShedTwillTestCase ): commit_message='Uploaded column maker 1.0.', strings_displayed=[], strings_not_displayed=[] ) + # Add a dependency on BWA. self.upload_file( repository, filename='0540_files/convert_chars/tool_dependencies.xml', filepath=None, @@ -96,7 +97,7 @@ class TestGetAllMetadata( ShedTwillTestCase ): commit_message='Uploaded column maker 1.0.', strings_displayed=[], strings_not_displayed=[] ) - # Visit the manage repository page for package_bwa_0_5_9_0100. + # Visit the manage repository page for convert_chars_0540. self.display_manage_repository_page( repository, strings_displayed=[ repositories['bwa']['name'] ] ) def test_0015_create_column_repository( self ): @@ -129,7 +130,7 @@ class TestGetAllMetadata( ShedTwillTestCase ): valid_tools_only=True, uncompress_file=True, remove_repo_files_not_in_tar=False, - commit_message='Uploaded column maker 1.0.', + commit_message='Uploaded column maker 2.0.', strings_displayed=[], strings_not_displayed=[] ) From d35d6a707f3b265b10b859714deec793ecf31a53 Mon Sep 17 00:00:00 2001 From: Dave Bouvier Date: Fri, 15 Apr 2016 13:12:51 -0400 Subject: [PATCH 07/10] Update documentation. --- lib/tool_shed/util/shed_util_common.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/tool_shed/util/shed_util_common.py b/lib/tool_shed/util/shed_util_common.py index edc4b1f8a24..b387c6c018c 100644 --- a/lib/tool_shed/util/shed_util_common.py +++ b/lib/tool_shed/util/shed_util_common.py @@ -391,7 +391,8 @@ def get_metadata_changeset_revisions( repository, repo ): def get_next_downloadable_changeset_revision( repository, repo, after_changeset_revision ): """ Return the installable changeset_revision in the repository changelog after the changeset to which - after_changeset_revision refers. If there isn't one, return None. + after_changeset_revision refers. If there isn't one, return None. If there is only one installable + changeset, and that matches the requested revision, return it. """ changeset_revisions = [ revision[ 1 ] for revision in get_metadata_revisions( repository, repo ) ] if len( changeset_revisions ) == 1: From 4c126af1b0137fad228f0254dab45b6bec8fb9da Mon Sep 17 00:00:00 2001 From: Dave Bouvier Date: Fri, 15 Apr 2016 13:33:54 -0400 Subject: [PATCH 08/10] Ensure legacy behavior remains unaltered. Per to the logic change in shed_util_common.get_next_downloadable_changeset_revision, this commit modifies some conditionals to check whether it previously would have returned None. --- .../webapps/tool_shed/api/repository_revisions.py | 11 ++++++----- .../webapps/tool_shed/controllers/repository.py | 12 ++++++------ lib/tool_shed/capsule/capsule_manager.py | 2 +- .../dependencies/repository/relation_builder.py | 9 +++++---- lib/tool_shed/util/metadata_util.py | 4 ++-- lib/tool_shed/util/repository_util.py | 2 +- lib/tool_shed/util/shed_util_common.py | 2 +- 7 files changed, 22 insertions(+), 20 deletions(-) diff --git a/lib/galaxy/webapps/tool_shed/api/repository_revisions.py b/lib/galaxy/webapps/tool_shed/api/repository_revisions.py index 425bb38aefb..99765e5c864 100644 --- a/lib/galaxy/webapps/tool_shed/api/repository_revisions.py +++ b/lib/galaxy/webapps/tool_shed/api/repository_revisions.py @@ -170,11 +170,12 @@ class RepositoryRevisionsController( BaseAPIController ): new_changeset_revision = suc.get_next_downloadable_changeset_revision( repository_dependency, repo, changeset_revision ) - repository_dependency_repository_metadata = \ - suc.get_repository_metadata_by_changeset_revision( trans.app, - repository_dependency_id, - new_changeset_revision ) - if repository_dependency_repository_metadata is None: + if new_changeset_revision != changeset_revision: + repository_dependency_repository_metadata = \ + suc.get_repository_metadata_by_changeset_revision( trans.app, + repository_dependency_id, + new_changeset_revision ) + else: decoded_repository_dependency_id = trans.security.decode_id( repository_dependency_id ) debug_msg = 'Cannot locate repository_metadata with id %d for repository dependency %s owned by %s ' % \ ( decoded_repository_dependency_id, str( name ), str( owner ) ) diff --git a/lib/galaxy/webapps/tool_shed/controllers/repository.py b/lib/galaxy/webapps/tool_shed/controllers/repository.py index 5a26fa02d99..da721837f5a 100644 --- a/lib/galaxy/webapps/tool_shed/controllers/repository.py +++ b/lib/galaxy/webapps/tool_shed/controllers/repository.py @@ -2415,9 +2415,9 @@ class RepositoryController( BaseUIController, ratings_util.ItemRatings ): repository = suc.get_repository_by_name_and_owner( trans.app, name, owner ) repo = hg_util.get_repo_for_repository( trans.app, repository=repository, repo_path=None, create=False ) # 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: - return changeset_revision + next_changeset_revision = suc.get_next_downloadable_changeset_revision( repository, repo, changeset_revision ) + if next_changeset_revision and next_changeset_revision != changeset_revision: + return next_changeset_revision return '' @web.json @@ -2865,7 +2865,7 @@ class RepositoryController( BaseUIController, ratings_util.ItemRatings ): # Get updates to the received changeset_revision if any exist. repo = hg_util.get_repo_for_repository( trans.app, repository=repository, repo_path=None, create=False ) upper_bound_changeset_revision = suc.get_next_downloadable_changeset_revision( repository, repo, changeset_revision ) - if upper_bound_changeset_revision: + if upper_bound_changeset_revision and upper_bound_changeset_revision != changeset_revision: changeset_revision = upper_bound_changeset_revision repository_metadata = metadata_util.get_repository_metadata_by_repository_id_changeset_revision( trans.app, repository_id, @@ -2914,12 +2914,12 @@ class RepositoryController( BaseUIController, ratings_util.ItemRatings ): else: next_installable_revision = suc.get_next_downloadable_changeset_revision( repository, repo, changeset_revision ) if repository_metadata is None: - if next_installable_revision: + if next_installable_revision and next_installable_revision != changeset_revision: tool_shed_status_dict[ 'latest_installable_revision' ] = 'True' else: tool_shed_status_dict[ 'latest_installable_revision' ] = 'False' else: - if next_installable_revision: + if next_installable_revision and next_installable_revision != changeset_revision: tool_shed_status_dict[ 'latest_installable_revision' ] = 'False' else: tool_shed_status_dict[ 'latest_installable_revision' ] = 'True' diff --git a/lib/tool_shed/capsule/capsule_manager.py b/lib/tool_shed/capsule/capsule_manager.py index 5fcd84c5b18..5f6ec1b3d64 100644 --- a/lib/tool_shed/capsule/capsule_manager.py +++ b/lib/tool_shed/capsule/capsule_manager.py @@ -596,7 +596,7 @@ class ImportRepositoryManager( object ): suc.get_next_downloadable_changeset_revision( defined_repository, defined_repo, changeset_revision ) - if updated_changeset_revision == rm_changeset_revision: + if updated_changeset_revision == rm_changeset_revision and updated_changeset_revision != changeset_revision: dependent_downloadable_revisions.append( downloadable_revision ) return dependent_downloadable_revisions diff --git a/lib/tool_shed/dependencies/repository/relation_builder.py b/lib/tool_shed/dependencies/repository/relation_builder.py index c25ad317903..6bc2e578aac 100644 --- a/lib/tool_shed/dependencies/repository/relation_builder.py +++ b/lib/tool_shed/dependencies/repository/relation_builder.py @@ -197,10 +197,11 @@ class RelationBuilder( object ): # The repository changeset_revision is no longer installable, so see if there's been an update. repo = hg_util.get_repo_for_repository( self.app, repository=repository, repo_path=None, create=False ) changeset_revision = suc.get_next_downloadable_changeset_revision( repository, repo, rd_changeset_revision ) - repository_metadata = \ - metadata_util.get_repository_metadata_by_repository_id_changeset_revision( self.app, - repository_id, - changeset_revision ) + if changeset_revision != rd_changeset_revision: + repository_metadata = \ + metadata_util.get_repository_metadata_by_repository_id_changeset_revision( self.app, + repository_id, + changeset_revision ) if repository_metadata: new_key_rd_dict = {} new_key_rd_dict[ key ] = \ diff --git a/lib/tool_shed/util/metadata_util.py b/lib/tool_shed/util/metadata_util.py index 8e0c9a387d5..01efebe540e 100644 --- a/lib/tool_shed/util/metadata_util.py +++ b/lib/tool_shed/util/metadata_util.py @@ -40,8 +40,8 @@ def get_dependencies_for_metadata_revision( app, metadata ): for shed, name, owner, changeset, prior, _ in metadata[ 'repository_dependencies' ]: required_repository = suc.get_repository_by_name_and_owner( app, name, owner ) repo = hg_util.get_repo_for_repository( app, repository=required_repository, repo_path=None, create=False ) - changeset = suc.get_next_downloadable_changeset_revision( required_repository, repo, changeset ) - if changeset is None: + updated_changeset = suc.get_next_downloadable_changeset_revision( required_repository, repo, changeset ) + if updated_changeset is None: continue metadata_entry = suc.get_repository_metadata_by_changeset_revision( app, app.security.encode_id( required_repository.id ), changeset ) dependencies.append( metadata_entry ) diff --git a/lib/tool_shed/util/repository_util.py b/lib/tool_shed/util/repository_util.py index 035acc46d7b..59f95f7b0aa 100644 --- a/lib/tool_shed/util/repository_util.py +++ b/lib/tool_shed/util/repository_util.py @@ -299,7 +299,7 @@ def get_repo_info_dict( app, user, repository_id, changeset_revision ): # repository_suite_definition or tool_dependency_definition. next_downloadable_changeset_revision = \ suc.get_next_downloadable_changeset_revision( repository, repo, changeset_revision ) - if next_downloadable_changeset_revision: + if next_downloadable_changeset_revision and next_downloadable_changeset_revision != changeset_revision: repository_metadata = suc.get_repository_metadata_by_changeset_revision( app, repository_id, next_downloadable_changeset_revision ) diff --git a/lib/tool_shed/util/shed_util_common.py b/lib/tool_shed/util/shed_util_common.py index b387c6c018c..5347d0bc746 100644 --- a/lib/tool_shed/util/shed_util_common.py +++ b/lib/tool_shed/util/shed_util_common.py @@ -318,7 +318,7 @@ def get_current_repository_metadata_for_changeset_revision( app, repository, cha updated_changeset_revision = get_next_downloadable_changeset_revision( repository, repo, after_changeset_revision=changeset_revision ) - if updated_changeset_revision: + if updated_changeset_revision and updated_changeset_revision != changeset_revision: repository_metadata = get_repository_metadata_by_changeset_revision( app, encoded_repository_id, updated_changeset_revision ) From e1b167b312385df2a02fb5c7d4c4c464e3733bd7 Mon Sep 17 00:00:00 2001 From: Dave Bouvier Date: Fri, 15 Apr 2016 13:41:21 -0400 Subject: [PATCH 09/10] Remove extra else statement. --- lib/galaxy/webapps/tool_shed/api/repository_revisions.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/galaxy/webapps/tool_shed/api/repository_revisions.py b/lib/galaxy/webapps/tool_shed/api/repository_revisions.py index 99765e5c864..be4c0908e0c 100644 --- a/lib/galaxy/webapps/tool_shed/api/repository_revisions.py +++ b/lib/galaxy/webapps/tool_shed/api/repository_revisions.py @@ -175,6 +175,7 @@ class RepositoryRevisionsController( BaseAPIController ): suc.get_repository_metadata_by_changeset_revision( trans.app, repository_dependency_id, new_changeset_revision ) + changeset_revision = new_changeset_revision else: decoded_repository_dependency_id = trans.security.decode_id( repository_dependency_id ) debug_msg = 'Cannot locate repository_metadata with id %d for repository dependency %s owned by %s ' % \ @@ -183,8 +184,6 @@ class RepositoryRevisionsController( BaseAPIController ): ( str( changeset_revision ), str( new_changeset_revision ) ) log.debug( debug_msg ) continue - else: - changeset_revision = new_changeset_revision repository_dependency_metadata_dict = \ repository_dependency_repository_metadata.to_dict( view='element', value_mapper=self.__get_value_mapper( trans ) ) From 50757a13baf060601b681795403ba503a8897ede Mon Sep 17 00:00:00 2001 From: Dave Bouvier Date: Fri, 15 Apr 2016 15:14:20 -0400 Subject: [PATCH 10/10] Fix test 0550. --- lib/tool_shed/util/metadata_util.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/tool_shed/util/metadata_util.py b/lib/tool_shed/util/metadata_util.py index 01efebe540e..cf4f3361d61 100644 --- a/lib/tool_shed/util/metadata_util.py +++ b/lib/tool_shed/util/metadata_util.py @@ -43,7 +43,7 @@ def get_dependencies_for_metadata_revision( app, metadata ): updated_changeset = suc.get_next_downloadable_changeset_revision( required_repository, repo, changeset ) if updated_changeset is None: continue - metadata_entry = suc.get_repository_metadata_by_changeset_revision( app, app.security.encode_id( required_repository.id ), changeset ) + metadata_entry = suc.get_repository_metadata_by_changeset_revision( app, app.security.encode_id( required_repository.id ), updated_changeset ) dependencies.append( metadata_entry ) return dependencies