]> git.wincent.com - wincent.git/blob - src/Fig/operations/template.ts
refactor(fig): remove unused import
[wincent.git] / src / Fig / operations / template.ts
1 import ErrorWithMetadata from '../../ErrorWithMetadata';
2 import chown from '../../chown';
3 import {log} from '../../console';
4 import expand from '../../expand';
5 import tempfile from '../../tempfile';
6 import {compile, fill} from '../../template';
7 import Context from '../Context';
8 import compare from '../compare';
9
10 export default async function template({
11     force,
12     group,
13     mode,
14     owner,
15     path,
16     src,
17     variables = {},
18 }: {
19     force?: boolean;
20     group?: string;
21     path: string;
22     mode?: Mode;
23     owner?: string;
24     src: string;
25     variables: Variables;
26 }): Promise<void> {
27     const target = expand(path);
28
29     const contents = (await Context.compile(src)).fill({variables});
30
31     const diff = await compare({
32         contents,
33         force,
34         group,
35         mode,
36         owner,
37         path: target,
38         state: 'file',
39     });
40
41     if (diff.state === 'file') {
42         // TODO: file does not exist — have to create it
43     } else if (diff.owner || diff.group) {
44         const result = await chown(target, {group, owner, sudo: true});
45
46         if (result instanceof Error) {
47             throw new ErrorWithMetadata(`Failed command`, {
48                 error: result.toString(),
49                 group: group ?? null,
50                 owner: owner ?? null,
51                 target,
52             });
53         }
54     } else {
55         if (diff.contents) {
56             // log.info('change!');
57             const temp = await tempfile(contents);
58
59             // TODO: cp from temp to target
60             // TODO: deal with group/owner/mode etc
61         } else {
62             Context.informOk(`template ${path}`);
63         }
64     }
65 }