use fs;
use getopt;
use log;
use os;
use os::exec;
use path;
use strings;
use temp;
const GARMIN_APPS = "/GARMIN/APPS/";
export fn main() void = {
const cmd = getopt::parse(os::args,
"garmin watch face installer",
('s', "skip MTP mount (testing)"),
"file",
);
defer getopt::finish(&cmd);
let skip_mount = false;
for (let opt .. cmd.opts) {
switch (opt.0) {
case 's' =>
skip_mount = true;
case => abort();
};
};
let file = "";
if (len(cmd.args) < 1) {
log::fatal("provide a file");
} else {
file = os::resolve(cmd.args[0]);
if (!os::exists(file)) {
log::fatal("provided file doesn't exist");
};
let parts = strings::split(file, ".")!;
defer free(parts);
if (parts[len(parts) - 1] != "prg") {
log::fatal("file does not seem to be a .prg file");
};
};
const temp_dir = temp::dir();
defer os::rmdirall(temp_dir)!;
log::printfln("created temporary directory: {}", temp_dir);
if (skip_mount) {
os::mkdirs(strings::concat(temp_dir, GARMIN_APPS)!, fs::mode::USER_RWX)!;
} else {
mount_mtp(temp_dir);
};
const apps_dir = strings::concat(temp_dir, GARMIN_APPS)!;
if (!os::exists(apps_dir)) {
log::fatal("/GARMIN/APPS doesn't exist in mount");
};
const file_dest = strings::concat(apps_dir, "face.prg")!;
log::printfln("moving {} to {}", file, file_dest);
os::move(file, file_dest)!;
// Remember to unmount the MTP fs.
if (!skip_mount) {
umount_mtp(temp_dir);
};
log::println("your new watch face should now show up");
};
fn mount_mtp(temp_dir: str) void = {
log::println("mounting MTP");
let cmd = exec::cmd("simple-mtpfs", temp_dir)!;
let proc = exec::start(&cmd)!;
let status = exec::wait(&proc)!;
if (status.status != 0) {
log::fatal("simple-mtpfs failed, most likely a permission issue");
};
};
fn umount_mtp(temp_dir: str) void = {
log::println("umounting MTP");
let cmd = exec::cmd("fusermount", "-u", temp_dir)!;
let proc = exec::start(&cmd)!;
let status = exec::wait(&proc)!;
};