diff --git a/src/dotenv/main.py b/src/dotenv/main.py index 3c4608d5..d7d4009d 100644 --- a/src/dotenv/main.py +++ b/src/dotenv/main.py @@ -216,7 +216,8 @@ def set_key( ) if quote: - value_out = "'{}'".format(value_to_set.replace("'", "\\'")) + escaped_value = value_to_set.replace("\\", "\\\\").replace("'", "\\'") + value_out = f"'{escaped_value}'" else: value_out = value_to_set if export: diff --git a/tests/test_main.py b/tests/test_main.py index 1c33c808..ee357632 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -63,6 +63,21 @@ def test_set_key_encoding(dotenv_path): assert dotenv_path.read_text(encoding=encoding) == "a='é'\n" +@pytest.mark.parametrize( + "value", + [ + "C:\\Users\\name", + r"\\d+", + r"prefix\\suffix", + "backslash\\'quote", + ], +) +def test_set_key_round_trips_backslashes(dotenv_path, value): + dotenv.set_key(dotenv_path, "VALUE", value) + + assert dotenv.get_key(dotenv_path, "VALUE") == value + + @pytest.mark.skipif( sys.platform == "win32", reason="file mode bits behave differently on Windows" )