#!/usr/bin/env ruby # # Copyright(C) 2014-2016 Kouhei Sutou # Copyright(C) 2014 HAYASHI Kentaro # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License version 2.1 as published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA require "optparse" require "fileutils" require "pathname" require "open-uri" class Uploader def initialize @dput_configuration_name = "groonga-ppa" @use_pbuilder = false end def run ensure_dput_configuration parse_command_line! ensure_mysql_version @required_groonga_version = required_groonga_version @code_names.each do |code_name| mysql55_version = @mysql55_versions[code_name] mysql56_version = @mysql56_versions[code_name] mysql57_version = @mysql57_versions[code_name] mariadb10_0_version = @mariadb10_0_versions[code_name] if mysql55_version upload(code_name, "5.5", mysql55_version) end if mysql56_version upload(code_name, "5.6", mysql56_version) end if mysql57_version upload(code_name, "5.7", mysql57_version) end if mariadb10_0_version upload(code_name, "mariadb-10.0", mariadb10_0_version) end end end private def ensure_dput_configuration dput_cf_path = Pathname.new("~/.dput.cf").expand_path if dput_cf_path.exist? dput_cf_content = dput_cf_path.read else dput_cf_content = "" end dput_cf_content.each_line do |line| return if line.chomp == "[#{@dput_configuration_name}]" end dput_cf_path.open("w") do |dput_cf| dput_cf.puts(dput_cf_content) dput_cf.puts(<<-CONFIGURATION) [#{@dput_configuration_name}] fqdn = ppa.launchpad.net method = ftp incoming = ~groonga/ppa/ubuntu/ login = anonymous allow_unsigned_uploads = 0 CONFIGURATION end end def ensure_mysql_version @mysql_versions = {} @mysql55_versions = {} @mysql56_versions = {} @mysql57_versions = {} @mariadb10_0_versions = {} @code_names.each do |code_name| source_names = [code_name, "#{code_name}-updates"] source_names.each do |source_name| allpackages_url = "http://packages.ubuntu.com/#{source_name}/allpackages?format=txt.gz" open(allpackages_url) do |file| file.each_line do |line| case line when /\Amysql-server \((.+?)[\s)]/ @mysql_versions[code_name] = $1 when /\Amysql-server-5\.5 \((.+?)[\s)]/ @mysql55_versions[code_name] = $1 when /\Amysql-server-5\.6 \((.+?)[\s)]/ @mysql56_versions[code_name] = $1 when /\Amysql-server-5\.7 \((.+?)[\s)]/ @mysql57_versions[code_name] = $1 when /\Amariadb-server-10\.0 \((.+?)[\s)]/ @mariadb10_0_versions[code_name] = $1 end end end end end end def parse_command_line! parser = OptionParser.new parser.on("--package=NAME", "The package name") do |name| @package = name end parser.on("--version=VERSION", "The version") do |version| @version = version end parser.on("--source-archive-directory=DIRECTORY", "The directory that has source archives") do |directory| @source_archive_directory = Pathname.new(directory).expand_path end parser.on("--code-names=CODE_NAME1,CODE_NAME2,CODE_NAME3,...", Array, "The target code names") do |code_names| @code_names = code_names end parser.on("--debian-base-directory=DIRECTORY", "The directory that has debianXX/ directory") do |directory| @debian_base_directory = Pathname.new(directory).expand_path end parser.on("--ppa=PPA", "The personal package archive name (groonga-ppa or groonga-nightly") do |ppa| @dput_configuration_name = ppa end parser.on("--pgp-sign-key=KEY", "The PGP key to sign .changes and .dsc") do |pgp_sign_key| @pgp_sign_key = pgp_sign_key end parser.on("--[no-]pbuilder", "Use pbuilder for build check") do |use_pbuilder| @use_pbuilder = use_pbuilder end parser.parse! end def upload(code_name, mysql_short_version, mysql_version) default_mysql_version = (@mysql_versions[code_name] == mysql_version) deb_package_name = "#{@package}-#{mysql_short_version}" in_temporary_directory do source_archive = @source_archive_directory + "#{deb_package_name}_#{@version}.orig.tar.gz" run_command("tar", "xf", source_archive.to_s) directory_name = "#{deb_package_name}-#{@version}" Dir.chdir(directory_name) do debian_directory = @debian_base_directory + "debian-#{mysql_short_version}" FileUtils.cp_r(debian_directory.to_s, "debian") deb_version = "#{current_deb_version.succ}~#{code_name}1" run_command("dch", "--distribution", code_name, "--newversion", deb_version, "Build for #{code_name}.") remove_versionless_mroonga = true if default_mysql_version or mysql_short_version.start_with?("mariadb-") remove_versionless_mroonga = false end if remove_versionless_mroonga control_content = File.read("debian/control") File.open("debian/control", "w") do |control| in_mysql_server_mroonga = false control_content.each_line do |line| case line.chomp when "" if in_mysql_server_mroonga in_mysql_server_mroonga = false else control.print(line) end when "Package: mysql-server-mroonga" in_mysql_server_mroonga = true else next if in_mysql_server_mroonga control.print(line) end end end end run_command("sed", "-i", "-e", "s,MYSQL_VERSION\\|MARIADB_VERSION,#{mysql_version},", "debian/control") run_command("debuild", "--no-lintian", # Workaround for Launchpad. Launchpad doesn't accept # .buildinfo yet. # See also: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=853795 "--buildinfo-option=-O", "-d", "-S", "-sa", "-pgpg2", "-k#{@pgp_sign_key}") if @use_pbuilder run_command("pbuilder-dist", code_name, "build", "../#{deb_package_name}_#{deb_version}.dsc") else run_command("dput", @dput_configuration_name, "../#{deb_package_name}_#{deb_version}_source.changes") end end end end def required_groonga_version File.read("../../required_groonga_version").lines.first.chomp end def current_deb_version /\((.+)\)/ =~ File.read("debian/changelog").lines.first $1 end def in_temporary_directory name = "tmp" FileUtils.rm_rf(name) FileUtils.mkdir_p(name) Dir.chdir(name) do yield end end def run_command(*command_line) unless system(*command_line) raise "failed to run command: #{command_line.join(' ')}" end end end uploader = Uploader.new uploader.run