@@ -591,28 +591,37 @@ def handle_version(self) -> NoReturn:
591591PreparsedCLIFlags = tuple [dict [str , tuple [Any , bool ]], list [str ]]
592592
593593
594- def apply_preparsed_cli_flags (preparsed_from_c : PreparsedCLIFlags , ans : Any , create_oc : Callable [[], Options ]) -> list [str ]:
594+ def apply_preparsed_cli_flags (
595+ preparsed_from_c : PreparsedCLIFlags , ans : Any , create_oc : Callable [[], Options ],
596+ track_seen_options : set [str ] | None = None
597+ ) -> list [str ]:
595598 for key , (val , is_seen ) in preparsed_from_c [0 ].items ():
596599 if key == 'help' and is_seen and val :
597600 create_oc ().handle_help ()
598601 elif key == 'version' and is_seen and val :
599602 create_oc ().handle_version ()
603+ if is_seen and track_seen_options is not None :
604+ track_seen_options .add (key )
600605 setattr (ans , key , val )
601606 return preparsed_from_c [1 ]
602607
603608
604609def parse_cmdline_inner (
605- args : list [str ], oc : Options , disabled : OptionSpecSeq , names_map : dict [str , OptionDict ], values_map : dict [str , OptionDict ], ans : Any
610+ args : list [str ], oc : Options , disabled : OptionSpecSeq , names_map : dict [str , OptionDict ],
611+ values_map : dict [str , OptionDict ], ans : Any , track_seen_options : set [str ] | None = None
606612) -> list [str ]:
607613 preparsed = parse_cli_from_spec (args , names_map , values_map )
608- leftover_args = apply_preparsed_cli_flags (preparsed , ans , lambda : oc )
614+ leftover_args = apply_preparsed_cli_flags (preparsed , ans , lambda : oc , track_seen_options )
609615 for opt in disabled :
610616 if not isinstance (opt , str ):
611617 setattr (ans , opt ['dest' ], defval_for_opt (opt ))
612618 return leftover_args
613619
614620
615- def parse_cmdline (oc : Options , disabled : OptionSpecSeq , ans : Any , args : list [str ] | None = None ) -> list [str ]:
621+ def parse_cmdline (
622+ oc : Options , disabled : OptionSpecSeq , ans : Any , args : list [str ] | None = None ,
623+ track_seen_options : set [str ] | None = None
624+ ) -> list [str ]:
616625 names_map = oc .names_map .copy ()
617626 values_map = oc .values_map .copy ()
618627 if 'help' not in names_map :
@@ -622,7 +631,7 @@ def parse_cmdline(oc: Options, disabled: OptionSpecSeq, ans: Any, args: list[str
622631 names_map ['version' ] = {'type' : 'bool-set' , 'aliases' : ('--version' , '-v' )} # type: ignore
623632 values_map ['version' ] = False
624633 try :
625- return parse_cmdline_inner (sys .argv [1 :] if args is None else args , oc , disabled , names_map , values_map , ans )
634+ return parse_cmdline_inner (sys .argv [1 :] if args is None else args , oc , disabled , names_map , values_map , ans , track_seen_options )
626635 except Exception as e :
627636 raise SystemExit (str (e ))
628637
@@ -668,6 +677,7 @@ def parse_args(
668677 appname : str | None = None ,
669678 result_class : type [T ] | None = None ,
670679 preparsed_from_c : PreparsedCLIFlags | None = None ,
680+ track_seen_options : set [str ] | None = None ,
671681) -> tuple [T , list [str ]]:
672682 if result_class is not None :
673683 ans = result_class ()
@@ -685,7 +695,7 @@ def create_oc() -> Options:
685695 options = parse_option_spec (ospec ())
686696 seq , disabled = options
687697 oc = Options (seq , usage , message , appname )
688- return ans , parse_cmdline (oc , disabled , ans , args = args )
698+ return ans , parse_cmdline (oc , disabled , ans , args = args , track_seen_options = track_seen_options )
689699
690700
691701SYSTEM_CONF = f'/etc/xdg/{ appname } /{ appname } .conf'
0 commit comments