Files
galaxy/scripts/tool_shed/api/export.py
T
Nicola Soranzo a353b2e88f Fix E127 errors introduced by previous commit
using:
```
autopep8 -i -r --exclude $(sed -e 's|^|./|' -e 's|/$||' .ci/flake8_blacklist.txt | paste -sd,) --select E127 .
```
2017-08-17 11:35:39 +01:00

135 lines
6.3 KiB
Python

#!/usr/bin/env python
"""
Export a specified repository revision and optionally all of its defined repository
dependencies from the tool shed into a compressed archive.
Here is a working example of how to use this script to export a repository from the tool shed.
./export.py --url http://testtoolshed.g2.bx.psu.edu --name chemicaltoolbox --owner bgruening --revision 4133dbf7ff4d --export_repository_dependencies True --download_dir /tmp
"""
import argparse
import os
import sys
import tempfile
import urllib2
sys.path.insert(1, os.path.join(os.path.dirname(__file__), os.pardir, os.pardir, os.pardir, 'lib'))
from tool_shed.util import basic_util
from common import display, submit
CAPSULE_FILENAME = 'capsule'
CAPSULE_WITH_DEPENDENCIES_FILENAME = 'capsule_with_dependencies'
CHUNK_SIZE = 2 ** 20 # 1Mb
def generate_repository_archive_filename(tool_shed_url, name, owner, changeset_revision, file_type,
export_repository_dependencies, use_tmp_archive_dir=False):
tool_shed = remove_protocol_from_tool_shed_url(tool_shed_url)
file_type_str = basic_util.get_file_type_str(changeset_revision, file_type)
if export_repository_dependencies:
repositories_archive_filename = '%s_%s_%s_%s_%s' % (CAPSULE_WITH_DEPENDENCIES_FILENAME,
tool_shed,
name,
owner,
file_type_str)
else:
repositories_archive_filename = '%s_%s_%s_%s_%s' % (CAPSULE_FILENAME,
tool_shed,
name,
owner,
file_type_str)
if use_tmp_archive_dir:
tmp_archive_dir = tempfile.mkdtemp(prefix="tmp-toolshed-arcdir")
repositories_archive_filename = os.path.join(tmp_archive_dir, repositories_archive_filename)
return repositories_archive_filename
def remove_protocol_from_tool_shed_url(tool_shed_url):
protocol, base = tool_shed_url.split('://')
base = base.replace(':', '_colon_')
base = base.rstrip('/')
return base
def string_as_bool(string):
if str(string).lower() in ('true', 'yes', 'on'):
return True
else:
return False
def main(options):
"""Collect all user data and export the repository via the Tool Shed API."""
base_tool_shed_url = options.tool_shed_url.rstrip('/')
repositories_url = '%s/api/repositories' % base_tool_shed_url
data = {}
data['tool_shed_url'] = base_tool_shed_url
data['name'] = options.name
data['owner'] = options.owner
data['changeset_revision'] = options.changeset_revision
data['export_repository_dependencies'] = options.export_repository_dependencies
repository_id = None
repositories = display(repositories_url, api_key=None, return_formatted=False)
for repository in repositories:
name = str(repository['name'])
owner = str(repository['owner'])
if name == options.name and owner == options.owner:
repository_id = repository['id']
break
if repository_id:
# We'll currently support only gzip-compressed tar archives.
file_type = 'gz'
url = '%s%s' % (base_tool_shed_url, '/api/repository_revisions/%s/export' % str(repository_id))
export_dict = submit(url, data, return_formatted=False)
error_messages = export_dict['error_messages']
if error_messages:
print "Error attempting to export revision ", options.changeset_revision, " of repository ", options.name, " owned by ", options.owner, ":\n", error_messages
else:
export_repository_dependencies = string_as_bool(options.export_repository_dependencies)
repositories_archive_filename = \
generate_repository_archive_filename(base_tool_shed_url,
options.name,
options.owner,
options.changeset_revision,
file_type,
export_repository_dependencies=export_repository_dependencies,
use_tmp_archive_dir=False)
download_url = export_dict['download_url']
download_dir = os.path.abspath(options.download_dir)
file_path = os.path.join(download_dir, repositories_archive_filename)
src = None
dst = None
try:
src = urllib2.urlopen(download_url)
dst = open(file_path, 'wb')
while True:
chunk = src.read(CHUNK_SIZE)
if chunk:
dst.write(chunk)
else:
break
except:
raise
finally:
if src:
src.close()
if dst:
dst.close()
print "Successfully exported revision ", options.changeset_revision, " of repository ", options.name, " owned by ", options.owner
print "to location ", file_path
else:
print "Invalid tool_shed / name / owner ."
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='Installation of tool shed repositories via the Galaxy API.')
parser.add_argument("-u", "--url", dest="tool_shed_url", required=True, help="Tool Shed URL")
parser.add_argument("-n", "--name", required=True, help="Repository name.")
parser.add_argument("-o", "--owner", required=True, help="Repository owner.")
parser.add_argument("-r", "--revision", dest="changeset_revision", required=True, help="Repository owner.")
parser.add_argument("-e", "--export_repository_dependencies", dest="export_repository_dependencies", required=False, default='False', help="Export repository dependencies.")
parser.add_argument("-d", "--download_dir", dest="download_dir", required=False, default='/tmp', help="Download directory.")
options = parser.parse_args()
main(options)