#!/usr/bin/env python
import os
import sys
import glob
import subprocess
import shlex

def runCommand(cmd, instream = None, msg = '', upon_succ=None):
    if isinstance(cmd, str):
        cmd = shlex.split(cmd)
    try:
        tc = subprocess.Popen(cmd, stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.PIPE,
                              env={'PATH':os.pathsep.join(['.', os.environ['PATH']])})
        if instream:
            if sys.version_info.major == 3:
                instream = instream.encode(sys.getdefaultencoding())
            out, error = tc.communicate(instream)
        else:
            out, error = tc.communicate()
        if sys.version_info.major == 3:
            out = out.decode(sys.getdefaultencoding())
            error = error.decode(sys.getdefaultencoding())
    except Exception as e:
        raise OSError ("Execution of command '{0}' failed: {1}".format(cmd, e))
    # everything is OK
    if upon_succ:
        # call the function (upon_succ) using others as parameters.
        upon_succ[0](*(upon_succ[1:]))
    return out, error

def loadPackages(fn):
    with open(fn, 'r') as f:
        p = [x.strip() for x in f.readlines() if not x.startswith("#")]
    return p

if __name__ == "__main__":
    if len(sys.argv) != 3:
        sys.exit("Usage: {0} PackageList TargetDirectory".format(sys.argv[0]))
    lib_dir = sys.argv[2]
    if not os.path.exists(os.path.expanduser(lib_dir)):
        sys.exit("Cannot find directory {0}".format(lib_dir))
    packages = loadPackages(sys.argv[1])
    cmd = "R --slave --vanilla"
    for package in packages:
        print("Installing {0} to {1}".format(package, lib_dir))
        rscript = '''install.packages("{0}", lib="{1}", repos="http://cran.stat.ucla.edu")'''.\
          format(package, lib_dir)
        out, error = runCommand(cmd, rscript)
        print(out)
        print(error)