From 4152e1657c3bf7c2ca5c14c4e99924b6792226f0 Mon Sep 17 00:00:00 2001 From: William Deegan Date: Sun, 21 Mar 2021 19:04:11 -0700 Subject: [PATCH 1/3] Fixes #2801. Undefined variable value yields '.' as node and may cause rermoving all files in tree. --- CHANGES.txt | 4 ++++ SCons/Environment.py | 18 +++++++++++++++--- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index 03d563dab5..0cba5bc458 100755 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -17,6 +17,10 @@ RELEASE VERSION/DATE TO BE FILLED IN LATER "Multiple ways to build the same target were specified for:". Now mingw will disable creating the symlinks (and adding version string to ) dlls. It sets SHLIBNOVERSIONSYMLINKS, IMPLIBNOVERSIONSYMLINKS and LDMODULENOVERSIONSYMLINKS to True. + - Fix Issue #2801 - Handle calling Clean('$XYZ','$ABC') when either env['XYZ'] or env['ABC'] + is undefined as that would yield either argument as '.'. This will lead to cleaning the wrong + (or all) files potentially when you request the wrong (or any target). + From Daniel Moody: - Update CacheDir to use uuid for tmpfile uniqueness instead of pid. diff --git a/SCons/Environment.py b/SCons/Environment.py index dc7b7a10ea..9fbc66b9fd 100644 --- a/SCons/Environment.py +++ b/SCons/Environment.py @@ -32,17 +32,15 @@ import copy import os -import sys import re import shlex +import sys from collections import UserDict import SCons.Action import SCons.Builder import SCons.Debug -from SCons.Debug import logInstanceCreation import SCons.Defaults -from SCons.Errors import UserError, BuildError import SCons.Memoize import SCons.Node import SCons.Node.Alias @@ -54,6 +52,8 @@ import SCons.Subst import SCons.Tool import SCons.Warnings +from SCons.Debug import logInstanceCreation +from SCons.Errors import UserError, BuildError from SCons.Util import ( AppendPath, CLVar, @@ -74,6 +74,7 @@ uniquer_hashables, ) + class _Null: pass @@ -2000,6 +2001,17 @@ def CacheDir(self, path): def Clean(self, targets, files): global CleanTargets + + # Check for anything which evaluates to empty string, which would yield cleaning '.' + targets_strings = [(t, self.subst(t)) for t in flatten(targets) if is_String(t) and ('$' in t or t == '')] + files_strings = [(t, self.subst(t)) for t in flatten(files) if is_String(t) and ('$' in t or t == '')] + if any([s=='' for t,s in targets_strings]): + raise UserError("Targets specified to Clean() include on which evaluates to an empty string: [%s]" % ",".join( + ["%s='%s'"%(str(t),s) for (t, s) in targets_strings])) + if any([s=='' for t,s in files_strings]): + raise UserError("Targets specified to Clean() include on which evaluates to an empty string: [%s]" % ",".join( + ["%s='%s'"%(str(t),s) for (t, s) in files_strings])) + tlist = self.arg2nodes(targets, self.fs.Entry) flist = self.arg2nodes(files, self.fs.Entry) for t in tlist: From 36a0dc8fb2fb034e2bf52eec4c1fa8567234af99 Mon Sep 17 00:00:00 2001 From: William Deegan Date: Sun, 21 Mar 2021 20:15:13 -0700 Subject: [PATCH 2/3] [appveyor skip] [travisci skip] Fix sider issues --- SCons/Environment.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/SCons/Environment.py b/SCons/Environment.py index 9fbc66b9fd..ba31de302b 100644 --- a/SCons/Environment.py +++ b/SCons/Environment.py @@ -2005,12 +2005,14 @@ def Clean(self, targets, files): # Check for anything which evaluates to empty string, which would yield cleaning '.' targets_strings = [(t, self.subst(t)) for t in flatten(targets) if is_String(t) and ('$' in t or t == '')] files_strings = [(t, self.subst(t)) for t in flatten(files) if is_String(t) and ('$' in t or t == '')] - if any([s=='' for t,s in targets_strings]): - raise UserError("Targets specified to Clean() include on which evaluates to an empty string: [%s]" % ",".join( - ["%s='%s'"%(str(t),s) for (t, s) in targets_strings])) - if any([s=='' for t,s in files_strings]): - raise UserError("Targets specified to Clean() include on which evaluates to an empty string: [%s]" % ",".join( - ["%s='%s'"%(str(t),s) for (t, s) in files_strings])) + if any([s == '' for t, s in targets_strings]): + raise UserError( + "Targets specified to Clean() include on which evaluates to an empty string: [%s]" % ",".join( + ["%s='%s'" % (str(t), s) for (t, s) in targets_strings])) + if any([s == '' for t, s in files_strings]): + raise UserError( + "Targets specified to Clean() include on which evaluates to an empty string: [%s]" % ",".join( + ["%s='%s'" % (str(t), s) for (t, s) in files_strings])) tlist = self.arg2nodes(targets, self.fs.Entry) flist = self.arg2nodes(files, self.fs.Entry) From 43c0b2c6bfe5ccab81810e97b409cf1e86327823 Mon Sep 17 00:00:00 2001 From: William Deegan Date: Mon, 22 Mar 2021 11:12:12 -0700 Subject: [PATCH 3/3] [ci skip] fix typo in exception messaging --- SCons/Environment.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SCons/Environment.py b/SCons/Environment.py index ba31de302b..fa50809791 100644 --- a/SCons/Environment.py +++ b/SCons/Environment.py @@ -2007,11 +2007,11 @@ def Clean(self, targets, files): files_strings = [(t, self.subst(t)) for t in flatten(files) if is_String(t) and ('$' in t or t == '')] if any([s == '' for t, s in targets_strings]): raise UserError( - "Targets specified to Clean() include on which evaluates to an empty string: [%s]" % ",".join( + "Targets specified to Clean() include one which evaluates to an empty string: [%s]" % ",".join( ["%s='%s'" % (str(t), s) for (t, s) in targets_strings])) if any([s == '' for t, s in files_strings]): raise UserError( - "Targets specified to Clean() include on which evaluates to an empty string: [%s]" % ",".join( + "Targets specified to Clean() include one which evaluates to an empty string: [%s]" % ",".join( ["%s='%s'" % (str(t), s) for (t, s) in files_strings])) tlist = self.arg2nodes(targets, self.fs.Entry)