Fossil SCM

First jab at creating a bash script for command completion

baruch 2016-12-15 22:46 trunk
Commit a4de0004b0f8d4c2794204a733cd31248fcf7ce3
+7 -4
--- src/main.mk
+++ src/main.mk
@@ -438,12 +438,15 @@
438438
$(OBJDIR)/zip.o
439439
440440
APPNAME = fossil$(E)
441441
442442
443
+COMPNAME = completion.sh
443444
444
-all: $(OBJDIR) $(APPNAME)
445
+
446
+
447
+all: $(OBJDIR) $(APPNAME) $(COMPNAME)
445448
446449
install: $(APPNAME)
447450
mkdir -p $(INSTALLDIR)
448451
mv $(APPNAME) $(INSTALLDIR)
449452
@@ -587,15 +590,15 @@
587590
#
588591
$(SRCDIR)/../manifest:
589592
# noop
590593
591594
clean:
592
- rm -rf $(OBJDIR)/* $(APPNAME)
595
+ rm -rf $(OBJDIR)/* $(APPNAME) $(COMPNAME)
593596
594597
595
-$(OBJDIR)/page_index.h: $(TRANS_SRC) $(OBJDIR)/mkindex
596
- $(OBJDIR)/mkindex $(TRANS_SRC) >$@
598
+$(OBJDIR)/page_index.h $(COMPNAME): $(TRANS_SRC) $(OBJDIR)/mkindex
599
+ $(OBJDIR)/mkindex --compfile $(COMPNAME) $(TRANS_SRC) >$(OBJDIR)/page_index.h
597600
598601
$(OBJDIR)/builtin_data.h: $(OBJDIR)/mkbuiltin $(EXTRA_FILES)
599602
$(OBJDIR)/mkbuiltin --prefix $(SRCDIR)/ $(EXTRA_FILES) >$@
600603
601604
$(OBJDIR)/headers: $(OBJDIR)/page_index.h $(OBJDIR)/builtin_data.h $(OBJDIR)/makeheaders $(OBJDIR)/VERSION.h
602605
--- src/main.mk
+++ src/main.mk
@@ -438,12 +438,15 @@
438 $(OBJDIR)/zip.o
439
440 APPNAME = fossil$(E)
441
442
 
443
444 all: $(OBJDIR) $(APPNAME)
 
 
445
446 install: $(APPNAME)
447 mkdir -p $(INSTALLDIR)
448 mv $(APPNAME) $(INSTALLDIR)
449
@@ -587,15 +590,15 @@
587 #
588 $(SRCDIR)/../manifest:
589 # noop
590
591 clean:
592 rm -rf $(OBJDIR)/* $(APPNAME)
593
594
595 $(OBJDIR)/page_index.h: $(TRANS_SRC) $(OBJDIR)/mkindex
596 $(OBJDIR)/mkindex $(TRANS_SRC) >$@
597
598 $(OBJDIR)/builtin_data.h: $(OBJDIR)/mkbuiltin $(EXTRA_FILES)
599 $(OBJDIR)/mkbuiltin --prefix $(SRCDIR)/ $(EXTRA_FILES) >$@
600
601 $(OBJDIR)/headers: $(OBJDIR)/page_index.h $(OBJDIR)/builtin_data.h $(OBJDIR)/makeheaders $(OBJDIR)/VERSION.h
602
--- src/main.mk
+++ src/main.mk
@@ -438,12 +438,15 @@
438 $(OBJDIR)/zip.o
439
440 APPNAME = fossil$(E)
441
442
443 COMPNAME = completion.sh
444
445
446
447 all: $(OBJDIR) $(APPNAME) $(COMPNAME)
448
449 install: $(APPNAME)
450 mkdir -p $(INSTALLDIR)
451 mv $(APPNAME) $(INSTALLDIR)
452
@@ -587,15 +590,15 @@
590 #
591 $(SRCDIR)/../manifest:
592 # noop
593
594 clean:
595 rm -rf $(OBJDIR)/* $(APPNAME) $(COMPNAME)
596
597
598 $(OBJDIR)/page_index.h $(COMPNAME): $(TRANS_SRC) $(OBJDIR)/mkindex
599 $(OBJDIR)/mkindex --compfile $(COMPNAME) $(TRANS_SRC) >$(OBJDIR)/page_index.h
600
601 $(OBJDIR)/builtin_data.h: $(OBJDIR)/mkbuiltin $(EXTRA_FILES)
602 $(OBJDIR)/mkbuiltin --prefix $(SRCDIR)/ $(EXTRA_FILES) >$@
603
604 $(OBJDIR)/headers: $(OBJDIR)/page_index.h $(OBJDIR)/builtin_data.h $(OBJDIR)/makeheaders $(OBJDIR)/VERSION.h
605
--- src/makemake.tcl
+++ src/makemake.tcl
@@ -281,16 +281,18 @@
281281
writeln -nonewline " \\\n \$(OBJDIR)/$s.o"
282282
}
283283
writeln "\n"
284284
writeln "APPNAME = $name\$(E)"
285285
writeln "\n"
286
+writeln "COMPNAME = completion.sh"
287
+writeln "\n"
286288
287289
writeln [string map [list \
288290
<<<SQLITE_OPTIONS>>> [join $SQLITE_OPTIONS " \\\n "] \
289291
<<<SHELL_OPTIONS>>> [join $SHELL_OPTIONS " \\\n "] \
290292
<<<MINIZ_OPTIONS>>> [join $MINIZ_OPTIONS " \\\n "]] {
291
-all: $(OBJDIR) $(APPNAME)
293
+all: $(OBJDIR) $(APPNAME) $(COMPNAME)
292294
293295
install: $(APPNAME)
294296
mkdir -p $(INSTALLDIR)
295297
mv $(APPNAME) $(INSTALLDIR)
296298
@@ -413,11 +415,11 @@
413415
#
414416
$(SRCDIR)/../manifest:
415417
# noop
416418
417419
clean:
418
- rm -rf $(OBJDIR)/* $(APPNAME)
420
+ rm -rf $(OBJDIR)/* $(APPNAME) $(COMPNAME)
419421
420422
}
421423
422424
set mhargs {}
423425
foreach s [lsort $src] {
@@ -427,12 +429,12 @@
427429
append mhargs "\$(SRCDIR)/sqlite3.h <<<NEXT_LINE>>>"
428430
append mhargs "\$(SRCDIR)/th.h <<<NEXT_LINE>>>"
429431
#append mhargs "\$(SRCDIR)/cson_amalgamation.h <<<NEXT_LINE>>>"
430432
append mhargs "\$(OBJDIR)/VERSION.h"
431433
set mhargs [string map [list <<<NEXT_LINE>>> \\\n\t] $mhargs]
432
-writeln "\$(OBJDIR)/page_index.h: \$(TRANS_SRC) \$(OBJDIR)/mkindex"
433
-writeln "\t\$(OBJDIR)/mkindex \$(TRANS_SRC) >\$@\n"
434
+writeln "\$(OBJDIR)/page_index.h \$(COMPNAME): \$(TRANS_SRC) \$(OBJDIR)/mkindex"
435
+writeln "\t\$(OBJDIR)/mkindex --compfile \$(COMPNAME) \$(TRANS_SRC) >\$(OBJDIR)/page_index.h\n"
434436
435437
writeln "\$(OBJDIR)/builtin_data.h: \$(OBJDIR)/mkbuiltin \$(EXTRA_FILES)"
436438
writeln "\t\$(OBJDIR)/mkbuiltin --prefix \$(SRCDIR)/ \$(EXTRA_FILES) >\$@\n"
437439
438440
writeln "\$(OBJDIR)/headers:\t\$(OBJDIR)/page_index.h \$(OBJDIR)/builtin_data.h \$(OBJDIR)/makeheaders \$(OBJDIR)/VERSION.h"
439441
--- src/makemake.tcl
+++ src/makemake.tcl
@@ -281,16 +281,18 @@
281 writeln -nonewline " \\\n \$(OBJDIR)/$s.o"
282 }
283 writeln "\n"
284 writeln "APPNAME = $name\$(E)"
285 writeln "\n"
 
 
286
287 writeln [string map [list \
288 <<<SQLITE_OPTIONS>>> [join $SQLITE_OPTIONS " \\\n "] \
289 <<<SHELL_OPTIONS>>> [join $SHELL_OPTIONS " \\\n "] \
290 <<<MINIZ_OPTIONS>>> [join $MINIZ_OPTIONS " \\\n "]] {
291 all: $(OBJDIR) $(APPNAME)
292
293 install: $(APPNAME)
294 mkdir -p $(INSTALLDIR)
295 mv $(APPNAME) $(INSTALLDIR)
296
@@ -413,11 +415,11 @@
413 #
414 $(SRCDIR)/../manifest:
415 # noop
416
417 clean:
418 rm -rf $(OBJDIR)/* $(APPNAME)
419
420 }
421
422 set mhargs {}
423 foreach s [lsort $src] {
@@ -427,12 +429,12 @@
427 append mhargs "\$(SRCDIR)/sqlite3.h <<<NEXT_LINE>>>"
428 append mhargs "\$(SRCDIR)/th.h <<<NEXT_LINE>>>"
429 #append mhargs "\$(SRCDIR)/cson_amalgamation.h <<<NEXT_LINE>>>"
430 append mhargs "\$(OBJDIR)/VERSION.h"
431 set mhargs [string map [list <<<NEXT_LINE>>> \\\n\t] $mhargs]
432 writeln "\$(OBJDIR)/page_index.h: \$(TRANS_SRC) \$(OBJDIR)/mkindex"
433 writeln "\t\$(OBJDIR)/mkindex \$(TRANS_SRC) >\$@\n"
434
435 writeln "\$(OBJDIR)/builtin_data.h: \$(OBJDIR)/mkbuiltin \$(EXTRA_FILES)"
436 writeln "\t\$(OBJDIR)/mkbuiltin --prefix \$(SRCDIR)/ \$(EXTRA_FILES) >\$@\n"
437
438 writeln "\$(OBJDIR)/headers:\t\$(OBJDIR)/page_index.h \$(OBJDIR)/builtin_data.h \$(OBJDIR)/makeheaders \$(OBJDIR)/VERSION.h"
439
--- src/makemake.tcl
+++ src/makemake.tcl
@@ -281,16 +281,18 @@
281 writeln -nonewline " \\\n \$(OBJDIR)/$s.o"
282 }
283 writeln "\n"
284 writeln "APPNAME = $name\$(E)"
285 writeln "\n"
286 writeln "COMPNAME = completion.sh"
287 writeln "\n"
288
289 writeln [string map [list \
290 <<<SQLITE_OPTIONS>>> [join $SQLITE_OPTIONS " \\\n "] \
291 <<<SHELL_OPTIONS>>> [join $SHELL_OPTIONS " \\\n "] \
292 <<<MINIZ_OPTIONS>>> [join $MINIZ_OPTIONS " \\\n "]] {
293 all: $(OBJDIR) $(APPNAME) $(COMPNAME)
294
295 install: $(APPNAME)
296 mkdir -p $(INSTALLDIR)
297 mv $(APPNAME) $(INSTALLDIR)
298
@@ -413,11 +415,11 @@
415 #
416 $(SRCDIR)/../manifest:
417 # noop
418
419 clean:
420 rm -rf $(OBJDIR)/* $(APPNAME) $(COMPNAME)
421
422 }
423
424 set mhargs {}
425 foreach s [lsort $src] {
@@ -427,12 +429,12 @@
429 append mhargs "\$(SRCDIR)/sqlite3.h <<<NEXT_LINE>>>"
430 append mhargs "\$(SRCDIR)/th.h <<<NEXT_LINE>>>"
431 #append mhargs "\$(SRCDIR)/cson_amalgamation.h <<<NEXT_LINE>>>"
432 append mhargs "\$(OBJDIR)/VERSION.h"
433 set mhargs [string map [list <<<NEXT_LINE>>> \\\n\t] $mhargs]
434 writeln "\$(OBJDIR)/page_index.h \$(COMPNAME): \$(TRANS_SRC) \$(OBJDIR)/mkindex"
435 writeln "\t\$(OBJDIR)/mkindex --compfile \$(COMPNAME) \$(TRANS_SRC) >\$(OBJDIR)/page_index.h\n"
436
437 writeln "\$(OBJDIR)/builtin_data.h: \$(OBJDIR)/mkbuiltin \$(EXTRA_FILES)"
438 writeln "\t\$(OBJDIR)/mkbuiltin --prefix \$(SRCDIR)/ \$(EXTRA_FILES) >\$@\n"
439
440 writeln "\$(OBJDIR)/headers:\t\$(OBJDIR)/page_index.h \$(OBJDIR)/builtin_data.h \$(OBJDIR)/makeheaders \$(OBJDIR)/VERSION.h"
441
+67 -2
--- src/mkindex.c
+++ src/mkindex.c
@@ -130,10 +130,15 @@
130130
/*
131131
** Number of errors
132132
*/
133133
int nErr = 0;
134134
135
+/*
136
+** File name for completion bash script
137
+*/
138
+char *zComp;
139
+
135140
/*
136141
** Duplicate N characters of a string.
137142
*/
138143
char *string_dup(const char *zSrc, int n){
139144
char *z;
@@ -315,24 +320,36 @@
315320
}
316321
317322
/*
318323
** Compare two entries
319324
*/
320
-int e_compare(const void *a, const void *b){
325
+int e_compare_path(const void *a, const void *b){
321326
const Entry *pA = (const Entry*)a;
322327
const Entry *pB = (const Entry*)b;
323328
return strcmp(pA->zPath, pB->zPath);
324329
}
330
+
331
+/*
332
+** Compare two entries by type
333
+*/
334
+int e_compare_type(const void *a, const void *b){
335
+ const Entry *pA = (const Entry*)a;
336
+ const Entry *pB = (const Entry*)b;
337
+ if( pA->eType < pB->eType ) return -1;
338
+ if( pA->eType > pB->eType ) return 1;
339
+ return 0;
340
+}
325341
326342
/*
327343
** Build the binary search table.
328344
*/
329345
void build_table(void){
330346
int i;
331347
int nWeb = 0;
348
+ FILE *comp;
332349
333
- qsort(aEntry, nFixed, sizeof(aEntry[0]), e_compare);
350
+ qsort(aEntry, nFixed, sizeof(aEntry[0]), e_compare_path);
334351
335352
printf(
336353
"/* Automatically generated code\n"
337354
"** DO NOT EDIT!\n"
338355
"**\n"
@@ -388,10 +405,51 @@
388405
);
389406
if( aEntry[i].zIf ) printf("#endif\n");
390407
}
391408
printf("};\n");
392409
printf("#define FOSSIL_FIRST_CMD %d\n", nWeb);
410
+
411
+ /* Generate bash completion script */
412
+ comp = fopen(zComp, "w");
413
+ if( comp==0 ){
414
+ fprintf(stderr,"%s: cannot open completion script file\n", zComp);
415
+ }else{
416
+ qsort(aEntry, nFixed, sizeof(aEntry[0]), e_compare_type);
417
+
418
+ fprintf(comp,
419
+ "_fossil_comp(){\n"
420
+ "local cur opts1 opts2\n"
421
+ "COMPREPLY=()\n"
422
+ "cur=\"${COMP_WORDS[COMP_CWORD]}\"\n"
423
+ );
424
+ fprintf(comp, "opts1=\"");
425
+ for(i=nWeb+1;
426
+ i<nFixed && aEntry[i].eType==(CMDFLAG_COMMAND|CMDFLAG_1ST_TIER);
427
+ i++)
428
+ {
429
+ fprintf(comp, "%s ", aEntry[i].zPath);
430
+ }
431
+ fprintf(comp, "\"\n");
432
+ fprintf(comp, "opts2=\"");
433
+ for( ;
434
+ i<nFixed && aEntry[i].eType==(CMDFLAG_COMMAND|CMDFLAG_2ND_TIER);
435
+ i++)
436
+ {
437
+ fprintf(comp, "%s ", aEntry[i].zPath);
438
+ }
439
+ fprintf(comp, "\"\n");
440
+ fprintf(comp,
441
+ "COMPREPLY=($(compgen -W \"${opts1}\" -- ${cur}))\n"
442
+ "if [ ${#COMPREPLY[@]} -eq 0 ]; then\n"
443
+ "COMPREPLY=($(compgen -W \"${opts2}\" -- ${cur}))\n"
444
+ "fi\n"
445
+ "return 0\n"
446
+ "}\n"
447
+ "complete -F _fossil_comp fossil"
448
+ );
449
+ fclose(comp);
450
+ }
393451
}
394452
395453
/*
396454
** Process a single file of input
397455
*/
@@ -415,11 +473,18 @@
415473
}
416474
417475
int main(int argc, char **argv){
418476
int i;
419477
for(i=1; i<argc; i++){
478
+ if( argv[i][0]=='-' && strcmp(argv[i], "--compfile")==0 ){
479
+ if( ++i < argc ){
480
+ zComp = argv[i];
481
+ }else{
482
+ fprintf(stderr,"no file name supplied to --compfile\n");
483
+ }
484
+ }
420485
zFile = argv[i];
421486
process_file();
422487
}
423488
build_table();
424489
return nErr;
425490
}
426491
--- src/mkindex.c
+++ src/mkindex.c
@@ -130,10 +130,15 @@
130 /*
131 ** Number of errors
132 */
133 int nErr = 0;
134
 
 
 
 
 
135 /*
136 ** Duplicate N characters of a string.
137 */
138 char *string_dup(const char *zSrc, int n){
139 char *z;
@@ -315,24 +320,36 @@
315 }
316
317 /*
318 ** Compare two entries
319 */
320 int e_compare(const void *a, const void *b){
321 const Entry *pA = (const Entry*)a;
322 const Entry *pB = (const Entry*)b;
323 return strcmp(pA->zPath, pB->zPath);
324 }
 
 
 
 
 
 
 
 
 
 
 
325
326 /*
327 ** Build the binary search table.
328 */
329 void build_table(void){
330 int i;
331 int nWeb = 0;
 
332
333 qsort(aEntry, nFixed, sizeof(aEntry[0]), e_compare);
334
335 printf(
336 "/* Automatically generated code\n"
337 "** DO NOT EDIT!\n"
338 "**\n"
@@ -388,10 +405,51 @@
388 );
389 if( aEntry[i].zIf ) printf("#endif\n");
390 }
391 printf("};\n");
392 printf("#define FOSSIL_FIRST_CMD %d\n", nWeb);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
393 }
394
395 /*
396 ** Process a single file of input
397 */
@@ -415,11 +473,18 @@
415 }
416
417 int main(int argc, char **argv){
418 int i;
419 for(i=1; i<argc; i++){
 
 
 
 
 
 
 
420 zFile = argv[i];
421 process_file();
422 }
423 build_table();
424 return nErr;
425 }
426
--- src/mkindex.c
+++ src/mkindex.c
@@ -130,10 +130,15 @@
130 /*
131 ** Number of errors
132 */
133 int nErr = 0;
134
135 /*
136 ** File name for completion bash script
137 */
138 char *zComp;
139
140 /*
141 ** Duplicate N characters of a string.
142 */
143 char *string_dup(const char *zSrc, int n){
144 char *z;
@@ -315,24 +320,36 @@
320 }
321
322 /*
323 ** Compare two entries
324 */
325 int e_compare_path(const void *a, const void *b){
326 const Entry *pA = (const Entry*)a;
327 const Entry *pB = (const Entry*)b;
328 return strcmp(pA->zPath, pB->zPath);
329 }
330
331 /*
332 ** Compare two entries by type
333 */
334 int e_compare_type(const void *a, const void *b){
335 const Entry *pA = (const Entry*)a;
336 const Entry *pB = (const Entry*)b;
337 if( pA->eType < pB->eType ) return -1;
338 if( pA->eType > pB->eType ) return 1;
339 return 0;
340 }
341
342 /*
343 ** Build the binary search table.
344 */
345 void build_table(void){
346 int i;
347 int nWeb = 0;
348 FILE *comp;
349
350 qsort(aEntry, nFixed, sizeof(aEntry[0]), e_compare_path);
351
352 printf(
353 "/* Automatically generated code\n"
354 "** DO NOT EDIT!\n"
355 "**\n"
@@ -388,10 +405,51 @@
405 );
406 if( aEntry[i].zIf ) printf("#endif\n");
407 }
408 printf("};\n");
409 printf("#define FOSSIL_FIRST_CMD %d\n", nWeb);
410
411 /* Generate bash completion script */
412 comp = fopen(zComp, "w");
413 if( comp==0 ){
414 fprintf(stderr,"%s: cannot open completion script file\n", zComp);
415 }else{
416 qsort(aEntry, nFixed, sizeof(aEntry[0]), e_compare_type);
417
418 fprintf(comp,
419 "_fossil_comp(){\n"
420 "local cur opts1 opts2\n"
421 "COMPREPLY=()\n"
422 "cur=\"${COMP_WORDS[COMP_CWORD]}\"\n"
423 );
424 fprintf(comp, "opts1=\"");
425 for(i=nWeb+1;
426 i<nFixed && aEntry[i].eType==(CMDFLAG_COMMAND|CMDFLAG_1ST_TIER);
427 i++)
428 {
429 fprintf(comp, "%s ", aEntry[i].zPath);
430 }
431 fprintf(comp, "\"\n");
432 fprintf(comp, "opts2=\"");
433 for( ;
434 i<nFixed && aEntry[i].eType==(CMDFLAG_COMMAND|CMDFLAG_2ND_TIER);
435 i++)
436 {
437 fprintf(comp, "%s ", aEntry[i].zPath);
438 }
439 fprintf(comp, "\"\n");
440 fprintf(comp,
441 "COMPREPLY=($(compgen -W \"${opts1}\" -- ${cur}))\n"
442 "if [ ${#COMPREPLY[@]} -eq 0 ]; then\n"
443 "COMPREPLY=($(compgen -W \"${opts2}\" -- ${cur}))\n"
444 "fi\n"
445 "return 0\n"
446 "}\n"
447 "complete -F _fossil_comp fossil"
448 );
449 fclose(comp);
450 }
451 }
452
453 /*
454 ** Process a single file of input
455 */
@@ -415,11 +473,18 @@
473 }
474
475 int main(int argc, char **argv){
476 int i;
477 for(i=1; i<argc; i++){
478 if( argv[i][0]=='-' && strcmp(argv[i], "--compfile")==0 ){
479 if( ++i < argc ){
480 zComp = argv[i];
481 }else{
482 fprintf(stderr,"no file name supplied to --compfile\n");
483 }
484 }
485 zFile = argv[i];
486 process_file();
487 }
488 build_table();
489 return nErr;
490 }
491

Keyboard Shortcuts

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