--- a/sbsv2/raptor/python/raptor_data.py Wed Dec 09 14:14:31 2009 +0000
+++ b/sbsv2/raptor/python/raptor_data.py Wed Dec 09 18:30:33 2009 +0000
@@ -722,15 +722,24 @@
def Apply(self, oldValue):
try:
value = os.environ[self.name]
-
- # if this value is a "path" or a "tool" then we need to make sure
- # it is a proper absolute path in our preferred format.
- if value and (self.type == "path" or self.type == "tool"):
- try:
- path = generic_path.Path(value)
- value = str(path.Absolute())
- except ValueError,e:
- raise BadToolValue("the environment variable %s is incorrect: %s" % (self.name, str(e)))
+
+ if value:
+ # if this value ends in an un-escaped backslash, then it will be treated as a line continuation character in makefile
+ # parsing - un-escaped backslashes at the end of values are therefore escaped
+ if value.endswith('\\'):
+ # an odd number of backslashes means there's one to escape
+ count = len(value) - len(value.rstrip('\\'))
+ if count % 2:
+ value += '\\'
+
+ # if this value is a "path" or a "tool" then we need to make sure
+ # it is a proper absolute path in our preferred format.
+ if self.type == "path" or self.type == "tool":
+ try:
+ path = generic_path.Path(value)
+ value = str(path.Absolute())
+ except ValueError,e:
+ raise BadToolValue("the environment variable %s is incorrect: %s" % (self.name, str(e)))
except KeyError:
if self.default != None:
value = self.default
--- a/sbsv2/raptor/test/unit_suite/raptor_data_unit.py Wed Dec 09 14:14:31 2009 +0000
+++ b/sbsv2/raptor/test/unit_suite/raptor_data_unit.py Wed Dec 09 18:30:33 2009 +0000
@@ -30,24 +30,18 @@
def SetEnv(self, name, value):
- # set environment variable and remember the old value
-
- try:
- old = os.environ[name]
- self.envStack[name] = old
- os.environ[name] = value
- except KeyError:
- self.envStack[name] = None # was not defined
+ # set environment variable and remember the old value (if there is one)
+ if os.environ.has_key(name):
+ self.envStack[name] = os.environ[name]
+ os.environ[name] = value
def RestoreEnv(self, name):
# put environment back to its state before SetEnv
- saved = self.envStack[name]
-
- if saved == None:
+ if self.envStack.has_key(name):
+ os.environ[name] = self.envStack[name]
+ else:
del os.environ[name] # was not defined
- else:
- os.environ[name] = saved
def testSimpleSpecification(self):
@@ -359,6 +353,32 @@
# test the Resolve wrt EPOCROOT
varcfg = eval.Resolve("VARIANT_CFG")
self.assertEqual(varcfg, "/C/variant/variant.cfg")
+
+ def testProblematicEnvironment(self):
+ # ask for environment variable values that will break makefile parsing due to
+ # backslashes forming line continuation characters
+ self.SetEnv("ENVVAR_BSLASH_END1", "C:\\test1a\\;C:\\test1b\\")
+ self.SetEnv("ENVVAR_BSLASH_END2", "C:\\test2a\\;C:\\test2b\\\\")
+ self.SetEnv("ENVVAR_BSLASH_END3", "C:\\test3a\\;C:\\test3b\\\\\\")
+ var = raptor_data.Variant("my.var")
+ var.AddOperation(raptor_data.Env("ENVVAR_BSLASH_END1"))
+ var.AddOperation(raptor_data.Env("ENVVAR_BSLASH_END2"))
+ var.AddOperation(raptor_data.Env("ENVVAR_BSLASH_END3"))
+
+ aRaptor = raptor.Raptor()
+ eval = aRaptor.GetEvaluator(None, var.GenerateBuildUnits(aRaptor.cache)[0])
+ self.RestoreEnv("ENVVAR_BSLASH_END1")
+ self.RestoreEnv("ENVVAR_BSLASH_END2")
+ self.RestoreEnv("ENVVAR_BSLASH_END3")
+
+ value = eval.Get("ENVVAR_BSLASH_END1")
+ self.assertEqual(value, "C:\\test1a\\;C:\\test1b\\\\")
+
+ value = eval.Get("ENVVAR_BSLASH_END2")
+ self.assertEqual(value, "C:\\test2a\\;C:\\test2b\\\\")
+
+ value = eval.Get("ENVVAR_BSLASH_END3")
+ self.assertEqual(value, "C:\\test3a\\;C:\\test3b\\\\\\\\")
def testMissingEnvironment(self):
# ask for an environment variable that is not set