@@ -28,13 +28,17 @@ import Distribution.Gentoo.Types
28
28
import qualified Distribution.Gentoo.Types.HUMode as Mode
29
29
import Output
30
30
31
+ -- | Process arguments from the command line. Returns an error string if the
32
+ -- user provided incorrect or unknown options.
31
33
parseArgs :: PkgManager -> RawPMArgs -> Either String (CmdLineArgs , RawPMArgs )
32
34
parseArgs defPM args = case getOpt' Permute options args of
33
35
(_, _, _, errs@ (_: _)) -> Left $ unwords $ " Errors in arguments:" : errs
34
36
(_, _, unk@ (_: _), _) -> Left $ unwords $ " Unknown options:" : unk
35
37
(fs, raw, _, _) ->
36
38
(,raw) <$> foldr (>=>) pure fs (defCmdLineArgs defPM)
37
39
40
+ -- | Parse processed command line arguments into a 'Mode.HUMode'. Returns an
41
+ -- error string if the user supplied non-compatible option combinations.
38
42
mkHUMode :: CmdLineArgs -> RawPMArgs -> Either String Mode. HUMode
39
43
mkHUMode cmdLine raw
40
44
| cmdLineHelp cmdLine = pure Mode. HelpMode
@@ -52,39 +56,73 @@ mkHUMode cmdLine raw
52
56
pm@ (InvalidPM _) -> Left $
53
57
" Invalid package manager in mkHUMode: " ++ show pm
54
58
59
+ -- Logic for parsing modes for non-portage package managers
55
60
mkMode :: RunMode -> Either String Mode. RunMode
56
61
mkMode = \ case
57
62
BasicMode -> Mode. BasicMode <$> mkTarget (cmdLineTarget cmdLine)
58
63
ListMode -> Mode. ListMode <$> mkTarget (cmdLineTarget cmdLine)
59
64
ReinstallAtomsMode -> Left
60
65
" reinstall-atoms mode is only supported by the portage package manager"
61
66
62
- mkPortageMode
63
- :: RunMode
64
- -> Either String (Either Mode. RunMode Mode. ReinstallAtomsMode )
65
- mkPortageMode = \ case
66
- BasicMode -> Left . Mode. BasicMode <$> mkTarget (cmdLineTarget cmdLine)
67
- ListMode -> Left . Mode. ListMode <$> mkTarget (cmdLineTarget cmdLine)
68
- ReinstallAtomsMode -> Right . Mode. ReinstallAtomsMode
69
- <$> mkRATarget (cmdLineTarget cmdLine)
70
-
67
+ -- Logic for parsing targets for non-portage package managers
71
68
mkTarget :: Either CustomTargets BuildTarget -> Either String Mode. Target
72
69
mkTarget = \ case
73
70
Right OnlyInvalid -> Right Mode. OnlyInvalid
74
71
Right AllInstalled -> Right Mode. AllInstalled
72
+ Right PreservedRebuild -> Left $
73
+ " preserved-rebuild target is only supported by the portage \
74
+ \package manager"
75
75
Right WorldTarget -> Left
76
76
" world target is only supported in reinstall-atoms mode"
77
77
Left _ -> Left
78
78
" custom targets are only supported in reinstall-atoms mode"
79
79
80
- mkRATarget
80
+ -- Logic for parsing modes for portage
81
+ mkPortageMode
82
+ :: RunMode
83
+ -> Either String Mode. PortageMode
84
+ mkPortageMode = \ case
85
+ BasicMode -> Mode. PortageBasicMode
86
+ <$> mkPortageBasicTarget (cmdLineTarget cmdLine)
87
+ ListMode -> Mode. PortageListMode
88
+ <$> mkPortageTarget (cmdLineTarget cmdLine)
89
+ ReinstallAtomsMode -> Mode. ReinstallAtomsMode
90
+ <$> mkPortageRATarget (cmdLineTarget cmdLine)
91
+
92
+ -- Logic for parsing targets for portage's basic mode
93
+ mkPortageBasicTarget
94
+ :: Either CustomTargets BuildTarget
95
+ -> Either String (Either Mode. PortageBasicTarget Mode. Target )
96
+ mkPortageBasicTarget = \ case
97
+ Right PreservedRebuild -> Right $ Left Mode. PreservedRebuild
98
+ targ -> Right <$> mkPortageTarget targ
99
+
100
+ -- Logic for parsing targets for portage's reinstall-atoms mode
101
+ mkPortageRATarget
81
102
:: Either CustomTargets BuildTarget
82
103
-> Either String (Either Mode. Target Mode. ReinstallAtomsTarget )
83
- mkRATarget = Right . \ case
84
- Right OnlyInvalid -> Left Mode. OnlyInvalid
85
- Right AllInstalled -> Left Mode. AllInstalled
86
- Right WorldTarget -> Right Mode. WorldTarget
87
- Left cts -> Right $ Mode. CustomTargets cts
104
+ mkPortageRATarget = \ case
105
+ Right WorldTarget -> Right $ Right $
106
+ if cmdLineWorldFull cmdLine
107
+ then Mode. WorldFullTarget
108
+ else Mode. WorldTarget
109
+ Left cts -> Right $ Right $ Mode. CustomTargets cts
110
+ targ -> Left <$> mkPortageTarget targ
111
+
112
+ -- Logic for parsing targets for portage's list mode; also common logic
113
+ -- for parsing targets, between portage's basic and reinstall-atoms modes
114
+ mkPortageTarget
115
+ :: Either CustomTargets BuildTarget
116
+ -> Either String Mode. Target
117
+ mkPortageTarget = \ case
118
+ Right OnlyInvalid -> Right Mode. OnlyInvalid
119
+ Right AllInstalled -> Right Mode. AllInstalled
120
+ Right PreservedRebuild -> Left
121
+ " preserved-rebuild target is only supported in basic mode"
122
+ Right WorldTarget -> Left
123
+ " world target is only supported in reinstall-atoms mode"
124
+ Left _ -> Left
125
+ " custom targets are only supported in reinstall-atoms mode"
88
126
89
127
runModifier :: RunModifier
90
128
runModifier = RM
@@ -140,6 +178,16 @@ options =
140
178
) $ " alias for --package-manager=portage"
141
179
++ " \\\n --target=" ++ argString WorldTarget
142
180
++ " \\\n --mode=" ++ argString ReinstallAtomsMode
181
+ , Option [] [" world-full" ]
182
+ (naUpdate $ \ c -> updateTarget (Right WorldTarget ) c
183
+ { cmdLinePkgManager = Portage
184
+ , cmdLineMode = ReinstallAtomsMode
185
+ , cmdLineWorldFull = True
186
+ }
187
+ ) $ " alias for --world -- --newuse --with-bdeps=y"
188
+ , Option [] [" preserved-rebuild" ]
189
+ (naUpdate $ updateTarget (Right PreservedRebuild ))
190
+ $ " alias for --target=" ++ argString PreservedRebuild
143
191
, Option [' T' ] [" custom-target" ]
144
192
(ReqArg
145
193
(\ s c -> pure $ updateTarget (Left s) c
0 commit comments