Files
galaxy/tools/data_export/export_remote.py
T

90 lines
3.2 KiB
Python

import argparse
import json
import os
import sys
from galaxy.files import ConfiguredFileSources
def get_file_sources(file_sources_path):
assert os.path.exists(file_sources_path), f"file sources path [{file_sources_path}] does not exist"
with open(file_sources_path) as f:
file_sources_as_dict = json.load(f)
file_sources = ConfiguredFileSources.from_dict(file_sources_as_dict)
return file_sources
def check_for_duplicate_name(files_to_export):
seen = set()
duplicates = set()
for entry in files_to_export:
name = entry["staging_path"]
if name in seen:
duplicates.add(name)
seen.add(name)
if duplicates:
sys.exit(f"Duplicate export filenames given: {', '.join(duplicates)}, failing export")
def write_if_not_exists(file_sources, target_uri, real_data_path):
file_source_path = file_sources.get_file_source_path(target_uri)
if os.path.exists(file_source_path.path):
print(f'Error: File "{file_source_path.path}" already exists. Skipping.')
return 1
file_source = file_source_path.file_source
file_source.write_from(file_source_path.path, real_data_path)
def get_directory_uri(args):
directory_uri = args.directory_uri
if not directory_uri:
inputs = json.load(open(args.inputs, "r"))
directory_uri = inputs["d_uri"]
if not directory_uri.endswith("/"):
directory_uri = f"{directory_uri}/"
return directory_uri
def main(argv=None):
if argv is None:
argv = sys.argv[1:]
args = _parser().parse_args(argv)
exit_code = 0
file_sources = get_file_sources(args.file_sources)
directory_uri = get_directory_uri(args)
export_metadata_files = args.export_metadata_files
with open(args.files_to_export) as f:
files_to_export = json.load(f)
counter = 0
check_for_duplicate_name(files_to_export)
for entry in files_to_export:
name = entry["staging_path"]
real_data_path = entry["source_path"]
target_uri = f"{directory_uri}{name}"
if write_if_not_exists(file_sources, target_uri, real_data_path):
exit_code = 1
if export_metadata_files:
metadata_files = entry.get("metadata_files", [])
for metadata_file in metadata_files:
metadata_file_uri = f"{directory_uri}{metadata_file['staging_path']}"
if write_if_not_exists(file_sources, metadata_file_uri, metadata_file["source_path"]):
exit_code = 1
counter += 1
print(f"{counter} out of {len(files_to_export)} files have been exported.\n")
sys.exit(exit_code)
def _parser():
parser = argparse.ArgumentParser()
parser.add_argument("--inputs", type=str, help="galaxy inputs")
# post 2026.XX drop the directory-uri argument and just assume inputs always contains d_uri.
parser.add_argument("--directory-uri", type=str, help="directory target URI")
parser.add_argument("--file-sources", type=str, help="file sources json")
parser.add_argument("--files-to-export", type=str, help="files to export")
parser.add_argument("--export-metadata-files", type=bool, help="export metadata files", default=False)
return parser
if __name__ == "__main__":
main()