lemmy: use pin.json to prepare for update script

lemmy: add initial update script

lemmy: remove use of upstream package.json

lemmy: add update script

lemmy: fixes

lemmy: use importJSON

lemmy: use correct import json ref

+66 -124
-113
pkgs/servers/web-apps/lemmy/package.json
··· 1 - { 2 - "name": "lemmy-ui", 3 - "version": "0.12.2", 4 - "description": "An isomorphic UI for lemmy", 5 - "author": "Dessalines <tyhou13@gmx.com>", 6 - "license": "AGPL-3.0", 7 - "scripts": { 8 - "build:dev": "webpack --mode=development", 9 - "build:prod": "webpack --mode=production", 10 - "clean": "yarn run rimraf dist", 11 - "dev": "yarn start", 12 - "lint": "node generate_translations.js && tsc --noEmit && eslint --report-unused-disable-directives --ext .js,.ts,.tsx src", 13 - "prebuild:dev": "yarn clean && node generate_translations.js", 14 - "prebuild:prod": "yarn clean && node generate_translations.js", 15 - "start": "yarn build:dev --watch" 16 - }, 17 - "repository": "https://github.com/LemmyNet/lemmy-ui", 18 - "dependencies": { 19 - "@typescript-eslint/parser": "^4.28.3", 20 - "autosize": "^5.0.1", 21 - "choices.js": "^9.0.1", 22 - "emoji-short-name": "^1.0.0", 23 - "express": "~4.17.1", 24 - "i18next": "^20.3.3", 25 - "inferno": "^7.4.9", 26 - "inferno-create-element": "^7.4.9", 27 - "inferno-helmet": "^5.2.1", 28 - "inferno-hydrate": "^7.4.9", 29 - "inferno-i18next": "github:nimbusec-oss/inferno-i18next#semver:^7.4.2", 30 - "inferno-router": "^7.4.9", 31 - "inferno-server": "^7.4.9", 32 - "isomorphic-cookie": "^1.2.4", 33 - "jwt-decode": "^3.1.2", 34 - "markdown-it": "^12.1.0", 35 - "markdown-it-container": "^3.0.0", 36 - "markdown-it-sub": "^1.0.0", 37 - "markdown-it-sup": "^1.0.0", 38 - "moment": "^2.29.1", 39 - "reconnecting-websocket": "^4.4.0", 40 - "register-service-worker": "^1.7.2", 41 - "rxjs": "^7.2.0", 42 - "serialize-javascript": "^6.0.0", 43 - "tippy.js": "^6.3.1", 44 - "toastify-js": "^1.11.1", 45 - "tributejs": "^5.1.3", 46 - "ws": "^8.2.0" 47 - }, 48 - "devDependencies": { 49 - "@babel/core": "^7.14.6", 50 - "@babel/plugin-transform-runtime": "^7.14.5", 51 - "@babel/plugin-transform-typescript": "^7.14.6", 52 - "@babel/preset-env": "7.15.0", 53 - "@babel/preset-typescript": "^7.14.5", 54 - "@babel/runtime": "^7.14.6", 55 - "@types/autosize": "^4.0.0", 56 - "@types/express": "^4.17.13", 57 - "@types/node": "^16.7.1", 58 - "@types/node-fetch": "^2.5.11", 59 - "@types/serialize-javascript": "^5.0.1", 60 - "@typescript-eslint/eslint-plugin": "^4.28.3", 61 - "babel-loader": "^8.2.2", 62 - "babel-plugin-inferno": "^6.3.0", 63 - "bootstrap": "^5.0.2", 64 - "bootswatch": "^5.0.2", 65 - "clean-webpack-plugin": "^4.0.0-alpha.0", 66 - "copy-webpack-plugin": "^9.0.1", 67 - "css-loader": "^6.0.0", 68 - "eslint": "^7.30.0", 69 - "eslint-plugin-prettier": "^3.4.1", 70 - "husky": "^7.0.1", 71 - "import-sort-style-module": "^6.0.0", 72 - "iso-639-1": "^2.1.9", 73 - "lemmy-js-client": "0.12.0", 74 - "lint-staged": "^11.0.1", 75 - "mini-css-extract-plugin": "^2.1.0", 76 - "node-fetch": "^2.6.1", 77 - "node-sass": "^6.0.1", 78 - "prettier": "^2.3.2", 79 - "prettier-plugin-import-sort": "^0.0.7", 80 - "prettier-plugin-organize-imports": "^2.2.0", 81 - "prettier-plugin-packagejson": "^2.2.11", 82 - "rimraf": "^3.0.2", 83 - "run-node-webpack-plugin": "^1.3.0", 84 - "sass-loader": "^12.1.0", 85 - "sortpack": "^2.2.0", 86 - "style-loader": "^3.1.0", 87 - "terser": "^5.7.1", 88 - "typescript": "^4.3.5", 89 - "webpack": "5.51.1", 90 - "webpack-cli": "^4.7.2", 91 - "webpack-dev-server": "4.0.0", 92 - "webpack-node-externals": "^3.0.0" 93 - }, 94 - "engines": { 95 - "node": ">=8.9.0" 96 - }, 97 - "engineStrict": true, 98 - "lint-staged": { 99 - "*.{ts,tsx,js}": [ 100 - "prettier --write", 101 - "eslint --fix" 102 - ], 103 - "package.json": [ 104 - "sortpack" 105 - ] 106 - }, 107 - "importSort": { 108 - ".js, .jsx, .ts, .tsx": { 109 - "style": "module", 110 - "parser": "typescript" 111 - } 112 - } 113 - }
+7
pkgs/servers/web-apps/lemmy/pin.json
··· 1 + { 2 + "version": "0.12.2", 3 + "serverSha256": "sha256-jhUpQ2f+b0BEXVfQOIujxam2PQA44wluUraJVJxL6LU=", 4 + "serverCargoSha256": "sha256-2i8zCwd33LtUKxOChx/SLP9sWMRmxGkKK8xzaJImMHM=", 5 + "uiSha256": "sha256-iFLJqUnz4m9/JTSaJSUugzY5KkiKtH0sMYY4ALm2Ebk=", 6 + "uiYarnDepsSha256": "sha256-i12J+Qi7Nsjr5JipeRXdkFkh+I/ROsgRw4Vty2cMNyU=" 7 + }
+9 -4
pkgs/servers/web-apps/lemmy/server.nix
··· 7 7 , libiconv 8 8 , Security 9 9 }: 10 - 10 + let 11 + pinData = lib.importJSON ./pin.json; 12 + version = pinData.version; 13 + in 11 14 rustPlatform.buildRustPackage rec { 15 + inherit version; 12 16 pname = "lemmy-server"; 13 - version = "0.12.2"; 14 17 15 18 src = fetchFromGitHub { 16 19 owner = "LemmyNet"; 17 20 repo = "lemmy"; 18 21 rev = version; 19 - sha256 = "sha256-jhUpQ2f+b0BEXVfQOIujxam2PQA44wluUraJVJxL6LU="; 22 + sha256 = pinData.serverSha256; 20 23 }; 21 24 22 - cargoSha256 = "sha256-2i8zCwd33LtUKxOChx/SLP9sWMRmxGkKK8xzaJImMHM="; 25 + cargoSha256 = pinData.serverCargoSha256; 23 26 24 27 buildInputs = [ postgresql ] 25 28 ++ lib.optionals stdenv.isDarwin [ libiconv Security ]; ··· 30 33 # https://github.com/sfackler/rust-openssl/blob/master/openssl-sys/build/find_normal.rs#L115 31 34 OPENSSL_LIB_DIR = "${openssl.out}/lib"; 32 35 OPENSSL_INCLUDE_DIR = "${openssl.dev}/include"; 36 + 37 + passthru.updateScript = ./update.sh; 33 38 34 39 meta = with lib; { 35 40 description = "🐀 Building a federated alternative to reddit in rust";
+7 -7
pkgs/servers/web-apps/lemmy/ui.nix
··· 9 9 }: 10 10 11 11 let 12 + pinData = lib.importJSON ./pin.json; 13 + 12 14 pkgConfig = { 13 15 node-sass = { 14 16 nativeBuildInputs = [ ]; ··· 21 23 }; 22 24 23 25 name = "lemmy-ui"; 24 - version = "0.12.2"; 26 + version = pinData.version; 25 27 26 28 src = fetchFromGitHub { 27 29 owner = "LemmyNet"; 28 30 repo = name; 29 31 rev = version; 30 32 fetchSubmodules = true; 31 - sha256 = "sha256-iFLJqUnz4m9/JTSaJSUugzY5KkiKtH0sMYY4ALm2Ebk="; 33 + sha256 = pinData.uiSha256; 32 34 }; 33 35 in 34 36 mkYarnPackage { ··· 39 41 40 42 offlineCache = fetchYarnDeps { 41 43 yarnLock = src + "/yarn.lock"; 42 - sha256 = "sha256-i12J+Qi7Nsjr5JipeRXdkFkh+I/ROsgRw4Vty2cMNyU="; 44 + sha256 = pinData.uiYarnDepsSha256; 43 45 }; 44 - 45 - # Fails mysteriously on source/package.json 46 - # Upstream package.json is missing a newline at the end 47 - packageJSON = ./package.json; 48 46 49 47 yarnPreBuild = '' 50 48 export npm_config_nodedir=${nodejs} ··· 66 64 ''; 67 65 68 66 distPhase = "true"; 67 + 68 + passthru.updateScript = ./update.sh; 69 69 70 70 meta = with lib; { 71 71 description = "Building a federated alternative to reddit in rust";
+43
pkgs/servers/web-apps/lemmy/update.sh
··· 1 + #!/usr/bin/env nix-shell 2 + #! nix-shell -i oil -p jq sd nix-prefetch-github ripgrep moreutils 3 + 4 + # TODO set to `verbose` or `extdebug` once implemented in oil 5 + shopt --set xtrace 6 + 7 + var directory = $(dirname $0 | xargs realpath) 8 + var owner = "LemmyNet" 9 + var ui_repo = "lemmy-ui" 10 + var server_repo = "lemmy" 11 + var latest_rev = $(curl -q https://api.github.com/repos/${owner}/${server_repo}/releases/latest | \ 12 + jq -r '.tag_name') 13 + var latest_version = $(echo $latest_rev) 14 + var current_version = $(jq -r '.version' $directory/pin.json) 15 + if ($latest_version === $current_version) { 16 + echo "lemmy is already up-to-date" 17 + return 0 18 + } else { 19 + var server_tarball_meta = $(nix-prefetch-github $owner $server_repo --rev "$latest_rev") 20 + var server_tarball_hash = "sha256-$(echo $server_tarball_meta | jq -r '.sha256')" 21 + var ui_tarball_meta = $(nix-prefetch-github $owner $ui_repo --rev "$latest_rev") 22 + var ui_tarball_hash = "sha256-$(echo $ui_tarball_meta | jq -r '.sha256')" 23 + 24 + jq ".version = \"$latest_version\" | \ 25 + .\"serverSha256\" = \"$server_tarball_hash\" | \ 26 + .\"uiSha256\" = \"$ui_tarball_hash\" | \ 27 + .\"serverCargoSha256\" = \"\" | \ 28 + .\"uiYarnDepsSha256\" = \"\"" $directory/pin.json | sponge $directory/pin.json 29 + 30 + var new_cargo_sha256 = $(nix-build -A lemmy-server 2>&1 | \ 31 + tail -n 2 | \ 32 + head -n 1 | \ 33 + sd '\s+got:\s+' '') 34 + 35 + var new_offline_cache_sha256 = $(nix-build -A lemmy-ui 2>&1 | \ 36 + tail -n 2 | \ 37 + head -n 1 | \ 38 + sd '\s+got:\s+' '') 39 + 40 + jq ".\"serverCargoSha256\" = \"$new_cargo_sha256\" | \ 41 + .\"uiYarnDepsSha256\" = \"$new_offline_cache_sha256\"" \ 42 + $directory/pin.json | sponge $directory/pin.json 43 + }