1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- #!/usr/bin/env python
- # License: GPLv3 Copyright: 2022, Kovid Goyal <kovid at kovidgoyal.net>
- from typing import Dict, List, Tuple
- from .utils import shlex_split
- def decode_ansi_c_quoted_string(text: str) -> str:
- return next(shlex_split(text, True))
- def decode_double_quoted_string(text: str, pos: int) -> Tuple[str, int]:
- escapes = r'"\$`'
- buf: List[str] = []
- a = buf.append
- while pos < len(text):
- ch = text[pos]
- pos += 1
- if ch == '\\':
- if text[pos] in escapes:
- a(text[pos])
- pos += 1
- continue
- a(ch)
- elif ch == '"':
- break
- else:
- a(ch)
- return ''.join(buf), pos
- def parse_modern_bash_env(text: str) -> Dict[str, str]:
- ans = {}
- for line in text.splitlines():
- idx = line.find('=')
- if idx < 0:
- break
- key = line[:idx].rpartition(' ')[2]
- val = line[idx+1:]
- if val.startswith('"'):
- val = decode_double_quoted_string(val, 1)[0]
- else:
- val = decode_ansi_c_quoted_string(val)
- ans[key] = val
- return ans
- def parse_bash_env(text: str, bash_version: str) -> Dict[str, str]:
- # See https://www.gnu.org/software/bash/manual/html_node/Double-Quotes.html
- parts = bash_version.split('.')
- bv = tuple(map(int, parts[:2]))
- if bv >= (5, 2):
- return parse_modern_bash_env(text)
- ans = {}
- pos = 0
- while pos < len(text):
- idx = text.find('="', pos)
- if idx < 0:
- break
- i = text.rfind(' ', 0, idx)
- if i < 0:
- break
- key = text[i+1:idx]
- pos = idx + 2
- ans[key], pos = decode_double_quoted_string(text, pos)
- return ans
|