# Copyright 2014 The Chromium OS Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """Functions for managing chroots. Currently this just contains functions for reusing chroots for incremental building. """ from __future__ import print_function import os from chromite.cbuildbot import constants from chromite.lib import cros_build_lib from chromite.lib import osutils from chromite.lib import sudo CHROOT_VERSION_FILE = 'etc/cros_manifest_version' class ChrootManager(object): """Class for managing chroots and chroot versions.""" def __init__(self, build_root): """Constructor. Args: build_root: The root of the checkout. """ self._build_root = build_root def _ChrootVersionPath(self, chroot=None): """Get the path to the chroot version file for |chroot|. Args: chroot: Path to chroot. Defaults to 'chroot' under build root. Returns: The path to the chroot version file. """ if chroot is None: chroot = os.path.join(self._build_root, constants.DEFAULT_CHROOT_DIR) return os.path.join(chroot, CHROOT_VERSION_FILE) def GetChrootVersion(self, chroot=None): """Get the version of the checkout used to create |chroot|. Args: chroot: Path to chroot. Defaults to 'chroot' under build root. Returns: The version of Chrome OS used to build |chroot|. E.g. 6394.0.0-rc3. If the chroot does not exist, or there is no version file, returns None. """ chroot_version_file = self._ChrootVersionPath(chroot) if not os.path.exists(chroot_version_file): return None return osutils.ReadFile(chroot_version_file).strip() def EnsureChrootAtVersion(self, version): """Ensure the current chroot is at version |version|. If our chroot has version, use it. Otherwise, blow away the chroot. Args: version: Version of the chroot to look for. E.g. 6394.0.0-rc3 """ chroot = os.path.join(self._build_root, constants.DEFAULT_CHROOT_DIR) if version and self.GetChrootVersion(chroot) == version: cros_build_lib.PrintBuildbotStepText('(Using existing chroot)') else: cros_build_lib.PrintBuildbotStepText('(Using fresh chroot)') osutils.RmDir(chroot, ignore_missing=True, sudo=True) def ClearChrootVersion(self, chroot=None): """Clear the version in the specified |chroot|. Args: chroot: Path to chroot. Defaults to 'chroot' under build root. """ chroot_version_file = self._ChrootVersionPath(chroot) osutils.RmDir(chroot_version_file, ignore_missing=True, sudo=True) def SetChrootVersion(self, version, chroot=None): """Update the version file in the chroot to |version|. Args: version: Version to use. E.g. 6394.0.0-rc3 chroot: Path to chroot. Defaults to 'chroot' under build root. """ chroot_version_file = self._ChrootVersionPath(chroot) if os.path.exists(os.path.dirname(chroot_version_file)): sudo.SetFileContents(chroot_version_file, version)