File indexing completed on 2024-05-19 15:38:53

0001 # /usr/bin/env ruby
0002 
0003 # This script generates a releasable, signed tarball out of the container repo.
0004 # It also fetches, if its manifest so defines, translations from KDE i18n.
0005 # SPDX-FileCopyrightText: 2020 L. E. Segovia <amy@amyspark.me>
0006 # SPDX-License-Identifier: BSD-3-Clause
0007 
0008 # frozen_string_literal: true
0009 
0010 require 'fileutils'
0011 require 'json'
0012 require 'optparse'
0013 require 'ostruct'
0014 require 'pathname'
0015 
0016 options = OpenStruct.new
0017 
0018 opts = OptionParser.new do |o|
0019   o.on_tail('-h', '--help', 'Show this usage statement') do |_h|
0020     options.help = true
0021   end
0022 
0023   o.on_tail('-s', '--sign USER', 'Sign generated tarballs using this key') do |h|
0024     options.gpg_key = h
0025   end
0026 
0027   o.on_tail('-k', '--skip', 'Skip base tarball generation') do |_k|
0028     options.skip_archive = true
0029   end
0030 end
0031 
0032 begin
0033   opts.parse!(ARGV)
0034 rescue StandardError => e
0035   warn e, '', opts
0036   exit 1
0037 end
0038 
0039 if options.help
0040   puts opts
0041   exit
0042 end
0043 
0044 manifest = JSON.parse File.read('manifest.json')
0045 
0046 warn 'This script needs a JSON manifest of the underlying repo!' if manifest.empty?
0047 
0048 VERSION = (manifest['version'] || `git describe`.chomp[1..-1]).freeze
0049 
0050 PREFIX = "#{manifest['name']}-#{VERSION}"
0051 
0052 BRANCH = (manifest['gitTag'] || 'HEAD').freeze
0053 
0054 puts "Application: #{manifest['name']} #{VERSION}"
0055 
0056 ROOT = `git rev-parse --show-toplevel`.chomp.freeze
0057 
0058 puts "Repository root: #{ROOT}"
0059 
0060 PACKAGING = Pathname(Dir.pwd)
0061 
0062 unless options.skip_archive
0063   if Dir.exist?(PACKAGING / PREFIX)
0064     puts 'Removing old tarball root...'
0065     FileUtils.rm_rf PACKAGING / PREFIX
0066   end
0067 
0068   Dir.chdir(ROOT) do
0069     puts "Creating tarball root from #{BRANCH}..."
0070     system "git archive --prefix=#{PREFIX}/ #{BRANCH} | tar xv -C packaging 2> /dev/null", exception: true
0071   end
0072 
0073   unless manifest['translations'].empty?
0074     SVN_BASE = 'svn://anonsvn.kde.org/home/kde'
0075 
0076     MAINMODULE = (manifest['translations']['mainmodule'] || 'trunk').freeze
0077 
0078     MODULE = (manifest['translations']['file'] || manifest['name']).freeze
0079 
0080     REVISION = (manifest['translations']['REVISION'] || '').freeze
0081 
0082     puts "Fetching translations (#{MODULE}.po)..."
0083 
0084     Dir.chdir(PACKAGING / PREFIX) do
0085       languages = `svn cat #{SVN_BASE}/#{MAINMODULE}/l10n-kf5/subdirs`.chomp.lines
0086 
0087       Dir.mkdir('po') unless Dir.exist? 'po'
0088 
0089       Dir.mkdir('l10n') unless Dir.exist? 'l10n'
0090 
0091       languages
0092         .reject { |lang| lang.start_with? 'x-test' }
0093         .each do |lang|
0094           lang.chomp!
0095 
0096           print format('->   %<lang>20s: ', lang: lang)
0097 
0098           pofilename = "#{SVN_BASE}/#{MAINMODULE}/l10n-kf5/#{lang}/messages/kseexpr/#{MODULE}.po"
0099 
0100           system "svn cat #{pofilename} #{REVISION} 2> /dev/null | tee l10n/#{MODULE}.po > /dev/null", exception: true
0101 
0102           if FileTest.size("l10n/#{MODULE}.po").zero?
0103             puts 'file does not exist.'
0104             next
0105           end
0106 
0107           Dir.mkdir "po/#{lang}" unless Dir.exist? "po/#{lang}"
0108 
0109           FileUtils.mv "l10n/#{MODULE}.po", "po/#{lang}/"
0110           puts 'success!'
0111         end
0112 
0113       FileUtils.rm_rf 'l10n'
0114     end
0115   end
0116 end
0117 
0118 Dir.chdir(PACKAGING) do
0119   puts 'Removing old files...'
0120 
0121   FileUtils.rm Dir.glob("#{PREFIX}.*")
0122 
0123   puts 'Creating tarballs...'
0124 
0125   tar = if system('which gtar > /dev/null 2>&1')
0126           'gtar'
0127         else
0128           'tar'
0129         end
0130 
0131   system "#{tar} czf #{PREFIX}.tar.gz --group=root --owner=root --sort=name --pax-option=exthdr.name=%d/PaxHeaders/%f,delete=atime,delete=ctime #{PREFIX} > /dev/null", exception: true
0132 
0133   if options.gpg_key
0134     puts 'Requesting GPG signature...'
0135 
0136     system "gpg --armor --detach-sign -u #{options.gpg_key} #{PREFIX}.tar.gz", exception: true
0137   end
0138 
0139   puts "Success! Your tarball is at #{File.expand_path("#{PREFIX}.tar.gz")}"
0140   puts "md5: #{`md5sum #{PREFIX}.tar.gz`.chomp}"
0141   puts "sha256: #{`sha256sum #{PREFIX}.tar.gz`.chomp}"
0142 end