feat(personalised-sheet-files): collated ignore

This commit is contained in:
Gregor Kleen 2020-08-07 14:31:22 +02:00
parent ed5fb6e218
commit 1fe63a23a0
6 changed files with 68 additions and 33 deletions

View File

@ -0,0 +1,21 @@
$# Syntax:
$# - Leere zeilen werden ignoriert
$# - Zeilen, die mit '$#' beginnen, werden ignoriert
$# - Verbleibende Zeilen werden jeweils als `Glob`-Pattern kompiliert
$# Ignoriere rekursiv alle Ordner __MACOSX und ihren Inhalt
**/__MACOSX
**/__MACOSX/*
**/__MACOSX/**/*
$# Ignoriere rekursiv alle Dateien .DS_Store (Mac OS)
**/.DS_Store
$# Ignoriere VI-Style-Backup-Files
**/*~
$# Ignoriere Emacs-Style-Backup-Files
**/.#*#
$# Ignoriere exportierte meta-informationen.yaml
**/meta-informationen_*.yaml
**/meta-information_*.yaml

View File

@ -2668,6 +2668,8 @@ SubmissionDoneAlways: Always
CorrUploadSubmissionDoneMode: Rating finished
CorrUploadSubmissionDoneModeTip: Should uploaded corrections be marked as finished? The rating is only visible to the submittors and considered for any exam bonuses if it is finished.
PersonalisedSheetFilesMetaFilename uid: meta-information_#{toPathPiece uid}.yaml
AdminCrontabNotGenerated: Crontab not (yet) generated
CronMatchAsap: ASAP
CronMatchNone: Never

View File

@ -44,6 +44,7 @@ import Text.Unidecode (unidecode)
import Data.Char (isAlphaNum)
import qualified System.FilePath as FilePath (joinPath)
import System.FilePath.Glob
import Control.Monad.Trans.State.Strict (StateT, runStateT)
import qualified Control.Monad.State as State
@ -101,10 +102,14 @@ resolvePersonalisedSheetFiles fpL isDir cid sid = do
Just (uid, sfType, fPath) -> PersonalisedSheetFileResidual sid uid sfType <$ (fpL .= fPath)
Nothing -> do
isDirectory <- State.gets isDir
fPath <- use fpL
if | isDirectory
-> lift $ throwE PSFUnresolvedDirectory
| lstPtn : _ <- Map.keys $ Map.filter (`match'` fPath) personalisedSheetFilesCollatable
-> lift . throwE $ PSFUnresolvedCollatable lstPtn
| otherwise
-> lift $ throwE PSFUnresolved
where match' = matchWith $ matchDefault { matchDotsImplicitly = True }
sinkPersonalisedSheetFiles :: forall m.

View File

@ -1,31 +0,0 @@
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Handler.Utils.Submission.TH
( patternFile
) where
import ClassyPrelude.Yesod
import Language.Haskell.TH
import Language.Haskell.TH.Syntax (qAddDependentFile, Lift(..))
import System.FilePath.Glob
import qualified Data.Text as Text
import qualified Data.Text.IO as Text
deriving instance Lift CompOptions
-- $(patternFile compDefault file) :: [System.FilePath.Glob.Pattern]
patternFile :: CompOptions -> FilePath -> ExpQ
patternFile opts file = do
qAddDependentFile file
patternStrings <- runIO $ filter (not . isComment) . Text.lines <$> Text.readFile file
listE $ map (\(Text.unpack -> pat) -> [|compileWith opts pat|]) patternStrings
isComment :: Text -> Bool
isComment line = or
[ commentSymbol `Text.isPrefixOf` Text.stripStart line
, Text.null $ Text.strip line
]
where
commentSymbol = "$#"

View File

@ -61,7 +61,7 @@ import qualified System.FilePath as FilePath
import Jose.Jwt (JwtEncoding(..))
import System.FilePath.Glob
import Handler.Utils.Submission.TH
import System.FilePath.Glob.TH
import qualified Web.ServerSession.Core as ServerSession
@ -543,7 +543,10 @@ widgetFileSettings = def
submissionBlacklist :: [Pattern]
submissionBlacklist = $(patternFile compDefault "config/submission-blacklist")
submissionBlacklist = $$(patternFile compDefault "config/submission-blacklist")
personalisedSheetFilesCollatable :: Map Text Pattern
personalisedSheetFilesCollatable = $$(patternFile' compDefault "config/personalised-sheet-files-collate")
-- The rest of this file contains settings which rarely need changing by a
-- user.

View File

@ -0,0 +1,35 @@
{-# OPTIONS_GHC -fno-warn-orphans #-}
module System.FilePath.Glob.TH
( patternFile, patternFile'
) where
import ClassyPrelude.Yesod
import Language.Haskell.TH
import Language.Haskell.TH.Syntax (qAddDependentFile, Lift(..), unsafeTExpCoerce)
import System.FilePath.Glob
import qualified Data.Text as Text
import qualified Data.Text.IO as Text
import qualified Data.Map.Strict as Map
deriving instance Lift CompOptions
patternFile' :: CompOptions -> FilePath -> TExpQ (Map Text Pattern)
patternFile' opts file = do
qAddDependentFile file
patternStrings <- runIO $ filter (not . isComment) . Text.lines <$> Text.readFile file
unsafeTExpCoerce . appE [e|Map.fromList|] . listE $ map (\pat'@(Text.unpack -> pat) -> [e|(pat', compileWith opts pat)|]) patternStrings
patternFile :: CompOptions -> FilePath -> TExpQ [Pattern]
patternFile opts file = [||Map.elems $$(patternFile' opts file)||]
isComment :: Text -> Bool
isComment line = or
[ commentSymbol `Text.isPrefixOf` Text.stripStart line
, Text.null $ Text.strip line
]
where
commentSymbol = "$#"