Home | History | Annotate | Download | only in cros_pkg
      1 #!/usr/bin/python2
      2 #
      3 #  Copyright 2015 Google Inc. All Rights Reserved
      4 """The script to generate a cleanup script after setup.sh.
      5 
      6 This script takes a set of flags, telling it what setup.sh changed
      7 during the set up process. Based on the values of the input flags, it
      8 generates a cleanup script, named ${BOARD}_cleanup.sh, which will
      9 undo the changes made by setup.sh, returning everything to its
     10 original state.
     11 """
     12 
     13 from __future__ import print_function
     14 
     15 import argparse
     16 import sys
     17 
     18 
     19 def Usage(parser, msg):
     20   print('ERROR: ' + msg)
     21   parser.print_help()
     22   sys.exit(1)
     23 
     24 
     25 def Main(argv):
     26   """Generate a script to undo changes done by setup.sh
     27 
     28     The script setup.sh makes a change that needs to be
     29     undone, namely it creates a soft link making /build/${board} point
     30     to /build/${board}.work.  To do this, it had to see if
     31     /build/${board} already existed, and if so, whether it was a real
     32     tree or a soft link.  If it was soft link, it saved the old value
     33     of the link, then deleted it and created the new link.  If it was
     34     a real tree, it renamed the tree to /build/${board}.save, and then
     35     created the new soft link.  If the /build/${board} did not
     36     previously exist, then it just created the new soft link.
     37 
     38     This function takes arguments that tell it exactly what setup.sh
     39     actually did, then generates a script to undo those exact changes.
     40   """
     41 
     42   parser = argparse.ArgumentParser()
     43   parser.add_argument(
     44       '--board',
     45       dest='board',
     46       required=True,
     47       help='Chromeos board for packages/image.')
     48 
     49   parser.add_argument(
     50       '--old_tree_missing',
     51       dest='tree_existed',
     52       action='store_false',
     53       help='Did /build/${BOARD} exist.',
     54       default=True)
     55 
     56   parser.add_argument(
     57       '--renamed_tree',
     58       dest='renamed_tree',
     59       action='store_true',
     60       help='Was /build/${BOARD} saved & renamed.',
     61       default=False)
     62 
     63   parser.add_argument(
     64       '--old_link',
     65       dest='old_link',
     66       help=('The original build tree soft link.'))
     67 
     68   options = parser.parse_args(argv[1:])
     69 
     70   if options.old_link or options.renamed_tree:
     71     if not options.tree_existed:
     72       Usage(parser, 'If --tree_existed is False, cannot have '
     73             '--renamed_tree or --old_link')
     74 
     75   if options.old_link and options.renamed_tree:
     76     Usage(parser, '--old_link and --renamed_tree are incompatible options.')
     77 
     78   if options.tree_existed:
     79     if not options.old_link and not options.renamed_tree:
     80       Usage(parser, 'If --tree_existed is True, then must have either '
     81             '--old_link or --renamed_tree')
     82 
     83   out_filename = 'cros_pkg/' + options.board + '_cleanup.sh'
     84 
     85   with open(out_filename, 'w') as out_file:
     86     out_file.write('#!/bin/bash\n\n')
     87     # First, remove the 'new' soft link.
     88     out_file.write('sudo rm /build/%s\n' % options.board)
     89     if options.tree_existed:
     90       if options.renamed_tree:
     91         # Old build tree existed and was a real tree, so it got
     92         # renamed.  Move the renamed tree back to the original tree.
     93         out_file.write('sudo mv /build/%s.save /build/%s\n' %
     94                        (options.board, options.board))
     95       else:
     96         # Old tree existed and was already a soft link.  Re-create the
     97         # original soft link.
     98         original_link = options.old_link
     99         if original_link[0] == "'":
    100           original_link = original_link[1:]
    101         if original_link[-1] == "'":
    102           original_link = original_link[:-1]
    103         out_file.write('sudo ln -s %s /build/%s\n' % (original_link,
    104                                                       options.board))
    105     out_file.write('\n')
    106     # Remove common.sh file
    107     out_file.write('rm common/common.sh\n')
    108 
    109   return 0
    110 
    111 
    112 if __name__ == '__main__':
    113   retval = Main(sys.argv)
    114   sys.exit(retval)
    115