From a43d1523b0d0ad6b2f8fb3752d5817d7defbc615 Mon Sep 17 00:00:00 2001
From: Steven Knight <knight@baldmt.com>
Date: Wed, 6 Oct 2004 04:04:12 +0000
Subject: Better --debug=explain info when build actions change.  (Kevin Quick)

---
 src/CHANGES.txt                   |  2 ++
 src/engine/SCons/Node/__init__.py | 11 ++++++++---
 test/explain.py                   |  7 ++++++-
 3 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/src/CHANGES.txt b/src/CHANGES.txt
index cf8a4e9..0167581 100644
--- a/src/CHANGES.txt
+++ b/src/CHANGES.txt
@@ -186,6 +186,8 @@ RELEASE 0.97 - XXX
   - Add a deprecated warning for use of the old "scanner" keyword argument
     to Builder creation.
 
+  - Improve the --debug=explain message when the build action changes.
+
   From Christoph Wiedemann:
 
   - Add an Environment.SetDefault() method that only sets values if
diff --git a/src/engine/SCons/Node/__init__.py b/src/engine/SCons/Node/__init__.py
index 6e7379c..a4e1266 100644
--- a/src/engine/SCons/Node/__init__.py
+++ b/src/engine/SCons/Node/__init__.py
@@ -899,13 +899,18 @@ class Node:
 
         if len(lines) == 0:
             newact, newactsig = self.binfo.bact, self.binfo.bactsig
+            def fmt_with_title(title, strlines):
+                lines = string.split(strlines, '\n')
+                sep = '\n' + ' '*(15 + len(title))
+                return ' '*15 + title + string.join(lines, sep) + '\n'
             if old.bactsig != newactsig:
                 if old.bact == newact:
-                    lines.append("the contents of the build action changed\n")
+                    lines.append("the contents of the build action changed\n" +
+                                 fmt_with_title('action: ', newact))
                 else:
                     lines.append("the build action changed:\n" +
-                                 "%sold: %s\n" % (' '*15, old.bact) +
-                                 "%snew: %s\n" % (' '*15, newact))
+                                 fmt_with_title('old: ', old.bact) +
+                                 fmt_with_title('new: ', newact))
 
         if len(lines) == 0:
             return "rebuilding `%s' for unknown reasons" % self
diff --git a/test/explain.py b/test/explain.py
index be966c0..eed95c4 100644
--- a/test/explain.py
+++ b/test/explain.py
@@ -455,7 +455,9 @@ if mode:
         tgt = str(target[0])
         src = str(source[0])
         shutil.copy(src, tgt)
-    MyCopy = Builder(action = DifferentCopy)
+    def AltCopyStage2(target, source, env):
+        pass
+    MyCopy = Builder(action = [DifferentCopy, AltCopyStage2])
 
     def ChangingCopy(target, source, env):
         tgt = str(target[0])
@@ -491,8 +493,11 @@ test.run(chdir = 'work5',
 scons: rebuilding `f1.out' because the build action changed:
                old: Copy("f1.out", "f1.in")
                new: DifferentCopy(["f1.out"], ["f1.in"])
+                    AltCopyStage2(["f1.out"], ["f1.in"])
 DifferentCopy(["f1.out"], ["f1.in"])
+AltCopyStage2(["f1.out"], ["f1.in"])
 scons: rebuilding `f2.out' because the contents of the build action changed
+               action: ChangingCopy(["f2.out"], ["f2.in"])
 ChangingCopy(["f2.out"], ["f2.in"])
 """))
 
-- 
cgit v0.12