Skip to content
This repository was archived by the owner on May 4, 2022. It is now read-only.

Commit c1a6aae

Browse files
committed
Initial Commit
0 parents  commit c1a6aae

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

74 files changed

+2716
-0
lines changed

.dockerignore

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
gen/node_modules
2+
import
3+

.gitignore

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
gen/node_modules/
2+
import/node_modules/
3+
out

Dockerfile

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
ARG LANGS=
2+
FROM node:8.14.0-alpine
3+
ARG LANGS
4+
RUN mkdir -p out
5+
ADD gen gen
6+
RUN cd gen && npm install
7+
ADD languages languages
8+
ADD packages.txt packages.txt
9+
RUN node gen/index.js
10+
11+
FROM ubuntu:18.04
12+
13+
COPY --from=0 /out/phase0.sh /phase0.sh
14+
RUN /bin/bash phase0.sh
15+
16+
COPY --from=0 /out/phase1.sh /phase1.sh
17+
RUN /bin/bash phase1.sh
18+
19+
COPY --from=0 /out/phase2.sh /phase2.sh
20+
RUN /bin/bash phase2.sh
21+
22+
23+
COPY --from=0 /out/run-project /usr/bin/run-project
24+
COPY --from=0 /out/run-language-server /usr/bin/run-language-server
25+
COPY --from=0 /out/detect-language /usr/bin/detect-language
26+
COPY --from=0 /out/self-test /usr/bin/polygott-self-test
27+
COPY --from=0 /out/polygott-survey /usr/bin/polygott-survey
28+
COPY --from=0 /out/polygott-lang-setup /usr/bin/polygott-lang-setup
29+
COPY --from=0 /out/polygott-x11-vnc /usr/bin/polygott-x11-vnc
30+
31+
ENV LC_ALL=en_US.UTF-8
32+
ENV LANG=en_US.UTF-8
33+
34+
WORKDIR /home/runner
35+

Makefile

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
.PHONY: DUMMY image languages deploy
2+
3+
DUMMY: image
4+
5+
languages: import/index.js
6+
node ./import/index.js
7+
8+
9+
image: Dockerfile languages/*.toml ## Make polygott image
10+
docker build -t polygott:latest .
11+
12+
deploy: image ## Send the image to GCS (repl.it use)
13+
docker tag polygott:latest gcr.io/marine-cycle-160323/polygott-base:latest
14+
docker push gcr.io/marine-cycle-160323/polygott-base:latest
15+
16+
test-%: ## Build and test only the langauge <arg>
17+
docker build -t polygott-$(*) --build-arg LANGS=$(*) .
18+
docker run polygott-$(*) bash -c polygott-self-test
19+
20+
test: image ## Build and test all langauges
21+
docker run polygott:latest bash -c polygott-self-test
22+
23+
help: ## show this message
24+
@echo "available targets:"
25+
@fgrep -h "##" $(MAKEFILE_LIST) | \
26+
fgrep -v fgrep | \
27+
sed 's/:.\+#. /|/g' | \
28+
sed 's/%/<arg>/g' | \
29+
column -s '|' -t

enter.sh

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
#!/bin/bash
2+
3+
docker run -it polygott

gen/detect-language.ejs

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
#!/bin/bash
2+
3+
<% for ( let lang of lbypop ) { -%>
4+
<% if ( lang.entrypoint ) { -%>
5+
if [ -f <%= lang.entrypoint %> ]; then echo '<%= lang.id %>'; exit 0; fi
6+
<% } -%>
7+
<% } -%>
8+
9+
<% for ( let lang of lbypop ) { -%>
10+
<% if ( lang.extensions ) { -%>
11+
<% for ( let ex of lang.extensions ) { -%>
12+
if [ -n "$(find . -name '<%= ex %>')" ]; then echo '<%= lang.id %>'; exit 0; fi
13+
<% } -%>
14+
<% } -%>
15+
<% } -%>

gen/index.js

+160
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
const fs = require("fs");
2+
const path = require("path");
3+
const glob = require("glob");
4+
const toml = require("toml");
5+
const ejs = require("ejs");
6+
const tv4 = require("tv4");
7+
8+
const base = path.join(__dirname, "..");
9+
const dest = path.join(base, "out");
10+
const schema = require("./schema.json");
11+
12+
13+
const btoa = b => Buffer.from(b).toString("base64");
14+
15+
let packages = fs
16+
.readFileSync(path.join(base, "packages.txt"), "utf8")
17+
.split(/\r?\n/)
18+
.filter(x => !/^#|^\s*$/.test(x));
19+
20+
let basePackages = [].concat(packages);
21+
22+
console.log(basePackages);
23+
24+
let aptKeys = [];
25+
let aptRepos = [];
26+
27+
let list = glob.sync(path.join(base, "languages", "*.toml"));
28+
let languages = [];
29+
list.sort();
30+
31+
let dc = [];
32+
function undup(line) {
33+
if (dc.indexOf(line) == -1) {
34+
dc.push(line);
35+
return line;
36+
} else {
37+
return "#" + line;
38+
}
39+
}
40+
41+
for (let file of list) {
42+
let info = toml.parse(fs.readFileSync(file, "utf8"));
43+
44+
let result = tv4.validateMultiple(info, schema);
45+
if ( !result.valid ) {
46+
console.log(`Warning: ${file} schema invalid.`);
47+
for ( let error of result.errors ) {
48+
console.log(`-> ${error.message} @ ${error.dataPath}`)
49+
}
50+
}
51+
52+
let name = info.name;
53+
info.id = path.basename(file).replace(/.toml$/,'');
54+
let names = [name, info.id];
55+
if ( info.aliases ) {
56+
names = names.concat(info.aliases)
57+
};
58+
info.names = [...new Set(names)];
59+
if (process.env.LANGS) {
60+
let set = process.env.LANGS.split(/[ ,]+/);
61+
if (set.indexOf(info.id) == -1) continue;
62+
}
63+
64+
info.popularity = info.popularity || 2;
65+
66+
if (!info.versionCommand) {
67+
let flag = "--version";
68+
if (["lua"].indexOf(info.name) !== -1) {
69+
flag = "-v";
70+
}
71+
72+
if (["go"].indexOf(info.name) !== -1) {
73+
flag = "version";
74+
}
75+
76+
if (["java"].indexOf(info.name) !== -1) {
77+
flag = "-version";
78+
}
79+
80+
if (info.compile) {
81+
info.versionCommand = [info.compile.command[0], flag];
82+
} else if (info.run) {
83+
info.versionCommand = [info.run.command[0], flag];
84+
} else {
85+
info.versionCommand = ["/bin/false"];
86+
}
87+
}
88+
89+
if ("tests" in info) {
90+
} else {
91+
console.log(`Warning ${name} has no tests.`);
92+
info.tests = {};
93+
}
94+
95+
if (info.aptKeys) {
96+
for (let p of info.aptKeys) {
97+
if (aptKeys.indexOf(p) == -1) aptKeys.push(p);
98+
}
99+
}
100+
101+
if (info.aptRepos) {
102+
for (let p of info.aptRepos) {
103+
if (aptRepos.indexOf(p) == -1) aptRepos.push(p);
104+
}
105+
}
106+
107+
if (info.packages) {
108+
for (let p of info.packages) {
109+
if (packages.indexOf(p) == -1) packages.push(p);
110+
}
111+
}
112+
languages.push(info);
113+
}
114+
115+
let lbypop = JSON.parse(JSON.stringify(languages));
116+
lbypop.sort((a, b) => b.popularity - a.popularity);
117+
118+
let lpad = (s, n) => s + new Array(n - s.length).fill(" ").join("");
119+
120+
let ctx = {
121+
basePackages,
122+
languages,
123+
btoa,
124+
lbypop,
125+
packages,
126+
aptRepos,
127+
aptKeys,
128+
undup,
129+
lpad,
130+
c: a => a.map((s) => {
131+
if ( /^[a-zA-Z0-9-]*$/.test(s) ) return s;
132+
return `'${s.replace(/[$'\\]/g,(m) => '\\' + m)}'`;
133+
}).join(" ")
134+
};
135+
136+
let objects = {
137+
"test.sh": "tests.ejs",
138+
"self-test": "inside-test.ejs",
139+
"phase0.sh": "phase0.ejs",
140+
"phase1.sh": "phase1.ejs",
141+
"phase2.sh": "phase2.ejs",
142+
"run-project": "run-project.ejs",
143+
"run-language-server": "run-language-server.ejs",
144+
"detect-language": "detect-language.ejs",
145+
"polygott-survey": "versions.ejs",
146+
"polygott-lang-setup": "lang-setup.ejs",
147+
"polygott-x11-vnc": "x11-vnc.ejs",
148+
};
149+
150+
for (let target in objects) {
151+
let tp = path.join(dest, target);
152+
fs.writeFileSync(
153+
tp,
154+
ejs.compile(fs.readFileSync(path.join(__dirname, objects[target]), "utf8"))(
155+
ctx
156+
),
157+
"utf8"
158+
);
159+
fs.chmodSync(path.join(dest, target), 0o755);
160+
}

gen/inside-test.ejs

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#!/bin/bash
2+
3+
CODE=0
4+
5+
<% for ( let lang of languages ) { -%>
6+
# <%= lang.name %>
7+
<% for ( let tname in lang.tests ) { -%>
8+
<% let test = lang.tests[tname]; -%>
9+
<% if ( test.input ) continue %>
10+
<% if ( test.skip ) { %>
11+
echo S <%= lang.name %>:<%= tname %>
12+
<% } else { %>
13+
echo "<%= btoa(test.code) %>" | base64 --decode | run-project -s -l <%= lang.id %> | diff -u --label "<%= lang.name %>" <( echo "<%= btoa(test.output) %>" | base64 --decode ) - && echo<%= lang.name %>:<%= tname %> || CODE=1
14+
<% } %>
15+
<% } %>
16+
<% } -%>
17+
18+
exit $CODE

gen/lang-setup.ejs

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
#!/bin/bash
2+
3+
shopt -s dotglob
4+
5+
LANGUAGE=`detect-language`
6+
7+
while getopts ":sl:" opt; do
8+
case ${opt} in
9+
l )
10+
LANGUAGE=$OPTARG
11+
;;
12+
\? )
13+
echo "Usage: run-project [-s] [-l language]"
14+
exit 1
15+
;;
16+
esac
17+
done
18+
19+
case "$LANGUAGE" in
20+
<% for ( let lang of languages ) { -%>
21+
<%- lang.names.map(x => `"${x}"`).join('|') %>)
22+
cp -a /opt/homes/<%= lang.name %>/* /home/runner/
23+
<% if ( lang.runtimeSetup ) { -%>
24+
<% for ( let line of lang.runtimeSetup ) { -%>
25+
<%- line %>
26+
<% } -%>
27+
<% } -%>
28+
;;
29+
<% } -%>
30+
*)
31+
echo "Unknown Language: $LANGUAGE"
32+
;;
33+
esac

0 commit comments

Comments
 (0)