]> git.wincent.com - wincent.git/blob - src/Fig/operations/template.ts
refactor: make launchd aspect partly functional
[wincent.git] / src / Fig / operations / template.ts
1 import * as fs from 'fs';
2
3 import {log} from '../../console';
4 import expand from '../../expand';
5 import {compile, fill} from '../../template';
6 import Context from '../Context';
7
8 export default async function template({
9   group,
10   mode,
11   owner,
12   path,
13   src,
14   variables = {},
15 }: {
16   group?: string;
17   path: string;
18   mode?: string;
19   owner?: string;
20   src: string;
21   variables: Variables;
22 }): Promise<void> {
23   const target = expand(path);
24   log.info(`template ${src} -> ${target}`);
25
26   const filled = (await Context.compile(src)).fill({variables});
27
28   if (owner && owner !== Context.attributes.username) {
29     log.notice(`needs sudo: ${Context.attributes.username} -> ${owner}`);
30     const passphrase = await Context.sudoPassphrase;
31     // obviously not going to log this in real life:
32     log.debug(`got: ${passphrase}`);
33     // chown in node works with numeric uid and gid
34   } else {
35     // open, write, mode
36     // can't chown, i think? without uid and gid
37
38     // TODO extract this somewhere else
39     // need low-level filesystem ops that are consumed by the high-level
40     // user-accessible ops
41     let contents;
42
43     if (fs.existsSync(target)) {
44       contents = fs.readFileSync(target, 'utf8');
45
46       if (contents !== filled) {
47         log.info('change!');
48       } else {
49         log.info('no change');
50       }
51     }
52   }
53 }