Extended device autodetection to work with --to_product.

This both fixes an incorrect behavior where --to_product would unsafely
lead to using a target device not intended to by the user; and reuses
the existing logic for device autodetection to work with provided
product strings.  As a result, it is easier to find devices, and the
script's behavior is more consistent as far as device detection and
selection.  This preserves the pattern matching on product string (now
properly highlighted in usage text and inline comments).

BUG=None
TEST=Ran script with various flag combinations (--to, --to_product),
product strings,  and devices connected.

Change-Id: I80bfca086029555853a680e7c97251b11adc912e
Reviewed-on: https://gerrit.chromium.org/gerrit/15757
Reviewed-by: Richard Barnette <jrbarnette@chromium.org>
Commit-Ready: Gilad Arnold <garnold@chromium.org>
Tested-by: Gilad Arnold <garnold@chromium.org>
This commit is contained in:
Gilad Arnold 2012-02-13 09:23:00 -08:00 committed by Gerrit
parent b91d73d7cf
commit a0a02f4c3a

View File

@ -48,7 +48,7 @@ DEFINE_string from "" \
DEFINE_string to "/dev/sdX" \
"write to a specific disk or image file"
DEFINE_string to_product "" \
"write to a disk with product name matching a pattern"
"find target device with product name matching a string (accepts wildcards)"
DEFINE_boolean yes ${FLAGS_FALSE} \
"answer yes to all prompts" \
y
@ -145,47 +145,42 @@ if [ ! -d "${FLAGS_from}" ] ; then
die "Cannot find image directory ${FLAGS_from}"
fi
if [ -n "${FLAGS_to_product}" ]; then
if [ "${FLAGS_to}" != "/dev/sdX" ]; then
die "Cannot specify both --to and --to_product"
fi
match=""
for disk in $(list_usb_disks) $(list_mmc_disks); do
if [[ "$(get_disk_info $disk product)" = ${FLAGS_to_product} ]]; then
if [ -n "${match}" ]; then
die "Multiple devices match product '${FLAGS_to_product}', aborting"
fi
match="$disk"
fi
done
if [ -z "${match}" ]; then
echo "Failed to find a devices matching product '${FLAGS_to_product}'"
# Leave FLAGS_to set to its default and fall through to the error report.
else
FLAGS_to="/dev/${match}"
fi
fi
# No target provided, attempt autodetection.
if [ "${FLAGS_to}" == "/dev/sdX" ]; then
echo "No target device specified, autodetecting..."
if [ -z "${FLAGS_to_product}" ]; then
echo "No target device specified, autodetecting..."
else
echo "Looking for target devices matching '${FLAGS_to_product}'..."
fi
# Obtain list of USB and MMC device names.
disk_list=( $(list_usb_disks) $(list_mmc_disks) )
if (( ! ${#disk_list[*]} )); then
die "No target device could be detected"
fi
# Build list of descriptive strings for detected devices.
unset disk_string_list
for disk in "${disk_list[@]}"; do
# If --to_product was used, match against provided string.
# Note: we intentionally use [[ ... != ... ]] to allow pattern matching on
# the product string.
if [ -n "${FLAGS_to_product}" ] &&
[[ "$(get_disk_info ${disk} product)" != ${FLAGS_to_product} ]]; then
continue
fi
disk_string=$(get_disk_string /dev/${disk})
disk_string_list=( "${disk_string_list[@]}" \
disk_string_list=( "${disk_string_list[@]}"
"/dev/${disk}: ${disk_string}" )
done
# If no (matching) devices found, quit.
if (( ! ${#disk_string_list[*]} )); then
if [ -z "${FLAGS_to_product}" ]; then
die "No USB/MMC devices could be detected"
else
die "No matching USB/MMC devices could be detected"
fi
fi
# Prompt for selection, or autoselect if only one device was found.
if (( ${#disk_string_list[*]} > 1 )); then
PS3="Select a target device: "
@ -201,6 +196,8 @@ if [ "${FLAGS_to}" == "/dev/sdX" ]; then
fi
FLAGS_to="${disk_string%%:*}"
elif [ -n "${FLAGS_to_product}" ]; then
die "Cannot specify both --to and --to_product"
fi
# Guess ARCH if it's unset