lib/roku_builder/loader.rb in roku_builder-3.5.0 vs lib/roku_builder/loader.rb in roku_builder-3.6.0

- old
+ new

@@ -9,66 +9,73 @@ @root_dir = root_dir end # Sideload an app onto a roku device # @param root_dir [String] Path to the root directory of the roku app - # @param folders [Array<String>] Array of folders to be sideloaded. Pass nil to send all folders. Default: nil - # @param files [Array<String>] Array of files to be sideloaded. Pass nil to send all files. Default: nil + # @param content [Hash] Hash containing arrays for folder, files, and excludes. Default: nil # @return [String] Build version on success, nil otherwise - def sideload(update_manifest: false, folders: nil, files: nil) - result = nil - # Update manifest - build_version = "" - if update_manifest - build_version = ManifestManager.update_build(root_dir: @root_dir) + def sideload(update_manifest: false, content: nil, infile: nil) + result = FAILED_SIDELOAD + outfile = nil + build_version = nil + if infile + build_version = ManifestManager.build_version(root_dir: infile) + outfile = infile else - build_version = ManifestManager.build_version(root_dir: @root_dir) + # Update manifest + if update_manifest + build_version = ManifestManager.update_build(root_dir: @root_dir) + else + build_version = ManifestManager.build_version(root_dir: @root_dir) + end + outfile = build(build_version: build_version, content: content) end - outfile = build(build_version: build_version, folders: folders, files: files) path = "/plugin_install" # Connect to roku and upload file conn = multipart_connection payload = { mysubmit: "Replace", archive: Faraday::UploadIO.new(outfile, 'application/zip') } response = conn.post path, payload # Cleanup - File.delete(outfile) - result = build_version if response.status==200 and response.body=~/Install Success/ - result + File.delete(outfile) unless infile + result = SUCCESS if response.status==200 and response.body=~/Install Success/ + result = IDENTICAL_SIDELOAD if response.status==200 and response.body=~/Identical to previous version/ + [result, build_version] end # Build an app to sideload later # @param root_dir [String] Path to the root directory of the roku app # @param build_version [String] Version to assigne to the build. If nil will pull the build version form the manifest. Default: nil # @param outfile [String] Path for the output file. If nil will create a file in /tmp. Default: nil - # @param folders [Array<String>] Array of folders to be sideloaded. Pass nil to send all folders. Default: nil - # @param files [Array<String>] Array of files to be sideloaded. Pass nil to send all files. Default: nil + # @param content [Hash] Hash containing arrays for folder, files, and excludes. Default: nil # @return [String] Path of the build - def build(build_version: nil, outfile: nil, folders: nil, files: nil) + def build(build_version: nil, outfile: nil, content: nil) build_version = ManifestManager.build_version(root_dir: @root_dir) unless build_version - unless folders - folders = Dir.entries(@root_dir).select {|entry| File.directory? File.join(@root_dir, entry) and !(entry =='.' || entry == '..') } + content ||= {} + unless content and content[:folders] + content[:folders] = Dir.entries(@root_dir).select {|entry| File.directory? File.join(@root_dir, entry) and !(entry =='.' || entry == '..') } end - unless files - files = Dir.entries(@root_dir).select {|entry| File.file? File.join(@root_dir, entry)} + unless content and content[:files] + content[:files] = Dir.entries(@root_dir).select {|entry| File.file? File.join(@root_dir, entry)} end + content[:excludes] = [] unless content and content[:excludes] outfile = "/tmp/build_#{build_version}.zip" unless outfile File.delete(outfile) if File.exist?(outfile) io = Zip::File.open(outfile, Zip::File::CREATE) # Add folders to zip - folders.each do |folder| + content[:folders].each do |folder| base_folder = File.join(@root_dir, folder) entries = Dir.entries(base_folder) entries.delete(".") entries.delete("..") - writeEntries(@root_dir, entries, folder, io) + writeEntries(@root_dir, entries, folder, content[:excludes], io) end # Add file to zip - writeEntries(@root_dir, files, "", io) + writeEntries(@root_dir, content[:files], "", content[:excludes], io) io.close() outfile end # Remove the currently sideloaded app @@ -93,19 +100,21 @@ # Recursively write directory contents to a zip archive # @param root_dir [String] Path of the root directory # @param entries [Array<String>] Array of file paths of files/directories to store in the zip archive # @param path [String] The path of the current directory starting at the root directory # @param io [IO] zip IO object - def writeEntries(root_dir, entries, path, io) + def writeEntries(root_dir, entries, path, excludes, io) entries.each { |e| zipFilePath = path == "" ? e : File.join(path, e) diskFilePath = File.join(root_dir, zipFilePath) if File.directory?(diskFilePath) io.mkdir(zipFilePath) subdir =Dir.entries(diskFilePath); subdir.delete("."); subdir.delete("..") - writeEntries(root_dir, subdir, zipFilePath, io) + writeEntries(root_dir, subdir, zipFilePath, excludes, io) else - io.get_output_stream(zipFilePath) { |f| f.puts(File.open(diskFilePath, "rb").read()) } + unless excludes.include?(zipFilePath) + io.get_output_stream(zipFilePath) { |f| f.puts(File.open(diskFilePath, "rb").read()) } + end end } end end end