Skip to content

Commit ca5d19f

Browse files
authored
Render short option with arg. (#9043)
1 parent 439d68e commit ca5d19f

File tree

10 files changed

+200
-144
lines changed

10 files changed

+200
-144
lines changed

Cabal/src/Distribution/GetOpt.hs

Lines changed: 39 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
{-# LANGUAGE NamedFieldPuns #-}
2-
-----------------------------------------------------------------------------
32
{-# LANGUAGE TupleSections #-}
43

4+
-----------------------------------------------------------------------------
5+
56
-- |
67
-- Module : Distribution.GetOpt
78
-- Copyright : (c) Sven Panne 2002-2005
@@ -67,12 +68,12 @@ data ArgDescr a
6768
| -- | option requires argument
6869
ReqArg (String -> Either String a) String
6970
| -- | optional argument
70-
OptArg (Maybe String -> Either String a) String
71+
OptArg String (Maybe String -> Either String a) String
7172

7273
instance Functor ArgDescr where
7374
fmap f (NoArg a) = NoArg (f a)
7475
fmap f (ReqArg g s) = ReqArg (fmap f . g) s
75-
fmap f (OptArg g s) = OptArg (fmap f . g) s
76+
fmap f (OptArg dv g s) = OptArg dv (fmap f . g) s
7677

7778
data OptKind a -- kind of cmd line arg (internal use only):
7879
= Opt a -- an option
@@ -130,17 +131,41 @@ zipDefault _ bd (a : as) [] = (a, bd) : map (,bd) as
130131
zipDefault ad _ [] (b : bs) = (ad, b) : map (ad,) bs
131132
zipDefault ad bd (a : as) (b : bs) = (a, b) : zipDefault ad bd as bs
132133

134+
-- | Pretty printing of short options.
135+
-- * With required arguments can be given as:
136+
-- @-w PATH or -wPATH (but not -w=PATH)@
137+
-- This is dislayed as:
138+
-- @-w PATH or -wPATH@
139+
-- * With optional but default arguments can be given as:
140+
-- @-j or -jNUM (but not -j=NUM or -j NUM)@
141+
-- This is dislayed as:
142+
-- @-j[NUM]@
133143
fmtShort :: ArgDescr a -> Char -> String
134144
fmtShort (NoArg _) so = "-" ++ [so]
135-
fmtShort (ReqArg _ _) so = "-" ++ [so]
136-
fmtShort (OptArg _ _) so = "-" ++ [so]
137-
138-
-- unlike upstream GetOpt we omit the arg name for short options
139-
145+
fmtShort (ReqArg _ ad) so =
146+
let opt = "-" ++ [so]
147+
in opt ++ " " ++ ad ++ " or " ++ opt ++ ad
148+
fmtShort (OptArg _ _ ad) so =
149+
let opt = "-" ++ [so]
150+
in opt ++ "[" ++ ad ++ "]"
151+
152+
-- | Pretty printing of long options.
153+
-- * With required arguments can be given as:
154+
-- @--with-compiler=PATH (but not --with-compiler PATH)@
155+
-- This is dislayed as:
156+
-- @--with-compiler=PATH@
157+
-- * With optional but default arguments can be given as:
158+
-- @--jobs or --jobs=NUM (but not --jobs NUM)@
159+
-- This is dislayed as:
160+
-- @--jobs[=NUM]@
140161
fmtLong :: ArgDescr a -> String -> String
141162
fmtLong (NoArg _) lo = "--" ++ lo
142-
fmtLong (ReqArg _ ad) lo = "--" ++ lo ++ "=" ++ ad
143-
fmtLong (OptArg _ ad) lo = "--" ++ lo ++ "[=" ++ ad ++ "]"
163+
fmtLong (ReqArg _ ad) lo =
164+
let opt = "--" ++ lo
165+
in opt ++ "=" ++ ad
166+
fmtLong (OptArg _ _ ad) lo =
167+
let opt = "--" ++ lo
168+
in opt ++ "[=" ++ ad ++ "]"
144169

145170
wrapText :: Int -> String -> [String]
146171
wrapText width = map unwords . wrap 0 [] . words
@@ -230,8 +255,8 @@ longOpt ls rs optDescr = long ads arg rs
230255
long [ReqArg _ d] [] [] = (errReq d optStr, [])
231256
long [ReqArg f _] [] (r : rest) = (fromRes (f r), rest)
232257
long [ReqArg f _] ('=' : xs) rest = (fromRes (f xs), rest)
233-
long [OptArg f _] [] rest = (fromRes (f Nothing), rest)
234-
long [OptArg f _] ('=' : xs) rest = (fromRes (f (Just xs)), rest)
258+
long [OptArg _ f _] [] rest = (fromRes (f Nothing), rest)
259+
long [OptArg _ f _] ('=' : xs) rest = (fromRes (f (Just xs)), rest)
235260
long _ _ rest = (UnreqOpt ("--" ++ ls), rest)
236261

237262
-- handle short option
@@ -249,8 +274,8 @@ shortOpt y ys rs optDescr = short ads ys rs
249274
short (ReqArg _ d : _) [] [] = (errReq d optStr, [])
250275
short (ReqArg f _ : _) [] (r : rest) = (fromRes (f r), rest)
251276
short (ReqArg f _ : _) xs rest = (fromRes (f xs), rest)
252-
short (OptArg f _ : _) [] rest = (fromRes (f Nothing), rest)
253-
short (OptArg f _ : _) xs rest = (fromRes (f (Just xs)), rest)
277+
short (OptArg _ f _ : _) [] rest = (fromRes (f Nothing), rest)
278+
short (OptArg _ f _ : _) xs rest = (fromRes (f (Just xs)), rest)
254279
short [] [] rest = (UnreqOpt optStr, rest)
255280
short [] xs rest = (UnreqOpt (optStr ++ xs), rest)
256281

Cabal/src/Distribution/Simple/Command.hs

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ module Distribution.Simple.Command
7474
, reqArg'
7575
, optArg
7676
, optArg'
77+
, optArgDef'
7778
, noArg
7879
, boolOpt
7980
, boolOpt'
@@ -138,7 +139,7 @@ data OptDescr a
138139
OptFlags
139140
ArgPlaceHolder
140141
(ReadE (a -> a))
141-
(a -> a)
142+
(String, a -> a)
142143
(a -> [Maybe String])
143144
| ChoiceOpt [(Description, OptFlags, a -> a, a -> Bool)]
144145
| BoolOpt
@@ -231,16 +232,16 @@ optArg
231232
:: Monoid b
232233
=> ArgPlaceHolder
233234
-> ReadE b
234-
-> b
235+
-> (String, b)
235236
-> (b -> [Maybe String])
236237
-> MkOptDescr (a -> b) (b -> a -> a) a
237-
optArg ad mkflag def showflag sf lf d get set =
238+
optArg ad mkflag (dv, mkDef) showflag sf lf d get set =
238239
OptArg
239240
d
240241
(sf, lf)
241242
ad
242243
(fmap (\a b -> set (get b `mappend` a) b) mkflag)
243-
(\b -> set (get b `mappend` def) b)
244+
(dv, \b -> set (get b `mappend` mkDef) b)
244245
(showflag . get)
245246

246247
-- | (String -> a) variant of "reqArg"
@@ -261,9 +262,16 @@ optArg'
261262
-> (b -> [Maybe String])
262263
-> MkOptDescr (a -> b) (b -> a -> a) a
263264
optArg' ad mkflag showflag =
264-
optArg ad (succeedReadE (mkflag . Just)) def showflag
265-
where
266-
def = mkflag Nothing
265+
optArg ad (succeedReadE (mkflag . Just)) ("", mkflag Nothing) showflag
266+
267+
optArgDef'
268+
:: Monoid b
269+
=> ArgPlaceHolder
270+
-> (String, Maybe String -> b)
271+
-> (b -> [Maybe String])
272+
-> MkOptDescr (a -> b) (b -> a -> a) a
273+
optArgDef' ad (dv, mkflag) showflag =
274+
optArg ad (succeedReadE (mkflag . Just)) (dv, mkflag Nothing) showflag
267275

268276
noArg :: Eq b => b -> MkOptDescr (a -> b) (b -> a -> a) a
269277
noArg flag sf lf d = choiceOpt [(flag, (sf, lf), d)] sf lf d
@@ -339,8 +347,8 @@ viewAsGetOpt (OptionField _n aa) = concatMap optDescrToGetOpt aa
339347
where
340348
optDescrToGetOpt (ReqArg d (cs, ss) arg_desc set _) =
341349
[GetOpt.Option cs ss (GetOpt.ReqArg (runReadE set) arg_desc) d]
342-
optDescrToGetOpt (OptArg d (cs, ss) arg_desc set def _) =
343-
[GetOpt.Option cs ss (GetOpt.OptArg set' arg_desc) d]
350+
optDescrToGetOpt (OptArg d (cs, ss) arg_desc set (dv, def) _) =
351+
[GetOpt.Option cs ss (GetOpt.OptArg dv set' arg_desc) d]
344352
where
345353
set' Nothing = Right def
346354
set' (Just txt) = runReadE set txt
@@ -374,13 +382,13 @@ liftOptDescr get' set' (ChoiceOpt opts) =
374382
[ (d, ff, liftSet get' set' set, (get . get'))
375383
| (d, ff, set, get) <- opts
376384
]
377-
liftOptDescr get' set' (OptArg d ff ad set def get) =
385+
liftOptDescr get' set' (OptArg d ff ad set (dv, mkDef) get) =
378386
OptArg
379387
d
380388
ff
381389
ad
382390
(liftSet get' set' `fmap` set)
383-
(liftSet get' set' def)
391+
(dv, liftSet get' set' mkDef)
384392
(get . get')
385393
liftOptDescr get' set' (ReqArg d ff ad set get) =
386394
ReqArg d ff ad (liftSet get' set' `fmap` set) (get . get')

Cabal/src/Distribution/Simple/Setup/Common.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,7 @@ optionVerbosity get set =
282282
( optArg
283283
"n"
284284
(fmap Flag flagToVerbosity)
285-
(Flag verbose) -- default Value if no n is given
285+
(show verbose, Flag verbose) -- default Value if no n is given
286286
(fmap (Just . showForCabal) . flagToList)
287287
)
288288

@@ -300,7 +300,7 @@ optionNumJobs get set =
300300
( optArg
301301
"NUM"
302302
(fmap Flag numJobsParser)
303-
(Flag Nothing)
303+
("$ncpus", Flag Nothing)
304304
(map (Just . maybe "$ncpus" show) . flagToList)
305305
)
306306
where

Cabal/src/Distribution/Simple/Setup/Config.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -541,9 +541,9 @@ configureOptions showOrParseArgs =
541541
"optimization"
542542
configOptimization
543543
(\v flags -> flags{configOptimization = v})
544-
[ optArg'
544+
[ optArgDef'
545545
"n"
546-
(Flag . flagToOptimisationLevel)
546+
(show NoOptimisation, Flag . flagToOptimisationLevel)
547547
( \f -> case f of
548548
Flag NoOptimisation -> []
549549
Flag NormalOptimisation -> [Nothing]

cabal-install/src/Distribution/Client/CmdOutdated.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,7 @@ outdatedOptions _showOrParseArgs =
281281
( optArg
282282
"PKGS"
283283
ignoreMajorVersionBumpsParser
284-
(Just IgnoreMajorVersionBumpsAll)
284+
("", Just IgnoreMajorVersionBumpsAll)
285285
ignoreMajorVersionBumpsPrinter
286286
)
287287
]

cabal-install/src/Distribution/Client/Setup.hs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -934,7 +934,7 @@ configureExOptions _showOrParseArgs src =
934934
( optArg
935935
"DEPS"
936936
(parsecToReadEErr unexpectMsgString relaxDepsParser)
937-
(Just RelaxDepsAll)
937+
(show RelaxDepsAll, Just RelaxDepsAll)
938938
relaxDepsPrinter
939939
)
940940
, option
@@ -946,7 +946,7 @@ configureExOptions _showOrParseArgs src =
946946
( optArg
947947
"DEPS"
948948
(parsecToReadEErr unexpectMsgString relaxDepsParser)
949-
(Just RelaxDepsAll)
949+
(show RelaxDepsAll, Just RelaxDepsAll)
950950
relaxDepsPrinter
951951
)
952952
, option
@@ -1766,7 +1766,7 @@ getCommand =
17661766
(const "invalid source-repository")
17671767
(fmap (toFlag . Just) parsec)
17681768
)
1769-
(Flag Nothing)
1769+
("", Flag Nothing)
17701770
(map (fmap show) . flagToList)
17711771
)
17721772
, option

changelog.d/issue-8785

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
synopsis: Also render short options with arguments
2+
packages: cabal-install
3+
prs: #9043
4+
issues: #8785
5+
6+
description: {
7+
8+
Show how arguments are used with both short and long forms of options:
9+
10+
```diff
11+
< -v, --verbose[=n] Control verbosity (n is 0--3, default
12+
> -v[n], --verbose[=n] Control verbosity (n is 0--3, default
13+
< -w, --with-compiler=PATH give the path to a particular compiler
14+
> -w PATH or -wPATH, --with-compiler=PATH
15+
```
16+
17+
}

0 commit comments

Comments
 (0)