Mercurial > repos > shellac > sam_consensus_v3
diff env/lib/python3.9/site-packages/planemo/commands/cmd_shed_update.py @ 0:4f3585e2f14b draft default tip
"planemo upload commit 60cee0fc7c0cda8592644e1aad72851dec82c959"
author | shellac |
---|---|
date | Mon, 22 Mar 2021 18:12:50 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/env/lib/python3.9/site-packages/planemo/commands/cmd_shed_update.py Mon Mar 22 18:12:50 2021 +0000 @@ -0,0 +1,151 @@ +"""Module describing the planemo ``shed_update`` command.""" +import sys + +import click + +from planemo import options +from planemo import shed +from planemo.cli import command_function +from planemo.io import ( + captured_io_for_xunit, + error, + info, +) +from planemo.reports.xunit_handler import handle_report_xunit_kwd + + +@click.command("shed_update") +@options.report_xunit() +@options.shed_publish_options() +@options.shed_upload_options() +@options.shed_skip_upload() +@options.shed_skip_metadata() +@command_function +def cli(ctx, paths, **kwds): + """Update Tool Shed repository. + + By default this command will update both repository metadata + from ``.shed.yml`` and upload new contents from the repository + directory. + + \b + % planemo shed_update + + This will update the main tool shed with the repository defined + by a ``.shed.yml`` file in the current working directory. Both + the location of the ``.shed.yml`` and the tool shed to upload to + can be easily configured. For instance, the following command can + be used if ``.shed.yml`` if contained in ``path/to/repo`` and the + desire is to update the test tool shed. + + \b + % planemo shed_update --shed_target testtoolshed path/to/repo + + Another important option is ``--check_diff`` - this doesn't affect the + updating of shed metadata but it will check for differences before + uploading new contents to the tool shed. This may important because the + tool shed will automatically populate certain attributes in tool shed + artifact files (such as ``tool_dependencies.xml``) and this may + cause unwanted installable revisions to be created when there are no + important changes. + + The lower-level ``shed_upload`` command should be used instead if + the repository doesn't define complete metadata in a ``.shed.yml``. + """ + # In a little bit of cheating, we're defining this variable here to collect + # a "report" on the shed_update command + collected_data = { + 'results': { + 'total': 0, + 'errors': 0, + 'failures': 0, + 'skips': 0, + }, + 'suitename': 'update', + 'tests': [], + } + + shed_context = shed.get_shed_context(ctx, **kwds) + + def update(realized_repository): + collected_data['results']['total'] += 1 + skip_upload = kwds["skip_upload"] + skip_metadata = kwds["skip_metadata"] + upload_ret_code = 0 + upload_ok = True + + captured_io = {} + if not skip_upload: + with captured_io_for_xunit(kwds, captured_io): + upload_ret_code = shed.upload_repository( + ctx, realized_repository, **kwds + ) + upload_ok = not upload_ret_code + + repo_result = { + 'classname': realized_repository.name, + 'time': captured_io.get("time", None), + 'name': 'shed-update', + 'stdout': captured_io.get("stdout", None), + 'stderr': captured_io.get("stderr", None), + } + + # Now that we've uploaded (or skipped appropriately), collect results. + if upload_ret_code == 2: + collected_data['results']['failures'] += 1 + message = "Failed to update repository '%s' as it does not exist on the %s." % (realized_repository.name, shed_context.label) + repo_result.update({ + 'errorType': 'FailedUpdate', + 'errorMessage': message, + }) + collected_data['tests'].append(repo_result) + error(message) + return upload_ret_code + + exit = 0 + metadata_ok = True + repository_destination_label = "repository '%s' on the %s" % (realized_repository.name, shed_context.label) + if not skip_metadata: + repo_id = shed.handle_force_create(realized_repository, ctx, shed_context, **kwds) + # failing to create the repo, give up + if repo_id is None: + exit = shed.report_non_existent_repository(realized_repository) + metadata_ok = False + error("Failed to update metadata for %s." % repository_destination_label) + else: + metadata_ok = realized_repository.update(ctx, shed_context, repo_id) + if metadata_ok: + info("Repository metadata updated successfully for %s." % repository_destination_label) + else: + info("Skipping metadata update for %s" % repository_destination_label) + + if metadata_ok and upload_ok: + pass + elif upload_ok: + collected_data['results']['skips'] += 1 + repo_result.update({ + 'errorType': 'FailedMetadata', + 'errorMessage': 'Failed to update repository metadata', + }) + if not skip_upload: + error("Repository contents updated but failed to update metadata for %s." % repository_destination_label) + exit = exit or 1 + else: + collected_data['results']['failures'] += 1 + repo_result.update({ + 'errorType': 'FailedUpdate', + 'errorMessage': 'Failed to update repository', + }) + if metadata_ok: + error("Failed to update repository contents for %s." % repository_destination_label) + else: + error("Failed to update repository contents and metadata for %s." % repository_destination_label) + exit = exit or 1 + collected_data['tests'].append(repo_result) + return exit + + exit_code = shed.for_each_repository(ctx, update, paths, **kwds) + + handle_report_xunit_kwd(kwds, collected_data) + + sys.exit(exit_code)