Add experimental support for python in 'git cl format'

Based on yapf (https://github.com/google/yapf) this
formatter currently only works with --full.  It defaults
to pep8 style and projects that use a different style
can add .style.yapf to the top level.

Review URL: https://codereview.chromium.org/1156743008

git-svn-id: svn://svn.chromium.org/chrome/trunk/tools/depot_tools@295547 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/gclient_utils.py b/gclient_utils.py
index fbcbc26..21c44c3 100644
--- a/gclient_utils.py
+++ b/gclient_utils.py
@@ -698,6 +698,8 @@
     return override
 
   primary_solution = GetPrimarySolutionPath()
+  if not primary_solution:
+    return None
   buildtools_path = os.path.join(primary_solution, 'buildtools')
   if not os.path.exists(buildtools_path):
     # Buildtools may be in the gclient root.
@@ -1171,6 +1173,7 @@
   logging.debug('Failed to get CPU count. Defaulting to 1.')
   return 1
 
+
 def DefaultDeltaBaseCacheLimit():
   """Return a reasonable default for the git config core.deltaBaseCacheLimit.
 
@@ -1183,6 +1186,7 @@
   else:
     return '512m'
 
+
 def DefaultIndexPackConfig(url=''):
   """Return reasonable default values for configuring git-index-pack.
 
@@ -1193,3 +1197,21 @@
   if url in THREADED_INDEX_PACK_BLACKLIST:
     result.extend(['-c', 'pack.threads=1'])
   return result
+
+
+def FindExecutable(executable):
+  """This mimics the "which" utility."""
+  path_folders = os.environ.get('PATH').split(os.pathsep)
+
+  for path_folder in path_folders:
+    target = os.path.join(path_folder, executable)
+    # Just incase we have some ~/blah paths.
+    target = os.path.abspath(os.path.expanduser(target))
+    if os.path.isfile(target) and os.access(target, os.X_OK):
+      return target
+    if sys.platform.startswith('win'):
+      for suffix in ('.bat', '.cmd', '.exe'):
+        alt_target = target + suffix
+        if os.path.isfile(alt_target) and os.access(alt_target, os.X_OK):
+          return alt_target
+  return None