#!/usr/bin/python2
#
#  Copyright 2015 Google Inc. All Rights Reserved
"""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') 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)
