61 lines
2.3 KiB
TypeScript
61 lines
2.3 KiB
TypeScript
/// <reference path="../node_modules/pxt-core/typings/node/node.d.ts"/>
|
|
/// <reference path="../node_modules/pxt-core/built/pxtlib.d.ts" />
|
|
|
|
import * as fs from "fs";
|
|
import * as path from "path";
|
|
import * as child_process from "child_process";
|
|
|
|
let writeFileAsync: any = Promise.promisify(fs.writeFile)
|
|
let execAsync: (cmd: string, options?: { cwd?: string }) => Promise<Buffer> = Promise.promisify(child_process.exec)
|
|
let readDirAsync = Promise.promisify(fs.readdir)
|
|
|
|
|
|
export function deployCoreAsync(res: ts.pxtc.CompileResult) {
|
|
return getBitDrivesAsync()
|
|
.then(drives => {
|
|
if (drives.length == 0) {
|
|
console.log("cannot find any drives to deploy to");
|
|
return Promise.resolve(0);
|
|
}
|
|
|
|
console.log(`copy ${ts.pxtc.BINARY_HEX} to ` + drives.join(", "));
|
|
|
|
let writeHexFile = (filename: string) => {
|
|
return writeFileAsync(filename + ts.pxtc.BINARY_HEX, res.outfiles[ts.pxtc.BINARY_HEX])
|
|
.then(() => console.log("wrote hex file to " + filename));
|
|
};
|
|
|
|
return Promise.map(drives, d => writeHexFile(d))
|
|
.then(() => drives.length);
|
|
});
|
|
}
|
|
|
|
function getBitDrivesAsync(): Promise<string[]> {
|
|
if (process.platform == "win32") {
|
|
const rx = new RegExp("^([A-Z]:).* " + pxt.appTarget.compile.deployDrives)
|
|
return execAsync("wmic PATH Win32_LogicalDisk get DeviceID, VolumeName, FileSystem")
|
|
.then(buf => {
|
|
let res: string[] = []
|
|
buf.toString("utf8").split(/\n/).forEach(ln => {
|
|
let m = rx.exec(ln)
|
|
if (m) {
|
|
res.push(m[1] + "/")
|
|
}
|
|
})
|
|
return res
|
|
})
|
|
}
|
|
else if (process.platform == "darwin") {
|
|
const rx = new RegExp(pxt.appTarget.compile.deployDrives)
|
|
return readDirAsync("/Volumes")
|
|
.then(lst => lst.filter(s => rx.test(s)).map(s => "/Volumes/" + s + "/"))
|
|
} else if (process.platform == "linux") {
|
|
const rx = new RegExp(pxt.appTarget.compile.deployDrives)
|
|
const user = process.env["USER"]
|
|
return readDirAsync(`/media/${user}`)
|
|
.then(lst => lst.filter(s => rx.test(s)).map(s => `/media/${user}/${s}/`))
|
|
} else {
|
|
return Promise.resolve([])
|
|
}
|
|
}
|