def upload_to_bundle_store(self, bundle, sources, follow_symlinks, exclude_patterns, remove_sources, git, unpack, simplify_archives): """ Uploads contents for the given bundle to the bundle store. |sources|: specifies the locations of the contents to upload. Each element is either a URL, a local path or a tuple (filename, file-like object). |follow_symlinks|: for local path(s), whether to follow (resolve) symlinks, but only if remove_sources is False. |exclude_patterns|: for local path(s), don't upload these patterns (e.g., *.o), but only if remove_sources is False. |remove_sources|: for local path(s), whether |sources| should be removed |git|: for URLs, whether |source| is a git repo to clone. |unpack|: for each source in |sources|, whether to unpack it if it's an archive. |simplify_archives|: whether to simplify unpacked archives so that if they contain a single file, the final path is just that file, not a directory containing that file. If |sources| contains one source, then the bundle contents will be that source. Otherwise, the bundle contents will be a directory with each of the sources. Exceptions: - If |git|, then each source is replaced with the result of running 'git clone |source|' - If |unpack| is True or a source is an archive (zip, tar.gz, etc.), then unpack the source. """ bundle_path = self._bundle_store.get_bundle_location(bundle.uuid) try: path_util.make_directory(bundle_path) # Note that for uploads with a single source, the directory # structure is simplified at the end. for source in sources: is_url, is_local_path, is_fileobj, filename = self._interpret_source(source) source_output_path = os.path.join(bundle_path, filename) if is_url: if git: source_output_path = file_util.strip_git_ext(source_output_path) file_util.git_clone(source, source_output_path) else: file_util.download_url(source, source_output_path) if unpack and self._can_unpack_file(source_output_path): self._unpack_file( source_output_path, zip_util.strip_archive_ext(source_output_path), remove_source=True, simplify_archive=simplify_archives) elif is_local_path: source_path = path_util.normalize(source) path_util.check_isvalid(source_path, 'upload') if unpack and self._can_unpack_file(source_path): self._unpack_file( source_path, zip_util.strip_archive_ext(source_output_path), remove_source=remove_sources, simplify_archive=simplify_archives) elif remove_sources: path_util.rename(source_path, source_output_path) else: path_util.copy(source_path, source_output_path, follow_symlinks=follow_symlinks, exclude_patterns=exclude_patterns) elif is_fileobj: if unpack and zip_util.path_is_archive(filename): self._unpack_fileobj( source[0], source[1], zip_util.strip_archive_ext(source_output_path), simplify_archive=simplify_archives) else: with open(source_output_path, 'wb') as out: shutil.copyfileobj(source[1], out) if len(sources) == 1: self._simplify_directory(bundle_path) except: if os.path.exists(bundle_path): path_util.remove(bundle_path) raise
def upload_to_bundle_store( self, bundle, sources, follow_symlinks, exclude_patterns, remove_sources, git, unpack, simplify_archives, ): """ Uploads contents for the given bundle to the bundle store. |sources|: specifies the locations of the contents to upload. Each element is either a URL, a local path or a tuple (filename, binary file-like object). |follow_symlinks|: for local path(s), whether to follow (resolve) symlinks, but only if remove_sources is False. |exclude_patterns|: for local path(s), don't upload these patterns (e.g., *.o), but only if remove_sources is False. |remove_sources|: for local path(s), whether |sources| should be removed |git|: for URLs, whether |source| is a git repo to clone. |unpack|: for each source in |sources|, whether to unpack it if it's an archive. |simplify_archives|: whether to simplify unpacked archives so that if they contain a single file, the final path is just that file, not a directory containing that file. If |sources| contains one source, then the bundle contents will be that source. Otherwise, the bundle contents will be a directory with each of the sources. Exceptions: - If |git|, then each source is replaced with the result of running 'git clone |source|' - If |unpack| is True or a source is an archive (zip, tar.gz, etc.), then unpack the source. """ exclude_patterns = (self._default_exclude_patterns + exclude_patterns if exclude_patterns else self._default_exclude_patterns) bundle_link_url = getattr(bundle.metadata, "link_url", None) if bundle_link_url: # Don't do anything for linked bundles. return bundle_path = self._bundle_store.get_bundle_location(bundle.uuid) try: path_util.make_directory(bundle_path) # Note that for uploads with a single source, the directory # structure is simplified at the end. for source in sources: is_url, is_local_path, is_fileobj, filename = self._interpret_source( source) source_output_path = os.path.join(bundle_path, filename) if is_url: if git: source_output_path = file_util.strip_git_ext( source_output_path) file_util.git_clone(source, source_output_path) else: file_util.download_url(source, source_output_path) if unpack and self._can_unpack_file( source_output_path): self._unpack_file( source_output_path, zip_util.strip_archive_ext(source_output_path), remove_source=True, simplify_archive=simplify_archives, ) elif is_local_path: source_path = path_util.normalize(source) path_util.check_isvalid(source_path, 'upload') if unpack and self._can_unpack_file(source_path): self._unpack_file( source_path, zip_util.strip_archive_ext(source_output_path), remove_source=remove_sources, simplify_archive=simplify_archives, ) elif remove_sources: path_util.rename(source_path, source_output_path) else: path_util.copy( source_path, source_output_path, follow_symlinks=follow_symlinks, exclude_patterns=exclude_patterns, ) elif is_fileobj: if unpack and zip_util.path_is_archive(filename): self._unpack_fileobj( source[0], source[1], zip_util.strip_archive_ext(source_output_path), simplify_archive=simplify_archives, ) else: with open(source_output_path, 'wb') as out: shutil.copyfileobj(source[1], out) if len(sources) == 1: self._simplify_directory(bundle_path) except: if os.path.exists(bundle_path): path_util.remove(bundle_path) raise