From b39c71638ae6c7577ebcc82523656773e4ae569c Mon Sep 17 00:00:00 2001 From: Robert Knight Date: Thu, 1 Sep 2011 12:47:10 +0100 Subject: [PATCH] Add required --platform and --version arguments to the package creation script and allow the updater binary to be specified with a -u option These specify the target version for the update and the platform and are embedded in the and elements of the generated file_list.xml file Ordinarily the script will use the updater binary from the input files directory which matches the path of the updater binary specified in the package config file. However it may sometimes be necessary to use a different binary, which can be done via a -u option. --- tools/create-packages.rb | 68 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 65 insertions(+), 3 deletions(-) diff --git a/tools/create-packages.rb b/tools/create-packages.rb index e915303..f608bb3 100755 --- a/tools/create-packages.rb +++ b/tools/create-packages.rb @@ -25,6 +25,10 @@ require 'optparse' # This file lists all the files contained in this version of the software and # the packages which they are contained in. # +# /$UPDATER_BINARY +# The standalone auto-update installer binary. This is not compressed so that +# it can be downloaded and executed directly. +# # Represents a group of updates in a release class UpdateScriptPackage @@ -80,6 +84,8 @@ end class UpdateScriptGenerator + # target_version - The version string for the build in this update + # platform - The platform which this build is for # input_dir - The directory containing files that make up the install # output_dir - The directory containing the generated packages # package_config - The PackageConfig specifying the file -> package map @@ -87,7 +93,16 @@ class UpdateScriptGenerator # file_list - A list of all files in 'input_dir' which make up the install # package_file_map - A map of (package name -> [paths of files in this package]) - def initialize(input_dir, output_dir, package_config, file_list, package_file_map) + def initialize(target_version, + platform, + input_dir, + output_dir, + package_config, + file_list, + package_file_map) + + @target_version = target_version + @platform = platform @config = package_config # List of files to install in this version @@ -131,6 +146,14 @@ class UpdateScriptGenerator update_elem = REXML::Element.new("update") doc.add_element update_elem + version_elem = REXML::Element.new("targetVersion") + version_elem.text = @target_version + + platform_elem = REXML::Element.new("platform") + platform_elem.text = @platform + + update_elem.add_element version_elem + update_elem.add_element platform_elem update_elem.add_element deps_to_xml() update_elem.add_element packages_to_xml() update_elem.add_element install_to_xml() @@ -261,6 +284,10 @@ class PackageConfig @updater_binary = config_json["updater-binary"] end + def is_updater(file) + return file == @updater_binary + end + def package_for_file(file) @rule_map.each do |rule,package| if (file =~ rule) @@ -271,10 +298,26 @@ class PackageConfig end end +updater_binary_input_path = nil +target_version = nil +target_platform = nil + OptionParser.new do |parser| - parser.banner = "#{$0} " + parser.banner = "#{$0} [options] " + parser.on("-u","--updater [updater binary]","Specifies the updater binary to use") do |updater| + updater_binary_input_path = updater + end + parser.on("-v","--version [version]","Specifies the target version string for this update") do |version| + target_version = version + end + parser.on("-p","--platform [platform]","Specifies the target platform for this update") do |platform| + target_platform = platform + end end.parse! +raise "Platform not specified (use -p option)" if !target_platform +raise "Target version not specified (use -v option)" if !target_version + if ARGV.length < 3 raise "Missing arguments" end @@ -299,9 +342,19 @@ package_config = PackageConfig.new(package_map_file) # map of package name -> array of files package_file_map = {} + input_file_list.each do |file| next if File.symlink?(file) + # do not package the updater binary - leave + # it as a separate standalone tool + if package_config.is_updater(file) + # unless an updater binary has been explicitly specified, use + # the one included with the application + updater_binary_input_path = file if !updater_binary_input_path + next + end + package = package_config.package_for_file(file) if (!package) raise "Unable to find package for file #{file}" @@ -332,8 +385,17 @@ package_file_map.each do |package,files| end end +# copy the updater to the output directory +if !updater_binary_input_path + puts "Updater binary not found in input directory: #{input_dir}" + exit(1) +end + +FileUtils.cp(updater_binary_input_path,"#{output_dir}/#{File.basename(updater_binary_input_path)}") + # output the file_list.xml file -update_script = UpdateScriptGenerator.new(input_dir,output_dir,package_config,input_file_list,package_file_map) +update_script = UpdateScriptGenerator.new(target_version,target_platform,input_dir, + output_dir,package_config,input_file_list,package_file_map) output_xml_file = "#{output_dir}/file_list.unformatted.xml" File.open(output_xml_file,'w') do |file| file.write update_script.to_xml()