Fossil SCM
Experiment the use of argv0 as direct subcommand (like busybox) for a few subcommand that can be conveniently use as alias. Requested in this [forum:/forumpost/07a7c30be0|forum post].
Commit
96de01f8e96960d94b8b41ddab9b94dfdab749062098cb2f9bb237c6710c99bf
Parent
52445a27f116603…
1 file changed
+50
+50
| --- src/main.c | ||
| +++ src/main.c | ||
| @@ -451,10 +451,59 @@ | ||
| 451 | 451 | } |
| 452 | 452 | assert( Th_GetOutstandingMalloc()==0 ); |
| 453 | 453 | #endif |
| 454 | 454 | } |
| 455 | 455 | } |
| 456 | + | |
| 457 | +void process_argv0(void){ | |
| 458 | + int i; | |
| 459 | + int nNewArgc = g.argc; | |
| 460 | + int nArgcDiff = 0; | |
| 461 | + char **zNewArgv = NULL; | |
| 462 | + | |
| 463 | + if( sqlite3_strglob("*md5sum", g.argv[0]) == 0 | |
| 464 | + || sqlite3_strglob("*pikchr", g.argv[0]) == 0 | |
| 465 | + || sqlite3_strglob("*sha1sum", g.argv[0]) == 0 | |
| 466 | + || sqlite3_strglob("*sha3sum", g.argv[0]) == 0 | |
| 467 | + || sqlite3_strglob("*sqlite3", g.argv[0]) == 0 ){ | |
| 468 | + nNewArgc++; | |
| 469 | + }else if( sqlite3_strglob("*date", g.argv[0]) == 0 | |
| 470 | + || sqlite3_strglob("*ls", g.argv[0]) == 0 | |
| 471 | + || sqlite3_strglob("*pwd", g.argv[0]) == 0 | |
| 472 | + || sqlite3_strglob("*stty", g.argv[0]) == 0 | |
| 473 | + || sqlite3_strglob("*unzip", g.argv[0]) == 0 | |
| 474 | + || sqlite3_strglob("*which", g.argv[0]) == 0 | |
| 475 | + || sqlite3_strglob("*zip", g.argv[0]) == 0 ){ | |
| 476 | + nNewArgc+=2; | |
| 477 | + } | |
| 478 | + | |
| 479 | + | |
| 480 | + nArgcDiff = nNewArgc - g.argc; | |
| 481 | + if( nArgcDiff > 0 ){ | |
| 482 | + zNewArgv = fossil_malloc( sizeof(char*)*(nNewArgc) ); | |
| 483 | + switch( nArgcDiff ){ | |
| 484 | + case 2: | |
| 485 | + /* system subcommand */ | |
| 486 | + zNewArgv[1] = "system"; | |
| 487 | + | |
| 488 | + /* FALLTHROUGH */ | |
| 489 | + | |
| 490 | + case 1: | |
| 491 | + /*regular subcommand */ | |
| 492 | + zNewArgv[0] = "fossil"; | |
| 493 | + /* strip any path element: "/path/to/cmd" -> "cmd" */ | |
| 494 | + zNewArgv[nArgcDiff] = command_basename(g.argv[0]); | |
| 495 | + for(i=1; i<g.argc; i++){ | |
| 496 | + zNewArgv[i+nArgcDiff] = g.argv[i]; | |
| 497 | + } | |
| 498 | + g.argc = nNewArgc; | |
| 499 | + g.argv = zNewArgv; | |
| 500 | + | |
| 501 | + default: | |
| 502 | + } | |
| 503 | + } | |
| 504 | +} | |
| 456 | 505 | |
| 457 | 506 | /* |
| 458 | 507 | ** Convert all arguments from mbcs (or unicode) to UTF-8. Then |
| 459 | 508 | ** search g.argv for arguments "--args FILENAME". If found, then |
| 460 | 509 | ** (1) remove the two arguments from g.argv |
| @@ -780,10 +829,11 @@ | ||
| 780 | 829 | g.json.outOpt = cson_output_opt_empty; |
| 781 | 830 | g.json.outOpt.addNewline = 1; |
| 782 | 831 | g.json.outOpt.indentation = 1 /* in CGI/server mode this can be configured */; |
| 783 | 832 | #endif /* FOSSIL_ENABLE_JSON */ |
| 784 | 833 | expand_args_option(argc, argv); |
| 834 | + process_argv0(); | |
| 785 | 835 | #ifdef FOSSIL_ENABLE_TCL |
| 786 | 836 | memset(&g.tcl, 0, sizeof(TclContext)); |
| 787 | 837 | g.tcl.argc = g.argc; |
| 788 | 838 | g.tcl.argv = copy_args(g.argc, g.argv); /* save full arguments */ |
| 789 | 839 | #endif |
| 790 | 840 |
| --- src/main.c | |
| +++ src/main.c | |
| @@ -451,10 +451,59 @@ | |
| 451 | } |
| 452 | assert( Th_GetOutstandingMalloc()==0 ); |
| 453 | #endif |
| 454 | } |
| 455 | } |
| 456 | |
| 457 | /* |
| 458 | ** Convert all arguments from mbcs (or unicode) to UTF-8. Then |
| 459 | ** search g.argv for arguments "--args FILENAME". If found, then |
| 460 | ** (1) remove the two arguments from g.argv |
| @@ -780,10 +829,11 @@ | |
| 780 | g.json.outOpt = cson_output_opt_empty; |
| 781 | g.json.outOpt.addNewline = 1; |
| 782 | g.json.outOpt.indentation = 1 /* in CGI/server mode this can be configured */; |
| 783 | #endif /* FOSSIL_ENABLE_JSON */ |
| 784 | expand_args_option(argc, argv); |
| 785 | #ifdef FOSSIL_ENABLE_TCL |
| 786 | memset(&g.tcl, 0, sizeof(TclContext)); |
| 787 | g.tcl.argc = g.argc; |
| 788 | g.tcl.argv = copy_args(g.argc, g.argv); /* save full arguments */ |
| 789 | #endif |
| 790 |
| --- src/main.c | |
| +++ src/main.c | |
| @@ -451,10 +451,59 @@ | |
| 451 | } |
| 452 | assert( Th_GetOutstandingMalloc()==0 ); |
| 453 | #endif |
| 454 | } |
| 455 | } |
| 456 | |
| 457 | void process_argv0(void){ |
| 458 | int i; |
| 459 | int nNewArgc = g.argc; |
| 460 | int nArgcDiff = 0; |
| 461 | char **zNewArgv = NULL; |
| 462 | |
| 463 | if( sqlite3_strglob("*md5sum", g.argv[0]) == 0 |
| 464 | || sqlite3_strglob("*pikchr", g.argv[0]) == 0 |
| 465 | || sqlite3_strglob("*sha1sum", g.argv[0]) == 0 |
| 466 | || sqlite3_strglob("*sha3sum", g.argv[0]) == 0 |
| 467 | || sqlite3_strglob("*sqlite3", g.argv[0]) == 0 ){ |
| 468 | nNewArgc++; |
| 469 | }else if( sqlite3_strglob("*date", g.argv[0]) == 0 |
| 470 | || sqlite3_strglob("*ls", g.argv[0]) == 0 |
| 471 | || sqlite3_strglob("*pwd", g.argv[0]) == 0 |
| 472 | || sqlite3_strglob("*stty", g.argv[0]) == 0 |
| 473 | || sqlite3_strglob("*unzip", g.argv[0]) == 0 |
| 474 | || sqlite3_strglob("*which", g.argv[0]) == 0 |
| 475 | || sqlite3_strglob("*zip", g.argv[0]) == 0 ){ |
| 476 | nNewArgc+=2; |
| 477 | } |
| 478 | |
| 479 | |
| 480 | nArgcDiff = nNewArgc - g.argc; |
| 481 | if( nArgcDiff > 0 ){ |
| 482 | zNewArgv = fossil_malloc( sizeof(char*)*(nNewArgc) ); |
| 483 | switch( nArgcDiff ){ |
| 484 | case 2: |
| 485 | /* system subcommand */ |
| 486 | zNewArgv[1] = "system"; |
| 487 | |
| 488 | /* FALLTHROUGH */ |
| 489 | |
| 490 | case 1: |
| 491 | /*regular subcommand */ |
| 492 | zNewArgv[0] = "fossil"; |
| 493 | /* strip any path element: "/path/to/cmd" -> "cmd" */ |
| 494 | zNewArgv[nArgcDiff] = command_basename(g.argv[0]); |
| 495 | for(i=1; i<g.argc; i++){ |
| 496 | zNewArgv[i+nArgcDiff] = g.argv[i]; |
| 497 | } |
| 498 | g.argc = nNewArgc; |
| 499 | g.argv = zNewArgv; |
| 500 | |
| 501 | default: |
| 502 | } |
| 503 | } |
| 504 | } |
| 505 | |
| 506 | /* |
| 507 | ** Convert all arguments from mbcs (or unicode) to UTF-8. Then |
| 508 | ** search g.argv for arguments "--args FILENAME". If found, then |
| 509 | ** (1) remove the two arguments from g.argv |
| @@ -780,10 +829,11 @@ | |
| 829 | g.json.outOpt = cson_output_opt_empty; |
| 830 | g.json.outOpt.addNewline = 1; |
| 831 | g.json.outOpt.indentation = 1 /* in CGI/server mode this can be configured */; |
| 832 | #endif /* FOSSIL_ENABLE_JSON */ |
| 833 | expand_args_option(argc, argv); |
| 834 | process_argv0(); |
| 835 | #ifdef FOSSIL_ENABLE_TCL |
| 836 | memset(&g.tcl, 0, sizeof(TclContext)); |
| 837 | g.tcl.argc = g.argc; |
| 838 | g.tcl.argv = copy_args(g.argc, g.argv); /* save full arguments */ |
| 839 | #endif |
| 840 |