Add code to handle errors in .gclient configuration files and output human readble information rather than a raw exception stack.

Review URL: http://codereview.chromium.org/113968

git-svn-id: svn://svn.chromium.org/chrome/trunk/tools/depot_tools@17179 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/gclient.py b/gclient.py
index 8646f31..694435c 100755
--- a/gclient.py
+++ b/gclient.py
@@ -940,7 +940,21 @@
   def SetConfig(self, content):
     self._config_dict = {}
     self._config_content = content
-    exec(content, self._config_dict)
+    try:
+      exec(content, self._config_dict)
+    except SyntaxError, e:
+      try:
+        # Try to construct a human readable error message
+        error_message = [
+            'There is a syntax error in your configuration file.',
+            'Line #%s, character %s:' % (e.lineno, e.offset),
+            '"%s"' % re.sub(r'[\r\n]*$', '', e.text) ]
+      except:
+        # Something went wrong, re-raise the original exception
+        raise e
+      else:
+        # Raise a new exception with the human readable message:
+        raise Error('\n'.join(error_message))
 
   def SaveConfig(self):
     FileWrite(os.path.join(self._root_dir, self._options.config_filename),