# Copyright 2016 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Combine os-release.d fragments into /etc/os-release."""

import os

from chromite.lib import commandline
from chromite.lib import cros_build_lib
from chromite.lib import osutils


def GenerateOsRelease(root, default_params=None):
  """Adds contents of /etc/os-release.d into /etc/os-release

  Args:
    root: path to the root directory where os-release should be genereated.
    default_params: a dict of os-release parameters that should be added
      if not already set.
  """
  os_release_path = os.path.join(root, 'etc', 'os-release')
  os_released_path = os.path.join(root, 'etc', 'os-release.d')

  mapping = {}
  if os.path.exists(os_release_path):
    content = osutils.ReadFile(os_release_path)

    for line in content.splitlines():
      if line.startswith('#'):
        continue

      key_value = line.split('=', 1)
      if len(key_value) != 2:
        cros_build_lib.Die('Malformed line in /etc/os-release')

      mapping[key_value[0]] = key_value[1].strip()

  if os.path.isdir(os_released_path):
    for filepath in os.listdir(os_released_path):
      key = os.path.basename(filepath)
      if key in mapping:
        cros_build_lib.Die('key %s defined in /etc/os-release.d but already '
                           'defined in /etc/os-release.' % key)
      mapping[key] = osutils.ReadFile(os.path.join(os_released_path,
                                                   filepath)).strip('\n')

  if default_params:
    for key, value in default_params.items():
      mapping.setdefault(key, value)

  osrelease_content = '\n'.join([k + '=' + mapping[k] for k in mapping])
  osrelease_content += '\n'
  osutils.WriteFile(os_release_path, osrelease_content)

def main(argv):
  parser = commandline.ArgumentParser(description=__doc__)
  parser.add_argument('--root', type='path', required=True,
                      help='sysroot of the board')
  parser.add_argument('--version', help='The image version string.')
  parser.add_argument('--build_id', help='The image build ID string.')
  options = parser.parse_args(argv)
  options.Freeze()

  default_params = {
      'NAME': 'Chromium OS',
      'ID': 'chromiumos',
      'HOME_URL': 'https://www.chromium.org/chromium-os',
      'BUG_REPORT_URL': 'https://crbug.com/new',
  }

  if options.version:
    default_params['VERSION'] = options.version
    default_params['VERSION_ID'] = options.version
  if options.build_id:
    default_params['BUILD_ID'] = options.build_id

  GenerateOsRelease(options.root, default_params)
