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].

mgagnon 2026-03-11 22:57 trunk
Commit 96de01f8e96960d94b8b41ddab9b94dfdab749062098cb2f9bb237c6710c99bf
1 file changed +50
+50
--- src/main.c
+++ src/main.c
@@ -451,10 +451,59 @@
451451
}
452452
assert( Th_GetOutstandingMalloc()==0 );
453453
#endif
454454
}
455455
}
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
+}
456505
457506
/*
458507
** Convert all arguments from mbcs (or unicode) to UTF-8. Then
459508
** search g.argv for arguments "--args FILENAME". If found, then
460509
** (1) remove the two arguments from g.argv
@@ -780,10 +829,11 @@
780829
g.json.outOpt = cson_output_opt_empty;
781830
g.json.outOpt.addNewline = 1;
782831
g.json.outOpt.indentation = 1 /* in CGI/server mode this can be configured */;
783832
#endif /* FOSSIL_ENABLE_JSON */
784833
expand_args_option(argc, argv);
834
+ process_argv0();
785835
#ifdef FOSSIL_ENABLE_TCL
786836
memset(&g.tcl, 0, sizeof(TclContext));
787837
g.tcl.argc = g.argc;
788838
g.tcl.argv = copy_args(g.argc, g.argv); /* save full arguments */
789839
#endif
790840
--- 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

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button