cros_workon info: Better handling of CROS_WORKON_PROJECT.

We currently have a problem with -9999 ebuilds with multiple values in
CROS_WORKON_PROJECT are causing cros_workon to output errors. This is
fixed as follows:

- CROS_WORKON_PROJECT assignments are extracted more precisely,
  including arrays.

- Multiple values are concatenated into comma-separated strings.

- When no project value(s) were found, output a dash ('-').

- When an error occurs we do not attempt to dump information for that
  ebuild.

This would still print an error if some assignment failed to evaluate
correctly, making the problem evident (and allowing us to further adjust
the parsing logic as needed).

BUG=None
TEST='cros_workon info' parses all ebuilds correctly.
TEST=cros_workon info system_api shows complete list of projects.

Change-Id: I2045a80d30b1ff41b12e0b36812f1ed21e6b4fe7
Reviewed-on: https://chromium-review.googlesource.com/254640
Reviewed-by: David James <davidjames@chromium.org>
Tested-by: Gilad Arnold <garnold@chromium.org>
Commit-Queue: Gilad Arnold <garnold@chromium.org>
diff --git a/cros_workon b/cros_workon
index 17047d3..da397e2 100755
--- a/cros_workon
+++ b/cros_workon
@@ -129,22 +129,25 @@
 
 show_project_ebuild_map() {
   local keyword="$1"
-  local cros_workon_vars
+  local project_var
 
   # Column 1: Repo name
   # Column 2: Package name
   for EBUILD in $(find_keyword_workon_ebuilds ${keyword}); do
     (
-      cros_workon_vars=$(grep -E '^CROS_WORKON' "${EBUILD}")
+      project_var=$(awk -- \
+        '/CROS_WORKON_PROJECT=/,/CROS_WORKON_PROJECT=[^(]|\)/' "${EBUILD}")
       # Can only detect syntax errors in subshells; not in our own.
-      if ( eval "${cros_workon_vars}" ); then
-        eval "${cros_workon_vars}"
+      if ( eval "${project_var}" ); then
+        eval "${project_var}"
       else
         error "From $EBUILD, failed to eval:"
-        error "$cros_workon_vars"
+        error "$project_var"
+        continue
       fi
       CP=$(echo "$EBUILD" | ebuild_to_package)
-      echo "${CROS_WORKON_PROJECT}" "${CP}"
+      projects=$(echo "${CROS_WORKON_PROJECT[@]}" | sed 's/ /,/g')
+      echo "${projects:--}" "${CP}"
     )
   done
 }