addons: try to be smarter about showing file extensions
We now hide add-ons' file extensions in the commands list except when they are needed for disambiguation. There are three cases: - when an add-on exists with only one file extension, the extension is not displayed. - when an add-on has exactly two variants, one with the .[l]hs extension and the other with none or .exe - presumably the source and compiled versions - we omit the source version from the list. - otherwise when an add-on has multiple variants differing by file extension, they are listed with their extensions displayed.
This commit is contained in:
parent
eeb48c86d1
commit
9a255051e8
@ -65,6 +65,7 @@ import System.Console.CmdArgs.Text
|
|||||||
import System.Directory
|
import System.Directory
|
||||||
import System.Environment
|
import System.Environment
|
||||||
import System.Exit (exitSuccess)
|
import System.Exit (exitSuccess)
|
||||||
|
import System.FilePath (takeExtension)
|
||||||
import Test.HUnit
|
import Test.HUnit
|
||||||
import Text.ParserCombinators.Parsec as P
|
import Text.ParserCombinators.Parsec as P
|
||||||
|
|
||||||
@ -392,28 +393,36 @@ widthp = (string "auto" >> return Auto)
|
|||||||
|
|
||||||
-- Other utils
|
-- Other utils
|
||||||
|
|
||||||
-- | Get the unique suffixes (without hledger-) of hledger-* executables
|
-- | Like getHledgerExesInPath, but convert the filenames to unique add-on names for the commands list.
|
||||||
-- found in the current user's PATH, or the empty list if there is any
|
-- An add-on name is the filename without the "hledger-" prefix, and usually without the file extension.
|
||||||
-- problem.
|
-- Exceptions:
|
||||||
|
-- - when there are multiple filenames differing only by file extension, their extensions are preserved
|
||||||
|
-- - when there are two variants, one with .[l]hs extension and one with none or .exe, omit the former.
|
||||||
|
--
|
||||||
getHledgerAddonCommands :: IO [String]
|
getHledgerAddonCommands :: IO [String]
|
||||||
getHledgerAddonCommands = map (drop (length progname + 1)) `fmap` getHledgerExesInPath
|
getHledgerAddonCommands = do
|
||||||
|
exes <- getHledgerExesInPath
|
||||||
|
let stripprefix = drop (length progname + 1)
|
||||||
|
addons = map stripprefix exes
|
||||||
|
groups = groupBy (\a b -> stripAddonExtension a == stripAddonExtension b) addons
|
||||||
|
stripext [f] = [stripAddonExtension f]
|
||||||
|
stripext [f,f2] | takeExtension f `elem` ["",".exe"] && takeExtension f2 `elem` [".hs",".lhs"] = [stripAddonExtension f]
|
||||||
|
stripext fs = fs
|
||||||
|
addons' = concatMap stripext groups
|
||||||
|
return addons'
|
||||||
|
|
||||||
-- | Get the unique names (including extension) of hledger add-ons
|
-- | Get the sorted unique filenames of all hledger executables
|
||||||
-- (executables, named hledger-*, with no extension or one of the
|
-- in the current user's PATH (files, named hledger-*, with either no
|
||||||
-- addonExtensions) found in the current user's PATH, or the empty
|
-- extension (and no periods in the name) or one of the addonExtensions).
|
||||||
-- list if there is a problem.
|
-- If there is any problem, return the empty list.
|
||||||
getHledgerExesInPath :: IO [String]
|
getHledgerExesInPath :: IO [String]
|
||||||
getHledgerExesInPath = do
|
getHledgerExesInPath = do
|
||||||
pathdirs <- regexSplit "[:;]" `fmap` getEnvSafe "PATH"
|
pathdirs <- regexSplit "[:;]" `fmap` getEnvSafe "PATH"
|
||||||
pathfiles <- concat `fmap` mapM getDirectoryContentsSafe pathdirs
|
pathfiles <- concat `fmap` mapM getDirectoryContentsSafe pathdirs
|
||||||
let hledgernamed =
|
return $ nub $ sort $ filter isHledgerExeName pathfiles
|
||||||
-- nubBy (\a b -> stripAddonExtension a == stripAddonExtension b) $
|
-- XXX should exclude directories and files without execute permission.
|
||||||
nub $
|
|
||||||
sort $ filter isHledgerExeName pathfiles
|
|
||||||
return hledgernamed
|
|
||||||
-- Exclude directories and files without execute permission.
|
|
||||||
-- These will do a stat for each hledger-*, probably ok.
|
-- These will do a stat for each hledger-*, probably ok.
|
||||||
-- They also need the path..
|
-- But they need paths, not just filenames
|
||||||
-- hledgerexes <- filterM doesFileExist hledgernamed
|
-- hledgerexes <- filterM doesFileExist hledgernamed
|
||||||
-- hledgerexes' <- filterM isExecutable hledgerexes
|
-- hledgerexes' <- filterM isExecutable hledgerexes
|
||||||
-- return hledgerexes
|
-- return hledgerexes
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user