Compare commits
275 Commits
2413923b3f
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b3929f22f3 | ||
|
|
bad12160ac | ||
|
|
c43679fda9 | ||
|
|
9cc28f6f0d | ||
|
|
d2256b8333 | ||
|
|
fa8753077a | ||
|
|
0420f58d02 | ||
|
|
0250aa106e | ||
|
|
ca1c456571 | ||
|
|
4403980e2e | ||
|
|
dbfbce955d | ||
|
|
2e08d2e59a | ||
|
|
9f14534c10 | ||
|
|
4e34ebc29e | ||
|
|
8d85d5ef79 | ||
|
|
7d73a3c948 | ||
|
|
c501f7cedc | ||
|
|
41927764fc | ||
|
|
75a763569b | ||
|
|
c67eb32774 | ||
|
|
04952895cf | ||
|
|
749f6d7a55 | ||
|
|
c4cf814f8d | ||
|
|
3245e830d2 | ||
|
|
57eb1b81ec | ||
|
|
c601c8697a | ||
|
|
4ea1a46705 | ||
|
|
4cc04bda46 | ||
|
|
7e934cd360 | ||
|
|
e34e2ef75f | ||
|
|
c067ca9cc8 | ||
|
|
b06424cb17 | ||
|
|
ae6f18d19c | ||
|
|
c371b999d5 | ||
|
|
073ac0ac25 | ||
|
|
1c356737c1 | ||
|
|
339bd433f6 | ||
|
|
bb5fa6a487 | ||
|
|
71b6db14d5 | ||
|
|
69fb91db37 | ||
|
|
5fd93fc648 | ||
|
|
033a17e355 | ||
|
|
824f34bd4c | ||
|
|
d93e91c625 | ||
|
|
db21bd8a55 | ||
|
|
69729bd329 | ||
|
|
ddea8fdceb | ||
|
|
71f639e503 | ||
|
|
8714d3b650 | ||
|
|
88064409a6 | ||
|
|
7c17087920 | ||
|
|
c1837addd0 | ||
|
|
79c36476bd | ||
|
|
4a0cbf3ba5 | ||
|
|
59ee13345e | ||
|
|
bf7f37260c | ||
|
|
ff478253c3 | ||
|
|
3e952ef0f4 | ||
|
|
4e0f66401d | ||
|
|
3867f965d2 | ||
|
|
5cac44c625 | ||
|
|
463be34302 | ||
|
|
8fd37cbf22 | ||
|
|
4fb67c18ae | ||
|
|
eb18185131 | ||
|
|
7c92b602bc | ||
|
|
aeca958cef | ||
|
|
495a3c0b4e | ||
|
|
9402c453da | ||
|
|
328b2ba520 | ||
|
|
4a76f61aa7 | ||
|
|
2c9396615e | ||
|
|
e7b6dc9059 | ||
|
|
bcdf441d77 | ||
|
|
884a28e63a | ||
|
|
1c3e2ca4d9 | ||
|
|
2081d25066 | ||
|
|
7ddc4011b3 | ||
|
|
379850fe3d | ||
|
|
8ab69e480e | ||
|
|
c5621212bc | ||
|
|
b9f74b7eca | ||
|
|
493adb4688 | ||
|
|
b6cc7a70b7 | ||
|
|
8868cfb63f | ||
|
|
ae3add9c81 | ||
|
|
98fa43575d | ||
|
|
5d3a6c4174 | ||
|
|
be467c8074 | ||
|
|
0da375c529 | ||
|
|
1b740b1f2f | ||
|
|
d94ecefab9 | ||
|
|
7501a018fd | ||
|
|
ce31397372 | ||
|
|
7e1e070e23 | ||
|
|
fa16a7dd39 | ||
|
|
59a91331cc | ||
|
|
d2ea6b6a0f | ||
|
|
fdff5a667b | ||
|
|
35cf675c87 | ||
|
|
3b63bbdfde | ||
|
|
24218f2979 | ||
|
|
6a086d57de | ||
|
|
93e0a2fe98 | ||
|
|
86d4e25aa0 | ||
|
|
cb5d131097 | ||
|
|
eb67327574 | ||
|
|
5228851c0e | ||
|
|
4fc08f4375 | ||
|
|
8905c9356b | ||
|
|
424a970014 | ||
|
|
138d694b27 | ||
|
|
397d4ea0bc | ||
|
|
818fca87f2 | ||
|
|
df339f20fa | ||
|
|
d5572c93cd | ||
|
|
322dbb8f4f | ||
|
|
904f834c86 | ||
|
|
48af194da0 | ||
|
|
bcb6b2d75f | ||
|
|
134444b2c3 | ||
|
|
4447f1ed4a | ||
|
|
457ff9e759 | ||
|
|
6f244a0a5f | ||
|
|
cb5838345e | ||
|
|
1107a653cf | ||
|
|
95d4ee7080 | ||
|
|
fa2dd96f78 | ||
|
|
7741e192f5 | ||
|
|
5dfd46852f | ||
|
|
88e10010d8 | ||
|
|
52c564d4fd | ||
|
|
f7874c1843 | ||
|
|
40120667f7 | ||
|
|
b06798f23f | ||
|
|
35dff5cdaf | ||
|
|
d641c8d638 | ||
|
|
7e2fd70212 | ||
|
|
4fb08bc7d0 | ||
|
|
01b55b7256 | ||
|
|
bd68681e44 | ||
|
|
27ff13e675 | ||
|
|
2914e42ba1 | ||
|
|
a8969f141d | ||
|
|
6f049e00d4 | ||
|
|
45a1076d18 | ||
|
|
775c88d67a | ||
|
|
efbf6cfc0c | ||
|
|
5af4a372ae | ||
|
|
72952adb6b | ||
|
|
8b85c02ef1 | ||
|
|
2ae4839ce0 | ||
|
|
5654c40d03 | ||
|
|
b538750287 | ||
|
|
65ed754bfe | ||
|
|
80cdf5166b | ||
|
|
3968121d54 | ||
|
|
a29b625631 | ||
|
|
e193fcc2ba | ||
|
|
050b426f6f | ||
|
|
da81f93e4a | ||
|
|
1581e5c401 | ||
|
|
2e1c979127 | ||
|
|
d4b290ebe6 | ||
|
|
4bb1f9983a | ||
|
|
261fe8a1a2 | ||
|
|
add267d616 | ||
|
|
cb3278aba5 | ||
|
|
94d9a95967 | ||
|
|
6511115b95 | ||
|
|
53cd55932b | ||
|
|
cbe2010407 | ||
|
|
2ba4a5e3d7 | ||
|
|
c3482cf1e4 | ||
|
|
fdf84e3d0b | ||
|
|
0a4376dfb8 | ||
|
|
e8ed4a4f4a | ||
|
|
60555999db | ||
|
|
6968a5b02c | ||
|
|
c84cfdc02b | ||
|
|
c98489cacb | ||
|
|
35dbab0ceb | ||
|
|
1ff41940a5 | ||
|
|
884215a7e1 | ||
|
|
20c55f0708 | ||
|
|
9e3d72972c | ||
|
|
806c45a453 | ||
|
|
270c42a509 | ||
|
|
e8963e107b | ||
|
|
0b64551a23 | ||
|
|
b654ca4859 | ||
|
|
386af57ce6 | ||
|
|
ef4d315bf2 | ||
|
|
2142b01967 | ||
|
|
159d8fb72a | ||
|
|
0fae417610 | ||
|
|
ae933b491e | ||
|
|
5e476e189a | ||
|
|
533997dbf5 | ||
|
|
8695cf17c5 | ||
|
|
e2f9938437 | ||
|
|
ada11816fb | ||
|
|
ff57242434 | ||
|
|
0da37b25e3 | ||
|
|
ff03140007 | ||
|
|
0ae492f8d3 | ||
|
|
613d49c6ec | ||
|
|
0f7e5eea25 | ||
|
|
2e7cfd5637 | ||
|
|
afe62de2b6 | ||
|
|
1f3b5262b8 | ||
|
|
f63620b547 | ||
|
|
671159cb82 | ||
|
|
f1e985fb32 | ||
|
|
a966be8122 | ||
|
|
24b9782146 | ||
|
|
3d44d20384 | ||
|
|
f98a09bc59 | ||
|
|
ba511b7f9e | ||
|
|
3720558d93 | ||
|
|
b66ec507ef | ||
|
|
645ae26701 | ||
|
|
6109902945 | ||
|
|
cd27869122 | ||
|
|
795945f0da | ||
|
|
cb7c28c1ae | ||
|
|
52ca300de3 | ||
|
|
06dcd22e69 | ||
|
|
f87c453459 | ||
|
|
e42edb3f49 | ||
|
|
6d83828012 | ||
|
|
eaea37f448 | ||
|
|
fb99fd2b39 | ||
|
|
313313ae53 | ||
|
|
d9a3b13780 | ||
|
|
8d9a50226a | ||
|
|
f164838953 | ||
|
|
fe3f2642fe | ||
|
|
3d89492518 | ||
|
|
793789bdf2 | ||
|
|
dbea9318e9 | ||
|
|
4adaeb0341 | ||
|
|
bfc9e3ed80 | ||
|
|
62ffc76376 | ||
|
|
5bbb12327b | ||
|
|
f6c475c80c | ||
|
|
4c3bea06d1 | ||
|
|
0e9d74b2c8 | ||
|
|
6bf1480366 | ||
|
|
c279bad13a | ||
|
|
bd982fb62d | ||
|
|
53a531f568 | ||
|
|
67b60087af | ||
|
|
8a3b85d5fa | ||
|
|
b0ac14ee58 | ||
|
|
23713a934c | ||
|
|
860b601f62 | ||
|
|
354d24cf69 | ||
|
|
5891ac7fb7 | ||
|
|
f9377d7609 | ||
|
|
4a6948cde7 | ||
|
|
5b34942b64 | ||
|
|
7b01230234 | ||
|
|
c6cf5f75ac | ||
|
|
e3b5f7f74f | ||
|
|
1ac39c2a6f | ||
|
|
744d3e50fb | ||
|
|
4c59011389 | ||
|
|
ba2756c762 | ||
|
|
31a3efe417 | ||
|
|
2b7a19a1d4 | ||
|
|
3b472a9e96 | ||
|
|
77f8375d7a | ||
|
|
3cfcae25a9 | ||
|
|
448e9bb8c6 |
3
.dockerignore
Normal file
3
.dockerignore
Normal file
@@ -0,0 +1,3 @@
|
||||
**/.git
|
||||
target/
|
||||
org_test_documents/
|
||||
224
.webhook_bridge/pipeline-build-hash.yaml
Normal file
224
.webhook_bridge/pipeline-build-hash.yaml
Normal file
@@ -0,0 +1,224 @@
|
||||
apiVersion: tekton.dev/v1
|
||||
kind: PipelineRun
|
||||
metadata:
|
||||
name: build
|
||||
spec:
|
||||
timeouts:
|
||||
pipeline: "2h0m0s"
|
||||
tasks: "1h0m0s"
|
||||
finally: "0h30m0s"
|
||||
taskRunTemplate:
|
||||
serviceAccountName: build-bot
|
||||
pipelineSpec:
|
||||
params:
|
||||
- name: image-name
|
||||
description: The name for the built image
|
||||
type: string
|
||||
- name: target-name
|
||||
description: The dockerfile target to build
|
||||
type: string
|
||||
- name: path-to-image-context
|
||||
description: The path to the build context
|
||||
type: string
|
||||
- name: path-to-dockerfile
|
||||
description: The path to the Dockerfile
|
||||
type: string
|
||||
tasks:
|
||||
- name: report-pending
|
||||
taskRef:
|
||||
resolver: git
|
||||
params:
|
||||
- name: url
|
||||
value: https://code.fizz.buzz/mirror/catalog.git # mirror of https://github.com/tektoncd/catalog.git
|
||||
- name: revision
|
||||
value: df36b3853a5657fd883015cdbf07ad6466918acf
|
||||
- name: pathInRepo
|
||||
value: task/gitea-set-status/0.1/gitea-set-status.yaml
|
||||
params:
|
||||
- name: CONTEXT
|
||||
value: "$(params.JOB_NAME)"
|
||||
- name: REPO_FULL_NAME
|
||||
value: "$(params.REPO_OWNER)/$(params.REPO_NAME)"
|
||||
- name: GITEA_HOST_URL
|
||||
value: code.fizz.buzz
|
||||
- name: SHA
|
||||
value: "$(tasks.fetch-repository.results.commit)"
|
||||
- name: DESCRIPTION
|
||||
value: "Build $(params.JOB_NAME) has started"
|
||||
- name: STATE
|
||||
value: pending
|
||||
- name: TARGET_URL
|
||||
value: "https://tekton.fizz.buzz/#/namespaces/$(context.pipelineRun.namespace)/pipelineruns/$(context.pipelineRun.name)"
|
||||
- name: fetch-repository
|
||||
taskRef:
|
||||
resolver: git
|
||||
params:
|
||||
- name: url
|
||||
value: https://code.fizz.buzz/mirror/catalog.git # mirror of https://github.com/tektoncd/catalog.git
|
||||
- name: revision
|
||||
value: df36b3853a5657fd883015cdbf07ad6466918acf
|
||||
- name: pathInRepo
|
||||
value: task/git-clone/0.9/git-clone.yaml
|
||||
workspaces:
|
||||
- name: output
|
||||
workspace: git-source
|
||||
params:
|
||||
- name: url
|
||||
value: $(params.REPO_URL)
|
||||
- name: revision
|
||||
value: $(params.PULL_BASE_SHA)
|
||||
- name: deleteExisting
|
||||
value: "true"
|
||||
- name: get-git-commit-time
|
||||
taskSpec:
|
||||
metadata: {}
|
||||
stepTemplate:
|
||||
image: alpine:3.20
|
||||
computeResources:
|
||||
requests:
|
||||
cpu: 10m
|
||||
memory: 600Mi
|
||||
workingDir: "$(workspaces.repo.path)"
|
||||
results:
|
||||
- name: unix-time
|
||||
description: The time of the git commit in unix timestamp format.
|
||||
steps:
|
||||
- image: alpine/git:v2.34.2
|
||||
name: detect-tag-step
|
||||
script: |
|
||||
#!/usr/bin/env sh
|
||||
set -euo pipefail
|
||||
echo -n "$(git log -1 --pretty=%ct)" | tee $(results.unix-time.path)
|
||||
workspaces:
|
||||
- name: repo
|
||||
workspace: git-source
|
||||
runAfter:
|
||||
- fetch-repository
|
||||
- name: build-image
|
||||
taskRef:
|
||||
resolver: git
|
||||
params:
|
||||
- name: url
|
||||
value: https://code.fizz.buzz/talexander/personal_tekton_catalog.git
|
||||
- name: revision
|
||||
value: 7ee31a185243ee6da13dcd26a592c585b64c80e5
|
||||
- name: pathInRepo
|
||||
value: task/buildkit-rootless-daemonless/0.1/buildkit-rootless-daemonless.yaml
|
||||
params:
|
||||
- name: OUTPUT
|
||||
value: >-
|
||||
type=image,"name=$(params.image-name):latest,$(params.image-name):$(tasks.fetch-repository.results.commit)",push=true,compression=zstd,compression-level=22,oci-mediatypes=true
|
||||
- name: CONTEXT
|
||||
value: $(params.path-to-image-context)
|
||||
- name: DOCKERFILE
|
||||
value: $(params.path-to-dockerfile)
|
||||
- name: EXTRA_ARGS
|
||||
value:
|
||||
- "--opt"
|
||||
- "target=$(params.target-name)"
|
||||
- --import-cache
|
||||
- "type=registry,ref=$(params.image-name):buildcache"
|
||||
- --export-cache
|
||||
- "type=registry,ref=$(params.image-name):buildcache,mode=max,compression=zstd,compression-level=22,rewrite-timestamp=true,image-manifest=true,oci-mediatypes=true"
|
||||
- --opt
|
||||
- build-arg:SOURCE_DATE_EPOCH=$(tasks.get-git-commit-time.results.unix-time)
|
||||
- name: BUILDKITD_TOML
|
||||
value: |
|
||||
debug = true
|
||||
[registry."docker.io"]
|
||||
mirrors = ["dockerhub.dockerhub.svc.cluster.local"]
|
||||
[registry."dockerhub.dockerhub.svc.cluster.local"]
|
||||
http = true
|
||||
insecure = true
|
||||
workspaces:
|
||||
- name: source
|
||||
workspace: git-source
|
||||
- name: dockerconfig
|
||||
workspace: docker-credentials
|
||||
runAfter:
|
||||
- fetch-repository
|
||||
finally:
|
||||
- name: report-success
|
||||
when:
|
||||
- input: "$(tasks.status)"
|
||||
operator: in
|
||||
values: ["Succeeded", "Completed"]
|
||||
taskRef:
|
||||
resolver: git
|
||||
params:
|
||||
- name: url
|
||||
value: https://code.fizz.buzz/mirror/catalog.git # mirror of https://github.com/tektoncd/catalog.git
|
||||
- name: revision
|
||||
value: df36b3853a5657fd883015cdbf07ad6466918acf
|
||||
- name: pathInRepo
|
||||
value: task/gitea-set-status/0.1/gitea-set-status.yaml
|
||||
params:
|
||||
- name: CONTEXT
|
||||
value: "$(params.JOB_NAME)"
|
||||
- name: REPO_FULL_NAME
|
||||
value: "$(params.REPO_OWNER)/$(params.REPO_NAME)"
|
||||
- name: GITEA_HOST_URL
|
||||
value: code.fizz.buzz
|
||||
- name: SHA
|
||||
value: "$(tasks.fetch-repository.results.commit)"
|
||||
- name: DESCRIPTION
|
||||
value: "Build $(params.JOB_NAME) has succeeded"
|
||||
- name: STATE
|
||||
value: success
|
||||
- name: TARGET_URL
|
||||
value: "https://tekton.fizz.buzz/#/namespaces/$(context.pipelineRun.namespace)/pipelineruns/$(context.pipelineRun.name)"
|
||||
- name: report-failure
|
||||
when:
|
||||
- input: "$(tasks.status)"
|
||||
operator: in
|
||||
values: ["Failed"]
|
||||
taskRef:
|
||||
resolver: git
|
||||
params:
|
||||
- name: url
|
||||
value: https://code.fizz.buzz/mirror/catalog.git # mirror of https://github.com/tektoncd/catalog.git
|
||||
- name: revision
|
||||
value: df36b3853a5657fd883015cdbf07ad6466918acf
|
||||
- name: pathInRepo
|
||||
value: task/gitea-set-status/0.1/gitea-set-status.yaml
|
||||
params:
|
||||
- name: CONTEXT
|
||||
value: "$(params.JOB_NAME)"
|
||||
- name: REPO_FULL_NAME
|
||||
value: "$(params.REPO_OWNER)/$(params.REPO_NAME)"
|
||||
- name: GITEA_HOST_URL
|
||||
value: code.fizz.buzz
|
||||
- name: SHA
|
||||
value: "$(tasks.fetch-repository.results.commit)"
|
||||
- name: DESCRIPTION
|
||||
value: "Build $(params.JOB_NAME) has failed"
|
||||
- name: STATE
|
||||
value: failure
|
||||
- name: TARGET_URL
|
||||
value: "https://tekton.fizz.buzz/#/namespaces/$(context.pipelineRun.namespace)/pipelineruns/$(context.pipelineRun.name)"
|
||||
workspaces:
|
||||
- name: git-source
|
||||
- name: docker-credentials
|
||||
workspaces:
|
||||
- name: git-source
|
||||
volumeClaimTemplate:
|
||||
spec:
|
||||
storageClassName: "local-path"
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
resources:
|
||||
requests:
|
||||
storage: 10Gi
|
||||
subPath: rust-source
|
||||
- name: docker-credentials
|
||||
secret:
|
||||
secretName: harbor-plain
|
||||
params:
|
||||
- name: image-name
|
||||
value: "harbor.fizz.buzz/private/natter"
|
||||
- name: target-name
|
||||
value: ""
|
||||
- name: path-to-image-context
|
||||
value: .
|
||||
- name: path-to-dockerfile
|
||||
value: docker/natter/
|
||||
369
.webhook_bridge/pipeline-format.yaml
Normal file
369
.webhook_bridge/pipeline-format.yaml
Normal file
@@ -0,0 +1,369 @@
|
||||
apiVersion: tekton.dev/v1
|
||||
kind: PipelineRun
|
||||
metadata:
|
||||
name: rust-format
|
||||
spec:
|
||||
timeouts:
|
||||
pipeline: "2h0m0s"
|
||||
tasks: "1h0m0s"
|
||||
finally: "0h30m0s"
|
||||
taskRunTemplate:
|
||||
serviceAccountName: build-bot
|
||||
pipelineSpec:
|
||||
params:
|
||||
- name: image-name
|
||||
description: The name for the built image
|
||||
type: string
|
||||
- name: target-name
|
||||
description: The dockerfile target to build
|
||||
type: string
|
||||
- name: path-to-image-context
|
||||
description: The path to the build context
|
||||
type: string
|
||||
- name: path-to-dockerfile
|
||||
description: The path to the Dockerfile
|
||||
type: string
|
||||
tasks:
|
||||
- name: report-pending
|
||||
taskRef:
|
||||
resolver: git
|
||||
params:
|
||||
- name: url
|
||||
value: https://code.fizz.buzz/mirror/catalog.git # mirror of https://github.com/tektoncd/catalog.git
|
||||
- name: revision
|
||||
value: df36b3853a5657fd883015cdbf07ad6466918acf
|
||||
- name: pathInRepo
|
||||
value: task/gitea-set-status/0.1/gitea-set-status.yaml
|
||||
params:
|
||||
- name: CONTEXT
|
||||
value: "$(params.JOB_NAME)"
|
||||
- name: REPO_FULL_NAME
|
||||
value: "$(params.REPO_OWNER)/$(params.REPO_NAME)"
|
||||
- name: GITEA_HOST_URL
|
||||
value: code.fizz.buzz
|
||||
- name: SHA
|
||||
value: "$(tasks.fetch-repository.results.commit)"
|
||||
- name: DESCRIPTION
|
||||
value: "Build $(params.JOB_NAME) has started"
|
||||
- name: STATE
|
||||
value: pending
|
||||
- name: TARGET_URL
|
||||
value: "https://tekton.fizz.buzz/#/namespaces/$(context.pipelineRun.namespace)/pipelineruns/$(context.pipelineRun.name)"
|
||||
- name: fetch-repository
|
||||
taskRef:
|
||||
resolver: git
|
||||
params:
|
||||
- name: url
|
||||
value: https://code.fizz.buzz/mirror/catalog.git # mirror of https://github.com/tektoncd/catalog.git
|
||||
- name: revision
|
||||
value: df36b3853a5657fd883015cdbf07ad6466918acf
|
||||
- name: pathInRepo
|
||||
value: task/git-clone/0.9/git-clone.yaml
|
||||
workspaces:
|
||||
- name: output
|
||||
workspace: git-source
|
||||
params:
|
||||
- name: url
|
||||
value: $(params.REPO_URL)
|
||||
- name: revision
|
||||
value: $(params.PULL_BASE_SHA)
|
||||
- name: deleteExisting
|
||||
value: "true"
|
||||
- name: get-git-commit-time
|
||||
taskSpec:
|
||||
metadata: {}
|
||||
stepTemplate:
|
||||
image: alpine:3.20
|
||||
computeResources:
|
||||
requests:
|
||||
cpu: 10m
|
||||
memory: 600Mi
|
||||
workingDir: "$(workspaces.repo.path)"
|
||||
results:
|
||||
- name: unix-time
|
||||
description: The time of the git commit in unix timestamp format.
|
||||
steps:
|
||||
- image: alpine/git:v2.34.2
|
||||
name: detect-tag-step
|
||||
script: |
|
||||
#!/usr/bin/env sh
|
||||
set -euo pipefail
|
||||
echo -n "$(git log -1 --pretty=%ct)" | tee $(results.unix-time.path)
|
||||
workspaces:
|
||||
- name: repo
|
||||
workspace: git-source
|
||||
runAfter:
|
||||
- fetch-repository
|
||||
- name: build-image
|
||||
taskRef:
|
||||
resolver: git
|
||||
params:
|
||||
- name: url
|
||||
value: https://code.fizz.buzz/talexander/personal_tekton_catalog.git
|
||||
- name: revision
|
||||
value: 7ee31a185243ee6da13dcd26a592c585b64c80e5
|
||||
- name: pathInRepo
|
||||
value: task/buildkit-rootless-daemonless/0.1/buildkit-rootless-daemonless.yaml
|
||||
params:
|
||||
- name: OUTPUT
|
||||
value: >-
|
||||
type=image,"name=$(params.image-name):latest,$(params.image-name):$(tasks.fetch-repository.results.commit)",push=true,compression=zstd,compression-level=22,oci-mediatypes=true
|
||||
- name: CONTEXT
|
||||
value: $(params.path-to-image-context)
|
||||
- name: DOCKERFILE
|
||||
value: $(params.path-to-dockerfile)
|
||||
- name: EXTRA_ARGS
|
||||
value:
|
||||
- "--opt"
|
||||
- "target=$(params.target-name)"
|
||||
- --import-cache
|
||||
- "type=registry,ref=$(params.image-name):buildcache"
|
||||
- --export-cache
|
||||
- "type=registry,ref=$(params.image-name):buildcache,mode=max,compression=zstd,compression-level=22,rewrite-timestamp=true,image-manifest=true,oci-mediatypes=true"
|
||||
- --opt
|
||||
- build-arg:SOURCE_DATE_EPOCH=$(tasks.get-git-commit-time.results.unix-time)
|
||||
- name: BUILDKITD_TOML
|
||||
value: |
|
||||
debug = true
|
||||
[registry."docker.io"]
|
||||
mirrors = ["dockerhub.dockerhub.svc.cluster.local"]
|
||||
[registry."dockerhub.dockerhub.svc.cluster.local"]
|
||||
http = true
|
||||
insecure = true
|
||||
workspaces:
|
||||
- name: source
|
||||
workspace: git-source
|
||||
- name: dockerconfig
|
||||
workspace: docker-credentials
|
||||
runAfter:
|
||||
- fetch-repository
|
||||
- name: run-cargo-fmt
|
||||
taskSpec:
|
||||
metadata: {}
|
||||
params:
|
||||
- name: docker-image
|
||||
type: string
|
||||
description: Docker image to run.
|
||||
default: alpine:3.20
|
||||
stepTemplate:
|
||||
image: alpine:3.20
|
||||
computeResources:
|
||||
requests:
|
||||
cpu: 10m
|
||||
memory: 600Mi
|
||||
workingDir: /workspace/source
|
||||
workspaces:
|
||||
- name: source
|
||||
mountPath: /source
|
||||
- name: cargo-cache
|
||||
mountPath: /usr/local/cargo/registry
|
||||
optional: true
|
||||
steps:
|
||||
- name: run
|
||||
image: $(params.docker-image)
|
||||
workingDir: "$(workspaces.source.path)"
|
||||
command: ["cargo", "fmt"]
|
||||
args: []
|
||||
env:
|
||||
- name: CARGO_TARGET_DIR
|
||||
value: /target
|
||||
workspaces:
|
||||
- name: source
|
||||
workspace: git-source
|
||||
- name: cargo-cache
|
||||
workspace: cargo-cache
|
||||
runAfter:
|
||||
- build-image
|
||||
params:
|
||||
- name: docker-image
|
||||
value: "$(tasks.build-image.results.IMAGE_URL[1])"
|
||||
- name: run-prettier
|
||||
taskSpec:
|
||||
metadata: {}
|
||||
params:
|
||||
- name: docker-image
|
||||
type: string
|
||||
description: Docker image to run.
|
||||
default: alpine:3.20
|
||||
stepTemplate:
|
||||
image: alpine:3.20
|
||||
computeResources:
|
||||
requests:
|
||||
cpu: 10m
|
||||
memory: 600Mi
|
||||
workingDir: /workspace/source
|
||||
workspaces:
|
||||
- name: source
|
||||
mountPath: /source
|
||||
steps:
|
||||
- name: run
|
||||
image: $(params.docker-image)
|
||||
workingDir: "$(workspaces.source.path)"
|
||||
command: ["sh", "-c"]
|
||||
args:
|
||||
- |
|
||||
prettier --write --no-error-on-unmatched-pattern "default_environment/**/*.js" "default_environment/**/*.css"
|
||||
workspaces:
|
||||
- name: source
|
||||
workspace: git-source
|
||||
runAfter:
|
||||
- build-image
|
||||
params:
|
||||
- name: docker-image
|
||||
value: "$(tasks.build-image.results.IMAGE_URL[1])"
|
||||
- name: commit-changes
|
||||
taskRef:
|
||||
resolver: git
|
||||
params:
|
||||
- name: url
|
||||
value: https://code.fizz.buzz/mirror/catalog.git # mirror of https://github.com/tektoncd/catalog.git
|
||||
- name: revision
|
||||
value: df36b3853a5657fd883015cdbf07ad6466918acf
|
||||
- name: pathInRepo
|
||||
value: task/git-cli/0.4/git-cli.yaml
|
||||
params:
|
||||
- name: GIT_USER_NAME
|
||||
value: fluxcdbot
|
||||
- name: GIT_USER_EMAIL
|
||||
value: "fluxcdbot@users.noreply.github.com"
|
||||
- name: GIT_SCRIPT
|
||||
value: |
|
||||
pwd
|
||||
git config --global --add safe.directory /workspace/source
|
||||
git_status=$(git status --porcelain)
|
||||
if [ -n "$git_status" ]; then
|
||||
git commit -a -m "CI: autofix rust code."
|
||||
git push origin HEAD:$(params.PULL_BASE_REF)
|
||||
else
|
||||
echo "No changes to commit."
|
||||
fi
|
||||
workspaces:
|
||||
- name: source
|
||||
workspace: git-source
|
||||
runAfter:
|
||||
- run-cargo-fmt
|
||||
- run-prettier
|
||||
finally:
|
||||
- name: report-success
|
||||
when:
|
||||
- input: "$(tasks.status)"
|
||||
operator: in
|
||||
values: ["Succeeded", "Completed"]
|
||||
taskRef:
|
||||
resolver: git
|
||||
params:
|
||||
- name: url
|
||||
value: https://code.fizz.buzz/mirror/catalog.git # mirror of https://github.com/tektoncd/catalog.git
|
||||
- name: revision
|
||||
value: df36b3853a5657fd883015cdbf07ad6466918acf
|
||||
- name: pathInRepo
|
||||
value: task/gitea-set-status/0.1/gitea-set-status.yaml
|
||||
params:
|
||||
- name: CONTEXT
|
||||
value: "$(params.JOB_NAME)"
|
||||
- name: REPO_FULL_NAME
|
||||
value: "$(params.REPO_OWNER)/$(params.REPO_NAME)"
|
||||
- name: GITEA_HOST_URL
|
||||
value: code.fizz.buzz
|
||||
- name: SHA
|
||||
value: "$(tasks.fetch-repository.results.commit)"
|
||||
- name: DESCRIPTION
|
||||
value: "Build $(params.JOB_NAME) has succeeded"
|
||||
- name: STATE
|
||||
value: success
|
||||
- name: TARGET_URL
|
||||
value: "https://tekton.fizz.buzz/#/namespaces/$(context.pipelineRun.namespace)/pipelineruns/$(context.pipelineRun.name)"
|
||||
- name: report-failure
|
||||
when:
|
||||
- input: "$(tasks.status)"
|
||||
operator: in
|
||||
values: ["Failed"]
|
||||
taskRef:
|
||||
resolver: git
|
||||
params:
|
||||
- name: url
|
||||
value: https://code.fizz.buzz/mirror/catalog.git # mirror of https://github.com/tektoncd/catalog.git
|
||||
- name: revision
|
||||
value: df36b3853a5657fd883015cdbf07ad6466918acf
|
||||
- name: pathInRepo
|
||||
value: task/gitea-set-status/0.1/gitea-set-status.yaml
|
||||
params:
|
||||
- name: CONTEXT
|
||||
value: "$(params.JOB_NAME)"
|
||||
- name: REPO_FULL_NAME
|
||||
value: "$(params.REPO_OWNER)/$(params.REPO_NAME)"
|
||||
- name: GITEA_HOST_URL
|
||||
value: code.fizz.buzz
|
||||
- name: SHA
|
||||
value: "$(tasks.fetch-repository.results.commit)"
|
||||
- name: DESCRIPTION
|
||||
value: "Build $(params.JOB_NAME) has failed"
|
||||
- name: STATE
|
||||
value: failure
|
||||
- name: TARGET_URL
|
||||
value: "https://tekton.fizz.buzz/#/namespaces/$(context.pipelineRun.namespace)/pipelineruns/$(context.pipelineRun.name)"
|
||||
- name: cargo-cache-autoclean
|
||||
taskSpec:
|
||||
metadata: {}
|
||||
params:
|
||||
- name: docker-image
|
||||
type: string
|
||||
description: Docker image to run.
|
||||
default: alpine:3.20
|
||||
stepTemplate:
|
||||
image: alpine:3.20
|
||||
computeResources:
|
||||
requests:
|
||||
cpu: 10m
|
||||
memory: 600Mi
|
||||
workingDir: /workspace/source
|
||||
workspaces:
|
||||
- name: source
|
||||
mountPath: /source
|
||||
- name: cargo-cache
|
||||
mountPath: /usr/local/cargo/registry
|
||||
optional: true
|
||||
steps:
|
||||
- name: run
|
||||
image: $(params.docker-image)
|
||||
workingDir: "$(workspaces.source.path)"
|
||||
command: [cargo, cache, --autoclean]
|
||||
args: []
|
||||
workspaces:
|
||||
- name: source
|
||||
workspace: git-source
|
||||
- name: cargo-cache
|
||||
workspace: cargo-cache
|
||||
params:
|
||||
- name: docker-image
|
||||
value: "$(tasks.build-image.results.IMAGE_URL[1])"
|
||||
workspaces:
|
||||
- name: git-source
|
||||
- name: docker-credentials
|
||||
- name: cargo-cache
|
||||
workspaces:
|
||||
- name: git-source
|
||||
volumeClaimTemplate:
|
||||
spec:
|
||||
storageClassName: "local-path"
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
resources:
|
||||
requests:
|
||||
storage: 10Gi
|
||||
subPath: rust-source
|
||||
- name: cargo-cache
|
||||
persistentVolumeClaim:
|
||||
claimName: natter-cargo-cache-fmt
|
||||
- name: docker-credentials
|
||||
secret:
|
||||
secretName: harbor-plain
|
||||
params:
|
||||
- name: image-name
|
||||
value: "harbor.fizz.buzz/private/natter-development-format"
|
||||
- name: target-name
|
||||
value: ""
|
||||
- name: path-to-image-context
|
||||
value: docker/natter_development/
|
||||
- name: path-to-dockerfile
|
||||
value: docker/natter_development/
|
||||
313
.webhook_bridge/pipeline-rust-clippy.yaml
Normal file
313
.webhook_bridge/pipeline-rust-clippy.yaml
Normal file
@@ -0,0 +1,313 @@
|
||||
apiVersion: tekton.dev/v1
|
||||
kind: PipelineRun
|
||||
metadata:
|
||||
name: rust-clippy
|
||||
spec:
|
||||
taskRunTemplate:
|
||||
serviceAccountName: build-bot
|
||||
timeouts:
|
||||
pipeline: "2h0m0s"
|
||||
tasks: "1h0m40s"
|
||||
finally: "0h30m0s"
|
||||
pipelineSpec:
|
||||
params:
|
||||
- name: image-name
|
||||
description: The name for the built image
|
||||
type: string
|
||||
- name: target-name
|
||||
description: The dockerfile target to build
|
||||
type: string
|
||||
- name: path-to-image-context
|
||||
description: The path to the build context
|
||||
type: string
|
||||
- name: path-to-dockerfile
|
||||
description: The path to the Dockerfile
|
||||
type: string
|
||||
tasks:
|
||||
- name: report-pending
|
||||
taskRef:
|
||||
resolver: git
|
||||
params:
|
||||
- name: url
|
||||
value: https://code.fizz.buzz/mirror/catalog.git # mirror of https://github.com/tektoncd/catalog.git
|
||||
- name: revision
|
||||
value: df36b3853a5657fd883015cdbf07ad6466918acf
|
||||
- name: pathInRepo
|
||||
value: task/gitea-set-status/0.1/gitea-set-status.yaml
|
||||
params:
|
||||
- name: CONTEXT
|
||||
value: "$(params.JOB_NAME)"
|
||||
- name: REPO_FULL_NAME
|
||||
value: "$(params.REPO_OWNER)/$(params.REPO_NAME)"
|
||||
- name: GITEA_HOST_URL
|
||||
value: code.fizz.buzz
|
||||
- name: SHA
|
||||
value: "$(tasks.fetch-repository.results.commit)"
|
||||
- name: DESCRIPTION
|
||||
value: "Build $(params.JOB_NAME) has started"
|
||||
- name: STATE
|
||||
value: pending
|
||||
- name: TARGET_URL
|
||||
value: "https://tekton.fizz.buzz/#/namespaces/$(context.pipelineRun.namespace)/pipelineruns/$(context.pipelineRun.name)"
|
||||
- name: fetch-repository
|
||||
taskRef:
|
||||
resolver: git
|
||||
params:
|
||||
- name: url
|
||||
value: https://code.fizz.buzz/mirror/catalog.git # mirror of https://github.com/tektoncd/catalog.git
|
||||
- name: revision
|
||||
value: df36b3853a5657fd883015cdbf07ad6466918acf
|
||||
- name: pathInRepo
|
||||
value: task/git-clone/0.9/git-clone.yaml
|
||||
workspaces:
|
||||
- name: output
|
||||
workspace: git-source
|
||||
params:
|
||||
- name: url
|
||||
value: $(params.REPO_URL)
|
||||
- name: revision
|
||||
value: $(params.PULL_BASE_SHA)
|
||||
- name: deleteExisting
|
||||
value: "true"
|
||||
- name: get-git-commit-time
|
||||
taskSpec:
|
||||
metadata: {}
|
||||
stepTemplate:
|
||||
image: alpine:3.20
|
||||
computeResources:
|
||||
requests:
|
||||
cpu: 10m
|
||||
memory: 600Mi
|
||||
workingDir: "$(workspaces.repo.path)"
|
||||
results:
|
||||
- name: unix-time
|
||||
description: The time of the git commit in unix timestamp format.
|
||||
steps:
|
||||
- image: alpine/git:v2.34.2
|
||||
name: detect-tag-step
|
||||
script: |
|
||||
#!/usr/bin/env sh
|
||||
set -euo pipefail
|
||||
echo -n "$(git log -1 --pretty=%ct)" | tee $(results.unix-time.path)
|
||||
workspaces:
|
||||
- name: repo
|
||||
workspace: git-source
|
||||
runAfter:
|
||||
- fetch-repository
|
||||
- name: build-image
|
||||
taskRef:
|
||||
resolver: git
|
||||
params:
|
||||
- name: url
|
||||
value: https://code.fizz.buzz/talexander/personal_tekton_catalog.git
|
||||
- name: revision
|
||||
value: 7ee31a185243ee6da13dcd26a592c585b64c80e5
|
||||
- name: pathInRepo
|
||||
value: task/buildkit-rootless-daemonless/0.1/buildkit-rootless-daemonless.yaml
|
||||
params:
|
||||
- name: OUTPUT
|
||||
value: >-
|
||||
type=image,"name=$(params.image-name):latest,$(params.image-name):$(tasks.fetch-repository.results.commit)",push=true,compression=zstd,compression-level=22,oci-mediatypes=true
|
||||
- name: CONTEXT
|
||||
value: $(params.path-to-image-context)
|
||||
- name: DOCKERFILE
|
||||
value: $(params.path-to-dockerfile)
|
||||
- name: EXTRA_ARGS
|
||||
value:
|
||||
- "--opt"
|
||||
- "target=$(params.target-name)"
|
||||
- --import-cache
|
||||
- "type=registry,ref=$(params.image-name):buildcache"
|
||||
- --export-cache
|
||||
- "type=registry,ref=$(params.image-name):buildcache,mode=max,compression=zstd,compression-level=22,rewrite-timestamp=true,image-manifest=true,oci-mediatypes=true"
|
||||
- --opt
|
||||
- build-arg:SOURCE_DATE_EPOCH=$(tasks.get-git-commit-time.results.unix-time)
|
||||
- name: BUILDKITD_TOML
|
||||
value: |
|
||||
debug = true
|
||||
[registry."docker.io"]
|
||||
mirrors = ["dockerhub.dockerhub.svc.cluster.local"]
|
||||
[registry."dockerhub.dockerhub.svc.cluster.local"]
|
||||
http = true
|
||||
insecure = true
|
||||
workspaces:
|
||||
- name: source
|
||||
workspace: git-source
|
||||
- name: dockerconfig
|
||||
workspace: docker-credentials
|
||||
runAfter:
|
||||
- fetch-repository
|
||||
- name: run-cargo-clippy
|
||||
taskSpec:
|
||||
metadata: {}
|
||||
params:
|
||||
- name: docker-image
|
||||
type: string
|
||||
description: Docker image to run.
|
||||
default: alpine:3.20
|
||||
stepTemplate:
|
||||
image: alpine:3.20
|
||||
computeResources:
|
||||
requests:
|
||||
cpu: 10m
|
||||
memory: 600Mi
|
||||
workingDir: /workspace/source
|
||||
workspaces:
|
||||
- name: source
|
||||
mountPath: /source
|
||||
- name: cargo-cache
|
||||
mountPath: /usr/local/cargo/registry
|
||||
optional: true
|
||||
steps:
|
||||
- name: run
|
||||
image: $(params.docker-image)
|
||||
workingDir: "$(workspaces.source.path)"
|
||||
command:
|
||||
[
|
||||
"cargo",
|
||||
"clippy",
|
||||
"--no-deps",
|
||||
"--all-targets",
|
||||
"--all-features",
|
||||
"--",
|
||||
"-D",
|
||||
"warnings",
|
||||
]
|
||||
args: []
|
||||
env:
|
||||
- name: CARGO_TARGET_DIR
|
||||
value: /target
|
||||
workspaces:
|
||||
- name: source
|
||||
workspace: git-source
|
||||
- name: cargo-cache
|
||||
workspace: cargo-cache
|
||||
runAfter:
|
||||
- build-image
|
||||
params:
|
||||
- name: docker-image
|
||||
value: "$(tasks.build-image.results.IMAGE_URL[1])"
|
||||
finally:
|
||||
- name: report-success
|
||||
when:
|
||||
- input: "$(tasks.status)"
|
||||
operator: in
|
||||
values: ["Succeeded", "Completed"]
|
||||
taskRef:
|
||||
resolver: git
|
||||
params:
|
||||
- name: url
|
||||
value: https://code.fizz.buzz/mirror/catalog.git # mirror of https://github.com/tektoncd/catalog.git
|
||||
- name: revision
|
||||
value: df36b3853a5657fd883015cdbf07ad6466918acf
|
||||
- name: pathInRepo
|
||||
value: task/gitea-set-status/0.1/gitea-set-status.yaml
|
||||
params:
|
||||
- name: CONTEXT
|
||||
value: "$(params.JOB_NAME)"
|
||||
- name: REPO_FULL_NAME
|
||||
value: "$(params.REPO_OWNER)/$(params.REPO_NAME)"
|
||||
- name: GITEA_HOST_URL
|
||||
value: code.fizz.buzz
|
||||
- name: SHA
|
||||
value: "$(tasks.fetch-repository.results.commit)"
|
||||
- name: DESCRIPTION
|
||||
value: "Build $(params.JOB_NAME) has succeeded"
|
||||
- name: STATE
|
||||
value: success
|
||||
- name: TARGET_URL
|
||||
value: "https://tekton.fizz.buzz/#/namespaces/$(context.pipelineRun.namespace)/pipelineruns/$(context.pipelineRun.name)"
|
||||
- name: report-failure
|
||||
when:
|
||||
- input: "$(tasks.status)"
|
||||
operator: in
|
||||
values: ["Failed"]
|
||||
taskRef:
|
||||
resolver: git
|
||||
params:
|
||||
- name: url
|
||||
value: https://code.fizz.buzz/mirror/catalog.git # mirror of https://github.com/tektoncd/catalog.git
|
||||
- name: revision
|
||||
value: df36b3853a5657fd883015cdbf07ad6466918acf
|
||||
- name: pathInRepo
|
||||
value: task/gitea-set-status/0.1/gitea-set-status.yaml
|
||||
params:
|
||||
- name: CONTEXT
|
||||
value: "$(params.JOB_NAME)"
|
||||
- name: REPO_FULL_NAME
|
||||
value: "$(params.REPO_OWNER)/$(params.REPO_NAME)"
|
||||
- name: GITEA_HOST_URL
|
||||
value: code.fizz.buzz
|
||||
- name: SHA
|
||||
value: "$(tasks.fetch-repository.results.commit)"
|
||||
- name: DESCRIPTION
|
||||
value: "Build $(params.JOB_NAME) has failed"
|
||||
- name: STATE
|
||||
value: failure
|
||||
- name: TARGET_URL
|
||||
value: "https://tekton.fizz.buzz/#/namespaces/$(context.pipelineRun.namespace)/pipelineruns/$(context.pipelineRun.name)"
|
||||
- name: cargo-cache-autoclean
|
||||
taskSpec:
|
||||
metadata: {}
|
||||
params:
|
||||
- name: docker-image
|
||||
type: string
|
||||
description: Docker image to run.
|
||||
default: alpine:3.20
|
||||
stepTemplate:
|
||||
image: alpine:3.20
|
||||
computeResources:
|
||||
requests:
|
||||
cpu: 10m
|
||||
memory: 600Mi
|
||||
workingDir: /workspace/source
|
||||
workspaces:
|
||||
- name: source
|
||||
mountPath: /source
|
||||
- name: cargo-cache
|
||||
mountPath: /usr/local/cargo/registry
|
||||
optional: true
|
||||
steps:
|
||||
- name: run
|
||||
image: $(params.docker-image)
|
||||
workingDir: "$(workspaces.source.path)"
|
||||
command: [cargo, cache, --autoclean]
|
||||
args: []
|
||||
workspaces:
|
||||
- name: source
|
||||
workspace: git-source
|
||||
- name: cargo-cache
|
||||
workspace: cargo-cache
|
||||
params:
|
||||
- name: docker-image
|
||||
value: "$(tasks.build-image.results.IMAGE_URL[1])"
|
||||
workspaces:
|
||||
- name: git-source
|
||||
- name: docker-credentials
|
||||
- name: cargo-cache
|
||||
workspaces:
|
||||
- name: git-source
|
||||
volumeClaimTemplate:
|
||||
spec:
|
||||
storageClassName: "local-path"
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
resources:
|
||||
requests:
|
||||
storage: 10Gi
|
||||
subPath: rust-source
|
||||
- name: cargo-cache
|
||||
persistentVolumeClaim:
|
||||
claimName: natter-cargo-cache-clippy
|
||||
- name: docker-credentials
|
||||
secret:
|
||||
secretName: harbor-plain
|
||||
params:
|
||||
- name: image-name
|
||||
value: "harbor.fizz.buzz/private/natter-development-clippy"
|
||||
- name: target-name
|
||||
value: ""
|
||||
- name: path-to-image-context
|
||||
value: docker/natter_development/
|
||||
- name: path-to-dockerfile
|
||||
value: docker/natter_development/
|
||||
303
.webhook_bridge/pipeline-rust-test.yaml
Normal file
303
.webhook_bridge/pipeline-rust-test.yaml
Normal file
@@ -0,0 +1,303 @@
|
||||
apiVersion: tekton.dev/v1
|
||||
kind: PipelineRun
|
||||
metadata:
|
||||
name: rust-test
|
||||
spec:
|
||||
timeouts:
|
||||
pipeline: "2h0m0s"
|
||||
tasks: "1h0m40s"
|
||||
finally: "0h30m0s"
|
||||
taskRunTemplate:
|
||||
serviceAccountName: build-bot
|
||||
pipelineSpec:
|
||||
params:
|
||||
- name: image-name
|
||||
description: The name for the built image
|
||||
type: string
|
||||
- name: target-name
|
||||
description: The dockerfile target to build
|
||||
type: string
|
||||
- name: path-to-image-context
|
||||
description: The path to the build context
|
||||
type: string
|
||||
- name: path-to-dockerfile
|
||||
description: The path to the Dockerfile
|
||||
type: string
|
||||
tasks:
|
||||
- name: report-pending
|
||||
taskRef:
|
||||
resolver: git
|
||||
params:
|
||||
- name: url
|
||||
value: https://code.fizz.buzz/mirror/catalog.git # mirror of https://github.com/tektoncd/catalog.git
|
||||
- name: revision
|
||||
value: df36b3853a5657fd883015cdbf07ad6466918acf
|
||||
- name: pathInRepo
|
||||
value: task/gitea-set-status/0.1/gitea-set-status.yaml
|
||||
params:
|
||||
- name: CONTEXT
|
||||
value: "$(params.JOB_NAME)"
|
||||
- name: REPO_FULL_NAME
|
||||
value: "$(params.REPO_OWNER)/$(params.REPO_NAME)"
|
||||
- name: GITEA_HOST_URL
|
||||
value: code.fizz.buzz
|
||||
- name: SHA
|
||||
value: "$(tasks.fetch-repository.results.commit)"
|
||||
- name: DESCRIPTION
|
||||
value: "Build $(params.JOB_NAME) has started"
|
||||
- name: STATE
|
||||
value: pending
|
||||
- name: TARGET_URL
|
||||
value: "https://tekton.fizz.buzz/#/namespaces/$(context.pipelineRun.namespace)/pipelineruns/$(context.pipelineRun.name)"
|
||||
- name: fetch-repository
|
||||
taskRef:
|
||||
resolver: git
|
||||
params:
|
||||
- name: url
|
||||
value: https://code.fizz.buzz/mirror/catalog.git # mirror of https://github.com/tektoncd/catalog.git
|
||||
- name: revision
|
||||
value: df36b3853a5657fd883015cdbf07ad6466918acf
|
||||
- name: pathInRepo
|
||||
value: task/git-clone/0.9/git-clone.yaml
|
||||
workspaces:
|
||||
- name: output
|
||||
workspace: git-source
|
||||
params:
|
||||
- name: url
|
||||
value: $(params.REPO_URL)
|
||||
- name: revision
|
||||
value: $(params.PULL_BASE_SHA)
|
||||
- name: deleteExisting
|
||||
value: "true"
|
||||
- name: get-git-commit-time
|
||||
taskSpec:
|
||||
metadata: {}
|
||||
stepTemplate:
|
||||
image: alpine:3.20
|
||||
computeResources:
|
||||
requests:
|
||||
cpu: 10m
|
||||
memory: 600Mi
|
||||
workingDir: "$(workspaces.repo.path)"
|
||||
results:
|
||||
- name: unix-time
|
||||
description: The time of the git commit in unix timestamp format.
|
||||
steps:
|
||||
- image: alpine/git:v2.34.2
|
||||
name: detect-tag-step
|
||||
script: |
|
||||
#!/usr/bin/env sh
|
||||
set -euo pipefail
|
||||
echo -n "$(git log -1 --pretty=%ct)" | tee $(results.unix-time.path)
|
||||
workspaces:
|
||||
- name: repo
|
||||
workspace: git-source
|
||||
runAfter:
|
||||
- fetch-repository
|
||||
- name: build-image
|
||||
taskRef:
|
||||
resolver: git
|
||||
params:
|
||||
- name: url
|
||||
value: https://code.fizz.buzz/talexander/personal_tekton_catalog.git
|
||||
- name: revision
|
||||
value: 7ee31a185243ee6da13dcd26a592c585b64c80e5
|
||||
- name: pathInRepo
|
||||
value: task/buildkit-rootless-daemonless/0.1/buildkit-rootless-daemonless.yaml
|
||||
params:
|
||||
- name: OUTPUT
|
||||
value: >-
|
||||
type=image,"name=$(params.image-name):latest,$(params.image-name):$(tasks.fetch-repository.results.commit)",push=true,compression=zstd,compression-level=22,oci-mediatypes=true
|
||||
- name: CONTEXT
|
||||
value: $(params.path-to-image-context)
|
||||
- name: DOCKERFILE
|
||||
value: $(params.path-to-dockerfile)
|
||||
- name: EXTRA_ARGS
|
||||
value:
|
||||
- "--opt"
|
||||
- "target=$(params.target-name)"
|
||||
- --import-cache
|
||||
- "type=registry,ref=$(params.image-name):buildcache"
|
||||
- --export-cache
|
||||
- "type=registry,ref=$(params.image-name):buildcache,mode=max,compression=zstd,compression-level=22,rewrite-timestamp=true,image-manifest=true,oci-mediatypes=true"
|
||||
- --opt
|
||||
- build-arg:SOURCE_DATE_EPOCH=$(tasks.get-git-commit-time.results.unix-time)
|
||||
- name: BUILDKITD_TOML
|
||||
value: |
|
||||
debug = true
|
||||
[registry."docker.io"]
|
||||
mirrors = ["dockerhub.dockerhub.svc.cluster.local"]
|
||||
[registry."dockerhub.dockerhub.svc.cluster.local"]
|
||||
http = true
|
||||
insecure = true
|
||||
workspaces:
|
||||
- name: source
|
||||
workspace: git-source
|
||||
- name: dockerconfig
|
||||
workspace: docker-credentials
|
||||
runAfter:
|
||||
- fetch-repository
|
||||
- name: run-cargo-test
|
||||
taskSpec:
|
||||
metadata: {}
|
||||
params:
|
||||
- name: docker-image
|
||||
type: string
|
||||
description: Docker image to run.
|
||||
default: alpine:3.20
|
||||
stepTemplate:
|
||||
image: alpine:3.20
|
||||
computeResources:
|
||||
requests:
|
||||
cpu: 10m
|
||||
memory: 600Mi
|
||||
workingDir: /workspace/source
|
||||
workspaces:
|
||||
- name: source
|
||||
mountPath: /source
|
||||
- name: cargo-cache
|
||||
mountPath: /usr/local/cargo/registry
|
||||
optional: true
|
||||
steps:
|
||||
- name: run
|
||||
image: $(params.docker-image)
|
||||
workingDir: "$(workspaces.source.path)"
|
||||
command: [cargo, test, --no-fail-fast]
|
||||
args: []
|
||||
env:
|
||||
- name: CARGO_TARGET_DIR
|
||||
value: /target
|
||||
workspaces:
|
||||
- name: source
|
||||
workspace: git-source
|
||||
- name: cargo-cache
|
||||
workspace: cargo-cache
|
||||
runAfter:
|
||||
- build-image
|
||||
params:
|
||||
- name: docker-image
|
||||
value: "$(tasks.build-image.results.IMAGE_URL[1])"
|
||||
finally:
|
||||
- name: report-success
|
||||
when:
|
||||
- input: "$(tasks.status)"
|
||||
operator: in
|
||||
values: ["Succeeded", "Completed"]
|
||||
taskRef:
|
||||
resolver: git
|
||||
params:
|
||||
- name: url
|
||||
value: https://code.fizz.buzz/mirror/catalog.git # mirror of https://github.com/tektoncd/catalog.git
|
||||
- name: revision
|
||||
value: df36b3853a5657fd883015cdbf07ad6466918acf
|
||||
- name: pathInRepo
|
||||
value: task/gitea-set-status/0.1/gitea-set-status.yaml
|
||||
params:
|
||||
- name: CONTEXT
|
||||
value: "$(params.JOB_NAME)"
|
||||
- name: REPO_FULL_NAME
|
||||
value: "$(params.REPO_OWNER)/$(params.REPO_NAME)"
|
||||
- name: GITEA_HOST_URL
|
||||
value: code.fizz.buzz
|
||||
- name: SHA
|
||||
value: "$(tasks.fetch-repository.results.commit)"
|
||||
- name: DESCRIPTION
|
||||
value: "Build $(params.JOB_NAME) has succeeded"
|
||||
- name: STATE
|
||||
value: success
|
||||
- name: TARGET_URL
|
||||
value: "https://tekton.fizz.buzz/#/namespaces/$(context.pipelineRun.namespace)/pipelineruns/$(context.pipelineRun.name)"
|
||||
- name: report-failure
|
||||
when:
|
||||
- input: "$(tasks.status)"
|
||||
operator: in
|
||||
values: ["Failed"]
|
||||
taskRef:
|
||||
resolver: git
|
||||
params:
|
||||
- name: url
|
||||
value: https://code.fizz.buzz/mirror/catalog.git # mirror of https://github.com/tektoncd/catalog.git
|
||||
- name: revision
|
||||
value: df36b3853a5657fd883015cdbf07ad6466918acf
|
||||
- name: pathInRepo
|
||||
value: task/gitea-set-status/0.1/gitea-set-status.yaml
|
||||
params:
|
||||
- name: CONTEXT
|
||||
value: "$(params.JOB_NAME)"
|
||||
- name: REPO_FULL_NAME
|
||||
value: "$(params.REPO_OWNER)/$(params.REPO_NAME)"
|
||||
- name: GITEA_HOST_URL
|
||||
value: code.fizz.buzz
|
||||
- name: SHA
|
||||
value: "$(tasks.fetch-repository.results.commit)"
|
||||
- name: DESCRIPTION
|
||||
value: "Build $(params.JOB_NAME) has failed"
|
||||
- name: STATE
|
||||
value: failure
|
||||
- name: TARGET_URL
|
||||
value: "https://tekton.fizz.buzz/#/namespaces/$(context.pipelineRun.namespace)/pipelineruns/$(context.pipelineRun.name)"
|
||||
- name: cargo-cache-autoclean
|
||||
taskSpec:
|
||||
metadata: {}
|
||||
params:
|
||||
- name: docker-image
|
||||
type: string
|
||||
description: Docker image to run.
|
||||
default: alpine:3.20
|
||||
stepTemplate:
|
||||
image: alpine:3.20
|
||||
computeResources:
|
||||
requests:
|
||||
cpu: 10m
|
||||
memory: 600Mi
|
||||
workingDir: /workspace/source
|
||||
workspaces:
|
||||
- name: source
|
||||
mountPath: /source
|
||||
- name: cargo-cache
|
||||
mountPath: /usr/local/cargo/registry
|
||||
optional: true
|
||||
steps:
|
||||
- name: run
|
||||
image: $(params.docker-image)
|
||||
workingDir: "$(workspaces.source.path)"
|
||||
command: [cargo, cache, --autoclean]
|
||||
args: []
|
||||
workspaces:
|
||||
- name: source
|
||||
workspace: git-source
|
||||
- name: cargo-cache
|
||||
workspace: cargo-cache
|
||||
params:
|
||||
- name: docker-image
|
||||
value: "$(tasks.build-image.results.IMAGE_URL[1])"
|
||||
workspaces:
|
||||
- name: git-source
|
||||
- name: docker-credentials
|
||||
- name: cargo-cache
|
||||
workspaces:
|
||||
- name: git-source
|
||||
volumeClaimTemplate:
|
||||
spec:
|
||||
storageClassName: "local-path"
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
resources:
|
||||
requests:
|
||||
storage: 10Gi
|
||||
subPath: rust-source
|
||||
- name: cargo-cache
|
||||
persistentVolumeClaim:
|
||||
claimName: natter-cargo-cache-test
|
||||
- name: docker-credentials
|
||||
secret:
|
||||
secretName: harbor-plain
|
||||
params:
|
||||
- name: image-name
|
||||
value: "harbor.fizz.buzz/private/natter-development-test"
|
||||
- name: target-name
|
||||
value: ""
|
||||
- name: path-to-image-context
|
||||
value: docker/natter_development/
|
||||
- name: path-to-dockerfile
|
||||
value: docker/natter_development/
|
||||
25
.webhook_bridge/webhook_bridge.toml
Normal file
25
.webhook_bridge/webhook_bridge.toml
Normal file
@@ -0,0 +1,25 @@
|
||||
version = "0.0.1"
|
||||
|
||||
[[push]]
|
||||
name = "rust-test"
|
||||
source = "pipeline-rust-test.yaml"
|
||||
clone_uri = "git@code.fizz.buzz:talexander/natter.git"
|
||||
skip_branches = [ "^v[0-9]+\\.[0-9]+\\.[0-9]+$" ]
|
||||
|
||||
[[push]]
|
||||
name = "clippy"
|
||||
source = "pipeline-rust-clippy.yaml"
|
||||
clone_uri = "git@code.fizz.buzz:talexander/natter.git"
|
||||
skip_branches = [ "^v[0-9]+\\.[0-9]+\\.[0-9]+$" ]
|
||||
|
||||
[[push]]
|
||||
name = "format"
|
||||
source = "pipeline-format.yaml"
|
||||
clone_uri = "git@code.fizz.buzz:talexander/natter.git"
|
||||
skip_branches = [ "^v[0-9]+\\.[0-9]+\\.[0-9]+$" ]
|
||||
|
||||
[[push]]
|
||||
name = "build"
|
||||
source = "pipeline-build-hash.yaml"
|
||||
clone_uri = "git@code.fizz.buzz:talexander/natter.git"
|
||||
branches = [ "^main$", "^master$" ]
|
||||
1562
Cargo.lock
generated
1562
Cargo.lock
generated
File diff suppressed because it is too large
Load Diff
49
Cargo.toml
49
Cargo.toml
@@ -1,19 +1,54 @@
|
||||
[package]
|
||||
name = "writer"
|
||||
name = "natter"
|
||||
version = "0.0.1"
|
||||
edition = "2021"
|
||||
edition = "2024"
|
||||
authors = ["Tom Alexander <tom@fizz.buzz>"]
|
||||
description = "A static site generator using org source files."
|
||||
license = "0BSD"
|
||||
repository = "https://code.fizz.buzz/talexander/natter"
|
||||
readme = "README.md"
|
||||
keywords = ["static", "site", "generator"]
|
||||
categories = ["command-line-utilities"]
|
||||
resolver = "2"
|
||||
include = [
|
||||
"LICENSE",
|
||||
"**/*.rs",
|
||||
"Cargo.toml",
|
||||
"Cargo.lock",
|
||||
"default_environment/"
|
||||
]
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
clap = { version = "4.4.6", default-features = false, features = ["std", "color", "help", "derive"] }
|
||||
duster = { git = "https://code.fizz.buzz/talexander/duster.git", branch = "master" }
|
||||
duster = "0.1.1"
|
||||
futures = "0.3.29"
|
||||
include_dir = "0.7.3"
|
||||
# TODO: This is temporary to work on the latest organic code. Eventually switch back to using the published crate.
|
||||
organic = { path = "../organic" }
|
||||
# organic = "0.1.12"
|
||||
# organic = { path = "../organic" }
|
||||
organic = "0.1.16"
|
||||
serde = { version = "1.0.189", default-features = false, features = ["std", "derive"] }
|
||||
serde_json = "1.0.107"
|
||||
tokio = { version = "1.30.0", default-features = false, features = ["rt", "rt-multi-thread", "fs", "io-util"] }
|
||||
toml = "0.8.2"
|
||||
walkdir = "2.4.0"
|
||||
tree-sitter-bash = "0.23.3"
|
||||
tree-sitter-highlight = "0.25.2"
|
||||
tree-sitter-nix = "0.0.2"
|
||||
tree-sitter-python = "0.23.6"
|
||||
url = "2.5.0"
|
||||
tracing = { version = "0.1.37", optional = true }
|
||||
tracing-opentelemetry = { version = "0.20.0", optional = true }
|
||||
tracing-subscriber = { version = "0.3.17", optional = true, features = ["env-filter"] }
|
||||
opentelemetry = { version = "0.20.0", optional = true, default-features = false, features = ["trace", "rt-tokio"] }
|
||||
opentelemetry-otlp = { version = "0.13.0", optional = true }
|
||||
opentelemetry-semantic-conventions = { version = "0.12.0", optional = true }
|
||||
|
||||
[features]
|
||||
default = ["tracing"]
|
||||
tracing = ["dep:opentelemetry", "dep:opentelemetry-otlp", "dep:opentelemetry-semantic-conventions", "dep:tracing", "dep:tracing-opentelemetry", "dep:tracing-subscriber"]
|
||||
|
||||
# Optimized build for any sort of release.
|
||||
[profile.release-lto]
|
||||
inherits = "release"
|
||||
lto = true
|
||||
strip = "symbols"
|
||||
|
||||
39
Makefile
Normal file
39
Makefile
Normal file
@@ -0,0 +1,39 @@
|
||||
SHELL := bash
|
||||
.ONESHELL:
|
||||
.SHELLFLAGS := -eu -o pipefail -c
|
||||
.DELETE_ON_ERROR:
|
||||
MAKEFLAGS += --warn-undefined-variables
|
||||
MAKEFLAGS += --no-builtin-rules
|
||||
OS:=$(shell uname -s)
|
||||
|
||||
ifeq ($(origin .RECIPEPREFIX), undefined)
|
||||
$(error This Make does not support .RECIPEPREFIX. Please use GNU Make 4.0 or later)
|
||||
endif
|
||||
.RECIPEPREFIX = >
|
||||
|
||||
IMAGE_NAME:=natter
|
||||
TARGET :=
|
||||
|
||||
.PHONY: help
|
||||
help:
|
||||
> @grep -h "##" $(MAKEFILE_LIST) | grep -v grep | sed -E 's/^([^:]*): *## */\1: /'
|
||||
|
||||
.PHONY: docker_test
|
||||
docker_test: ## Run the rust tests
|
||||
> $(MAKE) -C docker/natter_development build
|
||||
> docker run --rm -i -t --mount type=tmpfs,destination=/tmp -v "$(shell readlink -f .):/source" --workdir=/source --env CARGO_TARGET_DIR=/target -v "natter-cargo-registry:/usr/local/cargo/registry" natter-development cargo test
|
||||
|
||||
.PHONY: docker_clippy
|
||||
docker_clippy: ## Run static analysis of the code.
|
||||
> $(MAKE) -C docker/natter_development build
|
||||
> docker run --rm -i -t --mount type=tmpfs,destination=/tmp -v "$(shell readlink -f .):/source" --workdir=/source --env CARGO_TARGET_DIR=/target -v "natter-cargo-registry:/usr/local/cargo/registry" natter-development cargo clippy --no-deps --all-targets --all-features -- -D warnings
|
||||
|
||||
.PHONY: docker_format
|
||||
docker_format: ## Auto-format source files.
|
||||
> $(MAKE) -C docker/natter_development build
|
||||
> docker run --rm -i -t --mount type=tmpfs,destination=/tmp -v "$(shell readlink -f .):/source" --workdir=/source --env CARGO_TARGET_DIR=/target -v "natter-cargo-registry:/usr/local/cargo/registry" natter-development cargo fmt
|
||||
> docker run --rm -i -t --mount type=tmpfs,destination=/tmp -v "$(shell readlink -f .):/source" --workdir=/source --env CARGO_TARGET_DIR=/target -v "natter-cargo-registry:/usr/local/cargo/registry" natter-development prettier --write --no-error-on-unmatched-pattern "default_environment/**/*.js" "default_environment/**/*.css"
|
||||
|
||||
.PHONY: clean
|
||||
clean:
|
||||
> $(MAKE) -C docker/natter_development clean
|
||||
3
README.md
Normal file
3
README.md
Normal file
@@ -0,0 +1,3 @@
|
||||
# Natter
|
||||
|
||||
Natter is a static site generator for blogs using org as an input format. It is at a very early stage, and will have deep sweeping changes.
|
||||
21
TODO.org
Normal file
21
TODO.org
Normal file
@@ -0,0 +1,21 @@
|
||||
* Things to do [6/17]
|
||||
** DONE If the paragraph only contains an image, text-align center
|
||||
** DONE Syntax highlighting for code blocks
|
||||
** TODO Render gnuplot
|
||||
** TODO Pretty-print the timestamps
|
||||
** TODO Support Table of Contents
|
||||
** TODO Support line numbers in code blocks
|
||||
** TODO Support references to code block lines
|
||||
** TODO Only include text up to first heading on homepage and include a "read more" link
|
||||
** DONE Make loading language-specific CSS files conditional on the presence of src blocks using those languages
|
||||
** DONE Set up tracing so I can use warning and such
|
||||
** TODO Make copying of language-specific CSS files conditional on the presence of src blocks using those languages
|
||||
** TODO Switch to an entirely lazily-evaluated output tree
|
||||
** TODO Add highlighting for languages [1/2]
|
||||
*** DONE bash
|
||||
*** TODO gnuplot
|
||||
https://github.com/dpezto/tree-sitter-gnuplot is not on crates.io so I'd have to add a git dependency to use it. This would prevent publishing this crate to crates.io.
|
||||
** DONE Bug: carry over highlight starts when breaking lines
|
||||
** TODO Add dates to posts
|
||||
** DONE Add support for unlisted posts (posts that do not show up on the homepage).
|
||||
** TODO Add support for showing file name where we currently show language
|
||||
39
default_environment/stylesheet/language_bash.css
Normal file
39
default_environment/stylesheet/language_bash.css
Normal file
@@ -0,0 +1,39 @@
|
||||
:root {
|
||||
--srclg-bash-srchl-comment-color: #048a81;
|
||||
--srclg-bash-srchl-function-color: #e95a62;
|
||||
--srclg-bash-srchl-keyword-color: #1a936f;
|
||||
--srclg-bash-srchl-property-color: inherit;
|
||||
--srclg-bash-srchl-string-color: #ecc30b;
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: light) {
|
||||
:root {
|
||||
--srclg-bash-srchl-comment-color: #fb757e;
|
||||
--srclg-bash-srchl-function-color: #16a59d;
|
||||
--srclg-bash-srchl-keyword-color: #e56c90;
|
||||
--srclg-bash-srchl-property-color: inherit;
|
||||
--srclg-bash-srchl-string-color: #133cf4;
|
||||
}
|
||||
}
|
||||
|
||||
.main_content {
|
||||
.src_block {
|
||||
&.srclg_bash {
|
||||
.srchl_comment {
|
||||
color: var(--srclg-bash-srchl-comment-color);
|
||||
}
|
||||
.srchl_function {
|
||||
color: var(--srclg-bash-srchl-function-color);
|
||||
}
|
||||
.srchl_keyword {
|
||||
color: var(--srclg-bash-srchl-keyword-color);
|
||||
}
|
||||
.srchl_property {
|
||||
color: var(--srclg-bash-srchl-property-color);
|
||||
}
|
||||
.srchl_string {
|
||||
color: var(--srclg-bash-srchl-string-color);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
39
default_environment/stylesheet/language_nix.css
Normal file
39
default_environment/stylesheet/language_nix.css
Normal file
@@ -0,0 +1,39 @@
|
||||
:root {
|
||||
--srclg-nix-srchl-keyword-color: #1a936f;
|
||||
--srclg-nix-srchl-comment-color: #048a81;
|
||||
--srclg-nix-srchl-property-color: #bfbccb;
|
||||
--srclg-nix-srchl-string-color: #ecc30b;
|
||||
--srclg-nix-srchl-string-special-path-color: #067bc2;
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: light) {
|
||||
:root {
|
||||
--srclg-nix-srchl-keyword-color: #e56c90;
|
||||
--srclg-nix-srchl-comment-color: #fb757e;
|
||||
--srclg-nix-srchl-property-color: #404334;
|
||||
--srclg-nix-srchl-string-color: #133cf4;
|
||||
--srclg-nix-srchl-string-special-path-color: #f9843d;
|
||||
}
|
||||
}
|
||||
|
||||
.main_content {
|
||||
.src_block {
|
||||
&.srclg_nix {
|
||||
.srchl_keyword {
|
||||
color: var(--srclg-nix-srchl-keyword-color);
|
||||
}
|
||||
.srchl_comment {
|
||||
color: var(--srclg-nix-srchl-comment-color);
|
||||
}
|
||||
.srchl_property {
|
||||
color: var(--srclg-nix-srchl-property-color);
|
||||
}
|
||||
.srchl_string {
|
||||
color: var(--srclg-nix-srchl-string-color);
|
||||
}
|
||||
.srchl_string_special_path {
|
||||
color: var(--srclg-nix-srchl-string-special-path-color);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
51
default_environment/stylesheet/language_python.css
Normal file
51
default_environment/stylesheet/language_python.css
Normal file
@@ -0,0 +1,51 @@
|
||||
/* ea912c */
|
||||
/* e95a62 */
|
||||
:root {
|
||||
--srclg-python-srchl-comment-color: #048a81;
|
||||
--srclg-python-srchl-function-builtin-color: #e95a62;
|
||||
--srclg-python-srchl-keyword-color: #1a936f;
|
||||
--srclg-python-srchl-property-color: inherit;
|
||||
--srclg-python-srchl-string-color: #ecc30b;
|
||||
--srclg-python-srchl-type-color: #067bc2;
|
||||
--srclg-python-srchl-variable-color: #ea912c;
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: light) {
|
||||
:root {
|
||||
--srclg-python-srchl-comment-color: #fb757e;
|
||||
--srclg-python-srchl-function-builtin-color: #16a59d;
|
||||
--srclg-python-srchl-keyword-color: #e56c90;
|
||||
--srclg-python-srchl-property-color: inherit;
|
||||
--srclg-python-srchl-string-color: #133cf4;
|
||||
--srclg-python-srchl-type-color: #f9843d;
|
||||
--srclg-python-srchl-variable-color: #156ed3;
|
||||
}
|
||||
}
|
||||
|
||||
.main_content {
|
||||
.src_block {
|
||||
&.srclg_python {
|
||||
.srchl_comment {
|
||||
color: var(--srclg-python-srchl-comment-color);
|
||||
}
|
||||
.srchl_function_builtin {
|
||||
color: var(--srclg-python-srchl-function-builtin-color);
|
||||
}
|
||||
.srchl_keyword {
|
||||
color: var(--srclg-python-srchl-keyword-color);
|
||||
}
|
||||
.srchl_property {
|
||||
color: var(--srclg-python-srchl-property-color);
|
||||
}
|
||||
.srchl_string {
|
||||
color: var(--srclg-python-srchl-string-color);
|
||||
}
|
||||
.srchl_type {
|
||||
color: var(--srclg-python-srchl-type-color);
|
||||
}
|
||||
.srchl_variable {
|
||||
color: var(--srclg-python-srchl-variable-color);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
358
default_environment/stylesheet/main.css
Normal file
358
default_environment/stylesheet/main.css
Normal file
@@ -0,0 +1,358 @@
|
||||
:root {
|
||||
--main-max-width: 800px;
|
||||
--site-background-color: #0a0a0a;
|
||||
--site-text-color: #fffffc;
|
||||
--header-divider-color: #6a687a;
|
||||
|
||||
--stream-divider-color: #6ccff6;
|
||||
--stream-post-background-color: #0a0a0a;
|
||||
|
||||
--blog-post-background-color: #0a0a0a;
|
||||
|
||||
--src-font-family: ui-monospace, "Cascadia Code", "Source Code Pro", Menlo,
|
||||
Consolas, "DejaVu Sans Mono", monospace;
|
||||
|
||||
--src-block-background-color: #141414;
|
||||
--src-block-border-color: #84828f;
|
||||
--src-block-language-color: #0a0a0a;
|
||||
--src-block-language-background: #84828f;
|
||||
|
||||
--quote-block-border-color: #84828f;
|
||||
|
||||
--table-border-color: #6a687a;
|
||||
--table-odd-background-color: #0a0a0a;
|
||||
--table-even-background-color: #141414;
|
||||
|
||||
--header-nav-regular-font-color: var(--site-text-color);
|
||||
--header-nav-regular-background-color: var(--site-background-color);
|
||||
--header-nav-hover-font-color: var(--site-background-color);
|
||||
--header-nav-hover-background-color: var(--site-text-color);
|
||||
--header-home-regular-font-color: var(--site-text-color);
|
||||
--header-home-hover-font-color: #6ccff6;
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: light) {
|
||||
:root {
|
||||
--site-background-color: #f5f5f5;
|
||||
--site-text-color: #000003;
|
||||
--header-divider-color: #959785;
|
||||
|
||||
--stream-divider-color: #933009;
|
||||
--stream-post-background-color: #f5f5f5;
|
||||
|
||||
--blog-post-background-color: #f5f5f5;
|
||||
|
||||
--src-block-background-color: #ebebeb;
|
||||
--src-block-border-color: #7b7d70;
|
||||
--src-block-language-color: #f5f5f5;
|
||||
--src-block-language-background: #7b7d70;
|
||||
|
||||
--quote-block-border-color: #7b7d70;
|
||||
|
||||
--table-border-color: #959785;
|
||||
--table-odd-background-color: #f5f5f5;
|
||||
--table-even-background-color: #ebebeb;
|
||||
|
||||
--header-nav-regular-font-color: var(--site-text-color);
|
||||
--header-nav-regular-background-color: var(--site-background-color);
|
||||
--header-nav-hover-font-color: var(--site-background-color);
|
||||
--header-nav-hover-background-color: var(--site-text-color);
|
||||
--header-home-regular-font-color: var(--site-text-color);
|
||||
--header-home-hover-font-color: #933009;
|
||||
}
|
||||
}
|
||||
|
||||
* {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
body {
|
||||
color: var(--site-text-color);
|
||||
background-color: var(--site-background-color);
|
||||
font-family: source-sans-pro, Seravek, "Gill Sans Nova", Ubuntu, Calibri,
|
||||
"DejaVu Sans", sans-serif;
|
||||
|
||||
a:link,
|
||||
a:visited {
|
||||
/* TODO: Should I use a different color for links? */
|
||||
color: var(--site-text-color);
|
||||
}
|
||||
}
|
||||
|
||||
.page_centering {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.page_header {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: space-between;
|
||||
align-items: stretch;
|
||||
width: 100%;
|
||||
max-width: var(--main-max-width);
|
||||
border-bottom: 0.1rem solid var(--header-divider-color);
|
||||
|
||||
.home_link {
|
||||
display: block;
|
||||
font-size: 2rem;
|
||||
font-weight: 600;
|
||||
text-decoration: none;
|
||||
color: var(--header-home-regular-font-color);
|
||||
transition-property: color;
|
||||
transition-duration: 0.1s;
|
||||
transition-timing-function: ease-out;
|
||||
|
||||
&:hover {
|
||||
color: var(--header-home-hover-font-color) !important;
|
||||
}
|
||||
|
||||
&:link,
|
||||
&:visited {
|
||||
color: inherit;
|
||||
}
|
||||
}
|
||||
|
||||
.header_nav_bar {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
flex-wrap: wrap;
|
||||
justify-content: end;
|
||||
align-items: stretch;
|
||||
column-gap: 1rem;
|
||||
|
||||
.nav_link {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-around;
|
||||
color: var(--header-nav-regular-font-color);
|
||||
background: var(--header-nav-regular-background-color);
|
||||
padding: 0 0.5rem;
|
||||
transition-property: background, color;
|
||||
transition-duration: 0.1s;
|
||||
transition-timing-function: ease-out;
|
||||
|
||||
&:hover {
|
||||
color: var(--header-nav-hover-font-color);
|
||||
background: var(--header-nav-hover-background-color);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.main_content {
|
||||
width: 100%;
|
||||
max-width: var(--main-max-width);
|
||||
font-size: 1.2rem;
|
||||
line-height: 1.4;
|
||||
padding-bottom: 8rem;
|
||||
|
||||
/* A stand-alone blog post (not in a blog stream). */
|
||||
.blog_post {
|
||||
padding: 1rem 0.2rem 0 0.2rem;
|
||||
background: var(--blog-post-background-color);
|
||||
}
|
||||
|
||||
.blog_stream {
|
||||
.stream_divider {
|
||||
color: var(--stream-divider-color);
|
||||
margin: 40px 0;
|
||||
}
|
||||
|
||||
.stream_nav {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
> a {
|
||||
display: inline-block;
|
||||
padding: 0.2rem 0.5rem;
|
||||
font-weight: 700;
|
||||
font-size: 1.5rem;
|
||||
}
|
||||
> .spacer {
|
||||
display: inline-block;
|
||||
flex: 1 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* A blog post in a blog stream (for example, the homepage). */
|
||||
.blog_stream_post {
|
||||
background: var(--stream-post-background-color);
|
||||
padding: 0 0.2rem;
|
||||
}
|
||||
|
||||
.blog_stream_post {
|
||||
background: var(--stream-post-background-color);
|
||||
}
|
||||
|
||||
.blog_stream_post:nth-child(1) {
|
||||
padding-top: 1rem;
|
||||
}
|
||||
|
||||
.blog_post_title {
|
||||
font-size: 2.9rem;
|
||||
font-weight: 700;
|
||||
padding-bottom: 1rem;
|
||||
}
|
||||
|
||||
p {
|
||||
margin: 1rem 0;
|
||||
|
||||
&.image {
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
|
||||
.src_block {
|
||||
background: var(--src-block-background-color);
|
||||
border-radius: 3px;
|
||||
border: 1px solid var(--src-block-border-color);
|
||||
font-size: 1rem;
|
||||
font-family: var(--src-font-family);
|
||||
margin: 1rem 0;
|
||||
font-variant-ligatures: none;
|
||||
|
||||
.src_language {
|
||||
display: inline-block;
|
||||
color: var(--src-block-language-color);
|
||||
background: var(--src-block-language-background);
|
||||
border-radius: 0 0 3px 0;
|
||||
padding: 0.1rem 0.5rem;
|
||||
font-size: 0.8rem;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
.src_body {
|
||||
margin: 0.5rem;
|
||||
|
||||
.src_line {
|
||||
white-space: pre-wrap;
|
||||
overflow-wrap: anywhere;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.inline_source_block {
|
||||
font-family: var(--src-font-family);
|
||||
font-size: 1.2rem;
|
||||
font-variant-ligatures: none;
|
||||
}
|
||||
|
||||
.code,
|
||||
.verbatim {
|
||||
font-family: var(--src-font-family);
|
||||
font-variant-ligatures: none;
|
||||
}
|
||||
|
||||
.quote_block {
|
||||
border-left: 1px solid var(--quote-block-border-color);
|
||||
padding: 0 0 0 1rem;
|
||||
margin: 1rem 0 1rem 2rem;
|
||||
}
|
||||
|
||||
h2,
|
||||
h3 {
|
||||
margin: 1rem 0;
|
||||
padding-bottom: 0.5rem;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: 2.3rem;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
h3 {
|
||||
font-size: 2.1rem;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.plain_list {
|
||||
&.unordered {
|
||||
list-style-type: disc;
|
||||
padding-left: 2.5rem;
|
||||
}
|
||||
|
||||
&.ordered {
|
||||
list-style-type: decimal;
|
||||
padding-left: 2.5rem;
|
||||
}
|
||||
|
||||
&.descriptive {
|
||||
font-size: 1rem;
|
||||
> dt {
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
> dd {
|
||||
padding-left: 2.5rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.footnote_reference {
|
||||
vertical-align: super;
|
||||
font-size: 80%;
|
||||
> a {
|
||||
text-decoration: none;
|
||||
}
|
||||
}
|
||||
|
||||
.footnote_definition {
|
||||
.label {
|
||||
text-decoration: none;
|
||||
}
|
||||
.definition {
|
||||
display: inline;
|
||||
|
||||
> p {
|
||||
display: inline;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.org_table {
|
||||
table-layout: fixed;
|
||||
border-collapse: collapse;
|
||||
border: 1px solid var(--table-border-color);
|
||||
> tbody {
|
||||
border-width: 1px 0;
|
||||
border-style: solid;
|
||||
border-color: var(--table-border-color);
|
||||
> tr {
|
||||
> td {
|
||||
padding: 0.2rem;
|
||||
}
|
||||
}
|
||||
> tr:nth-child(odd) {
|
||||
background-color: var(--table-odd-background-color);
|
||||
}
|
||||
> tr:nth-child(even) {
|
||||
background-color: var(--table-even-background-color);
|
||||
}
|
||||
}
|
||||
> thead {
|
||||
border-width: 1px 0;
|
||||
border-style: solid;
|
||||
border-color: var(--table-border-color);
|
||||
> tr {
|
||||
> th {
|
||||
padding: 0.2rem;
|
||||
font-weight: 600;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
b {
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
/* Never have media larger than its container */
|
||||
img,
|
||||
picture,
|
||||
video {
|
||||
max-width: 100%;
|
||||
}
|
||||
}
|
||||
129
default_environment/stylesheet/reset.css
Normal file
129
default_environment/stylesheet/reset.css
Normal file
@@ -0,0 +1,129 @@
|
||||
/* http://meyerweb.com/eric/tools/css/reset/
|
||||
v2.0 | 20110126
|
||||
License: none (public domain)
|
||||
*/
|
||||
|
||||
html,
|
||||
body,
|
||||
div,
|
||||
span,
|
||||
applet,
|
||||
object,
|
||||
iframe,
|
||||
h1,
|
||||
h2,
|
||||
h3,
|
||||
h4,
|
||||
h5,
|
||||
h6,
|
||||
p,
|
||||
blockquote,
|
||||
pre,
|
||||
a,
|
||||
abbr,
|
||||
acronym,
|
||||
address,
|
||||
big,
|
||||
cite,
|
||||
code,
|
||||
del,
|
||||
dfn,
|
||||
em,
|
||||
img,
|
||||
ins,
|
||||
kbd,
|
||||
q,
|
||||
s,
|
||||
samp,
|
||||
small,
|
||||
strike,
|
||||
strong,
|
||||
sub,
|
||||
sup,
|
||||
tt,
|
||||
var,
|
||||
b,
|
||||
u,
|
||||
i,
|
||||
center,
|
||||
dl,
|
||||
dt,
|
||||
dd,
|
||||
ol,
|
||||
ul,
|
||||
li,
|
||||
fieldset,
|
||||
form,
|
||||
label,
|
||||
legend,
|
||||
table,
|
||||
caption,
|
||||
tbody,
|
||||
tfoot,
|
||||
thead,
|
||||
tr,
|
||||
th,
|
||||
td,
|
||||
article,
|
||||
aside,
|
||||
canvas,
|
||||
details,
|
||||
embed,
|
||||
figure,
|
||||
figcaption,
|
||||
footer,
|
||||
header,
|
||||
hgroup,
|
||||
menu,
|
||||
nav,
|
||||
output,
|
||||
ruby,
|
||||
section,
|
||||
summary,
|
||||
time,
|
||||
mark,
|
||||
audio,
|
||||
video {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
border: 0;
|
||||
font-size: 100%;
|
||||
font: inherit;
|
||||
vertical-align: baseline;
|
||||
}
|
||||
/* HTML5 display-role reset for older browsers */
|
||||
article,
|
||||
aside,
|
||||
details,
|
||||
figcaption,
|
||||
figure,
|
||||
footer,
|
||||
header,
|
||||
hgroup,
|
||||
menu,
|
||||
nav,
|
||||
section {
|
||||
display: block;
|
||||
}
|
||||
body {
|
||||
line-height: 1;
|
||||
}
|
||||
ol,
|
||||
ul {
|
||||
list-style: none;
|
||||
}
|
||||
blockquote,
|
||||
q {
|
||||
quotes: none;
|
||||
}
|
||||
blockquote:before,
|
||||
blockquote:after,
|
||||
q:before,
|
||||
q:after {
|
||||
content: "";
|
||||
content: none;
|
||||
}
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
border-spacing: 0;
|
||||
}
|
||||
1
default_environment/templates/html/angle_link.dust
Normal file
1
default_environment/templates/html/angle_link.dust
Normal file
@@ -0,0 +1 @@
|
||||
!!!!!!!! angle_link
|
||||
58
default_environment/templates/html/ast_node.dust
Normal file
58
default_environment/templates/html/ast_node.dust
Normal file
@@ -0,0 +1,58 @@
|
||||
{@select key=.type}
|
||||
{@eq value="heading"}{>heading/}{/eq}
|
||||
{@eq value="section"}{>section/}{/eq}
|
||||
{@eq value="paragraph"}{>paragraph/}{/eq}
|
||||
{@eq value="plain_list"}{>plain_list/}{/eq}
|
||||
{@eq value="center_block"}{>center_block/}{/eq}
|
||||
{@eq value="quote_block"}{>quote_block/}{/eq}
|
||||
{@eq value="special_block"}{>special_block/}{/eq}
|
||||
{@eq value="dynamic_block"}{>dynamic_block/}{/eq}
|
||||
{@eq value="footnote_definition"}{>footnote_definition/}{/eq}
|
||||
{@eq value="comment"}{>comment/}{/eq}
|
||||
{@eq value="drawer"}{>drawer/}{/eq}
|
||||
{@eq value="property_drawer"}{>property_drawer/}{/eq}
|
||||
{@eq value="table"}{>table/}{/eq}
|
||||
{@eq value="verse_block"}{>verse_block/}{/eq}
|
||||
{@eq value="comment_block"}{>comment_block/}{/eq}
|
||||
{@eq value="example_block"}{>example_block/}{/eq}
|
||||
{@eq value="export_block"}{>export_block/}{/eq}
|
||||
{@eq value="src_block"}{>src_block/}{/eq}
|
||||
{@eq value="clock"}{>clock/}{/eq}
|
||||
{@eq value="diary_sexp"}{>diary_sexp/}{/eq}
|
||||
{@eq value="planning"}{>planning/}{/eq}
|
||||
{@eq value="fixed_width_area"}{>fixed_width_area/}{/eq}
|
||||
{@eq value="horizontal_rule"}{>horizontal_rule/}{/eq}
|
||||
{@eq value="keyword"}{>keyword/}{/eq}
|
||||
{@eq value="babel_call"}{>babel_call/}{/eq}
|
||||
{@eq value="latex_environment"}{>latex_environment/}{/eq}
|
||||
{@eq value="bold"}{>bold/}{/eq}
|
||||
{@eq value="italic"}{>italic/}{/eq}
|
||||
{@eq value="underline"}{>underline/}{/eq}
|
||||
{@eq value="strike_through"}{>strike_through/}{/eq}
|
||||
{@eq value="code"}{>code/}{/eq}
|
||||
{@eq value="verbatim"}{>verbatim/}{/eq}
|
||||
{@eq value="plain_text"}{>plain_text/}{/eq}
|
||||
{@eq value="regular_link_anchor"}{>regular_link_anchor/}{/eq}
|
||||
{@eq value="regular_link_image"}{>regular_link_image/}{/eq}
|
||||
{@eq value="radio_link"}{>radio_link/}{/eq}
|
||||
{@eq value="radio_target"}{>radio_target/}{/eq}
|
||||
{@eq value="plain_link"}{>plain_link/}{/eq}
|
||||
{@eq value="angle_link"}{>angle_link/}{/eq}
|
||||
{@eq value="org_macro"}{>org_macro/}{/eq}
|
||||
{@eq value="entity"}{>entity/}{/eq}
|
||||
{@eq value="latex_fragment"}{>latex_fragment/}{/eq}
|
||||
{@eq value="export_snippet"}{>export_snippet/}{/eq}
|
||||
{@eq value="footnote_reference"}{>footnote_reference/}{/eq}
|
||||
{@eq value="citation"}{>citation/}{/eq}
|
||||
{@eq value="citation_reference"}{>citation_reference/}{/eq}
|
||||
{@eq value="inline_babel_call"}{>inline_babel_call/}{/eq}
|
||||
{@eq value="inline_source_block"}{>inline_source_block/}{/eq}
|
||||
{@eq value="line_break"}{>line_break/}{/eq}
|
||||
{@eq value="target"}{>target/}{/eq}
|
||||
{@eq value="statistics_cookie"}{>statistics_cookie/}{/eq}
|
||||
{@eq value="subscript"}{>subscript/}{/eq}
|
||||
{@eq value="superscript"}{>superscript/}{/eq}
|
||||
{@eq value="timestamp"}{>timestamp/}{/eq}
|
||||
{@none}{!TODO: make this panic!}ERROR: Unrecognized type {.type}.{/none}
|
||||
{/select}
|
||||
{! TODO: Maybe the final space should be conditional on end blank in the org source !}
|
||||
1
default_environment/templates/html/babel_call.dust
Normal file
1
default_environment/templates/html/babel_call.dust
Normal file
@@ -0,0 +1 @@
|
||||
!!!!!!!! babel_call
|
||||
@@ -1,5 +1,19 @@
|
||||
<div class="blog_post">
|
||||
<div class="blog_post_intro">
|
||||
{?.title}{?.self_link}<a class="blog_post_title" href="{.link}">{.title}</a>{:else}<div class="blog_post_title">{.title}</div>{/.self_link}{/.title}
|
||||
</div>
|
||||
<article class="blog_post">
|
||||
{?.title}<h1 class="blog_post_title"><span>{.title}</span></h1>{/.title}
|
||||
{! TODO: date? !}
|
||||
|
||||
{! TODO: Table of contents? !}
|
||||
|
||||
<div class="blog_post_body">
|
||||
{#.children}
|
||||
{>document_element/}
|
||||
{/.children}
|
||||
|
||||
{?.footnotes}
|
||||
<h2>Footnotes:</h2>
|
||||
{#.footnotes}
|
||||
{>real_footnote_definition/}
|
||||
{/.footnotes}
|
||||
{/.footnotes}
|
||||
</div>
|
||||
</article>
|
||||
|
||||
34
default_environment/templates/html/blog_stream.dust
Normal file
34
default_environment/templates/html/blog_stream.dust
Normal file
@@ -0,0 +1,34 @@
|
||||
<div class="blog_stream">
|
||||
{#.children}
|
||||
{@gt key=$idx value=0}<hr class="stream_divider" />{/gt}
|
||||
<div class="blog_stream_post">
|
||||
<div class="blog_post_intro">
|
||||
{?.title}{?.self_link}<a class="blog_post_title" href="{.self_link}">{.title}</a>{:else}<div class="blog_post_title">{.title}</div>{/.self_link}{/.title}
|
||||
{! TODO: date? !}
|
||||
</div>
|
||||
|
||||
{! TODO: Table of contents? !}
|
||||
|
||||
<div class="blog_post_body">
|
||||
{#.children}
|
||||
{>document_element/}
|
||||
{/.children}
|
||||
|
||||
{?.footnotes}
|
||||
<h2>Footnotes:</h2>
|
||||
{#.footnotes}
|
||||
{>real_footnote_definition/}
|
||||
{/.footnotes}
|
||||
{/.footnotes}
|
||||
</div>
|
||||
</div>
|
||||
{/.children}
|
||||
{#.stream_pagination}
|
||||
<hr class="stream_divider" />
|
||||
<div class="stream_nav">
|
||||
{?.older_link}<a href="{.older_link}">Older</a>{/.older_link}
|
||||
<div class="spacer"></div>
|
||||
{?.newer_link}<a href="{.newer_link}">Newer</a>{/.newer_link}
|
||||
</div>
|
||||
{/.stream_pagination}
|
||||
</div>
|
||||
3
default_environment/templates/html/bold.dust
Normal file
3
default_environment/templates/html/bold.dust
Normal file
@@ -0,0 +1,3 @@
|
||||
<b>{#.children}
|
||||
{>object/}
|
||||
{/.children}</b>
|
||||
1
default_environment/templates/html/center_block.dust
Normal file
1
default_environment/templates/html/center_block.dust
Normal file
@@ -0,0 +1 @@
|
||||
!!!!!!!! center_block
|
||||
1
default_environment/templates/html/citation.dust
Normal file
1
default_environment/templates/html/citation.dust
Normal file
@@ -0,0 +1 @@
|
||||
!!!!!!!! citation
|
||||
@@ -0,0 +1 @@
|
||||
!!!!!!!! citation_reference
|
||||
1
default_environment/templates/html/clock.dust
Normal file
1
default_environment/templates/html/clock.dust
Normal file
@@ -0,0 +1 @@
|
||||
!!!!!!!! clock
|
||||
1
default_environment/templates/html/code.dust
Normal file
1
default_environment/templates/html/code.dust
Normal file
@@ -0,0 +1 @@
|
||||
<code class="code">{.contents}</code>
|
||||
1
default_environment/templates/html/comment.dust
Normal file
1
default_environment/templates/html/comment.dust
Normal file
@@ -0,0 +1 @@
|
||||
{! noop !}
|
||||
1
default_environment/templates/html/comment_block.dust
Normal file
1
default_environment/templates/html/comment_block.dust
Normal file
@@ -0,0 +1 @@
|
||||
{! noop !}
|
||||
1
default_environment/templates/html/diary_sexp.dust
Normal file
1
default_environment/templates/html/diary_sexp.dust
Normal file
@@ -0,0 +1 @@
|
||||
!!!!!!!! diary_sexp
|
||||
5
default_environment/templates/html/document_element.dust
Normal file
5
default_environment/templates/html/document_element.dust
Normal file
@@ -0,0 +1,5 @@
|
||||
{@select key=.type}
|
||||
{@eq value="heading"}{>heading/}{/eq}
|
||||
{@eq value="section"}{>section/}{/eq}
|
||||
{@none}{!TODO: make this panic!}ERROR: Unrecognized type {.type}.{/none}
|
||||
{/select}
|
||||
1
default_environment/templates/html/drawer.dust
Normal file
1
default_environment/templates/html/drawer.dust
Normal file
@@ -0,0 +1 @@
|
||||
!!!!!!!! drawer
|
||||
1
default_environment/templates/html/dynamic_block.dust
Normal file
1
default_environment/templates/html/dynamic_block.dust
Normal file
@@ -0,0 +1 @@
|
||||
!!!!!!!! dynamic_block
|
||||
28
default_environment/templates/html/element.dust
Normal file
28
default_environment/templates/html/element.dust
Normal file
@@ -0,0 +1,28 @@
|
||||
{@select key=.type}
|
||||
{@eq value="paragraph"}{>paragraph/}{/eq}
|
||||
{@eq value="plain_list"}{>plain_list/}{/eq}
|
||||
{@eq value="plain_list_simple_item"}{>plain_list_simple_item/}{/eq}
|
||||
{@eq value="center_block"}{>center_block/}{/eq}
|
||||
{@eq value="quote_block"}{>quote_block/}{/eq}
|
||||
{@eq value="special_block"}{>special_block/}{/eq}
|
||||
{@eq value="dynamic_block"}{>dynamic_block/}{/eq}
|
||||
{@eq value="footnote_definition"}{>footnote_definition/}{/eq}
|
||||
{@eq value="comment"}{>comment/}{/eq}
|
||||
{@eq value="drawer"}{>drawer/}{/eq}
|
||||
{@eq value="property_drawer"}{>property_drawer/}{/eq}
|
||||
{@eq value="table"}{>table/}{/eq}
|
||||
{@eq value="verse_block"}{>verse_block/}{/eq}
|
||||
{@eq value="comment_block"}{>comment_block/}{/eq}
|
||||
{@eq value="example_block"}{>example_block/}{/eq}
|
||||
{@eq value="export_block"}{>export_block/}{/eq}
|
||||
{@eq value="src_block"}{>src_block/}{/eq}
|
||||
{@eq value="clock"}{>clock/}{/eq}
|
||||
{@eq value="diary_sexp"}{>diary_sexp/}{/eq}
|
||||
{@eq value="planning"}{>planning/}{/eq}
|
||||
{@eq value="fixed_width_area"}{>fixed_width_area/}{/eq}
|
||||
{@eq value="horizontal_rule"}{>horizontal_rule/}{/eq}
|
||||
{@eq value="keyword"}{>keyword/}{/eq}
|
||||
{@eq value="babel_call"}{>babel_call/}{/eq}
|
||||
{@eq value="latex_environment"}{>latex_environment/}{/eq}
|
||||
{@none}{!TODO: make this panic!}ERROR: Unrecognized type {.type}.{/none}
|
||||
{/select}
|
||||
1
default_environment/templates/html/entity.dust
Normal file
1
default_environment/templates/html/entity.dust
Normal file
@@ -0,0 +1 @@
|
||||
{.html|s}
|
||||
1
default_environment/templates/html/example_block.dust
Normal file
1
default_environment/templates/html/example_block.dust
Normal file
@@ -0,0 +1 @@
|
||||
!!!!!!!! example_block
|
||||
1
default_environment/templates/html/export_block.dust
Normal file
1
default_environment/templates/html/export_block.dust
Normal file
@@ -0,0 +1 @@
|
||||
!!!!!!!! export_block
|
||||
1
default_environment/templates/html/export_snippet.dust
Normal file
1
default_environment/templates/html/export_snippet.dust
Normal file
@@ -0,0 +1 @@
|
||||
!!!!!!!! export_snippet
|
||||
1
default_environment/templates/html/fixed_width_area.dust
Normal file
1
default_environment/templates/html/fixed_width_area.dust
Normal file
@@ -0,0 +1 @@
|
||||
!!!!!!!! fixed_width_area
|
||||
@@ -0,0 +1 @@
|
||||
{! noop !}
|
||||
@@ -0,0 +1 @@
|
||||
<sup class="footnote_reference"><a id="{.reference_id}" href="{.definition_link}">{.label}</a></sup>
|
||||
1
default_environment/templates/html/global_settings.dust
Normal file
1
default_environment/templates/html/global_settings.dust
Normal file
@@ -0,0 +1 @@
|
||||
!!!!!!!! global_settings
|
||||
11
default_environment/templates/html/heading.dust
Normal file
11
default_environment/templates/html/heading.dust
Normal file
@@ -0,0 +1,11 @@
|
||||
{@lte key=.level value=4}
|
||||
<h{.level}>{#.title}{>object/}{/.title}</h{.level}>
|
||||
{:else}
|
||||
<ol>
|
||||
<li>{#.title}{>object/}{/.title}</li>
|
||||
</ol>
|
||||
{/lte}
|
||||
|
||||
{#.children}
|
||||
{>document_element/}
|
||||
{/.children}
|
||||
1
default_environment/templates/html/horizontal_rule.dust
Normal file
1
default_environment/templates/html/horizontal_rule.dust
Normal file
@@ -0,0 +1 @@
|
||||
!!!!!!!! horizontal_rule
|
||||
@@ -0,0 +1 @@
|
||||
!!!!!!!! inline_babel_call
|
||||
@@ -0,0 +1 @@
|
||||
<code class="inline_source_block">{.value}</code>
|
||||
3
default_environment/templates/html/italic.dust
Normal file
3
default_environment/templates/html/italic.dust
Normal file
@@ -0,0 +1,3 @@
|
||||
<i>{#.children}
|
||||
{>object/}
|
||||
{/.children}</i>
|
||||
1
default_environment/templates/html/keyword.dust
Normal file
1
default_environment/templates/html/keyword.dust
Normal file
@@ -0,0 +1 @@
|
||||
{! noop !}
|
||||
@@ -0,0 +1 @@
|
||||
!!!!!!!! latex_environment
|
||||
2
default_environment/templates/html/latex_fragment.dust
Normal file
2
default_environment/templates/html/latex_fragment.dust
Normal file
@@ -0,0 +1,2 @@
|
||||
{! TODO: Should I be including MathJax somewhere? !}
|
||||
{.value}
|
||||
1
default_environment/templates/html/line_break.dust
Normal file
1
default_environment/templates/html/line_break.dust
Normal file
@@ -0,0 +1 @@
|
||||
<br/>
|
||||
@@ -1,17 +1,21 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1" />
|
||||
{#global_settings.css_files}<link rel="stylesheet" href="{.}">{/global_settings.css_files}
|
||||
{#global_settings.js_files}<script type="text/javascript" src="{.}"></script>{/global_settings.js_files}
|
||||
{?global_settings.page_title}<title>{global_settings.page_title}</title>{/global_settings.page_title}
|
||||
</head>
|
||||
<body>
|
||||
<div class="main_content">
|
||||
<body class="page_centering">
|
||||
{#.page_header}{>page_header/}{/.page_header}
|
||||
<main class="main_content">
|
||||
{@select key=.type}
|
||||
{@eq value="page"}{>page/}{/eq}
|
||||
{@eq value="blog_post_page"}{>blog_post_page/}{/eq}
|
||||
{@eq value="blog_stream"}{>blog_stream/}{/eq}
|
||||
{@none}{!TODO: make this panic!}ERROR: Unrecognized page content type{/none}
|
||||
{/select}
|
||||
</div>
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
31
default_environment/templates/html/object.dust
Normal file
31
default_environment/templates/html/object.dust
Normal file
@@ -0,0 +1,31 @@
|
||||
{@select key=.type}
|
||||
{@eq value="bold"}{>bold/}{/eq}
|
||||
{@eq value="italic"}{>italic/}{/eq}
|
||||
{@eq value="underline"}{>underline/}{/eq}
|
||||
{@eq value="strike_through"}{>strike_through/}{/eq}
|
||||
{@eq value="code"}{>code/}{/eq}
|
||||
{@eq value="verbatim"}{>verbatim/}{/eq}
|
||||
{@eq value="plain_text"}{>plain_text/}{/eq}
|
||||
{@eq value="regular_link_anchor"}{>regular_link_anchor/}{/eq}
|
||||
{@eq value="regular_link_image"}{>regular_link_image/}{/eq}
|
||||
{@eq value="radio_link"}{>radio_link/}{/eq}
|
||||
{@eq value="radio_target"}{>radio_target/}{/eq}
|
||||
{@eq value="plain_link"}{>plain_link/}{/eq}
|
||||
{@eq value="angle_link"}{>angle_link/}{/eq}
|
||||
{@eq value="org_macro"}{>org_macro/}{/eq}
|
||||
{@eq value="entity"}{>entity/}{/eq}
|
||||
{@eq value="latex_fragment"}{>latex_fragment/}{/eq}
|
||||
{@eq value="export_snippet"}{>export_snippet/}{/eq}
|
||||
{@eq value="footnote_reference"}{>footnote_reference/}{/eq}
|
||||
{@eq value="citation"}{>citation/}{/eq}
|
||||
{@eq value="citation_reference"}{>citation_reference/}{/eq}
|
||||
{@eq value="inline_babel_call"}{>inline_babel_call/}{/eq}
|
||||
{@eq value="inline_source_block"}{>inline_source_block/}{/eq}
|
||||
{@eq value="line_break"}{>line_break/}{/eq}
|
||||
{@eq value="target"}{>target/}{/eq}
|
||||
{@eq value="statistics_cookie"}{>statistics_cookie/}{/eq}
|
||||
{@eq value="subscript"}{>subscript/}{/eq}
|
||||
{@eq value="superscript"}{>superscript/}{/eq}
|
||||
{@eq value="timestamp"}{>timestamp/}{/eq}
|
||||
{@none}{!TODO: make this panic!}ERROR: Unrecognized type {.type}.{/none}
|
||||
{/select}{@gt key=.post_blank value=0}{~s}{/gt}
|
||||
1
default_environment/templates/html/org_macro.dust
Normal file
1
default_environment/templates/html/org_macro.dust
Normal file
@@ -0,0 +1 @@
|
||||
!!!!!!!! org_macro
|
||||
19
default_environment/templates/html/page.dust
Normal file
19
default_environment/templates/html/page.dust
Normal file
@@ -0,0 +1,19 @@
|
||||
<article class="page">
|
||||
{?.title}<h1 class="blog_post_title"><span>{.title}</span></h1>{/.title}
|
||||
{! TODO: date? !}
|
||||
|
||||
{! TODO: Table of contents? !}
|
||||
|
||||
<div class="blog_post_body">
|
||||
{#.children}
|
||||
{>document_element/}
|
||||
{/.children}
|
||||
|
||||
{?.footnotes}
|
||||
<h2>Footnotes:</h2>
|
||||
{#.footnotes}
|
||||
{>real_footnote_definition/}
|
||||
{/.footnotes}
|
||||
{/.footnotes}
|
||||
</div>
|
||||
</article>
|
||||
9
default_environment/templates/html/page_header.dust
Normal file
9
default_environment/templates/html/page_header.dust
Normal file
@@ -0,0 +1,9 @@
|
||||
<header class="page_header">
|
||||
<a class="home_link" href="{.home_link}">{.website_title}</a>
|
||||
{! TODO: Additional links? Probably using the nav semantic element. !}
|
||||
<nav class="header_nav_bar">
|
||||
{#.nav_links}
|
||||
<a class="nav_link" href="{.url}"><div>{.text}</div></a>
|
||||
{/.nav_links}
|
||||
</nav>
|
||||
</header>
|
||||
3
default_environment/templates/html/paragraph.dust
Normal file
3
default_environment/templates/html/paragraph.dust
Normal file
@@ -0,0 +1,3 @@
|
||||
<p class="{?.is_single_image}image{/.is_single_image}">{#.children}
|
||||
{>object/}
|
||||
{/.children}</p>
|
||||
1
default_environment/templates/html/plain_link.dust
Normal file
1
default_environment/templates/html/plain_link.dust
Normal file
@@ -0,0 +1 @@
|
||||
<a href="{.raw_link}">{.raw_link}</a>
|
||||
6
default_environment/templates/html/plain_list.dust
Normal file
6
default_environment/templates/html/plain_list.dust
Normal file
@@ -0,0 +1,6 @@
|
||||
{@select key=.list_type}
|
||||
{@eq value="unordered"}<ul class="plain_list unordered">{#.children}{>plain_list_item/}{/.children}</ul>{/eq}
|
||||
{@eq value="ordered"}<ol class="plain_list ordered">{#.children}{>plain_list_item/}{/.children}</ol>{/eq}
|
||||
{@eq value="descriptive"}<dl class="plain_list descriptive">{#.children}{>plain_list_item/}{/.children}</dl>{/eq}
|
||||
{@none}{!TODO: make this panic!}ERROR: Unrecognized list type {.list_type}.{/none}
|
||||
{/select}
|
||||
6
default_environment/templates/html/plain_list_item.dust
Normal file
6
default_environment/templates/html/plain_list_item.dust
Normal file
@@ -0,0 +1,6 @@
|
||||
{@select key=list_type}
|
||||
{@eq value="unordered"}<li>{#.children}{>element/}{/.children}</li>{/eq}
|
||||
{@eq value="ordered"}<li>{#.children}{>element/}{/.children}</li>{/eq}
|
||||
{@eq value="descriptive"}<dt>{#.tag}{>object/}{/.tag}</dt><dd>{#.children}{>element/}{/.children}</dd>{/eq}
|
||||
{@none}{!TODO: make this panic!}ERROR: Unrecognized list type {.list_type}.{/none}
|
||||
{/select}
|
||||
@@ -0,0 +1,3 @@
|
||||
{#.children}
|
||||
{>object/}
|
||||
{/.children}
|
||||
1
default_environment/templates/html/plain_text.dust
Normal file
1
default_environment/templates/html/plain_text.dust
Normal file
@@ -0,0 +1 @@
|
||||
{.source}
|
||||
1
default_environment/templates/html/planning.dust
Normal file
1
default_environment/templates/html/planning.dust
Normal file
@@ -0,0 +1 @@
|
||||
!!!!!!!! planning
|
||||
1
default_environment/templates/html/property_drawer.dust
Normal file
1
default_environment/templates/html/property_drawer.dust
Normal file
@@ -0,0 +1 @@
|
||||
!!!!!!!! property_drawer
|
||||
3
default_environment/templates/html/quote_block.dust
Normal file
3
default_environment/templates/html/quote_block.dust
Normal file
@@ -0,0 +1,3 @@
|
||||
<blockquote class="quote_block">{#.children}
|
||||
{>element/}
|
||||
{/.children}</blockquote>
|
||||
1
default_environment/templates/html/radio_link.dust
Normal file
1
default_environment/templates/html/radio_link.dust
Normal file
@@ -0,0 +1 @@
|
||||
!!!!!!!! radio_link
|
||||
1
default_environment/templates/html/radio_target.dust
Normal file
1
default_environment/templates/html/radio_target.dust
Normal file
@@ -0,0 +1 @@
|
||||
!!!!!!!! radio_target
|
||||
@@ -0,0 +1 @@
|
||||
<div class="footnote_definition"><a id="{.definition_id}" href="{.reference_link}" class="label">{.label}.</a> <div class="definition">{#.contents}{>ast_node/}{/.contents}</div></div>
|
||||
@@ -0,0 +1 @@
|
||||
<a href="{.target}">{#.children}{>object/}{/.children}</a>
|
||||
@@ -0,0 +1 @@
|
||||
<img src="{.src}" alt="{.alt}" />
|
||||
3
default_environment/templates/html/section.dust
Normal file
3
default_environment/templates/html/section.dust
Normal file
@@ -0,0 +1,3 @@
|
||||
{#.children}
|
||||
{>element/}
|
||||
{/.children}
|
||||
1
default_environment/templates/html/special_block.dust
Normal file
1
default_environment/templates/html/special_block.dust
Normal file
@@ -0,0 +1 @@
|
||||
!!!!!!!! special_block
|
||||
17
default_environment/templates/html/src_block.dust
Normal file
17
default_environment/templates/html/src_block.dust
Normal file
@@ -0,0 +1,17 @@
|
||||
<div class="src_block{?.language} srclg_{.language}{/.language}">
|
||||
{?.language}<div class="src_language">{.language}</div>{/.language}
|
||||
<table class="src_body">
|
||||
<tbody>
|
||||
{#.lines}
|
||||
<tr>
|
||||
<td>{#.children}{@select key=.type}
|
||||
{@eq value="raw_text"}<code class="src_line">{.content}</code>{/eq}
|
||||
{@eq value="highlight_start"}<span class="srchl_{.name}">{/eq}
|
||||
{@eq value="highlight_end"}</span>{/eq}
|
||||
{@none}{!TODO: make this panic!}ERROR: Unrecognized type {.type}.{/none}
|
||||
{/select}{/.children}</td>
|
||||
</tr>
|
||||
{/.lines}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
@@ -0,0 +1 @@
|
||||
!!!!!!!! statistics_cookie
|
||||
3
default_environment/templates/html/strike_through.dust
Normal file
3
default_environment/templates/html/strike_through.dust
Normal file
@@ -0,0 +1,3 @@
|
||||
<del>{#.children}
|
||||
{>object/}
|
||||
{/.children}</del>
|
||||
1
default_environment/templates/html/subscript.dust
Normal file
1
default_environment/templates/html/subscript.dust
Normal file
@@ -0,0 +1 @@
|
||||
!!!!!!!! subscript
|
||||
1
default_environment/templates/html/superscript.dust
Normal file
1
default_environment/templates/html/superscript.dust
Normal file
@@ -0,0 +1 @@
|
||||
!!!!!!!! superscript
|
||||
5
default_environment/templates/html/table.dust
Normal file
5
default_environment/templates/html/table.dust
Normal file
@@ -0,0 +1,5 @@
|
||||
<table class="org_table">{#.children}{@select key=.type}
|
||||
{@eq value="head"}{>table_head/}{/eq}
|
||||
{@eq value="body"}{>table_body/}{/eq}
|
||||
{@none}{!TODO: make this panic!}ERROR: Unrecognized type {.type}.{/none}
|
||||
{/select}{/.children}</table>
|
||||
1
default_environment/templates/html/table_body.dust
Normal file
1
default_environment/templates/html/table_body.dust
Normal file
@@ -0,0 +1 @@
|
||||
<tbody>{#.children}{>table_row/}{/.children}</tbody>
|
||||
1
default_environment/templates/html/table_cell.dust
Normal file
1
default_environment/templates/html/table_cell.dust
Normal file
@@ -0,0 +1 @@
|
||||
<td>{#.children}{>object/}{/.children}</td>
|
||||
1
default_environment/templates/html/table_head.dust
Normal file
1
default_environment/templates/html/table_head.dust
Normal file
@@ -0,0 +1 @@
|
||||
<thead>{#.children}{>table_head_row/}{/.children}</thead>
|
||||
1
default_environment/templates/html/table_head_cell.dust
Normal file
1
default_environment/templates/html/table_head_cell.dust
Normal file
@@ -0,0 +1 @@
|
||||
<th scope="col">{#.children}{>object/}{/.children}</th>
|
||||
1
default_environment/templates/html/table_head_row.dust
Normal file
1
default_environment/templates/html/table_head_row.dust
Normal file
@@ -0,0 +1 @@
|
||||
<tr>{#.children}{>table_head_cell/}{/.children}</tr>
|
||||
1
default_environment/templates/html/table_row.dust
Normal file
1
default_environment/templates/html/table_row.dust
Normal file
@@ -0,0 +1 @@
|
||||
<tr>{#.children}{>table_cell/}{/.children}</tr>
|
||||
1
default_environment/templates/html/target.dust
Normal file
1
default_environment/templates/html/target.dust
Normal file
@@ -0,0 +1 @@
|
||||
<a id="{.id}"></a>
|
||||
1
default_environment/templates/html/timestamp.dust
Normal file
1
default_environment/templates/html/timestamp.dust
Normal file
@@ -0,0 +1 @@
|
||||
<span class="timestamp">{.source}</span>
|
||||
3
default_environment/templates/html/underline.dust
Normal file
3
default_environment/templates/html/underline.dust
Normal file
@@ -0,0 +1,3 @@
|
||||
<u>{#.children}
|
||||
{>object/}
|
||||
{/.children}</u>
|
||||
1
default_environment/templates/html/verbatim.dust
Normal file
1
default_environment/templates/html/verbatim.dust
Normal file
@@ -0,0 +1 @@
|
||||
<code class="verbatim">{.contents}</code>
|
||||
1
default_environment/templates/html/verse_block.dust
Normal file
1
default_environment/templates/html/verse_block.dust
Normal file
@@ -0,0 +1 @@
|
||||
!!!!!!!! verse_block
|
||||
16
docker/natter/Dockerfile
Normal file
16
docker/natter/Dockerfile
Normal file
@@ -0,0 +1,16 @@
|
||||
# syntax=docker/dockerfile:1
|
||||
ARG ALPINE_VERSION="3.20"
|
||||
|
||||
FROM rustlang/rust:nightly-alpine$ALPINE_VERSION AS builder
|
||||
|
||||
RUN apk add --no-cache musl-dev
|
||||
|
||||
RUN mkdir /root/natter
|
||||
WORKDIR /root/natter
|
||||
COPY --link . .
|
||||
# TODO: Add static build, which currently errors due to proc_macro. RUSTFLAGS="-C target-feature=+crt-static"
|
||||
RUN --mount=type=tmpfs,target=/tmp --mount=type=cache,target=/usr/local/cargo/registry,sharing=locked CARGO_TARGET_DIR=/target cargo build --profile release-lto
|
||||
|
||||
FROM alpine:$ALPINE_VERSION AS runner
|
||||
|
||||
COPY --link --from=builder /target/release-lto/natter /usr/bin/
|
||||
32
docker/natter/Makefile
Normal file
32
docker/natter/Makefile
Normal file
@@ -0,0 +1,32 @@
|
||||
SHELL := bash
|
||||
.ONESHELL:
|
||||
.SHELLFLAGS := -eu -o pipefail -c
|
||||
.DELETE_ON_ERROR:
|
||||
MAKEFLAGS += --warn-undefined-variables
|
||||
MAKEFLAGS += --no-builtin-rules
|
||||
OS:=$(shell uname -s)
|
||||
|
||||
ifeq ($(origin .RECIPEPREFIX), undefined)
|
||||
$(error This Make does not support .RECIPEPREFIX. Please use GNU Make 4.0 or later)
|
||||
endif
|
||||
.RECIPEPREFIX = >
|
||||
|
||||
IMAGE_NAME:=natter
|
||||
TARGET :=
|
||||
|
||||
.PHONY: help
|
||||
help:
|
||||
> @grep -h "##" $(MAKEFILE_LIST) | grep -v grep | sed -E 's/^([^:]*): *## */\1: /'
|
||||
|
||||
.PHONY: build
|
||||
build: ## Build the docker image.
|
||||
> docker build --tag $(IMAGE_NAME) --target=$(TARGET) --file Dockerfile ../../
|
||||
|
||||
.PHONY: shell
|
||||
shell: ## Launch an interactive shell inside the docker image.
|
||||
shell: build
|
||||
> docker run --rm -i -t --entrypoint /bin/sh --mount type=tmpfs,destination=/tmp $(IMAGE_NAME)
|
||||
|
||||
.PHONY: clean
|
||||
clean:
|
||||
> docker rmi $(IMAGE_NAME)
|
||||
14
docker/natter_development/Dockerfile
Normal file
14
docker/natter_development/Dockerfile
Normal file
@@ -0,0 +1,14 @@
|
||||
# syntax=docker/dockerfile:1
|
||||
ARG ALPINE_VERSION="3.20"
|
||||
|
||||
FROM rustlang/rust:nightly-alpine$ALPINE_VERSION AS builder
|
||||
|
||||
RUN apk add --no-cache musl-dev
|
||||
RUN --mount=type=tmpfs,target=/tmp --mount=type=cache,target=/usr/local/cargo/registry,sharing=locked cargo install --locked --no-default-features --features ci-autoclean cargo-cache
|
||||
RUN rustup component add rustfmt
|
||||
RUN rustup component add clippy
|
||||
|
||||
FROM builder AS javascript
|
||||
|
||||
RUN apk add --no-cache npm
|
||||
RUN --mount=type=tmpfs,target=/tmp --mount=type=cache,target=/npmcache,sharing=locked npm set cache /npmcache && npm install --global prettier@3.1.0
|
||||
33
docker/natter_development/Makefile
Normal file
33
docker/natter_development/Makefile
Normal file
@@ -0,0 +1,33 @@
|
||||
SHELL := bash
|
||||
.ONESHELL:
|
||||
.SHELLFLAGS := -eu -o pipefail -c
|
||||
.DELETE_ON_ERROR:
|
||||
MAKEFLAGS += --warn-undefined-variables
|
||||
MAKEFLAGS += --no-builtin-rules
|
||||
|
||||
ifeq ($(origin .RECIPEPREFIX), undefined)
|
||||
$(error This Make does not support .RECIPEPREFIX. Please use GNU Make 4.0 or later)
|
||||
endif
|
||||
.RECIPEPREFIX = >
|
||||
|
||||
IMAGE_NAME:=natter-development
|
||||
TARGET :=
|
||||
|
||||
.PHONY: help
|
||||
help:
|
||||
> @grep -h "##" $(MAKEFILE_LIST) | grep -v grep | sed -E 's/^([^:]*): *## */\1: /'
|
||||
|
||||
.PHONY: build
|
||||
build: ## Build the docker image.
|
||||
> docker build --tag $(IMAGE_NAME) --target=$(TARGET) --file Dockerfile .
|
||||
> docker volume create natter-cargo-registry
|
||||
|
||||
.PHONY: shell
|
||||
shell: ## Launch an interactive shell inside the docker image with the source repository mounted at /source.
|
||||
shell: build
|
||||
> docker run --rm -i -t --entrypoint /bin/sh --mount type=tmpfs,destination=/tmp -v "$$(readlink -f ../../):/source" --workdir=/source --env CARGO_TARGET_DIR=/target -v "natter-cargo-registry:/usr/local/cargo/registry" $(IMAGE_NAME)
|
||||
|
||||
.PHONY: clean
|
||||
clean:
|
||||
> docker rmi $(IMAGE_NAME)
|
||||
> docker volume rm natter-cargo-registry
|
||||
21
org_test_documents/footnote/reference_in_definition.org
Normal file
21
org_test_documents/footnote/reference_in_definition.org
Normal file
@@ -0,0 +1,21 @@
|
||||
# This test shows that footnote references only count if the definition containing them is rendered.
|
||||
|
||||
foo[fn:a:bar]
|
||||
|
||||
[fn:a] lorem
|
||||
|
||||
[fn:b] ipsum
|
||||
|
||||
[fn:d] fizz
|
||||
|
||||
[fn:c] dolar
|
||||
|
||||
yo[fn:b]
|
||||
|
||||
|
||||
hello[fn:c]
|
||||
|
||||
|
||||
[fn:e] buzz
|
||||
|
||||
sup[fn:d]
|
||||
25
org_test_documents/footnote/simple.org
Normal file
25
org_test_documents/footnote/simple.org
Normal file
@@ -0,0 +1,25 @@
|
||||
# Test proves that:
|
||||
#
|
||||
# - Anonymous references with identical content get unique IDs.
|
||||
# - Unreferenced footnote definitions are dropped.
|
||||
# - Footnote definitions that come before their first reference are dropped.
|
||||
|
||||
foo[fn:2:something]
|
||||
|
||||
bar[fn::something]
|
||||
|
||||
baz[fn::something]
|
||||
|
||||
cat[fn::something]
|
||||
|
||||
dog[fn:3]
|
||||
|
||||
[fn:3] ipsum
|
||||
|
||||
[fn:4] lorem
|
||||
|
||||
[fn:3] dolar
|
||||
|
||||
[fn:5] not referenced
|
||||
|
||||
stuff[fn:4] and things
|
||||
36
org_test_documents/latex_fragment/notes.org
Normal file
36
org_test_documents/latex_fragment/notes.org
Normal file
@@ -0,0 +1,36 @@
|
||||
* Double dollar
|
||||
#+begin_src org
|
||||
$$CONTENTS$$
|
||||
#+end_src
|
||||
becomes
|
||||
#+begin_src text
|
||||
\[CONTENTS\]
|
||||
#+end_src
|
||||
|
||||
#+begin_src org
|
||||
$$1+1=2$$
|
||||
#+end_src
|
||||
|
||||
#+begin_src text
|
||||
\[1+1=2\]
|
||||
#+end_src
|
||||
|
||||
This gets interpreted by mathjax.
|
||||
* Single Dollar
|
||||
#+begin_src org
|
||||
PRE$BORDER1 BODY BORDER2$POST
|
||||
#+end_src
|
||||
becomes
|
||||
#+begin_src text
|
||||
\(BORDER1 BODY BORDER2\)
|
||||
#+end_src
|
||||
|
||||
#+begin_src org
|
||||
foo$a bar b$.
|
||||
#+end_src
|
||||
becomes
|
||||
#+begin_src text
|
||||
foo\(a bar b\).
|
||||
#+end_src
|
||||
|
||||
This gets interpreted by mathjax.
|
||||
22
org_test_documents/regular_link/image_links.org
Normal file
22
org_test_documents/regular_link/image_links.org
Normal file
@@ -0,0 +1,22 @@
|
||||
[[file:image.svg]]
|
||||
|
||||
[[file:/image.svg]]
|
||||
|
||||
[[file:./image.svg]]
|
||||
|
||||
[[/image.svg]]
|
||||
|
||||
[[./image.svg]]
|
||||
|
||||
# Check capitalization of extension
|
||||
[[./image.SVG]]
|
||||
|
||||
# Check spaces in path
|
||||
[[./image and stuff.SVG]]
|
||||
|
||||
[[/ssh:admin@test.example:important/file.svg]]
|
||||
|
||||
[[file:/ssh:admin@test.example:important/file.svg]]
|
||||
|
||||
# Check multiple parts in the path
|
||||
[[file:/foo/bar/baz/image.svg]]
|
||||
4
rust-toolchain.toml
Normal file
4
rust-toolchain.toml
Normal file
@@ -0,0 +1,4 @@
|
||||
[toolchain]
|
||||
channel = "nightly"
|
||||
profile = "default"
|
||||
components = ["clippy", "rustfmt"]
|
||||
@@ -1,92 +0,0 @@
|
||||
use std::path::Path;
|
||||
use std::path::PathBuf;
|
||||
|
||||
use tokio::task::JoinHandle;
|
||||
use walkdir::WalkDir;
|
||||
|
||||
use crate::error::CustomError;
|
||||
|
||||
use super::BlogPostPage;
|
||||
|
||||
#[derive(Debug)]
|
||||
pub(crate) struct BlogPost {
|
||||
pub(crate) id: String,
|
||||
pub(crate) pages: Vec<BlogPostPage>,
|
||||
}
|
||||
|
||||
impl BlogPost {
|
||||
pub(crate) async fn load_blog_post<P: AsRef<Path>, R: AsRef<Path>>(
|
||||
root_dir: R,
|
||||
post_dir: P,
|
||||
) -> Result<BlogPost, CustomError> {
|
||||
async fn inner(_root_dir: &Path, post_dir: &Path) -> Result<BlogPost, CustomError> {
|
||||
let post_id = post_dir
|
||||
.file_name()
|
||||
.expect("The post directory should have a name.");
|
||||
|
||||
let org_files = {
|
||||
let mut ret = Vec::new();
|
||||
let org_files_iter = get_org_files(post_dir)?;
|
||||
for entry in org_files_iter {
|
||||
ret.push(entry.await??);
|
||||
}
|
||||
ret
|
||||
};
|
||||
let parsed_org_files = {
|
||||
let mut ret = Vec::new();
|
||||
for (path, contents) in org_files.iter() {
|
||||
let parsed = organic::parser::parse_file(contents.as_str(), Some(path))
|
||||
.map_err(|_| CustomError::Static("Failed to parse org-mode document."))?;
|
||||
ret.push((path, contents, parsed));
|
||||
}
|
||||
ret
|
||||
};
|
||||
|
||||
let pages = {
|
||||
let mut ret = Vec::new();
|
||||
for (real_path, _contents, parsed_document) in parsed_org_files {
|
||||
let relative_to_post_dir_path = real_path.strip_prefix(post_dir)?;
|
||||
ret.push(BlogPostPage::new(
|
||||
relative_to_post_dir_path,
|
||||
parsed_document,
|
||||
)?);
|
||||
}
|
||||
ret
|
||||
};
|
||||
|
||||
Ok(BlogPost {
|
||||
id: post_id.to_string_lossy().into_owned(),
|
||||
pages,
|
||||
})
|
||||
}
|
||||
inner(root_dir.as_ref(), post_dir.as_ref()).await
|
||||
}
|
||||
}
|
||||
|
||||
async fn read_file(path: PathBuf) -> std::io::Result<(PathBuf, String)> {
|
||||
let contents = tokio::fs::read_to_string(&path).await?;
|
||||
Ok((path, contents))
|
||||
}
|
||||
|
||||
fn get_org_files<P: AsRef<Path>>(
|
||||
root_dir: P,
|
||||
) -> Result<impl Iterator<Item = JoinHandle<std::io::Result<(PathBuf, String)>>>, walkdir::Error> {
|
||||
let org_files = WalkDir::new(root_dir)
|
||||
.into_iter()
|
||||
.filter(|e| match e {
|
||||
Ok(dir_entry) => {
|
||||
dir_entry.file_type().is_file()
|
||||
&& Path::new(dir_entry.file_name())
|
||||
.extension()
|
||||
.map(|ext| ext.to_ascii_lowercase() == "org")
|
||||
.unwrap_or(false)
|
||||
}
|
||||
Err(_) => true,
|
||||
})
|
||||
.collect::<Result<Vec<_>, _>>()?;
|
||||
let org_files = org_files
|
||||
.into_iter()
|
||||
.map(walkdir::DirEntry::into_path)
|
||||
.map(|path| tokio::spawn(read_file(path)));
|
||||
Ok(org_files)
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
mod convert;
|
||||
mod definition;
|
||||
mod page;
|
||||
mod render_context;
|
||||
pub(crate) use convert::convert_blog_post_page_to_render_context;
|
||||
pub(crate) use definition::BlogPost;
|
||||
pub(crate) use page::BlogPostPage;
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user