David Hendricks (dhendrix@chromium.org) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/4039
-gerrit
commit 4f32651e0a9653a66fc961a1919651d6d0a107e8 Author: David Hendricks dhendrix@chromium.org Date: Mon Nov 11 18:44:05 2013 -0800
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 --- .gitignore | 1 + util/board_status/board_status.sh | 103 +++++++++++++++++++++++++++++--------- util/board_status/getrevision.sh | 20 ++++++++ 3 files changed, 99 insertions(+), 25 deletions(-)
diff --git a/.gitignore b/.gitignore index 1cdabfc..c172244 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 d2955e0..12d1ecd 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 c8c126a..0a6b6c6 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