From 8abcb6e22cfa396e436c09d68a5855a99125d17f Mon Sep 17 00:00:00 2001 From: Leonardo Taglialegne Date: Mon, 7 Jul 2025 14:48:56 +0200 Subject: [PATCH 1/8] Package creation: initial version --- installers/linux/packages/.gitignore | 3 + .../linux/packages/.vscode/settings.json | 3 + installers/linux/packages/elm.json | 60 +++++++ installers/linux/packages/src/Main.elm | 165 ++++++++++++++++++ installers/linux/packages/src/Versions.elm | 14 ++ 5 files changed, 245 insertions(+) create mode 100644 installers/linux/packages/.gitignore create mode 100644 installers/linux/packages/.vscode/settings.json create mode 100644 installers/linux/packages/elm.json create mode 100644 installers/linux/packages/src/Main.elm create mode 100644 installers/linux/packages/src/Versions.elm diff --git a/installers/linux/packages/.gitignore b/installers/linux/packages/.gitignore new file mode 100644 index 000000000..20efed4de --- /dev/null +++ b/installers/linux/packages/.gitignore @@ -0,0 +1,3 @@ +elm-stuff +work +out diff --git a/installers/linux/packages/.vscode/settings.json b/installers/linux/packages/.vscode/settings.json new file mode 100644 index 000000000..aa329955c --- /dev/null +++ b/installers/linux/packages/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "elmLS.elmFormatPath": "elm-format-hack" +} diff --git a/installers/linux/packages/elm.json b/installers/linux/packages/elm.json new file mode 100644 index 000000000..9f809a4a5 --- /dev/null +++ b/installers/linux/packages/elm.json @@ -0,0 +1,60 @@ +{ + "type": "application", + "source-directories": [ + "src" + ], + "elm-version": "0.19.1", + "dependencies": { + "direct": { + "dillonkearns/elm-cli-options-parser": "3.2.0", + "dillonkearns/elm-pages": "10.2.2", + "elm/bytes": "1.0.8", + "elm/core": "1.0.5", + "elm/json": "1.1.3", + "elmcraft/core-extra": "2.2.0", + "wolfadex/elm-ansi": "3.0.0" + }, + "indirect": { + "Chadtech/elm-bool-extra": "2.4.2", + "avh4/elm-color": "1.0.0", + "danfishgold/base64-bytes": "1.1.0", + "danyx23/elm-mimetype": "4.0.1", + "dillonkearns/elm-bcp47-language-tag": "2.0.0", + "dillonkearns/elm-date-or-date-time": "2.0.0", + "dillonkearns/elm-form": "3.0.1", + "elm/browser": "1.0.2", + "elm/file": "1.0.5", + "elm/html": "1.0.0", + "elm/http": "2.0.0", + "elm/parser": "1.1.0", + "elm/random": "1.0.0", + "elm/regex": "1.0.0", + "elm/time": "1.0.0", + "elm/url": "1.0.0", + "elm/virtual-dom": "1.0.4", + "elm-community/basics-extra": "4.1.0", + "elm-community/list-extra": "8.7.0", + "elm-community/maybe-extra": "5.3.0", + "fredcy/elm-parseint": "2.0.1", + "jluckyiv/elm-utc-date-strings": "1.0.0", + "justinmimbs/date": "4.1.0", + "mdgriffith/elm-codegen": "5.2.0", + "miniBill/elm-codec": "2.3.0", + "miniBill/elm-unicode": "1.1.1", + "noahzgordon/elm-color-extra": "1.0.2", + "robinheghan/fnv1a": "1.0.0", + "robinheghan/murmur3": "1.0.0", + "rtfeldman/elm-css": "18.0.0", + "rtfeldman/elm-hex": "1.0.0", + "rtfeldman/elm-iso8601-date-strings": "1.1.4", + "stil4m/elm-syntax": "7.3.9", + "stil4m/structured-writer": "1.0.3", + "the-sett/elm-pretty-printer": "3.1.1", + "the-sett/elm-syntax-dsl": "6.0.3" + } + }, + "test-dependencies": { + "direct": {}, + "indirect": {} + } +} diff --git a/installers/linux/packages/src/Main.elm b/installers/linux/packages/src/Main.elm new file mode 100644 index 000000000..97e2a07b5 --- /dev/null +++ b/installers/linux/packages/src/Main.elm @@ -0,0 +1,165 @@ +module Main exposing (run) + +import Ansi.Color +import BackendTask exposing (BackendTask) +import BackendTask.Do as Do +import FatalError exposing (FatalError) +import Json.Encode +import Pages.Script as Script exposing (Script) +import Versions + + +run : Script +run = + Script.withoutCliOptions task + + +task : BackendTask FatalError () +task = + logExec "๐Ÿ‘ท Creating temporary work directory" "mkdir" [ "-p", "work" ] <| \_ -> + logExec "๐Ÿ‘ท Creating output directory" "mkdir" [ "-p", "out" ] <| \_ -> + Do.each Versions.versions + (\{ lamderaVersion, elmVersion } -> + Do.each Versions.architectures + (\arch -> + let + fullName : String + fullName = + "lamdera-" ++ lamderaVersion ++ "-linux-" ++ arch.lamderaName + + url : String + url = + "https://static.lamdera.com/bin/" ++ fullName + + binaryPath : String + binaryPath = + "work/" ++ fullName + in + Do.log (Ansi.Color.fontColor Ansi.Color.brightYellow ("๐Ÿƒ " ++ fullName)) <| \_ -> + logExecs " ๐Ÿ”ฝ Downloading" + [ ( "curl", [ url, "-sSL", "-o", binaryPath ] ) + , ( "chmod", [ "+x", binaryPath ] ) + ] + <| \_ -> + let + revision = + "1" + + debName : String + debName = + "lamdera_" ++ lamderaVersion ++ "-" ++ elmVersion ++ "-" ++ revision + + debPath : String + debPath = + "work/" ++ debName + in + logExecs " ๐ŸŒ€ ๐Ÿ“ Preparing folders for .deb " + [ ( "mkdir", [ "-p", debPath ++ "/usr/local/bin" ] ) + , ( "cp", [ binaryPath, debPath ++ "/usr/local/bin/lamdera" ] ) + , ( "mkdir", [ debPath ++ "/DEBIAN" ] ) + ] + <| \_ -> + Do.log (Ansi.Color.fontColor Ansi.Color.cyan " ๐ŸŒ€ ๐Ÿ“ฐ Writing DEBIAN/control file") <| \_ -> + Do.allowFatal + (Script.writeFile + { path = debPath ++ "/DEBIAN/control" + , body = + controlFile + { arch = arch + , lamderaVersion = lamderaVersion + , elmVersion = elmVersion + , revision = revision + } + } + ) + <| \_ -> + logExec " ๐ŸŒ€ ๐Ÿ“ฆ Creating the package" "dpkg-deb" [ "--root-owner-group", "--build", debPath, "out/" ++ debName ++ "_" ++ arch.debianName ++ ".deb" ] <| \_ -> + logExec " ๐ŸŒ€ ๐Ÿงน Cleaning up .deb packaging folder" "rm" [ "-r", debPath ] <| \_ -> + Do.noop + ) + <| \_ -> + Do.noop + ) + <| \_ -> + logExec "๐Ÿงน Cleaning up temporary work directory" "rm" [ "-r", "work" ] <| \_ -> + Do.noop + + +controlFile : { arch : { debianName : String, lamderaName : String }, lamderaVersion : String, elmVersion : String, revision : String } -> String +controlFile { arch, lamderaVersion, elmVersion, revision } = + [ "Package: lamdera" + , "Version: " ++ lamderaVersion ++ "-" ++ elmVersion ++ "-" ++ revision + , "Section: base" + , "Priority: optional" + , "Architecture: " ++ arch.debianName + + -- , "Depends:" + , "Maintainer: Mario Rogic " + , "Description: A delightful platform for full-stack web apps" + , "" + ] + |> String.join "\n" + + +logExec : String -> String -> List String -> (() -> BackendTask FatalError b) -> BackendTask FatalError b +logExec msg cmd args k = + Do.log (Ansi.Color.fontColor Ansi.Color.cyan msg) <| \_ -> + Do.log (formatCmd cmd args) <| \_ -> + Do.exec cmd args k + + +logExecs : String -> List ( String, List String ) -> (() -> BackendTask FatalError b) -> BackendTask FatalError b +logExecs msg cmds k = + Do.log (Ansi.Color.fontColor Ansi.Color.cyan msg) <| \_ -> + Do.each cmds + (\( cmd, args ) -> + Do.log (formatCmd cmd args) <| \_ -> + Do.exec cmd args <| \_ -> + Do.noop + ) + <| \_ -> + k () + + +formatCmd : String -> List String -> String +formatCmd cmd args = + String.join " " <| + " " + :: Ansi.Color.fontColor Ansi.Color.green (escapeMaybe cmd) + :: List.map + (\arg -> + let + escaped : String + escaped = + escapeMaybe arg + in + if String.startsWith "\"" escaped then + Ansi.Color.fontColor Ansi.Color.yellow escaped + + else if String.startsWith "-" escaped then + Ansi.Color.fontColor + (Ansi.Color.rgb + { blue = 0xB0 + , green = 0xB0 + , red = 0xB0 + } + ) + escaped + + else + Ansi.Color.fontColor Ansi.Color.brightWhite escaped + ) + args + + +escapeMaybe : String -> String +escapeMaybe input = + let + escaped = + input |> Json.Encode.string |> Json.Encode.encode 0 + in + if not (String.contains " " input) && escaped == "\"" ++ input ++ "\"" then + input + + else + escaped diff --git a/installers/linux/packages/src/Versions.elm b/installers/linux/packages/src/Versions.elm new file mode 100644 index 000000000..a4e06ece5 --- /dev/null +++ b/installers/linux/packages/src/Versions.elm @@ -0,0 +1,14 @@ +module Versions exposing (architectures, versions) + + +architectures : List { lamderaName : String, debianName : String } +architectures = + [ { lamderaName = "x86_64", debianName = "amd64" } + , { lamderaName = "arm64", debianName = "aarch64" } + ] + + +versions : List { lamderaVersion : String, elmVersion : String } +versions = + [ { lamderaVersion = "1.3.2", elmVersion = "0.19.1" } + ] From ada78820115d289b41a114d067144560090ae90a Mon Sep 17 00:00:00 2001 From: Leonardo Taglialegne Date: Tue, 8 Jul 2025 13:43:30 +0200 Subject: [PATCH 2/8] Adding instructions for running the script --- installers/linux/packages/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 installers/linux/packages/README.md diff --git a/installers/linux/packages/README.md b/installers/linux/packages/README.md new file mode 100644 index 000000000..2d98beec1 --- /dev/null +++ b/installers/linux/packages/README.md @@ -0,0 +1,3 @@ +To run the packaging script: `npx elm-pages run src/Main.elm`. + +This will put the results in the `out` folder. From c60253f30efd0f749e879cd05db4dafa878ffcf9 Mon Sep 17 00:00:00 2001 From: Leonardo Taglialegne Date: Fri, 11 Jul 2025 12:18:25 +0200 Subject: [PATCH 3/8] Make script more generic in preparation of more packages --- installers/linux/packages/src/Main.elm | 135 ++++++++++----------- installers/linux/packages/src/Packages.elm | 44 +++++++ installers/linux/packages/src/Versions.elm | 14 --- 3 files changed, 111 insertions(+), 82 deletions(-) create mode 100644 installers/linux/packages/src/Packages.elm delete mode 100644 installers/linux/packages/src/Versions.elm diff --git a/installers/linux/packages/src/Main.elm b/installers/linux/packages/src/Main.elm index 97e2a07b5..33b6a04f8 100644 --- a/installers/linux/packages/src/Main.elm +++ b/installers/linux/packages/src/Main.elm @@ -5,8 +5,8 @@ import BackendTask exposing (BackendTask) import BackendTask.Do as Do import FatalError exposing (FatalError) import Json.Encode +import Packages exposing (Package) import Pages.Script as Script exposing (Script) -import Versions run : Script @@ -18,84 +18,78 @@ task : BackendTask FatalError () task = logExec "๐Ÿ‘ท Creating temporary work directory" "mkdir" [ "-p", "work" ] <| \_ -> logExec "๐Ÿ‘ท Creating output directory" "mkdir" [ "-p", "out" ] <| \_ -> - Do.each Versions.versions - (\{ lamderaVersion, elmVersion } -> - Do.each Versions.architectures - (\arch -> - let - fullName : String - fullName = - "lamdera-" ++ lamderaVersion ++ "-linux-" ++ arch.lamderaName + Do.each Packages.packages + (\({ name, version, url, debianArch } as package) -> + let + fullName : String + fullName = + name ++ "-" ++ version ++ "-" ++ debianArch + + binaryPath : String + binaryPath = + "work/" ++ fullName + in + Do.log (Ansi.Color.fontColor Ansi.Color.brightYellow ("๐Ÿƒ " ++ fullName)) <| \_ -> + logExecs " ๐Ÿ”ฝ Downloading" + [ ( "curl", [ url, "-sSL", "-o", binaryPath ] ) + , ( "chmod", [ "+x", binaryPath ] ) + ] + <| \_ -> + Do.do (prepareDeb { package = package, binaryPath = binaryPath }) <| \_ -> + Do.noop + ) + <| \_ -> + logExec "๐Ÿงน Cleaning up temporary work directory" "rm" [ "-r", "work" ] <| \_ -> + Do.noop - url : String - url = - "https://static.lamdera.com/bin/" ++ fullName - binaryPath : String - binaryPath = - "work/" ++ fullName - in - Do.log (Ansi.Color.fontColor Ansi.Color.brightYellow ("๐Ÿƒ " ++ fullName)) <| \_ -> - logExecs " ๐Ÿ”ฝ Downloading" - [ ( "curl", [ url, "-sSL", "-o", binaryPath ] ) - , ( "chmod", [ "+x", binaryPath ] ) - ] - <| \_ -> - let - revision = - "1" +prepareDeb : { package : Package, binaryPath : String } -> BackendTask FatalError () +prepareDeb { package, binaryPath } = + let + revision : String + revision = + "1" - debName : String - debName = - "lamdera_" ++ lamderaVersion ++ "-" ++ elmVersion ++ "-" ++ revision + debName : String + debName = + package.name ++ "_" ++ package.version ++ "-" ++ revision - debPath : String - debPath = - "work/" ++ debName - in - logExecs " ๐ŸŒ€ ๐Ÿ“ Preparing folders for .deb " - [ ( "mkdir", [ "-p", debPath ++ "/usr/local/bin" ] ) - , ( "cp", [ binaryPath, debPath ++ "/usr/local/bin/lamdera" ] ) - , ( "mkdir", [ debPath ++ "/DEBIAN" ] ) - ] - <| \_ -> - Do.log (Ansi.Color.fontColor Ansi.Color.cyan " ๐ŸŒ€ ๐Ÿ“ฐ Writing DEBIAN/control file") <| \_ -> - Do.allowFatal - (Script.writeFile - { path = debPath ++ "/DEBIAN/control" - , body = - controlFile - { arch = arch - , lamderaVersion = lamderaVersion - , elmVersion = elmVersion - , revision = revision - } - } - ) - <| \_ -> - logExec " ๐ŸŒ€ ๐Ÿ“ฆ Creating the package" "dpkg-deb" [ "--root-owner-group", "--build", debPath, "out/" ++ debName ++ "_" ++ arch.debianName ++ ".deb" ] <| \_ -> - logExec " ๐ŸŒ€ ๐Ÿงน Cleaning up .deb packaging folder" "rm" [ "-r", debPath ] <| \_ -> - Do.noop - ) - <| \_ -> - Do.noop + debPath : String + debPath = + "work/" ++ debName + in + logExecs " ๐ŸŒ€ ๐Ÿ“ Preparing folders for .deb " + [ ( "rm", [ "-rf", debPath ] ) + , ( "mkdir", [ "-p", debPath ++ "/usr/local/bin" ] ) + , ( "cp", [ binaryPath, debPath ++ "/usr/local/bin/" ++ package.name ] ) + , ( "mkdir", [ debPath ++ "/DEBIAN" ] ) + ] + <| \_ -> + logCyan " ๐ŸŒ€ ๐Ÿ“ฐ Writing DEBIAN/control file" <| \_ -> + Do.allowFatal + (Script.writeFile + { path = debPath ++ "/DEBIAN/control" + , body = controlFile { package = package, revision = revision } + } ) <| \_ -> - logExec "๐Ÿงน Cleaning up temporary work directory" "rm" [ "-r", "work" ] <| \_ -> + logExecs " ๐ŸŒ€ ๐Ÿ“ฆ Creating the package" + [ ( "dpkg-deb", [ "--root-owner-group", "--build", debPath, "out/" ++ debName ++ "_" ++ package.debianArch ++ ".deb" ] ) ] + <| \_ -> Do.noop -controlFile : { arch : { debianName : String, lamderaName : String }, lamderaVersion : String, elmVersion : String, revision : String } -> String -controlFile { arch, lamderaVersion, elmVersion, revision } = - [ "Package: lamdera" - , "Version: " ++ lamderaVersion ++ "-" ++ elmVersion ++ "-" ++ revision +controlFile : { package : Package, revision : String } -> String +controlFile { package, revision } = + [ "Package: " ++ package.name + , "Version: " ++ package.version ++ "-" ++ revision , "Section: base" , "Priority: optional" - , "Architecture: " ++ arch.debianName + , "Architecture: " ++ package.debianArch -- , "Depends:" - , "Maintainer: Mario Rogic " - , "Description: A delightful platform for full-stack web apps" + , "Maintainer: " ++ package.maintainer + , "Description: " ++ package.description , "" ] |> String.join "\n" @@ -103,14 +97,14 @@ controlFile { arch, lamderaVersion, elmVersion, revision } = logExec : String -> String -> List String -> (() -> BackendTask FatalError b) -> BackendTask FatalError b logExec msg cmd args k = - Do.log (Ansi.Color.fontColor Ansi.Color.cyan msg) <| \_ -> + logCyan msg <| \_ -> Do.log (formatCmd cmd args) <| \_ -> Do.exec cmd args k logExecs : String -> List ( String, List String ) -> (() -> BackendTask FatalError b) -> BackendTask FatalError b logExecs msg cmds k = - Do.log (Ansi.Color.fontColor Ansi.Color.cyan msg) <| \_ -> + logCyan msg <| \_ -> Do.each cmds (\( cmd, args ) -> Do.log (formatCmd cmd args) <| \_ -> @@ -121,6 +115,11 @@ logExecs msg cmds k = k () +logCyan : String -> ((() -> BackendTask FatalError b) -> BackendTask FatalError b) +logCyan msg = + Do.log (Ansi.Color.fontColor Ansi.Color.cyan msg) + + formatCmd : String -> List String -> String formatCmd cmd args = String.join " " <| diff --git a/installers/linux/packages/src/Packages.elm b/installers/linux/packages/src/Packages.elm new file mode 100644 index 000000000..a430924c2 --- /dev/null +++ b/installers/linux/packages/src/Packages.elm @@ -0,0 +1,44 @@ +module Packages exposing (Package, packages) + + +type alias Package = + { name : String + , version : String + , url : String + , debianArch : String + , maintainer : String + , description : String + } + + +packages : List Package +packages = + [ lamdera "1.3.2" "0.19.1" + ] + |> List.concat + + +lamdera : String -> String -> List Package +lamdera lamderaVersion elmVersion = + [ { lamderaName = "x86_64", debianName = "amd64" } + , { lamderaName = "arm64", debianName = "aarch64" } + ] + |> List.map + (\arch -> + let + fullName : String + fullName = + "lamdera-" ++ lamderaVersion ++ "-linux-" ++ arch.lamderaName + + url : String + url = + "https://static.lamdera.com/bin/" ++ fullName + in + { name = "lamdera" + , version = lamderaVersion ++ "-" ++ elmVersion + , url = url + , debianArch = arch.debianName + , description = "A delightful platform for full-stack web apps" + , maintainer = "Mario Rogic " + } + ) diff --git a/installers/linux/packages/src/Versions.elm b/installers/linux/packages/src/Versions.elm deleted file mode 100644 index a4e06ece5..000000000 --- a/installers/linux/packages/src/Versions.elm +++ /dev/null @@ -1,14 +0,0 @@ -module Versions exposing (architectures, versions) - - -architectures : List { lamderaName : String, debianName : String } -architectures = - [ { lamderaName = "x86_64", debianName = "amd64" } - , { lamderaName = "arm64", debianName = "aarch64" } - ] - - -versions : List { lamderaVersion : String, elmVersion : String } -versions = - [ { lamderaVersion = "1.3.2", elmVersion = "0.19.1" } - ] From fa81338000dc474c95d237d90a6d6df4a0a3a4da Mon Sep 17 00:00:00 2001 From: Leonardo Taglialegne Date: Fri, 11 Jul 2025 12:28:14 +0200 Subject: [PATCH 4/8] Add hash check --- installers/linux/packages/src/Main.elm | 29 +++++++-- installers/linux/packages/src/Packages.elm | 69 ++++++++++++++-------- 2 files changed, 68 insertions(+), 30 deletions(-) diff --git a/installers/linux/packages/src/Main.elm b/installers/linux/packages/src/Main.elm index 33b6a04f8..0958facc8 100644 --- a/installers/linux/packages/src/Main.elm +++ b/installers/linux/packages/src/Main.elm @@ -35,8 +35,25 @@ task = , ( "chmod", [ "+x", binaryPath ] ) ] <| \_ -> - Do.do (prepareDeb { package = package, binaryPath = binaryPath }) <| \_ -> - Do.noop + logExec " ๐Ÿ•ต๏ธ Verifying hash" "sha512sum" [ binaryPath ] <| \actualHash -> + let + expectedHash : String + expectedHash = + package.hash ++ " " ++ binaryPath + in + if String.trim actualHash == expectedHash then + Do.do (prepareDeb { package = package, binaryPath = binaryPath }) <| \_ -> + Do.noop + + else + BackendTask.fail + (FatalError.fromString + ("Invalid hash:\n expected: " + ++ expectedHash + ++ ",\n got: " + ++ String.trim actualHash + ) + ) ) <| \_ -> logExec "๐Ÿงน Cleaning up temporary work directory" "rm" [ "-r", "work" ] <| \_ -> @@ -95,14 +112,14 @@ controlFile { package, revision } = |> String.join "\n" -logExec : String -> String -> List String -> (() -> BackendTask FatalError b) -> BackendTask FatalError b +logExec : String -> String -> List String -> (String -> BackendTask FatalError a) -> BackendTask FatalError a logExec msg cmd args k = logCyan msg <| \_ -> Do.log (formatCmd cmd args) <| \_ -> - Do.exec cmd args k + Do.command cmd args k -logExecs : String -> List ( String, List String ) -> (() -> BackendTask FatalError b) -> BackendTask FatalError b +logExecs : String -> List ( String, List String ) -> (() -> BackendTask FatalError a) -> BackendTask FatalError a logExecs msg cmds k = logCyan msg <| \_ -> Do.each cmds @@ -115,7 +132,7 @@ logExecs msg cmds k = k () -logCyan : String -> ((() -> BackendTask FatalError b) -> BackendTask FatalError b) +logCyan : String -> ((() -> BackendTask FatalError a) -> BackendTask FatalError a) logCyan msg = Do.log (Ansi.Color.fontColor Ansi.Color.cyan msg) diff --git a/installers/linux/packages/src/Packages.elm b/installers/linux/packages/src/Packages.elm index a430924c2..fc5bf2de6 100644 --- a/installers/linux/packages/src/Packages.elm +++ b/installers/linux/packages/src/Packages.elm @@ -8,37 +8,58 @@ type alias Package = , debianArch : String , maintainer : String , description : String + , hash : String } packages : List Package packages = - [ lamdera "1.3.2" "0.19.1" + [ lamdera + { lamderaVersion = "1.3.2" + , elmVersion = "0.19.1" + , hashes = + { x86_64 = "f270decbbd305905a4ba31cfaa77c9708f976941816d4834df6b995f8a7531187da3414d7695351f72e09c1c0557726deed7a38ee107139ef6fd7f08ac4fc647" + , arm64 = "ff388e08436ad4ab69a8baf5189b293971bafc7bef46ef342131d1013687c7b026705e7021c9543257ab999a2ff51db8655283a44955faa6e7c832c26916df0f" + } + } ] |> List.concat -lamdera : String -> String -> List Package -lamdera lamderaVersion elmVersion = - [ { lamderaName = "x86_64", debianName = "amd64" } - , { lamderaName = "arm64", debianName = "aarch64" } - ] - |> List.map - (\arch -> - let - fullName : String - fullName = - "lamdera-" ++ lamderaVersion ++ "-linux-" ++ arch.lamderaName +lamdera : + { lamderaVersion : String + , elmVersion : String + , hashes : { x86_64 : String, arm64 : String } + } + -> List Package +lamdera { lamderaVersion, elmVersion, hashes } = + let + go : + { lamderaArch : String + , debianArch : String + , hash : String + } + -> Package + go data = + let + fullName : String + fullName = + "lamdera-" ++ lamderaVersion ++ "-linux-" ++ data.lamderaArch - url : String - url = - "https://static.lamdera.com/bin/" ++ fullName - in - { name = "lamdera" - , version = lamderaVersion ++ "-" ++ elmVersion - , url = url - , debianArch = arch.debianName - , description = "A delightful platform for full-stack web apps" - , maintainer = "Mario Rogic " - } - ) + url : String + url = + "https://static.lamdera.com/bin/" ++ fullName + in + { name = "lamdera" + , version = lamderaVersion ++ "-" ++ elmVersion + , url = url + , debianArch = data.debianArch + , description = "A delightful platform for full-stack web apps" + , maintainer = "Mario Rogic " + , hash = data.hash + } + in + [ { lamderaArch = "x86_64", debianArch = "amd64", hash = hashes.x86_64 } + , { lamderaArch = "arm64", debianArch = "aarch64", hash = hashes.arm64 } + ] + |> List.map go From a44c737ca107fcdac03491af114c41c6da391a97 Mon Sep 17 00:00:00 2001 From: Leonardo Taglialegne Date: Fri, 11 Jul 2025 12:44:57 +0200 Subject: [PATCH 5/8] Deduplicate code --- installers/linux/packages/src/Main.elm | 20 +++- installers/linux/packages/src/Packages.elm | 121 +++++++++++++++------ 2 files changed, 102 insertions(+), 39 deletions(-) diff --git a/installers/linux/packages/src/Main.elm b/installers/linux/packages/src/Main.elm index 0958facc8..a4db4e4a9 100644 --- a/installers/linux/packages/src/Main.elm +++ b/installers/linux/packages/src/Main.elm @@ -5,7 +5,7 @@ import BackendTask exposing (BackendTask) import BackendTask.Do as Do import FatalError exposing (FatalError) import Json.Encode -import Packages exposing (Package) +import Packages exposing (Arch(..), Package) import Pages.Script as Script exposing (Script) @@ -19,11 +19,11 @@ task = logExec "๐Ÿ‘ท Creating temporary work directory" "mkdir" [ "-p", "work" ] <| \_ -> logExec "๐Ÿ‘ท Creating output directory" "mkdir" [ "-p", "out" ] <| \_ -> Do.each Packages.packages - (\({ name, version, url, debianArch } as package) -> + (\({ name, version, url, arch } as package) -> let fullName : String fullName = - name ++ "-" ++ version ++ "-" ++ debianArch + name ++ "-" ++ version ++ "-" ++ archToDebian arch binaryPath : String binaryPath = @@ -60,6 +60,16 @@ task = Do.noop +archToDebian : Arch -> String +archToDebian arch = + case arch of + X86_64 -> + "amd64" + + Arm64 -> + "aarch64" + + prepareDeb : { package : Package, binaryPath : String } -> BackendTask FatalError () prepareDeb { package, binaryPath } = let @@ -91,7 +101,7 @@ prepareDeb { package, binaryPath } = ) <| \_ -> logExecs " ๐ŸŒ€ ๐Ÿ“ฆ Creating the package" - [ ( "dpkg-deb", [ "--root-owner-group", "--build", debPath, "out/" ++ debName ++ "_" ++ package.debianArch ++ ".deb" ] ) ] + [ ( "dpkg-deb", [ "--root-owner-group", "--build", debPath, "out/" ++ debName ++ "_" ++ archToDebian package.arch ++ ".deb" ] ) ] <| \_ -> Do.noop @@ -102,7 +112,7 @@ controlFile { package, revision } = , "Version: " ++ package.version ++ "-" ++ revision , "Section: base" , "Priority: optional" - , "Architecture: " ++ package.debianArch + , "Architecture: " ++ archToDebian package.arch -- , "Depends:" , "Maintainer: " ++ package.maintainer diff --git a/installers/linux/packages/src/Packages.elm b/installers/linux/packages/src/Packages.elm index fc5bf2de6..65b0a80e2 100644 --- a/installers/linux/packages/src/Packages.elm +++ b/installers/linux/packages/src/Packages.elm @@ -1,17 +1,35 @@ -module Packages exposing (Package, packages) +module Packages exposing (Arch(..), Package, packages) type alias Package = { name : String , version : String , url : String - , debianArch : String + , arch : Arch , maintainer : String , description : String , hash : String } +type Arch + = X86_64 + | Arm64 + + +arches : List Arch +arches = + [ X86_64 + , Arm64 + ] + + +type alias Hashes = + { x86_64 : String + , arm64 : String + } + + packages : List Package packages = [ lamdera @@ -23,43 +41,78 @@ packages = } } ] - |> List.concat + |> List.concatMap + (\f -> + List.map + (\arch -> + let + data : PackageData + data = + f arch + in + { name = data.name + , version = data.version + , url = data.url + , description = data.description + , maintainer = data.maintainer + , hash = getHash arch data.hashes + , arch = arch + } + ) + arches + ) + + +type alias PackageData = + { name : String + , version : String + , url : String + , description : String + , maintainer : String + , hashes : Hashes + } lamdera : { lamderaVersion : String , elmVersion : String - , hashes : { x86_64 : String, arm64 : String } + , hashes : Hashes } - -> List Package -lamdera { lamderaVersion, elmVersion, hashes } = + -> Arch + -> PackageData +lamdera { lamderaVersion, elmVersion, hashes } arch = let - go : - { lamderaArch : String - , debianArch : String - , hash : String - } - -> Package - go data = - let - fullName : String - fullName = - "lamdera-" ++ lamderaVersion ++ "-linux-" ++ data.lamderaArch - - url : String - url = - "https://static.lamdera.com/bin/" ++ fullName - in - { name = "lamdera" - , version = lamderaVersion ++ "-" ++ elmVersion - , url = url - , debianArch = data.debianArch - , description = "A delightful platform for full-stack web apps" - , maintainer = "Mario Rogic " - , hash = data.hash - } + lamderaArch : String + lamderaArch = + case arch of + X86_64 -> + "x86_64" + + Arm64 -> + "arm64" + + fullName : String + fullName = + "lamdera-" ++ lamderaVersion ++ "-linux-" ++ lamderaArch + + url : String + url = + "https://static.lamdera.com/bin/" ++ fullName in - [ { lamderaArch = "x86_64", debianArch = "amd64", hash = hashes.x86_64 } - , { lamderaArch = "arm64", debianArch = "aarch64", hash = hashes.arm64 } - ] - |> List.map go + { name = "lamdera" + , version = lamderaVersion ++ "-" ++ elmVersion + , url = url + , description = "A delightful platform for full-stack web apps" + , maintainer = "Mario Rogic " + , hashes = hashes + } + + +getHash : Arch -> Hashes -> String +getHash arch hashes = + case arch of + X86_64 -> + hashes.x86_64 + + Arm64 -> + hashes.arm64 From cb91a8882e32b1029aea409da2ab73699b920c6b Mon Sep 17 00:00:00 2001 From: Leonardo Taglialegne Date: Fri, 11 Jul 2025 12:49:08 +0200 Subject: [PATCH 6/8] Add elm-format --- installers/linux/packages/src/Main.elm | 2 +- installers/linux/packages/src/Packages.elm | 43 +++++++++++++++++++++- 2 files changed, 42 insertions(+), 3 deletions(-) diff --git a/installers/linux/packages/src/Main.elm b/installers/linux/packages/src/Main.elm index a4db4e4a9..4d98be44c 100644 --- a/installers/linux/packages/src/Main.elm +++ b/installers/linux/packages/src/Main.elm @@ -35,7 +35,7 @@ task = , ( "chmod", [ "+x", binaryPath ] ) ] <| \_ -> - logExec " ๐Ÿ•ต๏ธ Verifying hash" "sha512sum" [ binaryPath ] <| \actualHash -> + logExec " ๐Ÿ•ต๏ธ Verifying hash" "sha256sum" [ binaryPath ] <| \actualHash -> let expectedHash : String expectedHash = diff --git a/installers/linux/packages/src/Packages.elm b/installers/linux/packages/src/Packages.elm index 65b0a80e2..f5d09fb1c 100644 --- a/installers/linux/packages/src/Packages.elm +++ b/installers/linux/packages/src/Packages.elm @@ -36,8 +36,22 @@ packages = { lamderaVersion = "1.3.2" , elmVersion = "0.19.1" , hashes = - { x86_64 = "f270decbbd305905a4ba31cfaa77c9708f976941816d4834df6b995f8a7531187da3414d7695351f72e09c1c0557726deed7a38ee107139ef6fd7f08ac4fc647" - , arm64 = "ff388e08436ad4ab69a8baf5189b293971bafc7bef46ef342131d1013687c7b026705e7021c9543257ab999a2ff51db8655283a44955faa6e7c832c26916df0f" + { x86_64 = "15a69bfa98155651749e31c68d05a04fcf48bdccb86bce77b7c8872f545cecfa" + , arm64 = "68a16bbbd2ed0ee19c36112a4c2d0abca66cf17465747e55adf2596b0921f8d7" + } + } + , elmFormat + { version = "0.8.7" + , hashes = + { x86_64 = "44344c7b6f838dc5d9495dfe4253280a698c2251ee8cfa29b6d1a032b6efb13b" + , arm64 = "fe99b3925201598121aeea6b31b55bd3ab6dad743bce27082d8e01e723bd160e" + } + } + , elmFormat + { version = "0.8.8" + , hashes = + { x86_64 = "ee749898a07871e5dcbe7adf77a6c3d95de2fcde2e15de30e4fa7457faf05a71" + , arm64 = "0be0046a81432e6e16340b8093cafa35a454e84956522d53f6a28f815dceac23" } } ] @@ -108,6 +122,31 @@ lamdera { lamderaVersion, elmVersion, hashes } arch = } +elmFormat : { version : String, hashes : Hashes } -> Arch -> PackageData +elmFormat { version, hashes } arch = + let + elmFormatArch : String + elmFormatArch = + case arch of + X86_64 -> + "x64" + + Arm64 -> + "aarch64" + + url : String + url = + "https://github.com/avh4/elm-format/releases/download/" ++ version ++ "/elm-format-" ++ version ++ "-linux-" ++ elmFormatArch ++ ".tgz" + in + { name = "elm-format" + , version = version + , url = url + , description = "Formats Elm source code according to a standard set of rules based on the official Elm Style Guide" + , maintainer = "Aaron VonderHaar " + , hashes = hashes + } + + getHash : Arch -> Hashes -> String getHash arch hashes = case arch of From e0a63bc5bca8c82945c8cb5978bf17a4a20a8aca Mon Sep 17 00:00:00 2001 From: Leonardo Taglialegne Date: Fri, 11 Jul 2025 12:54:13 +0200 Subject: [PATCH 7/8] Add elm-test-rs --- installers/linux/packages/src/Packages.elm | 39 ++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/installers/linux/packages/src/Packages.elm b/installers/linux/packages/src/Packages.elm index f5d09fb1c..b81f8acb6 100644 --- a/installers/linux/packages/src/Packages.elm +++ b/installers/linux/packages/src/Packages.elm @@ -54,6 +54,20 @@ packages = , arm64 = "0be0046a81432e6e16340b8093cafa35a454e84956522d53f6a28f815dceac23" } } + , elmTestRs + { version = "3.0" + , hashes = + { x86_64 = "c72702d32a2a9e051667febeeef486a1794798d0770be1a9da95895e10b6db0f" + , arm64 = "bf468f39f9a9700f7ca0ed29719f9c9051e4b3796976ae0752a5186fdb8f0449" + } + } + , elmTestRs + { version = "3.0.1" + , hashes = + { x86_64 = "3d99e394f2a90ddf5fcb579b7c9c822b62c2a71c5621cb9e2c5d5b37f8a9d5a7" + , arm64 = "c3ca8a90c0c7cb0fbeeab8f164271854cd449fdab5f30894fb09fba2e575b595" + } + } ] |> List.concatMap (\f -> @@ -147,6 +161,31 @@ elmFormat { version, hashes } arch = } +elmTestRs : { version : String, hashes : Hashes } -> Arch -> PackageData +elmTestRs { version, hashes } arch = + let + elmTestRsArch : String + elmTestRsArch = + case arch of + X86_64 -> + "" + + Arm64 -> + "-arm-64" + + url : String + url = + "https://github.com/mpizenberg/elm-test-rs/releases/download/v" ++ version ++ "/elm-test-rs_linux" ++ elmTestRsArch ++ ".tar.gz" + in + { name = "elm-test-rs" + , version = version + , url = url + , description = "Fast and portable executable to run your Elm tests" + , maintainer = "Matthieu Pizenberg " + , hashes = hashes + } + + getHash : Arch -> Hashes -> String getHash arch hashes = case arch of From f517cb2cf2d4bf3f0c040452d51a13a3c78e00ef Mon Sep 17 00:00:00 2001 From: Leonardo Taglialegne Date: Fri, 11 Jul 2025 13:01:35 +0200 Subject: [PATCH 8/8] Add elm-json --- installers/linux/packages/src/Packages.elm | 71 +++++++++++++++------- 1 file changed, 48 insertions(+), 23 deletions(-) diff --git a/installers/linux/packages/src/Packages.elm b/installers/linux/packages/src/Packages.elm index b81f8acb6..7715a35d8 100644 --- a/installers/linux/packages/src/Packages.elm +++ b/installers/linux/packages/src/Packages.elm @@ -68,24 +68,30 @@ packages = , arm64 = "c3ca8a90c0c7cb0fbeeab8f164271854cd449fdab5f30894fb09fba2e575b595" } } + , elmJson + { version = "0.2.13" + , hashes = + { x86_64 = "83cbab79f6c237d3f96b69baf519bdd7634d0e0373a390594d37591c0295f965" + , arm64 = "" + } + } ] |> List.concatMap (\f -> - List.map + List.filterMap (\arch -> - let - data : PackageData - data = - f arch - in - { name = data.name - , version = data.version - , url = data.url - , description = data.description - , maintainer = data.maintainer - , hash = getHash arch data.hashes - , arch = arch - } + f arch + |> Maybe.map + (\data -> + { name = data.name + , version = data.version + , url = data.url + , description = data.description + , maintainer = data.maintainer + , hash = getHash arch data.hashes + , arch = arch + } + ) ) arches ) @@ -101,13 +107,7 @@ type alias PackageData = } -lamdera : - { lamderaVersion : String - , elmVersion : String - , hashes : Hashes - } - -> Arch - -> PackageData +lamdera : { lamderaVersion : String, elmVersion : String, hashes : Hashes } -> Arch -> Maybe PackageData lamdera { lamderaVersion, elmVersion, hashes } arch = let lamderaArch : String @@ -134,9 +134,10 @@ lamdera { lamderaVersion, elmVersion, hashes } arch = , maintainer = "Mario Rogic " , hashes = hashes } + |> Just -elmFormat : { version : String, hashes : Hashes } -> Arch -> PackageData +elmFormat : { version : String, hashes : Hashes } -> Arch -> Maybe PackageData elmFormat { version, hashes } arch = let elmFormatArch : String @@ -159,9 +160,10 @@ elmFormat { version, hashes } arch = , maintainer = "Aaron VonderHaar " , hashes = hashes } + |> Just -elmTestRs : { version : String, hashes : Hashes } -> Arch -> PackageData +elmTestRs : { version : String, hashes : Hashes } -> Arch -> Maybe PackageData elmTestRs { version, hashes } arch = let elmTestRsArch : String @@ -184,6 +186,29 @@ elmTestRs { version, hashes } arch = , maintainer = "Matthieu Pizenberg " , hashes = hashes } + |> Just + + +elmJson : { version : String, hashes : Hashes } -> Arch -> Maybe PackageData +elmJson { version, hashes } arch = + case arch of + X86_64 -> + let + url : String + url = + "https://github.com/zwilias/elm-json/releases/download/v" ++ version ++ "/elm-json-v" ++ version ++ "-x86_64-unknown-linux-musl.tar.gz" + in + { name = "elm-json" + , version = version + , url = url + , description = "Install, upgrade and uninstall Elm dependencies" + , maintainer = "Ilias Van Peer " + , hashes = hashes + } + |> Just + + Arm64 -> + Nothing getHash : Arch -> Hashes -> String