# Copyright 2017 The Bazel Authors. All rights reserved.
#
# Licensed 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.
"""Rules to create RPM archives."""

rpm_filetype = [".rpm"]
spec_filetype = [".spec"]

def _pkg_rpm_impl(ctx):
  """Implements to pkg_rpm rule."""

  files = []
  args = ["--name=" + ctx.label.name]

  # Version can be specified by a file or inlined
  if ctx.attr.version_file:
    if ctx.attr.version:
      fail("Both version and version_file attributes were specified")
    args += ["--version=@" + ctx.file.version_file.path]
    files += [ctx.file.version_file]
  elif ctx.attr.version:
    args += ["--version=" + ctx.attr.version]
  else:
    fail("Neither version_file nor version attribute was specified")

  if ctx.attr.architecture:
    args += ["--arch=" + ctx.attr.architecture]

  if ctx.attr.spec_file:
    args += ["--spec_file=" + ctx.file.spec_file.path]
    files += [ctx.file.spec_file]
  else:
    fail("spec_file was not specified")

  args += ["--out_file=" + ctx.outputs.rpm.path]

  # Add data files.
  files += [ctx.file.changelog] + ctx.files.data
  args += [ctx.file.changelog.path]
  for f in ctx.files.data:
    args += [f.path]

  # Call the generator script.
  # TODO(katre): Generate a source RPM.
  ctx.action(
      executable = ctx.executable._make_rpm,
      use_default_shell_env = True,
      arguments = args,
      inputs = files,
      outputs = [ctx.outputs.rpm],
      mnemonic = "MakeRpm")

  # Link the RPM to the expected output name.
  ctx.action(
      command = "ln -s %s %s" % (ctx.outputs.rpm.basename, ctx.outputs.out.path),
      inputs = [ctx.outputs.rpm],
      outputs = [ctx.outputs.out])

# Define the rule.
pkg_rpm = rule(
    implementation = _pkg_rpm_impl,
    attrs = {
        "spec_file" : attr.label(mandatory=True, allow_files=spec_filetype, single_file=True),
        "architecture": attr.string(default="all"),
        "version_file": attr.label(allow_files=True, single_file=True),
        "version": attr.string(),
        "changelog" : attr.label(mandatory=True, allow_files=True, single_file=True),
        "data": attr.label_list(mandatory=True, allow_files=True),

        # Implicit dependencies.
        "_make_rpm": attr.label(
            default=Label("//tools/build_defs/pkg:make_rpm"),
            cfg="host",
            executable=True,
            allow_files=True),
    },
    outputs = {
        "out": "%{name}.rpm",
        "rpm": "%{name}-%{architecture}.rpm",
    },
    executable = False)
"""Creates an RPM format package from the data files.

This runs rpmbuild (and requires it to be installed beforehand) to generate
an RPM package based on the spec_file and data attributes.

Args:
  spec_file: The RPM spec file to use. If the version or version_file
    attributes are provided, the Version in the spec will be overwritten.
    Any Sources listed in the spec file must be provided as data dependencies.
  version: The version of the package to generate. This will overwrite any
    Version provided in the spec file. Only specify one of version and
    version_file.
  version_file: A file containing the version of the package to generate. This
    will overwrite any Version provided in the spec file. Only specify one of
    version and version_file.
  changelog: A changelog file to include. This will not be written to the spec
    file, which should only list changes to the packaging, not the software itself.
  data: List all files to be included in the package here.
"""
