From dfb8d9d87fca9817fc4d42bd137735efc3272a36 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Tue, 20 Dec 2022 22:25:08 -0600 Subject: [PATCH] Fix PATH environment variable handling on Windows PATH needs to be matched case-insensitively on Windows or we will just clobber the pre-existing PATH --- src/process.cpp | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/process.cpp b/src/process.cpp index 2b6c1507..8783db8c 100644 --- a/src/process.cpp +++ b/src/process.cpp @@ -279,8 +279,21 @@ std::string parse_env_val(bp::native_environment &env, const std::string_view &v ss.write(pos, (dollar - pos)); auto var_begin = next + 1; auto var_end = find_match(next, std::end(val_raw)); + auto var_name = std::string { var_begin, var_end }; - ss << env[std::string { var_begin, var_end }].to_string(); +#ifdef _WIN32 + // Windows treats environment variable names in a case-insensitive manner, + // so we look for a case-insensitive match here. This is critical for + // correctly appending to PATH on Windows. + auto itr = std::find_if(env.cbegin(), env.cend(), + [&](const auto &e) { return boost::iequals(e.get_name(), var_name); }); + if(itr != env.cend()) { + // Use an existing case-insensitive match + var_name = itr->get_name(); + } +#endif + + ss << env[var_name].to_string(); pos = var_end + 1; next = var_end;