JavaScript minification was added to the git build system, but it was a hidden away feature that did not play by all the rules and broke instaweb when minifying was enabled. This patch fixes instaweb support and adds rules to the build system to take care of minified files; this includes an autoconfigure option so that users do not need to edit the makefiles directly, as well as documentation updates related to gitweb.js and optional minify support. This patch also adds support to minify gitweb.css, the effect is not as dramatic as minifying gitweb.js, but every saved byte of bandwidth helps. Signed-off-by: Mark Rada <marada@xxxxxxxxxxxx> --- Changes since v3: - Patch wouldn't apply because it depended on another patch I sent in that has not yet been applied. Junio wondered if part of that patch belonged here (or vice versa?), which at the time did not seem right to me, but now that this patch has grown, it does---Ignore the patch titled "instaweb: use minified gitweb.js if available", it is squashed in here now - Changed some the INSTALL updates to be less wordy - The patch became more broad, to support minification in general, which includes gitweb.css .gitignore | 1 + Makefile | 33 ++++++++++++++++++++++----------- configure.ac | 20 ++++++++++++++++++++ git-instaweb.sh | 6 ++++-- gitweb/INSTALL | 30 +++++++++++++++++++++--------- gitweb/Makefile | 31 +++++++++++++++++-------------- gitweb/README | 3 ++- 7 files changed, 87 insertions(+), 37 deletions(-) diff --git a/.gitignore b/.gitignore index 7b3acb7..4c24152 100644 --- a/.gitignore +++ b/.gitignore @@ -156,6 +156,7 @@ /git-core-*/?* /gitk-git/gitk-wish /gitweb/gitweb.cgi +/gitweb/gitweb.min.* /test-chmtime /test-ctype /test-date diff --git a/Makefile b/Makefile index 7c616f8..19c7ef0 100644 --- a/Makefile +++ b/Makefile @@ -203,6 +203,9 @@ all:: # Define JSMIN to point to JavaScript minifier that functions as # a filter to have gitweb.js minified. # +# Define CSSMIN to point to a CSS minifier that performs the same +# function as a JavaScript minifier, but for CSS files. +# # Define DEFAULT_PAGER to a sensible pager command (defaults to "less") if # you want to use something different. The value will be interpreted by the # shell at runtime when it is used. @@ -279,8 +282,6 @@ lib = lib # DESTDIR= pathsep = : -# JavaScript minifier invocation that can function as filter -JSMIN = export prefix bindir sharedir sysconfdir @@ -1551,19 +1552,27 @@ gitweb: $(QUIET_SUBDIR0)gitweb $(QUIET_SUBDIR1) all ifdef JSMIN -OTHER_PROGRAMS += gitweb/gitweb.cgi gitweb/gitweb.min.js -gitweb/gitweb.cgi: gitweb/gitweb.perl gitweb/gitweb.min.js +GITWEB_JS=gitweb/gitweb.min.js +else +GITWEB_JS=gitweb/gitweb.js +endif + +ifdef CSSMIN +GITWEB_CSS=gitweb/gitweb.min.css else -OTHER_PROGRAMS += gitweb/gitweb.cgi -gitweb/gitweb.cgi: gitweb/gitweb.perl +GITWEB_CSS=gitweb/gitweb.css endif + +OTHER_PROGRAMS += gitweb/gitweb.cgi $(GITWEB_JS) $(GITWEB_CSS) + +gitweb/gitweb.cgi: gitweb/gitweb.perl $(GITWEB_JS) $(GITWEB_CSS) $(QUIET_SUBDIR0)gitweb $(QUIET_SUBDIR1) $(patsubst gitweb/%,%,$@) -ifdef JSMIN gitweb/gitweb.min.js: gitweb/gitweb.js $(QUIET_SUBDIR0)gitweb $(QUIET_SUBDIR1) $(patsubst gitweb/%,%,$@) -endif # JSMIN +gitweb/gitweb.min.css: gitweb/gitweb.css + $(QUIET_SUBDIR0)gitweb $(QUIET_SUBDIR1) $(patsubst gitweb/%,%,$@) git-instaweb: git-instaweb.sh gitweb/gitweb.cgi gitweb/gitweb.css gitweb/gitweb.js $(QUIET_GEN)$(RM) $@ $@+ && \ @@ -1572,10 +1581,12 @@ git-instaweb: git-instaweb.sh gitweb/gitweb.cgi gitweb/gitweb.css gitweb/gitweb. -e 's/@@NO_CURL@@/$(NO_CURL)/g' \ -e '/@@GITWEB_CGI@@/r gitweb/gitweb.cgi' \ -e '/@@GITWEB_CGI@@/d' \ - -e '/@@GITWEB_CSS@@/r gitweb/gitweb.css' \ + -e '/@@GITWEB_CSS@@/r $(GITWEB_CSS)' \ -e '/@@GITWEB_CSS@@/d' \ - -e '/@@GITWEB_JS@@/r gitweb/gitweb.js' \ + -e '/@@GITWEB_JS@@/r $(GITWEB_JS)' \ -e '/@@GITWEB_JS@@/d' \ + -e 's|@@GITWEB_JS_NAME@@|$(GITWEB_JS)|' \ + -e 's|@@GITWEB_CSS_NAME@@|$(GITWEB_CSS)|' \ -e 's|@@PERL@@|$(PERL_PATH_SQ)|g' \ $@.sh > $@+ && \ chmod +x $@+ && \ @@ -2076,7 +2087,7 @@ clean: $(RM) $(htmldocs).tar.gz $(manpages).tar.gz $(MAKE) -C Documentation/ clean ifndef NO_PERL - $(RM) gitweb/gitweb.cgi + $(RM) gitweb/{gitweb.cgi,gitweb.min.*} $(MAKE) -C perl clean endif ifndef NO_PYTHON diff --git a/configure.ac b/configure.ac index 914ae57..cc7df85 100644 --- a/configure.ac +++ b/configure.ac @@ -179,6 +179,26 @@ fi], AC_MSG_NOTICE([Will try -pthread then -lpthread to enable POSIX Threads.]) ]) +# Define option to enable JavaScript minification +AC_ARG_ENABLE([jsmin], + [AS_HELP_STRING([--enable-jsmin=ARG], + [ARG is the value to pass to make to enable JavaScript minification.])], + [ + JSMIN=$enableval; + AC_MSG_NOTICE([Setting JSMIN to '$JSMIN' to enable JavaScript minifying]) + GIT_CONF_APPEND_LINE(JSMIN=$enableval); + ]) + + # Define option to enable CSS minification +AC_ARG_ENABLE([cssmin], + [AS_HELP_STRING([--enable-cssmin=ARG], + [ARG is the value to pass to make to enable CSS minification.])], + [ + CSSMIN=$enableval; + AC_MSG_NOTICE([Setting CSSMIN to '$CSSMIN' to enable CSS minifying]) + GIT_CONF_APPEND_LINE(CSSMIN=$enableval); + ]) + ## Site configuration (override autodetection) ## --with-PACKAGE[=ARG] and --without-PACKAGE AC_MSG_NOTICE([CHECKS for site configuration]) diff --git a/git-instaweb.sh b/git-instaweb.sh index 6a65f25..d4941a9 100755 --- a/git-instaweb.sh +++ b/git-instaweb.sh @@ -391,18 +391,20 @@ EOFGITWEB gitweb_css () { cat > "$1" <<\EOFGITWEB @@GITWEB_CSS@@ + EOFGITWEB } gitweb_js () { cat > "$1" <<\EOFGITWEB @@GITWEB_JS@@ + EOFGITWEB } gitweb_cgi "$GIT_DIR/gitweb/gitweb.cgi" -gitweb_css "$GIT_DIR/gitweb/gitweb.css" -gitweb_js "$GIT_DIR/gitweb/gitweb.js" +gitweb_css "$GIT_DIR/@@GITWEB_CSS_NAME@@" +gitweb_js "$GIT_DIR/@@GITWEB_JS_NAME@@" case "$httpd" in *lighttpd*) diff --git a/gitweb/INSTALL b/gitweb/INSTALL index b76a0cf..01ee62c 100644 --- a/gitweb/INSTALL +++ b/gitweb/INSTALL @@ -2,11 +2,11 @@ GIT web Interface (gitweb) Installation ======================================= First you have to generate gitweb.cgi from gitweb.perl using -"make gitweb/gitweb.cgi", then copy appropriate files (gitweb.cgi, -gitweb.css, git-logo.png and git-favicon.png) to their destination. +"make gitweb", then copy appropriate files (gitweb.cgi, gitweb.js, +gitweb.css, git-logo.png and git-favicon.png) to to their destination. For example if git was (or is) installed with /usr prefix, you can do - $ make prefix=/usr gitweb/gitweb.cgi ;# as yourself + $ make prefix=/usr gitweb ;# as yourself # cp gitweb/git* /var/www/cgi-bin/ ;# as root Alternatively you can use autoconf generated ./configure script to @@ -15,7 +15,7 @@ instead $ make configure ;# as yourself $ ./configure --prefix=/usr ;# as yourself - $ make gitweb/gitweb.cgi ;# as yourself + $ make gitweb ;# as yourself # cp gitweb/git* /var/www/cgi-bin/ ;# as root The above example assumes that your web server is configured to run @@ -61,10 +61,21 @@ file for gitweb (in gitweb/README). projectroot linking to projectname/.git (but it is just a suggestion). -- You can control where gitweb tries to find its main CSS style file, - its favicon and logo with the GITWEB_CSS, GITWEB_FAVICON and GITWEB_LOGO - build configuration variables. By default gitweb tries to find them - in the same directory as gitweb.cgi script. +- You can control where gitweb tries to find its main JavaScript file, + CSS file, favicon and logo with the GITWEB_JS, GITWEB_CSS, + GITWEB_FAVICON and GITWEB_LOGO build configuration variables. By default + gitweb tries to find them in the same directory as gitweb.cgi script. + +- You can generate a minified version of gitweb.js and at build + time by setting the JSMIN variable to the full path of a JavaScript + minifier or using the --enable-jsmin=/PATH/TO/MINIFIER configure script + flag. NOTE: substitue gitweb.min.js for gitweb.js in the INSTALL + instructions if you choose to use this option. + +- A minified version of gitweb.css can also be generated by use of the + CSSMIN variable or the --enable-cssmin=/PATH/TO/MINIFIER configure + script flag. NOTE: substitute gitweb.min.css for gitweb.css in the + INSTALL instructions if you choose to use this option. Build example ~~~~~~~~~~~~~ @@ -74,13 +85,14 @@ Build example we want to display are under /home/local/scm, you can do make GITWEB_PROJECTROOT="/home/local/scm" \ + GITWEB_JS="/gitweb/gitweb.js" \ GITWEB_CSS="/gitweb/gitweb.css" \ GITWEB_LOGO="/gitweb/git-logo.png" \ GITWEB_FAVICON="/gitweb/git-favicon.png" \ bindir=/usr/local/bin \ gitweb/gitweb.cgi - cp -fv ~/git/gitweb/gitweb.{cgi,css} \ + cp -fv ~/git/gitweb/gitweb.{.js,cgi,css} \ ~/git/gitweb/git-{favicon,logo}.png \ /var/www/cgi-bin/gitweb/ diff --git a/gitweb/Makefile b/gitweb/Makefile index c9eb1ee..b6f379a 100644 --- a/gitweb/Makefile +++ b/gitweb/Makefile @@ -6,14 +6,14 @@ all:: # Define JSMIN to point to JavaScript minifier that functions as # a filter to have gitweb.js minified. # +# Define CSSMIN to point to a CSS minifier that performs the same +# function as a JavaScript minifier, but for CSS files. +# prefix ?= $(HOME) bindir ?= $(prefix)/bin RM ?= rm -f -# JavaScript minifier invocation that can function as filter -JSMIN ?= - # default configuration for gitweb GITWEB_CONFIG = gitweb_config.perl GITWEB_CONFIG_SYSTEM = /etc/gitweb.conf @@ -29,11 +29,7 @@ GITWEB_HOMETEXT = indextext.html GITWEB_CSS = gitweb.css GITWEB_LOGO = git-logo.png GITWEB_FAVICON = git-favicon.png -ifdef JSMIN -GITWEB_JS = gitweb.min.js -else GITWEB_JS = gitweb.js -endif GITWEB_SITE_HEADER = GITWEB_SITE_FOOTER = @@ -84,15 +80,17 @@ endif all:: gitweb.cgi +FILES=gitweb.cgi gitweb.min* + ifdef JSMIN -FILES=gitweb.cgi gitweb.min.js -gitweb.cgi: gitweb.perl gitweb.min.js -else # !JSMIN -FILES=gitweb.cgi -gitweb.cgi: gitweb.perl -endif # JSMIN +GITWEB_JS = gitweb.min.js +endif + +ifdef CSSMIN +GITWEB_CSS = gitweb.min.css +endif -gitweb.cgi: +gitweb.cgi: gitweb.perl $(GITWEB_JS) $(GITWEB_CSS) $(QUIET_GEN)$(RM) $@ $@+ && \ sed -e '1s|#!.*perl|#!$(PERL_PATH_SQ)|' \ -e 's|++GIT_VERSION++|$(GIT_VERSION)|g' \ @@ -123,6 +121,11 @@ gitweb.min.js: gitweb.js $(QUIET_GEN)$(JSMIN) <$< >$@ endif # JSMIN +ifdef CSSMIN +gitweb.min.css: gitweb.css + $(QUIET_GEN)$(CSSMIN) <$< >$@ +endif + clean: $(RM) $(FILES) diff --git a/gitweb/README b/gitweb/README index ad6a04c..0efa770 100644 --- a/gitweb/README +++ b/gitweb/README @@ -80,7 +80,8 @@ You can specify the following configuration variables when building GIT: Points to the location where you put gitweb.css on your web server (or to be more generic, the URI of gitweb stylesheet). Relative to the base URI of gitweb. Note that you can setup multiple stylesheets from - the gitweb config file. [Default: gitweb.css] + the gitweb config file. [Default: gitweb.css (or gitweb.min.css if + the CSSMIN build variable is defined / CSS minifier is used)] * GITWEB_LOGO Points to the location where you put git-logo.png on your web server (or to be more generic URI of logo, 72x27 size, displayed in top right -- 1.7.0.2.279.gf1ba1c -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html