From ef2006272479307f86e45a93b55fee4c0f798580 Mon Sep 17 00:00:00 2001
From: Peter Odding <peter@peterodding.com>
Date: Sun, 19 May 2013 23:43:19 +0200
Subject: Improve error reporting in xolox#misc#os#exec()

---
 autoload/xolox/misc/compat.vim |  2 +-
 autoload/xolox/misc/os.vim     | 24 +++++++++++++++++-------
 2 files changed, 18 insertions(+), 8 deletions(-)

(limited to 'autoload')

diff --git a/autoload/xolox/misc/compat.vim b/autoload/xolox/misc/compat.vim
index c950ad6..56aff62 100644
--- a/autoload/xolox/misc/compat.vim
+++ b/autoload/xolox/misc/compat.vim
@@ -7,7 +7,7 @@
 " scripts breaks backwards compatibility. This enables my Vim plug-ins to fail
 " early when they detect an incompatible version, instead of breaking at the
 " worst possible moments :-).
-let g:xolox#misc#compat#version = 4
+let g:xolox#misc#compat#version = 5
 
 " Remember the directory where the miscellaneous scripts are loaded from
 " so the user knows which plug-in to update if incompatibilities arise.
diff --git a/autoload/xolox/misc/os.vim b/autoload/xolox/misc/os.vim
index 8add797..032d2c8 100644
--- a/autoload/xolox/misc/os.vim
+++ b/autoload/xolox/misc/os.vim
@@ -87,19 +87,29 @@ function! xolox#misc#os#exec(options) " {{{1
 
     endif
 
-    let result = {}
+    " Return the results as a dictionary with one or more key/value pairs.
+    let result = {'command': cmd}
     if !async
+      let result['exit_code'] = exit_code
+      let result['stdout'] = s:readfile(tempout)
+      let result['stderr'] = s:readfile(temperr)
       " If we just executed a synchronous command and the caller didn't
       " specifically ask us *not* to check the exit code of the external
       " command, we'll do so now.
       if get(a:options, 'check', 1) && exit_code != 0
-        let msg = "os.vim %s: External command failed with exit code %d: %s"
-        throw printf(msg, g:xolox#misc#os#version, result['exit_code'], result['command'])
+        " Prepare an error message with enough details so the user can investigate.
+        let msg = printf("os.vim %s: External command failed with exit code %d!", g:xolox#misc#os#version, result['exit_code'])
+        let msg .= printf("\nCommand line: %s", result['command'])
+        " If the external command reported an error, we'll include it in our message.
+        if !empty(result['stderr'])
+          " This is where we would normally expect to find an error message.
+          let msg .= printf("\nOutput on standard output stream:\n%s", join(result['stderr'], "\n"))
+        elseif !empty(result['stdout'])
+          " Exuberant Ctags on Windows XP reports errors on standard output :-x.
+          let msg .= printf("\nOutput on standard error stream:\n%s", join(result['stdout'], "\n"))
+        endif
+        throw msg
       endif
-      " Return the results as a dictionary with three key/value pairs.
-      let result['exit_code'] = exit_code
-      let result['stdout'] = s:readfile(tempout)
-      let result['stderr'] = s:readfile(temperr)
     endif
     return result
 
-- 
cgit v1.2.3