diff --git a/flake.nix b/flake.nix index f49aa8d8..ad952c1e 100644 --- a/flake.nix +++ b/flake.nix @@ -85,7 +85,7 @@ inherit self inputs; channels.nixpkgs = { input = nixpkgs; - patches = map (patch: ./patches + "/${patch}") (builtins.filter (x: x != ".keep") (builtins.attrNames (builtins.readDir ./patches))); + patches = builtins.map (patch: ./patches + "/${patch}") (builtins.filter (x: x != ".keep") (builtins.attrNames (builtins.readDir ./patches))); overlaysBuilder = _: [ devshell.overlay emacs-overlay.overlay @@ -118,210 +118,14 @@ let pkgs = channels.nixpkgs; in { packages = customPackages pkgs.callPackage; - devShells = rec { - default = nixos-config; - nixos-config = pkgs.devshell.mkShell { - name = "NixOS config"; - packages = [ - pkgs.nixpkgs-fmt - (pkgs.writeShellScriptBin "fetchpatch" "curl -L https://github.com/NixOS/nixpkgs/pull/$1.patch -o patches/$1.patch") - agenix.defaultPackage.x86_64-linux - ]; - }; - accentor-api-client-js = pkgs.devshell.mkShell { - name = "Accentor API client in JavaScript"; - packages = with pkgs; [ nodejs yarn ]; - }; - gamification2 = pkgs.devshell.mkShell { - name = "Gamification 2"; - imports = [ "${devshell}/extra/language/c.nix" ]; - packages = with pkgs; [ - (pkgs.lowPrio binutils) - findutils - cmake - gnumake - nodejs - postgresql_14 - ruby_3_1 - yarn - ]; - env = [ - { name = "PGDATA"; eval = "$PRJ_DATA_DIR/postgres"; } - { name = "DATABASE_HOST"; eval = "$PGDATA"; } - { name = "GEM_HOME"; eval = "$PRJ_DATA_DIR/bundle/$(ruby -e 'puts RUBY_VERSION')"; } - { name = "PATH"; prefix = "$GEM_HOME/bin"; } - ]; - commands = [ - { - name = "pg:setup"; - category = "database"; - help = "Setup postgres in project folder"; - command = '' - initdb --encoding=UTF8 --no-locale --no-instructions -U postgres - echo "listen_addresses = ${"'"}${"'"}" >> $PGDATA/postgresql.conf - echo "unix_socket_directories = '$PGDATA'" >> $PGDATA/postgresql.conf - echo "CREATE USER gamification2 WITH PASSWORD 'gamification2' CREATEDB SUPERUSER;" | postgres --single -E postgres - ''; - } - { - name = "pg:start"; - category = "database"; - help = "Start postgres instance"; - command = '' - [ ! -d $PGDATA ] && pg:setup - pg_ctl -D $PGDATA -U postgres start -l log/postgres.log - ''; - } - { - name = "pg:stop"; - category = "database"; - help = "Stop postgres instance"; - command = '' - pg_ctl -D $PGDATA -U postgres stop - ''; - } - { - name = "pg:console"; - category = "database"; - help = "Open database console"; - command = '' - psql --host $PGDATA -U postgres - ''; - } - ]; - language.c = { - compiler = pkgs.gcc; - includes = [ pkgs.zlib pkgs.openssl ]; - libraries = [ pkgs.zlib pkgs.openssl ]; - }; - }; - tab = pkgs.devshell.mkShell { - name = "Tab"; - imports = [ "${devshell}/extra/language/c.nix" ]; - packages = with pkgs; [ - (pkgs.lowPrio binutils) - findutils - gnumake - ruby_3_1 - nodejs - yarn - ]; - env = [ - { name = "GEM_HOME"; eval = "$PRJ_DATA_DIR/bundle/$(ruby -e 'puts RUBY_VERSION')"; } - { name = "PATH"; prefix = "$GEM_HOME/bin"; } - ]; - commands = [ - { - name = "server-support"; - category = "general commands"; - help = "Run everything required for a server"; - command = '' - bundle install - ''; - } - { - name = "server"; - category = "general commands"; - help = "Run everything"; - command = '' - server-support - rails s - ''; - } - ]; - language.c = { - compiler = pkgs.gcc; - includes = [ pkgs.sqlite pkgs.libmysqlclient pkgs.zlib ]; - libraries = [ pkgs.sqlite pkgs.libmysqlclient pkgs.zlib ]; - }; - }; - dodona = pkgs.devshell.mkShell { - name = "Dodona"; - imports = [ "${devshell}/extra/language/c.nix" ]; - packages = with pkgs; [ - (pkgs.lowPrio binutils) - chromedriver - findutils - gnumake - nodejs - nodePackages.typescript-language-server - ruby_3_0 - yarn - ]; - env = [ - { name = "DATABASE_URL"; value = "mysql2://root:dodona@127.0.0.1:3306/dodona"; } - { name = "TEST_DATABASE_URL"; value = "mysql2://root:dodona@127.0.0.1:3306/dodona_test"; } - { name = "GEM_HOME"; eval = "$PRJ_DATA_DIR/bundle/$(ruby -e 'puts RUBY_VERSION')"; } - { name = "PATH"; prefix = "$GEM_HOME/bin"; } - ]; - commands = [ - { - name = "memcached"; - category = "general commands"; - help = "Start caching server"; - package = pkgs.memcached; - } - { - name = "mysql"; - category = "general commands"; - help = "Start mysql (in docker container)"; - command = '' - trap "systemd-run --user --no-block docker stop dodona-db" 0 - docker run -d --name dodona-db -p 3306:3306 --rm -v dodona-db-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=dodona mariadb:latest - while [ 1 -eq 1 ] - do - sleep 1000 - done - ''; - } - { - name = "server-support"; - category = "general commands"; - help = "Run everything required for a server"; - command = '' - memcached & - mysql & - bundle install - yarn install - rails jobs:work & - yarn build:css --watch & - yarn build:js --watch - ''; - } - { - name = "server"; - category = "general commands"; - help = "Run everything"; - command = '' - server-support & - rails s - ''; - } - ]; - language.c = { - compiler = pkgs.gcc; - includes = [ pkgs.libmysqlclient pkgs.zlib ]; - libraries = [ pkgs.libmysqlclient pkgs.zlib ]; - }; - }; - dodona-docs = pkgs.devshell.mkShell { - name = "Dodona Docs"; - env = [{ name = "PUPPETEER_EXECUTABLE_PATH"; eval = "${pkgs.ungoogled-chromium}/bin/chromium"; }]; - packages = with pkgs; [ nodejs yarn ]; - }; - dodona-judge-r = pkgs.devshell.mkShell { - name = "R judge"; - packages = [ - (pkgs.rWrapper.override { - packages = with pkgs.rPackages; [ base64enc dplyr dslabs jsonlite knitr lintr R6 rlang styler ]; - }) - ]; - }; - objectgericht-project = pkgs.devshell.mkShell { - name = "Scriptingtalen project"; - packages = with pkgs; [ openssl maven openjdk ]; - }; - }; + devShells = + let + ls = builtins.readDir ./shells; + files = builtins.filter (name: ls.${name} == "regular") (builtins.attrNames ls); + shellNames = builtins.map (filename: builtins.head (builtins.split "\\." filename)) files; + nameToValue = name: import (./shells + "/${name}.nix") { inherit pkgs inputs; }; + in + builtins.listToAttrs (builtins.map (name: { inherit name; value = nameToValue name; }) shellNames); }; }; } diff --git a/shells/accentor-api-client-js.nix b/shells/accentor-api-client-js.nix new file mode 100644 index 00000000..e4b86f27 --- /dev/null +++ b/shells/accentor-api-client-js.nix @@ -0,0 +1,4 @@ +{ pkgs, ... }: pkgs.devshell.mkShell { + name = "Accentor API client in JavaScript"; + packages = with pkgs; [ nodejs yarn ]; +} diff --git a/shells/default.nix b/shells/default.nix new file mode 100644 index 00000000..88220f57 --- /dev/null +++ b/shells/default.nix @@ -0,0 +1 @@ +import ./nixos-config.nix diff --git a/shells/dodona-docs.nix b/shells/dodona-docs.nix new file mode 100644 index 00000000..e3a52e6c --- /dev/null +++ b/shells/dodona-docs.nix @@ -0,0 +1,5 @@ +{ pkgs, ... }: pkgs.devshell.mkShell { + name = "Dodona Docs"; + env = [{ name = "PUPPETEER_EXECUTABLE_PATH"; eval = "${pkgs.ungoogled-chromium}/bin/chromium"; }]; + packages = with pkgs; [ nodejs yarn ]; +} diff --git a/shells/dodona-judge-r.nix b/shells/dodona-judge-r.nix new file mode 100644 index 00000000..d5e993cc --- /dev/null +++ b/shells/dodona-judge-r.nix @@ -0,0 +1,8 @@ +{ pkgs, ... }: pkgs.devshell.mkShell { + name = "R judge"; + packages = [ + (pkgs.rWrapper.override { + packages = with pkgs.rPackages; [ base64enc dplyr dslabs jsonlite knitr lintr R6 rlang styler ]; + }) + ]; +} diff --git a/shells/dodona.nix b/shells/dodona.nix new file mode 100644 index 00000000..cff9dc17 --- /dev/null +++ b/shells/dodona.nix @@ -0,0 +1,69 @@ +{ pkgs, inputs }: pkgs.devshell.mkShell { + name = "Dodona"; + imports = [ "${inputs.devshell}/extra/language/c.nix" ]; + packages = with pkgs; [ + (pkgs.lowPrio binutils) + chromedriver + findutils + gnumake + nodejs + nodePackages.typescript-language-server + ruby_3_0 + yarn + ]; + env = [ + { name = "DATABASE_URL"; value = "mysql2://root:dodona@127.0.0.1:3306/dodona"; } + { name = "TEST_DATABASE_URL"; value = "mysql2://root:dodona@127.0.0.1:3306/dodona_test"; } + { name = "GEM_HOME"; eval = "$PRJ_DATA_DIR/bundle/$(ruby -e 'puts RUBY_VERSION')"; } + { name = "PATH"; prefix = "$GEM_HOME/bin"; } + ]; + commands = [ + { + name = "memcached"; + category = "general commands"; + help = "Start caching server"; + package = pkgs.memcached; + } + { + name = "mysql"; + category = "general commands"; + help = "Start mysql (in docker container)"; + command = '' + trap "systemd-run --user --no-block docker stop dodona-db" 0 + docker run -d --name dodona-db -p 3306:3306 --rm -v dodona-db-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=dodona mariadb:latest + while [ 1 -eq 1 ] + do + sleep 1000 + done + ''; + } + { + name = "server-support"; + category = "general commands"; + help = "Run everything required for a server"; + command = '' + memcached & + mysql & + bundle install + yarn install + rails jobs:work & + yarn build:css --watch & + yarn build:js --watch + ''; + } + { + name = "server"; + category = "general commands"; + help = "Run everything"; + command = '' + server-support & + rails s + ''; + } + ]; + language.c = { + compiler = pkgs.gcc; + includes = [ pkgs.libmysqlclient pkgs.zlib ]; + libraries = [ pkgs.libmysqlclient pkgs.zlib ]; + }; +} diff --git a/shells/gamification2.nix b/shells/gamification2.nix new file mode 100644 index 00000000..a271c979 --- /dev/null +++ b/shells/gamification2.nix @@ -0,0 +1,63 @@ +{ pkgs, inputs }: pkgs.devshell.mkShell { + name = "Gamification 2"; + imports = [ "${inputs.devshell}/extra/language/c.nix" ]; + packages = with pkgs; [ + (pkgs.lowPrio binutils) + findutils + cmake + gnumake + nodejs + postgresql_14 + ruby_3_1 + yarn + ]; + env = [ + { name = "PGDATA"; eval = "$PRJ_DATA_DIR/postgres"; } + { name = "DATABASE_HOST"; eval = "$PGDATA"; } + { name = "GEM_HOME"; eval = "$PRJ_DATA_DIR/bundle/$(ruby -e 'puts RUBY_VERSION')"; } + { name = "PATH"; prefix = "$GEM_HOME/bin"; } + ]; + commands = [ + { + name = "pg:setup"; + category = "database"; + help = "Setup postgres in project folder"; + command = '' + initdb --encoding=UTF8 --no-locale --no-instructions -U postgres + echo "listen_addresses = ${"'"}${"'"}" >> $PGDATA/postgresql.conf + echo "unix_socket_directories = '$PGDATA'" >> $PGDATA/postgresql.conf + echo "CREATE USER gamification2 WITH PASSWORD 'gamification2' CREATEDB SUPERUSER;" | postgres --single -E postgres + ''; + } + { + name = "pg:start"; + category = "database"; + help = "Start postgres instance"; + command = '' + [ ! -d $PGDATA ] && pg:setup + pg_ctl -D $PGDATA -U postgres start -l log/postgres.log + ''; + } + { + name = "pg:stop"; + category = "database"; + help = "Stop postgres instance"; + command = '' + pg_ctl -D $PGDATA -U postgres stop + ''; + } + { + name = "pg:console"; + category = "database"; + help = "Open database console"; + command = '' + psql --host $PGDATA -U postgres + ''; + } + ]; + language.c = { + compiler = pkgs.gcc; + includes = [ pkgs.zlib pkgs.openssl ]; + libraries = [ pkgs.zlib pkgs.openssl ]; + }; +} diff --git a/shells/nixos-config.nix b/shells/nixos-config.nix new file mode 100644 index 00000000..b4ea69ec --- /dev/null +++ b/shells/nixos-config.nix @@ -0,0 +1,8 @@ +{ pkgs, inputs }: pkgs.devshell.mkShell { + name = "NixOS config"; + packages = [ + pkgs.nixpkgs-fmt + (pkgs.writeShellScriptBin "fetchpatch" "curl -L https://github.com/NixOS/nixpkgs/pull/$1.patch -o patches/$1.patch") + inputs.agenix.defaultPackage.x86_64-linux + ]; +} diff --git a/shells/objectgericht-project.nix b/shells/objectgericht-project.nix new file mode 100644 index 00000000..c28fb724 --- /dev/null +++ b/shells/objectgericht-project.nix @@ -0,0 +1,4 @@ +{ pkgs, ... }: pkgs.devshell.mkShell { + name = "Objectgericht programmeren project"; + packages = with pkgs; [ openssl maven openjdk ]; +} diff --git a/shells/tab.nix b/shells/tab.nix new file mode 100644 index 00000000..44aabe97 --- /dev/null +++ b/shells/tab.nix @@ -0,0 +1,40 @@ +{ pkgs, inputs }: pkgs.devshell.mkShell { + name = "Tab"; + imports = [ "${inputs.devshell}/extra/language/c.nix" ]; + packages = with pkgs; [ + (pkgs.lowPrio binutils) + findutils + gnumake + ruby_3_1 + nodejs + yarn + ]; + env = [ + { name = "GEM_HOME"; eval = "$PRJ_DATA_DIR/bundle/$(ruby -e 'puts RUBY_VERSION')"; } + { name = "PATH"; prefix = "$GEM_HOME/bin"; } + ]; + commands = [ + { + name = "server-support"; + category = "general commands"; + help = "Run everything required for a server"; + command = '' + bundle install + ''; + } + { + name = "server"; + category = "general commands"; + help = "Run everything"; + command = '' + server-support + rails s + ''; + } + ]; + language.c = { + compiler = pkgs.gcc; + includes = [ pkgs.sqlite pkgs.libmysqlclient pkgs.zlib ]; + libraries = [ pkgs.sqlite pkgs.libmysqlclient pkgs.zlib ]; + }; +}