Skip to content

Commit

Permalink
Merge pull request #2 from jchia/master
Browse files Browse the repository at this point in the history
Cleanup; switched from ConfigFile to ini
  • Loading branch information
colonelpanic8 authored Jan 30, 2024
2 parents 8f4ab2a + 0eb0160 commit 5a73613
Show file tree
Hide file tree
Showing 6 changed files with 315 additions and 26 deletions.
222 changes: 222 additions & 0 deletions .github/workflows/haskell-ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,222 @@
# This GitHub workflow config has been generated by a script via
#
# haskell-ci 'github' 'xdg-desktop-entry.cabal'
#
# To regenerate the script (for example after adjusting tested-with) run
#
# haskell-ci regenerate
#
# For more information, see https://github.com/haskell-CI/haskell-ci
#
# version: 0.17.20240109
#
# REGENDATA ("0.17.20240109",["github","xdg-desktop-entry.cabal"])
#
name: Haskell-CI
on:
- push
- pull_request
jobs:
linux:
name: Haskell-CI - Linux - ${{ matrix.compiler }}
runs-on: ubuntu-20.04
timeout-minutes:
60
container:
image: buildpack-deps:jammy
continue-on-error: ${{ matrix.allow-failure }}
strategy:
matrix:
include:
- compiler: ghc-9.8.1
compilerKind: ghc
compilerVersion: 9.8.1
setup-method: ghcup
allow-failure: false
- compiler: ghc-9.6.4
compilerKind: ghc
compilerVersion: 9.6.4
setup-method: ghcup
allow-failure: false
- compiler: ghc-9.4.8
compilerKind: ghc
compilerVersion: 9.4.8
setup-method: ghcup
allow-failure: false
- compiler: ghc-9.2.8
compilerKind: ghc
compilerVersion: 9.2.8
setup-method: ghcup
allow-failure: false
- compiler: ghc-9.0.2
compilerKind: ghc
compilerVersion: 9.0.2
setup-method: ghcup
allow-failure: false
- compiler: ghc-8.10.7
compilerKind: ghc
compilerVersion: 8.10.7
setup-method: ghcup
allow-failure: false
- compiler: ghc-8.8.4
compilerKind: ghc
compilerVersion: 8.8.4
setup-method: ghcup
allow-failure: false
fail-fast: false
steps:
- name: apt
run: |
apt-get update
apt-get install -y --no-install-recommends gnupg ca-certificates dirmngr curl git software-properties-common libtinfo5
mkdir -p "$HOME/.ghcup/bin"
curl -sL https://downloads.haskell.org/ghcup/0.1.20.0/x86_64-linux-ghcup-0.1.20.0 > "$HOME/.ghcup/bin/ghcup"
chmod a+x "$HOME/.ghcup/bin/ghcup"
"$HOME/.ghcup/bin/ghcup" install ghc "$HCVER" || (cat "$HOME"/.ghcup/logs/*.* && false)
"$HOME/.ghcup/bin/ghcup" install cabal 3.10.2.0 || (cat "$HOME"/.ghcup/logs/*.* && false)
env:
HCKIND: ${{ matrix.compilerKind }}
HCNAME: ${{ matrix.compiler }}
HCVER: ${{ matrix.compilerVersion }}
- name: Set PATH and environment variables
run: |
echo "$HOME/.cabal/bin" >> $GITHUB_PATH
echo "LANG=C.UTF-8" >> "$GITHUB_ENV"
echo "CABAL_DIR=$HOME/.cabal" >> "$GITHUB_ENV"
echo "CABAL_CONFIG=$HOME/.cabal/config" >> "$GITHUB_ENV"
HCDIR=/opt/$HCKIND/$HCVER
HC=$("$HOME/.ghcup/bin/ghcup" whereis ghc "$HCVER")
HCPKG=$(echo "$HC" | sed 's#ghc$#ghc-pkg#')
HADDOCK=$(echo "$HC" | sed 's#ghc$#haddock#')
echo "HC=$HC" >> "$GITHUB_ENV"
echo "HCPKG=$HCPKG" >> "$GITHUB_ENV"
echo "HADDOCK=$HADDOCK" >> "$GITHUB_ENV"
echo "CABAL=$HOME/.ghcup/bin/cabal-3.10.2.0 -vnormal+nowrap" >> "$GITHUB_ENV"
HCNUMVER=$(${HC} --numeric-version|perl -ne '/^(\d+)\.(\d+)\.(\d+)(\.(\d+))?$/; print(10000 * $1 + 100 * $2 + ($3 == 0 ? $5 != 1 : $3))')
echo "HCNUMVER=$HCNUMVER" >> "$GITHUB_ENV"
echo "ARG_TESTS=--enable-tests" >> "$GITHUB_ENV"
echo "ARG_BENCH=--enable-benchmarks" >> "$GITHUB_ENV"
echo "HEADHACKAGE=false" >> "$GITHUB_ENV"
echo "ARG_COMPILER=--$HCKIND --with-compiler=$HC" >> "$GITHUB_ENV"
echo "GHCJSARITH=0" >> "$GITHUB_ENV"
env:
HCKIND: ${{ matrix.compilerKind }}
HCNAME: ${{ matrix.compiler }}
HCVER: ${{ matrix.compilerVersion }}
- name: env
run: |
env
- name: write cabal config
run: |
mkdir -p $CABAL_DIR
cat >> $CABAL_CONFIG <<EOF
remote-build-reporting: anonymous
write-ghc-environment-files: never
remote-repo-cache: $CABAL_DIR/packages
logs-dir: $CABAL_DIR/logs
world-file: $CABAL_DIR/world
extra-prog-path: $CABAL_DIR/bin
symlink-bindir: $CABAL_DIR/bin
installdir: $CABAL_DIR/bin
build-summary: $CABAL_DIR/logs/build.log
store-dir: $CABAL_DIR/store
install-dirs user
prefix: $CABAL_DIR
repository hackage.haskell.org
url: http://hackage.haskell.org/
EOF
cat >> $CABAL_CONFIG <<EOF
program-default-options
ghc-options: $GHCJOBS +RTS -M3G -RTS
EOF
cat $CABAL_CONFIG
- name: versions
run: |
$HC --version || true
$HC --print-project-git-commit-id || true
$CABAL --version || true
- name: update cabal index
run: |
$CABAL v2-update -v
- name: install cabal-plan
run: |
mkdir -p $HOME/.cabal/bin
curl -sL https://github.com/haskell-hvr/cabal-plan/releases/download/v0.7.3.0/cabal-plan-0.7.3.0-x86_64-linux.xz > cabal-plan.xz
echo 'f62ccb2971567a5f638f2005ad3173dba14693a45154c1508645c52289714cb2 cabal-plan.xz' | sha256sum -c -
xz -d < cabal-plan.xz > $HOME/.cabal/bin/cabal-plan
rm -f cabal-plan.xz
chmod a+x $HOME/.cabal/bin/cabal-plan
cabal-plan --version
- name: checkout
uses: actions/checkout@v3
with:
path: source
- name: initial cabal.project for sdist
run: |
touch cabal.project
echo "packages: $GITHUB_WORKSPACE/source/." >> cabal.project
cat cabal.project
- name: sdist
run: |
mkdir -p sdist
$CABAL sdist all --output-dir $GITHUB_WORKSPACE/sdist
- name: unpack
run: |
mkdir -p unpacked
find sdist -maxdepth 1 -type f -name '*.tar.gz' -exec tar -C $GITHUB_WORKSPACE/unpacked -xzvf {} \;
- name: generate cabal.project
run: |
PKGDIR_xdg_desktop_entry="$(find "$GITHUB_WORKSPACE/unpacked" -maxdepth 1 -type d -regex '.*/xdg-desktop-entry-[0-9.]*')"
echo "PKGDIR_xdg_desktop_entry=${PKGDIR_xdg_desktop_entry}" >> "$GITHUB_ENV"
rm -f cabal.project cabal.project.local
touch cabal.project
touch cabal.project.local
echo "packages: ${PKGDIR_xdg_desktop_entry}" >> cabal.project
echo "package xdg-desktop-entry" >> cabal.project
echo " ghc-options: -Werror=missing-methods" >> cabal.project
cat >> cabal.project <<EOF
EOF
$HCPKG list --simple-output --names-only | perl -ne 'for (split /\s+/) { print "constraints: $_ installed\n" unless /^(xdg-desktop-entry)$/; }' >> cabal.project.local
cat cabal.project
cat cabal.project.local
- name: dump install plan
run: |
$CABAL v2-build $ARG_COMPILER $ARG_TESTS $ARG_BENCH --dry-run all
cabal-plan
- name: restore cache
uses: actions/cache/restore@v3
with:
key: ${{ runner.os }}-${{ matrix.compiler }}-${{ github.sha }}
path: ~/.cabal/store
restore-keys: ${{ runner.os }}-${{ matrix.compiler }}-
- name: install dependencies
run: |
$CABAL v2-build $ARG_COMPILER --disable-tests --disable-benchmarks --dependencies-only -j2 all
$CABAL v2-build $ARG_COMPILER $ARG_TESTS $ARG_BENCH --dependencies-only -j2 all
- name: build w/o tests
run: |
$CABAL v2-build $ARG_COMPILER --disable-tests --disable-benchmarks all
- name: build
run: |
$CABAL v2-build $ARG_COMPILER $ARG_TESTS $ARG_BENCH all --write-ghc-environment-files=always
- name: tests
run: |
$CABAL v2-test $ARG_COMPILER $ARG_TESTS $ARG_BENCH all --test-show-details=direct
- name: cabal check
run: |
cd ${PKGDIR_xdg_desktop_entry} || false
${CABAL} -vnormal check
- name: haddock
run: |
$CABAL v2-haddock --disable-documentation --haddock-all $ARG_COMPILER --with-haddock $HADDOCK $ARG_TESTS $ARG_BENCH all
- name: unconstrained build
run: |
rm -f cabal.project.local
$CABAL v2-build $ARG_COMPILER --disable-tests --disable-benchmarks all
- name: save cache
uses: actions/cache/save@v3
if: always()
with:
key: ${{ runner.os }}-${{ matrix.compiler }}-${{ github.sha }}
path: ~/.cabal/store
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
/dist-newstyle/
/.stack-work/
16 changes: 11 additions & 5 deletions src/System/Environment/XDG/DesktopEntry.hs
Original file line number Diff line number Diff line change
Expand Up @@ -37,17 +37,19 @@ module System.Environment.XDG.DesktopEntry
import Control.Monad
import Control.Monad.IO.Class
import Control.Monad.Trans.Except
import Data.Bifunctor (bimap)
import Data.Char
import qualified Data.ConfigFile as CF
import qualified Data.Ini as Ini
import Data.Either
import Data.Either.Combinators
import qualified Data.HashMap.Strict as HM
import qualified Data.MultiMap as MM
import Data.List
import Data.Maybe
import Data.Text (pack, unpack)
import Safe
import System.Directory
import System.FilePath.Posix
import System.Posix.Files
import Text.Printf
import Text.Read (readMaybe)

Expand Down Expand Up @@ -176,10 +178,14 @@ getDirectoryEntriesDefault =
(soFar ++) <$> listDesktopEntries "desktop" directory

-- | Read a desktop entry from a file.
readDesktopEntry :: FilePath -> IO (Either (CF.CPErrorData, String) DesktopEntry)
readDesktopEntry :: FilePath -> IO (Either String DesktopEntry)
readDesktopEntry filePath = runExceptT $ do
result <- (join $ liftIO $ CF.readfile CF.emptyCP filePath) >>=
flip CF.items "Desktop Entry"
-- let foo1 = join . fmap except . liftIO $ Ini.readIniFile filePath
-- let bar :: ExceptT String IO (HM.HashMap Text [(Text, Text)]) = map Ini.iniSections . liftIO $ Ini.readIniFile filePath
-- sections <- fmap Ini.iniSections . join . fmap except . liftIO $ Ini.readIniFile filePath
sections <- liftIO (Ini.readIniFile filePath) >>= fmap Ini.iniSections . except
result <- maybe (throwE "Section [Desktop Entry] not found") (pure . fmap (bimap unpack unpack)) $
HM.lookup (pack "Desktop Entry") sections
return DesktopEntry
{ deType = fromMaybe Application $ lookup "Type" result >>= readMaybe
, deFilename = filePath
Expand Down
4 changes: 0 additions & 4 deletions test

This file was deleted.

44 changes: 44 additions & 0 deletions test/Main.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
import Data.Either (isLeft)
import Data.Foldable (for_)
import System.Environment.XDG.DesktopEntry
import System.FilePath ((</>))
import System.IO.Temp (withSystemTempDirectory)
import Test.Hspec

fileContent :: [String]
fileContent = [
"[Desktop Entry]\n\
\Icon=1",

"[Desktop Entry]\n\
\icon=2",

"[desktop entry]\n\
\Icon=3"
]

main :: IO ()
main = withSystemTempDirectory "xdg-desktop-entry" $ \dir -> do
let filepath :: Int -> String
filepath i = dir </> show i
for_ (zip [0::Int ..] fileContent) $ \(i, content) -> do
print i
writeFile (filepath i) content
hspec $ do
describe "deAtt" $ do
it "content0 should work" $ do
deResultE <- readDesktopEntry $ filepath 0
case deResultE of
Left e -> expectationFailure $ show e
Right deResult ->
deIcon deResult `shouldBe` Just "1"
it "content1 should not work" $ do
deResultE <- readDesktopEntry $ filepath 1
print deResultE
case deResultE of
Left e -> expectationFailure $ show e
Right deResult ->
deIcon deResult `shouldBe` Nothing
it "content2 should not work" $ do
deResultE <- readDesktopEntry $ filepath 2
isLeft deResultE `shouldBe` True
53 changes: 36 additions & 17 deletions xdg-desktop-entry.cabal
Original file line number Diff line number Diff line change
@@ -1,31 +1,50 @@
cabal-version: 2.4
-- Initial package description 'xdg-desktop-entry.cabal' generated by
-- 'cabal init'. For further documentation, see
-- http://haskell.org/cabal/users-guide/

name: xdg-desktop-entry
version: 0.1.1.0
version: 0.1.1.2
synopsis: Parse files conforming to the xdg desktop entry spec
-- description:
-- bug-reports:
description: Parse files conforming to the xdg desktop entry spec.
bug-reports: https://github.com/taffybar/xdg-desktop-entry/issues
homepage: https://github.com/taffybar/xdg-desktop-entry
license: BSD-3-Clause
license-file: LICENSE
author: Ivan Malison
maintainer: [email protected]
-- copyright:
category: System
extra-source-files: CHANGELOG.md
extra-doc-files: CHANGELOG.md
tested-with: GHC == 8.8.4 || == 8.10.7 || == 9.0.2 || == 9.2.8 || == 9.4.8 || == 9.6.4 || == 9.8.1

source-repository head
type: git
location: https://github.com/taffybar/xdg-desktop-entry.git

library
exposed-modules: System.Environment.XDG.DesktopEntry
build-depends: base ^>=4.12.0.0,
ConfigFile,
directory,
either,
filepath,
multimap,
transformers,
safe,
unix,
build-depends: base >=4.13 && < 5,
directory >= 1.3.6 && < 1.4,
either >= 5.0.1.1 && < 5.1,
filepath >= 1.4.2 && < 1.6,
ini >= 0.4.1 && < 0.4.3,
multimap >= 1.2.1 && < 1.3,
safe >= 0.3.19 && < 0.4,
text >= 1.2.4 && < 2.2,
transformers >= 0.5.6 && < 0.6.2,
unix >= 2.7.2 && < 2.9,
unordered-containers >= 0.2.10 && < 0.3
hs-source-dirs: src
default-language: Haskell2010
ghc-options: -Wall

test-suite test
type: exitcode-stdio-1.0
main-is: Main.hs
hs-source-dirs: test
build-depends:
base
, filepath
, hspec
, temporary
, unix
, xdg-desktop-entry
default-language: Haskell2010
ghc-options: -Wall

0 comments on commit 5a73613

Please sign in to comment.