#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Copyright 2020 The ChromiumOS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""The script to generate a cleanup script after setup.sh.

This script takes a set of flags, telling it what setup.sh changed
during the set up process. Based on the values of the input flags, it
generates a cleanup script, named ${BOARD}_cleanup.sh, which will
undo the changes made by setup.sh, returning everything to its
original state.
"""

from __future__ import print_function

import argparse
import sys


def Usage(parser, msg):
  print('ERROR: ' + msg)
  parser.print_help()
  sys.exit(1)


def Main(argv):
  """Generate a script to undo changes done by setup.sh

    The script setup.sh makes a change that needs to be
    undone, namely it creates a soft link making /build/${board} point
    to /build/${board}.work.  To do this, it had to see if
    /build/${board} already existed, and if so, whether it was a real
    tree or a soft link.  If it was soft link, it saved the old value
    of the link, then deleted it and created the new link.  If it was
    a real tree, it renamed the tree to /build/${board}.save, and then
    created the new soft link.  If the /build/${board} did not
    previously exist, then it just created the new soft link.

    This function takes arguments that tell it exactly what setup.sh
    actually did, then generates a script to undo those exact changes.
  """

  parser = argparse.ArgumentParser()
  parser.add_argument(
      '--board',
      dest='board',
      required=True,
      help='Chromeos board for packages/image.')

  parser.add_argument(
      '--old_tree_missing',
      dest='tree_existed',
      action='store_false',
      help='Did /build/${BOARD} exist.',
      default=True)

  parser.add_argument(
      '--renamed_tree',
      dest='renamed_tree',
      action='store_true',
      help='Was /build/${BOARD} saved & renamed.',
      default=False)

  parser.add_argument(
      '--old_link',
      dest='old_link',
      help=('The original build tree soft link.'))

  options = parser.parse_args(argv[1:])

  if options.old_link or options.renamed_tree:
    if not options.tree_existed:
      Usage(
          parser, 'If --tree_existed is False, cannot have '
          '--renamed_tree or --old_link')

  if options.old_link and options.renamed_tree:
    Usage(parser, '--old_link and --renamed_tree are incompatible options.')

  if options.tree_existed:
    if not options.old_link and not options.renamed_tree:
      Usage(
          parser, 'If --tree_existed is True, then must have either '
          '--old_link or --renamed_tree')

  out_filename = 'cros_pkg/' + options.board + '_cleanup.sh'

  with open(out_filename, 'w', encoding='utf-8') as out_file:
    out_file.write('#!/bin/bash\n\n')
    # First, remove the 'new' soft link.
    out_file.write('sudo rm /build/%s\n' % options.board)
    if options.tree_existed:
      if options.renamed_tree:
        # Old build tree existed and was a real tree, so it got
        # renamed.  Move the renamed tree back to the original tree.
        out_file.write('sudo mv /build/%s.save /build/%s\n' % (options.board,
                                                               options.board))
      else:
        # Old tree existed and was already a soft link.  Re-create the
        # original soft link.
        original_link = options.old_link
        if original_link[0] == "'":
          original_link = original_link[1:]
        if original_link[-1] == "'":
          original_link = original_link[:-1]
        out_file.write(
            'sudo ln -s %s /build/%s\n' % (original_link, options.board))
    out_file.write('\n')
    # Remove common.sh file
    out_file.write('rm common/common.sh\n')

  return 0


if __name__ == '__main__':
  retval = Main(sys.argv)
  sys.exit(retval)
