14
14
CommitizenException ,
15
15
ExitCode ,
16
16
ExpectedExit ,
17
+ InvalidCommandArgumentError ,
17
18
NoCommandFoundError ,
18
19
)
19
20
@@ -410,7 +411,7 @@ def main():
410
411
411
412
# This is for the command required constraint in 2.0
412
413
try :
413
- args = parser .parse_args ()
414
+ args , unknown_args = parser .parse_known_args ()
414
415
except (TypeError , SystemExit ) as e :
415
416
# https://github.com/commitizen-tools/commitizen/issues/429
416
417
# argparse raises TypeError when non exist command is provided on Python < 3.9
@@ -419,6 +420,24 @@ def main():
419
420
raise NoCommandFoundError ()
420
421
raise e
421
422
423
+ arguments = vars (args )
424
+ if unknown_args :
425
+ # Raise error for extra-args without -- separation
426
+ if "--" not in unknown_args :
427
+ raise InvalidCommandArgumentError (
428
+ f"Invalid commitizen arguments were found: `{ ' ' .join (unknown_args )} `. "
429
+ "Please use -- separator for extra git args"
430
+ )
431
+ # Raise error for extra-args before --
432
+ elif unknown_args [0 ] != "--" :
433
+ pos = unknown_args .index ("--" )
434
+ raise InvalidCommandArgumentError (
435
+ f"Invalid commitizen arguments were found before -- separator: `{ ' ' .join (unknown_args [:pos ])} `. "
436
+ )
437
+ # TODO: treat case when extra-args and commitizen args are identical
438
+ extra_args = " " .join (unknown_args [1 :])
439
+ arguments ["extra_cli_args" ] = extra_args
440
+
422
441
if args .name :
423
442
conf .update ({"name" : args .name })
424
443
elif not args .name and not conf .path :
@@ -434,7 +453,7 @@ def main():
434
453
)
435
454
sys .excepthook = no_raise_debug_excepthook
436
455
437
- args .func (conf , vars ( args ) )()
456
+ args .func (conf , arguments )()
438
457
439
458
440
459
if __name__ == "__main__" :
0 commit comments