unofficial mirror of guix-devel@gnu.org 
 help / color / mirror / code / Atom feed
blob 761ec698789856ecccde93cdb7b1cf57c4bb2f8f 2586 bytes (raw)
name: packages/patches/elm-offline-package-registry.patch 	 # note: path name is non-authoritative(*)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
 
From 06563409e6f2b1cca7bc1b27e31efd07a7569da8 Mon Sep 17 00:00:00 2001
From: Philip McGrath <philip@philipmcgrath.com>
Date: Thu, 14 Apr 2022 22:41:04 -0400
Subject: [PATCH] minimal support for offline builds

Normally, Elm performs HTTP requests before building to obtain or
update its list of all registed packages and their versions.
This is problematic in the Guix build environment.

This patch causes Elm to check if the `GUIX_ELM_OFFLINE_REGISTRY_FILE`
is set and, if so, to use the contents of the file it specifies as
though it were the response from
https://package.elm-lang.org/all-packages.

This patch does not attempt to add more general support for offline
builds. In particular, it does not attempt to support incremental
updates to the package registry cache file. See also discussion at
https://discourse.elm-lang.org/t/private-package-tool-spec/6779/25.
---
 builder/src/Deps/Registry.hs | 25 +++++++++++++++++++++----
 1 file changed, 21 insertions(+), 4 deletions(-)

diff --git a/builder/src/Deps/Registry.hs b/builder/src/Deps/Registry.hs
index 8d7def98..70cf3622 100644
--- a/builder/src/Deps/Registry.hs
+++ b/builder/src/Deps/Registry.hs
@@ -18,6 +18,8 @@ import Control.Monad (liftM2)
 import Data.Binary (Binary, get, put)
 import qualified Data.List as List
 import qualified Data.Map.Strict as Map
+import System.Environment as Env
+import qualified Data.ByteString as BS
 
 import qualified Deps.Website as Website
 import qualified Elm.Package as Pkg
@@ -190,13 +192,28 @@ getVersions' name (Registry _ versions) =
 post :: Http.Manager -> String -> D.Decoder x a -> (a -> IO b) -> IO (Either Exit.RegistryProblem b)
 post manager path decoder callback =
   let
-    url = Website.route path []
-  in
-  Http.post manager url [] Exit.RP_Http $
-    \body ->
+    mkBodyCallback url body =
       case D.fromByteString decoder body of
         Right a -> Right <$> callback a
         Left _ -> return $ Left $ Exit.RP_Data url body
+    postOnline url cb =
+      Http.post manager url [] Exit.RP_Http cb
+    performPost f url =
+      f url (mkBodyCallback url)
+  in
+    do
+      maybeFile <- Env.lookupEnv "GUIX_ELM_OFFLINE_REGISTRY_FILE"
+      case (path, maybeFile) of
+        ( "/all-packages", Just file ) ->
+          performPost postOffline file
+        ( _, _ ) ->
+          -- don't know how to handle other endpoints yet
+          performPost postOnline (Website.route path [])
+
+postOffline :: String -> (BS.ByteString -> IO a) -> IO a
+postOffline file callback = do
+  body <- BS.readFile file
+  callback body
 
 
 
-- 
2.32.0


debug log:

solving 761ec698789856ecccde93cdb7b1cf57c4bb2f8f ...
found 761ec698789856ecccde93cdb7b1cf57c4bb2f8f in https://git.savannah.gnu.org/cgit/guix.git

(*) Git path names are given by the tree(s) the blob belongs to.
    Blobs themselves have no identifier aside from the hash of its contents.^

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/guix.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).