diff --git a/lib/tool_shed/util/repository_dependency_util.py b/lib/tool_shed/util/repository_dependency_util.py index 86ee20e58a3..c18ca91b00f 100644 --- a/lib/tool_shed/util/repository_dependency_util.py +++ b/lib/tool_shed/util/repository_dependency_util.py @@ -147,41 +147,48 @@ def create_repository_dependency_objects( trans, tool_path, tool_shed_url, repo_ dist_to_shed = installed_tool_shed_repository.dist_to_shed elif installed_tool_shed_repository.status in [ trans.model.ToolShedRepository.installation_status.DEACTIVATED ]: # The current tool shed repository is deactivated, so updating it's database record is not necessary - just activate it. + log.debug( "Reactivating deactivated tool_shed_repository '%s'." % str( installed_tool_shed_repository.name ) ) common_install_util.activate_repository( trans, installed_tool_shed_repository ) can_update = False else: # The tool shed repository currently being processed is already installed or is in the process of being installed, so it's record # in the database cannot be updated. + if installed_tool_shed_repository.status in [ trans.model.ToolShedRepository.installation_status.INSTALLED ]: + log.debug( "Skipping installation of tool_shed_repository '%s' because it is already installed." % \ + str( installed_tool_shed_repository.name ) ) + else: + log.debug( "Skipping installation of tool_shed_repository '%s' because it's installation status is '%s'." % \ + ( str( installed_tool_shed_repository.name ), str( installed_tool_shed_repository.status ) ) ) can_update = False else: # This block will be reached only if reinstalling is True, install_repository_dependencies is False and is_in_repo_info_dicts is False. # The tool shed repository currently being processed must be a repository dependency that the user elected to not install, so it's # record in the database cannot be updated. + debug_msg = "Skipping installation of tool_shed_repository '%s' because it is likely a " % str( installed_tool_shed_repository.name ) + debug_msg += "repository dependency that was elected to not be installed." + log.debug( debug_msg ) can_update = False else: # This block will be reached only if reinstalling is False and install_repository_dependencies is False. This implies that the tool shed # repository currently being processed has already been installed. - if len( all_repo_info_dicts ) == 1: - # If only a single repository is being installed, return an informative message to the user. - message += "Revision %s of tool shed repository %s owned by %s " % ( changeset_revision, name, repository_owner ) - if installed_changeset_revision != changeset_revision: - message += "was previously installed using changeset revision %s. " % installed_changeset_revision - else: - message += "was previously installed. " - if installed_tool_shed_repository.uninstalled: - message += "The repository has been uninstalled, however, so reinstall the original repository instead of installing it again. " - elif installed_tool_shed_repository.deleted: - message += "The repository has been deactivated, however, so activate the original repository instead of installing it again. " - if installed_changeset_revision != changeset_revision: - message += "You can get the latest updates for the repository using the Get updates option from the repository's " - message += "Repository Actions pop-up menu. " - created_or_updated_tool_shed_repositories.append( installed_tool_shed_repository ) - tool_panel_section_keys.append( tool_panel_section_key ) - return created_or_updated_tool_shed_repositories, tool_panel_section_keys, all_repo_info_dicts, filtered_repo_info_dicts, message - else: - # We're in the process of installing multiple tool shed repositories into Galaxy. Since the repository currently being processed - # has already been installed, skip it and process the next repository in the list. + if installed_tool_shed_repository.status in [ trans.model.ToolShedRepository.installation_status.INSTALLED ]: + # Since the repository currently being processed is already in the INSTALLED state, skip it and process the next repository in the + # list if there is one. + log.debug( "Skipping installation of tool_shed_repository '%s' because it's installation status is '%s'." % \ + ( str( installed_tool_shed_repository.name ), str( installed_tool_shed_repository.status ) ) ) can_update = False + else: + # The repository currently being processed is in some state other than INSTALLED, so reset it for installation. + debug_msg = "Resetting tool_shed_repository '%s' for installation.\n" % str( installed_tool_shed_repository.name ) + debug_msg += "The current state of the tool_shed_repository is:\n" + debug_msg += "deleted: %s\n" % str( installed_tool_shed_repository.deleted ) + debug_msg += "update_available: %s\n" % str( installed_tool_shed_repository.update_available ) + debug_msg += "uninstalled: %s\n" % str( installed_tool_shed_repository.uninstalled ) + debug_msg += "status: %s\n" % str( installed_tool_shed_repository.status ) + debug_msg += "error_message: %s\n" % str( installed_tool_shed_repository.error_message ) + log.debug( debug_msg ) + suc.reset_previously_installed_repository( trans, installed_tool_shed_repository ) + can_update = True else: # A tool shed repository is being installed into a Galaxy instance for the first time, or we're attempting to install it or reinstall it resulted # in an error. In the latter case, the repository record in the database has no metadata and it's status has been set to 'New'. In either case, diff --git a/lib/tool_shed/util/shed_util_common.py b/lib/tool_shed/util/shed_util_common.py index f63e6e92acc..0475795ddd5 100644 --- a/lib/tool_shed/util/shed_util_common.py +++ b/lib/tool_shed/util/shed_util_common.py @@ -1182,6 +1182,19 @@ def repository_was_previously_installed( trans, tool_shed_url, repository_name, return tool_shed_repository, previous_changeset_revision return None, None +def reset_previously_installed_repository( trans, repository ): + """ + Reset the atrributes of a tool_shed_repository that was previsouly installed. The repository will be in some state other than with a + status of INSTALLED, so all atributes will be set to the default NEW state. This will enable the repository to be freshly installed. + """ + repository.deleted = False + repository.update_available = False + repository.uninstalled = False + repository.status = trans.model.ToolShedRepository.installation_status.NEW + repository.error_message = None + trans.sa_session.add( repository ) + trans.sa_session.flush() + def reversed_lower_upper_bounded_changelog( repo, excluded_lower_bounds_changeset_revision, included_upper_bounds_changeset_revision ): """ Return a reversed list of changesets in the repository changelog after the excluded_lower_bounds_changeset_revision, but up to and diff --git a/test/tool_shed/functional/test_1000_install_basic_repository.py b/test/tool_shed/functional/test_1000_install_basic_repository.py index 368348d4a0f..d34832dd0bd 100644 --- a/test/tool_shed/functional/test_1000_install_basic_repository.py +++ b/test/tool_shed/functional/test_1000_install_basic_repository.py @@ -106,20 +106,21 @@ class BasicToolShedFeatures( ShedTwillTestCase ): self.verify_tool_metadata_for_installed_repository( installed_repository ) def test_0030_install_filtering_repository_again( self ): - '''Attempt to install the already installed filtering repository, and check for the resulting error message.''' + '''Attempt to install the already installed filtering repository.''' installed_repository = test_db_util.get_installed_repository_by_name_owner( 'filtering_0000', common.test_user_1_name ) - post_submit_strings_displayed = [ installed_repository.name, - installed_repository.owner, - installed_repository.installed_changeset_revision, - 'was previously installed', - 'to manage the repository' ] + # The page displayed after installation is the ajaxian "Montior installing tool shed repositories" page. Since the filter + # repository was already installed, nothing will be in the process of being installed, so the grid will display 'No Items'. + post_submit_strings_displayed = [ 'No Items' ] self.install_repository( 'filtering_0000', common.test_user_1_name, 'Test 0000 Basic Repository Features 1', post_submit_strings_displayed=post_submit_strings_displayed ) strings_displayed = [ 'filtering_0000', - 'user1', + "Galaxy's filtering tool", + 'user1', + self.url.replace( 'http://', '' ), installed_repository.installed_changeset_revision ] + self.display_installed_repository_manage_page( installed_repository, strings_displayed=strings_displayed ) self.display_galaxy_browse_repositories_page( strings_displayed=strings_displayed ) def test_0035_verify_installed_repository_metadata( self ):