diff --git a/scripts/lib/util.py b/scripts/lib/util.py index a57cdc881..001d0b778 100644 --- a/scripts/lib/util.py +++ b/scripts/lib/util.py @@ -8,55 +8,56 @@ import sys def validate_pair(ob): - if not (len(ob) == 2): - print("Unexpected result:", ob, file=sys.stderr) - return False - else: - return True + if not (len(ob) == 2): + print("Unexpected result:", ob, file=sys.stderr) + return False + else: + return True -def consume(iter): - try: - while True: next(iter) - except StopIteration: - pass +def consume(it): + try: + while True: + next(it) + except StopIteration: + pass def get_environment_from_batch_command(env_cmd, initial=None): - """ - Take a command (either a single command or list of arguments) - and return the environment created after running that command. - Note that if the command must be a batch file or .cmd file, or the - changes to the environment will not be captured. + """ + Take a command (either a single command or list of arguments) + and return the environment created after running that command. + Note that if the command must be a batch file or .cmd file, or the + changes to the environment will not be captured. - If initial is supplied, it is used as the initial environment passed - to the child process. - """ - if not isinstance(env_cmd, (list, tuple)): - env_cmd = [env_cmd] - # Construct the command that will alter the environment. - env_cmd = subprocess.list2cmdline(env_cmd) - # Create a tag so we can tell in the output when the proc is done. - tag = 'END OF BATCH COMMAND' - # Construct a cmd.exe command to do accomplish this. - cmd = 'cmd.exe /s /c "{env_cmd} && echo "{tag}" && set"'.format(**vars()) - # Launch the process. - proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, env=initial) - # Parse the output sent to stdout. - lines = proc.stdout - # Consume whatever output occurs until the tag is reached. - consume(itertools.takewhile(lambda l: tag not in l, lines)) - # Define a way to handle each KEY=VALUE line. - handle_line = lambda l: l.rstrip().split('=',1) - # Parse key/values into pairs. - pairs = map(handle_line, lines) - # Make sure the pairs are valid. - valid_pairs = filter(validate_pair, pairs) - # Construct a dictionary of the pairs. - result = dict(valid_pairs) - # Let the process finish. - proc.communicate() - return result + If initial is supplied, it is used as the initial environment passed + to the child process. + """ + if not isinstance(env_cmd, (list, tuple)): + env_cmd = [env_cmd] + # Construct the command that will alter the environment. + env_cmd = subprocess.list2cmdline(env_cmd) + # Create a tag so we can tell in the output when the proc is done. + tag = 'END OF BATCH COMMAND' + # Construct a cmd.exe command to do accomplish this. + cmd = 'cmd.exe /s /c "{env_cmd} && echo "{tag}" && set"'.format(**vars()) + # Launch the process. + proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, env=initial) + # Parse the output sent to stdout. + lines = proc.stdout + # Consume whatever output occurs until the tag is reached. + consume(itertools.takewhile(lambda l: tag not in l, lines)) + # Define a way to handle each KEY=VALUE line. + handle_line = lambda l: l.rstrip().split('=', 1) + # Parse key/values into pairs. + pairs = map(handle_line, lines) + # Make sure the pairs are valid. + valid_pairs = filter(validate_pair, pairs) + # Construct a dictionary of the pairs. + result = dict(valid_pairs) + # Let the process finish. + proc.communicate() + return result def get_vs_env(vs_version, arch):