summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLucian Petrut <lpetrut@cloudbasesolutions.com>2019-05-31 15:06:56 +0300
committerLucian Petrut <lpetrut@cloudbasesolutions.com>2019-05-31 15:35:45 +0300
commita7e5c0202ea00aab29c009f7adef6cea51ac6e25 (patch)
treed7c60d39c5a8923e19336babdb12b149c531eae4
parentc1e4225c5a5b9917c62f84d3ae56e747e2758f69 (diff)
downloadpbr-a7e5c0202ea00aab29c009f7adef6cea51ac6e25.tar.gz
Fix Windows support
A recent commit [1] broke Windows support by using shlex to unquote paths. The issue with shlex.split is that it doesn't work with Windows paths, treating backslashes as escape characters. We'll just replace backslashes with slashes before using shlex.split, converting them back afterwards. Closes-Bug: #1831242 [1] Id2cc32e4e40c1f834b19756e922118d8526358d3 Change-Id: Icb3abca004a35ab9760db8116fedfa96d012d0d0
-rw-r--r--pbr/hooks/files.py7
-rw-r--r--pbr/util.py18
2 files changed, 21 insertions, 4 deletions
diff --git a/pbr/hooks/files.py b/pbr/hooks/files.py
index 0fe0df5..c44af7c 100644
--- a/pbr/hooks/files.py
+++ b/pbr/hooks/files.py
@@ -41,6 +41,13 @@ def unquote_path(path):
# strip the quotes off individual path components because os.walk cannot
# handle paths like: "'i like spaces'/'another dir'", so we will pass it
# "i like spaces/another dir" instead.
+
+ if os.name == 'nt':
+ # shlex cannot handle paths that contain backslashes, treating those
+ # as escape characters.
+ path = path.replace("\\", "/")
+ return "".join(shlex.split(path)).replace("/", "\\")
+
return "".join(shlex.split(path))
diff --git a/pbr/util.py b/pbr/util.py
index e931b5f..e52f009 100644
--- a/pbr/util.py
+++ b/pbr/util.py
@@ -161,6 +161,16 @@ BOOL_FIELDS = ("use_2to3", "zip_safe", "include_package_data")
CSV_FIELDS = ()
+def shlex_split(path):
+ if os.name == 'nt':
+ # shlex cannot handle paths that contain backslashes, treating those
+ # as escape characters.
+ path = path.replace("\\", "/")
+ return [x.replace("/", "\\") for x in shlex.split(path)]
+
+ return shlex.split(path)
+
+
def resolve_name(name):
"""Resolve a name like ``module.object`` to an object and return it.
@@ -373,22 +383,22 @@ def setup_cfg_to_setup_kwargs(config, script_args=()):
for line in in_cfg_value:
if '=' in line:
key, value = line.split('=', 1)
- key_unquoted = shlex.split(key.strip())[0]
+ key_unquoted = shlex_split(key.strip())[0]
key, value = (key_unquoted, value.strip())
if key in data_files:
# Multiple duplicates of the same package name;
# this is for backwards compatibility of the old
# format prior to d2to1 0.2.6.
prev = data_files[key]
- prev.extend(shlex.split(value))
+ prev.extend(shlex_split(value))
else:
- prev = data_files[key.strip()] = shlex.split(value)
+ prev = data_files[key.strip()] = shlex_split(value)
elif firstline:
raise errors.DistutilsOptionError(
'malformed package_data first line %r (misses '
'"=")' % line)
else:
- prev.extend(shlex.split(line.strip()))
+ prev.extend(shlex_split(line.strip()))
firstline = False
if arg == 'data_files':
# the data_files value is a pointlessly different structure