# -*- ruby -*-
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.

require_relative "../helper"
require_relative "../package-task"

class ApacheArrowReleasePackageTask < PackageTask
  include Helper::ApacheArrow

  def initialize
    release_time = detect_release_time
    super("apache-arrow-release",
          detect_version(release_time),
          release_time,
          :rc_build_type => :release)
  end

  private
  def repo_path
    "#{yum_dir}/Apache-Arrow.repo"
  end

  def define_archive_task
    file @archive_name => [repo_path] do
      rm_rf(@archive_base_name)
      mkdir(@archive_base_name)
      keys_path = "#{@archive_base_name}/KEYS"
      download("https://www.apache.org/dyn/closer.lua?action=download&filename=arrow/KEYS",
               keys_path)
      keys = File.read(keys_path, encoding: "UTF-8")
      File.open(keys_path, "w") do |keys_file|
        is_ed25519_key = false
        deny_lists = [
          # "rpmkeys --import" reports error for these keys.
          # It seems that a subkey of this key may be related. (Is SHA1 bad?)
          "8CAAD602",
          # https://github.com/apache/arrow/issues/15007
          # It seems that a subkey of this key may be related.
          "B90EB64A3AF15545EC8A7B8803F0D5EA3790810C",
        ]
        is_denied_key = false
        keys.each_line do |line|
          case line.chomp
          when /\Apub\s+ed25519\s/
            is_ed25519_key = true
            next
          when /\Apub\s+[^\/]+\/([\h]+)\s/
            short_finger_print = $1
            if deny_lists.include?(short_finger_print)
              is_denied_key = true
              next
            end
          when /\A\s+([\h]+)$/
            long_finger_print = $1
            if deny_lists.include?(long_finger_print)
              is_denied_key = true
              next
            end
          when "-----END PGP PUBLIC KEY BLOCK-----"
            if is_ed25519_key
              is_ed25519_key = false
              next
            end
            if is_denied_key
              is_denied_key = false
              next
            end
          else
            next if is_ed25519_key
            next if is_denied_key
          end
          keys_file.print(line)
        end
      end
      cp(repo_path, @archive_base_name)
      sh("tar", "czf", @archive_name, @archive_base_name)
      rm_rf(@archive_base_name)
    end

    if rpm_archive_name != @archive_name
      file rpm_archive_name => @archive_name do
        sh("tar", "xf", @archive_name)
        rpm_archive_base_name = File.basename(rpm_archive_name, ".tar.gz")
        mv(@archive_base_name, rpm_archive_base_name)
        sh("tar", "czf", rpm_archive_name, rpm_archive_base_name)
        rm_rf(rpm_archive_base_name)
      end
    end
  end

  def enable_apt?
    false
  end
end

task = ApacheArrowReleasePackageTask.new
task.define
