| #!/bin/bash |
| |
| # Copyright (c) 2010 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. |
| |
| # Mark all ebuilds in chromiumos-overlay and chromeos-overlay as stable and |
| # point them at the current version we have checked out. |
| # |
| # This is useful in case we want to verify that all ebuilds are pointing at the |
| # right commit hash when we are doing a build on a branch. It is intended to be |
| # used prior to tagging and can be used instead of a preflight queue. It is an |
| # alternative to cros_mark_all_as_stable that does not require a chroot and |
| # does not increase the revision number on ebuilds. |
| # |
| # Unlike cros_mark_all_as_stable, which only updates the latest stable ebuild |
| # for a given board, this script updates all stable ebuilds for all boards, |
| # including unused stable ebuilds. We do this for the sake of simplicity |
| # because it's hard to know in advance which ebuilds are truly unused, and it |
| # shouldn't hurt to update unused ebuilds. |
| # |
| # This script does not support cros_mark_as_stable_blacklist. If there are any |
| # packages in the blacklist, this script exits with an error message. |
| # |
| # Long term, the plan is to get rid of this script and replace it with |
| # cros_mark_all_as_stable. This script is only present to help with branching. |
| # |
| # Example usage: ./cros_mark_branch_as_stable |
| |
| # --- BEGIN COMMON.SH BOILERPLATE --- |
| # Load common CrOS utilities. Inside the chroot this file is installed in |
| # /usr/lib/crosutils. Outside the chroot we find it relative to the script's |
| # location. |
| find_common_sh() { |
| local common_paths=(/usr/lib/crosutils $(dirname "$(readlink -f "$0")")) |
| local path |
| |
| SCRIPT_ROOT= |
| for path in "${common_paths[@]}"; do |
| if [ -r "${path}/common.sh" ]; then |
| SCRIPT_ROOT=${path} |
| break |
| fi |
| done |
| } |
| |
| find_common_sh |
| . "${SCRIPT_ROOT}/common.sh" || (echo "Unable to load common.sh" && exit 1) |
| # --- END COMMON.SH BOILERPLATE --- |
| |
| function is_workon() { xargs grep -lE '^inherit.*cros-workon'; } |
| function is_stable() { xargs grep -lE '^KEYWORDS=[^~]*$'; } |
| function is_unstable() { xargs grep -lE '^KEYWORDS=.*~'; } |
| |
| function get_workon_commit() { |
| # Get the latest workon commit associated with an ebuild. |
| ebuild="$1" |
| dir=$(dirname "$ebuild") |
| CATEGORY=$(basename "$(dirname "$dir")") |
| CROS_WORKON_LOCALNAME=$(basename "$dir") |
| CROS_WORKON_SUBDIR= |
| |
| # Grab the code from the ebuild that initializes the CROS_WORKON_* |
| # variables, and eval it. Note that this only works if the variables are at |
| # the start of the line (i.e. it doesn't work for "if" statements). |
| eval $(grep -E '^CROS_WORKON' $ebuild) |
| |
| SUFFIX="$CROS_WORKON_LOCALNAME/$CROS_WORKON_SUBDIR" |
| if [[ "$CATEGORY" = "chromeos-base" ]]; then |
| SRCDIR="$GCLIENT_ROOT/src/platform/$SUFFIX" |
| else |
| SRCDIR="$GCLIENT_ROOT/src/third_party/$SUFFIX" |
| fi |
| |
| # TODO(anush): This hack is only necessary because the kernel ebuild has "if" |
| # statements, so we can't grab the CROS_WORKON_LOCALNAME properly. We should |
| # clean up the kernel ebuild and remove this hack. |
| if ! [[ -d "$SRCDIR" ]] && [[ "$CROS_WORKON_LOCALNAME" = "kernel" ]]; then |
| SRCDIR="$GCLIENT_ROOT/src/third_party/kernel/files" |
| fi |
| |
| cd $SRCDIR && git rev-parse HEAD |
| } |
| |
| BLACKLIST_FILE="${SCRIPTS_DIR}/cros_mark_as_stable_blacklist" |
| BLACKLIST=$(cat "$BLACKLIST_FILE") |
| if [[ -n "$BLACKLIST" ]]; then |
| die "$0 does not support cros_mark_as_stable_blacklist" |
| fi |
| |
| for overlay in "$GCLIENT_ROOT/src/private-overlays/chromeos-overlay" \ |
| "$GCLIENT_ROOT/src/third_party/chromiumos-overlay"; do |
| if [[ -d "$overlay" ]]; then |
| ebuilds=$(find "$overlay" -type f -name "*.ebuild" | is_workon | is_stable) |
| for ebuild in $ebuilds; do |
| dir=$(dirname "$ebuild") |
| unstable_ebuild=$(echo "$dir"/*-9999.ebuild | is_workon | is_unstable) |
| if [[ -f "$unstable_ebuild" ]]; then |
| COMMIT=$(get_workon_commit $unstable_ebuild) |
| sed -e '/^KEYWORDS="/s/~//g' -e '/^CROS_WORKON_COMMIT=/d' \ |
| -e "/^EAPI/s/\$/\nCROS_WORKON_COMMIT=\"$COMMIT\"/g" \ |
| "$unstable_ebuild" > "$ebuild" |
| else |
| echo "No 9999 ebuild for $ebuild" >&2 |
| COMMIT=$(get_workon_commit $ebuild) |
| sed -i -e "/^CROS_WORKON_COMMIT/s|=.*|=\"$COMMIT\"|" "$ebuild" |
| fi |
| if [[ -z "$COMMIT" ]]; then |
| die "No commit hash for $ebuild" |
| fi |
| done |
| fi |
| done |
| |
| echo Updated all ebuilds |