Create Gitweb::Config module in 'gitweb/lib/Gitweb/Config.pm' to store all the configuration variables of the gitweb.perl script. Subroutines moved: evaluate_gitweb_config evaluate_git_version Subroutines yet to move: (Contains calls to not yet packaged subs) gitweb_get_feature gitweb_check_feature Update gitweb/Makefile to install gitweb modules alongside gitweb Signed-off-by: Pavan Kumar Sunkara <pavan.sss1991@xxxxxxxxx> --- This patch is based on branch 'pu' of alt-git.git gitweb/Makefile | 6 + gitweb/gitweb.perl | 421 +++---------------------------------------- gitweb/lib/Gitweb/Config.pm | 413 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 447 insertions(+), 393 deletions(-) create mode 100644 gitweb/lib/Gitweb/Config.pm diff --git a/gitweb/Makefile b/gitweb/Makefile index d2584fe..45e176e 100644 --- a/gitweb/Makefile +++ b/gitweb/Makefile @@ -55,6 +55,7 @@ PERL_PATH ?= /usr/bin/perl bindir_SQ = $(subst ','\'',$(bindir))#' gitwebdir_SQ = $(subst ','\'',$(gitwebdir))#' gitwebstaticdir_SQ = $(subst ','\'',$(gitwebdir)/static)#' +gitweblibdir_SQ = $(subst ','\'',$(gitwebdir)/lib)#' SHELL_PATH_SQ = $(subst ','\'',$(SHELL_PATH))#' PERL_PATH_SQ = $(subst ','\'',$(PERL_PATH))#' DESTDIR_SQ = $(subst ','\'',$(DESTDIR))#' @@ -110,6 +111,9 @@ endif GITWEB_FILES += static/git-logo.png static/git-favicon.png +# Files: gitweb/lib/Gitweb +GITWEB_LIB_GITWEB += lib/Gitweb/Config.pm + GITWEB_REPLACE = \ -e 's|++GIT_VERSION++|$(GIT_VERSION)|g' \ -e 's|++GIT_BINDIR++|$(bindir)|g' \ @@ -150,6 +154,8 @@ install: all $(INSTALL) -m 755 $(GITWEB_PROGRAMS) '$(DESTDIR_SQ)$(gitwebdir_SQ)' $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(gitwebstaticdir_SQ)' $(INSTALL) -m 644 $(GITWEB_FILES) '$(DESTDIR_SQ)$(gitwebstaticdir_SQ)' + $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(gitweblibdir_SQ)/Gitweb' + $(INSTALL) -m 644 $(GITWEB_LIB_GITWEB) '$(DESTDIR_SQ)$(gitweblibdir_SQ)/Gitweb' ### Cleaning rules diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl index 673e7a3..ef71656 100755 --- a/gitweb/gitweb.perl +++ b/gitweb/gitweb.perl @@ -16,19 +16,22 @@ use Encode; use Fcntl ':mode'; use File::Find qw(); use File::Basename qw(basename); +use File::Spec; binmode STDOUT, ':utf8'; -our $t0; -if (eval { require Time::HiRes; 1; }) { - $t0 = [Time::HiRes::gettimeofday()]; +# __DIR__ is taken from Dir::Self __DIR__ fragment +sub __DIR__ () { + File::Spec->rel2abs(join '', (File::Spec->splitpath(__FILE__))[0, 1]); } -our $number_of_git_cmds = 0; +use lib __DIR__ . "/lib"; + +use Gitweb::Config; BEGIN { CGI->compile() if $ENV{'MOD_PERL'}; } -our $version = "++GIT_VERSION++"; +$version = "++GIT_VERSION++"; our ($my_url, $my_uri, $base_url, $path_info, $home_link); sub evaluate_uri { @@ -68,402 +71,58 @@ sub evaluate_uri { # core git executable to use # this can just be "git" if your webserver has a sensible PATH -our $GIT = "++GIT_BINDIR++/git"; +$GIT = "++GIT_BINDIR++/git"; # absolute fs-path which will be prepended to the project path #our $projectroot = "/pub/scm"; -our $projectroot = "++GITWEB_PROJECTROOT++"; +$projectroot = "++GITWEB_PROJECTROOT++"; # fs traversing limit for getting project list # the number is relative to the projectroot -our $project_maxdepth = "++GITWEB_PROJECT_MAXDEPTH++"; +$project_maxdepth = "++GITWEB_PROJECT_MAXDEPTH++"; # string of the home link on top of all pages -our $home_link_str = "++GITWEB_HOME_LINK_STR++"; +$home_link_str = "++GITWEB_HOME_LINK_STR++"; # name of your site or organization to appear in page titles # replace this with something more descriptive for clearer bookmarks -our $site_name = "++GITWEB_SITENAME++" +$site_name = "++GITWEB_SITENAME++" || ($ENV{'SERVER_NAME'} || "Untitled") . " Git"; # filename of html text to include at top of each page -our $site_header = "++GITWEB_SITE_HEADER++"; +$site_header = "++GITWEB_SITE_HEADER++"; # html text to include at home page -our $home_text = "++GITWEB_HOMETEXT++"; +$home_text = "++GITWEB_HOMETEXT++"; # filename of html text to include at bottom of each page -our $site_footer = "++GITWEB_SITE_FOOTER++"; +$site_footer = "++GITWEB_SITE_FOOTER++"; # URI of stylesheets -our @stylesheets = ("++GITWEB_CSS++"); +@stylesheets = ("++GITWEB_CSS++"); # URI of a single stylesheet, which can be overridden in GITWEB_CONFIG. -our $stylesheet = undef; +$stylesheet = undef; # URI of GIT logo (72x27 size) -our $logo = "++GITWEB_LOGO++"; +$logo = "++GITWEB_LOGO++"; # URI of GIT favicon, assumed to be image/png type -our $favicon = "++GITWEB_FAVICON++"; +$favicon = "++GITWEB_FAVICON++"; # URI of gitweb.js (JavaScript code for gitweb) -our $javascript = "++GITWEB_JS++"; - -# URI and label (title) of GIT logo link -#our $logo_url = "http://www.kernel.org/pub/software/scm/git/docs/"; -#our $logo_label = "git documentation"; -our $logo_url = "http://git-scm.com/"; -our $logo_label = "git homepage"; +$javascript = "++GITWEB_JS++"; # source of projects list -our $projects_list = "++GITWEB_LIST++"; - -# the width (in characters) of the projects list "Description" column -our $projects_list_description_width = 25; - -# default order of projects list -# valid values are none, project, descr, owner, and age -our $default_projects_order = "project"; +$projects_list = "++GITWEB_LIST++"; # show repository only if this file exists # (only effective if this variable evaluates to true) -our $export_ok = "++GITWEB_EXPORT_OK++"; - -# show repository only if this subroutine returns true -# when given the path to the project, for example: -# sub { return -e "$_[0]/git-daemon-export-ok"; } -our $export_auth_hook = undef; +$export_ok = "++GITWEB_EXPORT_OK++"; # only allow viewing of repositories also shown on the overview page -our $strict_export = "++GITWEB_STRICT_EXPORT++"; +$strict_export = "++GITWEB_STRICT_EXPORT++"; # list of git base URLs used for URL to where fetch project from, # i.e. full URL is "$git_base_url/$project" -our @git_base_url_list = grep { $_ ne '' } ("++GITWEB_BASE_URL++"); - -# default blob_plain mimetype and default charset for text/plain blob -our $default_blob_plain_mimetype = 'text/plain'; -our $default_text_plain_charset = undef; - -# file to use for guessing MIME types before trying /etc/mime.types -# (relative to the current git repository) -our $mimetypes_file = undef; - -# assume this charset if line contains non-UTF-8 characters; -# it should be valid encoding (see Encoding::Supported(3pm) for list), -# for which encoding all byte sequences are valid, for example -# 'iso-8859-1' aka 'latin1' (it is decoded without checking, so it -# could be even 'utf-8' for the old behavior) -our $fallback_encoding = 'latin1'; - -# rename detection options for git-diff and git-diff-tree -# - default is '-M', with the cost proportional to -# (number of removed files) * (number of new files). -# - more costly is '-C' (which implies '-M'), with the cost proportional to -# (number of changed files + number of removed files) * (number of new files) -# - even more costly is '-C', '--find-copies-harder' with cost -# (number of files in the original tree) * (number of new files) -# - one might want to include '-B' option, e.g. '-B', '-M' -our @diff_opts = ('-M'); # taken from git_commit - -# Disables features that would allow repository owners to inject script into -# the gitweb domain. -our $prevent_xss = 0; - -# information about snapshot formats that gitweb is capable of serving -our %known_snapshot_formats = ( - # name => { - # 'display' => display name, - # 'type' => mime type, - # 'suffix' => filename suffix, - # 'format' => --format for git-archive, - # 'compressor' => [compressor command and arguments] - # (array reference, optional) - # 'disabled' => boolean (optional)} - # - 'tgz' => { - 'display' => 'tar.gz', - 'type' => 'application/x-gzip', - 'suffix' => '.tar.gz', - 'format' => 'tar', - 'compressor' => ['gzip']}, - - 'tbz2' => { - 'display' => 'tar.bz2', - 'type' => 'application/x-bzip2', - 'suffix' => '.tar.bz2', - 'format' => 'tar', - 'compressor' => ['bzip2']}, - - 'txz' => { - 'display' => 'tar.xz', - 'type' => 'application/x-xz', - 'suffix' => '.tar.xz', - 'format' => 'tar', - 'compressor' => ['xz'], - 'disabled' => 1}, - - 'zip' => { - 'display' => 'zip', - 'type' => 'application/x-zip', - 'suffix' => '.zip', - 'format' => 'zip'}, -); +@git_base_url_list = grep { $_ ne '' } ("++GITWEB_BASE_URL++"); -# Aliases so we understand old gitweb.snapshot values in repository -# configuration. -our %known_snapshot_format_aliases = ( - 'gzip' => 'tgz', - 'bzip2' => 'tbz2', - 'xz' => 'txz', - - # backward compatibility: legacy gitweb config support - 'x-gzip' => undef, 'gz' => undef, - 'x-bzip2' => undef, 'bz2' => undef, - 'x-zip' => undef, '' => undef, -); - -# Pixel sizes for icons and avatars. If the default font sizes or lineheights -# are changed, it may be appropriate to change these values too via -# $GITWEB_CONFIG. -our %avatar_size = ( - 'default' => 16, - 'double' => 32 -); - -# Used to set the maximum load that we will still respond to gitweb queries. -# If server load exceed this value then return "503 server busy" error. -# If gitweb cannot determined server load, it is taken to be 0. -# Leave it undefined (or set to 'undef') to turn off load checking. -our $maxload = 300; - -# You define site-wide feature defaults here; override them with -# $GITWEB_CONFIG as necessary. -our %feature = ( - # feature => { - # 'sub' => feature-sub (subroutine), - # 'override' => allow-override (boolean), - # 'default' => [ default options...] (array reference)} - # - # if feature is overridable (it means that allow-override has true value), - # then feature-sub will be called with default options as parameters; - # return value of feature-sub indicates if to enable specified feature - # - # if there is no 'sub' key (no feature-sub), then feature cannot be - # overriden - # - # use gitweb_get_feature(<feature>) to retrieve the <feature> value - # (an array) or gitweb_check_feature(<feature>) to check if <feature> - # is enabled - - # Enable the 'blame' blob view, showing the last commit that modified - # each line in the file. This can be very CPU-intensive. - - # To enable system wide have in $GITWEB_CONFIG - # $feature{'blame'}{'default'} = [1]; - # To have project specific config enable override in $GITWEB_CONFIG - # $feature{'blame'}{'override'} = 1; - # and in project config gitweb.blame = 0|1; - 'blame' => { - 'sub' => sub { feature_bool('blame', @_) }, - 'override' => 0, - 'default' => [0]}, - - # Enable the 'snapshot' link, providing a compressed archive of any - # tree. This can potentially generate high traffic if you have large - # project. - - # Value is a list of formats defined in %known_snapshot_formats that - # you wish to offer. - # To disable system wide have in $GITWEB_CONFIG - # $feature{'snapshot'}{'default'} = []; - # To have project specific config enable override in $GITWEB_CONFIG - # $feature{'snapshot'}{'override'} = 1; - # and in project config, a comma-separated list of formats or "none" - # to disable. Example: gitweb.snapshot = tbz2,zip; - 'snapshot' => { - 'sub' => \&feature_snapshot, - 'override' => 0, - 'default' => ['tgz']}, - - # Enable text search, which will list the commits which match author, - # committer or commit text to a given string. Enabled by default. - # Project specific override is not supported. - 'search' => { - 'override' => 0, - 'default' => [1]}, - - # Enable grep search, which will list the files in currently selected - # tree containing the given string. Enabled by default. This can be - # potentially CPU-intensive, of course. - - # To enable system wide have in $GITWEB_CONFIG - # $feature{'grep'}{'default'} = [1]; - # To have project specific config enable override in $GITWEB_CONFIG - # $feature{'grep'}{'override'} = 1; - # and in project config gitweb.grep = 0|1; - 'grep' => { - 'sub' => sub { feature_bool('grep', @_) }, - 'override' => 0, - 'default' => [1]}, - - # Enable the pickaxe search, which will list the commits that modified - # a given string in a file. This can be practical and quite faster - # alternative to 'blame', but still potentially CPU-intensive. - - # To enable system wide have in $GITWEB_CONFIG - # $feature{'pickaxe'}{'default'} = [1]; - # To have project specific config enable override in $GITWEB_CONFIG - # $feature{'pickaxe'}{'override'} = 1; - # and in project config gitweb.pickaxe = 0|1; - 'pickaxe' => { - 'sub' => sub { feature_bool('pickaxe', @_) }, - 'override' => 0, - 'default' => [1]}, - - # Enable showing size of blobs in a 'tree' view, in a separate - # column, similar to what 'ls -l' does. This cost a bit of IO. - - # To disable system wide have in $GITWEB_CONFIG - # $feature{'show-sizes'}{'default'} = [0]; - # To have project specific config enable override in $GITWEB_CONFIG - # $feature{'show-sizes'}{'override'} = 1; - # and in project config gitweb.showsizes = 0|1; - 'show-sizes' => { - 'sub' => sub { feature_bool('showsizes', @_) }, - 'override' => 0, - 'default' => [1]}, - - # Make gitweb use an alternative format of the URLs which can be - # more readable and natural-looking: project name is embedded - # directly in the path and the query string contains other - # auxiliary information. All gitweb installations recognize - # URL in either format; this configures in which formats gitweb - # generates links. - - # To enable system wide have in $GITWEB_CONFIG - # $feature{'pathinfo'}{'default'} = [1]; - # Project specific override is not supported. - - # Note that you will need to change the default location of CSS, - # favicon, logo and possibly other files to an absolute URL. Also, - # if gitweb.cgi serves as your indexfile, you will need to force - # $my_uri to contain the script name in your $GITWEB_CONFIG. - 'pathinfo' => { - 'override' => 0, - 'default' => [0]}, - - # Make gitweb consider projects in project root subdirectories - # to be forks of existing projects. Given project $projname.git, - # projects matching $projname/*.git will not be shown in the main - # projects list, instead a '+' mark will be added to $projname - # there and a 'forks' view will be enabled for the project, listing - # all the forks. If project list is taken from a file, forks have - # to be listed after the main project. - - # To enable system wide have in $GITWEB_CONFIG - # $feature{'forks'}{'default'} = [1]; - # Project specific override is not supported. - 'forks' => { - 'override' => 0, - 'default' => [0]}, - - # Insert custom links to the action bar of all project pages. - # This enables you mainly to link to third-party scripts integrating - # into gitweb; e.g. git-browser for graphical history representation - # or custom web-based repository administration interface. - - # The 'default' value consists of a list of triplets in the form - # (label, link, position) where position is the label after which - # to insert the link and link is a format string where %n expands - # to the project name, %f to the project path within the filesystem, - # %h to the current hash (h gitweb parameter) and %b to the current - # hash base (hb gitweb parameter); %% expands to %. - - # To enable system wide have in $GITWEB_CONFIG e.g. - # $feature{'actions'}{'default'} = [('graphiclog', - # '/git-browser/by-commit.html?r=%n', 'summary')]; - # Project specific override is not supported. - 'actions' => { - 'override' => 0, - 'default' => []}, - - # Allow gitweb scan project content tags described in ctags/ - # of project repository, and display the popular Web 2.0-ish - # "tag cloud" near the project list. Note that this is something - # COMPLETELY different from the normal Git tags. - - # gitweb by itself can show existing tags, but it does not handle - # tagging itself; you need an external application for that. - # For an example script, check Girocco's cgi/tagproj.cgi. - # You may want to install the HTML::TagCloud Perl module to get - # a pretty tag cloud instead of just a list of tags. - - # To enable system wide have in $GITWEB_CONFIG - # $feature{'ctags'}{'default'} = ['path_to_tag_script']; - # Project specific override is not supported. - 'ctags' => { - 'override' => 0, - 'default' => [0]}, - - # The maximum number of patches in a patchset generated in patch - # view. Set this to 0 or undef to disable patch view, or to a - # negative number to remove any limit. - - # To disable system wide have in $GITWEB_CONFIG - # $feature{'patches'}{'default'} = [0]; - # To have project specific config enable override in $GITWEB_CONFIG - # $feature{'patches'}{'override'} = 1; - # and in project config gitweb.patches = 0|n; - # where n is the maximum number of patches allowed in a patchset. - 'patches' => { - 'sub' => \&feature_patches, - 'override' => 0, - 'default' => [16]}, - - # Avatar support. When this feature is enabled, views such as - # shortlog or commit will display an avatar associated with - # the email of the committer(s) and/or author(s). - - # Currently available providers are gravatar and picon. - # If an unknown provider is specified, the feature is disabled. - - # Gravatar depends on Digest::MD5. - # Picon currently relies on the indiana.edu database. - - # To enable system wide have in $GITWEB_CONFIG - # $feature{'avatar'}{'default'} = ['<provider>']; - # where <provider> is either gravatar or picon. - # To have project specific config enable override in $GITWEB_CONFIG - # $feature{'avatar'}{'override'} = 1; - # and in project config gitweb.avatar = <provider>; - 'avatar' => { - 'sub' => \&feature_avatar, - 'override' => 0, - 'default' => ['']}, - - # Enable displaying how much time and how many git commands - # it took to generate and display page. Disabled by default. - # Project specific override is not supported. - 'timed' => { - 'override' => 0, - 'default' => [0]}, - - # Enable turning some links into links to actions which require - # JavaScript to run (like 'blame_incremental'). Not enabled by - # default. Project specific override is currently not supported. - 'javascript-actions' => { - 'override' => 0, - 'default' => [0]}, - - # Syntax highlighting support. This is based on Daniel Svensson's - # and Sham Chukoury's work in gitweb-xmms2.git. - # It requires the 'highlight' program present in $PATH, - # and therefore is disabled by default. - - # To enable system wide have in $GITWEB_CONFIG - # $feature{'highlight'}{'default'} = [1]; - - 'highlight' => { - 'sub' => sub { feature_bool('highlight', @_) }, - 'override' => 0, - 'default' => [0]}, -); +$GITWEB_CONFIG = $ENV{'GITWEB_CONFIG'} || "++GITWEB_CONFIG++"; +$GITWEB_CONFIG_SYSTEM = $ENV{'GITWEB_CONFIG_SYSTEM'} || "++GITWEB_CONFIG_SYSTEM++"; sub gitweb_get_feature { my ($name) = @_; @@ -571,20 +230,6 @@ sub filter_snapshot_fmts { !$known_snapshot_formats{$_}{'disabled'}} @fmts; } -our ($GITWEB_CONFIG, $GITWEB_CONFIG_SYSTEM); -sub evaluate_gitweb_config { - our $GITWEB_CONFIG = $ENV{'GITWEB_CONFIG'} || "++GITWEB_CONFIG++"; - our $GITWEB_CONFIG_SYSTEM = $ENV{'GITWEB_CONFIG_SYSTEM'} || "++GITWEB_CONFIG_SYSTEM++"; - # die if there are errors parsing config file - if (-e $GITWEB_CONFIG) { - do $GITWEB_CONFIG; - die $@ if $@; - } elsif (-e $GITWEB_CONFIG_SYSTEM) { - do $GITWEB_CONFIG_SYSTEM; - die $@ if $@; - } -} - # Get loadavg of system, to compare against $maxload. # Currently it requires '/proc/loadavg' present to get loadavg; # if it is not present it returns 0, which means no load checking. @@ -607,13 +252,6 @@ sub get_loadavg { return 0; } -# version of the core git binary -our $git_version; -sub evaluate_git_version { - our $git_version = qx("$GIT" --version) =~ m/git version (.*)$/ ? $1 : "unknown"; - $number_of_git_cmds++; -} - sub check_loadavg { if (defined $maxload && get_loadavg() > $maxload) { die_error(503, "The load average on the server is too high"); @@ -1028,7 +666,7 @@ sub dispatch { } sub run_request { - our $t0 = [Time::HiRes::gettimeofday()] + $t0 = [Time::HiRes::gettimeofday()] if defined $t0; evaluate_uri(); @@ -2555,9 +2193,6 @@ sub git_get_projects_list { follow_skip => 2, # ignore duplicates dangling_symlinks => 0, # ignore dangling symlinks, silently wanted => sub { - # global variables - our $project_maxdepth; - our $projectroot; # skip project-list toplevel, if we get it. return if (m!^[/.]$!); # only directories can be git repositories diff --git a/gitweb/lib/Gitweb/Config.pm b/gitweb/lib/Gitweb/Config.pm new file mode 100644 index 0000000..cb8efa5 --- /dev/null +++ b/gitweb/lib/Gitweb/Config.pm @@ -0,0 +1,413 @@ +#!/usr/bin/perl +# +# Gitweb::Config -- gitweb configuration package +# +# This program is licensed under the GPLv2 + +package Gitweb::Config; + +use strict; +use warnings; +use Exporter qw(import); + +our @ISA = qw(Exporter); +our @EXPORT = qw($t0 $number_of_git_cmds $GIT $version $git_version $projectroot $project_maxdepth + $projects_list @git_base_url_list $export_ok $strict_export $home_link_str $site_name + $site_header $site_footer $home_text @stylesheets $stylesheet $logo $favicon $javascript + $GITWEB_CONFIG $GITWEB_CONFIG_SYSTEM $logo_url $logo_label $default_projects_order + $projects_list_description_width $export_auth_hook $default_blob_plain_mimetype $mimetypes_file + $default_text_plain_charset $fallback_encoding @diff_opts $prevent_xss $maxload %avatar_size + %known_snapshot_formats %known_snapshot_format_aliases %feature &evaluate_gitweb_config + &evaluate_git_version); + +# Runtime variables +our $t0; +if (eval { require Time::HiRes; 1; }) { + $t0 = [Time::HiRes::gettimeofday()]; +} +our $number_of_git_cmds = 0; + +# The following variables are affected by build-time configuration +# and hence their initialisation is put in gitweb.perl script + +# core git executable path and versions +our ($GIT, $version, $git_version); + +# fs-path, fs traversing limit, source of projects list and git base URL +our ($projectroot, $project_maxdepth, $projects_list, @git_base_url_list); + +our ($export_ok, $strict_export); + +# Site configurations +our ($home_link_str, $site_name, $site_header, $site_footer, $home_text); + +# Stylesheet, logo and javascript +our (@stylesheets, $stylesheet, $logo, $favicon, $javascript); + +# gitweb config +our ($GITWEB_CONFIG, $GITWEB_CONFIG_SYSTEM); + +# URI and label (title) of GIT logo link +#our $logo_url = "http://www.kernel.org/pub/software/scm/git/docs/"; +#our $logo_label = "git documentation"; +our $logo_url = "http://git-scm.com/"; +our $logo_label = "git homepage"; + +# the width (in characters) of the projects list "Description" column +our $projects_list_description_width = 25; + +# default order of projects list +# valid values are none, project, descr, owner, and age +our $default_projects_order = "project"; + +# show repository only if this subroutine returns true +# when given the path to the project, for example: +# sub { return -e "$_[0]/git-daemon-export-ok"; } +our $export_auth_hook = undef; + +# default blob_plain mimetype and default charset for text/plain blob +our $default_blob_plain_mimetype = 'text/plain'; +our $default_text_plain_charset = undef; + +# file to use for guessing MIME types before trying /etc/mime.types +# (relative to the current git repository) +our $mimetypes_file = undef; + +# assume this charset if line contains non-UTF-8 characters; +# it should be valid encoding (see Encoding::Supported(3pm) for list), +# for which encoding all byte sequences are valid, for example +# 'iso-8859-1' aka 'latin1' (it is decoded without checking, so it +# could be even 'utf-8' for the old behavior) +our $fallback_encoding = 'latin1'; + +# rename detection options for git-diff and git-diff-tree +# - default is '-M', with the cost proportional to +# (number of removed files) * (number of new files). +# - more costly is '-C' (which implies '-M'), with the cost proportional to +# (number of changed files + number of removed files) * (number of new files) +# - even more costly is '-C', '--find-copies-harder' with cost +# (number of files in the original tree) * (number of new files) +# - one might want to include '-B' option, e.g. '-B', '-M' +our @diff_opts = ('-M'); # taken from git_commit + +# Disables features that would allow repository owners to inject script into +# the gitweb domain. +our $prevent_xss = 0; + +# information about snapshot formats that gitweb is capable of serving +our %known_snapshot_formats = ( + # name => { + # 'display' => display name, + # 'type' => mime type, + # 'suffix' => filename suffix, + # 'format' => --format for git-archive, + # 'compressor' => [compressor command and arguments] + # (array reference, optional) + # 'disabled' => boolean (optional)} + # + 'tgz' => { + 'display' => 'tar.gz', + 'type' => 'application/x-gzip', + 'suffix' => '.tar.gz', + 'format' => 'tar', + 'compressor' => ['gzip']}, + + 'tbz2' => { + 'display' => 'tar.bz2', + 'type' => 'application/x-bzip2', + 'suffix' => '.tar.bz2', + 'format' => 'tar', + 'compressor' => ['bzip2']}, + + 'txz' => { + 'display' => 'tar.xz', + 'type' => 'application/x-xz', + 'suffix' => '.tar.xz', + 'format' => 'tar', + 'compressor' => ['xz'], + 'disabled' => 1}, + + 'zip' => { + 'display' => 'zip', + 'type' => 'application/x-zip', + 'suffix' => '.zip', + 'format' => 'zip'}, +); + +# Aliases so we understand old gitweb.snapshot values in repository +# configuration. +our %known_snapshot_format_aliases = ( + 'gzip' => 'tgz', + 'bzip2' => 'tbz2', + 'xz' => 'txz', + + # backward compatibility: legacy gitweb config support + 'x-gzip' => undef, 'gz' => undef, + 'x-bzip2' => undef, 'bz2' => undef, + 'x-zip' => undef, '' => undef, +); + +# Pixel sizes for icons and avatars. If the default font sizes or lineheights +# are changed, it may be appropriate to change these values too via +# $GITWEB_CONFIG. +our %avatar_size = ( + 'default' => 16, + 'double' => 32 +); + +# Used to set the maximum load that we will still respond to gitweb queries. +# If server load exceed this value then return "503 server busy" error. +# If gitweb cannot determined server load, it is taken to be 0. +# Leave it undefined (or set to 'undef') to turn off load checking. +our $maxload = 300; + +# You define site-wide feature defaults here; override them with +# $GITWEB_CONFIG as necessary. +our %feature = ( + # feature => { + # 'sub' => feature-sub (subroutine), + # 'override' => allow-override (boolean), + # 'default' => [ default options...] (array reference)} + # + # if feature is overridable (it means that allow-override has true value), + # then feature-sub will be called with default options as parameters; + # return value of feature-sub indicates if to enable specified feature + # + # if there is no 'sub' key (no feature-sub), then feature cannot be + # overriden + # + # use gitweb_get_feature(<feature>) to retrieve the <feature> value + # (an array) or gitweb_check_feature(<feature>) to check if <feature> + # is enabled + + # Enable the 'blame' blob view, showing the last commit that modified + # each line in the file. This can be very CPU-intensive. + + # To enable system wide have in $GITWEB_CONFIG + # $feature{'blame'}{'default'} = [1]; + # To have project specific config enable override in $GITWEB_CONFIG + # $feature{'blame'}{'override'} = 1; + # and in project config gitweb.blame = 0|1; + 'blame' => { + 'sub' => sub { feature_bool('blame', @_) }, + 'override' => 0, + 'default' => [0]}, + + # Enable the 'snapshot' link, providing a compressed archive of any + # tree. This can potentially generate high traffic if you have large + # project. + + # Value is a list of formats defined in %Gitweb::Config::known_snapshot_formats that + # you wish to offer. + # To disable system wide have in $GITWEB_CONFIG + # $feature{'snapshot'}{'default'} = []; + # To have project specific config enable override in $GITWEB_CONFIG + # $feature{'snapshot'}{'override'} = 1; + # and in project config, a comma-separated list of formats or "none" + # to disable. Example: gitweb.snapshot = tbz2,zip; + 'snapshot' => { + 'sub' => \&feature_snapshot, + 'override' => 0, + 'default' => ['tgz']}, + + # Enable text search, which will list the commits which match author, + # committer or commit text to a given string. Enabled by default. + # Project specific override is not supported. + 'search' => { + 'override' => 0, + 'default' => [1]}, + + # Enable grep search, which will list the files in currently selected + # tree containing the given string. Enabled by default. This can be + # potentially CPU-intensive, of course. + + # To enable system wide have in $GITWEB_CONFIG + # $feature{'grep'}{'default'} = [1]; + # To have project specific config enable override in $GITWEB_CONFIG + # $feature{'grep'}{'override'} = 1; + # and in project config gitweb.grep = 0|1; + 'grep' => { + 'sub' => sub { feature_bool('grep', @_) }, + 'override' => 0, + 'default' => [1]}, + + # Enable the pickaxe search, which will list the commits that modified + # a given string in a file. This can be practical and quite faster + # alternative to 'blame', but still potentially CPU-intensive. + + # To enable system wide have in $GITWEB_CONFIG + # $feature{'pickaxe'}{'default'} = [1]; + # To have project specific config enable override in $GITWEB_CONFIG + # $feature{'pickaxe'}{'override'} = 1; + # and in project config gitweb.pickaxe = 0|1; + 'pickaxe' => { + 'sub' => sub { feature_bool('pickaxe', @_) }, + 'override' => 0, + 'default' => [1]}, + + # Enable showing size of blobs in a 'tree' view, in a separate + # column, similar to what 'ls -l' does. This cost a bit of IO. + + # To disable system wide have in $GITWEB_CONFIG + # $feature{'show-sizes'}{'default'} = [0]; + # To have project specific config enable override in $GITWEB_CONFIG + # $feature{'show-sizes'}{'override'} = 1; + # and in project config gitweb.showsizes = 0|1; + 'show-sizes' => { + 'sub' => sub { feature_bool('showsizes', @_) }, + 'override' => 0, + 'default' => [1]}, + + # Make gitweb use an alternative format of the URLs which can be + # more readable and natural-looking: project name is embedded + # directly in the path and the query string contains other + # auxiliary information. All gitweb installations recognize + # URL in either format; this configures in which formats gitweb + # generates links. + + # To enable system wide have in $GITWEB_CONFIG + # $feature{'pathinfo'}{'default'} = [1]; + # Project specific override is not supported. + + # Note that you will need to change the default location of CSS, + # favicon, logo and possibly other files to an absolute URL. Also, + # if gitweb.cgi serves as your indexfile, you will need to force + # $my_uri to contain the script name in your $GITWEB_CONFIG. + 'pathinfo' => { + 'override' => 0, + 'default' => [0]}, + + # Make gitweb consider projects in project root subdirectories + # to be forks of existing projects. Given project $projname.git, + # projects matching $projname/*.git will not be shown in the main + # projects list, instead a '+' mark will be added to $projname + # there and a 'forks' view will be enabled for the project, listing + # all the forks. If project list is taken from a file, forks have + # to be listed after the main project. + + # To enable system wide have in $GITWEB_CONFIG + # $feature{'forks'}{'default'} = [1]; + # Project specific override is not supported. + 'forks' => { + 'override' => 0, + 'default' => [0]}, + + # Insert custom links to the action bar of all project pages. + # This enables you mainly to link to third-party scripts integrating + # into gitweb; e.g. git-browser for graphical history representation + # or custom web-based repository administration interface. + + # The 'default' value consists of a list of triplets in the form + # (label, link, position) where position is the label after which + # to insert the link and link is a format string where %n expands + # to the project name, %f to the project path within the filesystem, + # %h to the current hash (h gitweb parameter) and %b to the current + # hash base (hb gitweb parameter); %% expands to %. + + # To enable system wide have in $GITWEB_CONFIG e.g. + # $feature{'actions'}{'default'} = [('graphiclog', + # '/git-browser/by-commit.html?r=%n', 'summary')]; + # Project specific override is not supported. + 'actions' => { + 'override' => 0, + 'default' => []}, + + # Allow gitweb scan project content tags described in ctags/ + # of project repository, and display the popular Web 2.0-ish + # "tag cloud" near the project list. Note that this is something + # COMPLETELY different from the normal Git tags. + + # gitweb by itself can show existing tags, but it does not handle + # tagging itself; you need an external application for that. + # For an example script, check Girocco's cgi/tagproj.cgi. + # You may want to install the HTML::TagCloud Perl module to get + # a pretty tag cloud instead of just a list of tags. + + # To enable system wide have in $GITWEB_CONFIG + # $feature{'ctags'}{'default'} = ['path_to_tag_script']; + # Project specific override is not supported. + 'ctags' => { + 'override' => 0, + 'default' => [0]}, + + # The maximum number of patches in a patchset generated in patch + # view. Set this to 0 or undef to disable patch view, or to a + # negative number to remove any limit. + + # To disable system wide have in $GITWEB_CONFIG + # $feature{'patches'}{'default'} = [0]; + # To have project specific config enable override in $GITWEB_CONFIG + # $feature{'patches'}{'override'} = 1; + # and in project config gitweb.patches = 0|n; + # where n is the maximum number of patches allowed in a patchset. + 'patches' => { + 'sub' => \&feature_patches, + 'override' => 0, + 'default' => [16]}, + + # Avatar support. When this feature is enabled, views such as + # shortlog or commit will display an avatar associated with + # the email of the committer(s) and/or author(s). + + # Currently available providers are gravatar and picon. + # If an unknown provider is specified, the feature is disabled. + + # Gravatar depends on Digest::MD5. + # Picon currently relies on the indiana.edu database. + + # To enable system wide have in $GITWEB_CONFIG + # $feature{'avatar'}{'default'} = ['<provider>']; + # where <provider> is either gravatar or picon. + # To have project specific config enable override in $GITWEB_CONFIG + # $feature{'avatar'}{'override'} = 1; + # and in project config gitweb.avatar = <provider>; + 'avatar' => { + 'sub' => \&feature_avatar, + 'override' => 0, + 'default' => ['']}, + + # Enable displaying how much time and how many git commands + # it took to generate and display page. Disabled by default. + # Project specific override is not supported. + 'timed' => { + 'override' => 0, + 'default' => [0]}, + + # Enable turning some links into links to actions which require + # JavaScript to run (like 'blame_incremental'). Not enabled by + # default. Project specific override is currently not supported. + 'javascript-actions' => { + 'override' => 0, + 'default' => [0]}, + + # Syntax highlighting support. This is based on Daniel Svensson's + # and Sham Chukoury's work in gitweb-xmms2.git. + # It requires the 'highlight' program present in $PATH, + # and therefore is disabled by default. + + # To enable system wide have in $GITWEB_CONFIG + # $feature{'highlight'}{'default'} = [1]; + + 'highlight' => { + 'sub' => sub { feature_bool('highlight', @_) }, + 'override' => 0, + 'default' => [0]}, +); + +sub evaluate_gitweb_config { + # die if there are errors parsing config file + if (-e $GITWEB_CONFIG) { + do $GITWEB_CONFIG; + die $@ if $@; + } elsif (-e $GITWEB_CONFIG_SYSTEM) { + do $GITWEB_CONFIG_SYSTEM; + die $@ if $@; + } +} + +sub evaluate_git_version { + $git_version = qx("$GIT" --version) =~ m/git version (.*)$/ ? $1 : "unknown"; + $number_of_git_cmds++; +} + +1; -- 1.7.1.447.gfddfb -- 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