#
#    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.
#

module Buildr
  module GPG
    extend self

    def sign_task(pkg)
      file(pkg.to_s + '.asc') do
        puts "GPG signing #{pkg.to_spec}"
        cmd = 'gpg',
               '--local-user', ENV['GPG_USER'],
               '--armor',
               '--output', pkg.to_s + '.asc'
        cmd += ['--passphrase', ENV['GPG_PASS']] if ENV['GPG_PASS']
        cmd += ['--detach-sig', pkg]
        #cmd << { :verbose => true }
        #sh *cmd
        system *cmd
      end
    end

    def sign_and_upload(pkg)
      task(:upload).enhance do
        artifact = Buildr.artifact(pkg.to_spec_hash.merge(:type => "#{pkg.type}.asc"))
        artifact.from sign_task(pkg)
        artifact.invoke
        artifact.upload
      end
    end

    def gpg_sign_before_upload
      self.enhance do 
        [self, self.projects].flatten.each { |prj|
          prj.packages.each { |pkg| sign_and_upload(pkg) }
          prj.packages.map {|pkg| pkg.pom }.uniq.each { |pom| sign_and_upload(pom) }
        }
      end
    end
  end
end

class Buildr::Project
  include Buildr::GPG
end
