blob: 970fc2f07354b739c9dc351bb249b34b97482d0e [file] [log] [blame]
# 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_logging as logging
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:
logging.PrintBuildbotStepText('(Using existing chroot)')
else:
logging.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)