From 8e6d890a19e557e86791da5905ed96c271a6f61f Mon Sep 17 00:00:00 2001
From: Matthew Krafczyk <krafczyk.matthew@gmail.com>
Date: Tue, 15 Nov 2016 15:17:03 -0500
Subject: [PATCH] -s now includes the file and line number with info

The option -s now causes file and line number information to be printed
along with any invocation of msg, info, etc...

This will greatly ease debugging.
---
 bin/spack                           |  3 +++
 lib/spack/llnl/util/tty/__init__.py | 34 +++++++++++++++++++++++++++--
 2 files changed, 35 insertions(+), 2 deletions(-)

diff --git a/bin/spack b/bin/spack
index 1f5dec0b3d..7cc1b28a37 100755
--- a/bin/spack
+++ b/bin/spack
@@ -128,6 +128,8 @@ parser.add_argument('-p', '--profile', action='store_true',
                     help="Profile execution using cProfile.")
 parser.add_argument('-v', '--verbose', action='store_true',
                     help="Print additional output during builds")
+parser.add_argument('-s', '--stacktrace', action='store_true',
+                    help="Add stacktrace information to all printed statements")
 parser.add_argument('-V', '--version', action='version',
                     version="%s" % spack.spack_version)
 
@@ -155,6 +157,7 @@ def main():
     # Set up environment based on args.
     tty.set_verbose(args.verbose)
     tty.set_debug(args.debug)
+    tty.set_stacktrace(args.stacktrace)
     spack.debug = args.debug
 
     if spack.debug:
diff --git a/lib/spack/llnl/util/tty/__init__.py b/lib/spack/llnl/util/tty/__init__.py
index db74aaba6b..07fe579a8c 100644
--- a/lib/spack/llnl/util/tty/__init__.py
+++ b/lib/spack/llnl/util/tty/__init__.py
@@ -28,12 +28,14 @@
 import fcntl
 import termios
 import struct
+import traceback
 from StringIO import StringIO
 
 from llnl.util.tty.color import *
 
 _debug   = False
 _verbose = False
+_stacktrace = False
 indent  = "  "
 
 
@@ -45,6 +47,10 @@ def is_debug():
     return _debug
 
 
+def is_stacktrace():
+    return _stacktrace
+
+
 def set_debug(flag):
     global _debug
     _debug = flag
@@ -53,10 +59,29 @@ def set_debug(flag):
 def set_verbose(flag):
     global _verbose
     _verbose = flag
+    
+
+def set_stacktrace(flag):
+    global _stacktrace
+    _stacktrace = flag
+
+
+def process_stacktrace(countback):
+    """Returns a string with the file and line of the stackframe 'countback' frames from the bottom of the stack"""
+    st = traceback.extract_stack()
+    #First entry should be bin/spack. Use this to get spack 'root'.
+    #bin/spack is 9 characters, the length of the 'root' is then len-9.
+    root_len = len(st[0][0])-9
+    st_idx = len(st)-countback-1
+    st_text = "%s:%i " % (st[st_idx][0][root_len:], st[st_idx][1])
+    return st_text
 
 
 def msg(message, *args):
-    cprint("@*b{==>} %s" % cescape(message))
+    st_text = ""
+    if _stacktrace:
+        st_text = process_stacktrace(2)
+    cprint("@*b{%s==>} %s" % (st_text, cescape(message)))
     for arg in args:
         print indent + str(arg)
 
@@ -66,8 +91,12 @@ def info(message, *args, **kwargs):
     stream = kwargs.get('stream', sys.stdout)
     wrap   = kwargs.get('wrap', False)
     break_long_words = kwargs.get('break_long_words', False)
+    st_countback = kwargs.get('countback', 3)
 
-    cprint("@%s{==>} %s" % (format, cescape(str(message))), stream=stream)
+    st_text = ""
+    if _stacktrace:
+        st_text = process_stacktrace(st_countback)
+    cprint("@%s{%s==>} %s" % (format, st_text, cescape(str(message))), stream=stream)
     for arg in args:
         if wrap:
             lines = textwrap.wrap(
@@ -105,6 +134,7 @@ def warn(message, *args, **kwargs):
 
 
 def die(message, *args, **kwargs):
+    kwargs.setdefault('countback', 4)
     error(message, *args, **kwargs)
     sys.exit(1)
 
-- 
GitLab