7 | import Derive.Prelude
10 | import System.GetOpts
13 | %language ElabReflection
21 | prettyPrec _ = line . interpolate
24 | Pretty FilePath where
25 | prettyPrec _ = line . interpolate
30 | constructor MkConfig
49 | includeHidden : Bool
54 | extensions : List Body
57 | files : List FilePath
59 | %runElab derive "Config" [Show,Eq,Pretty]
61 | init : List String -> Config
67 | , includeAll = False
68 | , includeHidden = False
69 | , files = case fs of [] => ["."];
_ => map fromString fs
70 | , extensions = ["idr"]
76 | includeDir : FilePath -> Config -> Bool
77 | includeDir p c = not (isHidden p) || c.includeHidden
82 | includeFile : FilePath -> Config -> Bool
84 | let ext := extension p
85 | in c.includeAll || any ((ext ==) . Just) c.extensions
91 | help : Config -> Config
92 | help = {printHelp := True}
94 | adjVerbosity : (Nat -> Nat) -> Config -> Config
95 | adjVerbosity f = {verbosity $= f}
97 | doFix : Bool -> Config -> Config
98 | doFix b = {checkOnly := not b}
100 | setExts : String -> Config -> Config
101 | setExts s = {extensions := mapMaybe parse $
forget (split (',' ==) s)}
103 | setAll : Config -> Config
104 | setAll = {includeAll := True}
106 | setHidden : Config -> Config
107 | setHidden = {includeHidden := True}
109 | descs : List $
OptDescr (Config -> Config)
111 | [ MkOpt ['h'] ["help"] (NoArg help)
112 | "prints this help text\n "
113 | , MkOpt ['v'] ["verbose"] (NoArg $
adjVerbosity S)
114 | "increase verbosity (default verbosity is 2)\n "
115 | , MkOpt ['q'] ["quiet"] (NoArg $
adjVerbosity pred)
116 | "decrease verbosity (default verbosity is 2)\n "
117 | , MkOpt ['c'] ["check"] (NoArg $
doFix False)
118 | "check and list files with issues (default)\n "
119 | , MkOpt ['f'] ["fix"] (NoArg $
doFix True)
120 | "check and fix files with issues\n "
121 | , MkOpt ['e'] ["ext"] (ReqArg setExts "<exts>") $
123 | [ "comma separated list of extensions of files"
124 | , "to be included when traversing directories"
125 | , "(default is \"idr\")."
126 | , "Note: Files whose name starts with a dot will be"
127 | , "ignored unless '--includeHidden' is set."
130 | , MkOpt ['a'] ["all"] (NoArg setAll)
131 | "include all non-hidden files when traversing directories\n "
132 | , MkOpt [] ["includeHidden"] (NoArg setHidden) $
134 | [ "include hidden files (name starts with a dot)"
135 | , "when traversing directories"
141 | applyArgs : List String -> Either (List String) Config
143 | case getOpt RequireOrder descs args of
144 | MkResult os n [] [] => Right $
foldl (flip apply) (init n) os
145 | MkResult _ _ u e => Left $
map unknown u ++ e
148 | unknown : String -> String
149 | unknown = ("Unknown option: " ++)
159 | progName = "fix_whitespace"
162 | usage = "Usage: " ++ progName ++ " [options] [FILES]\n\nOptions:\n"
167 | [ progName ++ " version " ++ version
169 | , " Removes trailing whitespace characters from the specified"
170 | , " text files making sure every text file ends with exactly one"
171 | , " newline character. Windows style line breaks are replaced"
172 | , " by Unix newline characters."
174 | , " If the passed file list contains directories, " ++ progName
175 | , " will recursively adjust all files with the given extensions"
176 | , " (see option --ext) in those directories. If no files are"
177 | , " specified, the current directory will be traversed instead."
184 | info = usageInfo synopsis descs
188 | shortInfo = usageInfo usage descs