Index: src/main.mk ================================================================== --- src/main.mk +++ src/main.mk @@ -438,12 +438,15 @@ $(OBJDIR)/zip.o APPNAME = fossil$(E) +COMPNAME = completion.sh -all: $(OBJDIR) $(APPNAME) + + +all: $(OBJDIR) $(APPNAME) $(COMPNAME) install: $(APPNAME) mkdir -p $(INSTALLDIR) mv $(APPNAME) $(INSTALLDIR) @@ -587,15 +590,15 @@ # $(SRCDIR)/../manifest: # noop clean: - rm -rf $(OBJDIR)/* $(APPNAME) + rm -rf $(OBJDIR)/* $(APPNAME) $(COMPNAME) -$(OBJDIR)/page_index.h: $(TRANS_SRC) $(OBJDIR)/mkindex - $(OBJDIR)/mkindex $(TRANS_SRC) >$@ +$(OBJDIR)/page_index.h $(COMPNAME): $(TRANS_SRC) $(OBJDIR)/mkindex + $(OBJDIR)/mkindex --compfile $(COMPNAME) $(TRANS_SRC) >$(OBJDIR)/page_index.h $(OBJDIR)/builtin_data.h: $(OBJDIR)/mkbuiltin $(EXTRA_FILES) $(OBJDIR)/mkbuiltin --prefix $(SRCDIR)/ $(EXTRA_FILES) >$@ $(OBJDIR)/headers: $(OBJDIR)/page_index.h $(OBJDIR)/builtin_data.h $(OBJDIR)/makeheaders $(OBJDIR)/VERSION.h Index: src/makemake.tcl ================================================================== --- src/makemake.tcl +++ src/makemake.tcl @@ -281,16 +281,18 @@ writeln -nonewline " \\\n \$(OBJDIR)/$s.o" } writeln "\n" writeln "APPNAME = $name\$(E)" writeln "\n" +writeln "COMPNAME = completion.sh" +writeln "\n" writeln [string map [list \ <<>> [join $SQLITE_OPTIONS " \\\n "] \ <<>> [join $SHELL_OPTIONS " \\\n "] \ <<>> [join $MINIZ_OPTIONS " \\\n "]] { -all: $(OBJDIR) $(APPNAME) +all: $(OBJDIR) $(APPNAME) $(COMPNAME) install: $(APPNAME) mkdir -p $(INSTALLDIR) mv $(APPNAME) $(INSTALLDIR) @@ -413,11 +415,11 @@ # $(SRCDIR)/../manifest: # noop clean: - rm -rf $(OBJDIR)/* $(APPNAME) + rm -rf $(OBJDIR)/* $(APPNAME) $(COMPNAME) } set mhargs {} foreach s [lsort $src] { @@ -427,12 +429,12 @@ append mhargs "\$(SRCDIR)/sqlite3.h <<>>" append mhargs "\$(SRCDIR)/th.h <<>>" #append mhargs "\$(SRCDIR)/cson_amalgamation.h <<>>" append mhargs "\$(OBJDIR)/VERSION.h" set mhargs [string map [list <<>> \\\n\t] $mhargs] -writeln "\$(OBJDIR)/page_index.h: \$(TRANS_SRC) \$(OBJDIR)/mkindex" -writeln "\t\$(OBJDIR)/mkindex \$(TRANS_SRC) >\$@\n" +writeln "\$(OBJDIR)/page_index.h \$(COMPNAME): \$(TRANS_SRC) \$(OBJDIR)/mkindex" +writeln "\t\$(OBJDIR)/mkindex --compfile \$(COMPNAME) \$(TRANS_SRC) >\$(OBJDIR)/page_index.h\n" writeln "\$(OBJDIR)/builtin_data.h: \$(OBJDIR)/mkbuiltin \$(EXTRA_FILES)" writeln "\t\$(OBJDIR)/mkbuiltin --prefix \$(SRCDIR)/ \$(EXTRA_FILES) >\$@\n" writeln "\$(OBJDIR)/headers:\t\$(OBJDIR)/page_index.h \$(OBJDIR)/builtin_data.h \$(OBJDIR)/makeheaders \$(OBJDIR)/VERSION.h" Index: src/mkindex.c ================================================================== --- src/mkindex.c +++ src/mkindex.c @@ -130,10 +130,15 @@ /* ** Number of errors */ int nErr = 0; +/* +** File name for completion bash script +*/ +char *zComp; + /* ** Duplicate N characters of a string. */ char *string_dup(const char *zSrc, int n){ char *z; @@ -315,24 +320,36 @@ } /* ** Compare two entries */ -int e_compare(const void *a, const void *b){ +int e_compare_path(const void *a, const void *b){ const Entry *pA = (const Entry*)a; const Entry *pB = (const Entry*)b; return strcmp(pA->zPath, pB->zPath); } + +/* +** Compare two entries by type +*/ +int e_compare_type(const void *a, const void *b){ + const Entry *pA = (const Entry*)a; + const Entry *pB = (const Entry*)b; + if( pA->eType < pB->eType ) return -1; + if( pA->eType > pB->eType ) return 1; + return 0; +} /* ** Build the binary search table. */ void build_table(void){ int i; int nWeb = 0; + FILE *comp; - qsort(aEntry, nFixed, sizeof(aEntry[0]), e_compare); + qsort(aEntry, nFixed, sizeof(aEntry[0]), e_compare_path); printf( "/* Automatically generated code\n" "** DO NOT EDIT!\n" "**\n" @@ -388,10 +405,51 @@ ); if( aEntry[i].zIf ) printf("#endif\n"); } printf("};\n"); printf("#define FOSSIL_FIRST_CMD %d\n", nWeb); + + /* Generate bash completion script */ + comp = fopen(zComp, "w"); + if( comp==0 ){ + fprintf(stderr,"%s: cannot open completion script file\n", zComp); + }else{ + qsort(aEntry, nFixed, sizeof(aEntry[0]), e_compare_type); + + fprintf(comp, + "_fossil_comp(){\n" + "local cur opts1 opts2\n" + "COMPREPLY=()\n" + "cur=\"${COMP_WORDS[COMP_CWORD]}\"\n" + ); + fprintf(comp, "opts1=\""); + for(i=nWeb+1; + i