#!/usr/bin/python

import os
import sys
import subprocess


def parse_env(data):
    env = {}
    for line in data.strip().splitlines():
        try:
            key, value = line.split("=", 1)
        except:
            pass
        env[key] = value
    return env


def format_diff(a, b):
    for key in set(a) | set(b):
        if key in b:
            if a.get(key) != b[key]:
                yield ["set", "-x", key, b[key]]
        elif key in a:
            yield ["set", "-e", key]


def open_pipe():
    read_fd, write_fd = os.pipe()
    return os.fdopen(read_fd, "rb"), write_fd


def main(args):
    before_reader, before_fd = open_pipe()
    after_reader, after_fd = open_pipe()

    if len(args) == 0:
        return "Usage: source_compat.py command [arguments ...]"
    elif len(args) == 1:
        command = args[0]
    else:
        command = subprocess.list2cmdline(sys.argv[1:])
    proc = subprocess.Popen([
        "/bin/bash", "-lc", 
        "/usr/bin/env 1>&%(b)s; exec %(b)s>&-; %(c)s; /usr/bin/env 1>&%(a)s; exec %(a)s>&-" 
        % {"b": before_fd, "a": after_fd, "c": command}
        ])
    os.close(before_fd)
    os.close(after_fd)
    env_before = parse_env(before_reader.read())
    env_after = parse_env(after_reader.read())
    for stmt in format_diff(env_before, env_after):
        print subprocess.list2cmdline(stmt)
    return proc.wait()

if __name__ == "__main__":
    sys.exit(main(sys.argv[1:]))