/
fl7m
100 lines (82 loc) · 2.74 KB
/
fl7m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#!/usr/bin/env bash
"$(dirname "$0")"/fl7 '
@STRICT;
usage : message -> (
message && (message => ERR);
"USAGE: $(ARGV.0) pull <url_module>" => ERR;
EXIT(1);
);
log : message -> OUT("[$(DATE())] $message");
$#ARGV <= 1 && usage(NULL);
command : ARGV.1;
(command === "pull") ? (
$#ARGV <= 2 && usage(NULL);
url_module : ARGV.2;
"Module URL: $url_module" => log;
# モジュールハンドラ
moduleHandler : (
a : url_module =~ /^((?:http|https):\/\/[^\/]+|file:\/\/)(\/.*)$/;
a ? (
# モジュールはURL
create_pathHandler : path -> {
get : () -> (
"Fetching: $path" => log;
HTTP(path)
);
download : dest -> (
"Downloading: $path -> $dest" => log;
WRITE(dest; HTTP(path))
);
};
{
index : () -> create_pathHandler(a.1 & RESOLVE(a.2) | "?" @ _ ? _ : "$_?");
resolve : path -> create_pathHandler(a.1 & RESOLVE(a.2, "..", path) | "?" @ _ ? _ : "$_?");
}
) : (
# モジュールはローカルファイル
create_pathHandler : path -> {
get : () -> (
"Reading: $path" => log;
READ(path)
);
download : dest -> (
"Copying: $path -> $dest" => log;
EXEC("cp"; path, dest)
);
};
{
index : () -> create_pathHandler(RESOLVE(url_module));
resolve : path -> create_pathHandler(RESOLVE(url_module, "..", path));
}
)
);
# モジュールJSONデータ取得
data_module : $*moduleHandler.index().get();
# モジュール名
"Module Name: $(data_module.name)" => log;
# モジュール格納先
dir_module : "fl7_modules/_$(&data_module.name | *URI | REPLACE(_; /[^a-zA-Z0-9_%]/g; \"%$%02s(UC(BASE(CHARCODE(_); 16)))"))";
"Module Dir: $(dir_module)" => log;
# モジュール格納先初期化
STAT(dir_module) && EXEC("rm"; "-rf", dir_module);
EXEC("mkdir"; "-p", dir_module);
# モジュール構成ファイルダウンロード
file : data_module.files[] | (
# ファイル名チェック
(
# 先頭が/、末尾が/、/が連続であってはならない
file =~ /^\/|\/$|\/\// && ERROR("Illegal file name: $file");
# 節に.や..があってはならない
+([SPLIT(file; "/")] | "." @ _ || ".." @ _) && ERROR("Illegal file name: $file");
);
# 出力先
dest : RESOLVE(dir_module, file);
# ダウンロード
EXEC("mkdir"; "-p", RESOLVE(dest, ".."));
moduleHandler.resolve(file).download(dest);
);
"Successfully Installed" => log;
) : (
usage("Unknown command: $command");
);
' "$@"