15
15
CommitizenException ,
16
16
ExitCode ,
17
17
ExpectedExit ,
18
+ InvalidCommandArgumentError ,
18
19
NoCommandFoundError ,
19
20
)
20
21
@@ -441,7 +442,7 @@ def main():
441
442
442
443
# This is for the command required constraint in 2.0
443
444
try :
444
- args = parser .parse_args ()
445
+ args , unknown_args = parser .parse_known_args ()
445
446
except (TypeError , SystemExit ) as e :
446
447
# https://github.com/commitizen-tools/commitizen/issues/429
447
448
# argparse raises TypeError when non exist command is provided on Python < 3.9
@@ -450,6 +451,24 @@ def main():
450
451
raise NoCommandFoundError ()
451
452
raise e
452
453
454
+ arguments = vars (args )
455
+ if unknown_args :
456
+ # Raise error for extra-args without -- separation
457
+ if "--" not in unknown_args :
458
+ raise InvalidCommandArgumentError (
459
+ f"Invalid commitizen arguments were found: `{ ' ' .join (unknown_args )} `. "
460
+ "Please use -- separator for extra git args"
461
+ )
462
+ # Raise error for extra-args before --
463
+ elif unknown_args [0 ] != "--" :
464
+ pos = unknown_args .index ("--" )
465
+ raise InvalidCommandArgumentError (
466
+ f"Invalid commitizen arguments were found before -- separator: `{ ' ' .join (unknown_args [:pos ])} `. "
467
+ )
468
+ # TODO: treat case when extra-args and commitizen args are identical
469
+ extra_args = " " .join (unknown_args [1 :])
470
+ arguments ["extra_cli_args" ] = extra_args
471
+
453
472
if args .name :
454
473
conf .update ({"name" : args .name })
455
474
elif not args .name and not conf .path :
@@ -465,7 +484,7 @@ def main():
465
484
)
466
485
sys .excepthook = no_raise_debug_excepthook
467
486
468
- args .func (conf , vars ( args ) )()
487
+ args .func (conf , arguments )()
469
488
470
489
471
490
if __name__ == "__main__" :
0 commit comments