Repository: SCons/scons

Issue:
['SUBSTFILEPREFIX', 'TEXTFILESUFFIX']

**Describe the bug**
From git head, just now.  
File: src/engine/SCons/Tool/textfile.py
Line 165:
_text_varlist = _common_varlist + ['TEXTFILEPREFIX', 'TEXTFILESUFFIX']

Line 174:
_subst_varlist = _common_varlist + ['SUBSTFILEPREFIX', 'TEXTFILESUFFIX']

Looks like a cur/paste/edit error.  My guess, from the rest of the code, is that
 'TEXTFILESUFFIX' should be  'SUBSTFILESUFFIX' on line 174



Discussion:
that looks a reasonable conclusion.

Resolving patch:
diff --git a/src/engine/SCons/Tool/textfile.py b/src/engine/SCons/Tool/textfile.py
--- a/src/engine/SCons/Tool/textfile.py
+++ b/src/engine/SCons/Tool/textfile.py
@@ -171,7 +171,7 @@ def _convert_list(target, source, env):
     suffix='$TEXTFILESUFFIX',
 )
 
-_subst_varlist = _common_varlist + ['SUBSTFILEPREFIX', 'TEXTFILESUFFIX']
+_subst_varlist = _common_varlist + ['SUBSTFILEPREFIX', 'SUBSTFILESUFFIX']
 _subst_builder = SCons.Builder.Builder(
     action=SCons.Action.Action(_action, _strfunc, varlist=_subst_varlist),
     source_factory=SCons.Node.FS.File,


Test patch:
diff --git a/test/textfile/fixture/SConstruct.issue-3540 b/test/textfile/fixture/SConstruct.issue-3540
new file mode 100644
--- /dev/null
+++ b/test/textfile/fixture/SConstruct.issue-3540
@@ -0,0 +1,23 @@
+"""
+Test for GH Issue 3540
+
+textfile()'s action is not sensitive to changes in TEXTFILESUFFIX (rather was sensitive to SUBSTFILESUFFIX)
+
+"""
+
+DefaultEnvironment(tools=[])
+
+text_file_suffix = ARGUMENTS.get('text_file_suffix', 'DEFAULTSUFFIX')
+
+env = Environment(tools=['textfile'],
+                  TEXTFILESUFFIX=text_file_suffix)
+
+env['FOO_PATH'] = "test-value-1"
+
+foo = env.Substfile(
+    target="substfile",
+    source="substfile.in",
+    SUBST_DICT={
+        "@foo_path@": "$FOO_PATH",
+    }
+)
diff --git a/test/textfile/fixture/SConstruct.issue-3550 b/test/textfile/fixture/SConstruct.issue-3550
--- a/test/textfile/fixture/SConstruct.issue-3550
+++ b/test/textfile/fixture/SConstruct.issue-3550
@@ -4,8 +4,8 @@ env = Environment(tools=['textfile'])
 env['FOO_PATH'] = r'Z:\mongo\build\install\bin'
 
 foo = env.Substfile(
-    target="foo",
-    source="foo-3550.in",
+    target="substfile",
+    source="substfile.in",
     SUBST_DICT={
         "@foo_path@": "$FOO_PATH",
     }
diff --git a/test/textfile/fixture/foo-3550.in b/test/textfile/fixture/substfile.in
similarity index 100%
rename from test/textfile/fixture/foo-3550.in
rename to test/textfile/fixture/substfile.in
diff --git a/test/textfile/issue-3540.py b/test/textfile/issue-3540.py
new file mode 100644
--- /dev/null
+++ b/test/textfile/issue-3540.py
@@ -0,0 +1,48 @@
+#!/usr/bin/env python
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+"""
+Test for GH Issue 3540
+
+textfile()'s action is not sensitive to changes in TEXTFILEPREFIX (rather was sensitive to SUBSTFILEPREFIX)
+
+"""
+
+import TestSCons
+
+test = TestSCons.TestSCons()
+
+# test.verbose_set(1)
+
+test.file_fixture('fixture/substfile.in', 'substfile.in')
+test.file_fixture('fixture/SConstruct.issue-3540', 'SConstruct')
+
+test.run()
+test.must_exist('substfile')
+
+test.up_to_date(options='text_file_suffix=BLAH')
+
+
+test.pass_test()
diff --git a/test/textfile/issue-3550.py b/test/textfile/issue-3550.py
--- a/test/textfile/issue-3550.py
+++ b/test/textfile/issue-3550.py
@@ -23,21 +23,27 @@
 #
 
 __revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+"""
+Test for GH Issue 3550
+
+ You can't pass a Windows path in a value to be interpolated, 
+ because SCons will try to pass it through re.sub which rejects certain character sequences.
+"""
 
 import TestSCons
 
 test = TestSCons.TestSCons()
 
-test.verbose_set(1)
+# test.verbose_set(1)
 
 match_mode = 'r'
 
 test.file_fixture('fixture/SConstruct.issue-3550', 'SConstruct')
-test.file_fixture('fixture/foo-3550.in', 'foo-3550.in')
+test.file_fixture('fixture/substfile.in', 'substfile.in')
 
 test.run(arguments='.')
 
-test.must_match('foo',
+test.must_match('substfile',
                 r'''foo_path: Z:\mongo\build\install\bin
 ''', mode=match_mode)