Merge branch '145-build-system-rewrite' into fraport-corporate-design-icons
This commit is contained in:
commit
2a994bb714
@ -1 +0,0 @@
|
|||||||
**/*
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>
|
|
||||||
|
|
||||||
SPDX-License-Identifier: AGPL-3.0-or-later
|
|
||||||
2
.gitignore
vendored
2
.gitignore
vendored
@ -1,5 +1,6 @@
|
|||||||
dist*
|
dist*
|
||||||
node_modules/
|
node_modules/
|
||||||
|
bin/
|
||||||
*.hi
|
*.hi
|
||||||
*.o
|
*.o
|
||||||
*.sqlite3
|
*.sqlite3
|
||||||
@ -34,6 +35,7 @@ test.log
|
|||||||
*.dump-splices
|
*.dump-splices
|
||||||
/.stack-work.lock
|
/.stack-work.lock
|
||||||
/.npmrc
|
/.npmrc
|
||||||
|
/.npm/
|
||||||
/config/webpack.yml
|
/config/webpack.yml
|
||||||
tunnel.log
|
tunnel.log
|
||||||
/static
|
/static
|
||||||
|
|||||||
418
.gitlab-ci.yml
418
.gitlab-ci.yml
@ -1,4 +1,4 @@
|
|||||||
# SPDX-FileCopyrightText: 2022-2023 Sarah Vaupel <sarah.vaupel@uniworx.de>, Gregor Kleen <gregor@kleen.consulting>
|
# SPDX-FileCopyrightText: 2022-2024 Sarah Vaupel <sarah.vaupel@uniworx.de>, Gregor Kleen <gregor@kleen.consulting>
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
@ -8,265 +8,270 @@
|
|||||||
# - if: $CI_MERGE_REQUEST_ID
|
# - if: $CI_MERGE_REQUEST_ID
|
||||||
# - if: $CI_COMMIT_TAG =~ /^v/
|
# - if: $CI_COMMIT_TAG =~ /^v/
|
||||||
# - if: $CI_COMMIT_TAG =~ /^t/
|
# - if: $CI_COMMIT_TAG =~ /^t/
|
||||||
|
# - if: $CI_COMMIT_TAG =~ /^d/
|
||||||
|
|
||||||
|
variables:
|
||||||
|
# TODO: old vars; review and maybe remove
|
||||||
|
AWS_SHARED_CREDENTIALS_FILE: "/etc/aws/credentials"
|
||||||
|
TRANSFER_METER_FREQUENCY: "2s"
|
||||||
|
|
||||||
|
# Docker
|
||||||
|
ENV_USER: fradrive-env
|
||||||
|
|
||||||
|
# Backend
|
||||||
|
STACK_ROOT: "${CI_PROJECT_DIR}/.stack"
|
||||||
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
image:
|
image:
|
||||||
name: registry.uniworx.de/uniworx/containers/nix-attic:latest
|
name: registry.uniworx.de/fradrive/fradrive/fradrive-env:latest # Debian 12.5 Bookworm
|
||||||
|
entrypoint: [""]
|
||||||
|
docker:
|
||||||
|
platform: x86_64
|
||||||
|
user: ${ENV_USER}
|
||||||
|
before_script:
|
||||||
|
- chown -R ${ENV_USER} . # Change project directory ownership to (non-root) user inside docker container
|
||||||
|
artifacts:
|
||||||
|
name: "${CI_JOB_NAME}-${CI_COMMIT_SHORT_SHA}"
|
||||||
|
expire_in: "1 day"
|
||||||
|
retry: 2
|
||||||
|
interruptible: true
|
||||||
|
|
||||||
variables:
|
|
||||||
NIX_PATH: "nixpkgs=http://nixos.org/channels/nixos-21.05/nixexprs.tar.xz"
|
|
||||||
AWS_SHARED_CREDENTIALS_FILE: "/etc/aws/credentials"
|
|
||||||
|
|
||||||
TRANSFER_METER_FREQUENCY: "2s"
|
|
||||||
|
|
||||||
NIX_CONFIG: |-
|
|
||||||
extra-substituters = https://cache.iog.io
|
|
||||||
extra-trusted-public-keys = hydra.iohk.io:f/Ea+s+dFdN+3Y/G+FDgSq+a5NEWhJGzdjvKNGv0/EQ=
|
|
||||||
|
|
||||||
stages:
|
stages:
|
||||||
- frontend:build
|
- setup
|
||||||
- backend:build
|
- build
|
||||||
|
- lint
|
||||||
- test
|
- test
|
||||||
- container:build
|
- container
|
||||||
- prepare release
|
- prepare release
|
||||||
- release
|
- release
|
||||||
|
|
||||||
node dependencies:
|
|
||||||
stage: frontend:build
|
|
||||||
script:
|
|
||||||
- nix -L build -o result ".#uniworxNodeDependencies"
|
|
||||||
- nix-store --export $(nix-store -qR result) | xz -T0 -2 > node-dependencies.nar.xz
|
|
||||||
before_script: &nix-before
|
|
||||||
- git config --global init.defaultBranch master
|
|
||||||
- install -v -m 0700 -d ~/.ssh
|
|
||||||
- install -v -T -m 0644 "${SSH_KNOWN_HOSTS}" ~/.ssh/known_hosts
|
|
||||||
- install -v -T -m 0400 "${SSH_DEPLOY_KEY}" ~/.ssh/deploy && echo "IdentityFile ~/.ssh/deploy" >> ~/.ssh/config;
|
|
||||||
- install -v -T -m 0644 "${FONTAWESOME_NPM_AUTH_FILE}" /etc/fontawesome-token
|
|
||||||
- install -v -T -m 0644 "${NIX_NETRC}" /etc/nix/netrc
|
|
||||||
artifacts:
|
|
||||||
paths:
|
|
||||||
- node-dependencies.nar.xz
|
|
||||||
name: "${CI_JOB_NAME}-${CI_COMMIT_SHORT_SHA}"
|
|
||||||
expire_in: "1 day"
|
|
||||||
retry: 2
|
|
||||||
interruptible: true
|
|
||||||
|
|
||||||
well known:
|
frontend dependencies:
|
||||||
stage: frontend:build
|
stage: setup
|
||||||
|
cache:
|
||||||
|
- &npm-cache
|
||||||
|
key: default-npm
|
||||||
|
paths: &npm-paths
|
||||||
|
- node_modules/
|
||||||
|
- .npm/
|
||||||
|
- .npmrc
|
||||||
script:
|
script:
|
||||||
- xzcat node-dependencies.nar.xz | nix-store --import
|
- make node_modules
|
||||||
- nix -L build -o result ".#uniworxWellKnown"
|
artifacts:
|
||||||
- nix-store --export $(nix-store -qR result) | xz -T0 -2 > well-known.nar.xz
|
paths: *npm-paths
|
||||||
before_script: *nix-before
|
|
||||||
|
well-known:
|
||||||
|
stage: setup
|
||||||
|
script:
|
||||||
|
- make well-known
|
||||||
needs:
|
needs:
|
||||||
- job: node dependencies
|
- job: frontend dependencies
|
||||||
artifacts: true
|
artifacts: true
|
||||||
|
cache:
|
||||||
|
- &frontend-cache
|
||||||
|
key: default-frontend
|
||||||
|
paths:
|
||||||
|
- .well-known-cache
|
||||||
artifacts:
|
artifacts:
|
||||||
paths:
|
paths:
|
||||||
- well-known.nar.xz
|
- well-known/
|
||||||
name: "${CI_JOB_NAME}-${CI_COMMIT_SHORT_SHA}"
|
- .well-known-cache/
|
||||||
expire_in: "1 day"
|
|
||||||
retry: 2
|
|
||||||
interruptible: true
|
|
||||||
|
|
||||||
frontend:
|
# TODO: cache is always uploaded even if up-to-date; prevent re-upload when up-to-date
|
||||||
stage: frontend:build
|
backend dependencies:
|
||||||
|
stage: setup
|
||||||
|
cache:
|
||||||
|
- &stack-cache
|
||||||
|
key: default-stack
|
||||||
|
paths:
|
||||||
|
- .stack/
|
||||||
|
- .stack-work/
|
||||||
script:
|
script:
|
||||||
- xzcat node-dependencies.nar.xz | nix-store --import
|
- make backend-dependencies-prod
|
||||||
- xzcat well-known.nar.xz | nix-store --import
|
|
||||||
- nix -L build -o result ".#uniworxFrontend"
|
|
||||||
- nix-store --export $(nix-store -qR result) | xz -T0 -2 > frontend.nar.xz
|
|
||||||
before_script: *nix-before
|
|
||||||
needs:
|
|
||||||
- job: node dependencies
|
|
||||||
artifacts: true
|
|
||||||
- job: well known
|
|
||||||
artifacts: true
|
|
||||||
artifacts:
|
artifacts:
|
||||||
paths:
|
paths:
|
||||||
- frontend.nar.xz
|
- .stack/
|
||||||
name: "${CI_JOB_NAME}-${CI_COMMIT_SHORT_SHA}"
|
- .stack-work/
|
||||||
expire_in: "1 day"
|
|
||||||
retry: 2
|
|
||||||
interruptible: true
|
|
||||||
|
|
||||||
uniworx:lib:uniworx:
|
frontend build:
|
||||||
stage: backend:build
|
stage: build
|
||||||
|
cache:
|
||||||
|
- *frontend-cache
|
||||||
script:
|
script:
|
||||||
- xzcat frontend.nar.xz | nix-store --import
|
- make frontend-build
|
||||||
- nix -L build -o result ".#uniworx:lib:uniworx"
|
|
||||||
- nix-store --export $(nix-store -qR result) | xz -T0 -2 > uniworx:lib:uniworx.nar.xz
|
|
||||||
before_script: *nix-before
|
|
||||||
needs:
|
needs:
|
||||||
- job: node dependencies # transitive
|
- job: frontend dependencies
|
||||||
artifacts: false
|
artifacts: true
|
||||||
- job: well known # transitive
|
- job: well-known
|
||||||
artifacts: false
|
|
||||||
- job: frontend
|
|
||||||
artifacts: true
|
artifacts: true
|
||||||
artifacts:
|
artifacts:
|
||||||
paths:
|
paths:
|
||||||
- uniworx:lib:uniworx.nar.xz
|
- static/
|
||||||
name: "${CI_JOB_NAME}-${CI_COMMIT_SHORT_SHA}"
|
- config/webpack.yml
|
||||||
expire_in: "1 day"
|
|
||||||
retry: 2
|
|
||||||
interruptible: true
|
|
||||||
|
|
||||||
uniworx:exe:uniworx:
|
# TODO: .stack-work cache not working
|
||||||
stage: backend:build
|
backend build:
|
||||||
|
stage: build
|
||||||
|
cache:
|
||||||
|
- *stack-cache
|
||||||
script:
|
script:
|
||||||
- xzcat uniworx:lib:uniworx.nar.xz | nix-store --import
|
- make bin/uniworx
|
||||||
- nix -L build -o result ".#uniworx:exe:uniworx"
|
# - find .stack-work
|
||||||
- nix-store --export $(nix-store -qR result) | xz -T0 -2 > uniworx:exe:uniworx.nar.xz
|
# - cp $(stack path --dist-dir)/build/hlint/hlint bin/test-hlint
|
||||||
before_script: *nix-before
|
# - cp $(stack path --dist-dir)/build/yesod/yesod bin/test-yesod
|
||||||
needs:
|
needs:
|
||||||
- job: node dependencies # transitive
|
- job: frontend dependencies # transitive
|
||||||
artifacts: false
|
artifacts: false
|
||||||
- job: well known # transitive
|
- job: well-known
|
||||||
artifacts: false
|
artifacts: true
|
||||||
- job: frontend # tranitive
|
- job: backend dependencies
|
||||||
artifacts: false
|
artifacts: true
|
||||||
- job: uniworx:lib:uniworx
|
- job: frontend build
|
||||||
artifacts: true
|
artifacts: true
|
||||||
artifacts:
|
artifacts:
|
||||||
paths:
|
paths:
|
||||||
- uniworx:exe:uniworx.nar.xz
|
- bin/
|
||||||
name: "${CI_JOB_NAME}-${CI_COMMIT_SHORT_SHA}"
|
resource_group: ram
|
||||||
expire_in: "1 day"
|
|
||||||
retry: 2
|
|
||||||
interruptible: true
|
|
||||||
|
|
||||||
uniworx:exe:uniworxdb:
|
# TODO: part of backend build; probably deprecated
|
||||||
stage: backend:build
|
# uniworxdb:
|
||||||
|
# stage: build
|
||||||
|
# script:
|
||||||
|
# - make bin/uniworxdb
|
||||||
|
# needs:
|
||||||
|
# # TODO: no frontend needed
|
||||||
|
# - job: frontend dependencies # transitive
|
||||||
|
# artifacts: false
|
||||||
|
# - job: frontend build # transitive
|
||||||
|
# artifacts: false
|
||||||
|
# artifacts:
|
||||||
|
# paths:
|
||||||
|
# - bin/uniworxdb
|
||||||
|
|
||||||
|
# TODO: part of backend build; probably deprecated
|
||||||
|
# TODO: rewrite
|
||||||
|
# uniworx:exe:uniworxload:
|
||||||
|
# stage: build
|
||||||
|
# script:
|
||||||
|
# - xzcat uniworx:lib:uniworx.nar.xz | nix-store --import
|
||||||
|
# - nix -L build -o result ".#uniworx:exe:uniworxload"
|
||||||
|
# - nix-store --export $(nix-store -qR result) | xz -T0 -2 > uniworx:exe:uniworxload.nar.xz
|
||||||
|
# needs:
|
||||||
|
# - job: frontend dependencies # transitive
|
||||||
|
# artifacts: false
|
||||||
|
# - job: frontend build # transitive
|
||||||
|
# artifacts: false
|
||||||
|
# artifacts:
|
||||||
|
# paths:
|
||||||
|
# - uniworx:exe:uniworxload.nar.xz
|
||||||
|
|
||||||
|
frontend lint:
|
||||||
|
stage: lint
|
||||||
script:
|
script:
|
||||||
- xzcat uniworx:lib:uniworx.nar.xz | nix-store --import
|
- make frontend-lint
|
||||||
- nix -L build -o result ".#uniworx:exe:uniworxdb"
|
cache:
|
||||||
- nix-store --export $(nix-store -qR result) | xz -T0 -2 > uniworx:exe:uniworxdb.nar.xz
|
- *frontend-cache
|
||||||
before_script: *nix-before
|
|
||||||
needs:
|
needs:
|
||||||
- job: node dependencies # transitive
|
- job: frontend dependencies
|
||||||
artifacts: false
|
artifacts: true
|
||||||
- job: well known # transitive
|
- job: well-known # TODO: is this really needed?
|
||||||
artifacts: false
|
|
||||||
- job: frontend # tranitive
|
|
||||||
artifacts: false
|
|
||||||
- job: uniworx:lib:uniworx
|
|
||||||
artifacts: true
|
artifacts: true
|
||||||
artifacts:
|
|
||||||
paths:
|
|
||||||
- uniworx:exe:uniworxdb.nar.xz
|
|
||||||
name: "${CI_JOB_NAME}-${CI_COMMIT_SHORT_SHA}"
|
|
||||||
expire_in: "1 day"
|
|
||||||
retry: 2
|
|
||||||
interruptible: true
|
|
||||||
|
|
||||||
uniworx:exe:uniworxload:
|
backend lint:
|
||||||
stage: backend:build
|
stage: lint
|
||||||
|
cache:
|
||||||
|
- *stack-cache
|
||||||
script:
|
script:
|
||||||
- xzcat uniworx:lib:uniworx.nar.xz | nix-store --import
|
# TODO: - make backend-lint-dev
|
||||||
- nix -L build -o result ".#uniworx:exe:uniworxload"
|
- make backend-lint-prod
|
||||||
- nix-store --export $(nix-store -qR result) | xz -T0 -2 > uniworx:exe:uniworxload.nar.xz
|
|
||||||
before_script: *nix-before
|
|
||||||
needs:
|
needs:
|
||||||
- job: node dependencies # transitive
|
- job: backend dependencies
|
||||||
artifacts: false
|
artifacts: true
|
||||||
- job: well known # transitive
|
- job: backend build
|
||||||
artifacts: false
|
artifacts: true
|
||||||
- job: frontend # tranitive
|
- job: frontend build
|
||||||
artifacts: false
|
artifacts: true
|
||||||
- job: uniworx:lib:uniworx
|
- job: well-known
|
||||||
artifacts: true
|
artifacts: true
|
||||||
artifacts:
|
|
||||||
paths:
|
|
||||||
- uniworx:exe:uniworxload.nar.xz
|
|
||||||
name: "${CI_JOB_NAME}-${CI_COMMIT_SHORT_SHA}"
|
|
||||||
expire_in: "1 day"
|
|
||||||
retry: 2
|
|
||||||
interruptible: true
|
|
||||||
|
|
||||||
check:
|
frontend test:
|
||||||
stage: test
|
stage: test
|
||||||
script:
|
script:
|
||||||
- xzcat frontend.nar.xz | nix-store --import
|
- make frontend-test
|
||||||
- xzcat uniworx:lib:uniworx.nar.xz | nix-store --import
|
cache: *frontend-cache
|
||||||
- nix -L flake check .
|
|
||||||
before_script: *nix-before
|
|
||||||
needs:
|
needs:
|
||||||
- job: node dependencies # transitive
|
- job: frontend dependencies
|
||||||
artifacts: false
|
|
||||||
- job: well known # transitive
|
|
||||||
artifacts: false
|
|
||||||
- job: frontend
|
|
||||||
artifacts: true
|
artifacts: true
|
||||||
- job: uniworx:lib:uniworx
|
# TODO: configure report artifacts
|
||||||
artifacts: true
|
|
||||||
retry: 2
|
|
||||||
interruptible: true
|
|
||||||
|
|
||||||
|
backend test:
|
||||||
|
stage: test
|
||||||
|
script:
|
||||||
|
- make backend-test-prod
|
||||||
|
cache: *stack-cache
|
||||||
|
needs:
|
||||||
|
- job: well-known
|
||||||
|
artifacts: true
|
||||||
|
- job: frontend build
|
||||||
|
artifacts: true
|
||||||
|
- job: backend dependencies
|
||||||
|
artifacts: true
|
||||||
|
- job: backend build
|
||||||
|
artifacts: true
|
||||||
|
# TODO: configure report artifacts
|
||||||
|
|
||||||
|
# TODO: unify prod and test versions
|
||||||
|
# TODO: rewrite
|
||||||
container:
|
container:
|
||||||
stage: container:build
|
stage: container
|
||||||
script:
|
script:
|
||||||
- xzcat uniworx:exe:uniworx.nar.xz | nix-store --import
|
- xzcat uniworx:exe:uniworx.nar.xz | nix-store --import
|
||||||
- cp -pr --reflink=auto -L $(nix build --print-out-paths ".#uniworxDocker") uniworx.tar.gz
|
- cp -pr --reflink=auto -L $(nix build --print-out-paths ".#uniworxDocker") uniworx.tar.gz
|
||||||
before_script: *nix-before
|
|
||||||
needs:
|
needs:
|
||||||
- job: node dependencies # transitive
|
- job: frontend dependencies # transitive
|
||||||
artifacts: false
|
artifacts: false
|
||||||
- job: well known # transitive
|
- job: frontend build # transitive
|
||||||
artifacts: false
|
artifacts: false
|
||||||
- job: frontend # tranitive
|
- job: frontend test # sanity
|
||||||
artifacts: false
|
artifacts: false
|
||||||
- job: uniworx:lib:uniworx # transitive
|
- job: backend test # sanity
|
||||||
artifacts: false
|
|
||||||
- job: uniworx:exe:uniworx
|
|
||||||
artifacts: true
|
|
||||||
- job: check # sanity
|
|
||||||
artifacts: false
|
artifacts: false
|
||||||
artifacts:
|
artifacts:
|
||||||
paths:
|
paths:
|
||||||
- uniworx.tar.gz
|
- uniworx.tar.gz
|
||||||
name: "${CI_JOB_NAME}-${CI_COMMIT_SHORT_SHA}"
|
|
||||||
expire_in: "1 day"
|
|
||||||
retry: 2
|
|
||||||
interruptible: true
|
|
||||||
rules: &release-rules
|
rules: &release-rules
|
||||||
- if: $CI_COMMIT_TAG =~ /^v/
|
- if: $CI_COMMIT_TAG =~ /^v/
|
||||||
|
# TODO: rewrite
|
||||||
test container:
|
test container:
|
||||||
stage: container:build
|
stage: container
|
||||||
script:
|
script:
|
||||||
- xzcat uniworx:exe:uniworx.nar.xz | nix-store --import
|
- xzcat uniworx:exe:uniworx.nar.xz | nix-store --import
|
||||||
- cp -pr --reflink=auto -L $(nix build --print-out-paths ".#uniworxTestDocker") uniworx.tar.gz
|
- cp -pr --reflink=auto -L $(nix build --print-out-paths ".#uniworxTestDocker") uniworx.tar.gz
|
||||||
before_script: *nix-before
|
|
||||||
needs:
|
needs:
|
||||||
- job: node dependencies # transitive
|
- job: frontend dependencies # transitive
|
||||||
artifacts: false
|
artifacts: false
|
||||||
- job: well known # transitive
|
- job: frontend build # transitive
|
||||||
artifacts: false
|
artifacts: false
|
||||||
- job: frontend # tranitive
|
- job: frontend test # sanity
|
||||||
artifacts: false
|
artifacts: false
|
||||||
- job: uniworx:lib:uniworx # transitive
|
- job: backend test # sanity
|
||||||
artifacts: false
|
|
||||||
- job: uniworx:exe:uniworx
|
|
||||||
artifacts: true
|
|
||||||
- job: check # sanity
|
|
||||||
artifacts: false
|
artifacts: false
|
||||||
artifacts:
|
artifacts:
|
||||||
paths:
|
paths:
|
||||||
- uniworx.tar.gz
|
- uniworx.tar.gz
|
||||||
name: "${CI_JOB_NAME}-${CI_COMMIT_SHORT_SHA}"
|
|
||||||
expire_in: "1 day"
|
|
||||||
retry: 2
|
|
||||||
interruptible: true
|
|
||||||
rules: &test-release-rules
|
rules: &test-release-rules
|
||||||
- if: $CI_COMMIT_TAG =~ /^t/
|
- if: $CI_COMMIT_TAG =~ /^t/
|
||||||
|
|
||||||
|
# TODO: unify prod and test versions
|
||||||
|
# TODO: rewrite
|
||||||
parse changelog:
|
parse changelog:
|
||||||
stage: prepare release
|
stage: prepare release
|
||||||
needs:
|
needs:
|
||||||
- job: node dependencies
|
- job: frontend dependencies
|
||||||
artifacts: true
|
artifacts: true
|
||||||
rules: *release-rules
|
rules: *release-rules
|
||||||
before_script: *nix-before
|
|
||||||
script:
|
script:
|
||||||
- xzcat node-dependencies.nar.xz | nix-store --import
|
- xzcat node-dependencies.nar.xz | nix-store --import
|
||||||
- nix -L run ".#jqChangelogJson" -- -r '.versions[0].version' > .current-version
|
- nix -L run ".#jqChangelogJson" -- -r '.versions[0].version' > .current-version
|
||||||
@ -280,15 +285,13 @@ parse changelog:
|
|||||||
- .current-changelog.md
|
- .current-changelog.md
|
||||||
name: "changelog-${CI_COMMIT_SHORT_SHA}"
|
name: "changelog-${CI_COMMIT_SHORT_SHA}"
|
||||||
expire_in: "1 day"
|
expire_in: "1 day"
|
||||||
retry: 2
|
# TODO: rewrite
|
||||||
interruptible: true
|
|
||||||
parse test changelog:
|
parse test changelog:
|
||||||
stage: prepare release
|
stage: prepare release
|
||||||
needs:
|
needs:
|
||||||
- job: node dependencies
|
- job: frontend dependencies
|
||||||
artifacts: true
|
artifacts: true
|
||||||
rules: *test-release-rules
|
rules: *test-release-rules
|
||||||
before_script: *nix-before
|
|
||||||
script:
|
script:
|
||||||
- xzcat node-dependencies.nar.xz | nix-store --import
|
- xzcat node-dependencies.nar.xz | nix-store --import
|
||||||
- nix -L run ".#jqChangelogJson" -- -r '.versions[0].version' > .current-version
|
- nix -L run ".#jqChangelogJson" -- -r '.versions[0].version' > .current-version
|
||||||
@ -301,10 +304,9 @@ parse test changelog:
|
|||||||
- .current-version
|
- .current-version
|
||||||
- .current-changelog.md
|
- .current-changelog.md
|
||||||
name: "changelog-${CI_COMMIT_SHORT_SHA}"
|
name: "changelog-${CI_COMMIT_SHORT_SHA}"
|
||||||
expire_in: "1 day"
|
|
||||||
retry: 2
|
|
||||||
interruptible: true
|
|
||||||
|
|
||||||
|
# TODO: unify prod and test versions
|
||||||
|
# TODO: rewrite
|
||||||
upload container:
|
upload container:
|
||||||
variables:
|
variables:
|
||||||
GIT_STRATEGY: none
|
GIT_STRATEGY: none
|
||||||
@ -314,24 +316,20 @@ upload container:
|
|||||||
- skopeo --insecure-policy copy --dest-creds "${CI_REGISTRY_USER}:${CI_JOB_TOKEN}" docker-archive://$(pwd)/uniworx.tar.gz docker://${CI_REGISTRY_IMAGE}:${VERSION}
|
- skopeo --insecure-policy copy --dest-creds "${CI_REGISTRY_USER}:${CI_JOB_TOKEN}" docker-archive://$(pwd)/uniworx.tar.gz docker://${CI_REGISTRY_IMAGE}:${VERSION}
|
||||||
- skopeo --insecure-policy copy --src-creds "${CI_REGISTRY_USER}:${CI_JOB_TOKEN}" --dest-creds "${CI_REGISTRY_USER}:${CI_JOB_TOKEN}" docker://${CI_REGISTRY_IMAGE}:${VERSION} docker://${CI_REGISTRY_IMAGE}:latest
|
- skopeo --insecure-policy copy --src-creds "${CI_REGISTRY_USER}:${CI_JOB_TOKEN}" --dest-creds "${CI_REGISTRY_USER}:${CI_JOB_TOKEN}" docker://${CI_REGISTRY_IMAGE}:${VERSION} docker://${CI_REGISTRY_IMAGE}:latest
|
||||||
needs:
|
needs:
|
||||||
- job: node dependencies # transitive
|
- job: frontend dependencies # transitive
|
||||||
artifacts: false
|
artifacts: false
|
||||||
- job: well known # transitive
|
- job: frontend build # transitive
|
||||||
artifacts: false
|
|
||||||
- job: frontend # tranitive
|
|
||||||
artifacts: false
|
|
||||||
- job: uniworx:lib:uniworx # transitive
|
|
||||||
artifacts: false
|
|
||||||
- job: uniworx:exe:uniworx # transitive
|
|
||||||
artifacts: false
|
artifacts: false
|
||||||
- job: container
|
- job: container
|
||||||
artifacts: true
|
artifacts: true
|
||||||
- job: parse changelog
|
- job: parse changelog
|
||||||
artifacts: true
|
artifacts: true
|
||||||
- job: check # sanity
|
- job: frontend test # sanity
|
||||||
|
artifacts: false
|
||||||
|
- job: backend test # sanity
|
||||||
artifacts: false
|
artifacts: false
|
||||||
rules: *release-rules
|
rules: *release-rules
|
||||||
retry: 2
|
# TODO: rewrite
|
||||||
upload test container:
|
upload test container:
|
||||||
variables:
|
variables:
|
||||||
GIT_STRATEGY: none
|
GIT_STRATEGY: none
|
||||||
@ -341,25 +339,22 @@ upload test container:
|
|||||||
- skopeo --insecure-policy copy --dest-creds "${CI_REGISTRY_USER}:${CI_JOB_TOKEN}" docker-archive://$(pwd)/uniworx.tar.gz docker://${CI_REGISTRY}/fradrive/fradrive/test:${CI_COMMIT_REF_NAME}
|
- skopeo --insecure-policy copy --dest-creds "${CI_REGISTRY_USER}:${CI_JOB_TOKEN}" docker-archive://$(pwd)/uniworx.tar.gz docker://${CI_REGISTRY}/fradrive/fradrive/test:${CI_COMMIT_REF_NAME}
|
||||||
- skopeo --insecure-policy copy --src-creds "${CI_REGISTRY_USER}:${CI_JOB_TOKEN}" --dest-creds "${CI_REGISTRY_USER}:${CI_JOB_TOKEN}" docker://${CI_REGISTRY}/fradrive/fradrive/test:${CI_COMMIT_REF_NAME} docker://${CI_REGISTRY}/fradrive/fradrive/test:latest
|
- skopeo --insecure-policy copy --src-creds "${CI_REGISTRY_USER}:${CI_JOB_TOKEN}" --dest-creds "${CI_REGISTRY_USER}:${CI_JOB_TOKEN}" docker://${CI_REGISTRY}/fradrive/fradrive/test:${CI_COMMIT_REF_NAME} docker://${CI_REGISTRY}/fradrive/fradrive/test:latest
|
||||||
needs:
|
needs:
|
||||||
- job: node dependencies # transitive
|
- job: frontend dependencies # transitive
|
||||||
artifacts: false
|
artifacts: false
|
||||||
- job: well known # transitive
|
- job: frontend build # transitive
|
||||||
artifacts: false
|
|
||||||
- job: frontend # tranitive
|
|
||||||
artifacts: false
|
|
||||||
- job: uniworx:lib:uniworx # transitive
|
|
||||||
artifacts: false
|
|
||||||
- job: uniworx:exe:uniworx # transitive
|
|
||||||
artifacts: false
|
artifacts: false
|
||||||
- job: test container
|
- job: test container
|
||||||
artifacts: true
|
artifacts: true
|
||||||
- job: parse test changelog
|
- job: parse test changelog
|
||||||
artifacts: true
|
artifacts: true
|
||||||
- job: check # sanity
|
- job: frontend test # sanity
|
||||||
|
artifacts: false
|
||||||
|
- job: backend test # sanity
|
||||||
artifacts: false
|
artifacts: false
|
||||||
rules: *test-release-rules
|
rules: *test-release-rules
|
||||||
retry: 2
|
|
||||||
|
|
||||||
|
# TODO: unify prod and test versions
|
||||||
|
# TODO: rewrite
|
||||||
release:
|
release:
|
||||||
variables:
|
variables:
|
||||||
GIT_STRATEGY: none
|
GIT_STRATEGY: none
|
||||||
@ -373,10 +368,14 @@ release:
|
|||||||
tag_name: '$CI_COMMIT_TAG'
|
tag_name: '$CI_COMMIT_TAG'
|
||||||
description: .current-changelog.md
|
description: .current-changelog.md
|
||||||
needs:
|
needs:
|
||||||
- job: check # sanity
|
- job: frontend test # sanity
|
||||||
|
artifacts: false
|
||||||
|
- job: backend test # sanity
|
||||||
artifacts: false
|
artifacts: false
|
||||||
- job: parse changelog
|
- job: parse changelog
|
||||||
artifacts: true
|
artifacts: true
|
||||||
|
retry: 0
|
||||||
|
# TODO: rewrite
|
||||||
test release:
|
test release:
|
||||||
variables:
|
variables:
|
||||||
GIT_STRATEGY: none
|
GIT_STRATEGY: none
|
||||||
@ -390,7 +389,10 @@ test release:
|
|||||||
tag_name: '$CI_COMMIT_TAG'
|
tag_name: '$CI_COMMIT_TAG'
|
||||||
description: .current-changelog.md
|
description: .current-changelog.md
|
||||||
needs:
|
needs:
|
||||||
- job: check # sanity
|
- job: frontend test # sanity
|
||||||
|
artifacts: false
|
||||||
|
- job: backend test # sanity
|
||||||
artifacts: false
|
artifacts: false
|
||||||
- job: parse test changelog
|
- job: parse test changelog
|
||||||
artifacts: true
|
artifacts: true
|
||||||
|
retry: 0
|
||||||
|
|||||||
52
Dockerfile
Normal file
52
Dockerfile
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
FROM registry.uniworx.de/uniworx/containers/debian:12.5
|
||||||
|
|
||||||
|
RUN apt-get -y update
|
||||||
|
|
||||||
|
# Required packages
|
||||||
|
RUN apt-get -y install git git-restore-mtime exiftool g++ npm libsodium-dev haskell-stack zsh wget curl
|
||||||
|
|
||||||
|
# packages that we might require (copied from uni2work)
|
||||||
|
# TODO: review
|
||||||
|
RUN apt-get -y install --no-install-recommends locales-all ca-certificates
|
||||||
|
|
||||||
|
# frontend
|
||||||
|
RUN npm install -g n
|
||||||
|
RUN n 14.19.1
|
||||||
|
|
||||||
|
# backend
|
||||||
|
# RUN stack install happy # TODO: "Specified bucket does not exist" error on debian
|
||||||
|
|
||||||
|
# run git restore-mtime
|
||||||
|
# frontend-test
|
||||||
|
RUN apt-get -y install chromium
|
||||||
|
|
||||||
|
# frontend-test
|
||||||
|
ENV CHROME_BIN=chromium
|
||||||
|
|
||||||
|
# backend-dependencies
|
||||||
|
RUN apt-get -y install libghc-zlib-dev
|
||||||
|
|
||||||
|
# backend-dependencies
|
||||||
|
RUN apt-get -y install libpq-dev
|
||||||
|
|
||||||
|
# backend-dependencies
|
||||||
|
RUN apt-get -y install pkg-config
|
||||||
|
|
||||||
|
RUN apt-get -y install locales
|
||||||
|
RUN sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen && \
|
||||||
|
locale-gen
|
||||||
|
ENV LANG=en_US.UTF-8 LANGUAGE=en_US:en LC_ALL=en_US.UTF-8
|
||||||
|
|
||||||
|
RUN apt-get -y install llvm
|
||||||
|
|
||||||
|
ADD . /fradrive-src
|
||||||
|
|
||||||
|
RUN useradd -ms /bin/bash fradrive-env
|
||||||
|
RUN chown -R fradrive-env:fradrive-env /fradrive-src
|
||||||
|
USER fradrive-env
|
||||||
|
|
||||||
|
WORKDIR /fradrive-src
|
||||||
|
|
||||||
|
# pre-build frontend- and backend-dependencies
|
||||||
|
RUN make node_modules
|
||||||
|
RUN make backend-dependencies
|
||||||
156
Makefile
Normal file
156
Makefile
Normal file
@ -0,0 +1,156 @@
|
|||||||
|
db ?= -cf
|
||||||
|
|
||||||
|
.PHONY: help
|
||||||
|
help:
|
||||||
|
@echo "Nothing to see here, go away"
|
||||||
|
|
||||||
|
.PHONY: build
|
||||||
|
build: frontend-build backend-build
|
||||||
|
|
||||||
|
#.PHONY: start
|
||||||
|
#start: frontend-build
|
||||||
|
# $(MAKE) --jobs=2 frontend-watch backend-start
|
||||||
|
|
||||||
|
.PHONY: lint
|
||||||
|
lint: frontend-lint backend-lint
|
||||||
|
|
||||||
|
.PHONY: test
|
||||||
|
test: frontend-test backend-test i18n-check
|
||||||
|
|
||||||
|
.PHONY: backend-%
|
||||||
|
backend-%: # .stack-work.lock # --stack-work-$*
|
||||||
|
$(MAKE) -- --backend-$*-dev
|
||||||
|
#( $(MAKE) -- --backend-$* || $(MAKE) -- --stack-krow-$* ) && ( $(MAKE) -- --stack-krow-$* )
|
||||||
|
|
||||||
|
.PHONY: backend-%-prod # TODO deprecated in favor of bins; remove
|
||||||
|
backend-%-prod: # .stack-work.lock # --stack-work-$*
|
||||||
|
$(MAKE) -- --backend-$*-prod
|
||||||
|
|
||||||
|
# TODO: this creates more binaries than just bin/uniworx as side effect! Document or change behaviour?
|
||||||
|
bin/uniworx:
|
||||||
|
$(MAKE) -- --backend-build-prod
|
||||||
|
|
||||||
|
# TODO replace with bin/uniworxdev
|
||||||
|
.PHONY: --backend-%-dev
|
||||||
|
--backend-%-dev: .develop.env
|
||||||
|
$(MAKE) -- --backend-$* stackopts=--flag\ uniworx:dev
|
||||||
|
|
||||||
|
# TODO deprecated in favor of binary targets
|
||||||
|
.PHONY: --backend-%-prod
|
||||||
|
--backend-%-prod:
|
||||||
|
$(MAKE) -- --backend-$* stackopts=--copy-bins\ --local-bin-path\ $$(pwd)/bin\ --flag\ uniworx:-dev
|
||||||
|
|
||||||
|
.PHONY: --backend-build
|
||||||
|
--backend-build: well-known
|
||||||
|
stack build --fast --profile --library-profiling --executable-profiling --flag uniworx:-library-only $(stackopts)
|
||||||
|
|
||||||
|
.PHONY: --backend-lint
|
||||||
|
--backend-lint:
|
||||||
|
stack build --test --fast --flag uniworx:library-only uniworx:test:hlint $(stackopts)
|
||||||
|
|
||||||
|
.PHONY: backend-dependencies
|
||||||
|
backend-dependencies:
|
||||||
|
$(MAKE) -- --backend-dependencies
|
||||||
|
|
||||||
|
.PHONY: backend-dependencies-prod
|
||||||
|
backend-dependencies-prod:
|
||||||
|
$(MAKE) -- --backend-dependencies
|
||||||
|
|
||||||
|
.PHONY: --backend-dependencies
|
||||||
|
--backend-dependencies:
|
||||||
|
stack build --fast --only-dependencies $(stackopts)
|
||||||
|
|
||||||
|
.PHONY: --backend-test
|
||||||
|
--backend-test:
|
||||||
|
stack build --test --coverage --fast --flag uniworx:library-only $(stackopts)
|
||||||
|
|
||||||
|
.PHONY: i18n-check
|
||||||
|
i18n-check:
|
||||||
|
./missing-translations.sh
|
||||||
|
@echo No missing translations.
|
||||||
|
|
||||||
|
.PHONY: database
|
||||||
|
database: .stack-work.lock # --stack-work-build
|
||||||
|
$(MAKE) -- --database
|
||||||
|
# ( $(MAKE) -- --database || $(MAKE) -- --stack-krow-build ) && ( $(MAKE) -- --stack-krow-build )
|
||||||
|
|
||||||
|
# TODO maybe move to database target?
|
||||||
|
.PHONY: --database
|
||||||
|
--database: .stack-work.lock bin/uniworxdb
|
||||||
|
export SERVER_SESSION_ACID_FALLBACK=$${SERVER_SESSION_ACID_FALLBACK:-true}
|
||||||
|
export AVSPASS=$${AVSPASS:-nopasswordset}
|
||||||
|
stack exec uniworxdb -- $(db)
|
||||||
|
|
||||||
|
# TODO: same behaviour as b9in/uniworx! Merge or tweak targets!
|
||||||
|
bin/uniworxdb: .stack-work.lock
|
||||||
|
stack build --fast --flag uniworx:-library-only --copy-bins\ --local-bin-path\ $$(pwd)/bin\ --flag\ uniworx:-dev
|
||||||
|
|
||||||
|
.PHONY: frontend-%
|
||||||
|
frontend-%: node_modules
|
||||||
|
$(MAKE) -- --frontend-$*
|
||||||
|
|
||||||
|
.PHONY: --frontend-build
|
||||||
|
--frontend-build:
|
||||||
|
npx -- webpack --progress $(WATCH)
|
||||||
|
|
||||||
|
.PHONY: --frontend-watch
|
||||||
|
--frontend-watch: WATCH=--watch
|
||||||
|
--frontend-watch: --frontend-build
|
||||||
|
|
||||||
|
.PHONY: --frontend-lint
|
||||||
|
--frontend-lint: .eslintrc.json
|
||||||
|
npx -- eslint frontend/src $(FIX)
|
||||||
|
@echo Hooray! There are no hints.
|
||||||
|
|
||||||
|
.PHONY: --frontend-test
|
||||||
|
--frontend-test: karma.conf.js
|
||||||
|
npx -- karma start --conf karma.conf.js $(WATCH)
|
||||||
|
|
||||||
|
.PHONY: --frontend-test-watch
|
||||||
|
--frontend-test-watch: WATCH=--single-run false
|
||||||
|
--frontend-test-watch: --frontend-test
|
||||||
|
|
||||||
|
node_modules: .npmrc package.json
|
||||||
|
npm ci --cache .npm --prefer-offline
|
||||||
|
|
||||||
|
well-known: node_modules
|
||||||
|
npx webpack --progress
|
||||||
|
|
||||||
|
.npmrc:
|
||||||
|
@# Using @echo instead of echo to avoid printing secret token to stdout
|
||||||
|
@echo '@fortawesome:registry=https://npm.fontawesome.com/' > .npmrc
|
||||||
|
@echo "//npm.fontawesome.com/:_authToken=$(FONTAWESOME_NPM_AUTH_TOKEN)" >> .npmrc
|
||||||
|
|
||||||
|
|
||||||
|
.PHONY: clean
|
||||||
|
clean:
|
||||||
|
rm -rf node_modules
|
||||||
|
rm -rf .stack-work .stack-work-build .stack-work-run .stack-work-test .stack-work-doc
|
||||||
|
rm -rf bin/
|
||||||
|
|
||||||
|
%.lock:
|
||||||
|
[ -e $@ ] || touch $@
|
||||||
|
flock -en $@ true
|
||||||
|
|
||||||
|
.stack-work.lock:
|
||||||
|
[ "${FLOCKER}" != "$0" ] && exec env FLOCKER="$0" flock -en .stack-work.lock "$0" "$@" || :
|
||||||
|
|
||||||
|
.develop.env:
|
||||||
|
[ ! -z "$(CI)" -o ! -z "$$PORT_OFFSET" ] || ( echo "Not in develop!" 2>&1 ; exit 1 )
|
||||||
|
|
||||||
|
# .PHONY: --stack-work-%
|
||||||
|
# --stack-work-%: .stack-work.lock
|
||||||
|
# [[ -d .stack-work && -d .stack-work-$* ]] && (echo ".stack-work collides with .stack-work-$*, please resolve manually" 1>&2; exit 1) || :
|
||||||
|
# [[ ! -d .stack-work-$* ]] || mv .stack-work-$* .stack-work
|
||||||
|
#
|
||||||
|
# .PHONY: --stack-krow-%
|
||||||
|
# --stack-krow-%:
|
||||||
|
# [[ ! -d .stack-work-$* ]] || ( echo ".stack-work-$* already exists, please resolve manually" 1>&2 ; exit 1 )
|
||||||
|
# mv .stack-work .stack-work-$*
|
||||||
|
# flock -u .stack-work.lock true
|
||||||
|
|
||||||
|
# watch:
|
||||||
|
# while true; do \
|
||||||
|
#
|
||||||
|
# start: frontend-build frontend-build-watch yesod-start
|
||||||
|
# run-s frontend:build --parallel "frontend:build:watch" "yesod:start"
|
||||||
29
docker/fradrive/Dockerfile
Normal file
29
docker/fradrive/Dockerfile
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
FROM registry.uniworx.de/fradrive/fradrive/fradrive-env:latest
|
||||||
|
|
||||||
|
USER root
|
||||||
|
|
||||||
|
# Install uniworx binary
|
||||||
|
WORKDIR /fradrive-src
|
||||||
|
# RUN make clean # TODO: to discuss whether to invalidate all caches beforehand
|
||||||
|
RUN make bin/uniworx
|
||||||
|
|
||||||
|
# Runtime dependencies
|
||||||
|
# TODO: minimize texlive dependencies, switch to basic schemes where possible
|
||||||
|
RUN apt-get -y install texlive-latex-recommended texlive-latex-extra texlive-luatex texlive-fonts-recommended texlive-fonts-extra texlive-lang-english texlive-lang-german
|
||||||
|
|
||||||
|
# TODO: build container (see nix build)
|
||||||
|
|
||||||
|
# TODO: remove build dependencies (e.g. nodejs)
|
||||||
|
|
||||||
|
RUN mkdir -p /var/lib
|
||||||
|
RUN groupadd -r uniworx
|
||||||
|
RUN useradd -r -g uniworx -d /var/lib/uniworx -M uniworx --uid 999
|
||||||
|
RUN install -d -g uniworx -o uniworx -m 0750 /var/lib/uniworx
|
||||||
|
RUN mkdir -p /var/log
|
||||||
|
RUN install -d -g uniworx -o uniworx -m 0755 /var/log/uniworx
|
||||||
|
|
||||||
|
USER uniworx
|
||||||
|
|
||||||
|
ENTRYPOINT fradrive-entrypoint.sh
|
||||||
|
EXPOSE 8080/tcp
|
||||||
|
VOLUME /var/lib/uniworx /var/log
|
||||||
20
docker/fradrive/fradrive-entrypoint.sh
Normal file
20
docker/fradrive/fradrive-entrypoint.sh
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
#!/nix/store/r0wrj1l79j267np3z5i657pnprsd74fq-zsh-5.8/bin/zsh -xe
|
||||||
|
|
||||||
|
cTime=$(date -Is)
|
||||||
|
|
||||||
|
# export LOGDEST=/var/log/uniworx/${cTime}.log # kubernetes prefers log via stdout
|
||||||
|
|
||||||
|
typeset -a configs
|
||||||
|
|
||||||
|
configDir=${CONFIG_DIR-/cfg}
|
||||||
|
configs=()
|
||||||
|
if [[ -d "${configDir}" ]]; then
|
||||||
|
while IFS= read -d $'\0' cfg; do
|
||||||
|
configs+=("${(q)cfg}")
|
||||||
|
done < <(find "${configDir}" \( -name '*.yml' -o -name '*.yaml' \) -print0 | sort -rz)
|
||||||
|
fi
|
||||||
|
configs+=('/nix/store/mr2s10y1pj1fx594gjx0qlvc704n1j00-uni2work.yml')
|
||||||
|
|
||||||
|
cd /var/lib/uniworx
|
||||||
|
|
||||||
|
exec -- uniworx ${configs}
|
||||||
488
flake.lock
488
flake.lock
@ -37,10 +37,10 @@
|
|||||||
"flake": false,
|
"flake": false,
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1603716527,
|
"lastModified": 1603716527,
|
||||||
"narHash": "sha256-sDbrmur9Zfp4mPKohCD8IDZfXJ0Tjxpmr2R+kg5PpSY=",
|
"narHash": "sha256-X0TFfdD4KZpwl0Zr6x+PLxUt/VyKQfX7ylXHdmZIL+w=",
|
||||||
"owner": "haskell",
|
"owner": "haskell",
|
||||||
"repo": "cabal",
|
"repo": "cabal",
|
||||||
"rev": "94aaa8e4720081f9c75497e2735b90f6a819b08e",
|
"rev": "48bf10787e27364730dd37a42b603cee8d6af7ee",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@ -53,11 +53,11 @@
|
|||||||
"cabal-34": {
|
"cabal-34": {
|
||||||
"flake": false,
|
"flake": false,
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1622475795,
|
"lastModified": 1645834128,
|
||||||
"narHash": "sha256-chwTL304Cav+7p38d9mcb+egABWmxo2Aq+xgVBgEb/U=",
|
"narHash": "sha256-wG3d+dOt14z8+ydz4SL7pwGfe7SiimxcD/LOuPCV6xM=",
|
||||||
"owner": "haskell",
|
"owner": "haskell",
|
||||||
"repo": "cabal",
|
"repo": "cabal",
|
||||||
"rev": "b086c1995cdd616fc8d91f46a21e905cc50a1049",
|
"rev": "5ff598c67f53f7c4f48e31d722ba37172230c462",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@ -67,6 +67,23 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"cabal-36": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1669081697,
|
||||||
|
"narHash": "sha256-I5or+V7LZvMxfbYgZATU4awzkicBwwok4mVoje+sGmU=",
|
||||||
|
"owner": "haskell",
|
||||||
|
"repo": "cabal",
|
||||||
|
"rev": "8fd619e33d34924a94e691c5fea2c42f0fc7f144",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "haskell",
|
||||||
|
"ref": "3.6",
|
||||||
|
"repo": "cabal",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
"cardano-shell": {
|
"cardano-shell": {
|
||||||
"flake": false,
|
"flake": false,
|
||||||
"locked": {
|
"locked": {
|
||||||
@ -185,16 +202,33 @@
|
|||||||
"url": "https://gitlab.ifi.lmu.de/uni2work/haskell/esqueleto.git"
|
"url": "https://gitlab.ifi.lmu.de/uni2work/haskell/esqueleto.git"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"flake-compat": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1672831974,
|
||||||
|
"narHash": "sha256-z9k3MfslLjWQfnjBtEtJZdq3H7kyi2kQtUThfTgdRk0=",
|
||||||
|
"owner": "input-output-hk",
|
||||||
|
"repo": "flake-compat",
|
||||||
|
"rev": "45f2638735f8cdc40fe302742b79f248d23eb368",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "input-output-hk",
|
||||||
|
"ref": "hkm/gitlab-fix",
|
||||||
|
"repo": "flake-compat",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
"flake-utils": {
|
"flake-utils": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"systems": "systems"
|
"systems": "systems"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1681202837,
|
"lastModified": 1705309234,
|
||||||
"narHash": "sha256-H+Rh19JDwRtpVPAWp64F+rlEtxUWBAQW28eAi3SRSzg=",
|
"narHash": "sha256-uNRRNRKmJyCRC/8y1RqBkqWBLM034y4qN7EprSdmgyA=",
|
||||||
"owner": "numtide",
|
"owner": "numtide",
|
||||||
"repo": "flake-utils",
|
"repo": "flake-utils",
|
||||||
"rev": "cfacdce06f30d2b68473a46042957675eebb3401",
|
"rev": "1ef2e671c3b0c19053962c07dbda38332dcebf26",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@ -204,21 +238,6 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"flake-utils_2": {
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1623875721,
|
|
||||||
"narHash": "sha256-A8BU7bjS5GirpAUv4QA+QnJ4CceLHkcXdRp4xITDB0s=",
|
|
||||||
"owner": "numtide",
|
|
||||||
"repo": "flake-utils",
|
|
||||||
"rev": "f7e004a55b120c02ecb6219596820fcd32ca8772",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"owner": "numtide",
|
|
||||||
"repo": "flake-utils",
|
|
||||||
"type": "github"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"ghc-8.6.5-iohk": {
|
"ghc-8.6.5-iohk": {
|
||||||
"flake": false,
|
"flake": false,
|
||||||
"locked": {
|
"locked": {
|
||||||
@ -236,14 +255,51 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"ghc98X": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1696643148,
|
||||||
|
"narHash": "sha256-E02DfgISH7EvvNAu0BHiPvl1E5FGMDi0pWdNZtIBC9I=",
|
||||||
|
"ref": "ghc-9.8",
|
||||||
|
"rev": "443e870d977b1ab6fc05f47a9a17bc49296adbd6",
|
||||||
|
"revCount": 61642,
|
||||||
|
"submodules": true,
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://gitlab.haskell.org/ghc/ghc"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"ref": "ghc-9.8",
|
||||||
|
"submodules": true,
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://gitlab.haskell.org/ghc/ghc"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ghc99": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1701580282,
|
||||||
|
"narHash": "sha256-drA01r3JrXnkKyzI+owMZGxX0JameMzjK0W5jJE/+V4=",
|
||||||
|
"ref": "refs/heads/master",
|
||||||
|
"rev": "f5eb0f2982e9cf27515e892c4bdf634bcfb28459",
|
||||||
|
"revCount": 62197,
|
||||||
|
"submodules": true,
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://gitlab.haskell.org/ghc/ghc"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"submodules": true,
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://gitlab.haskell.org/ghc/ghc"
|
||||||
|
}
|
||||||
|
},
|
||||||
"hackage": {
|
"hackage": {
|
||||||
"flake": false,
|
"flake": false,
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1629940355,
|
"lastModified": 1705796710,
|
||||||
"narHash": "sha256-o9/U8R/JtyHIcxhMLaWYP+D/52B6LH/ikCyNZ7+mymI=",
|
"narHash": "sha256-BdAqEqx6rdp8O8lu9yW1nXa8/da7+/QPgVjCJVEXyWw=",
|
||||||
"owner": "input-output-hk",
|
"owner": "input-output-hk",
|
||||||
"repo": "hackage.nix",
|
"repo": "hackage.nix",
|
||||||
"rev": "429deb2a137084c011310bad92f4cecf244f2fc2",
|
"rev": "31d4fed569912819adbf66b580489b45dc80a29a",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@ -257,26 +313,44 @@
|
|||||||
"HTTP": "HTTP",
|
"HTTP": "HTTP",
|
||||||
"cabal-32": "cabal-32",
|
"cabal-32": "cabal-32",
|
||||||
"cabal-34": "cabal-34",
|
"cabal-34": "cabal-34",
|
||||||
|
"cabal-36": "cabal-36",
|
||||||
"cardano-shell": "cardano-shell",
|
"cardano-shell": "cardano-shell",
|
||||||
"flake-utils": "flake-utils_2",
|
"flake-compat": "flake-compat",
|
||||||
"ghc-8.6.5-iohk": "ghc-8.6.5-iohk",
|
"ghc-8.6.5-iohk": "ghc-8.6.5-iohk",
|
||||||
|
"ghc98X": "ghc98X",
|
||||||
|
"ghc99": "ghc99",
|
||||||
"hackage": "hackage",
|
"hackage": "hackage",
|
||||||
|
"hls-1.10": "hls-1.10",
|
||||||
|
"hls-2.0": "hls-2.0",
|
||||||
|
"hls-2.2": "hls-2.2",
|
||||||
|
"hls-2.3": "hls-2.3",
|
||||||
|
"hls-2.4": "hls-2.4",
|
||||||
|
"hls-2.5": "hls-2.5",
|
||||||
|
"hls-2.6": "hls-2.6",
|
||||||
"hpc-coveralls": "hpc-coveralls",
|
"hpc-coveralls": "hpc-coveralls",
|
||||||
"nix-tools": "nix-tools",
|
"hydra": "hydra",
|
||||||
"nixpkgs": "nixpkgs",
|
"iserv-proxy": "iserv-proxy",
|
||||||
|
"nixpkgs": [
|
||||||
|
"haskell-nix",
|
||||||
|
"nixpkgs-unstable"
|
||||||
|
],
|
||||||
"nixpkgs-2003": "nixpkgs-2003",
|
"nixpkgs-2003": "nixpkgs-2003",
|
||||||
"nixpkgs-2009": "nixpkgs-2009",
|
|
||||||
"nixpkgs-2105": "nixpkgs-2105",
|
"nixpkgs-2105": "nixpkgs-2105",
|
||||||
|
"nixpkgs-2111": "nixpkgs-2111",
|
||||||
|
"nixpkgs-2205": "nixpkgs-2205",
|
||||||
|
"nixpkgs-2211": "nixpkgs-2211",
|
||||||
|
"nixpkgs-2305": "nixpkgs-2305",
|
||||||
|
"nixpkgs-2311": "nixpkgs-2311",
|
||||||
"nixpkgs-unstable": "nixpkgs-unstable",
|
"nixpkgs-unstable": "nixpkgs-unstable",
|
||||||
"old-ghc-nix": "old-ghc-nix",
|
"old-ghc-nix": "old-ghc-nix",
|
||||||
"stackage": "stackage"
|
"stackage": "stackage"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1629940530,
|
"lastModified": 1705798224,
|
||||||
"narHash": "sha256-cf/bshYWloj+rJSmOcFokN6Rs1lpFkiECKpykN3JBH8=",
|
"narHash": "sha256-/zJa0hC58vLD8PqTEQNeN9EJAQpbS+YluJhLVstgqY8=",
|
||||||
"owner": "input-output-hk",
|
"owner": "input-output-hk",
|
||||||
"repo": "haskell.nix",
|
"repo": "haskell.nix",
|
||||||
"rev": "5fcd4faf98fc8ca8287e2c7bc1fff71dfd340f1f",
|
"rev": "2a31673a97ed3efbae9835ea7334528d2bc4b6ab",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@ -285,6 +359,125 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"hls-1.10": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1680000865,
|
||||||
|
"narHash": "sha256-rc7iiUAcrHxwRM/s0ErEsSPxOR3u8t7DvFeWlMycWgo=",
|
||||||
|
"owner": "haskell",
|
||||||
|
"repo": "haskell-language-server",
|
||||||
|
"rev": "b08691db779f7a35ff322b71e72a12f6e3376fd9",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "haskell",
|
||||||
|
"ref": "1.10.0.0",
|
||||||
|
"repo": "haskell-language-server",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"hls-2.0": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1687698105,
|
||||||
|
"narHash": "sha256-OHXlgRzs/kuJH8q7Sxh507H+0Rb8b7VOiPAjcY9sM1k=",
|
||||||
|
"owner": "haskell",
|
||||||
|
"repo": "haskell-language-server",
|
||||||
|
"rev": "783905f211ac63edf982dd1889c671653327e441",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "haskell",
|
||||||
|
"ref": "2.0.0.1",
|
||||||
|
"repo": "haskell-language-server",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"hls-2.2": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1693064058,
|
||||||
|
"narHash": "sha256-8DGIyz5GjuCFmohY6Fa79hHA/p1iIqubfJUTGQElbNk=",
|
||||||
|
"owner": "haskell",
|
||||||
|
"repo": "haskell-language-server",
|
||||||
|
"rev": "b30f4b6cf5822f3112c35d14a0cba51f3fe23b85",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "haskell",
|
||||||
|
"ref": "2.2.0.0",
|
||||||
|
"repo": "haskell-language-server",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"hls-2.3": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1695910642,
|
||||||
|
"narHash": "sha256-tR58doOs3DncFehHwCLczJgntyG/zlsSd7DgDgMPOkI=",
|
||||||
|
"owner": "haskell",
|
||||||
|
"repo": "haskell-language-server",
|
||||||
|
"rev": "458ccdb55c9ea22cd5d13ec3051aaefb295321be",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "haskell",
|
||||||
|
"ref": "2.3.0.0",
|
||||||
|
"repo": "haskell-language-server",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"hls-2.4": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1699862708,
|
||||||
|
"narHash": "sha256-YHXSkdz53zd0fYGIYOgLt6HrA0eaRJi9mXVqDgmvrjk=",
|
||||||
|
"owner": "haskell",
|
||||||
|
"repo": "haskell-language-server",
|
||||||
|
"rev": "54507ef7e85fa8e9d0eb9a669832a3287ffccd57",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "haskell",
|
||||||
|
"ref": "2.4.0.1",
|
||||||
|
"repo": "haskell-language-server",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"hls-2.5": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1701080174,
|
||||||
|
"narHash": "sha256-fyiR9TaHGJIIR0UmcCb73Xv9TJq3ht2ioxQ2mT7kVdc=",
|
||||||
|
"owner": "haskell",
|
||||||
|
"repo": "haskell-language-server",
|
||||||
|
"rev": "27f8c3d3892e38edaef5bea3870161815c4d014c",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "haskell",
|
||||||
|
"ref": "2.5.0.0",
|
||||||
|
"repo": "haskell-language-server",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"hls-2.6": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1705325287,
|
||||||
|
"narHash": "sha256-+P87oLdlPyMw8Mgoul7HMWdEvWP/fNlo8jyNtwME8E8=",
|
||||||
|
"owner": "haskell",
|
||||||
|
"repo": "haskell-language-server",
|
||||||
|
"rev": "6e0b342fa0327e628610f2711f8c3e4eaaa08b1e",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "haskell",
|
||||||
|
"ref": "2.6.0.0",
|
||||||
|
"repo": "haskell-language-server",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
"hpc-coveralls": {
|
"hpc-coveralls": {
|
||||||
"flake": false,
|
"flake": false,
|
||||||
"locked": {
|
"locked": {
|
||||||
@ -301,6 +494,46 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"hydra": {
|
||||||
|
"inputs": {
|
||||||
|
"nix": "nix",
|
||||||
|
"nixpkgs": [
|
||||||
|
"haskell-nix",
|
||||||
|
"hydra",
|
||||||
|
"nix",
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1671755331,
|
||||||
|
"narHash": "sha256-hXsgJj0Cy0ZiCiYdW2OdBz5WmFyOMKuw4zyxKpgUKm4=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "hydra",
|
||||||
|
"rev": "f48f00ee6d5727ae3e488cbf9ce157460853fea8",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"id": "hydra",
|
||||||
|
"type": "indirect"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"iserv-proxy": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1691634696,
|
||||||
|
"narHash": "sha256-MZH2NznKC/gbgBu8NgIibtSUZeJ00HTLJ0PlWKCBHb0=",
|
||||||
|
"ref": "hkm/remote-iserv",
|
||||||
|
"rev": "43a979272d9addc29fbffc2e8542c5d96e993d73",
|
||||||
|
"revCount": 14,
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://gitlab.haskell.org/hamishmack/iserv-proxy.git"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"ref": "hkm/remote-iserv",
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://gitlab.haskell.org/hamishmack/iserv-proxy.git"
|
||||||
|
}
|
||||||
|
},
|
||||||
"ldap-client": {
|
"ldap-client": {
|
||||||
"flake": false,
|
"flake": false,
|
||||||
"locked": {
|
"locked": {
|
||||||
@ -318,6 +551,22 @@
|
|||||||
"url": "https://gitlab.ifi.lmu.de/uni2work/haskell/ldap-client.git"
|
"url": "https://gitlab.ifi.lmu.de/uni2work/haskell/ldap-client.git"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"lowdown-src": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1633514407,
|
||||||
|
"narHash": "sha256-Dw32tiMjdK9t3ETl5fzGrutQTzh2rufgZV4A/BbxuD4=",
|
||||||
|
"owner": "kristapsdz",
|
||||||
|
"repo": "lowdown",
|
||||||
|
"rev": "d2c2b44ff6c27b936ec27358a2653caaef8f73b8",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "kristapsdz",
|
||||||
|
"repo": "lowdown",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
"memcached-binary": {
|
"memcached-binary": {
|
||||||
"flake": false,
|
"flake": false,
|
||||||
"locked": {
|
"locked": {
|
||||||
@ -352,34 +601,39 @@
|
|||||||
"url": "https://gitlab.ifi.lmu.de/uni2work/haskell/minio-hs.git"
|
"url": "https://gitlab.ifi.lmu.de/uni2work/haskell/minio-hs.git"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"nix-tools": {
|
"nix": {
|
||||||
"flake": false,
|
"inputs": {
|
||||||
|
"lowdown-src": "lowdown-src",
|
||||||
|
"nixpkgs": "nixpkgs",
|
||||||
|
"nixpkgs-regression": "nixpkgs-regression"
|
||||||
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1626997434,
|
"lastModified": 1661606874,
|
||||||
"narHash": "sha256-1judQmP298ao6cGUNxcGhcAXHOnA9qSLvWk/ZtoUL7w=",
|
"narHash": "sha256-9+rpYzI+SmxJn+EbYxjGv68Ucp22bdFUSy/4LkHkkDQ=",
|
||||||
"owner": "input-output-hk",
|
"owner": "NixOS",
|
||||||
"repo": "nix-tools",
|
"repo": "nix",
|
||||||
"rev": "c8c5e6a6fbb12a73598d1a434984a36e880ce3cf",
|
"rev": "11e45768b34fdafdcf019ddbd337afa16127ff0f",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"owner": "input-output-hk",
|
"owner": "NixOS",
|
||||||
"repo": "nix-tools",
|
"ref": "2.11.0",
|
||||||
|
"repo": "nix",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"nixpkgs": {
|
"nixpkgs": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1624291665,
|
"lastModified": 1657693803,
|
||||||
"narHash": "sha256-kNkaoa3dai9WOi7fsPklCCWZ8hRAkXx0ZUhpYKShyUk=",
|
"narHash": "sha256-G++2CJ9u0E7NNTAi9n5G8TdDmGJXcIjkJ3NF8cetQB8=",
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "3c6f3f84af60a8ed5b8a79cf3026b7630fcdefb8",
|
"rev": "365e1b3a859281cf11b94f87231adeabbdd878a2",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"ref": "nixpkgs-20.09-darwin",
|
"ref": "nixos-22.05-small",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
@ -400,29 +654,13 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"nixpkgs-2009": {
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1624271064,
|
|
||||||
"narHash": "sha256-qns/uRW7MR2EfVf6VEeLgCsCp7pIOjDeR44JzTF09MA=",
|
|
||||||
"owner": "NixOS",
|
|
||||||
"repo": "nixpkgs",
|
|
||||||
"rev": "46d1c3f28ca991601a53e9a14fdd53fcd3dd8416",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"owner": "NixOS",
|
|
||||||
"ref": "nixpkgs-20.09-darwin",
|
|
||||||
"repo": "nixpkgs",
|
|
||||||
"type": "github"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"nixpkgs-2105": {
|
"nixpkgs-2105": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1624291665,
|
"lastModified": 1659914493,
|
||||||
"narHash": "sha256-kNkaoa3dai9WOi7fsPklCCWZ8hRAkXx0ZUhpYKShyUk=",
|
"narHash": "sha256-lkA5X3VNMKirvA+SUzvEhfA7XquWLci+CGi505YFAIs=",
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "3c6f3f84af60a8ed5b8a79cf3026b7630fcdefb8",
|
"rev": "022caabb5f2265ad4006c1fa5b1ebe69fb0c3faf",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@ -432,6 +670,86 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"nixpkgs-2111": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1659446231,
|
||||||
|
"narHash": "sha256-hekabNdTdgR/iLsgce5TGWmfIDZ86qjPhxDg/8TlzhE=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "eabc38219184cc3e04a974fe31857d8e0eac098d",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"ref": "nixpkgs-21.11-darwin",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs-2205": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1685573264,
|
||||||
|
"narHash": "sha256-Zffu01pONhs/pqH07cjlF10NnMDLok8ix5Uk4rhOnZQ=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "380be19fbd2d9079f677978361792cb25e8a3635",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"ref": "nixpkgs-22.05-darwin",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs-2211": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1688392541,
|
||||||
|
"narHash": "sha256-lHrKvEkCPTUO+7tPfjIcb7Trk6k31rz18vkyqmkeJfY=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "ea4c80b39be4c09702b0cb3b42eab59e2ba4f24b",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"ref": "nixpkgs-22.11-darwin",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs-2305": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1701362232,
|
||||||
|
"narHash": "sha256-GVdzxL0lhEadqs3hfRLuj+L1OJFGiL/L7gCcelgBlsw=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "d2332963662edffacfddfad59ff4f709dde80ffe",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"ref": "nixpkgs-23.05-darwin",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs-2311": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1701386440,
|
||||||
|
"narHash": "sha256-xI0uQ9E7JbmEy/v8kR9ZQan6389rHug+zOtZeZFiDJk=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "293822e55ec1872f715a66d0eda9e592dc14419f",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"ref": "nixpkgs-23.11-darwin",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
"nixpkgs-recent": {
|
"nixpkgs-recent": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1669833724,
|
"lastModified": 1669833724,
|
||||||
@ -448,19 +766,35 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"nixpkgs-unstable": {
|
"nixpkgs-regression": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1628785280,
|
"lastModified": 1643052045,
|
||||||
"narHash": "sha256-2B5eMrEr6O8ff2aQNeVxTB+9WrGE80OB4+oM6T7fOcc=",
|
"narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=",
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "6525bbc06a39f26750ad8ee0d40000ddfdc24acb",
|
"rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"ref": "nixpkgs-unstable",
|
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
|
"rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs-unstable": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1694822471,
|
||||||
|
"narHash": "sha256-6fSDCj++lZVMZlyqOe9SIOL8tYSBz1bI8acwovRwoX8=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "47585496bcb13fb72e4a90daeea2f434e2501998",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "47585496bcb13fb72e4a90daeea2f434e2501998",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -483,16 +817,16 @@
|
|||||||
"old-ghc-nix": {
|
"old-ghc-nix": {
|
||||||
"flake": false,
|
"flake": false,
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1621819714,
|
"lastModified": 1631092763,
|
||||||
"narHash": "sha256-EJCnYQSWk7FRLwS0lZgTWIiQ6pcvDX1VuD6LGD4Uwzs=",
|
"narHash": "sha256-sIKgO+z7tj4lw3u6oBZxqIhDrzSkvpHtv0Kki+lh9Fg=",
|
||||||
"owner": "angerman",
|
"owner": "angerman",
|
||||||
"repo": "old-ghc-nix",
|
"repo": "old-ghc-nix",
|
||||||
"rev": "f089a6f090cdb35fcf95f865fc6a31ba6b3ac4eb",
|
"rev": "af48a7a7353e418119b6dfe3cd1463a657f342b8",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"owner": "angerman",
|
"owner": "angerman",
|
||||||
"ref": "master2",
|
"ref": "master",
|
||||||
"repo": "old-ghc-nix",
|
"repo": "old-ghc-nix",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
@ -539,11 +873,11 @@
|
|||||||
"stackage": {
|
"stackage": {
|
||||||
"flake": false,
|
"flake": false,
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1629940472,
|
"lastModified": 1705795852,
|
||||||
"narHash": "sha256-LFrNC25OpNoS6dGG5om+UGP8YdYjp01Qm6cenbemaVg=",
|
"narHash": "sha256-Po+1G5KgHVRbP/PzK3HgdI1ZS7XJtP63vJmpSZMvFV8=",
|
||||||
"owner": "input-output-hk",
|
"owner": "input-output-hk",
|
||||||
"repo": "stackage.nix",
|
"repo": "stackage.nix",
|
||||||
"rev": "c50dd0527babf85818cc67a7099e532e453752db",
|
"rev": "8adfc78e62d3dbc3498a03579a50f3cf70cd4328",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
|||||||
24
flake.nix
24
flake.nix
@ -114,7 +114,9 @@
|
|||||||
(final: prev: let
|
(final: prev: let
|
||||||
pkgs-recent = import nixpkgs-recent { inherit system; };
|
pkgs-recent = import nixpkgs-recent { inherit system; };
|
||||||
in {
|
in {
|
||||||
inherit (pkgs-recent) dockerTools node2nix glibcLocalesUtf8 tzdata chromium minio minio-client skopeo; inherit (pkgs-recent.stdenv) fetchurlBoot;
|
inherit (pkgs-recent) gup dockerTools nodejs-14_x glibcLocalesUtf8 tzdata chromium minio minio-client skopeo;
|
||||||
|
inherit (pkgs-recent.stdenv) fetchurlBoot make;
|
||||||
|
inherit (pkgs-recent.coreutils) touch;
|
||||||
stack = pkgs.symlinkJoin {
|
stack = pkgs.symlinkJoin {
|
||||||
inherit (pkgs-recent.stack) name;
|
inherit (pkgs-recent.stack) name;
|
||||||
paths = [pkgs-recent.stack];
|
paths = [pkgs-recent.stack];
|
||||||
@ -133,36 +135,16 @@
|
|||||||
};
|
};
|
||||||
})
|
})
|
||||||
|
|
||||||
(import ./nix/maildev)
|
|
||||||
haskell-nix.overlay
|
haskell-nix.overlay
|
||||||
(import ./nix/uniworx { inherit inputs frontendSource backendSource; gitRevision = if self ? rev then self.rev else null; })
|
|
||||||
(import ./nix/docker { inherit self; })
|
|
||||||
(import ./nix/parse-changelog.nix {})
|
|
||||||
];
|
];
|
||||||
|
|
||||||
haskellFlake = pkgs.uniworx.flake {};
|
haskellFlake = pkgs.uniworx.flake {};
|
||||||
|
|
||||||
inherit (pkgs.lib) recursiveUpdate;
|
inherit (pkgs.lib) recursiveUpdate;
|
||||||
in {
|
in {
|
||||||
packages = haskellFlake.packages // {
|
|
||||||
inherit (pkgs) uniworxNodeDependencies uniworxWellKnown uniworxFrontend uniworxTestDocker uniworxDocker changelogJson;
|
|
||||||
};
|
|
||||||
|
|
||||||
apps = haskellFlake.apps // {
|
|
||||||
calculateMaterializedSha = flake-utils.lib.mkApp { drv = pkgs.uniworx.stack-nix.passthru.calculateMaterializedSha; exePath = ""; };
|
|
||||||
jqChangelogJson = flake-utils.lib.mkApp { drv = pkgs.jqChangelogJson; };
|
|
||||||
};
|
|
||||||
|
|
||||||
checks = haskellFlake.checks // {
|
|
||||||
uniworxFrontend = pkgs.uniworxFrontend.check;
|
|
||||||
};
|
|
||||||
|
|
||||||
devShell = import ./shell.nix { pkgs = self.legacyPackages.${system}; nixpkgsPath = nixpkgs; };
|
devShell = import ./shell.nix { pkgs = self.legacyPackages.${system}; nixpkgsPath = nixpkgs; };
|
||||||
|
|
||||||
legacyPackages = pkgs.lib.foldr (overlay: acc: acc // recursiveUpdate (overlay self.legacyPackages.${system} pkgs) pkgs) {} overlays;
|
legacyPackages = pkgs.lib.foldr (overlay: acc: acc // recursiveUpdate (overlay self.legacyPackages.${system} pkgs) pkgs) {} overlays;
|
||||||
|
|
||||||
defaultPackage = self.packages.${system}."uniworx:exe:uniworx";
|
|
||||||
defaultApp = self.apps.${system}."uniworx:exe:uniworx";
|
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,15 +0,0 @@
|
|||||||
# SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
|
||||||
|
|
||||||
final: prev:
|
|
||||||
let
|
|
||||||
awsPatch = prev.fetchurl {
|
|
||||||
url = "https://github.com/gkleen/nix/commit/fd67a0f927ec0711eba59714939ff939fc95db38.diff";
|
|
||||||
hash = "sha256-1dJ9zGQvYu5b47O2NjdggSSinlGQDcqBwXoZcKUGfYQ=";
|
|
||||||
};
|
|
||||||
in {
|
|
||||||
nixUnstable = prev.nixUnstable.overrideAttrs (oldAttrs: {
|
|
||||||
patches = oldAttrs.patches or [] ++ [ awsPatch ];
|
|
||||||
});
|
|
||||||
}
|
|
||||||
217
nix/develop.nix
217
nix/develop.nix
@ -1,217 +0,0 @@
|
|||||||
# SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
|
||||||
|
|
||||||
{ pkgs
|
|
||||||
, prev ? pkgs
|
|
||||||
, doPortOffset ? true
|
|
||||||
, doDevelopEnv ? true
|
|
||||||
}:
|
|
||||||
|
|
||||||
with prev.lib;
|
|
||||||
|
|
||||||
let
|
|
||||||
withDevelop = action: ''
|
|
||||||
#!${pkgs.zsh}/bin/zsh -e
|
|
||||||
|
|
||||||
${optionalString doDevelopEnv ''
|
|
||||||
basePath=$(pwd)
|
|
||||||
exec 4<>''${basePath}/.develop.env
|
|
||||||
|
|
||||||
flockRes=
|
|
||||||
set +e
|
|
||||||
${pkgs.util-linux}/bin/flock -en 4; flockRes=$?
|
|
||||||
set -e
|
|
||||||
if [[ ''${flockRes} -ne 0 ]]; then
|
|
||||||
echo "Could not take exclusive lock; is another develop running?" >&2
|
|
||||||
exit ''${flockRes}
|
|
||||||
fi
|
|
||||||
''}
|
|
||||||
|
|
||||||
cleanup() {
|
|
||||||
set +e -x
|
|
||||||
type cleanup_postgres &>/dev/null && cleanup_postgres
|
|
||||||
type cleanup_widget_memcached &>/dev/null && cleanup_widget_memcached
|
|
||||||
type cleanup_session_memcached &>/dev/null && cleanup_session_memcached
|
|
||||||
type cleanup_cache_memcached &>/dev/null && cleanup_cache_memcached
|
|
||||||
type cleanup_minio &>/dev/null && cleanup_minio
|
|
||||||
type cleanup_maildev &>/dev/null && cleanup_maildev
|
|
||||||
|
|
||||||
${optionalString doDevelopEnv ''
|
|
||||||
[ -f "''${basePath}/.develop.env" ] && rm -vf "''${basePath}/.develop.env"
|
|
||||||
''}
|
|
||||||
set +x
|
|
||||||
}
|
|
||||||
|
|
||||||
trap cleanup EXIT
|
|
||||||
|
|
||||||
export PORT_OFFSET=${if doPortOffset then "$(((16#$(echo \"fradrive $(whoami)\" | sha256sum | head -c 16)) % 1000))" else "0"}
|
|
||||||
|
|
||||||
if [[ -z "$PGHOST" ]]; then
|
|
||||||
set -xe
|
|
||||||
|
|
||||||
pgDir=$(mktemp -d --tmpdir=''${XDG_RUNTIME_DIR} postgresql.XXXXXX)
|
|
||||||
pgSockDir=$(mktemp -d --tmpdir=''${XDG_RUNTIME_DIR} postgresql.sock.XXXXXX)
|
|
||||||
pgLogFile=$(mktemp --tmpdir=''${XDG_RUNTIME_DIR} postgresql.XXXXXX.log)
|
|
||||||
initdb --no-locale -D ''${pgDir}
|
|
||||||
pg_ctl start -D ''${pgDir} -l ''${pgLogFile} -w -o "-k ''${pgSockDir} -c listen_addresses=''' -c hba_file='${postgresHba}' -c unix_socket_permissions=0700 -c max_connections=9990 -c shared_preload_libraries=pg_stat_statements -c auto_explain.log_min_duration=100ms"
|
|
||||||
psql -h ''${pgSockDir} -f ${postgresSchema} postgres
|
|
||||||
printf "Postgres logfile is %s\nPostgres socket directory is %s\n" ''${pgLogFile} ''${pgSockDir}
|
|
||||||
|
|
||||||
export PGHOST=''${pgSockDir}
|
|
||||||
export PGLOG=''${pgLogFile}
|
|
||||||
|
|
||||||
cleanup_postgres() {
|
|
||||||
set +e -x
|
|
||||||
pg_ctl stop -D ''${pgDir}
|
|
||||||
rm -rvf ''${pgDir} ''${pgSockDir} ''${pgLogFile}
|
|
||||||
set +x
|
|
||||||
}
|
|
||||||
|
|
||||||
set +xe
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -z "$WIDGET_MEMCACHED_HOST" ]]; then
|
|
||||||
set -xe
|
|
||||||
|
|
||||||
memcached -l localhost -p $(($PORT_OFFSET + 11211)) &>/dev/null &
|
|
||||||
widget_memcached_pid=$!
|
|
||||||
|
|
||||||
export WIDGET_MEMCACHED_HOST=localhost
|
|
||||||
export WIDGET_MEMCACHED_PORT=$(($PORT_OFFSET + 11211))
|
|
||||||
|
|
||||||
cleanup_widget_memcached() {
|
|
||||||
[[ -n "$widget_memcached_pid" ]] && kill $widget_memcached_pid
|
|
||||||
}
|
|
||||||
|
|
||||||
set +xe
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -z "$SESSION_MEMCACHED_HOST" ]]; then
|
|
||||||
set -xe
|
|
||||||
|
|
||||||
memcached -l localhost -p $(($PORT_OFFSET + 11212)) &>/dev/null &
|
|
||||||
session_memcached_pid=$!
|
|
||||||
|
|
||||||
export SESSION_MEMCACHED_HOST=localhost
|
|
||||||
export SESSION_MEMCACHED_PORT=$(($PORT_OFFSET + 11212))
|
|
||||||
|
|
||||||
cleanup_session_memcached() {
|
|
||||||
[[ -n "$session_memcached_pid" ]] && kill $session_memcached_pid
|
|
||||||
}
|
|
||||||
|
|
||||||
set +xe
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -z "$MEMCACHED_HOST" ]]; then
|
|
||||||
set -xe
|
|
||||||
|
|
||||||
memcached -l localhost -p $(($PORT_OFFSET + 11213)) &>/dev/null &
|
|
||||||
memcached_pid=$!
|
|
||||||
|
|
||||||
export MEMCACHED_HOST=localhost
|
|
||||||
export MEMCACHED_PORT=$(($PORT_OFFSET + 11212))
|
|
||||||
|
|
||||||
cleanup_session_memcached() {
|
|
||||||
[[ -n "$memcached_pid" ]] && kill $memcached_pid
|
|
||||||
}
|
|
||||||
|
|
||||||
set +xe
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -z "$UPLOAD_S3_HOST" ]]; then
|
|
||||||
set -xe
|
|
||||||
|
|
||||||
cleanup_minio() {
|
|
||||||
[[ -n "$minio_pid" ]] && kill $minio_pid
|
|
||||||
[[ -n "''${MINIO_DIR}" ]] && rm -rvf ''${MINIO_DIR}
|
|
||||||
[[ -n "''${MINIO_LOGFILE}" ]] && rm -rvf ''${MINIO_LOGFILE}
|
|
||||||
}
|
|
||||||
|
|
||||||
export MINIO_DIR=$(mktemp -d --tmpdir=''${XDG_RUNTIME_DIR} minio.XXXXXX)
|
|
||||||
export MINIO_LOGFILE=$(mktemp --tmpdir=''${XDG_RUNTIME_DIR} minio.XXXXXX.log)
|
|
||||||
export MINIO_ACCESS_KEY=$(${pkgs.pwgen}/bin/pwgen -s 16 1)
|
|
||||||
export MINIO_SECRET_KEY=$(${pkgs.pwgen}/bin/pwgen -s 32 1)
|
|
||||||
|
|
||||||
minio server --address localhost:$(($PORT_OFFSET + 9000)) ''${MINIO_DIR} &>''${MINIO_LOGFILE} &
|
|
||||||
minio_pid=$!
|
|
||||||
|
|
||||||
export UPLOAD_S3_HOST=localhost
|
|
||||||
export UPLOAD_S3_PORT=$(($PORT_OFFSET + 9000))
|
|
||||||
export UPLOAD_S3_SSL=false
|
|
||||||
export UPLOAD_S3_KEY_ID=''${MINIO_ACCESS_KEY}
|
|
||||||
export UPLOAD_S3_KEY=''${MINIO_SECRET_KEY}
|
|
||||||
|
|
||||||
sleep 1
|
|
||||||
|
|
||||||
set +xe
|
|
||||||
fi
|
|
||||||
|
|
||||||
${optionalString (pkgs.nodePackages ? "maildev") ''
|
|
||||||
if [[ -z "$SMTPHOST" ]]; then
|
|
||||||
set -xe
|
|
||||||
|
|
||||||
cleanup_maildev() {
|
|
||||||
[[ -n "$maildev_pid" ]] && kill $maildev_pid
|
|
||||||
}
|
|
||||||
|
|
||||||
TMPDIR=''${XDG_RUNTIME_DIR} ${pkgs.nodePackages.maildev}/bin/maildev --smtp $(($PORT_OFFSET + 1025)) --web $(($PORT_OFFSET + 8080)) --ip localhost --web-ip localhost &>/dev/null &
|
|
||||||
maildev_pid=$!
|
|
||||||
|
|
||||||
export SMTPHOST=localhost
|
|
||||||
export SMTPPORT=$(($PORT_OFFSET + 1025))
|
|
||||||
export SMTPSSL=none
|
|
||||||
|
|
||||||
set +xe
|
|
||||||
fi
|
|
||||||
''}
|
|
||||||
|
|
||||||
${optionalString doDevelopEnv ''
|
|
||||||
set -xe
|
|
||||||
|
|
||||||
cat >&4 <<EOF
|
|
||||||
PORT_OFFSET=''${PORT_OFFSET}
|
|
||||||
|
|
||||||
PGHOST=''${pgSockDir}
|
|
||||||
PGLOG=''${pgLogFile}
|
|
||||||
|
|
||||||
WIDGET_MEMCACHED_HOST=localhost
|
|
||||||
WIDGET_MEMCACHED_PORT=$(($PORT_OFFSET + 11211))
|
|
||||||
|
|
||||||
SESSION_MEMCACHED_HOST=localhost
|
|
||||||
SESSION_MEMCACHED_PORT=$(($PORT_OFFSET + 11212))
|
|
||||||
|
|
||||||
MEMCACHED_HOST=localhost
|
|
||||||
MEMCACHED_PORT=$(($PORT_OFFSET + 11212))
|
|
||||||
|
|
||||||
MINIO_DIR=''${MINIO_DIR}
|
|
||||||
MINIO_LOGFILE=''${MINIO_LOGFILE}
|
|
||||||
UPLOAD_S3_HOST=localhost
|
|
||||||
UPLOAD_S3_PORT=$(($PORT_OFFSET + 9000))
|
|
||||||
UPLOAD_S3_SSL=false
|
|
||||||
UPLOAD_S3_KEY_ID=''${MINIO_ACCESS_KEY}
|
|
||||||
UPLOAD_S3_KEY=''${MINIO_SECRET_KEY}
|
|
||||||
|
|
||||||
SMTPHOST=''${SMTPHOST}
|
|
||||||
SMTPPORT=''${SMTPPORT}
|
|
||||||
SMTPSSL=''${SMTPSSL}
|
|
||||||
EOF
|
|
||||||
|
|
||||||
set +xe
|
|
||||||
''}
|
|
||||||
|
|
||||||
${action}
|
|
||||||
'';
|
|
||||||
|
|
||||||
postgresSchema = prev.writeText "schema.sql" ''
|
|
||||||
CREATE USER uniworx WITH SUPERUSER;
|
|
||||||
CREATE DATABASE uniworx_test;
|
|
||||||
GRANT ALL ON DATABASE uniworx_test TO uniworx;
|
|
||||||
CREATE DATABASE uniworx;
|
|
||||||
GRANT ALL ON DATABASE uniworx TO uniworx;
|
|
||||||
'';
|
|
||||||
|
|
||||||
postgresHba = prev.writeText "hba_file" ''
|
|
||||||
local all all trust
|
|
||||||
'';
|
|
||||||
in withDevelop
|
|
||||||
@ -1,116 +0,0 @@
|
|||||||
# SPDX-FileCopyrightText: 2022-2023 Sarah Vaupel <sarah.vaupel@uniworx.de>, Gregor Kleen <gregor@kleen.consulting>, Steffen Jost <jost@tcs.ifi.lmu.de>
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
|
||||||
|
|
||||||
{ self }: final: prev:
|
|
||||||
|
|
||||||
with prev.lib;
|
|
||||||
|
|
||||||
let
|
|
||||||
created =
|
|
||||||
let
|
|
||||||
fromDate = builtins.readFile (prev.runCommand "date" { nativeBuildInputs = with final; [ coreutils ]; } ''
|
|
||||||
printf '%s' $(date -Is -d '@${toString self.lastModified}') > $out
|
|
||||||
'');
|
|
||||||
in if self ? lastModified then fromDate else "1970-01-01T00:00:01Z";
|
|
||||||
|
|
||||||
mkUniworxDocker = { isTest }: prev.dockerTools.buildImage {
|
|
||||||
name = "uniworx${optionalString isTest "-test"}";
|
|
||||||
tag =
|
|
||||||
let
|
|
||||||
versionFile = if isTest then ./test-version.json else ./version.json;
|
|
||||||
in (builtins.fromJSON (prev.lib.readFile versionFile)).version;
|
|
||||||
inherit created;
|
|
||||||
|
|
||||||
contents = with final; [
|
|
||||||
uniworx.uniworx.components.exes.uniworx
|
|
||||||
prev.dockerTools.binSh findutils coreutils
|
|
||||||
iana-etc
|
|
||||||
# for PDF creation with Pandoc and LuaTeX
|
|
||||||
#cups # needed for interface with print center -- did not work as intended, requires lpd running
|
|
||||||
busybox # should provide a working lpr -- to be tested
|
|
||||||
htop
|
|
||||||
pdftk # for encrypting pdfs
|
|
||||||
#texlive.combined.scheme-medium # too large for container in LMU build environment.
|
|
||||||
(texlive.combine {
|
|
||||||
inherit (texlive) scheme-basic
|
|
||||||
babel-german babel-english booktabs textpos
|
|
||||||
enumitem eurosym koma-script parskip xcolor dejavu
|
|
||||||
# required fro LuaTeX
|
|
||||||
luatexbase lualatex-math unicode-math selnolig
|
|
||||||
;
|
|
||||||
})
|
|
||||||
# just for manual testing within the pod, may be removef for production?
|
|
||||||
curl wget netcat openldap
|
|
||||||
unixtools.netstat htop gnugrep
|
|
||||||
locale
|
|
||||||
];
|
|
||||||
|
|
||||||
runAsRoot = ''
|
|
||||||
#!${final.stdenv.shell}
|
|
||||||
|
|
||||||
${prev.dockerTools.shadowSetup}
|
|
||||||
|
|
||||||
mkdir -p /var/lib
|
|
||||||
|
|
||||||
groupadd -r uniworx
|
|
||||||
useradd -r -g uniworx -d /var/lib/uniworx -M uniworx --uid 999
|
|
||||||
install -d -g uniworx -o uniworx -m 0750 /var/lib/uniworx
|
|
||||||
|
|
||||||
mkdir -p /var/log
|
|
||||||
install -d -g uniworx -o uniworx -m 0755 /var/log/uniworx
|
|
||||||
|
|
||||||
mkdir -p /usr/local/share/fonts
|
|
||||||
'';
|
|
||||||
# TODO copy font ttf files to /usr/local/share/fonts; they should then be accessible for LuaLaTeX
|
|
||||||
|
|
||||||
config =
|
|
||||||
let
|
|
||||||
entrypoint = prev.writeScriptBin "uniworx-entrypoint" ''
|
|
||||||
#!${final.zsh}/bin/zsh -xe
|
|
||||||
|
|
||||||
cTime=$(date -Is)
|
|
||||||
|
|
||||||
# export LOGDEST=/var/log/uniworx/''${cTime}.log # kubernetes prefers log via stdout
|
|
||||||
typeset -a configs
|
|
||||||
configs=()
|
|
||||||
configDir=''${CONFIG_DIR-/cfg}
|
|
||||||
if [[ -d "''${configDir}" ]]; then
|
|
||||||
while IFS= read -d $'\0' cfg; do
|
|
||||||
configs+=("''${(q)cfg}")
|
|
||||||
done < <(find "''${configDir}" \( -name '*.yml' -o -name '*.yaml' \) -print0 | sort -rz)
|
|
||||||
fi
|
|
||||||
configs+=('${uniworxConfig}')
|
|
||||||
cd /var/lib/uniworx
|
|
||||||
exec -- uniworx ''${configs}
|
|
||||||
'';
|
|
||||||
postgresSchema = prev.writeText "schema.sql" ''
|
|
||||||
CREATE USER uniworx WITH SUPERUSER;
|
|
||||||
CREATE DATABASE uniworx;
|
|
||||||
GRANT ALL ON DATABASE uniworx TO uniworx;
|
|
||||||
'';
|
|
||||||
|
|
||||||
postgresHba = prev.writeText "hba_file" ''
|
|
||||||
local all all trust
|
|
||||||
'';
|
|
||||||
uniworxConfig = prev.writeText "uni2work.yml" ''
|
|
||||||
port: 8080
|
|
||||||
approot: "_env:APPROOT:http://localhost:8080"
|
|
||||||
'';
|
|
||||||
in {
|
|
||||||
Cmd = [ "${entrypoint}/bin/uniworx-entrypoint" ];
|
|
||||||
User = "uniworx:uniworx";
|
|
||||||
ExposedPorts = {
|
|
||||||
"8080/tcp" = {};
|
|
||||||
};
|
|
||||||
Volumes = {
|
|
||||||
"/var/lib/uniworx" = {};
|
|
||||||
"/var/log" = {};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
in
|
|
||||||
mapAttrs (_name: mkUniworxDocker) {
|
|
||||||
uniworxTestDocker = { isTest = true; };
|
|
||||||
uniworxDocker = { isTest = false; };
|
|
||||||
}
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
{
|
|
||||||
"version": "27.4.18"
|
|
||||||
}
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
SPDX-FileCopyrightText: 2022-2023 Sarah Vaupel <sarah.vaupel@uniworx.de>, Gregor Kleen <gregor.kleen@ifi.lmu.de>, Steffen Jost <jost@tcs.ifi.lmu.de>
|
|
||||||
|
|
||||||
SPDX-License-Identifier: AGPL-3.0-or-later
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
{
|
|
||||||
"version": "27.4.59"
|
|
||||||
}
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>,Steffen Jost <jost@tcs.ifi.lmu.de>
|
|
||||||
|
|
||||||
SPDX-License-Identifier: AGPL-3.0-or-later
|
|
||||||
@ -1,19 +0,0 @@
|
|||||||
# SPDX-FileCopyrightText: 2022-2023 Gregor Kleen <gregor@kleen.consulting>, Sarah Vaupel <sarah.vaupel@ifi.lmu.de>
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
|
||||||
|
|
||||||
{pkgs ? import <nixpkgs> {
|
|
||||||
inherit system;
|
|
||||||
}, system ? builtins.currentSystem, nodejs ? pkgs."nodejs-14_x"}:
|
|
||||||
|
|
||||||
let
|
|
||||||
nodeEnv = import ./node-env.nix {
|
|
||||||
inherit (pkgs) stdenv lib python2 runCommand writeTextFile writeShellScript;
|
|
||||||
inherit pkgs nodejs;
|
|
||||||
libtool = if pkgs.stdenv.isDarwin then pkgs.darwin.cctools else null;
|
|
||||||
};
|
|
||||||
in
|
|
||||||
import ./node-packages.nix {
|
|
||||||
inherit (pkgs) fetchurl fetchurlBoot nix-gitignore stdenv lib fetchgit;
|
|
||||||
inherit nodeEnv;
|
|
||||||
}
|
|
||||||
@ -1,689 +0,0 @@
|
|||||||
# This file originates from node2nix
|
|
||||||
|
|
||||||
{lib, stdenv, nodejs, python2, pkgs, libtool, runCommand, writeTextFile, writeShellScript}:
|
|
||||||
|
|
||||||
let
|
|
||||||
# Workaround to cope with utillinux in Nixpkgs 20.09 and util-linux in Nixpkgs master
|
|
||||||
utillinux = if pkgs ? utillinux then pkgs.utillinux else pkgs.util-linux;
|
|
||||||
|
|
||||||
python = if nodejs ? python then nodejs.python else python2;
|
|
||||||
|
|
||||||
# Create a tar wrapper that filters all the 'Ignoring unknown extended header keyword' noise
|
|
||||||
tarWrapper = runCommand "tarWrapper" {} ''
|
|
||||||
mkdir -p $out/bin
|
|
||||||
|
|
||||||
cat > $out/bin/tar <<EOF
|
|
||||||
#! ${stdenv.shell} -e
|
|
||||||
$(type -p tar) "\$@" --warning=no-unknown-keyword --delay-directory-restore
|
|
||||||
EOF
|
|
||||||
|
|
||||||
chmod +x $out/bin/tar
|
|
||||||
'';
|
|
||||||
|
|
||||||
# Function that generates a TGZ file from a NPM project
|
|
||||||
buildNodeSourceDist =
|
|
||||||
{ name, version, src, ... }:
|
|
||||||
|
|
||||||
stdenv.mkDerivation {
|
|
||||||
name = "node-tarball-${name}-${version}";
|
|
||||||
inherit src;
|
|
||||||
buildInputs = [ nodejs ];
|
|
||||||
buildPhase = ''
|
|
||||||
export HOME=$TMPDIR
|
|
||||||
tgzFile=$(npm pack | tail -n 1) # Hooks to the pack command will add output (https://docs.npmjs.com/misc/scripts)
|
|
||||||
'';
|
|
||||||
installPhase = ''
|
|
||||||
mkdir -p $out/tarballs
|
|
||||||
mv $tgzFile $out/tarballs
|
|
||||||
mkdir -p $out/nix-support
|
|
||||||
echo "file source-dist $out/tarballs/$tgzFile" >> $out/nix-support/hydra-build-products
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
# Common shell logic
|
|
||||||
installPackage = writeShellScript "install-package" ''
|
|
||||||
installPackage() {
|
|
||||||
local packageName=$1 src=$2
|
|
||||||
|
|
||||||
local strippedName
|
|
||||||
|
|
||||||
local DIR=$PWD
|
|
||||||
cd $TMPDIR
|
|
||||||
|
|
||||||
unpackFile $src
|
|
||||||
|
|
||||||
# Make the base dir in which the target dependency resides first
|
|
||||||
mkdir -p "$(dirname "$DIR/$packageName")"
|
|
||||||
|
|
||||||
if [ -f "$src" ]
|
|
||||||
then
|
|
||||||
# Figure out what directory has been unpacked
|
|
||||||
packageDir="$(find . -maxdepth 1 -type d | tail -1)"
|
|
||||||
|
|
||||||
# Restore write permissions to make building work
|
|
||||||
find "$packageDir" -type d -exec chmod u+x {} \;
|
|
||||||
chmod -R u+w "$packageDir"
|
|
||||||
|
|
||||||
# Move the extracted tarball into the output folder
|
|
||||||
mv "$packageDir" "$DIR/$packageName"
|
|
||||||
elif [ -d "$src" ]
|
|
||||||
then
|
|
||||||
# Get a stripped name (without hash) of the source directory.
|
|
||||||
# On old nixpkgs it's already set internally.
|
|
||||||
if [ -z "$strippedName" ]
|
|
||||||
then
|
|
||||||
strippedName="$(stripHash $src)"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Restore write permissions to make building work
|
|
||||||
chmod -R u+w "$strippedName"
|
|
||||||
|
|
||||||
# Move the extracted directory into the output folder
|
|
||||||
mv "$strippedName" "$DIR/$packageName"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Change to the package directory to install dependencies
|
|
||||||
cd "$DIR/$packageName"
|
|
||||||
}
|
|
||||||
'';
|
|
||||||
|
|
||||||
# Bundle the dependencies of the package
|
|
||||||
#
|
|
||||||
# Only include dependencies if they don't exist. They may also be bundled in the package.
|
|
||||||
includeDependencies = {dependencies}:
|
|
||||||
lib.optionalString (dependencies != []) (
|
|
||||||
''
|
|
||||||
mkdir -p node_modules
|
|
||||||
cd node_modules
|
|
||||||
''
|
|
||||||
+ (lib.concatMapStrings (dependency:
|
|
||||||
''
|
|
||||||
if [ ! -e "${dependency.packageName}" ]; then
|
|
||||||
${composePackage dependency}
|
|
||||||
fi
|
|
||||||
''
|
|
||||||
) dependencies)
|
|
||||||
+ ''
|
|
||||||
cd ..
|
|
||||||
''
|
|
||||||
);
|
|
||||||
|
|
||||||
# Recursively composes the dependencies of a package
|
|
||||||
composePackage = { name, packageName, src, dependencies ? [], ... }@args:
|
|
||||||
builtins.addErrorContext "while evaluating node package '${packageName}'" ''
|
|
||||||
installPackage "${packageName}" "${src}"
|
|
||||||
${includeDependencies { inherit dependencies; }}
|
|
||||||
cd ..
|
|
||||||
${lib.optionalString (builtins.substring 0 1 packageName == "@") "cd .."}
|
|
||||||
'';
|
|
||||||
|
|
||||||
pinpointDependencies = {dependencies, production}:
|
|
||||||
let
|
|
||||||
pinpointDependenciesFromPackageJSON = writeTextFile {
|
|
||||||
name = "pinpointDependencies.js";
|
|
||||||
text = ''
|
|
||||||
var fs = require('fs');
|
|
||||||
var path = require('path');
|
|
||||||
|
|
||||||
function resolveDependencyVersion(location, name) {
|
|
||||||
if(location == process.env['NIX_STORE']) {
|
|
||||||
return null;
|
|
||||||
} else {
|
|
||||||
var dependencyPackageJSON = path.join(location, "node_modules", name, "package.json");
|
|
||||||
|
|
||||||
if(fs.existsSync(dependencyPackageJSON)) {
|
|
||||||
var dependencyPackageObj = JSON.parse(fs.readFileSync(dependencyPackageJSON));
|
|
||||||
|
|
||||||
if(dependencyPackageObj.name == name) {
|
|
||||||
return dependencyPackageObj.version;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return resolveDependencyVersion(path.resolve(location, ".."), name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function replaceDependencies(dependencies) {
|
|
||||||
if(typeof dependencies == "object" && dependencies !== null) {
|
|
||||||
for(var dependency in dependencies) {
|
|
||||||
var resolvedVersion = resolveDependencyVersion(process.cwd(), dependency);
|
|
||||||
|
|
||||||
if(resolvedVersion === null) {
|
|
||||||
process.stderr.write("WARNING: cannot pinpoint dependency: "+dependency+", context: "+process.cwd()+"\n");
|
|
||||||
} else {
|
|
||||||
dependencies[dependency] = resolvedVersion;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Read the package.json configuration */
|
|
||||||
var packageObj = JSON.parse(fs.readFileSync('./package.json'));
|
|
||||||
|
|
||||||
/* Pinpoint all dependencies */
|
|
||||||
replaceDependencies(packageObj.dependencies);
|
|
||||||
if(process.argv[2] == "development") {
|
|
||||||
replaceDependencies(packageObj.devDependencies);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
packageObj.devDependencies = {};
|
|
||||||
}
|
|
||||||
replaceDependencies(packageObj.optionalDependencies);
|
|
||||||
replaceDependencies(packageObj.peerDependencies);
|
|
||||||
|
|
||||||
/* Write the fixed package.json file */
|
|
||||||
fs.writeFileSync("package.json", JSON.stringify(packageObj, null, 2));
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
in
|
|
||||||
''
|
|
||||||
node ${pinpointDependenciesFromPackageJSON} ${if production then "production" else "development"}
|
|
||||||
|
|
||||||
${lib.optionalString (dependencies != [])
|
|
||||||
''
|
|
||||||
if [ -d node_modules ]
|
|
||||||
then
|
|
||||||
cd node_modules
|
|
||||||
${lib.concatMapStrings (dependency: pinpointDependenciesOfPackage dependency) dependencies}
|
|
||||||
cd ..
|
|
||||||
fi
|
|
||||||
''}
|
|
||||||
'';
|
|
||||||
|
|
||||||
# Recursively traverses all dependencies of a package and pinpoints all
|
|
||||||
# dependencies in the package.json file to the versions that are actually
|
|
||||||
# being used.
|
|
||||||
|
|
||||||
pinpointDependenciesOfPackage = { packageName, dependencies ? [], production ? true, ... }@args:
|
|
||||||
''
|
|
||||||
if [ -d "${packageName}" ]
|
|
||||||
then
|
|
||||||
cd "${packageName}"
|
|
||||||
${pinpointDependencies { inherit dependencies production; }}
|
|
||||||
cd ..
|
|
||||||
${lib.optionalString (builtins.substring 0 1 packageName == "@") "cd .."}
|
|
||||||
fi
|
|
||||||
'';
|
|
||||||
|
|
||||||
# Extract the Node.js source code which is used to compile packages with
|
|
||||||
# native bindings
|
|
||||||
nodeSources = runCommand "node-sources" {} ''
|
|
||||||
tar --no-same-owner --no-same-permissions -xf ${nodejs.src}
|
|
||||||
mv node-* $out
|
|
||||||
'';
|
|
||||||
|
|
||||||
# Script that adds _integrity fields to all package.json files to prevent NPM from consulting the cache (that is empty)
|
|
||||||
addIntegrityFieldsScript = writeTextFile {
|
|
||||||
name = "addintegrityfields.js";
|
|
||||||
text = ''
|
|
||||||
var fs = require('fs');
|
|
||||||
var path = require('path');
|
|
||||||
|
|
||||||
function augmentDependencies(baseDir, dependencies) {
|
|
||||||
for(var dependencyName in dependencies) {
|
|
||||||
var dependency = dependencies[dependencyName];
|
|
||||||
|
|
||||||
// Open package.json and augment metadata fields
|
|
||||||
var packageJSONDir = path.join(baseDir, "node_modules", dependencyName);
|
|
||||||
var packageJSONPath = path.join(packageJSONDir, "package.json");
|
|
||||||
|
|
||||||
if(fs.existsSync(packageJSONPath)) { // Only augment packages that exist. Sometimes we may have production installs in which development dependencies can be ignored
|
|
||||||
console.log("Adding metadata fields to: "+packageJSONPath);
|
|
||||||
var packageObj = JSON.parse(fs.readFileSync(packageJSONPath));
|
|
||||||
|
|
||||||
if(dependency.integrity) {
|
|
||||||
packageObj["_integrity"] = dependency.integrity;
|
|
||||||
} else {
|
|
||||||
packageObj["_integrity"] = "sha1-000000000000000000000000000="; // When no _integrity string has been provided (e.g. by Git dependencies), add a dummy one. It does not seem to harm and it bypasses downloads.
|
|
||||||
}
|
|
||||||
|
|
||||||
if(dependency.resolved) {
|
|
||||||
packageObj["_resolved"] = dependency.resolved; // Adopt the resolved property if one has been provided
|
|
||||||
} else {
|
|
||||||
packageObj["_resolved"] = dependency.version; // Set the resolved version to the version identifier. This prevents NPM from cloning Git repositories.
|
|
||||||
}
|
|
||||||
|
|
||||||
if(dependency.from !== undefined) { // Adopt from property if one has been provided
|
|
||||||
packageObj["_from"] = dependency.from;
|
|
||||||
}
|
|
||||||
|
|
||||||
fs.writeFileSync(packageJSONPath, JSON.stringify(packageObj, null, 2));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Augment transitive dependencies
|
|
||||||
if(dependency.dependencies !== undefined) {
|
|
||||||
augmentDependencies(packageJSONDir, dependency.dependencies);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(fs.existsSync("./package-lock.json")) {
|
|
||||||
var packageLock = JSON.parse(fs.readFileSync("./package-lock.json"));
|
|
||||||
|
|
||||||
if(![1, 2].includes(packageLock.lockfileVersion)) {
|
|
||||||
process.stderr.write("Sorry, I only understand lock file versions 1 and 2!\n");
|
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(packageLock.dependencies !== undefined) {
|
|
||||||
augmentDependencies(".", packageLock.dependencies);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
# Reconstructs a package-lock file from the node_modules/ folder structure and package.json files with dummy sha1 hashes
|
|
||||||
reconstructPackageLock = writeTextFile {
|
|
||||||
name = "reconstructpackagelock.js";
|
|
||||||
text = ''
|
|
||||||
var fs = require('fs');
|
|
||||||
var path = require('path');
|
|
||||||
|
|
||||||
var packageObj = JSON.parse(fs.readFileSync("package.json"));
|
|
||||||
|
|
||||||
var lockObj = {
|
|
||||||
name: packageObj.name,
|
|
||||||
version: packageObj.version,
|
|
||||||
lockfileVersion: 2,
|
|
||||||
requires: true,
|
|
||||||
packages: {
|
|
||||||
"": {
|
|
||||||
name: packageObj.name,
|
|
||||||
version: packageObj.version,
|
|
||||||
license: packageObj.license,
|
|
||||||
bin: packageObj.bin,
|
|
||||||
dependencies: packageObj.dependencies,
|
|
||||||
engines: packageObj.engines,
|
|
||||||
optionalDependencies: packageObj.optionalDependencies
|
|
||||||
}
|
|
||||||
},
|
|
||||||
dependencies: {}
|
|
||||||
};
|
|
||||||
|
|
||||||
function augmentPackageJSON(filePath, packages, dependencies) {
|
|
||||||
var packageJSON = path.join(filePath, "package.json");
|
|
||||||
if(fs.existsSync(packageJSON)) {
|
|
||||||
var packageObj = JSON.parse(fs.readFileSync(packageJSON));
|
|
||||||
packages[filePath] = {
|
|
||||||
version: packageObj.version,
|
|
||||||
integrity: "sha1-000000000000000000000000000=",
|
|
||||||
dependencies: packageObj.dependencies,
|
|
||||||
engines: packageObj.engines,
|
|
||||||
optionalDependencies: packageObj.optionalDependencies
|
|
||||||
};
|
|
||||||
dependencies[packageObj.name] = {
|
|
||||||
version: packageObj.version,
|
|
||||||
integrity: "sha1-000000000000000000000000000=",
|
|
||||||
dependencies: {}
|
|
||||||
};
|
|
||||||
processDependencies(path.join(filePath, "node_modules"), packages, dependencies[packageObj.name].dependencies);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function processDependencies(dir, packages, dependencies) {
|
|
||||||
if(fs.existsSync(dir)) {
|
|
||||||
var files = fs.readdirSync(dir);
|
|
||||||
|
|
||||||
files.forEach(function(entry) {
|
|
||||||
var filePath = path.join(dir, entry);
|
|
||||||
var stats = fs.statSync(filePath);
|
|
||||||
|
|
||||||
if(stats.isDirectory()) {
|
|
||||||
if(entry.substr(0, 1) == "@") {
|
|
||||||
// When we encounter a namespace folder, augment all packages belonging to the scope
|
|
||||||
var pkgFiles = fs.readdirSync(filePath);
|
|
||||||
|
|
||||||
pkgFiles.forEach(function(entry) {
|
|
||||||
if(stats.isDirectory()) {
|
|
||||||
var pkgFilePath = path.join(filePath, entry);
|
|
||||||
augmentPackageJSON(pkgFilePath, packages, dependencies);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
augmentPackageJSON(filePath, packages, dependencies);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
processDependencies("node_modules", lockObj.packages, lockObj.dependencies);
|
|
||||||
|
|
||||||
fs.writeFileSync("package-lock.json", JSON.stringify(lockObj, null, 2));
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
# Script that links bins defined in package.json to the node_modules bin directory
|
|
||||||
# NPM does not do this for top-level packages itself anymore as of v7
|
|
||||||
linkBinsScript = writeTextFile {
|
|
||||||
name = "linkbins.js";
|
|
||||||
text = ''
|
|
||||||
var fs = require('fs');
|
|
||||||
var path = require('path');
|
|
||||||
|
|
||||||
var packageObj = JSON.parse(fs.readFileSync("package.json"));
|
|
||||||
|
|
||||||
var nodeModules = Array(packageObj.name.split("/").length).fill("..").join(path.sep);
|
|
||||||
|
|
||||||
if(packageObj.bin !== undefined) {
|
|
||||||
fs.mkdirSync(path.join(nodeModules, ".bin"))
|
|
||||||
|
|
||||||
if(typeof packageObj.bin == "object") {
|
|
||||||
Object.keys(packageObj.bin).forEach(function(exe) {
|
|
||||||
if(fs.existsSync(packageObj.bin[exe])) {
|
|
||||||
console.log("linking bin '" + exe + "'");
|
|
||||||
fs.symlinkSync(
|
|
||||||
path.join("..", packageObj.name, packageObj.bin[exe]),
|
|
||||||
path.join(nodeModules, ".bin", exe)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
console.log("skipping non-existent bin '" + exe + "'");
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if(fs.existsSync(packageObj.bin)) {
|
|
||||||
console.log("linking bin '" + packageObj.bin + "'");
|
|
||||||
fs.symlinkSync(
|
|
||||||
path.join("..", packageObj.name, packageObj.bin),
|
|
||||||
path.join(nodeModules, ".bin", packageObj.name.split("/").pop())
|
|
||||||
);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
console.log("skipping non-existent bin '" + packageObj.bin + "'");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if(packageObj.directories !== undefined && packageObj.directories.bin !== undefined) {
|
|
||||||
fs.mkdirSync(path.join(nodeModules, ".bin"))
|
|
||||||
|
|
||||||
fs.readdirSync(packageObj.directories.bin).forEach(function(exe) {
|
|
||||||
if(fs.existsSync(path.join(packageObj.directories.bin, exe))) {
|
|
||||||
console.log("linking bin '" + exe + "'");
|
|
||||||
fs.symlinkSync(
|
|
||||||
path.join("..", packageObj.name, packageObj.directories.bin, exe),
|
|
||||||
path.join(nodeModules, ".bin", exe)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
console.log("skipping non-existent bin '" + exe + "'");
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
prepareAndInvokeNPM = {packageName, bypassCache, reconstructLock, npmFlags, production}:
|
|
||||||
let
|
|
||||||
forceOfflineFlag = if bypassCache then "--offline" else "--registry http://www.example.com";
|
|
||||||
in
|
|
||||||
''
|
|
||||||
# Pinpoint the versions of all dependencies to the ones that are actually being used
|
|
||||||
echo "pinpointing versions of dependencies..."
|
|
||||||
source $pinpointDependenciesScriptPath
|
|
||||||
|
|
||||||
# Patch the shebangs of the bundled modules to prevent them from
|
|
||||||
# calling executables outside the Nix store as much as possible
|
|
||||||
patchShebangs .
|
|
||||||
|
|
||||||
# Deploy the Node.js package by running npm install. Since the
|
|
||||||
# dependencies have been provided already by ourselves, it should not
|
|
||||||
# attempt to install them again, which is good, because we want to make
|
|
||||||
# it Nix's responsibility. If it needs to install any dependencies
|
|
||||||
# anyway (e.g. because the dependency parameters are
|
|
||||||
# incomplete/incorrect), it fails.
|
|
||||||
#
|
|
||||||
# The other responsibilities of NPM are kept -- version checks, build
|
|
||||||
# steps, postprocessing etc.
|
|
||||||
|
|
||||||
export HOME=$TMPDIR
|
|
||||||
cd "${packageName}"
|
|
||||||
runHook preRebuild
|
|
||||||
|
|
||||||
${lib.optionalString bypassCache ''
|
|
||||||
${lib.optionalString reconstructLock ''
|
|
||||||
if [ -f package-lock.json ]
|
|
||||||
then
|
|
||||||
echo "WARNING: Reconstruct lock option enabled, but a lock file already exists!"
|
|
||||||
echo "This will most likely result in version mismatches! We will remove the lock file and regenerate it!"
|
|
||||||
rm package-lock.json
|
|
||||||
else
|
|
||||||
echo "No package-lock.json file found, reconstructing..."
|
|
||||||
fi
|
|
||||||
|
|
||||||
node ${reconstructPackageLock}
|
|
||||||
''}
|
|
||||||
|
|
||||||
node ${addIntegrityFieldsScript}
|
|
||||||
''}
|
|
||||||
|
|
||||||
npm ${forceOfflineFlag} --nodedir=${nodeSources} ${npmFlags} ${lib.optionalString production "--production"} rebuild
|
|
||||||
|
|
||||||
runHook postRebuild
|
|
||||||
|
|
||||||
if [ "''${dontNpmInstall-}" != "1" ]
|
|
||||||
then
|
|
||||||
# NPM tries to download packages even when they already exist if npm-shrinkwrap is used.
|
|
||||||
rm -f npm-shrinkwrap.json
|
|
||||||
|
|
||||||
npm ${forceOfflineFlag} --nodedir=${nodeSources} --no-bin-links --ignore-scripts ${npmFlags} ${lib.optionalString production "--production"} install
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Link executables defined in package.json
|
|
||||||
node ${linkBinsScript}
|
|
||||||
'';
|
|
||||||
|
|
||||||
# Builds and composes an NPM package including all its dependencies
|
|
||||||
buildNodePackage =
|
|
||||||
{ name
|
|
||||||
, packageName
|
|
||||||
, version ? null
|
|
||||||
, dependencies ? []
|
|
||||||
, buildInputs ? []
|
|
||||||
, production ? true
|
|
||||||
, npmFlags ? ""
|
|
||||||
, dontNpmInstall ? false
|
|
||||||
, bypassCache ? false
|
|
||||||
, reconstructLock ? false
|
|
||||||
, preRebuild ? ""
|
|
||||||
, dontStrip ? true
|
|
||||||
, unpackPhase ? "true"
|
|
||||||
, buildPhase ? "true"
|
|
||||||
, meta ? {}
|
|
||||||
, ... }@args:
|
|
||||||
|
|
||||||
let
|
|
||||||
extraArgs = removeAttrs args [ "name" "dependencies" "buildInputs" "dontStrip" "dontNpmInstall" "preRebuild" "unpackPhase" "buildPhase" "meta" ];
|
|
||||||
in
|
|
||||||
stdenv.mkDerivation ({
|
|
||||||
name = "${name}${if version == null then "" else "-${version}"}";
|
|
||||||
buildInputs = [ tarWrapper python nodejs ]
|
|
||||||
++ lib.optional (stdenv.isLinux) utillinux
|
|
||||||
++ lib.optional (stdenv.isDarwin) libtool
|
|
||||||
++ buildInputs;
|
|
||||||
|
|
||||||
inherit nodejs;
|
|
||||||
|
|
||||||
inherit dontStrip; # Stripping may fail a build for some package deployments
|
|
||||||
inherit dontNpmInstall preRebuild unpackPhase buildPhase;
|
|
||||||
|
|
||||||
compositionScript = composePackage args;
|
|
||||||
pinpointDependenciesScript = pinpointDependenciesOfPackage args;
|
|
||||||
|
|
||||||
passAsFile = [ "compositionScript" "pinpointDependenciesScript" ];
|
|
||||||
|
|
||||||
installPhase = ''
|
|
||||||
source ${installPackage}
|
|
||||||
|
|
||||||
# Create and enter a root node_modules/ folder
|
|
||||||
mkdir -p $out/lib/node_modules
|
|
||||||
cd $out/lib/node_modules
|
|
||||||
|
|
||||||
# Compose the package and all its dependencies
|
|
||||||
source $compositionScriptPath
|
|
||||||
|
|
||||||
${prepareAndInvokeNPM { inherit packageName bypassCache reconstructLock npmFlags production; }}
|
|
||||||
|
|
||||||
# Create symlink to the deployed executable folder, if applicable
|
|
||||||
if [ -d "$out/lib/node_modules/.bin" ]
|
|
||||||
then
|
|
||||||
ln -s $out/lib/node_modules/.bin $out/bin
|
|
||||||
|
|
||||||
# Fixup all executables
|
|
||||||
ls $out/bin/* | while read i
|
|
||||||
do
|
|
||||||
file="$(readlink -f "$i")"
|
|
||||||
chmod u+rwx "$file"
|
|
||||||
if isScript "$file"
|
|
||||||
then
|
|
||||||
sed -i 's/\r$//' "$file" # convert crlf to lf
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Create symlinks to the deployed manual page folders, if applicable
|
|
||||||
if [ -d "$out/lib/node_modules/${packageName}/man" ]
|
|
||||||
then
|
|
||||||
mkdir -p $out/share
|
|
||||||
for dir in "$out/lib/node_modules/${packageName}/man/"*
|
|
||||||
do
|
|
||||||
mkdir -p $out/share/man/$(basename "$dir")
|
|
||||||
for page in "$dir"/*
|
|
||||||
do
|
|
||||||
ln -s $page $out/share/man/$(basename "$dir")
|
|
||||||
done
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Run post install hook, if provided
|
|
||||||
runHook postInstall
|
|
||||||
'';
|
|
||||||
|
|
||||||
meta = {
|
|
||||||
# default to Node.js' platforms
|
|
||||||
platforms = nodejs.meta.platforms;
|
|
||||||
} // meta;
|
|
||||||
} // extraArgs);
|
|
||||||
|
|
||||||
# Builds a node environment (a node_modules folder and a set of binaries)
|
|
||||||
buildNodeDependencies =
|
|
||||||
{ name
|
|
||||||
, packageName
|
|
||||||
, version ? null
|
|
||||||
, src
|
|
||||||
, dependencies ? []
|
|
||||||
, buildInputs ? []
|
|
||||||
, production ? true
|
|
||||||
, npmFlags ? ""
|
|
||||||
, dontNpmInstall ? false
|
|
||||||
, bypassCache ? false
|
|
||||||
, reconstructLock ? false
|
|
||||||
, dontStrip ? true
|
|
||||||
, unpackPhase ? "true"
|
|
||||||
, buildPhase ? "true"
|
|
||||||
, ... }@args:
|
|
||||||
|
|
||||||
let
|
|
||||||
extraArgs = removeAttrs args [ "name" "dependencies" "buildInputs" ];
|
|
||||||
in
|
|
||||||
stdenv.mkDerivation ({
|
|
||||||
name = "node-dependencies-${name}${if version == null then "" else "-${version}"}";
|
|
||||||
|
|
||||||
buildInputs = [ tarWrapper python nodejs ]
|
|
||||||
++ lib.optional (stdenv.isLinux) utillinux
|
|
||||||
++ lib.optional (stdenv.isDarwin) libtool
|
|
||||||
++ buildInputs;
|
|
||||||
|
|
||||||
inherit dontStrip; # Stripping may fail a build for some package deployments
|
|
||||||
inherit dontNpmInstall unpackPhase buildPhase;
|
|
||||||
|
|
||||||
includeScript = includeDependencies { inherit dependencies; };
|
|
||||||
pinpointDependenciesScript = pinpointDependenciesOfPackage args;
|
|
||||||
|
|
||||||
passAsFile = [ "includeScript" "pinpointDependenciesScript" ];
|
|
||||||
|
|
||||||
installPhase = ''
|
|
||||||
source ${installPackage}
|
|
||||||
|
|
||||||
mkdir -p $out/${packageName}
|
|
||||||
cd $out/${packageName}
|
|
||||||
|
|
||||||
source $includeScriptPath
|
|
||||||
|
|
||||||
# Create fake package.json to make the npm commands work properly
|
|
||||||
cp ${src}/package.json .
|
|
||||||
chmod 644 package.json
|
|
||||||
${lib.optionalString bypassCache ''
|
|
||||||
if [ -f ${src}/package-lock.json ]
|
|
||||||
then
|
|
||||||
cp ${src}/package-lock.json .
|
|
||||||
chmod 644 package-lock.json
|
|
||||||
fi
|
|
||||||
''}
|
|
||||||
|
|
||||||
# Go to the parent folder to make sure that all packages are pinpointed
|
|
||||||
cd ..
|
|
||||||
${lib.optionalString (builtins.substring 0 1 packageName == "@") "cd .."}
|
|
||||||
|
|
||||||
${prepareAndInvokeNPM { inherit packageName bypassCache reconstructLock npmFlags production; }}
|
|
||||||
|
|
||||||
# Expose the executables that were installed
|
|
||||||
cd ..
|
|
||||||
${lib.optionalString (builtins.substring 0 1 packageName == "@") "cd .."}
|
|
||||||
|
|
||||||
mv ${packageName} lib
|
|
||||||
ln -s $out/lib/node_modules/.bin $out/bin
|
|
||||||
'';
|
|
||||||
} // extraArgs);
|
|
||||||
|
|
||||||
# Builds a development shell
|
|
||||||
buildNodeShell =
|
|
||||||
{ name
|
|
||||||
, packageName
|
|
||||||
, version ? null
|
|
||||||
, src
|
|
||||||
, dependencies ? []
|
|
||||||
, buildInputs ? []
|
|
||||||
, production ? true
|
|
||||||
, npmFlags ? ""
|
|
||||||
, dontNpmInstall ? false
|
|
||||||
, bypassCache ? false
|
|
||||||
, reconstructLock ? false
|
|
||||||
, dontStrip ? true
|
|
||||||
, unpackPhase ? "true"
|
|
||||||
, buildPhase ? "true"
|
|
||||||
, ... }@args:
|
|
||||||
|
|
||||||
let
|
|
||||||
nodeDependencies = buildNodeDependencies args;
|
|
||||||
extraArgs = removeAttrs args [ "name" "dependencies" "buildInputs" "dontStrip" "dontNpmInstall" "unpackPhase" "buildPhase" ];
|
|
||||||
in
|
|
||||||
stdenv.mkDerivation ({
|
|
||||||
name = "node-shell-${name}${if version == null then "" else "-${version}"}";
|
|
||||||
|
|
||||||
buildInputs = [ python nodejs ] ++ lib.optional (stdenv.isLinux) utillinux ++ buildInputs;
|
|
||||||
buildCommand = ''
|
|
||||||
mkdir -p $out/bin
|
|
||||||
cat > $out/bin/shell <<EOF
|
|
||||||
#! ${stdenv.shell} -e
|
|
||||||
$shellHook
|
|
||||||
exec ${stdenv.shell}
|
|
||||||
EOF
|
|
||||||
chmod +x $out/bin/shell
|
|
||||||
'';
|
|
||||||
|
|
||||||
# Provide the dependencies in a development shell through the NODE_PATH environment variable
|
|
||||||
inherit nodeDependencies;
|
|
||||||
shellHook = lib.optionalString (dependencies != []) ''
|
|
||||||
export NODE_PATH=${nodeDependencies}/lib/node_modules
|
|
||||||
export PATH="${nodeDependencies}/bin:$PATH"
|
|
||||||
'';
|
|
||||||
} // extraArgs);
|
|
||||||
in
|
|
||||||
{
|
|
||||||
buildNodeSourceDist = lib.makeOverridable buildNodeSourceDist;
|
|
||||||
buildNodePackage = lib.makeOverridable buildNodePackage;
|
|
||||||
buildNodeDependencies = lib.makeOverridable buildNodeDependencies;
|
|
||||||
buildNodeShell = lib.makeOverridable buildNodeShell;
|
|
||||||
}
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
SPDX-FileCopyrightText: 2022-2023 Sarah Vaupel <sarah.vaupel@uniworx.de>, Gregor Kleen <gregor@kleen.consulting>
|
|
||||||
|
|
||||||
SPDX-License-Identifier: AGPL-3.0-or-later
|
|
||||||
File diff suppressed because it is too large
Load Diff
@ -1,3 +0,0 @@
|
|||||||
SPDX-FileCopyrightText: 2022-2023 Sarah Vaupel <sarah.vaupel@uniworx.de>, Gregor Kleen <gregor@kleen.consulting>
|
|
||||||
|
|
||||||
SPDX-License-Identifier: AGPL-3.0-or-later
|
|
||||||
@ -1,8 +0,0 @@
|
|||||||
# SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
|
||||||
|
|
||||||
final: prev:
|
|
||||||
{
|
|
||||||
nodePackages = (import ./node2nix.nix { pkgs = final; inherit (final.config) system; }) // prev.nodePackages;
|
|
||||||
}
|
|
||||||
@ -1,571 +0,0 @@
|
|||||||
# SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
|
||||||
|
|
||||||
# This file originates from node2nix
|
|
||||||
|
|
||||||
{lib, stdenv, nodejs, python2, pkgs, libtool, runCommand, writeTextFile}:
|
|
||||||
|
|
||||||
let
|
|
||||||
# Workaround to cope with utillinux in Nixpkgs 20.09 and util-linux in Nixpkgs master
|
|
||||||
utillinux = if pkgs ? utillinux then pkgs.utillinux else pkgs.util-linux;
|
|
||||||
|
|
||||||
python = if nodejs ? python then nodejs.python else python2;
|
|
||||||
|
|
||||||
# Create a tar wrapper that filters all the 'Ignoring unknown extended header keyword' noise
|
|
||||||
tarWrapper = runCommand "tarWrapper" {} ''
|
|
||||||
mkdir -p $out/bin
|
|
||||||
|
|
||||||
cat > $out/bin/tar <<EOF
|
|
||||||
#! ${stdenv.shell} -e
|
|
||||||
$(type -p tar) "\$@" --warning=no-unknown-keyword --delay-directory-restore
|
|
||||||
EOF
|
|
||||||
|
|
||||||
chmod +x $out/bin/tar
|
|
||||||
'';
|
|
||||||
|
|
||||||
# Function that generates a TGZ file from a NPM project
|
|
||||||
buildNodeSourceDist =
|
|
||||||
{ name, version, src, ... }:
|
|
||||||
|
|
||||||
stdenv.mkDerivation {
|
|
||||||
name = "node-tarball-${name}-${version}";
|
|
||||||
inherit src;
|
|
||||||
buildInputs = [ nodejs ];
|
|
||||||
buildPhase = ''
|
|
||||||
export HOME=$TMPDIR
|
|
||||||
tgzFile=$(npm pack | tail -n 1) # Hooks to the pack command will add output (https://docs.npmjs.com/misc/scripts)
|
|
||||||
'';
|
|
||||||
installPhase = ''
|
|
||||||
mkdir -p $out/tarballs
|
|
||||||
mv $tgzFile $out/tarballs
|
|
||||||
mkdir -p $out/nix-support
|
|
||||||
echo "file source-dist $out/tarballs/$tgzFile" >> $out/nix-support/hydra-build-products
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
includeDependencies = {dependencies}:
|
|
||||||
lib.optionalString (dependencies != [])
|
|
||||||
(lib.concatMapStrings (dependency:
|
|
||||||
''
|
|
||||||
# Bundle the dependencies of the package
|
|
||||||
mkdir -p node_modules
|
|
||||||
cd node_modules
|
|
||||||
|
|
||||||
# Only include dependencies if they don't exist. They may also be bundled in the package.
|
|
||||||
if [ ! -e "${dependency.name}" ]
|
|
||||||
then
|
|
||||||
${composePackage dependency}
|
|
||||||
fi
|
|
||||||
|
|
||||||
cd ..
|
|
||||||
''
|
|
||||||
) dependencies);
|
|
||||||
|
|
||||||
# Recursively composes the dependencies of a package
|
|
||||||
composePackage = { name, packageName, src, dependencies ? [], ... }@args:
|
|
||||||
builtins.addErrorContext "while evaluating node package '${packageName}'" ''
|
|
||||||
DIR=$(pwd)
|
|
||||||
cd $TMPDIR
|
|
||||||
|
|
||||||
unpackFile ${src}
|
|
||||||
|
|
||||||
# Make the base dir in which the target dependency resides first
|
|
||||||
mkdir -p "$(dirname "$DIR/${packageName}")"
|
|
||||||
|
|
||||||
if [ -f "${src}" ]
|
|
||||||
then
|
|
||||||
# Figure out what directory has been unpacked
|
|
||||||
packageDir="$(find . -maxdepth 1 -type d | tail -1)"
|
|
||||||
|
|
||||||
# Restore write permissions to make building work
|
|
||||||
find "$packageDir" -type d -exec chmod u+x {} \;
|
|
||||||
chmod -R u+w "$packageDir"
|
|
||||||
|
|
||||||
# Move the extracted tarball into the output folder
|
|
||||||
mv "$packageDir" "$DIR/${packageName}"
|
|
||||||
elif [ -d "${src}" ]
|
|
||||||
then
|
|
||||||
# Get a stripped name (without hash) of the source directory.
|
|
||||||
# On old nixpkgs it's already set internally.
|
|
||||||
if [ -z "$strippedName" ]
|
|
||||||
then
|
|
||||||
strippedName="$(stripHash ${src})"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Restore write permissions to make building work
|
|
||||||
chmod -R u+w "$strippedName"
|
|
||||||
|
|
||||||
# Move the extracted directory into the output folder
|
|
||||||
mv "$strippedName" "$DIR/${packageName}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Unset the stripped name to not confuse the next unpack step
|
|
||||||
unset strippedName
|
|
||||||
|
|
||||||
# Include the dependencies of the package
|
|
||||||
cd "$DIR/${packageName}"
|
|
||||||
${includeDependencies { inherit dependencies; }}
|
|
||||||
cd ..
|
|
||||||
${lib.optionalString (builtins.substring 0 1 packageName == "@") "cd .."}
|
|
||||||
'';
|
|
||||||
|
|
||||||
pinpointDependencies = {dependencies, production}:
|
|
||||||
let
|
|
||||||
pinpointDependenciesFromPackageJSON = writeTextFile {
|
|
||||||
name = "pinpointDependencies.js";
|
|
||||||
text = ''
|
|
||||||
var fs = require('fs');
|
|
||||||
var path = require('path');
|
|
||||||
|
|
||||||
function resolveDependencyVersion(location, name) {
|
|
||||||
if(location == process.env['NIX_STORE']) {
|
|
||||||
return null;
|
|
||||||
} else {
|
|
||||||
var dependencyPackageJSON = path.join(location, "node_modules", name, "package.json");
|
|
||||||
|
|
||||||
if(fs.existsSync(dependencyPackageJSON)) {
|
|
||||||
var dependencyPackageObj = JSON.parse(fs.readFileSync(dependencyPackageJSON));
|
|
||||||
|
|
||||||
if(dependencyPackageObj.name == name) {
|
|
||||||
return dependencyPackageObj.version;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return resolveDependencyVersion(path.resolve(location, ".."), name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function replaceDependencies(dependencies) {
|
|
||||||
if(typeof dependencies == "object" && dependencies !== null) {
|
|
||||||
for(var dependency in dependencies) {
|
|
||||||
var resolvedVersion = resolveDependencyVersion(process.cwd(), dependency);
|
|
||||||
|
|
||||||
if(resolvedVersion === null) {
|
|
||||||
process.stderr.write("WARNING: cannot pinpoint dependency: "+dependency+", context: "+process.cwd()+"\n");
|
|
||||||
} else {
|
|
||||||
dependencies[dependency] = resolvedVersion;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Read the package.json configuration */
|
|
||||||
var packageObj = JSON.parse(fs.readFileSync('./package.json'));
|
|
||||||
|
|
||||||
/* Pinpoint all dependencies */
|
|
||||||
replaceDependencies(packageObj.dependencies);
|
|
||||||
if(process.argv[2] == "development") {
|
|
||||||
replaceDependencies(packageObj.devDependencies);
|
|
||||||
}
|
|
||||||
replaceDependencies(packageObj.optionalDependencies);
|
|
||||||
|
|
||||||
/* Write the fixed package.json file */
|
|
||||||
fs.writeFileSync("package.json", JSON.stringify(packageObj, null, 2));
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
in
|
|
||||||
''
|
|
||||||
node ${pinpointDependenciesFromPackageJSON} ${if production then "production" else "development"}
|
|
||||||
|
|
||||||
${lib.optionalString (dependencies != [])
|
|
||||||
''
|
|
||||||
if [ -d node_modules ]
|
|
||||||
then
|
|
||||||
cd node_modules
|
|
||||||
${lib.concatMapStrings (dependency: pinpointDependenciesOfPackage dependency) dependencies}
|
|
||||||
cd ..
|
|
||||||
fi
|
|
||||||
''}
|
|
||||||
'';
|
|
||||||
|
|
||||||
# Recursively traverses all dependencies of a package and pinpoints all
|
|
||||||
# dependencies in the package.json file to the versions that are actually
|
|
||||||
# being used.
|
|
||||||
|
|
||||||
pinpointDependenciesOfPackage = { packageName, dependencies ? [], production ? true, ... }@args:
|
|
||||||
''
|
|
||||||
if [ -d "${packageName}" ]
|
|
||||||
then
|
|
||||||
cd "${packageName}"
|
|
||||||
${pinpointDependencies { inherit dependencies production; }}
|
|
||||||
cd ..
|
|
||||||
${lib.optionalString (builtins.substring 0 1 packageName == "@") "cd .."}
|
|
||||||
fi
|
|
||||||
'';
|
|
||||||
|
|
||||||
# Extract the Node.js source code which is used to compile packages with
|
|
||||||
# native bindings
|
|
||||||
nodeSources = runCommand "node-sources" {} ''
|
|
||||||
tar --no-same-owner --no-same-permissions -xf ${nodejs.src}
|
|
||||||
mv node-* $out
|
|
||||||
'';
|
|
||||||
|
|
||||||
# Script that adds _integrity fields to all package.json files to prevent NPM from consulting the cache (that is empty)
|
|
||||||
addIntegrityFieldsScript = writeTextFile {
|
|
||||||
name = "addintegrityfields.js";
|
|
||||||
text = ''
|
|
||||||
var fs = require('fs');
|
|
||||||
var path = require('path');
|
|
||||||
|
|
||||||
function augmentDependencies(baseDir, dependencies) {
|
|
||||||
for(var dependencyName in dependencies) {
|
|
||||||
var dependency = dependencies[dependencyName];
|
|
||||||
|
|
||||||
// Open package.json and augment metadata fields
|
|
||||||
var packageJSONDir = path.join(baseDir, "node_modules", dependencyName);
|
|
||||||
var packageJSONPath = path.join(packageJSONDir, "package.json");
|
|
||||||
|
|
||||||
if(fs.existsSync(packageJSONPath)) { // Only augment packages that exist. Sometimes we may have production installs in which development dependencies can be ignored
|
|
||||||
console.log("Adding metadata fields to: "+packageJSONPath);
|
|
||||||
var packageObj = JSON.parse(fs.readFileSync(packageJSONPath));
|
|
||||||
|
|
||||||
if(dependency.integrity) {
|
|
||||||
packageObj["_integrity"] = dependency.integrity;
|
|
||||||
} else {
|
|
||||||
packageObj["_integrity"] = "sha1-000000000000000000000000000="; // When no _integrity string has been provided (e.g. by Git dependencies), add a dummy one. It does not seem to harm and it bypasses downloads.
|
|
||||||
}
|
|
||||||
|
|
||||||
if(dependency.resolved) {
|
|
||||||
packageObj["_resolved"] = dependency.resolved; // Adopt the resolved property if one has been provided
|
|
||||||
} else {
|
|
||||||
packageObj["_resolved"] = dependency.version; // Set the resolved version to the version identifier. This prevents NPM from cloning Git repositories.
|
|
||||||
}
|
|
||||||
|
|
||||||
if(dependency.from !== undefined) { // Adopt from property if one has been provided
|
|
||||||
packageObj["_from"] = dependency.from;
|
|
||||||
}
|
|
||||||
|
|
||||||
fs.writeFileSync(packageJSONPath, JSON.stringify(packageObj, null, 2));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Augment transitive dependencies
|
|
||||||
if(dependency.dependencies !== undefined) {
|
|
||||||
augmentDependencies(packageJSONDir, dependency.dependencies);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(fs.existsSync("./package-lock.json")) {
|
|
||||||
var packageLock = JSON.parse(fs.readFileSync("./package-lock.json"));
|
|
||||||
|
|
||||||
if(![1, 2].includes(packageLock.lockfileVersion)) {
|
|
||||||
process.stderr.write("Sorry, I only understand lock file versions 1 and 2!\n");
|
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(packageLock.dependencies !== undefined) {
|
|
||||||
augmentDependencies(".", packageLock.dependencies);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
# Reconstructs a package-lock file from the node_modules/ folder structure and package.json files with dummy sha1 hashes
|
|
||||||
reconstructPackageLock = writeTextFile {
|
|
||||||
name = "addintegrityfields.js";
|
|
||||||
text = ''
|
|
||||||
var fs = require('fs');
|
|
||||||
var path = require('path');
|
|
||||||
|
|
||||||
var packageObj = JSON.parse(fs.readFileSync("package.json"));
|
|
||||||
|
|
||||||
var lockObj = {
|
|
||||||
name: packageObj.name,
|
|
||||||
version: packageObj.version,
|
|
||||||
lockfileVersion: 1,
|
|
||||||
requires: true,
|
|
||||||
dependencies: {}
|
|
||||||
};
|
|
||||||
|
|
||||||
function augmentPackageJSON(filePath, dependencies) {
|
|
||||||
var packageJSON = path.join(filePath, "package.json");
|
|
||||||
if(fs.existsSync(packageJSON)) {
|
|
||||||
var packageObj = JSON.parse(fs.readFileSync(packageJSON));
|
|
||||||
dependencies[packageObj.name] = {
|
|
||||||
version: packageObj.version,
|
|
||||||
integrity: "sha1-000000000000000000000000000=",
|
|
||||||
dependencies: {}
|
|
||||||
};
|
|
||||||
processDependencies(path.join(filePath, "node_modules"), dependencies[packageObj.name].dependencies);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function processDependencies(dir, dependencies) {
|
|
||||||
if(fs.existsSync(dir)) {
|
|
||||||
var files = fs.readdirSync(dir);
|
|
||||||
|
|
||||||
files.forEach(function(entry) {
|
|
||||||
var filePath = path.join(dir, entry);
|
|
||||||
var stats = fs.statSync(filePath);
|
|
||||||
|
|
||||||
if(stats.isDirectory()) {
|
|
||||||
if(entry.substr(0, 1) == "@") {
|
|
||||||
// When we encounter a namespace folder, augment all packages belonging to the scope
|
|
||||||
var pkgFiles = fs.readdirSync(filePath);
|
|
||||||
|
|
||||||
pkgFiles.forEach(function(entry) {
|
|
||||||
if(stats.isDirectory()) {
|
|
||||||
var pkgFilePath = path.join(filePath, entry);
|
|
||||||
augmentPackageJSON(pkgFilePath, dependencies);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
augmentPackageJSON(filePath, dependencies);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
processDependencies("node_modules", lockObj.dependencies);
|
|
||||||
|
|
||||||
fs.writeFileSync("package-lock.json", JSON.stringify(lockObj, null, 2));
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
prepareAndInvokeNPM = {packageName, bypassCache, reconstructLock, npmFlags, production}:
|
|
||||||
let
|
|
||||||
forceOfflineFlag = if bypassCache then "--offline" else "--registry http://www.example.com";
|
|
||||||
in
|
|
||||||
''
|
|
||||||
# Pinpoint the versions of all dependencies to the ones that are actually being used
|
|
||||||
echo "pinpointing versions of dependencies..."
|
|
||||||
source $pinpointDependenciesScriptPath
|
|
||||||
|
|
||||||
# Patch the shebangs of the bundled modules to prevent them from
|
|
||||||
# calling executables outside the Nix store as much as possible
|
|
||||||
patchShebangs .
|
|
||||||
|
|
||||||
# Deploy the Node.js package by running npm install. Since the
|
|
||||||
# dependencies have been provided already by ourselves, it should not
|
|
||||||
# attempt to install them again, which is good, because we want to make
|
|
||||||
# it Nix's responsibility. If it needs to install any dependencies
|
|
||||||
# anyway (e.g. because the dependency parameters are
|
|
||||||
# incomplete/incorrect), it fails.
|
|
||||||
#
|
|
||||||
# The other responsibilities of NPM are kept -- version checks, build
|
|
||||||
# steps, postprocessing etc.
|
|
||||||
|
|
||||||
export HOME=$TMPDIR
|
|
||||||
cd "${packageName}"
|
|
||||||
runHook preRebuild
|
|
||||||
|
|
||||||
${lib.optionalString bypassCache ''
|
|
||||||
${lib.optionalString reconstructLock ''
|
|
||||||
if [ -f package-lock.json ]
|
|
||||||
then
|
|
||||||
echo "WARNING: Reconstruct lock option enabled, but a lock file already exists!"
|
|
||||||
echo "This will most likely result in version mismatches! We will remove the lock file and regenerate it!"
|
|
||||||
rm package-lock.json
|
|
||||||
else
|
|
||||||
echo "No package-lock.json file found, reconstructing..."
|
|
||||||
fi
|
|
||||||
|
|
||||||
node ${reconstructPackageLock}
|
|
||||||
''}
|
|
||||||
|
|
||||||
node ${addIntegrityFieldsScript}
|
|
||||||
''}
|
|
||||||
|
|
||||||
npm ${forceOfflineFlag} --nodedir=${nodeSources} ${npmFlags} ${lib.optionalString production "--production"} rebuild
|
|
||||||
|
|
||||||
if [ "''${dontNpmInstall-}" != "1" ]
|
|
||||||
then
|
|
||||||
# NPM tries to download packages even when they already exist if npm-shrinkwrap is used.
|
|
||||||
rm -f npm-shrinkwrap.json
|
|
||||||
|
|
||||||
npm ${forceOfflineFlag} --nodedir=${nodeSources} ${npmFlags} ${lib.optionalString production "--production"} install
|
|
||||||
fi
|
|
||||||
'';
|
|
||||||
|
|
||||||
# Builds and composes an NPM package including all its dependencies
|
|
||||||
buildNodePackage =
|
|
||||||
{ name
|
|
||||||
, packageName
|
|
||||||
, version
|
|
||||||
, dependencies ? []
|
|
||||||
, buildInputs ? []
|
|
||||||
, production ? true
|
|
||||||
, npmFlags ? ""
|
|
||||||
, dontNpmInstall ? false
|
|
||||||
, bypassCache ? false
|
|
||||||
, reconstructLock ? false
|
|
||||||
, preRebuild ? ""
|
|
||||||
, dontStrip ? true
|
|
||||||
, unpackPhase ? "true"
|
|
||||||
, buildPhase ? "true"
|
|
||||||
, ... }@args:
|
|
||||||
|
|
||||||
let
|
|
||||||
extraArgs = removeAttrs args [ "name" "dependencies" "buildInputs" "dontStrip" "dontNpmInstall" "preRebuild" "unpackPhase" "buildPhase" ];
|
|
||||||
in
|
|
||||||
stdenv.mkDerivation ({
|
|
||||||
name = "node_${name}-${version}";
|
|
||||||
buildInputs = [ tarWrapper python nodejs ]
|
|
||||||
++ lib.optional (stdenv.isLinux) utillinux
|
|
||||||
++ lib.optional (stdenv.isDarwin) libtool
|
|
||||||
++ buildInputs;
|
|
||||||
|
|
||||||
inherit nodejs;
|
|
||||||
|
|
||||||
inherit dontStrip; # Stripping may fail a build for some package deployments
|
|
||||||
inherit dontNpmInstall preRebuild unpackPhase buildPhase;
|
|
||||||
|
|
||||||
compositionScript = composePackage args;
|
|
||||||
pinpointDependenciesScript = pinpointDependenciesOfPackage args;
|
|
||||||
|
|
||||||
passAsFile = [ "compositionScript" "pinpointDependenciesScript" ];
|
|
||||||
|
|
||||||
installPhase = ''
|
|
||||||
# Create and enter a root node_modules/ folder
|
|
||||||
mkdir -p $out/lib/node_modules
|
|
||||||
cd $out/lib/node_modules
|
|
||||||
|
|
||||||
# Compose the package and all its dependencies
|
|
||||||
source $compositionScriptPath
|
|
||||||
|
|
||||||
${prepareAndInvokeNPM { inherit packageName bypassCache reconstructLock npmFlags production; }}
|
|
||||||
|
|
||||||
# Create symlink to the deployed executable folder, if applicable
|
|
||||||
if [ -d "$out/lib/node_modules/.bin" ]
|
|
||||||
then
|
|
||||||
ln -s $out/lib/node_modules/.bin $out/bin
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Create symlinks to the deployed manual page folders, if applicable
|
|
||||||
if [ -d "$out/lib/node_modules/${packageName}/man" ]
|
|
||||||
then
|
|
||||||
mkdir -p $out/share
|
|
||||||
for dir in "$out/lib/node_modules/${packageName}/man/"*
|
|
||||||
do
|
|
||||||
mkdir -p $out/share/man/$(basename "$dir")
|
|
||||||
for page in "$dir"/*
|
|
||||||
do
|
|
||||||
ln -s $page $out/share/man/$(basename "$dir")
|
|
||||||
done
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Run post install hook, if provided
|
|
||||||
runHook postInstall
|
|
||||||
'';
|
|
||||||
} // extraArgs);
|
|
||||||
|
|
||||||
# Builds a node environment (a node_modules folder and a set of binaries)
|
|
||||||
buildNodeDependencies =
|
|
||||||
{ name
|
|
||||||
, packageName
|
|
||||||
, version
|
|
||||||
, src
|
|
||||||
, dependencies ? []
|
|
||||||
, buildInputs ? []
|
|
||||||
, production ? true
|
|
||||||
, npmFlags ? ""
|
|
||||||
, dontNpmInstall ? false
|
|
||||||
, bypassCache ? false
|
|
||||||
, reconstructLock ? false
|
|
||||||
, dontStrip ? true
|
|
||||||
, unpackPhase ? "true"
|
|
||||||
, buildPhase ? "true"
|
|
||||||
, ... }@args:
|
|
||||||
|
|
||||||
let
|
|
||||||
extraArgs = removeAttrs args [ "name" "dependencies" "buildInputs" ];
|
|
||||||
in
|
|
||||||
stdenv.mkDerivation ({
|
|
||||||
name = "node-dependencies-${name}-${version}";
|
|
||||||
|
|
||||||
buildInputs = [ tarWrapper python nodejs ]
|
|
||||||
++ lib.optional (stdenv.isLinux) utillinux
|
|
||||||
++ lib.optional (stdenv.isDarwin) libtool
|
|
||||||
++ buildInputs;
|
|
||||||
|
|
||||||
inherit dontStrip; # Stripping may fail a build for some package deployments
|
|
||||||
inherit dontNpmInstall unpackPhase buildPhase;
|
|
||||||
|
|
||||||
includeScript = includeDependencies { inherit dependencies; };
|
|
||||||
pinpointDependenciesScript = pinpointDependenciesOfPackage args;
|
|
||||||
|
|
||||||
passAsFile = [ "includeScript" "pinpointDependenciesScript" ];
|
|
||||||
|
|
||||||
installPhase = ''
|
|
||||||
mkdir -p $out/${packageName}
|
|
||||||
cd $out/${packageName}
|
|
||||||
|
|
||||||
source $includeScriptPath
|
|
||||||
|
|
||||||
# Create fake package.json to make the npm commands work properly
|
|
||||||
cp ${src}/package.json .
|
|
||||||
chmod 644 package.json
|
|
||||||
${lib.optionalString bypassCache ''
|
|
||||||
if [ -f ${src}/package-lock.json ]
|
|
||||||
then
|
|
||||||
cp ${src}/package-lock.json .
|
|
||||||
fi
|
|
||||||
''}
|
|
||||||
|
|
||||||
# Go to the parent folder to make sure that all packages are pinpointed
|
|
||||||
cd ..
|
|
||||||
${lib.optionalString (builtins.substring 0 1 packageName == "@") "cd .."}
|
|
||||||
|
|
||||||
${prepareAndInvokeNPM { inherit packageName bypassCache reconstructLock npmFlags production; }}
|
|
||||||
|
|
||||||
# Expose the executables that were installed
|
|
||||||
cd ..
|
|
||||||
${lib.optionalString (builtins.substring 0 1 packageName == "@") "cd .."}
|
|
||||||
|
|
||||||
mv ${packageName} lib
|
|
||||||
ln -s $out/lib/node_modules/.bin $out/bin
|
|
||||||
'';
|
|
||||||
} // extraArgs);
|
|
||||||
|
|
||||||
# Builds a development shell
|
|
||||||
buildNodeShell =
|
|
||||||
{ name
|
|
||||||
, packageName
|
|
||||||
, version
|
|
||||||
, src
|
|
||||||
, dependencies ? []
|
|
||||||
, buildInputs ? []
|
|
||||||
, production ? true
|
|
||||||
, npmFlags ? ""
|
|
||||||
, dontNpmInstall ? false
|
|
||||||
, bypassCache ? false
|
|
||||||
, reconstructLock ? false
|
|
||||||
, dontStrip ? true
|
|
||||||
, unpackPhase ? "true"
|
|
||||||
, buildPhase ? "true"
|
|
||||||
, ... }@args:
|
|
||||||
|
|
||||||
let
|
|
||||||
nodeDependencies = buildNodeDependencies args;
|
|
||||||
in
|
|
||||||
stdenv.mkDerivation {
|
|
||||||
name = "node-shell-${name}-${version}";
|
|
||||||
|
|
||||||
buildInputs = [ python nodejs ] ++ lib.optional (stdenv.isLinux) utillinux ++ buildInputs;
|
|
||||||
buildCommand = ''
|
|
||||||
mkdir -p $out/bin
|
|
||||||
cat > $out/bin/shell <<EOF
|
|
||||||
#! ${stdenv.shell} -e
|
|
||||||
$shellHook
|
|
||||||
exec ${stdenv.shell}
|
|
||||||
EOF
|
|
||||||
chmod +x $out/bin/shell
|
|
||||||
'';
|
|
||||||
|
|
||||||
# Provide the dependencies in a development shell through the NODE_PATH environment variable
|
|
||||||
inherit nodeDependencies;
|
|
||||||
shellHook = lib.optionalString (dependencies != []) ''
|
|
||||||
export NODE_PATH=${nodeDependencies}/lib/node_modules
|
|
||||||
export PATH="${nodeDependencies}/bin:$PATH"
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
in
|
|
||||||
{
|
|
||||||
buildNodeSourceDist = lib.makeOverridable buildNodeSourceDist;
|
|
||||||
buildNodePackage = lib.makeOverridable buildNodePackage;
|
|
||||||
buildNodeDependencies = lib.makeOverridable buildNodeDependencies;
|
|
||||||
buildNodeShell = lib.makeOverridable buildNodeShell;
|
|
||||||
}
|
|
||||||
File diff suppressed because it is too large
Load Diff
@ -1,21 +0,0 @@
|
|||||||
# SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
|
||||||
|
|
||||||
# This file has been generated by node2nix 1.9.0. Do not edit!
|
|
||||||
|
|
||||||
{pkgs ? import <nixpkgs> {
|
|
||||||
inherit system;
|
|
||||||
}, system ? builtins.currentSystem, nodejs ? pkgs."nodejs-14_x"}:
|
|
||||||
|
|
||||||
let
|
|
||||||
nodeEnv = import ./node-env.nix {
|
|
||||||
inherit (pkgs) stdenv lib python2 runCommand writeTextFile;
|
|
||||||
inherit pkgs nodejs;
|
|
||||||
libtool = if pkgs.stdenv.isDarwin then pkgs.darwin.cctools else null;
|
|
||||||
};
|
|
||||||
in
|
|
||||||
import ./node-packages.nix {
|
|
||||||
inherit (pkgs) fetchurl nix-gitignore stdenv lib fetchgit;
|
|
||||||
inherit nodeEnv;
|
|
||||||
}
|
|
||||||
@ -1,17 +0,0 @@
|
|||||||
# SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
|
||||||
|
|
||||||
{}: prev: final: rec {
|
|
||||||
changelogJson = prev.runCommand "changelog.json" {
|
|
||||||
} ''
|
|
||||||
ln -s ${final.uniworxNodeDependencies}/lib/node_modules ./node_modules
|
|
||||||
export PATH="${final.uniworxNodeDependencies}/bin:$PATH"
|
|
||||||
|
|
||||||
changelog-parser ${../CHANGELOG.md} > $out
|
|
||||||
'';
|
|
||||||
|
|
||||||
jqChangelogJson = prev.writeShellScriptBin "jq-changelog" ''
|
|
||||||
exec -- ${final.jq}/bin/jq $@ < ${changelogJson}
|
|
||||||
'';
|
|
||||||
}
|
|
||||||
@ -1,95 +0,0 @@
|
|||||||
# SPDX-FileCopyrightText: 2022-2023 Gregor Kleen <gregor@kleen.consulting>, Steffen Jost <jost@cip.ifi.lmu.de>
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
|
||||||
|
|
||||||
{ inputs, backendSource, gitRevision ? null, ... }: final: prev:
|
|
||||||
|
|
||||||
with prev.lib;
|
|
||||||
|
|
||||||
let
|
|
||||||
haskellInputs = ["encoding" "memcached-binary" "conduit-resumablesink" "HaskellNet-SSL" "ldap-client" "serversession" "xss-sanitize" "colonnade" "minio-hs" "cryptoids" "zip-stream" "yesod" "cryptonite" "esqueleto"];
|
|
||||||
in {
|
|
||||||
uniworx = final.haskell-nix.stackProject {
|
|
||||||
src = prev.stdenv.mkDerivation {
|
|
||||||
name = "uniworx-src";
|
|
||||||
src = backendSource;
|
|
||||||
|
|
||||||
phases = ["unpackPhase" "patchPhase" "installPhase"];
|
|
||||||
|
|
||||||
patchPhase = ''
|
|
||||||
substitute stack-flake.yaml stack.yaml \
|
|
||||||
${concatMapStringsSep " \\\n" (pkgName: "--replace @${pkgName}@ ${inputs."${pkgName}"}") haskellInputs}
|
|
||||||
'';
|
|
||||||
|
|
||||||
installPhase = ''
|
|
||||||
mkdir -p $out
|
|
||||||
cp -pr --reflink=auto ./. $out
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
compiler-nix-name = "ghc8104";
|
|
||||||
# stack-sha256 = "1n7z294ldv2rjkfj1vs3kqmnbp34m2scrmyrp5kwmga9vp86fd9z"; # produces errors gregor does not understand :(
|
|
||||||
modules = [
|
|
||||||
{
|
|
||||||
packages = {
|
|
||||||
encoding.src = inputs.encoding;
|
|
||||||
memcached-binary.src = inputs.memcached-binary;
|
|
||||||
conduit-resumablesink.src = inputs.conduit-resumablesink;
|
|
||||||
HaskellNet-SSL.src = inputs.HaskellNet-SSL;
|
|
||||||
ldap-client.src = inputs.ldap-client;
|
|
||||||
serversession.src = "${inputs.serversession}/serversession";
|
|
||||||
serversession-backend-acid-state.src = "${inputs.serversession}/serversession-backend-acid-state";
|
|
||||||
xss-sanitize.src = inputs.xss-sanitize;
|
|
||||||
colonnade.src = "${inputs.colonnade}/colonnade";
|
|
||||||
minio-hs.src = inputs.minio-hs;
|
|
||||||
cryptoids-class.src = "${inputs.cryptoids}/cryptoids-class";
|
|
||||||
cryptoids-types.src = "${inputs.cryptoids}/cryptoids-types";
|
|
||||||
cryptoids.src = "${inputs.cryptoids}/cryptoids";
|
|
||||||
filepath-crypto.src = "${inputs.cryptoids}/filepath-crypto";
|
|
||||||
uuid-crypto.src = "${inputs.cryptoids}/uuid-crypto";
|
|
||||||
zip-stream.src = inputs.zip-stream;
|
|
||||||
yesod.src = "${inputs.yesod}/yesod";
|
|
||||||
yesod-core.src = "${inputs.yesod}/yesod-core";
|
|
||||||
yesod-static.src = "${inputs.yesod}/yesod-static";
|
|
||||||
yesod-persistent.src = "${inputs.yesod}/yesod-persistent";
|
|
||||||
yesod-form.src = "${inputs.yesod}/yesod-form";
|
|
||||||
yesod-auth.src = "${inputs.yesod}/yesod-auth";
|
|
||||||
yesod-test.src = "${inputs.yesod}/yesod-test";
|
|
||||||
cryptonite.src = inputs.cryptonite;
|
|
||||||
esqueleto.src = inputs.esqueleto;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
{
|
|
||||||
packages.uniworx = {
|
|
||||||
postUnpack = ''
|
|
||||||
${final.xorg.lndir}/bin/lndir -silent ${prev.uniworxFrontend} $sourceRoot
|
|
||||||
chmod a+w -R $sourceRoot
|
|
||||||
'';
|
|
||||||
preBuild = ''
|
|
||||||
export TZDIR=${final.tzdata}/share/zoneinfo
|
|
||||||
${optionalString (gitRevision != null) ''
|
|
||||||
export GIT_REVISION=${gitRevision}
|
|
||||||
''}
|
|
||||||
'';
|
|
||||||
components.library.build-tools = with final.pkgs; [ llvm_9 ];
|
|
||||||
components.exes.uniworx.build-tools = with final.pkgs; [ llvm_9 ];
|
|
||||||
components.exes.uniworxdb.build-tools = with final.pkgs; [ llvm_9 ];
|
|
||||||
components.exes.uniworxload.build-tools = with final.pkgs; [ llvm_9 ];
|
|
||||||
components.tests.yesod = {
|
|
||||||
build-tools = with final.pkgs; [ llvm_9 final.uniworx.hsPkgs.hspec-discover ];
|
|
||||||
testWrapper =
|
|
||||||
let
|
|
||||||
testWrapper = prev.writeScript "test-wrapper" (import ../develop.nix { inherit prev; pkgs = final; doDevelopEnv = false; } "$@");
|
|
||||||
testWrapperWrapped = prev.runCommand "test-wrapper" { buildInputs = [final.makeWrapper]; } ''
|
|
||||||
makeWrapper ${testWrapper} $out \
|
|
||||||
--prefix PATH : ${final.postgresql_12}/bin \
|
|
||||||
--prefix PATH : ${final.minio}/bin \
|
|
||||||
--prefix PATH : ${final.memcached}/bin
|
|
||||||
'';
|
|
||||||
in singleton (toString testWrapperWrapped);
|
|
||||||
};
|
|
||||||
components.tests.hlint.build-tools = with final.pkgs; [ llvm_9 final.uniworx.hsPkgs.hlint-test ];
|
|
||||||
};
|
|
||||||
}
|
|
||||||
];
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@ -1,10 +0,0 @@
|
|||||||
# SPDX-FileCopyrightText: 2022-2023 Gregor Kleen <gregor@kleen.consulting>
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
|
||||||
|
|
||||||
{ inputs, frontendSource, backendSource, gitRevision ? null }: final: prev: prev.lib.composeManyExtensions [
|
|
||||||
(import ./node-dependencies.nix { inherit inputs; })
|
|
||||||
(import ./well-known.nix { inherit frontendSource; })
|
|
||||||
(import ./frontend.nix { inherit frontendSource; })
|
|
||||||
(import ./backend.nix { inherit backendSource inputs gitRevision; })
|
|
||||||
] final prev
|
|
||||||
@ -1,62 +0,0 @@
|
|||||||
# SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
|
||||||
|
|
||||||
{ frontendSource, ... }: final: prev:
|
|
||||||
let
|
|
||||||
setupNodeDeps = ''
|
|
||||||
ln -s ${final.uniworxNodeDependencies}/lib/node_modules ./node_modules
|
|
||||||
export PATH="${final.uniworxNodeDependencies}/bin:$PATH"
|
|
||||||
'';
|
|
||||||
in {
|
|
||||||
uniworxFrontend = prev.stdenv.mkDerivation {
|
|
||||||
name = "uniworx-frontend";
|
|
||||||
srcs = [frontendSource prev.uniworxWellKnown];
|
|
||||||
sourceRoot = "source";
|
|
||||||
|
|
||||||
phases = ["unpackPhase" "checkPhase" "buildPhase" "installPhase"];
|
|
||||||
|
|
||||||
postUnpack = ''
|
|
||||||
${final.xorg.lndir}/bin/lndir -silent ../uniworx-well-known $sourceRoot
|
|
||||||
'';
|
|
||||||
|
|
||||||
preBuild = setupNodeDeps;
|
|
||||||
buildPhase = ''
|
|
||||||
runHook preBuild
|
|
||||||
|
|
||||||
webpack --progress
|
|
||||||
|
|
||||||
runHook postBuild
|
|
||||||
'';
|
|
||||||
|
|
||||||
preCheck = ''
|
|
||||||
${setupNodeDeps}
|
|
||||||
export FONTCONFIG_FILE="${final.fontconfig.out}/etc/fonts/fonts.conf"
|
|
||||||
export FONTCONFIG_PATH="${final.fontconfig.out}/etc/fonts/"
|
|
||||||
export CHROME_BIN="${final.chromium}/bin/chromium-browser"
|
|
||||||
'';
|
|
||||||
checkPhase = ''
|
|
||||||
runHook preCheck
|
|
||||||
|
|
||||||
eslint frontend/src
|
|
||||||
karma start --conf karma.conf.js
|
|
||||||
|
|
||||||
runHook postCheck
|
|
||||||
'';
|
|
||||||
|
|
||||||
installPhase = ''
|
|
||||||
mkdir -p $out $out/config
|
|
||||||
cp -r --reflink=auto well-known static $out
|
|
||||||
cp -r --reflink=auto config/webpack.yml $out/config
|
|
||||||
'';
|
|
||||||
|
|
||||||
passthru.check = final.uniworxFrontend.overrideAttrs (oldAttrs: {
|
|
||||||
name = "${oldAttrs.name}-check";
|
|
||||||
phases = ["unpackPhase" "buildPhase"];
|
|
||||||
buildPhase = ''
|
|
||||||
mkdir $out
|
|
||||||
( ${oldAttrs.checkPhase} ) | tee $out/test-stdout
|
|
||||||
'';
|
|
||||||
});
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@ -1,7 +0,0 @@
|
|||||||
# SPDX-FileCopyrightText: 2022-2023 Gregor Kleen <gregor@kleen.consulting>
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
|
||||||
|
|
||||||
{ ... }: final: prev: {
|
|
||||||
uniworxNodeDependencies = (prev.callPackage ../frontend {}).nodeDependencies;
|
|
||||||
}
|
|
||||||
@ -1,26 +0,0 @@
|
|||||||
# SPDX-FileCopyrightText: 2022-2023 Gregor Kleen <gregor@kleen.consulting>
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
|
||||||
|
|
||||||
{ frontendSource, ... }: final: prev: {
|
|
||||||
uniworxWellKnown = prev.stdenv.mkDerivation {
|
|
||||||
name = "uniworx-well-known";
|
|
||||||
src = frontendSource;
|
|
||||||
|
|
||||||
phases = ["unpackPhase" "buildPhase" "installPhase" "fixupPhase"];
|
|
||||||
|
|
||||||
buildPhase = ''
|
|
||||||
ln -s ${final.uniworxNodeDependencies}/lib/node_modules ./node_modules
|
|
||||||
export PATH="${final.uniworxNodeDependencies}/bin:${prev.exiftool}/bin:$PATH"
|
|
||||||
webpack --progress
|
|
||||||
'';
|
|
||||||
|
|
||||||
installPhase = ''
|
|
||||||
mkdir -p $out
|
|
||||||
cp -r --reflink=auto well-known $out/.nix-well-known
|
|
||||||
'';
|
|
||||||
|
|
||||||
outputHashMode = "recursive";
|
|
||||||
outputHash = "sha256-18MfdmJX3q826Q4p2F3SnwS2fCjLN0LUpIV/jqUPH4I==";
|
|
||||||
};
|
|
||||||
}
|
|
||||||
24
shell.nix
24
shell.nix
@ -197,9 +197,9 @@ let
|
|||||||
UPLOAD_S3_KEY_ID=''${MINIO_ACCESS_KEY}
|
UPLOAD_S3_KEY_ID=''${MINIO_ACCESS_KEY}
|
||||||
UPLOAD_S3_KEY=''${MINIO_SECRET_KEY}
|
UPLOAD_S3_KEY=''${MINIO_SECRET_KEY}
|
||||||
|
|
||||||
SMTPHOST=''${SMTPHOST}
|
# SMTPHOST=''${SMTPHOST}
|
||||||
SMTPPORT=''${SMTPPORT}
|
# SMTPPORT=''${SMTPPORT}
|
||||||
SMTPSSL=''${SMTPSSL}
|
# SMTPSSL=''${SMTPSSL}
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
set +xe
|
set +xe
|
||||||
@ -262,18 +262,28 @@ let
|
|||||||
|
|
||||||
git diff $(cut -d '-' -f 1 <(curl -sH 'Accept: text/plain' https://uni2work.ifi.lmu.de/version))
|
git diff $(cut -d '-' -f 1 <(curl -sH 'Accept: text/plain' https://uni2work.ifi.lmu.de/version))
|
||||||
'';
|
'';
|
||||||
|
|
||||||
|
prepareEnv = pkgs.writeScriptBin "prepare-env" ''
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
export TZDIR=${pkgs.tzdata}/share/zoneinfo
|
||||||
|
export CHROME_BIN=${pkgs.chromium}/bin/chromium
|
||||||
|
|
||||||
|
echo "prepareEnv has been executed"
|
||||||
|
echo "TZDIR: $TZDIR"
|
||||||
|
echo "CHROME_BIN: $CHROME_BIN"
|
||||||
|
'';
|
||||||
in pkgs.mkShell {
|
in pkgs.mkShell {
|
||||||
name = "fradrive";
|
name = "fradrive";
|
||||||
shellHook = ''
|
shellHook = ''
|
||||||
${pkgs.lib.optionalString (nixpkgsPath != null) ''
|
${pkgs.lib.optionalString (nixpkgsPath != null) ''
|
||||||
export NIX_PATH=nixpkgs=${nixpkgsPath}
|
export NIX_PATH=nixpkgs=${nixpkgsPath}
|
||||||
''}
|
''}
|
||||||
|
prepare-env
|
||||||
export CHROME_BIN=${pkgs.chromium}/bin/chromium
|
|
||||||
'';
|
'';
|
||||||
nativeBuildInputs = [develop inDevelop killallUni2work diffRunning]
|
nativeBuildInputs = [develop inDevelop killallUni2work diffRunning prepareEnv]
|
||||||
++ (with pkgs;
|
++ (with pkgs;
|
||||||
[ stack nodejs-14_x postgresql_12 openldap exiftool memcached minio minio-client
|
[ stdenv coreutils stack nodejs-14_x postgresql_12 openldap exiftool memcached minio minio-client
|
||||||
gup reuse pre-commit
|
gup reuse pre-commit
|
||||||
# node2nix
|
# node2nix
|
||||||
# busybox # for print services, but interferes with build commands in develop-shell
|
# busybox # for print services, but interferes with build commands in develop-shell
|
||||||
|
|||||||
Reference in New Issue
Block a user