Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package ghc-hslua-module-system for 
openSUSE:Factory checked in at 2021-11-11 21:36:33
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/ghc-hslua-module-system (Old)
 and      /work/SRC/openSUSE:Factory/.ghc-hslua-module-system.new.1890 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "ghc-hslua-module-system"

Thu Nov 11 21:36:33 2021 rev:7 rq:930333 version:1.0.0

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/ghc-hslua-module-system/ghc-hslua-module-system.changes
  2020-12-22 11:40:40.389573670 +0100
+++ 
/work/SRC/openSUSE:Factory/.ghc-hslua-module-system.new.1890/ghc-hslua-module-system.changes
        2021-11-11 21:36:47.636904928 +0100
@@ -1,0 +2,10 @@
+Mon Nov  1 08:48:28 UTC 2021 - [email protected]
+
+- Update hslua-module-system to version 1.0.0.
+  ## 1.0.0
+
+  Release pending.
+
+  - Use hslua 2.0.
+
+-------------------------------------------------------------------

Old:
----
  hslua-module-system-0.2.2.1.tar.gz

New:
----
  hslua-module-system-1.0.0.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ ghc-hslua-module-system.spec ++++++
--- /var/tmp/diff_new_pack.ZxCdC8/_old  2021-11-11 21:36:48.220905354 +0100
+++ /var/tmp/diff_new_pack.ZxCdC8/_new  2021-11-11 21:36:48.220905354 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package ghc-hslua-module-system
 #
-# Copyright (c) 2020 SUSE LLC
+# Copyright (c) 2021 SUSE LLC
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -19,34 +19,34 @@
 %global pkg_name hslua-module-system
 %bcond_with tests
 Name:           ghc-%{pkg_name}
-Version:        0.2.2.1
+Version:        1.0.0
 Release:        0
 Summary:        Lua module wrapper around Haskell's System module
 License:        MIT
 URL:            https://hackage.haskell.org/package/%{pkg_name}
 Source0:        
https://hackage.haskell.org/package/%{pkg_name}-%{version}/%{pkg_name}-%{version}.tar.gz
 BuildRequires:  ghc-Cabal-devel
-BuildRequires:  ghc-containers-devel
 BuildRequires:  ghc-directory-devel
 BuildRequires:  ghc-exceptions-devel
-BuildRequires:  ghc-hslua-devel
+BuildRequires:  ghc-hslua-core-devel
+BuildRequires:  ghc-hslua-marshalling-devel
+BuildRequires:  ghc-hslua-packaging-devel
 BuildRequires:  ghc-rpm-macros
 BuildRequires:  ghc-temporary-devel
+BuildRequires:  ghc-text-devel
 ExcludeArch:    %{ix86}
 %if %{with tests}
 BuildRequires:  ghc-tasty-devel
 BuildRequires:  ghc-tasty-hunit-devel
 BuildRequires:  ghc-tasty-lua-devel
-BuildRequires:  ghc-text-devel
 %endif
 
 %description
 Provides access to system information and functionality to Lua scripts via
 Haskell's `System` module.
 
-Intended usage for this package is to preload it by adding the loader function
-to `package.preload`. Note that the Lua `package` library must have already
-been loaded before the loader can be added.
+This package is part of HsLua, a Haskell framework built around the embeddable
+scripting language <https://lua.org Lua>.
 
 %package devel
 Summary:        Haskell %{pkg_name} library development files

++++++ hslua-module-system-0.2.2.1.tar.gz -> hslua-module-system-1.0.0.tar.gz 
++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/hslua-module-system-0.2.2.1/CHANGELOG.md 
new/hslua-module-system-1.0.0/CHANGELOG.md
--- old/hslua-module-system-0.2.2.1/CHANGELOG.md        2001-09-09 
03:46:40.000000000 +0200
+++ new/hslua-module-system-1.0.0/CHANGELOG.md  2001-09-09 03:46:40.000000000 
+0200
@@ -1,5 +1,11 @@
 # Revision history for hslua-module-system
 
+## 1.0.0
+
+Release pending.
+
+- Use hslua 2.0.
+
 ## 0.2.2.1 -- 2020-10-16
 
 - Relaxed upper bound for hslua, allow `hslua-1.3.*`.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/hslua-module-system-0.2.2.1/LICENSE 
new/hslua-module-system-1.0.0/LICENSE
--- old/hslua-module-system-0.2.2.1/LICENSE     2001-09-09 03:46:40.000000000 
+0200
+++ new/hslua-module-system-1.0.0/LICENSE       2001-09-09 03:46:40.000000000 
+0200
@@ -1,4 +1,4 @@
-Copyright (c) 2019 Albert Krewinkel
+Copyright (c) 2019-2021 Albert Krewinkel
 
 Permission is hereby granted, free of charge, to any person obtaining
 a copy of this software and associated documentation files (the
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/hslua-module-system-0.2.2.1/Setup.hs 
new/hslua-module-system-1.0.0/Setup.hs
--- old/hslua-module-system-0.2.2.1/Setup.hs    2001-09-09 03:46:40.000000000 
+0200
+++ new/hslua-module-system-1.0.0/Setup.hs      1970-01-01 01:00:00.000000000 
+0100
@@ -1,2 +0,0 @@
-import Distribution.Simple
-main = defaultMain
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/hslua-module-system-0.2.2.1/hslua-module-system.cabal 
new/hslua-module-system-1.0.0/hslua-module-system.cabal
--- old/hslua-module-system-0.2.2.1/hslua-module-system.cabal   2001-09-09 
03:46:40.000000000 +0200
+++ new/hslua-module-system-1.0.0/hslua-module-system.cabal     2001-09-09 
03:46:40.000000000 +0200
@@ -1,55 +1,45 @@
+cabal-version:       2.2
 name:                hslua-module-system
-version:             0.2.2.1
+version:             1.0.0
 synopsis:            Lua module wrapper around Haskell's System module.
 
-description:         Provides access to system information and functionality
-                     to Lua scripts via Haskell's `System` module.
+description:         Provides access to system information and
+                     functionality to Lua scripts via Haskell's `System`
+                     module.
                      .
-                     Intended usage for this package is to preload it by adding
-                     the loader function to `package.preload`. Note that the
-                     Lua `package` library must have already been loaded before
-                     the loader can be added.
-homepage:            https://github.com/hslua/hslua-module-system
+                     This package is part of HsLua, a Haskell framework
+                     built around the embeddable scripting language
+                     <https://lua.org Lua>.
+homepage:            https://github.com/hslua/hslua
 license:             MIT
 license-file:        LICENSE
 author:              Albert Krewinkel
 maintainer:          [email protected]
-copyright:           ?? 2019-2020 Albert Krewinkel <[email protected]>
+copyright:           ?? 2019-2021 Albert Krewinkel <[email protected]>
 category:            Foreign
-build-type:          Simple
 extra-source-files:  CHANGELOG.md
                    , test/test-system.lua
-cabal-version:       >=1.10
 tested-with:         GHC == 8.0.2
                    , GHC == 8.2.2
                    , GHC == 8.4.4
                    , GHC == 8.6.5
                    , GHC == 8.8.3
-                   , GHC == 8.10.1
+                   , GHC == 8.10.4
+                   , GHC == 9.0.1
 
 source-repository head
   type:              git
-  location:          https://github.com/hslua/hslua-module-system.git
+  location:          https://github.com/hslua/hslua.git
+  subdir:            hslua-module-system
 
-library
-  build-depends:       base       >= 4.9    && < 5
-                     , containers >= 0.5    && < 0.7
-                     , directory  >= 1.3    && < 1.4
-                     , exceptions >= 0.8    && < 0.11
-                     , hslua      >= 1.0.3  && < 1.4
-                     , temporary  >= 1.2    && < 1.4
-  default-extensions:  LambdaCase
+common common-options
   default-language:    Haskell2010
-  exposed-modules:     Foreign.Lua.Module.System
-  other-modules:       Foreign.Lua.Module.SystemUtils
-  hs-source-dirs:      src
-  other-extensions:    OverloadedStrings
-
-test-suite test-hslua-module-system
-  default-language:    Haskell2010
-  type:                exitcode-stdio-1.0
-  main-is:             test-hslua-module-system.hs
-  hs-source-dirs:      test
+  build-depends:       base                 >= 4.8    && < 5
+                     , hslua-core           >= 2.0    && < 2.1
+                     , hslua-packaging      >= 2.0    && < 2.1
+                     , text                 >= 1.0    && < 1.3
+  default-extensions:  LambdaCase
+                     , OverloadedStrings
   ghc-options:         -Wall
                        -Wincomplete-record-updates
                        -Wnoncanonical-monad-instances
@@ -62,10 +52,25 @@
                          -Wincomplete-uni-patterns
                          -Wpartial-fields
                          -fhide-source-paths
-  build-depends:       base
-                     , hslua
-                     , hslua-module-system
-                     , tasty
-                     , tasty-hunit
-                     , tasty-lua  >= 0.2    && < 0.3
+
+library
+  import:              common-options
+  build-depends:       directory            >= 1.3    && < 1.4
+                     , exceptions           >= 0.8    && < 0.11
+                     , hslua-marshalling    >= 2.0    && < 2.1
+                     , temporary            >= 1.2    && < 1.4
+                     , text                 >= 1.0    && < 1.3
+  exposed-modules:     HsLua.Module.System
+  other-modules:       HsLua.Module.SystemUtils
+  hs-source-dirs:      src
+
+test-suite test-hslua-module-system
+  import:              common-options
+  type:                exitcode-stdio-1.0
+  main-is:             test-hslua-module-system.hs
+  hs-source-dirs:      test
+  build-depends:       hslua-module-system
+                     , tasty                >= 0.11
+                     , tasty-hunit          >= 0.9
+                     , tasty-lua            >= 1.0    && < 1.1
                      , text
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/hslua-module-system-0.2.2.1/src/Foreign/Lua/Module/System.hs 
new/hslua-module-system-1.0.0/src/Foreign/Lua/Module/System.hs
--- old/hslua-module-system-0.2.2.1/src/Foreign/Lua/Module/System.hs    
2001-09-09 03:46:40.000000000 +0200
+++ new/hslua-module-system-1.0.0/src/Foreign/Lua/Module/System.hs      
1970-01-01 01:00:00.000000000 +0100
@@ -1,207 +0,0 @@
-{-|
-Module      : Foreign.Lua.Module.System
-Copyright   : ?? 2019-2020 Albert Krewinkel
-License     : MIT
-Maintainer  : Albert Krewinkel <[email protected]>
-Stability   : alpha
-Portability : Requires GHC 8 or later.
-
-Provide a Lua module containing a selection of @'System'@ functions.
--}
-module Foreign.Lua.Module.System (
-
-  -- * Module
-    pushModule
-  , preloadModule
-
-  -- * Fields
-  , arch
-  , compiler_name
-  , compiler_version
-  , os
-
-  -- * Functions
-  , env
-  , getwd
-  , getenv
-  , ls
-  , mkdir
-  , rmdir
-  , setenv
-  , setwd
-  , tmpdirname
-  , with_env
-  , with_tmpdir
-  , with_wd
-  )
-where
-
-import Control.Applicative ((<$>))
-import Control.Monad (forM_)
-import Control.Monad.Catch (bracket)
-import Data.Maybe (fromMaybe)
-import Data.Version (versionBranch)
-import Foreign.Lua (Lua, NumResults (..), Optional (..))
-import Foreign.Lua.Module.SystemUtils
-
-import qualified Data.Map as Map
-import qualified Foreign.Lua as Lua
-import qualified System.Directory as Directory
-import qualified System.Environment as Env
-import qualified System.Info as Info
-import qualified System.IO.Temp as Temp
-
---
--- Module
---
-
--- | Pushes the @system@ module to the Lua stack.
-pushModule :: Lua NumResults
-pushModule = do
-  Lua.newtable
-  Lua.addfield "arch" arch
-  Lua.addfield "compiler_name" compiler_name
-  Lua.addfield "compiler_version" compiler_version
-  Lua.addfield "os" os
-  Lua.addfunction "env" env
-  Lua.addfunction "getenv" getenv
-  Lua.addfunction "getwd" getwd
-  Lua.addfunction "ls" ls
-  Lua.addfunction "mkdir" mkdir
-  Lua.addfunction "rmdir" rmdir
-  Lua.addfunction "setenv" setenv
-  Lua.addfunction "setwd" setwd
-  Lua.addfunction "tmpdirname" tmpdirname
-  Lua.addfunction "with_env" with_env
-  Lua.addfunction "with_tmpdir" with_tmpdir
-  Lua.addfunction "with_wd" with_wd
-  return 1
-
--- | Add the @system@ module under the given name to the table of
--- preloaded packages.
-preloadModule :: String -> Lua ()
-preloadModule = flip Lua.preloadhs pushModule
-
---
--- Fields
---
-
--- | The machine architecture on which the program is running.
-arch :: String
-arch = Info.arch
-
--- | The Haskell implementation with which the host program was
--- compiled.
-compiler_name :: String
-compiler_name = Info.compilerName
-
--- | The version of `compiler_name` with which the host program was
--- compiled.
-compiler_version :: [Int]
-compiler_version = versionBranch Info.compilerVersion
-
--- | The operating system on which the program is running.
-os :: String
-os = Info.os
-
-
---
--- Functions
---
-
--- | Retrieve the entire environment
-env :: Lua NumResults
-env = do
-  kvs <- ioToLua Env.getEnvironment
-  let addValue (k, v) = Lua.push k *> Lua.push v *> Lua.rawset (-3)
-  Lua.newtable
-  mapM_ addValue kvs
-  return (NumResults 1)
-
--- | Return the current working directory as an absolute path.
-getwd :: Lua FilePath
-getwd = ioToLua Directory.getCurrentDirectory
-
--- | Returns the value of an environment variable
-getenv :: String -> Lua (Optional String)
-getenv name = ioToLua (Optional <$> Env.lookupEnv name)
-
--- | List the contents of a directory.
-ls :: Optional FilePath -> Lua [FilePath]
-ls fp = do
-  let fp' = fromMaybe "." (fromOptional fp)
-  ioToLua (Directory.listDirectory fp')
-
--- | Create a new directory which is initially empty, or as near to
--- empty as the operating system allows.
---
--- If the optional second parameter is `false`, then create the new
--- directory only if it doesn't exist yet. If the parameter is `true`,
--- then parent directories are created as necessary.
-mkdir :: FilePath -> Bool -> Lua ()
-mkdir fp createParent =
-  if createParent
-  then ioToLua (Directory.createDirectoryIfMissing True fp)
-  else ioToLua (Directory.createDirectory fp)
-
--- | Remove an existing directory.
-rmdir :: FilePath -> Bool -> Lua ()
-rmdir fp recursive =
-  if recursive
-  then ioToLua (Directory.removeDirectoryRecursive fp)
-  else ioToLua (Directory.removeDirectory fp)
-
--- | Set the specified environment variable to a new value.
-setenv :: String -> String -> Lua ()
-setenv name value = ioToLua (Env.setEnv name value)
-
--- | Change current working directory.
-setwd :: FilePath -> Lua ()
-setwd fp = ioToLua $ Directory.setCurrentDirectory fp
-
--- | Get the current directory for temporary files.
-tmpdirname :: Lua FilePath
-tmpdirname = ioToLua Directory.getTemporaryDirectory
-
--- | Run an action in a different directory, then restore the old
--- working directory.
-with_wd :: FilePath -> Callback -> Lua NumResults
-with_wd fp callback =
-  bracket (Lua.liftIO Directory.getCurrentDirectory)
-          (Lua.liftIO . Directory.setCurrentDirectory)
-          $ \_ -> do
-              Lua.liftIO (Directory.setCurrentDirectory fp)
-              callback `invokeWithFilePath` fp
-
-
--- | Run an action, then restore the old environment variable values.
-with_env :: Map.Map String String -> Callback -> Lua NumResults
-with_env environment callback =
-  bracket (Lua.liftIO Env.getEnvironment)
-          setEnvironment
-          (\_ -> setEnvironment (Map.toList environment) >> invoke callback)
- where
-  setEnvironment newEnv = Lua.liftIO $ do
-    -- Crude, but fast enough: delete all entries in new environment,
-    -- then restore old environment one-by-one.
-    curEnv <- Env.getEnvironment
-    forM_ curEnv (Env.unsetEnv . fst)
-    forM_ newEnv (uncurry Env.setEnv)
-
-with_tmpdir :: String            -- ^ parent dir or template
-            -> AnyValue          -- ^ template or callback
-            -> Optional Callback -- ^ callback or nil
-            -> Lua NumResults
-with_tmpdir parentDir tmpl callback =
-  case fromOptional callback of
-    Nothing -> do
-      -- At most two args. The first arg (parent dir) has probably been
-      -- omitted, so we shift arguments and use the system's canonical
-      -- temporary directory.
-      let tmpl' = parentDir
-      callback' <- Lua.peek (fromAnyValue tmpl)
-      Temp.withSystemTempDirectory tmpl' (invokeWithFilePath callback')
-    Just callback' -> do
-      -- all args given. Second value must be converted to a string.
-      tmpl' <- Lua.peek (fromAnyValue tmpl)
-      Temp.withTempDirectory parentDir tmpl' (invokeWithFilePath callback')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/hslua-module-system-0.2.2.1/src/Foreign/Lua/Module/SystemUtils.hs 
new/hslua-module-system-1.0.0/src/Foreign/Lua/Module/SystemUtils.hs
--- old/hslua-module-system-0.2.2.1/src/Foreign/Lua/Module/SystemUtils.hs       
2001-09-09 03:46:40.000000000 +0200
+++ new/hslua-module-system-1.0.0/src/Foreign/Lua/Module/SystemUtils.hs 
1970-01-01 01:00:00.000000000 +0100
@@ -1,79 +0,0 @@
-{-|
-Module      : Foreign.Lua.Module.SystemUtils
-Copyright   : ?? 2019-2020 Albert Krewinkel
-License     : MIT
-Maintainer  : Albert Krewinkel <[email protected]>
-Stability   : alpha
-Portability : Requires GHC 8 or later.
-
-Utility functions and types for HsLua's system module.
--}
-module Foreign.Lua.Module.SystemUtils
-  ( AnyValue (..)
-  , Callback (..)
-  , invoke
-  , invokeWithFilePath
-  , ioToLua
-  )
-where
-
-import Control.Exception (IOException, try)
-import Foreign.Lua (Lua, NumResults(..), Peekable, Pushable, StackIndex)
-import qualified Foreign.Lua as Lua
-
--- | Lua callback function. This type is similar to @'AnyValue'@, and
--- the same caveats apply.
-newtype Callback = Callback StackIndex
-
-instance Peekable Callback where
-  peek idx = do
-    isFn <- Lua.isfunction idx
-    if isFn
-      then return (Callback idx)
-      else Lua.throwException "Function expected"
-
-instance Pushable Callback where
-  push (Callback idx) = Lua.pushvalue idx
-
-
--- | Any value of unknown type.
---
--- This simply wraps the function's index on the Lua stack. Changes to
--- the stack may only be made with great care, as they can break the
--- reference.
-newtype AnyValue = AnyValue { fromAnyValue :: StackIndex }
-
-instance Peekable AnyValue where
-  peek = return . AnyValue
-
-instance Pushable AnyValue where
-  push (AnyValue idx) = Lua.pushvalue idx
-
--- | Call Lua callback function and return all of its results.
-invoke :: Callback -> Lua NumResults
-invoke callback = do
-  oldTop <- Lua.gettop
-  Lua.push callback
-  Lua.call 0 Lua.multret
-  newTop <- Lua.gettop
-  return . NumResults . fromIntegral . Lua.fromStackIndex $
-    newTop - oldTop
-
--- | Call Lua callback function with the given filename as its argument.
-invokeWithFilePath :: Callback -> FilePath -> Lua NumResults
-invokeWithFilePath callback filename = do
-  oldTop <- Lua.gettop
-  Lua.push callback
-  Lua.push filename
-  Lua.call (Lua.NumArgs 1) Lua.multret
-  newTop <- Lua.gettop
-  return . NumResults . fromIntegral . Lua.fromStackIndex $
-    newTop - oldTop
-
--- | Convert a System IO operation to a Lua operation.
-ioToLua :: IO a -> Lua a
-ioToLua action = do
-  result <- Lua.liftIO (try action)
-  case result of
-    Right result' -> return result'
-    Left err      -> Lua.throwException (show (err :: IOException))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/hslua-module-system-0.2.2.1/src/HsLua/Module/System.hs 
new/hslua-module-system-1.0.0/src/HsLua/Module/System.hs
--- old/hslua-module-system-0.2.2.1/src/HsLua/Module/System.hs  1970-01-01 
01:00:00.000000000 +0100
+++ new/hslua-module-system-1.0.0/src/HsLua/Module/System.hs    2001-09-09 
03:46:40.000000000 +0200
@@ -0,0 +1,368 @@
+{-|
+Module      : HsLua.Module.System
+Copyright   : ?? 2019-2021 Albert Krewinkel
+License     : MIT
+Maintainer  : Albert Krewinkel <[email protected]>
+Stability   : alpha
+Portability : Requires GHC 8 or later.
+
+Provide a Lua module containing a selection of @'System'@ functions.
+-}
+module HsLua.Module.System (
+
+  -- * Module
+    documentedModule
+
+  -- ** Fields
+  , arch
+  , compiler_name
+  , compiler_version
+  , os
+
+  -- ** Functions
+  , env
+  , getwd
+  , getenv
+  , ls
+  , mkdir
+  , rmdir
+  , setenv
+  , setwd
+  , tmpdirname
+  , with_env
+  , with_tmpdir
+  , with_wd
+  )
+where
+
+import Control.Monad (forM_)
+import Control.Monad.Catch (bracket)
+import Data.Maybe (fromMaybe)
+import Data.Text (Text)
+import Data.Version (versionBranch)
+import HsLua.Core
+import HsLua.Marshalling
+import HsLua.Packaging
+import HsLua.Module.SystemUtils
+
+import qualified Data.Text as T
+import qualified HsLua.Core as Lua
+import qualified System.Directory as Directory
+import qualified System.Environment as Env
+import qualified System.Info as Info
+import qualified System.IO.Temp as Temp
+
+-- | The "system" module.
+documentedModule :: LuaError e => Module e
+documentedModule = Module
+  { moduleName = "system"
+  , moduleFields =
+      [ arch
+      , compiler_name
+      , compiler_version
+      , os
+      ]
+  , moduleFunctions =
+      [ env
+      , getenv
+      , getwd
+      , ls
+      , mkdir
+      , rmdir
+      , setenv
+      , setwd
+      , tmpdirname
+      , with_env
+      , with_tmpdir
+      , with_wd
+      ]
+  , moduleOperations = []
+  , moduleDescription =
+      "Access to the system's information and file functionality."
+  }
+
+--
+-- Fields
+--
+
+-- | Module field containing the machine architecture on which the
+-- program is running. Wraps @'Info.arch'@
+arch :: Field e
+arch = Field
+  { fieldName = "arch"
+  , fieldDescription =
+      "The machine architecture on which the program is running."
+  , fieldPushValue = pushString Info.arch
+  }
+
+-- | Module field containing the Haskell implementation with which the
+-- host program was compiled. Wraps @'Info.compilerName'@.
+compiler_name :: Field e
+compiler_name = Field
+  { fieldName = "compiler_name"
+  , fieldDescription = "The Haskell implementation with which the host "
+                       `T.append` "program was compiled."
+  , fieldPushValue = pushString Info.compilerName
+  }
+
+-- | Module field containing the version of `compiler_name` with which
+-- the host program was compiled.
+compiler_version :: LuaError e => Field e
+compiler_version = Field
+  { fieldName = "compiler_version"
+  , fieldDescription = T.unwords
+      [ "The Haskell implementation with which the host "
+      , "program was compiled." ]
+  , fieldPushValue = pushList pushIntegral $
+                     versionBranch Info.compilerVersion
+  }
+
+-- | Field containing the operating system on which the program is
+-- running.
+os :: Field e
+os = Field
+  { fieldName = "os"
+  , fieldDescription = "The operating system on which the program is running."
+  , fieldPushValue = pushString Info.os
+  }
+
+
+--
+-- Functions
+--
+
+-- | Retrieve the entire environment
+env :: LuaError e => DocumentedFunction e
+env = defun "env"
+  ### ioToLua Env.getEnvironment
+  =#> functionResult (pushKeyValuePairs pushString pushString) "table"
+        "A table mapping environment variable names to their value"
+  #? "Retrieves the entire environment."
+
+-- | Return the current working directory as an absolute path.
+getwd :: LuaError e => DocumentedFunction e
+getwd = defun "getwd"
+  ### ioToLua Directory.getCurrentDirectory
+  =#> filepathResult "The current working directory."
+  #? "Obtain the current working directory as an absolute path."
+
+-- | Returns the value of an environment variable
+getenv :: LuaError e => DocumentedFunction e
+getenv = defun "getenv"
+  ### ioToLua . Env.lookupEnv
+  <#> parameter peekString "string" "var" "name of the environment"
+  =#> functionResult (maybe pushnil pushString) "string or nil"
+        "value of the variable, or nil if the variable is not defined."
+  #? T.unwords
+    [ "Return the value of the environment variable `var`, or `nil` "
+    , "if there is no such value." ]
+
+-- | List the contents of a directory.
+ls :: LuaError e => DocumentedFunction e
+ls = defun "ls"
+  ### ioToLua . Directory.listDirectory . fromMaybe "."
+  <#> optionalParameter peekFilePath "string" "directory"
+        ("Path of the directory whose contents should be listed. "
+         `T.append` "Defaults to `.`.")
+  =#> functionResult (pushList pushString) "table"
+        ("A table of all entries in `directory`, except for the "
+          `T.append` "special entries (`.`  and `..`).")
+  #? "List the contents of a directory."
+
+
+-- | Create a new directory which is initially empty, or as near to
+-- empty as the operating system allows.
+--
+-- If the optional second parameter is `false`, then create the new
+-- directory only if it doesn't exist yet. If the parameter is `true`,
+-- then parent directories are created as necessary.
+mkdir :: LuaError e => DocumentedFunction e
+mkdir = defun "mkdir"
+  ### (\fp createParent ->
+         if createParent == Just True
+         then ioToLua (Directory.createDirectoryIfMissing True fp)
+         else ioToLua (Directory.createDirectory fp))
+  <#> parameter peekFilePath "string" "dirname"
+        "name of the new directory"
+  <#> optionalParameter peekBool "boolean" "create_parent"
+        "create parent directory if necessary"
+  =#> []
+  #? T.concat
+       [ "Create a new directory which is initially empty, or as near "
+       , "to empty as the operating system allows. The function throws "
+       , "an error if the directory cannot be created, e.g., if the "
+       , "parent directory does not exist or if a directory of the "
+       , "same name is already present.\n"
+       , "\n"
+       , "If the optional second parameter is provided and truthy, "
+       , "then all directories, including parent directories, are "
+       , "created as necessary.\n"
+       ]
+
+-- | Remove an existing directory.
+rmdir :: LuaError e => DocumentedFunction e
+rmdir = defun "rmdir"
+  ### (\fp recursive ->
+         if recursive == Just True
+         then ioToLua (Directory.removeDirectoryRecursive fp)
+         else ioToLua (Directory.removeDirectory fp))
+  <#> filepathParam "dirname" "name of the directory to delete"
+  <#> optionalParameter peekBool "boolean" "recursive"
+        "delete content recursively"
+  =#> []
+  #?("Remove an existing, empty directory. If `recursive` is given, "
+     `T.append` "then delete the directory and its contents recursively.")
+
+-- | Set the specified environment variable to a new value.
+setenv :: LuaError e => DocumentedFunction e
+setenv = defun "setenv"
+  ### (\name value -> ioToLua (Env.setEnv name value))
+  <#> parameter peekString "string" "name"
+        "name of the environment variable"
+  <#> parameter peekString "string" "value" "new value"
+  =#> []
+  #? "Set the specified environment variable to a new value."
+
+-- | Change current working directory.
+setwd :: LuaError e => DocumentedFunction e
+setwd = defun "setwd"
+  ### ioToLua . Directory.setCurrentDirectory
+  <#> filepathParam "directory" "Path of the new working directory"
+  =#> []
+  #? "Change the working directory to the given path."
+
+-- | Get the current directory for temporary files.
+tmpdirname :: LuaError e => DocumentedFunction e
+tmpdirname = defun "tmpdirname"
+  ### ioToLua Directory.getTemporaryDirectory
+  =#> functionResult pushString "string"
+        "The current directory for temporary files."
+  #? mconcat
+     [ "Returns the current directory for temporary files.\n"
+     , "\n"
+     , "On Unix, `tmpdirname()` returns the value of the `TMPDIR` "
+     , "environment variable or \"/tmp\" if the variable isn't defined. "
+     , "On Windows, the function checks for the existence of environment "
+     , "variables in the following order and uses the first path found:\n"
+     , "\n"
+     , "- TMP environment variable.\n"
+     , "- TEMP environment variable.\n"
+     , "- USERPROFILE environment variable.\n"
+     , "- The Windows directory\n"
+     , "\n"
+     , "The operation may fail if the operating system has no notion of "
+     , "temporary directory.\n"
+     , "\n"
+     , "The function doesn't verify whether the path exists.\n"
+     ]
+
+-- | Run an action in a different directory, then restore the old
+-- working directory.
+with_wd :: LuaError e => DocumentedFunction e
+with_wd = defun "with_wd"
+  ### (\fp callback ->
+        bracket (Lua.liftIO Directory.getCurrentDirectory)
+                (Lua.liftIO . Directory.setCurrentDirectory)
+        (\_ -> do
+              Lua.liftIO (Directory.setCurrentDirectory fp)
+              callback `invokeWithFilePath` fp))
+  <#> filepathParam "directory"
+        "Directory in which the given `callback` should be executed."
+  <#> parameter peekCallback "function" "callback"
+        "Action to execute in the given directory."
+  =?> "The results of the call to `callback`."
+  #? T.unwords
+     [ "Run an action within a different directory. This function will"
+     , "change the working directory to `directory`, execute `callback`,"
+     , "then switch back to the original working directory, even if an"
+     , "error occurs while running the callback action."
+     ]
+
+-- | Run an action, then restore the old environment variable values.
+with_env :: LuaError e => DocumentedFunction e
+with_env = defun "with_env"
+  ### (\environment callback ->
+        bracket (Lua.liftIO Env.getEnvironment)
+                setEnvironment
+                (\_ -> setEnvironment environment *> invoke callback))
+  <#> parameter (peekKeyValuePairs peekString peekString) "table"
+        "environment"
+        ("Environment variables and their values to be set before "
+         `T.append` "running `callback`")
+  <#> parameter peekCallback "function" "callback"
+        "Action to execute in the custom environment"
+  =?> "The results of the call to `callback`."
+  #? T.unwords
+     [ "Run an action within a custom environment. Only the environment"
+     , "variables given by `environment` will be set, when `callback` is"
+     , "called. The original environment is restored after this function"
+     , "finishes, even if an error occurs while running the callback"
+     , "action."
+     ]
+ where
+  setEnvironment newEnv = Lua.liftIO $ do
+    -- Crude, but fast enough: delete all entries in new environment,
+    -- then restore old environment one-by-one.
+    curEnv <- Env.getEnvironment
+    forM_ curEnv (Env.unsetEnv . fst)
+    forM_ newEnv (uncurry Env.setEnv)
+
+with_tmpdir :: LuaError e => DocumentedFunction e
+with_tmpdir = defun "with_tmpdir"
+  ### (\mParentDir tmpl callback -> case mParentDir of
+          Nothing -> do
+            Temp.withSystemTempDirectory tmpl $
+              invokeWithFilePath callback
+          Just parentDir -> do
+            Temp.withTempDirectory parentDir tmpl $
+              invokeWithFilePath callback)
+  <#> parameter peekParentDir "string" "parent_dir"
+        (mconcat
+         [ "Parent directory to create the directory in. If this "
+         , "parameter is omitted, the system's canonical temporary "
+         , "directory is used."
+         ])
+  <#> parameter peekString "string" "templ" "Directory name template."
+  <#> parameter peekCallback "function" "callback"
+        ("Function which takes the name of the temporary directory as "
+         `T.append` "its first argument.")
+  =?> "The results of the call to `callback`."
+  #? ("Create and use a temporary directory inside the given directory."
+      `T.append` "The directory is deleted after use.")
+  where
+    peekParentDir idx = do
+      args <- liftLua gettop
+      if args < 3
+        then liftLua $ do
+          pushnil
+          insert idx
+          return Nothing
+        else Just <$> peekString idx
+
+
+--
+-- Parameters
+--
+
+-- | Retrieves a file path from the stack.
+peekFilePath :: Peeker e FilePath
+peekFilePath = peekString
+
+-- | Filepath function parameter.
+filepathParam :: Text  -- ^ name
+              -> Text  -- ^ description
+              -> Parameter e FilePath
+filepathParam name description = Parameter
+  { parameterPeeker = peekFilePath
+  , parameterDoc = ParameterDoc
+    { parameterName = name
+    , parameterType = "string"
+    , parameterDescription = description
+    , parameterIsOptional = False
+    }
+  }
+
+-- | Result of a function returning a file path.
+filepathResult :: Text -- ^ Description
+               -> [FunctionResult e FilePath]
+filepathResult = functionResult pushString "string"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/hslua-module-system-0.2.2.1/src/HsLua/Module/SystemUtils.hs 
new/hslua-module-system-1.0.0/src/HsLua/Module/SystemUtils.hs
--- old/hslua-module-system-0.2.2.1/src/HsLua/Module/SystemUtils.hs     
1970-01-01 01:00:00.000000000 +0100
+++ new/hslua-module-system-1.0.0/src/HsLua/Module/SystemUtils.hs       
2001-09-09 03:46:40.000000000 +0200
@@ -0,0 +1,66 @@
+{-|
+Module      : HsLua.Module.SystemUtils
+Copyright   : ?? 2019-2021 Albert Krewinkel
+License     : MIT
+Maintainer  : Albert Krewinkel <[email protected]>
+
+Utility functions and types for HsLua's system module.
+-}
+module HsLua.Module.SystemUtils
+  ( Callback (..)
+  , peekCallback
+  , invoke
+  , invokeWithFilePath
+  , ioToLua
+  )
+where
+
+import Control.Exception (IOException, try)
+import HsLua.Core hiding (try)
+import HsLua.Marshalling
+
+-- | Lua callback function. This type is similar to @'AnyValue'@, and
+-- the same caveats apply.
+newtype Callback = Callback StackIndex
+
+peekCallback :: Peeker e Callback
+peekCallback = reportValueOnFailure "function" $ \idx -> do
+  idx' <- absindex idx
+  isFn <- isfunction idx'
+  return $ if isFn
+           then Just $ Callback idx'
+           else Nothing
+
+pushCallback :: Pusher e Callback
+pushCallback (Callback idx) = pushvalue idx
+
+-- | Call Lua callback function and return all of its results.
+invoke :: LuaError e
+       => Callback -> LuaE e NumResults
+invoke callback = do
+  oldTop <- gettop
+  pushCallback callback
+  call 0 multret
+  newTop <- gettop
+  return . NumResults . fromStackIndex $
+    newTop - oldTop
+
+-- | Call Lua callback function with the given filename as its argument.
+invokeWithFilePath :: LuaError e
+                   => Callback -> FilePath -> LuaE e NumResults
+invokeWithFilePath callback filename = do
+  oldTop <- gettop
+  pushCallback callback
+  pushString filename
+  call (NumArgs 1) multret
+  newTop <- gettop
+  return . NumResults . fromStackIndex $
+    newTop - oldTop
+
+-- | Convert a System IO operation to a Lua operation.
+ioToLua :: LuaError e => IO a -> LuaE e a
+ioToLua action = do
+  result <- liftIO (try action)
+  case result of
+    Right result' -> return result'
+    Left err      -> failLua (show (err :: IOException))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/hslua-module-system-0.2.2.1/test/test-hslua-module-system.hs 
new/hslua-module-system-1.0.0/test/test-hslua-module-system.hs
--- old/hslua-module-system-0.2.2.1/test/test-hslua-module-system.hs    
2001-09-09 03:46:40.000000000 +0200
+++ new/hslua-module-system-1.0.0/test/test-hslua-module-system.hs      
2001-09-09 03:46:40.000000000 +0200
@@ -1,7 +1,8 @@
 {-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE TypeApplications  #-}
 {-|
 Module      : Main
-Copyright   : ?? 2019-2020 Albert Krewinkel
+Copyright   : ?? 2019-2021 Albert Krewinkel
 License     : MIT
 Maintainer  : Albert Krewinkel <[email protected]>
 Stability   : alpha
@@ -10,21 +11,23 @@
 
 Tests for the `system` Lua module.
 -}
+module Main (main) where
 
 import Control.Monad (void)
-import Foreign.Lua (Lua)
-import Foreign.Lua.Module.System (preloadModule, pushModule)
+import HsLua.Core as Lua
+import HsLua.Module.System (documentedModule)
+import HsLua.Packaging.Module
+  (preloadModule, preloadModuleWithName, pushModule, registerModule)
 import Test.Tasty (TestTree, defaultMain, testGroup)
 import Test.Tasty.HUnit (assertEqual, testCase)
 import Test.Tasty.Lua (translateResultsFromFile)
 
-import qualified Foreign.Lua as Lua
-
 main :: IO ()
 main = do
-  luaTestResults <- Lua.run $ do
-    Lua.openlibs
-    Lua.requirehs "system" (void pushModule)
+  luaTestResults <- run @Lua.Exception $ do
+    openlibs
+    registerModule documentedModule
+    pop 1
     translateResultsFromFile "test/test-system.lua"
   defaultMain $ testGroup "hslua-module-system" [tests, luaTestResults]
 
@@ -32,21 +35,21 @@
 tests :: TestTree
 tests = testGroup "HsLua System module"
   [ testCase "system module can be pushed to the stack" $
-      Lua.run (void pushModule)
+      run (void (pushModule documentedModule) :: Lua ())
 
-  , testCase "system module can be added to the preloader" . Lua.run $ do
-      Lua.openlibs
-      preloadModule "system"
-      assertEqual' "function not added to preloader" Lua.TypeFunction =<< do
-        Lua.getglobal' "package.preload.system"
-        Lua.ltype (-1)
-
-  , testCase "system module can be loaded as hssystem" . Lua.run $ do
-      Lua.openlibs
-      preloadModule "hssystem"
-      assertEqual' "loading the module fails " Lua.OK =<<
-        Lua.dostring "require 'hssystem'"
+  , testCase "system module can be added to the preloader" . run $ do
+      openlibs
+      preloadModule documentedModule
+      assertEqual' "function not added to preloader" TypeFunction =<< do
+        _ <- dostring "return package.preload.system"
+        ltype top
+
+  , testCase "system module can be loaded as hssystem" . run $ do
+      openlibs
+      preloadModuleWithName documentedModule "hssystem"
+      assertEqual' "loading the module fails " OK =<<
+        dostring "require 'hssystem'"
   ]
 
 assertEqual' :: (Show a, Eq a) => String -> a -> a -> Lua ()
-assertEqual' msg expected = Lua.liftIO . assertEqual msg expected
+assertEqual' msg expected = liftIO . assertEqual msg expected
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/hslua-module-system-0.2.2.1/test/test-system.lua 
new/hslua-module-system-1.0.0/test/test-system.lua
--- old/hslua-module-system-0.2.2.1/test/test-system.lua        2001-09-09 
03:46:40.000000000 +0200
+++ new/hslua-module-system-1.0.0/test/test-system.lua  2001-09-09 
03:46:40.000000000 +0200
@@ -55,7 +55,9 @@
 
     test('setenv sets environment values', function ()
       system.setenv('HSLUA_SYSTEM_MODULE', 'test')
-      assert.are_equal(os.getenv 'HSLUA_SYSTEM_MODULE', 'test')
+      -- apparently this works differently on Windows.
+      local getenv = system.os == 'mingw32' and system.getenv or os.getenv
+      assert.are_equal(getenv 'HSLUA_SYSTEM_MODULE', 'test')
     end),
 
   },
@@ -140,32 +142,36 @@
 
   group 'with_env' {
     test('resets environment', function ()
-           local outer_value = 'outer test value'
-           local inner_value = 'inner test value'
-           local inner_only = 'test #2'
-
-           function check_env ()
-             assert.are_equal(os.getenv 'HSLUA_SYSTEM_TEST', inner_value)
-             assert.are_equal(
-               os.getenv 'HSLUA_SYSTEM_TEST_INNER_ONLY',
-               inner_only
-             )
-             assert.is_nil(os.getenv 'HSLUA_SYSTEM_TEST_OUTER_ONLY')
-           end
-
-           local test_env = {
-             HSLUA_SYSTEM_TEST = inner_value,
-             HSLUA_SYSTEM_TEST_INNER_ONLY = inner_only
-           }
-           system.setenv('HSLUA_SYSTEM_TEST_OUTER_ONLY', outer_value)
-           system.setenv('HSLUA_SYSTEM_TEST', outer_value)
-           system.with_env(test_env, check_env)
-           assert.are_equal(system.getenv 'HSLUA_SYSTEM_TEST', outer_value)
-           assert.is_nil(system.getenv 'HSLUA_SYSTEM_TEST_INNER_ONLY')
-           assert.are_equal(
-             system.getenv 'HSLUA_SYSTEM_TEST_OUTER_ONLY',
-             outer_value
-           )
+      -- TODO: this test fails on Windows for unknown reasons and is
+      -- disabled on there for that reason. This needs fixing.
+      if system.os == 'mingw32' then return nil end
+
+      local outer_value = 'outer test value'
+      local inner_value = 'inner test value'
+      local inner_only = 'test #2'
+
+      function check_env ()
+        assert.are_equal(os.getenv 'HSLUA_SYSTEM_TEST', inner_value)
+        assert.are_equal(
+          os.getenv 'HSLUA_SYSTEM_TEST_INNER_ONLY',
+          inner_only
+        )
+        assert.is_nil(os.getenv 'HSLUA_SYSTEM_TEST_OUTER_ONLY')
+      end
+
+      local test_env = {
+        HSLUA_SYSTEM_TEST = inner_value,
+        HSLUA_SYSTEM_TEST_INNER_ONLY = inner_only
+      }
+      system.setenv('HSLUA_SYSTEM_TEST_OUTER_ONLY', outer_value)
+      system.setenv('HSLUA_SYSTEM_TEST', outer_value)
+      system.with_env(test_env, check_env)
+      assert.are_equal(system.getenv 'HSLUA_SYSTEM_TEST', outer_value)
+      assert.is_nil(system.getenv 'HSLUA_SYSTEM_TEST_INNER_ONLY')
+      assert.are_equal(
+        system.getenv 'HSLUA_SYSTEM_TEST_OUTER_ONLY',
+        outer_value
+      )
     end)
   },
 
@@ -195,5 +201,11 @@
         assert.is_truthy(system.getwd():match (path .. '$'))
       end)
     end),
+    test('all callback results are returned', function ()
+      local a, b, c = system.with_wd('test', function (path)
+        return 'a', 'b', 'c'
+      end)
+      assert.are_same({a, b, c}, {'a', 'b', 'c'})
+    end),
   },
 }

Reply via email to