mirror of
https://github.com/serokell/haskell-with-utf8.git
synced 2024-09-11 06:45:36 +03:00
Merge pull request #19 from serokell/Sereja313/update-nix
[Chore] Use new flake template
This commit is contained in:
commit
d1dc7d55b1
60
.github/workflows/check.yml
vendored
Normal file
60
.github/workflows/check.yml
vendored
Normal file
@ -0,0 +1,60 @@
|
||||
# SPDX-FileCopyrightText: 2023 Serokell <https://serokell.io/>
|
||||
#
|
||||
# SPDX-License-Identifier: MPL-2.0
|
||||
name: Nix flake check
|
||||
on: push
|
||||
|
||||
jobs:
|
||||
validate:
|
||||
runs-on: [self-hosted, nix]
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: xrefcheck
|
||||
run: nix run github:serokell/xrefcheck
|
||||
|
||||
- name: reuse
|
||||
run: nix build -L .#checks.x86_64-linux.reuse-lint
|
||||
# Run step even if the previous one has failed
|
||||
if: success() || failure()
|
||||
|
||||
- name: hlint
|
||||
run: nix build -L .#checks.x86_64-linux.hlint
|
||||
if: success() || failure()
|
||||
|
||||
- name: stylish-haskell
|
||||
run: nix build -L .#checks.x86_64-linux.stylish-haskell
|
||||
if: success() || failure()
|
||||
|
||||
- name: check-trailing-whitespace
|
||||
run: nix build -L .#checks.x86_64-linux.trailing-whitespace
|
||||
if: success() || failure()
|
||||
|
||||
# Export JSON serialized ghc-versions
|
||||
ghc-versions:
|
||||
runs-on: [self-hosted, nix]
|
||||
outputs:
|
||||
matrix: ${{ steps.set-matrix.outputs.matrix }}
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- id: set-matrix
|
||||
run: echo "matrix=$(nix eval --json .#ghc-matrix.x86_64-linux)" >> $GITHUB_OUTPUT
|
||||
|
||||
build-and-test:
|
||||
needs: ghc-versions
|
||||
name: ghc${{ matrix.ghc }}
|
||||
runs-on: [self-hosted, nix]
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix: ${{fromJson(needs.ghc-versions.outputs.matrix)}}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: build
|
||||
run: nix build -L .#checks.x86_64-linux.ghc${{ matrix.ghc }}:build-all --keep-going
|
||||
|
||||
- name: test
|
||||
run: nix build -L .#checks.x86_64-linux.ghc${{ matrix.ghc }}:test-all --keep-going
|
||||
if: success() || failure()
|
63
.stylish-haskell.yaml
Normal file
63
.stylish-haskell.yaml
Normal file
@ -0,0 +1,63 @@
|
||||
# SPDX-FileCopyrightText: 2023 Serokell <https://serokell.io>
|
||||
#
|
||||
# SPDX-License-Identifier: Unlicense
|
||||
|
||||
steps:
|
||||
- simple_align:
|
||||
cases: false
|
||||
top_level_patterns: false
|
||||
records: false
|
||||
- imports:
|
||||
align: none
|
||||
list_align: after_alias
|
||||
pad_module_names: false
|
||||
long_list_align: new_line
|
||||
empty_list_align: inherit
|
||||
list_padding: 2
|
||||
separate_lists: true
|
||||
space_surround: false
|
||||
post_qualify: false
|
||||
- trailing_whitespace: {}
|
||||
columns: 100
|
||||
newline: native
|
||||
language_extensions:
|
||||
- BangPatterns
|
||||
- BlockArguments
|
||||
- ConstraintKinds
|
||||
- DataKinds
|
||||
- DefaultSignatures
|
||||
- DeriveAnyClass
|
||||
- DeriveDataTypeable
|
||||
- DeriveGeneric
|
||||
- DerivingStrategies
|
||||
- DerivingVia
|
||||
- EmptyCase
|
||||
- ExistentialQuantification
|
||||
- ExplicitNamespaces
|
||||
- FlexibleContexts
|
||||
- FlexibleInstances
|
||||
- FunctionalDependencies
|
||||
- GADTs
|
||||
- GeneralizedNewtypeDeriving
|
||||
- ImportQualifiedPost
|
||||
- LambdaCase
|
||||
- MultiParamTypeClasses
|
||||
- MultiWayIf
|
||||
- NamedFieldPuns
|
||||
- NumericUnderscores
|
||||
- OverloadedLabels
|
||||
- OverloadedStrings
|
||||
- PatternSynonyms
|
||||
- QuantifiedConstraints
|
||||
- RebindableSyntax
|
||||
- RecordWildCards
|
||||
- RecursiveDo
|
||||
- ScopedTypeVariables
|
||||
- StandaloneDeriving
|
||||
- TemplateHaskell
|
||||
- TemplateHaskellQuotes
|
||||
- TupleSections
|
||||
- TypeApplications
|
||||
- TypeFamilies
|
||||
- TypeOperators
|
||||
- ViewPatterns
|
@ -1,7 +0,0 @@
|
||||
Copyright 2019 Nicolas Mattia
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
24
LICENSES/Unlicense.txt
Normal file
24
LICENSES/Unlicense.txt
Normal file
@ -0,0 +1,24 @@
|
||||
This is free and unencumbered software released into the public domain.
|
||||
|
||||
Anyone is free to copy, modify, publish, use, compile, sell, or
|
||||
distribute this software, either in source code form or as a compiled
|
||||
binary, for any purpose, commercial or non-commercial, and by any
|
||||
means.
|
||||
|
||||
In jurisdictions that recognize copyright laws, the author or authors
|
||||
of this software dedicate any and all copyright interest in the
|
||||
software to the public domain. We make this dedication for the benefit
|
||||
of the public at large and to the detriment of our heirs and
|
||||
successors. We intend this dedication to be an overt act of
|
||||
relinquishment in perpetuity of all present and future rights to this
|
||||
software under copyright law.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
For more information, please refer to <http://unlicense.org/>
|
@ -2,9 +2,9 @@
|
||||
--
|
||||
-- SPDX-License-Identifier: MPL-2.0
|
||||
|
||||
{-# LANGUAGE CPP #-}
|
||||
{-# LANGUAGE LambdaCase #-}
|
||||
{-# LANGUAGE TemplateHaskell #-}
|
||||
{-# LANGUAGE CPP #-}
|
||||
{-# LANGUAGE LambdaCase #-}
|
||||
{-# LANGUAGE TemplateHaskell #-}
|
||||
{-# LANGUAGE TypeApplications #-}
|
||||
|
||||
#include <HsBaseConfig.h>
|
||||
@ -57,7 +57,7 @@ showEnvVar name = do
|
||||
putStr $ " * " <> name <> " "
|
||||
lookupEnv name >>= \case
|
||||
Nothing -> putStrLn "is not set"
|
||||
Just v -> putStrLn $ "= " <> v
|
||||
Just v -> putStrLn $ "= " <> v
|
||||
|
||||
|
||||
showSystem :: IO ()
|
||||
@ -107,7 +107,7 @@ showCbits = do
|
||||
enc <- c_libcharsetEncoding >>= peekCAString
|
||||
putStrLn $ " * libcharset:locale_charset = " <> enc
|
||||
#else
|
||||
putStrLn $ " * No libcharset."
|
||||
putStrLn " * No libcharset."
|
||||
#endif
|
||||
|
||||
showLanginfoh :: IO ()
|
||||
@ -116,7 +116,7 @@ showCbits = do
|
||||
enc <- c_langinfoEncoding >>= peekCAString
|
||||
putStrLn $ " * langinfo.h:nl_langinfo(CODESET) = " <> enc
|
||||
#else
|
||||
putStrLn $ " * No <langinfo.h>."
|
||||
putStrLn " * No <langinfo.h>."
|
||||
#endif
|
||||
|
||||
#if defined(HAVE_LIBCHARSET)
|
||||
@ -143,7 +143,7 @@ showLocales = do
|
||||
putStrLn "# Locales"
|
||||
tryIO callLocalectl >>= \case
|
||||
Right out -> do
|
||||
putStrLn $ " * localectl list-locales:"
|
||||
putStrLn " * localectl list-locales:"
|
||||
showLocaleList (lines out)
|
||||
Left _ -> do
|
||||
listDir "/usr/lib/locale"
|
||||
|
@ -1,3 +1,6 @@
|
||||
# SPDX-FileCopyrightText: 2023 Serokell <https://serokell.io/>
|
||||
#
|
||||
# SPDX-License-Identifier: MPL-2.0
|
||||
(import (
|
||||
fetchTarball {
|
||||
url = "https://github.com/edolstra/flake-compat/archive/99f1c2157fba4bfe6211a321fd0ee43199025dbf.tar.gz";
|
||||
|
847
flake.lock
847
flake.lock
File diff suppressed because it is too large
Load Diff
2
flake.lock.license
Normal file
2
flake.lock.license
Normal file
@ -0,0 +1,2 @@
|
||||
SPDX-FileCopyrightText: 2023 Serokell <https://serokell.io>
|
||||
SPDX-License-Identifier: MPL-2.0
|
114
flake.nix
114
flake.nix
@ -1,38 +1,110 @@
|
||||
# SPDX-FileCopyrightText: 2021 Serokell <https://serokell.io/>
|
||||
# SPDX-FileCopyrightText: 2023 Serokell <https://serokell.io/>
|
||||
#
|
||||
# SPDX-License-Identifier: MPL-2.0
|
||||
|
||||
{
|
||||
description = "Get your UTF-8 IO right on the first try";
|
||||
|
||||
nixConfig = {
|
||||
flake-registry = "https://github.com/serokell/flake-registry/raw/master/flake-registry.json";
|
||||
};
|
||||
|
||||
inputs = {
|
||||
nixpkgs.url = "github:serokell/nixpkgs";
|
||||
flake-utils.url = "github:numtide/flake-utils";
|
||||
flake-compat = {
|
||||
flake = false;
|
||||
};
|
||||
haskell-nix = {
|
||||
inputs.hackage.follows = "hackage";
|
||||
inputs.stackage.follows = "stackage";
|
||||
};
|
||||
hackage.flake = false;
|
||||
stackage.flake = false;
|
||||
hackage = {
|
||||
flake = false;
|
||||
};
|
||||
stackage = {
|
||||
flake = false;
|
||||
};
|
||||
};
|
||||
|
||||
outputs = { self, nixpkgs, flake-utils, serokell-nix, haskell-nix, hackage, stackage }:
|
||||
flake-utils.lib.eachSystem [ "x86_64-linux" ] (system:
|
||||
outputs = { self, nixpkgs, haskell-nix, hackage, stackage, serokell-nix, flake-compat, flake-utils, ... }:
|
||||
flake-utils.lib.eachDefaultSystem (system:
|
||||
let
|
||||
pkgs = nixpkgs.legacyPackages.${system}.extend haskell-nix.overlay;
|
||||
haskellPkgs = haskell-nix.legacyPackages."${system}";
|
||||
pkgs = import nixpkgs {
|
||||
inherit system;
|
||||
overlays = [
|
||||
serokell-nix.overlay
|
||||
];
|
||||
};
|
||||
|
||||
flake =
|
||||
serokell-nix.lib.haskell.makeFlake pkgs.haskell-nix pkgs.haskell-nix.stackProject {
|
||||
src = ./.;
|
||||
ghcVersions = [ "884" "8107" "901" "921" ];
|
||||
modules = [ serokell-nix.lib.haskell.ciBuildOptions ];
|
||||
};
|
||||
in flake // {
|
||||
defaultPackage = flake.packages."with-utf8:lib:with-utf8";
|
||||
defaultApp = flake.apps."with-utf8:exe:utf8-troubleshoot";
|
||||
}
|
||||
);
|
||||
lib = pkgs.lib;
|
||||
|
||||
hs-package-name = "with-utf8";
|
||||
|
||||
ghc-versions = [ "884" "8107" "902" "926" "944" ];
|
||||
|
||||
# invoke haskell.nix for each ghc version listed in ghc-versions
|
||||
pkgs-per-ghc = lib.genAttrs (map (v: "ghc${v}") ghc-versions)
|
||||
(ghc: haskellPkgs.haskell-nix.cabalProject {
|
||||
src = haskellPkgs.haskell-nix.haskellLib.cleanGit {
|
||||
name = hs-package-name;
|
||||
src = ./.;
|
||||
};
|
||||
compiler-nix-name = ghc;
|
||||
|
||||
# haskell.nix configuration
|
||||
modules = [{
|
||||
packages.${hs-package-name} = {
|
||||
ghcOptions = [
|
||||
# fail on warnings
|
||||
"-Werror"
|
||||
# disable optimisations, we don't need them if we don't package or deploy the executable
|
||||
"-O0"
|
||||
];
|
||||
};
|
||||
|
||||
}];
|
||||
});
|
||||
|
||||
# returns the list of all components for a package
|
||||
get-package-components = pkg:
|
||||
# library
|
||||
lib.optional (pkg ? library) pkg.library
|
||||
# haddock
|
||||
++ lib.optional (pkg ? library) pkg.library.haddock
|
||||
# exes, tests and benchmarks
|
||||
++ lib.attrValues pkg.exes
|
||||
++ lib.attrValues pkg.tests
|
||||
++ lib.attrValues pkg.benchmarks;
|
||||
|
||||
# all components for each specified ghc version
|
||||
build-all = lib.mapAttrs'
|
||||
(ghc: pkg:
|
||||
let components = get-package-components pkg.${hs-package-name}.components;
|
||||
in lib.nameValuePair "${ghc}:build-all"
|
||||
(pkgs.linkFarmFromDrvs "build-all" components)) pkgs-per-ghc;
|
||||
|
||||
# all tests for each specified ghc version
|
||||
test-all = lib.mapAttrs'
|
||||
(ghc: pkg:
|
||||
let tests = lib.filter lib.isDerivation
|
||||
(lib.attrValues pkg.${hs-package-name}.checks);
|
||||
in lib.nameValuePair "${ghc}:test-all"
|
||||
(pkgs.linkFarmFromDrvs "test-all" tests)) pkgs-per-ghc;
|
||||
in {
|
||||
# nixpkgs revision pinned by this flake
|
||||
legacyPackages = pkgs;
|
||||
|
||||
# used to dynamically build a matrix in the GitHub pipeline
|
||||
ghc-matrix = {
|
||||
include = map (ver: { ghc = ver; }) ghc-versions;
|
||||
};
|
||||
|
||||
# derivations that we can run from CI
|
||||
checks = build-all // test-all // {
|
||||
|
||||
trailing-whitespace = pkgs.build.checkTrailingWhitespace ./.;
|
||||
reuse-lint = pkgs.build.reuseLint ./.;
|
||||
|
||||
hlint = pkgs.build.haskell.hlint ./.;
|
||||
stylish-haskell = pkgs.build.haskell.stylish-haskell ./.;
|
||||
};
|
||||
});
|
||||
}
|
||||
|
@ -62,7 +62,7 @@ withUtf8 act = withStdTerminalHandles $
|
||||
bracket
|
||||
(liftIO $ getLocaleEncoding <* setLocaleEncoding utf8)
|
||||
(liftIO . setLocaleEncoding)
|
||||
(\_ -> act)
|
||||
(const act)
|
||||
|
||||
-- | Make standard handles safe to write anything to them.
|
||||
--
|
||||
|
@ -3,7 +3,7 @@
|
||||
- SPDX-License-Identifier: MPL-2.0
|
||||
-}
|
||||
|
||||
{-# LANGUAGE LambdaCase #-}
|
||||
{-# LANGUAGE LambdaCase #-}
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
-- |
|
||||
|
@ -3,8 +3,7 @@
|
||||
- SPDX-License-Identifier: MPL-2.0
|
||||
-}
|
||||
|
||||
{-# LANGUAGE LambdaCase #-}
|
||||
{-# LANGUAGE ViewPatterns #-}
|
||||
{-# LANGUAGE LambdaCase #-}
|
||||
|
||||
-- | Internal functions that implement encoding selection logic.
|
||||
module System.IO.Utf8.Internal
|
||||
@ -83,4 +82,4 @@ chooseBestEnc h hIsTerm (Just enc) = case textEncodingName enc of
|
||||
| "//TRANSLIT" `isSuffixOf` name -> pure Keep
|
||||
| otherwise -> hIsTerm h >>= \case
|
||||
False -> pure $ ChangeFromTo enc (textEncodingName utf8)
|
||||
True -> pure $ ChangeFromTo enc (name ++ "//TRANSLIT")
|
||||
True -> pure $ ChangeFromTo enc (name ++ "//TRANSLIT")
|
||||
|
@ -37,7 +37,7 @@ ghc-options:
|
||||
- -Wredundant-constraints
|
||||
|
||||
dependencies:
|
||||
- base >= 4.10 && < 4.17
|
||||
- base >= 4.10 && < 4.19
|
||||
- text >= 0.7 && < 2.1
|
||||
|
||||
library:
|
||||
|
@ -3,8 +3,8 @@
|
||||
- SPDX-License-Identifier: MPL-2.0
|
||||
-}
|
||||
|
||||
{-# LANGUAGE LambdaCase #-}
|
||||
{-# LANGUAGE OverloadedStrings #-}
|
||||
{-# LANGUAGE LambdaCase #-}
|
||||
{-# LANGUAGE OverloadedStrings #-}
|
||||
{-# LANGUAGE ScopedTypeVariables #-}
|
||||
|
||||
module Test.Utf8.ReadWrite where
|
||||
@ -18,7 +18,7 @@ import Data.Text (Text)
|
||||
import GHC.IO.Encoding (utf8)
|
||||
import System.IO.Temp (withSystemTempFile)
|
||||
|
||||
import Hedgehog (Property, (===), forAll, property)
|
||||
import Hedgehog (Property, forAll, property, (===))
|
||||
import Test.HUnit (Assertion, assertFailure)
|
||||
|
||||
import qualified Data.Text.IO as T
|
||||
@ -59,7 +59,7 @@ hprop_readFile = property $ do
|
||||
hprop_writeFile :: Property
|
||||
hprop_writeFile = property $ do
|
||||
str <- forAll $ G.text (R.linear 0 1000) G.unicode
|
||||
liftIO $ withTestFile str (flip Utf8.writeFile str)
|
||||
liftIO $ withTestFile str (`Utf8.writeFile` str)
|
||||
|
||||
hprop_openFile :: Property
|
||||
hprop_openFile = property $ do
|
||||
@ -78,6 +78,5 @@ hprop_withFile = property $ do
|
||||
str' <- liftIO $ withTestFile str $ \fp ->
|
||||
Utf8.withFile fp IO.ReadMode $ \h -> do
|
||||
res <- T.hGetContents h
|
||||
res' <- evaluate . force $ res
|
||||
pure res'
|
||||
evaluate . force $ res
|
||||
str === str'
|
||||
|
@ -1,10 +1,10 @@
|
||||
cabal-version: 1.18
|
||||
|
||||
-- This file has been generated from package.yaml by hpack version 0.34.5.
|
||||
-- This file has been generated from package.yaml by hpack version 0.35.2.
|
||||
--
|
||||
-- see: https://github.com/sol/hpack
|
||||
--
|
||||
-- hash: 930f59e2f7815f238524f9e35825dd18c98fe04cfb768e3922af929bd6cf8c63
|
||||
-- hash: 983535ba7f77c066ffa634f2a4f800eb8988a0e636f0f901fd187e177b64ca6f
|
||||
|
||||
name: with-utf8
|
||||
version: 1.0.2.3
|
||||
@ -50,7 +50,7 @@ library
|
||||
lib
|
||||
ghc-options: -Wall -Wcompat -Wincomplete-record-updates -Wincomplete-uni-patterns -Wredundant-constraints
|
||||
build-depends:
|
||||
base >=4.10 && <4.17
|
||||
base >=4.10 && <4.19
|
||||
, safe-exceptions ==0.1.*
|
||||
, text >=0.7 && <2.1
|
||||
default-language: Haskell2010
|
||||
@ -65,7 +65,7 @@ executable utf8-troubleshoot
|
||||
c-sources:
|
||||
app/utf8-troubleshoot/cbits/locale.c
|
||||
build-depends:
|
||||
base >=4.10 && <4.17
|
||||
base >=4.10 && <4.19
|
||||
, directory >=1.2.5.0 && <1.4
|
||||
, filepath >=1.0 && <1.5
|
||||
, process >=1.0.1.1 && <1.7
|
||||
@ -91,7 +91,7 @@ test-suite with-utf8-test
|
||||
tasty-discover:tasty-discover
|
||||
build-depends:
|
||||
HUnit
|
||||
, base >=4.10 && <4.17
|
||||
, base >=4.10 && <4.19
|
||||
, deepseq
|
||||
, hedgehog
|
||||
, safe-exceptions
|
||||
|
2
with-utf8.cabal.license
Normal file
2
with-utf8.cabal.license
Normal file
@ -0,0 +1,2 @@
|
||||
SPDX-FileCopyrightText: 2023 Serokell <https://serokell.io>
|
||||
SPDX-License-Identifier: MPL-2.0
|
Loading…
Reference in New Issue
Block a user