Warning
This document is for an old release of Galaxy. You can alternatively view this page in the latest release if it exists or view the top of the latest release's documentation.
Source code for tool_shed.util.repository_content_util
import os
import shutil
import tarfile
import tempfile
from typing import (
Optional,
TYPE_CHECKING,
)
import tool_shed.repository_types.util as rt_util
from galaxy.tool_shed.util.hg_util import clone_repository
from galaxy.util import checkers
from tool_shed.dependencies.attribute_handlers import (
RepositoryDependencyAttributeHandler,
ToolDependencyAttributeHandler,
)
from tool_shed.util import xml_util
from tool_shed.util.commit_util import (
ChangeResponseT,
check_archive,
handle_directory_changes,
)
if TYPE_CHECKING:
from tool_shed.context import ProvidesRepositoriesContext
from tool_shed.webapp.model import Repository
[docs]def tar_open(uploaded_file):
isgzip = False
isbz2 = False
isgzip = checkers.is_gzip(uploaded_file)
if not isgzip:
isbz2 = checkers.is_bz2(uploaded_file)
if isgzip or isbz2:
# Open for reading with transparent compression.
tar = tarfile.open(uploaded_file, "r:*")
else:
tar = tarfile.open(uploaded_file)
return tar
[docs]def upload_tar(
trans: "ProvidesRepositoriesContext",
username: str,
repository: "Repository",
uploaded_file,
commit_message: str,
dry_run: bool = False,
remove_repo_files_not_in_tar: bool = True,
new_repo_alert: bool = False,
tar=None,
rdah: Optional[RepositoryDependencyAttributeHandler] = None,
tdah: Optional[ToolDependencyAttributeHandler] = None,
) -> ChangeResponseT:
host = trans.repositories_hostname
app = trans.app
if tar is None:
tar = tar_open(uploaded_file)
rdah = rdah or RepositoryDependencyAttributeHandler(trans, unpopulate=False)
tdah = tdah or ToolDependencyAttributeHandler(trans, unpopulate=False)
# Upload a tar archive of files.
undesirable_dirs_removed = 0
undesirable_files_removed = 0
check_results = check_archive(repository, tar)
if check_results.invalid:
tar.close()
try:
uploaded_file.close()
except AttributeError:
pass
message = "{} Invalid paths were: {}".format(
" ".join(check_results.errors), ", ".join([i.name for i in check_results.invalid])
)
return False, message, [], "", undesirable_dirs_removed, undesirable_files_removed
else:
repo_dir = repository.repo_path(app)
if dry_run:
full_path = tempfile.mkdtemp()
clone_repository(repo_dir, full_path)
else:
full_path = os.path.abspath(repo_dir)
undesirable_files_removed = len(check_results.undesirable_files)
undesirable_dirs_removed = len(check_results.undesirable_dirs)
filenames_in_archive = [ti.name for ti in check_results.valid]
# Extract the uploaded tar to the load_point within the repository hierarchy.
tar.extractall(path=full_path, members=check_results.valid)
tar.close()
try:
uploaded_file.close()
except AttributeError:
pass
for filename in filenames_in_archive:
uploaded_file_name = os.path.join(full_path, filename)
if os.path.split(uploaded_file_name)[-1] == rt_util.REPOSITORY_DEPENDENCY_DEFINITION_FILENAME:
# Inspect the contents of the file to see if toolshed or changeset_revision attributes
# are missing and if so, set them appropriately.
altered, root_elem, error_message = rdah.handle_tag_attributes(uploaded_file_name)
if error_message:
return False, error_message, [], "", 0, 0
elif altered:
tmp_filename = xml_util.create_and_write_tmp_file(root_elem)
shutil.move(tmp_filename, uploaded_file_name)
elif os.path.split(uploaded_file_name)[-1] == rt_util.TOOL_DEPENDENCY_DEFINITION_FILENAME:
# Inspect the contents of the file to see if toolshed or changeset_revision
# attributes are missing and if so, set them appropriately.
altered, root_elem, error_message = tdah.handle_tag_attributes(uploaded_file_name)
if error_message:
return False, error_message, [], "", 0, 0
if altered:
tmp_filename = xml_util.create_and_write_tmp_file(root_elem)
shutil.move(tmp_filename, uploaded_file_name)
return handle_directory_changes(
app,
host,
username,
repository,
full_path,
filenames_in_archive,
remove_repo_files_not_in_tar,
new_repo_alert,
commit_message,
undesirable_dirs_removed,
undesirable_files_removed,
repo_path=full_path,
)