1f6ef4395fe1896ba68c80e52cb24763b0fcfe7f8Caroline Tice#!/usr/bin/env python2
2d6a79af67cea3715984c5acab383e52742ae12d8cmtice#
3d6a79af67cea3715984c5acab383e52742ae12d8cmtice#  Copyright 2015 Google Inc. All Rights Reserved
4545b947888df1d07f4ad530e1c5eec930fc283c2Cassidy Burden"""The script to generate a cleanup script after setup.sh.
5e57523abd8f2a5aa0b93f1248d6d969d0865781bRahul Chaudhry
6545b947888df1d07f4ad530e1c5eec930fc283c2Cassidy BurdenThis script takes a set of flags, telling it what setup.sh changed
7e57523abd8f2a5aa0b93f1248d6d969d0865781bRahul Chaudhryduring the set up process. Based on the values of the input flags, it
8545b947888df1d07f4ad530e1c5eec930fc283c2Cassidy Burdengenerates a cleanup script, named ${BOARD}_cleanup.sh, which will
9545b947888df1d07f4ad530e1c5eec930fc283c2Cassidy Burdenundo the changes made by setup.sh, returning everything to its
10e57523abd8f2a5aa0b93f1248d6d969d0865781bRahul Chaudhryoriginal state.
11e57523abd8f2a5aa0b93f1248d6d969d0865781bRahul Chaudhry"""
12d6a79af67cea3715984c5acab383e52742ae12d8cmtice
13cbc5a2617f8d63e3319e159eab2c407952df1df9Rahul Chaudhryfrom __future__ import print_function
14cbc5a2617f8d63e3319e159eab2c407952df1df9Rahul Chaudhry
15d6a79af67cea3715984c5acab383e52742ae12d8cmticeimport argparse
16d6a79af67cea3715984c5acab383e52742ae12d8cmticeimport sys
17d6a79af67cea3715984c5acab383e52742ae12d8cmtice
18d6a79af67cea3715984c5acab383e52742ae12d8cmtice
19d6a79af67cea3715984c5acab383e52742ae12d8cmticedef Usage(parser, msg):
20cbc5a2617f8d63e3319e159eab2c407952df1df9Rahul Chaudhry  print('ERROR: ' + msg)
21f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano  parser.print_help()
22f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano  sys.exit(1)
23f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano
24d6a79af67cea3715984c5acab383e52742ae12d8cmtice
25d6a79af67cea3715984c5acab383e52742ae12d8cmticedef Main(argv):
26545b947888df1d07f4ad530e1c5eec930fc283c2Cassidy Burden  """Generate a script to undo changes done by setup.sh
27647950a869dbc19237843382b38b2e2867a3c73bRahul Chaudhry
28545b947888df1d07f4ad530e1c5eec930fc283c2Cassidy Burden    The script setup.sh makes a change that needs to be
29c4d58d04b0f92b52c645f0b8a0fc1d5e5b983e5fCaroline Tice    undone, namely it creates a soft link making /build/${board} point
30c4d58d04b0f92b52c645f0b8a0fc1d5e5b983e5fCaroline Tice    to /build/${board}.work.  To do this, it had to see if
31c4d58d04b0f92b52c645f0b8a0fc1d5e5b983e5fCaroline Tice    /build/${board} already existed, and if so, whether it was a real
32c4d58d04b0f92b52c645f0b8a0fc1d5e5b983e5fCaroline Tice    tree or a soft link.  If it was soft link, it saved the old value
33c4d58d04b0f92b52c645f0b8a0fc1d5e5b983e5fCaroline Tice    of the link, then deleted it and created the new link.  If it was
34c4d58d04b0f92b52c645f0b8a0fc1d5e5b983e5fCaroline Tice    a real tree, it renamed the tree to /build/${board}.save, and then
35c4d58d04b0f92b52c645f0b8a0fc1d5e5b983e5fCaroline Tice    created the new soft link.  If the /build/${board} did not
36c4d58d04b0f92b52c645f0b8a0fc1d5e5b983e5fCaroline Tice    previously exist, then it just created the new soft link.
37d6a79af67cea3715984c5acab383e52742ae12d8cmtice
38545b947888df1d07f4ad530e1c5eec930fc283c2Cassidy Burden    This function takes arguments that tell it exactly what setup.sh
39d6a79af67cea3715984c5acab383e52742ae12d8cmtice    actually did, then generates a script to undo those exact changes.
40c4d58d04b0f92b52c645f0b8a0fc1d5e5b983e5fCaroline Tice  """
41d6a79af67cea3715984c5acab383e52742ae12d8cmtice
42f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano  parser = argparse.ArgumentParser()
434cc3dd8a3b2ab04cf861d7c71967de0298746cb9Cassidy Burden  parser.add_argument(
444cc3dd8a3b2ab04cf861d7c71967de0298746cb9Cassidy Burden      '--board',
454cc3dd8a3b2ab04cf861d7c71967de0298746cb9Cassidy Burden      dest='board',
464cc3dd8a3b2ab04cf861d7c71967de0298746cb9Cassidy Burden      required=True,
474cc3dd8a3b2ab04cf861d7c71967de0298746cb9Cassidy Burden      help='Chromeos board for packages/image.')
484cc3dd8a3b2ab04cf861d7c71967de0298746cb9Cassidy Burden
494cc3dd8a3b2ab04cf861d7c71967de0298746cb9Cassidy Burden  parser.add_argument(
504cc3dd8a3b2ab04cf861d7c71967de0298746cb9Cassidy Burden      '--old_tree_missing',
514cc3dd8a3b2ab04cf861d7c71967de0298746cb9Cassidy Burden      dest='tree_existed',
524cc3dd8a3b2ab04cf861d7c71967de0298746cb9Cassidy Burden      action='store_false',
534cc3dd8a3b2ab04cf861d7c71967de0298746cb9Cassidy Burden      help='Did /build/${BOARD} exist.',
544cc3dd8a3b2ab04cf861d7c71967de0298746cb9Cassidy Burden      default=True)
554cc3dd8a3b2ab04cf861d7c71967de0298746cb9Cassidy Burden
564cc3dd8a3b2ab04cf861d7c71967de0298746cb9Cassidy Burden  parser.add_argument(
574cc3dd8a3b2ab04cf861d7c71967de0298746cb9Cassidy Burden      '--renamed_tree',
584cc3dd8a3b2ab04cf861d7c71967de0298746cb9Cassidy Burden      dest='renamed_tree',
594cc3dd8a3b2ab04cf861d7c71967de0298746cb9Cassidy Burden      action='store_true',
604cc3dd8a3b2ab04cf861d7c71967de0298746cb9Cassidy Burden      help='Was /build/${BOARD} saved & renamed.',
614cc3dd8a3b2ab04cf861d7c71967de0298746cb9Cassidy Burden      default=False)
624cc3dd8a3b2ab04cf861d7c71967de0298746cb9Cassidy Burden
634cc3dd8a3b2ab04cf861d7c71967de0298746cb9Cassidy Burden  parser.add_argument(
644cc3dd8a3b2ab04cf861d7c71967de0298746cb9Cassidy Burden      '--old_link',
654cc3dd8a3b2ab04cf861d7c71967de0298746cb9Cassidy Burden      dest='old_link',
664cc3dd8a3b2ab04cf861d7c71967de0298746cb9Cassidy Burden      help=('The original build tree soft link.'))
67f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano
68f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano  options = parser.parse_args(argv[1:])
69f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano
70f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano  if options.old_link or options.renamed_tree:
71f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano    if not options.tree_existed:
72f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano      Usage(parser, 'If --tree_existed is False, cannot have '
73f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano            '--renamed_tree or --old_link')
74f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano
75f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano  if options.old_link and options.renamed_tree:
76f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano    Usage(parser, '--old_link and --renamed_tree are incompatible options.')
77f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano
78f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano  if options.tree_existed:
79f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano    if not options.old_link and not options.renamed_tree:
80f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano      Usage(parser, 'If --tree_existed is True, then must have either '
81f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano            '--old_link or --renamed_tree')
82f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano
83545b947888df1d07f4ad530e1c5eec930fc283c2Cassidy Burden  out_filename = 'cros_pkg/' + options.board + '_cleanup.sh'
84f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano
85f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano  with open(out_filename, 'w') as out_file:
86f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano    out_file.write('#!/bin/bash\n\n')
87f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano    # First, remove the 'new' soft link.
88f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano    out_file.write('sudo rm /build/%s\n' % options.board)
89d6a79af67cea3715984c5acab383e52742ae12d8cmtice    if options.tree_existed:
90f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano      if options.renamed_tree:
91f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano        # Old build tree existed and was a real tree, so it got
92f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano        # renamed.  Move the renamed tree back to the original tree.
93f6ef4395fe1896ba68c80e52cb24763b0fcfe7f8Caroline Tice        out_file.write('sudo mv /build/%s.save /build/%s\n' % (options.board,
94f6ef4395fe1896ba68c80e52cb24763b0fcfe7f8Caroline Tice                                                               options.board))
95f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano      else:
96f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano        # Old tree existed and was already a soft link.  Re-create the
97f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano        # original soft link.
98f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano        original_link = options.old_link
99f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano        if original_link[0] == "'":
100f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano          original_link = original_link[1:]
101f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano        if original_link[-1] == "'":
102f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano          original_link = original_link[:-1]
103f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano        out_file.write('sudo ln -s %s /build/%s\n' % (original_link,
104f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano                                                      options.board))
105f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano    out_file.write('\n')
106545b947888df1d07f4ad530e1c5eec930fc283c2Cassidy Burden    # Remove common.sh file
107c4671bdd601ff945b2cccbfe1aee9f931dc908c7Cassidy Burden    out_file.write('rm common/common.sh\n')
108f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano
109f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano  return 0
110f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano
111f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano
112f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozanoif __name__ == '__main__':
113f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano  retval = Main(sys.argv)
114f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbeLuis Lozano  sys.exit(retval)
115