Date: Tuesday, July 6, 2021 @ 14:56:27 Author: felixonmars Revision: 973375
archrelease: copy trunk to community-staging-x86_64 Added: haskell-knob/repos/community-staging-x86_64/ haskell-knob/repos/community-staging-x86_64/PKGBUILD (from rev 973374, haskell-knob/trunk/PKGBUILD) haskell-knob/repos/community-staging-x86_64/base4.15.patch (from rev 973374, haskell-knob/trunk/base4.15.patch) ----------------+ PKGBUILD | 49 +++++ base4.15.patch | 496 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 545 insertions(+) Copied: haskell-knob/repos/community-staging-x86_64/PKGBUILD (from rev 973374, haskell-knob/trunk/PKGBUILD) =================================================================== --- community-staging-x86_64/PKGBUILD (rev 0) +++ community-staging-x86_64/PKGBUILD 2021-07-06 14:56:27 UTC (rev 973375) @@ -0,0 +1,49 @@ +# Maintainer: Felix Yan <felixonm...@archlinux.org> +# Contributor: Arch Haskell Team <arch-hask...@haskell.org> + +_hkgname=knob +pkgname=haskell-knob +pkgver=0.1.1 +pkgrel=22 +pkgdesc="Memory-backed handles" +url="https://github.com/felixonmars/knob" +license=("MIT") +arch=('x86_64') +depends=('ghc-libs') +makedepends=('ghc' 'haskell-chell') +source=("https://hackage.haskell.org/packages/archive/${_hkgname}/${pkgver}/${_hkgname}-${pkgver}.tar.gz" + base4.15.patch) +sha512sums=('b13e9a88de99fa941521135c7f61be4ad5b838806e7424ac4b38607d59635ec2ddd6808560f1568f6d974c531185d43b5e1510886e07bcb567b859a12659277b' + '80b0f41c2e874fc004908afae26bea0fdd83094460e22a26ec4617f6adcfbe3671da16e2c59ef32b90c75414ddcd3ac3b667667e151be7b7f5c0fefd07851ba4') + +prepare() { + patch -d $_hkgname-$pkgver -p1 < base4.15.patch +} + +build() { + cd $_hkgname-$pkgver + + runhaskell Setup configure -O --enable-shared --enable-executable-dynamic --disable-library-vanilla \ + --prefix=/usr --docdir=/usr/share/doc/$pkgname --enable-tests \ + --dynlibdir=/usr/lib --libsubdir=\$compiler/site-local/\$pkgid + runhaskell Setup build $MAKEFLAGS + runhaskell Setup register --gen-script + runhaskell Setup unregister --gen-script + sed -i -r -e "s|ghc-pkg.*update[^ ]* |&'--force' |" register.sh + sed -i -r -e "s|ghc-pkg.*unregister[^ ]* |&'--force' |" unregister.sh +} + +check() { + cd $_hkgname-$pkgver + runhaskell Setup test --show-details=direct +} + +package() { + cd $_hkgname-$pkgver + + install -D -m744 register.sh "$pkgdir"/usr/share/haskell/register/$pkgname.sh + install -D -m744 unregister.sh "$pkgdir"/usr/share/haskell/unregister/$pkgname.sh + runhaskell Setup copy --destdir="$pkgdir" + install -D -m644 "license.txt" "${pkgdir}/usr/share/licenses/${pkgname}/license.txt" + rm -f "${pkgdir}/usr/share/doc/${pkgname}/license.txt" +} Copied: haskell-knob/repos/community-staging-x86_64/base4.15.patch (from rev 973374, haskell-knob/trunk/base4.15.patch) =================================================================== --- community-staging-x86_64/base4.15.patch (rev 0) +++ community-staging-x86_64/base4.15.patch 2021-07-06 14:56:27 UTC (rev 973375) @@ -0,0 +1,496 @@ +From ded495e7815d398c33a2a901d146f73bde60b7a9 Mon Sep 17 00:00:00 2001 +From: Felix Yan <felixonm...@archlinux.org> +Date: Fri, 18 Jun 2021 05:14:00 +0800 +Subject: [PATCH] Port tests to chell-0.3+ and make it a test-suite of knob + +--- + knob.cabal | 21 ++++++++++++- + tests/KnobTests.hs | 70 +++++++++++++++++++----------------------- + tests/knob-tests.cabal | 22 ------------- + 3 files changed, 52 insertions(+), 61 deletions(-) + delete mode 100644 tests/knob-tests.cabal + +diff --git a/knob.cabal b/knob.cabal +index 85d4e10..246b185 100644 +--- a/knob.cabal ++++ b/knob.cabal +@@ -5,7 +5,7 @@ license-file: license.txt + author: John Millikin <jmilli...@gmail.com> + maintainer: John Millikin <jmilli...@gmail.com> + build-type: Simple +-cabal-version: >= 1.6 ++cabal-version: >= 1.8 + category: System + stability: experimental + homepage: https://john-millikin.com/software/knob/ +@@ -46,6 +46,10 @@ source-repository this + location: https://john-millikin.com/branches/knob/0.1/ + tag: knob_0.1.1 + ++flag coverage ++ default: False ++ manual: True ++ + library + hs-source-dirs: lib + ghc-options: -Wall -O2 +@@ -57,3 +61,18 @@ library + + exposed-modules: + Data.Knob ++ ++test-suite knob_tests ++ type: exitcode-stdio-1.0 ++ main-is: tests/KnobTests.hs ++ ghc-options: -Wall ++ ++ if flag(coverage) ++ ghc-options: -fhpc ++ ++ build-depends: ++ base >= 4.2 && < 5.0 ++ , bytestring >= 0.9 && < 0.11 ++ , chell >= 0.2 && < 0.6 ++ , transformers >= 0.2 && < 0.6 ++ , knob +diff --git a/tests/KnobTests.hs b/tests/KnobTests.hs +index f5a06d4..b8e4d61 100644 +--- a/tests/KnobTests.hs ++++ b/tests/KnobTests.hs +@@ -21,45 +21,42 @@ import Test.Chell + import Data.Knob + + main :: IO () +-main = Test.Chell.defaultMain tests ++main = Test.Chell.defaultMain [tests] + +-tests :: [Suite] +-tests = [test_File, test_Duplex] +- +-test_File :: Suite +-test_File = suite "file" +- [ suite "read" ++tests :: Suite ++tests = suite "tests" $ ++ suiteTests (suite "read" + [ test_ReadFromStart + , test_ReadFromOffset + , test_ReadToEOF + , test_ReadPastEOF +- ] +- , suite "write" ++ ]) ++ ++ suiteTests (suite "write" + [ test_WriteFromStart + , test_WriteFromOffset + , test_WritePastEOF + , test_WriteAppended +- ] +- , suite "seek" ++ ]) ++ ++ suiteTests (suite "seek" + [ test_SeekAbsolute + , test_SeekRelative + , test_SeekFromEnd + , test_SeekBeyondMaxInt +- ] +- , suite "setSize" ++ ]) ++ ++ suiteTests (suite "setSize" + [ test_SetSize_Read + , test_SetSize_Write + , test_SetSize_ReadWrite + , test_SetSize_Append +- ] ++ ]) ++ + +- , test_Ready ++ [ test_Ready + , test_Close + , test_SetContents + , test_WithFileHandle + ] + +-test_ReadFromStart :: Suite ++test_ReadFromStart :: Test + test_ReadFromStart = assertions "from-start" $ do + k <- newKnob "abcde" + h <- newFileHandle k "foo.txt" ReadMode +@@ -70,7 +67,7 @@ test_ReadFromStart = assertions "from-start" $ do + off <- liftIO $ hTell h + $expect (equal off 3) + +-test_ReadFromOffset :: Suite ++test_ReadFromOffset :: Test + test_ReadFromOffset = assertions "from-offset" $ do + k <- newKnob "abcde" + h <- newFileHandle k "foo.txt" ReadMode +@@ -82,7 +79,7 @@ test_ReadFromOffset = assertions "from-offset" $ do + off <- liftIO $ hTell h + $expect (equal off 4) + +-test_ReadToEOF :: Suite ++test_ReadToEOF :: Test + test_ReadToEOF = assertions "to-eof" $ do + k <- newKnob "abcde" + h <- newFileHandle k "foo.txt" ReadMode +@@ -93,7 +90,7 @@ test_ReadToEOF = assertions "to-eof" $ do + off <- liftIO $ hTell h + $expect (equal off 5) + +-test_ReadPastEOF :: Suite ++test_ReadPastEOF :: Test + test_ReadPastEOF = assertions "past-eof" $ do + k <- newKnob "abcde" + h <- newFileHandle k "foo.txt" ReadMode +@@ -105,7 +102,7 @@ test_ReadPastEOF = assertions "past-eof" $ do + off <- liftIO $ hTell h + $expect (equal off 10) + +-test_WriteFromStart :: Suite ++test_WriteFromStart :: Test + test_WriteFromStart = assertions "from-start" $ do + k <- newKnob "" + h <- newFileHandle k "foo.txt" WriteMode +@@ -115,7 +112,7 @@ test_WriteFromStart = assertions "from-start" $ do + bytes <- Data.Knob.getContents k + $expect (equal bytes "abcde") + +-test_WriteFromOffset :: Suite ++test_WriteFromOffset :: Test + test_WriteFromOffset = assertions "from-offset" $ do + k <- newKnob "" + h <- newFileHandle k "foo.txt" WriteMode +@@ -128,7 +125,7 @@ test_WriteFromOffset = assertions "from-offset" $ do + bytes <- Data.Knob.getContents k + $expect (equal bytes "ababcde") + +-test_WritePastEOF :: Suite ++test_WritePastEOF :: Test + test_WritePastEOF = assertions "past-eof" $ do + k <- newKnob "" + h <- newFileHandle k "foo.txt" WriteMode +@@ -139,7 +136,7 @@ test_WritePastEOF = assertions "past-eof" $ do + bytes <- Data.Knob.getContents k + $expect (equal bytes "\0\0abcde") + +-test_WriteAppended :: Suite ++test_WriteAppended :: Test + test_WriteAppended = assertions "appended" $ do + k <- newKnob "foo" + h <- newFileHandle k "foo.txt" AppendMode +@@ -149,7 +146,7 @@ test_WriteAppended = assertions "appended" $ do + bytes <- Data.Knob.getContents k + $expect (equal bytes "foobar") + +-test_SeekAbsolute :: Suite ++test_SeekAbsolute :: Test + test_SeekAbsolute = assertions "absolute" $ do + k <- newKnob "" + h <- newFileHandle k "foo.txt" ReadMode +@@ -161,7 +158,7 @@ test_SeekAbsolute = assertions "absolute" $ do + $expect (equal before 0) + $expect (equal after 2) + +-test_SeekRelative :: Suite ++test_SeekRelative :: Test + test_SeekRelative = assertions "relative" $ do + k <- newKnob "" + h <- newFileHandle k "foo.txt" ReadMode +@@ -176,7 +173,7 @@ test_SeekRelative = assertions "relative" $ do + $expect (equal after1 2) + $expect (equal after2 4) + +-test_SeekFromEnd :: Suite ++test_SeekFromEnd :: Test + test_SeekFromEnd = assertions "from-end" $ do + k <- newKnob "abcde" + h <- newFileHandle k "foo.txt" ReadMode +@@ -188,7 +185,7 @@ test_SeekFromEnd = assertions "from-end" $ do + $expect (equal before 0) + $expect (equal after 3) + +-test_SeekBeyondMaxInt :: Suite ++test_SeekBeyondMaxInt :: Test + test_SeekBeyondMaxInt = assertions "beyond-max-int" $ do + k <- newKnob "abcde" + h <- newFileHandle k "foo.txt" ReadMode +@@ -212,7 +209,7 @@ test_SeekBeyondMaxInt = assertions "beyond-max-int" $ do + (GHC.IOError (Just h) GHC.InvalidArgument "hSeek" "offset > (maxBound :: Int)" Nothing (Just "foo.txt")) + (hSeek h SeekFromEnd 2) + +-test_Ready :: Suite ++test_Ready :: Test + test_Ready = assertions "ready" $ do + k <- newKnob "abcde" + h <- newFileHandle k "foo.txt" ReadMode +@@ -225,7 +222,7 @@ test_Ready = assertions "ready" $ do + (GHC.IOError (Just h) GHC.EOF "hWaitForInput" "" Nothing (Just "foo.txt")) + (hReady h) + +-test_Close :: Suite ++test_Close :: Test + test_Close = assertions "close" $ do + k <- newKnob "abcde" + h <- newFileHandle k "foo.txt" ReadMode +@@ -238,7 +235,7 @@ test_Close = assertions "close" $ do + (GHC.IOError (Just h) GHC.IllegalOperation "hWaitForInput" "handle is closed" Nothing (Just "foo.txt")) + (hReady h) + +-test_SetSize_Read :: Suite ++test_SetSize_Read :: Test + test_SetSize_Read = assertions "ReadMode" $ do + k <- newKnob "abcde" + h <- newFileHandle k "foo.txt" ReadMode +@@ -252,7 +249,7 @@ test_SetSize_Read = assertions "ReadMode" $ do + (GHC.IOError (Just h) GHC.IllegalOperation "hSetFileSize" "handle in ReadMode" Nothing (Just "foo.txt")) + (hSetFileSize h 2) + +-test_SetSize_Write :: Suite ++test_SetSize_Write :: Test + test_SetSize_Write = assertions "WriteMode" $ do + k <- newKnob "abcde" + h <- newFileHandle k "foo.txt" WriteMode +@@ -269,7 +266,7 @@ test_SetSize_Write = assertions "WriteMode" $ do + bytes <- Data.Knob.getContents k + $expect (equal bytes "\0\0\0\0") + +-test_SetSize_ReadWrite :: Suite ++test_SetSize_ReadWrite :: Test + test_SetSize_ReadWrite = assertions "ReadWriteMode" $ do + k <- newKnob "abcde" + h <- newFileHandle k "foo.txt" ReadWriteMode +@@ -291,7 +288,7 @@ test_SetSize_ReadWrite = assertions "ReadWriteMode" $ do + bytes <- Data.Knob.getContents k + $expect (equal bytes "abcd\0\0") + +-test_SetSize_Append :: Suite ++test_SetSize_Append :: Test + test_SetSize_Append = assertions "AppendMode" $ do + k <- newKnob "abcde" + h <- newFileHandle k "foo.txt" AppendMode +@@ -311,7 +308,7 @@ test_SetSize_Append = assertions "AppendMode" $ do + bytes <- Data.Knob.getContents k + $expect (equal bytes "abcd\0\0") + +-test_SetContents :: Suite ++test_SetContents :: Test + test_SetContents = assertions "setContents" $ do + k <- newKnob "abcde" + before <- Data.Knob.getContents k +@@ -321,7 +318,7 @@ test_SetContents = assertions "setContents" $ do + $expect (equal before "abcde") + $expect (equal after "foo") + +-test_WithFileHandle :: Suite ++test_WithFileHandle :: Test + test_WithFileHandle = assertions "withFileHandle" $ do + k <- newKnob "" + h <- withFileHandle k "test.txt" WriteMode $ \h -> do +@@ -333,6 +330,3 @@ test_WithFileHandle = assertions "withFileHandle" $ do + + closed <- liftIO $ hIsClosed h + $expect closed +- +-test_Duplex :: Suite +-test_Duplex = suite "duplex" [] +diff --git a/tests/knob-tests.cabal b/tests/knob-tests.cabal +deleted file mode 100644 +index 6530abe..0000000 +--- a/tests/knob-tests.cabal ++++ /dev/null +@@ -1,22 +0,0 @@ +-name: knob-tests +-version: 0 +-build-type: Simple +-cabal-version: >= 1.6 +- +-flag coverage +- default: False +- manual: True +- +-executable knob_tests +- main-is: KnobTests.hs +- ghc-options: -Wall +- hs-source-dirs: ../lib,. +- +- if flag(coverage) +- ghc-options: -fhpc +- +- build-depends: +- base >= 4.2 && < 5.0 +- , bytestring >= 0.9 && < 0.10 +- , chell >= 0.2 && < 0.3 +- , transformers >= 0.2 && < 0.3 +-- +2.32.0 + + +From 70143ee43cc3654d28774a40aed6e5a9b72a2eff Mon Sep 17 00:00:00 2001 +From: Felix Yan <felixonm...@archlinux.org> +Date: Fri, 18 Jun 2021 05:54:26 +0800 +Subject: [PATCH] Very basic attempt to fix build with base-4.15 + +--- + knob.cabal | 4 ++-- + lib/Data/Knob.hs | 16 +++++++++++----- + 2 files changed, 13 insertions(+), 7 deletions(-) + +diff --git a/knob.cabal b/knob.cabal +index 246b185..c76cf07 100644 +--- a/knob.cabal ++++ b/knob.cabal +@@ -55,7 +55,7 @@ library + ghc-options: -Wall -O2 + + build-depends: +- base >= 4.2 && < 5.0 ++ base >= 4.15 && < 5.0 + , bytestring >= 0.9 + , transformers >= 0.2 + +@@ -71,7 +71,7 @@ test-suite knob_tests + ghc-options: -fhpc + + build-depends: +- base >= 4.2 && < 5.0 ++ base >= 4.15 && < 5.0 + , bytestring >= 0.9 && < 0.11 + , chell >= 0.2 && < 0.6 + , transformers >= 0.2 && < 0.6 +diff --git a/lib/Data/Knob.hs b/lib/Data/Knob.hs +index fa87ad2..a699c5e 100644 +--- a/lib/Data/Knob.hs ++++ b/lib/Data/Knob.hs +@@ -60,6 +60,12 @@ newtype Knob = Knob (MVar.MVar ByteString) + data Device = Device IO.IOMode (MVar.MVar ByteString) (MVar.MVar Int) + deriving (Typeable) + ++instance IO.RawIO Device where ++ read _ _ _ _ = return 0 ++ readNonBlocking _ _ _ _ = return Nothing ++ write _ _ _ _ = return () ++ writeNonBlocking _ _ _ _ = return 0 ++ + instance IO.IODevice Device where + ready _ _ _ = return True + close _ = return () +@@ -68,20 +74,20 @@ instance IO.IODevice Device where + + seek (Device _ _ var) IO.AbsoluteSeek off = do + checkOffset off +- MVar.modifyMVar_ var (\_ -> return (fromInteger off)) ++ MVar.modifyMVar var (\_ -> return ((fromInteger off), off)) + + seek (Device _ _ var) IO.RelativeSeek off = do +- MVar.modifyMVar_ var (\old_off -> do ++ MVar.modifyMVar var (\old_off -> do + let new_off = toInteger old_off + off + checkOffset new_off +- return (fromInteger new_off)) ++ return ((fromInteger new_off), new_off)) + + seek dev@(Device _ _ off_var) IO.SeekFromEnd off = do +- MVar.modifyMVar_ off_var (\_ -> do ++ MVar.modifyMVar off_var (\_ -> do + size <- IO.getSize dev + let new_off = size + off + checkOffset new_off +- return (fromInteger new_off)) ++ return ((fromInteger new_off), new_off)) + + tell (Device _ _ var) = fmap toInteger (MVar.readMVar var) + getSize (Device _ var _) = do +-- +2.32.0 + + +From e2ecfb3fc99abec39eff98f6dfe152a18a4bc35f Mon Sep 17 00:00:00 2001 +From: Liu Xiaoyi <circuitcod...@gmail.com> +Date: Fri, 18 Jun 2021 06:22:09 +0800 +Subject: [PATCH] RawIO implmentation for the base-4.15 update + +--- + lib/Data/Knob.hs | 41 ++++++++++++++++++++++++++++++++--------- + 1 file changed, 32 insertions(+), 9 deletions(-) + +diff --git a/lib/Data/Knob.hs b/lib/Data/Knob.hs +index a699c5e..77009b2 100644 +--- a/lib/Data/Knob.hs ++++ b/lib/Data/Knob.hs +@@ -60,12 +60,6 @@ newtype Knob = Knob (MVar.MVar ByteString) + data Device = Device IO.IOMode (MVar.MVar ByteString) (MVar.MVar Int) + deriving (Typeable) + +-instance IO.RawIO Device where +- read _ _ _ _ = return 0 +- readNonBlocking _ _ _ _ = return Nothing +- write _ _ _ _ = return () +- writeNonBlocking _ _ _ _ = return 0 +- + instance IO.IODevice Device where + ready _ _ _ = return True + close _ = return () +@@ -74,20 +68,20 @@ instance IO.IODevice Device where + + seek (Device _ _ var) IO.AbsoluteSeek off = do + checkOffset off +- MVar.modifyMVar var (\_ -> return ((fromInteger off), off)) ++ MVar.modifyMVar var (\_ -> return (fromInteger off, off)) + + seek (Device _ _ var) IO.RelativeSeek off = do + MVar.modifyMVar var (\old_off -> do + let new_off = toInteger old_off + off + checkOffset new_off +- return ((fromInteger new_off), new_off)) ++ return (fromInteger new_off, new_off)) + + seek dev@(Device _ _ off_var) IO.SeekFromEnd off = do + MVar.modifyMVar off_var (\_ -> do + size <- IO.getSize dev + let new_off = size + off + checkOffset new_off +- return ((fromInteger new_off), new_off)) ++ return (fromInteger new_off, new_off)) + + tell (Device _ _ var) = fmap toInteger (MVar.readMVar var) + getSize (Device _ var _) = do +@@ -118,6 +112,35 @@ setDeviceSize (Device mode bytes_var _) size = checkSize >> setBytes where + padLen | padLen > 0 -> Data.ByteString.append bytes (Data.ByteString.replicate padLen 0) + _ -> Data.ByteString.take intSize bytes + ++{- What about non-POSIX environment? -} ++instance IO.RawIO Device where ++ read (Device _ bytes_var pos_var) ptr _ bufSize = do ++ MVar.withMVar bytes_var $ \bytes -> do ++ MVar.modifyMVar pos_var $ \pos -> do ++ if pos >= Data.ByteString.length bytes ++ then return (pos, 0) ++ else do ++ let chunk = Data.ByteString.take bufSize (Data.ByteString.drop pos bytes) ++ unsafeUseAsCStringLen chunk $ \(chunkPtr, chunkLen) -> do ++ Foreign.copyArray ptr (Foreign.castPtr chunkPtr) chunkLen ++ return (pos + chunkLen, chunkLen) ++ ++ write (Device _ bytes_var pos_var) ptr _ bufSize = do ++ MVar.modifyMVar_ bytes_var $ \bytes -> do ++ MVar.modifyMVar pos_var $ \pos -> do ++ let (before, after) = Data.ByteString.splitAt pos bytes ++ let padding = Data.ByteString.replicate (pos - Data.ByteString.length before) 0 ++ ++ bufBytes <- Data.ByteString.packCStringLen (Foreign.castPtr ptr, bufSize) ++ let newBytes = Data.ByteString.concat [before, padding, bufBytes, Data.ByteString.drop bufSize after] ++ return (pos + bufSize, newBytes) ++ return () ++ ++ readNonBlocking dev buf off size = IO.read dev buf off size >>= \cnt -> if cnt == 0 ++ then return Nothing ++ else return $ Just cnt ++ writeNonBlocking dev buf off cnt = IO.write dev buf off cnt >> return cnt ++ + instance IO.BufferedIO Device where + newBuffer _ = IO.newByteBuffer 4096 + +-- +2.32.0 +