Automatically adds quotes on Windows when necessary

So that a command like
 "git config rietveld.viewvc-url http://src.chromium.org/viewvc/chrome?view=rev&revision="
works fine.

Fix the description automatically generated for the hooks to be using the same
code than for the one presented to the user.

R=cmp@chromium.org
BUG=
TEST=Tested manually on cygwin, win32, linux


Review URL: https://chromiumcodereview.appspot.com/10447021

git-svn-id: svn://svn.chromium.org/chrome/trunk/tools/depot_tools@138874 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/git_cl.py b/git_cl.py
index 2c63d73..7fa0c2d 100755
--- a/git_cl.py
+++ b/git_cl.py
@@ -51,9 +51,21 @@
   sys.exit(1)
 
 
+def QuoteCommand(command):
+  """Quotes command on Windows so it runs fine even with & and | in the string.
+  """
+  if sys.platform == 'win32':
+    def fix(arg):
+      if ('&' in arg or '|' in arg) and '"' not in arg:
+        arg = '"%s"' % arg
+      return arg
+    command = [fix(arg) for arg in command]
+  return command
+
+
 def RunCommand(args, error_ok=False, error_message=None, **kwargs):
   try:
-    return subprocess2.check_output(args, shell=False, **kwargs)
+    return subprocess2.check_output(QuoteCommand(args), **kwargs)
   except subprocess2.CalledProcessError, e:
     if not error_ok:
       DieWithError(
@@ -533,8 +545,7 @@
       # If the change was never uploaded, use the log messages of all commits
       # up to the branch point, as git cl upload will prefill the description
       # with these log messages.
-      description = RunCommand(['git', 'log', '--pretty=format:%s%n%n%b',
-                                '%s...' % (upstream_branch)]).strip()
+      description = CreateDescriptionFromLog([upstream_branch + '..'])
 
     if not author:
       author = RunGit(['config', 'user.email']).strip() or None
@@ -879,7 +890,7 @@
     log_args = [args[0] + '..' + args[1]]
   else:
     log_args = args[:]  # Hope for the best!
-  return RunGit(['log', '--pretty=format:%s\n\n%b'] + log_args)
+  return RunGit(['log', '--pretty=format:%s%n%n%b'] + log_args)
 
 
 def ConvertToInteger(inputval):