| Index: cros_workon
|
| diff --git a/cros_workon b/cros_workon
|
| index 0d9c9189d83bc1963e8e36de23236518f101fd94..38738a618ffb67a6cf3bee69f028780d07b86466 100755
|
| --- a/cros_workon
|
| +++ b/cros_workon
|
| @@ -31,272 +31,4 @@ find_common_sh
|
| . "${SCRIPT_ROOT}/common.sh" || (echo "Unable to load common.sh" && exit 1)
|
| # --- END COMMON.SH BOILERPLATE ---
|
|
|
| -# Script must be run inside the chroot
|
| -restart_in_chroot_if_needed "$@"
|
| -get_default_board
|
| -
|
| -DEFINE_string board "${DEFAULT_BOARD}" \
|
| - "The board to set package keywords for."
|
| -DEFINE_boolean host "${FLAGS_FALSE}" \
|
| - "Uses the host instead of board"
|
| -DEFINE_string command "git status" \
|
| - "The command to be run by forall."
|
| -DEFINE_boolean all "${FLAGS_FALSE}" \
|
| - "Apply to all possible packages for the given command"
|
| -
|
| -FLAGS_HELP="usage: $0 <command> [flags] [<list of packages>|--all]
|
| -commands:
|
| - start: Moves an ebuild to live (intended to support development)
|
| - stop: Moves an ebuild to stable (use last known good)
|
| - list: List of live ebuilds (workon ebuilds if --all)
|
| - list-all: List all of the live ebuilds for all setup boards
|
| - iterate: For each ebuild, cd to the source dir and run a commond"
|
| -FLAGS "$@" || exit 1
|
| -eval set -- "${FLAGS_ARGV}"
|
| -
|
| -
|
| -# eat the workon command keywords: start, stop or list.
|
| -WORKON_CMD=$1
|
| -shift
|
| -
|
| -# Board dir config
|
| -
|
| -# If both are specified, just use host, because board does not
|
| -# have to be specified and may come from default, in which case
|
| -# there's no way to override.
|
| -[ -n "${FLAGS_board}" ] && [ "${FLAGS_host}" = ${FLAGS_TRUE} ] && \
|
| - FLAGS_board="" # kill board
|
| -[ -z "${FLAGS_board}" ] && [ "${FLAGS_host}" = ${FLAGS_FALSE} ] && \
|
| -[ "${WORKON_CMD}" != "list-all" ] && \
|
| - die "You must specify either --host or --board="
|
| -
|
| -if [ -n "${FLAGS_board}" ]; then
|
| - BOARD_DIR=/build/"${FLAGS_board}" # --board specified
|
| - EQUERYCMD=equery-"${FLAGS_board}"
|
| - EBUILDCMD=ebuild-"${FLAGS_board}"
|
| - PORTAGEQCMD=portageq-"${FLAGS_board}"
|
| - BOARD_STR="${FLAGS_board}"
|
| - BOARD_KEYWORD="$(portageq-${FLAGS_board} envvar ARCH)"
|
| -else
|
| - BOARD_DIR="" # --host specified
|
| - EQUERYCMD=equery
|
| - EBUILDCMD=ebuild
|
| - PORTAGEQCMD=portageq
|
| - BOARD_STR="host"
|
| - BOARD_KEYWORD="$(portageq envvar ARCH)"
|
| -fi
|
| -
|
| -WORKON_DIR=${CHROOT_TRUNK_DIR}/.config/cros_workon
|
| -KEYWORDS_DIR=${BOARD_DIR}/etc/portage/package.keywords
|
| -UNMASK_DIR=${BOARD_DIR}/etc/portage/package.unmask
|
| -WORKON_FILE=${WORKON_DIR}/${FLAGS_board:-host}
|
| -KEYWORDS_FILE=${KEYWORDS_DIR}/cros-workon
|
| -UNMASK_FILE=${UNMASK_DIR}/cros-workon
|
| -
|
| -# TODO(msb): remove the backward compatibility after 10/01/2010
|
| -if [ -d "${WORKON_DIR}" ]; then
|
| - sudo chown -R "${USER}" "${WORKON_DIR}"
|
| -fi
|
| -
|
| -mkdir -p "${WORKON_DIR}" || die "mkdir -p ${WORKON_DIR}"
|
| -touch "${WORKON_FILE}" || die "touch ${WORKON_FILE}"
|
| -sudo mkdir -p "${KEYWORDS_DIR}" "${UNMASK_DIR}" || \
|
| - die "mkdir -p ${KEYWORDS_DIR} ${UNMASK_DIR}"
|
| -if [ ! -L "${KEYWORDS_FILE}" ]; then
|
| - sudo rm -f "${KEYWORDS_FILE}"
|
| - sudo ln -s "${WORKON_FILE}" "${KEYWORDS_FILE}" || \
|
| - die "ln -s ${WORKON_FILE} ${KEYWORDS_FILE}"
|
| -fi
|
| -if [ ! -L "${UNMASK_FILE}" ]; then
|
| - [ -f "${UNMASK_FILE}" ] && sudo mv "${UNMASK_FILE}" "${WORKON_FILE}"
|
| - sudo ln -s "${WORKON_FILE}" "${UNMASK_FILE}" || \
|
| - die "ln -s ${WORKON_FILE} ${UNMASK_FILE}"
|
| -fi
|
| -
|
| -find_keyword_workon_ebuilds() {
|
| - local keyword="${1}"
|
| - local overlay
|
| -
|
| - local cros_overlays=$("${PORTAGEQCMD}" envvar PORTDIR_OVERLAY)
|
| -
|
| - # NOTE: overlay may be a symlink, and we have to use ${overlay}/
|
| - for overlay in ${cros_overlays}; do
|
| - # only look up ebuilds named 9999 to eliminate duplicates
|
| - find ${overlay}/ -name '*9999.ebuild' | \
|
| - xargs grep -l "inherit.*cros-workon" | \
|
| - xargs grep -l "KEYWORDS=.*${keyword}.*"
|
| - done
|
| -}
|
| -
|
| -show_workon_ebuilds() {
|
| - local keyword=$1
|
| -
|
| - find_keyword_workon_ebuilds ${keyword} | \
|
| - sed -e 's/.*\/\([^/]*\)\/\([^/]*\)\/.*\.ebuild/\1\/\2/' | \
|
| - sort -u
|
| - # This changes the absolute path to ebuilds into category/package.
|
| -}
|
| -
|
| -# Canonicalize package name to category/package.
|
| -canonicalize_name () {
|
| - local pkgfile
|
| - local pkgname
|
| -
|
| - if grep -qx "=$1-9999" "${WORKON_FILE}" ; then
|
| - echo $1
|
| - return 0
|
| - fi
|
| -
|
| - if ! pkgfile=$(ACCEPT_KEYWORDS="~${BOARD_KEYWORD}" ${EQUERYCMD} which $1); then
|
| - warn "error looking up package $1" 1>&2
|
| - return 1
|
| - fi
|
| -
|
| - pkgname=$(\
|
| - echo "${pkgfile}" |awk -F '/' '{ print $(NF-2) "/" $(NF-1) }')
|
| -
|
| - if ! grep -q "cros-workon" ${pkgfile}; then
|
| - warn "${pkgname} is not a cros-workon package" 1>&2
|
| - return 1
|
| - fi
|
| - echo "${pkgname}"
|
| - return 0
|
| -}
|
| -
|
| -# Canonicalize a list of names.
|
| -canonicalize_names () {
|
| - local atoms=$1
|
| - local names=""
|
| - local atom
|
| -
|
| - for atom in ${atoms}; do
|
| - local name=$(canonicalize_name "${atom}")
|
| - [ -n "${name}" ] || return 1
|
| - names+=" ${name}"
|
| - done
|
| -
|
| - echo "${names}"
|
| -}
|
| -
|
| -# Display ebuilds currently part of the live branch and open for development.
|
| -show_live_ebuilds () {
|
| - sed -n 's/^=\(.*\)-9999$/\1/p' "${WORKON_FILE}"
|
| -}
|
| -
|
| -# Display ebuilds currently part of the live branch and open for development
|
| -# for any board that currently has live ebuilds.
|
| -show_all_live_ebuilds () {
|
| - local workon_file
|
| - for workon_file in ${WORKON_DIR}/*; do
|
| - if [ -s "${workon_file}" ]; then
|
| - echo -e "${V_BOLD_GREEN}$(basename ${workon_file}):${V_VIDOFF}"
|
| - sed -n 's/^=\(.*\)-9999$/ \1/p' "${workon_file}"
|
| - echo ""
|
| - fi
|
| - done
|
| -}
|
| -
|
| -# This is called only for "cros-workon start". We dont handle the
|
| -# "stop" case since the local changes are ignored anyway since the
|
| -# 9999.ebuild is masked and we dont want to deal with what to do with
|
| -# the user's local changes.
|
| -regen_manifest_and_sync() {
|
| - # Nothing to do unless you are working on the minilayout
|
| - local manifest=${CHROOT_TRUNK_DIR}/.repo/manifest.xml
|
| - if [ $(basename $(readlink -f ${manifest})) != "minilayout.xml" ]; then
|
| - return
|
| - fi
|
| -
|
| - local pkgname
|
| - for pkgname in $(show_live_ebuilds); do
|
| - eval $(${EBUILDCMD} $(${EQUERYCMD} which ${pkgname}) info)
|
| - local srcdir=$(readlink -m ${CROS_WORKON_SRCDIR})
|
| - local trunkdir=$(readlink -m ${CHROOT_TRUNK_DIR})
|
| - local project_path=${srcdir#${trunkdir}/}
|
| -
|
| - loman add --workon "${CROS_WORKON_PROJECT}" "${project_path}"
|
| - done
|
| - echo "Please run \"repo sync\" now."
|
| -}
|
| -
|
| -# Move a stable ebuild to the live development catgeory. The ebuild
|
| -# src_unpack step fetches the package source for local development.
|
| -ebuild_to_live () {
|
| - local atoms=$1
|
| - local atoms_success=""
|
| - local atom
|
| -
|
| - for atom in ${atoms}; do
|
| - if ! grep -qx "=${atom}-9999" "${WORKON_FILE}" ; then
|
| - if sudo bash -c "echo \"=${atom}-9999\" >> \"${WORKON_FILE}\""; then
|
| - atoms_success="${atoms_success} ${atom}"
|
| - fi
|
| - else
|
| - warn "Already working on ${atom}"
|
| - fi
|
| - done
|
| - [ -n "${atoms_success}" ] && regen_manifest_and_sync && \
|
| - info "Started working on '${atoms_success/ /}' for '${BOARD_STR}'"
|
| -}
|
| -
|
| -# Move a live development ebuild back to stable.
|
| -ebuild_to_stable () {
|
| - local atoms=$1
|
| - local atoms_success=""
|
| - local atom
|
| -
|
| - for atom in ${atoms}; do
|
| - if grep -qx "=${atom}-9999" "${WORKON_FILE}" ; then
|
| - if sudo sed -e "/^=${atom/\//\\/}-9999\$/d" -i "${WORKON_FILE}"; then
|
| - atoms_success="${atoms_success} ${atom}"
|
| - fi
|
| - else
|
| - warn "Not working on ${atom}"
|
| - fi
|
| - done
|
| - [ -n "${atoms_success}" ] && \
|
| - info "Stopped working on '${atoms_success/ /}' for '${BOARD_STR}'"
|
| -}
|
| -
|
| -# Run a command on all or a set of repos.
|
| -ebuild_iterate() {
|
| - local atoms=$1
|
| - local atom
|
| -
|
| - for atom in ${atoms}; do
|
| - info "Running \"${FLAGS_command}\" on ${atom}"
|
| - eval $(${EBUILDCMD} $(${EQUERYCMD} which ${atom}) info)
|
| - (cd "${CROS_WORKON_SRCDIR}" && bash -c "${FLAGS_command}")
|
| - done
|
| -}
|
| -
|
| -# --all makes commands operate on different lists
|
| -if [ ${FLAGS_all} = "${FLAGS_TRUE}" ]; then
|
| - case ${WORKON_CMD} in
|
| - start) ATOM_LIST=$(show_workon_ebuilds ${BOARD_KEYWORD});;
|
| - stop|iterate) ATOM_LIST=$(show_live_ebuilds);;
|
| - list) ;;
|
| - *) die "--all is invalid for the given command";;
|
| - esac
|
| -else # not selected --all
|
| - case ${WORKON_CMD} in
|
| - start|stop|iterate)
|
| - ATOM_LIST=$@
|
| - if [ -z "${ATOM_LIST}" ]; then
|
| - die "${WORKON_CMD}: No packages specified"
|
| - elif ! ATOM_LIST=$(canonicalize_names "${ATOM_LIST}"); then
|
| - die "Error parsing package list"
|
| - fi;;
|
| - *) ;;
|
| - esac
|
| -fi
|
| -
|
| -case ${WORKON_CMD} in
|
| - start) ebuild_to_live "${ATOM_LIST}" ;;
|
| - stop) ebuild_to_stable "${ATOM_LIST}" ;;
|
| - list) [ ${FLAGS_all} = "${FLAGS_FALSE}" ] && show_live_ebuilds || \
|
| - show_workon_ebuilds ${BOARD_KEYWORD} ;;
|
| - list-all) show_all_live_ebuilds ;;
|
| - iterate) ebuild_iterate "${ATOM_LIST}" ;;
|
| - *) die "$(basename $0): command '${WORKON_CMD}' not recognized" ;;
|
| -esac
|
| +die "error: Please run cros_workon from chroot:/usr/bin/cros_workon"
|
|
|