diff options
author | David Hendricks <dhendrix@chromium.org> | 2013-11-11 18:44:05 -0800 |
---|---|---|
committer | David Hendricks <dhendrix@chromium.org> | 2013-11-17 10:31:17 +0100 |
commit | 1b6e7a67489138848edfc641522297b0263b739c (patch) | |
tree | 1f70fa00d0753b59d1e3db71ab09357d45baacec | |
parent | 0dde01cad1c0b1422c845fc201733be559004fb7 (diff) |
Updates to the board status script
This is the first major re-work for the board status script.
Summary:
- Added a command to the getrevision.sh script to retrieve tagged
revision.
- Results are placed in a dynamically generated temporary location.
This makes it easy to do multiple trial runs and avoids polluting
the coreboot directory.
- Results are stored in a directory with the following form:
<vendor>/<mainboard>/<tagged_revision>/<timestamp>/
Vendor and mainboard are obtained from CONFIG_MAINBOARD_DIR so that
hierarchy is consistent between coreboot and board-status.
- The results directory is used as the commit message.
- board-status repository is checked out automatically if results are
to be uploaded.
TODO:
- Add ability to run commands which may fail. Currently we assume
any failure should terminate the script, but some commands can be
made optional.
Successfully uploaded first result to board-status repository. See
http://review.coreboot.org/gitweb?p=board-status.git;a=summary .
Change-Id: Icba41ccad4e6e6ee829b8092a2459c2d72a3365b
Signed-off-by: David Hendricks <dhendrix@chromium.org>
Reviewed-on: http://review.coreboot.org/4039
Tested-by: build bot (Jenkins)
Reviewed-by: Ronald G. Minnich <rminnich@gmail.com>
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | util/board_status/board_status.sh | 103 | ||||
-rwxr-xr-x | util/board_status/getrevision.sh | 20 |
3 files changed, 99 insertions, 25 deletions
diff --git a/.gitignore b/.gitignore index 1cdabfc52b..c172244bd3 100644 --- a/.gitignore +++ b/.gitignore @@ -55,6 +55,7 @@ tarballs/ util/*/.dependencies util/*/.test +util/board_status/board-status util/cbfstool/cbfstool util/cbmem/.dependencies util/cbmem/cbmem diff --git a/util/board_status/board_status.sh b/util/board_status/board_status.sh index d2955e0d63..12d1ecddf4 100644 --- a/util/board_status/board_status.sh +++ b/util/board_status/board_status.sh @@ -7,13 +7,17 @@ EXIT_SUCCESS=0 EXIT_FAILURE=1 -OUTDIR="status" # Stuff from command-line switches REMOTE_HOST="" CLOBBER_OUTPUT=0 UPLOAD_RESULTS=0 +# Used to specify whether a command should always be run locally or +# if command should be run remoteley when a remote host is specified. +LOCAL=0 +REMOTE=1 + show_help() { echo "Usage: ${0} <option> @@ -22,7 +26,7 @@ Options -h Show this message. -c - Clobber output when finished. + Clobber temporary output when finished. Useful when not uploading. -r <host> Obtain machine information from remote host (using ssh). -u @@ -42,7 +46,7 @@ test_cmd() return fi - if [[ $1 -eq 1 && "$REMOTE_HOST" ]]; then + if [[ $1 -eq $REMOTE && -n "$REMOTE_HOST" ]]; then ssh root@${REMOTE_HOST} which "$2" >/dev/null rc=$? else @@ -68,7 +72,7 @@ cmd() return fi - if [[ $1 -eq 1 && -n "$REMOTE_HOST" ]]; then + if [[ $1 -eq $REMOTE && -n "$REMOTE_HOST" ]]; then ssh root@${REMOTE_HOST} "$2" else $2 @@ -100,38 +104,87 @@ while getopts "chr:u" opt; do esac done -if [ -e "$OUTDIR" ]; then - echo "Output directory exists, aborting." +grep -rH 'coreboot.org' .git/config >/dev/null 2>&1 +if [ $? -ne 0 ]; then + echo "Script must be run from root of coreboot directory" exit $EXIT_FAILURE fi -mkdir "$OUTDIR" +# Results will be placed in a temporary location until we're ready to upload. +# If the user does not wish to upload, results will remain in /tmp. +tmpdir=$(mktemp -d) + +# Obtain board and revision info to form the directory structure: +# <vendor>/<board>/<revision>/<timestamp> +cbfstool_cmd="util/cbfstool/cbfstool" +test_cmd $LOCAL "$cbfstool_cmd" +$cbfstool_cmd build/coreboot.rom extract -n config -f ${tmpdir}/config.txt +mainboard_dir="$(grep CONFIG_MAINBOARD_DIR ${tmpdir}/config.txt | awk -F '"' '{ print $2 }')" +vendor=$(echo "$mainboard_dir" | awk -F '/' '{ print $1 }') +mainboard=$(echo "$mainboard_dir" | awk -F '/' '{ print $2 }') getrevision="util/board_status/getrevision.sh" -test_cmd 0 $getrevision -touch ${OUTDIR}/revision.txt -printf "Local revision: %s\n" $($getrevision -l) >> ${OUTDIR}/revision.txt -printf "Upstream revision: %s\n" $($getrevision -u) >> ${OUTDIR}/revision.txt -printf "Upstream URL: %s\n" $($getrevision -U)>> ${OUTDIR}/revision.txt -printf "Timestamp: %s\n" $($getrevision -t) >> ${OUTDIR}/revision.txt +test_cmd $LOCAL $getrevision +tagged_version=$($getrevision -T) +timestamp=$($getrevision -t) + +results="${vendor}/${mainboard}/${tagged_version}/${timestamp}" + +echo "Temporarily placing output in ${tmpdir}/${results}" +mkdir -p "${tmpdir}/${results}" + +mv "${tmpdir}/config.txt" "${tmpdir}/${results}" + +touch ${tmpdir}/${results}/revision.txt +printf "Local revision: %s\n" "$($getrevision -l)" >> ${tmpdir}/${results}/revision.txt +printf "Tagged revision: %s\n" "${tagged_version}" >> ${tmpdir}/${results}/revision.txt +printf "Upstream revision: %s\n" $($getrevision -u) >> ${tmpdir}/${results}/revision.txt +printf "Upstream URL: %s\n" $($getrevision -U)>> ${tmpdir}/${results}/revision.txt +printf "Timestamp: %s\n" "$timestamp" >> ${tmpdir}/${results}/revision.txt + +test_cmd $REMOTE "cbmem" +cmd $REMOTE "cbmem -c" > ${tmpdir}/${results}/coreboot_console.txt + +# TODO: Some commands should be optional and be non-fatal in case of error. +#cmd $REMOTE "cbmem -t" > ${outdir}/coreboot_timestamps.txt + +cmd $REMOTE dmesg > ${tmpdir}/${results}/kernel_log.txt + +# FIXME: the board-status directory might get big over time. Is there a way we +# can push the results without fetching the whole repo? +coreboot_dir=`pwd` +if [ $UPLOAD_RESULTS -eq 1 ]; then + # extract username from ssh://<username>@review.coreboot.org/blah + username=$(git config --get remote.origin.url | sed 's/ssh\:\/\///' | sed 's/@.*//') + + cd "util/board_status/" + if [ ! -e "board-status" ]; then + git clone "ssh://${username}@review.coreboot.org:29418/board-status" + if [ $? -ne 0 ]; then + "Error cloning board-status repo, aborting." + exit $EXIT_FAILURE + fi + fi -cbfstool_cmd="util/cbfstool/cbfstool" -test_cmd 0 "$cbfstool_cmd" -$cbfstool_cmd build/coreboot.rom extract -n config -f ${OUTDIR}/config.txt + cd "board-status" + echo "Copying results to $(pwd)/${results}" -test_cmd 1 "cbmem" -cmd 1 "cbmem -c" > ${OUTDIR}/coreboot_console.txt -cmd 1 "cbmem -t" > ${OUTDIR}/coreboot_timestamps.txt -cmd 1 "cbmem -C" > ${OUTDIR}/coreboot_coverage.txt + # Note: Result directory should be unique due to the timestamp. + cp -R "${tmpdir}/${vendor}" . -cmd 1 dmesg > ${OUTDIR}/kernel_log.txt + echo "Uploading results" + git add "${vendor}" + git commit -a -am "${mainboard_dir}/${tagged_version}/${timestamp}" + git push origin -#if [ $UPLOAD_RESULTS -eq 1 ]; then -# FIXME: implement this part -#fi + # Results have been uploaded so it's pointless to keep the + # temporary files around. + rm -rf "${tmpdir}" +fi +cd "$coreboot_dir" if [ $CLOBBER_OUTPUT -eq 1 ]; then - rm -rf ${OUTDIR} + rm -rf ${tmpdir} fi exit $EXIT_SUCCESS diff --git a/util/board_status/getrevision.sh b/util/board_status/getrevision.sh index c8c126a5ee..0a6b6c6923 100755 --- a/util/board_status/getrevision.sh +++ b/util/board_status/getrevision.sh @@ -121,6 +121,20 @@ local_revision() { echo "${r}" } +# Similar to local_revision but uses "git describe" instead of "git log" which +# includes number of commits since most recent tag. +tagged_revision() { + local r + + if git_is_file_tracked "$1" ; then + r=$(git describe --tags --dirty) + else + return ${EXIT_FAILURE} + fi + + echo "${r}" +} + upstream_revision() { local r= @@ -143,6 +157,8 @@ Commands local revision information including an indicator for uncommitted changes -u or --upstream upstream revision + -T or --tags + similar to -l, but uses \"git describe\" to obtain revision info with tags -U or --url URL associated with the latest commit -d or --date @@ -175,6 +191,10 @@ main() { check_action $1 action=local_revision shift;; + -T|--tags) + check_action $1 + action=tagged_revision + shift;; -u|--upstream) check_action $1 action=upstream_revision |