12
12
CommitizenException ,
13
13
ExitCode ,
14
14
ExpectedExit ,
15
+ InvalidCommandArgumentError ,
15
16
NoCommandFoundError ,
16
17
)
17
18
@@ -374,7 +375,7 @@ def main():
374
375
375
376
# This is for the command required constraint in 2.0
376
377
try :
377
- args = parser .parse_args ()
378
+ args , unknown_args = parser .parse_known_args ()
378
379
except (TypeError , SystemExit ) as e :
379
380
# https://github.com/commitizen-tools/commitizen/issues/429
380
381
# argparse raises TypeError when non exist command is provided on Python < 3.9
@@ -383,6 +384,24 @@ def main():
383
384
raise NoCommandFoundError ()
384
385
raise e
385
386
387
+ arguments = vars (args )
388
+ if unknown_args :
389
+ # Raise error for extra-args without -- separation
390
+ if "--" not in unknown_args :
391
+ raise InvalidCommandArgumentError (
392
+ f"Invalid commitizen arguments were found: `{ ' ' .join (unknown_args )} `. "
393
+ "Please use -- separator for extra git args"
394
+ )
395
+ # Raise error for extra-args before --
396
+ elif unknown_args [0 ] != "--" :
397
+ pos = unknown_args .index ("--" )
398
+ raise InvalidCommandArgumentError (
399
+ f"Invalid commitizen arguments were found before -- separator: `{ ' ' .join (unknown_args [:pos ])} `. "
400
+ )
401
+ # TODO: treat case when extra-args and commitizen args are identical
402
+ extra_args = " " .join (unknown_args [1 :])
403
+ arguments ["extra_cli_args" ] = extra_args
404
+
386
405
if args .name :
387
406
conf .update ({"name" : args .name })
388
407
elif not args .name and not conf .path :
@@ -398,7 +417,7 @@ def main():
398
417
)
399
418
sys .excepthook = no_raise_debug_excepthook
400
419
401
- args .func (conf , vars ( args ) )()
420
+ args .func (conf , arguments )()
402
421
403
422
404
423
if __name__ == "__main__" :
0 commit comments