123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- #!/usr/bin/ruby
-
- require 'optparse'
- require 'yaml'
- require 'fileutils'
- require 'pathname'
-
- @options = {}
-
- def system!(cmd)
- system(cmd) or raise "failed to run #{cmd}"
- end
-
- def sanitize(str, where)
- raise "unsanitary string in #{where}" if (str =~ /[^\w.-]/)
- str
- end
-
- def sanitize_path(str, where)
- raise "unsanitary string in #{where}" if (str =~ /[^@\w\/.:+-]/)
- str
- end
-
- def info(str)
- puts str unless @options[:quiet]
- end
-
- ################################
-
- OptionParser.new do |opts|
- opts.banner = "Usage: build [options] <build-description>.yml"
-
- opts.on("-q", "--quiet", "be quiet") do |v|
- @options[:quiet] = v
- end
-
- opts.on("-s SIGNER", "--signer SIGNER", "identity to sign as") do |v|
- @options[:signer] = v
- end
-
- opts.on("-r REL", "--release REL", "release name") do |v|
- @options[:release] = v
- end
-
- opts.on("-d DEST", "--destination DEST", "directory to place signature in") do |v|
- @options[:destination] = v
- end
-
- opts.on("-p PROG", "--signing_program PROG", "specify signing program to use") do |v|
- @options[:program] = v
- end
- end.parse!
-
- base_dir = Pathname.new(__FILE__).expand_path.dirname.parent
-
- build_desc_file = ARGV.shift or raise "must supply YAML build description file"
-
- build_desc = YAML.load_file(build_desc_file)
-
- in_sums = []
-
- result_dir = 'result'
-
- package_name = build_desc["name"] or raise "must supply name"
- optionals = build_desc["optionals"] or []
- package_name = sanitize(package_name, "package name")
-
- result_file = "#{package_name}-res.yml"
- result_path = File.join(result_dir, result_file)
- File.exists?(result_path) or raise "#{result_path} does not exist"
- result = YAML.load_file(result_path)
-
- destination = @options[:destination] || File.join(base_dir, "sigs", package_name)
- release = @options[:release] || "test"
- release = sanitize(release, "release")
-
- result['release'] = release
- result['name'] = package_name
- result['type'] = 'build'
- result['optionals'] = optionals
-
- signer = @options[:signer] or raise "must supply signer with --signer"
- program = @options[:program] || "gpg --detach-sign"
-
- FileUtils.mkdir_p(destination)
-
- release_path = File.join(destination, release, signer)
- FileUtils.mkdir_p(release_path)
- assert_path = File.join(release_path, "#{package_name}-build.assert")
- File.open(assert_path, "w") do |io|
- io.write result.to_yaml
- end
- system!("#{program} -u \"#{signer}\" \"#{assert_path}\"")
|