#!/usr/bin/env python3 # -*- coding: utf-8 -*- # Copyright 2020 The ChromiumOS Authors # 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. """ 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)