This series of patches is resend of patch by Petr 'Pasky' Baudis with the same subject, which can be found in, Message-ID: <20080313231413.27966.3383.stgit@rover> http://permalink.gmane.org/gmane.comp.version-control.git/77151 split into two patches (so the exact details of serializing and caching can be separated from independent code improvement), and with added lazy filling of details for a project. At the bottom there is interdiff between Pasky's result and result after first two patches here. Besides a bit of style changes the main difference is that in this version dump of @projects array is done in 'terse' form, so it can be eval'ed directly into @projects. Table of contents: ================== [PATCH 1/3] gitweb: Separate filling projects info into git_get_projects_details() [PATCH 2/3] gitweb: Support caching projects list [PATCH 3/3] gitweb: Fill project details only if project path mtime changed Shortlog: ========= Jakub Narebski (1): gitweb: Fill project details only if project path mtime changed Petr Baudis (2): gitweb: Separate filling projects info into git_get_projects_details() gitweb: Support caching projects list Diffstat: ========= gitweb/gitweb.css | 6 ++++ gitweb/gitweb.perl | 73 ++++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 74 insertions(+), 5 deletions(-) Interdiff: ========== gitweb/gitweb.perl | 35 ++++++++++++++++++++--------------- 1 files changed, 20 insertions(+), 15 deletions(-) diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl index bee5ec8..5527378 100755 --- a/gitweb/gitweb.perl +++ b/gitweb/gitweb.perl @@ -123,7 +123,7 @@ our @diff_opts = ('-M'); # taken from git_commit # index lifetime in minutes # the cached list version is stored in /tmp and can be tweaked # by other scripts running with the same uid as gitweb - use this -# only at secure installations; only single gitweb project root per +# ONLY at secure installations; only single gitweb project root per # system is supported! our $projlist_cache_lifetime = 0; @@ -3482,6 +3482,8 @@ sub git_patchset_body { # . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +# fill age, description, owner, forks (last one only if $check_forks) +# for all projects in $projlist reference; fill projects info sub git_get_projects_details { my ($projlist, $check_forks) = @_; @@ -3521,34 +3523,37 @@ sub git_project_list_body { my ($check_forks) = gitweb_check_feature('forks'); - my $cache_file = '/tmp/gitweb.index.cache'; use File::stat; + use POSIX qw(:fcntl_h); + + my $cache_file = '/tmp/gitweb.index.cache'; my @projects; my $stale = 0; - if ($cache_lifetime and -f $cache_file - and stat($cache_file)->mtime + $cache_lifetime * 60 > time() - and open (my $fd, $cache_file)) { - $stale = time() - stat($cache_file)->mtime; - my @dump = <$fd>; + my $now = time(); + if ($cache_lifetime && -f $cache_file && + stat($cache_file)->mtime + $cache_lifetime * 60 > $now && + open(my $fd, '<', $cache_file)) { + $stale = $now - stat($cache_file)->mtime; + local $/ = undef; + my $dump = <$fd>; close $fd; - # Hack zone start - my $VAR1; - eval join("\n", @dump); - @projects = @$VAR1; - # Hack zone end + @projects = @{ eval $dump }; } else { - if ($cache_lifetime and -f $cache_file) { + if ($cache_lifetime && -f $cache_file) { # Postpone timeout by two minutes so that we get # enough time to do our job. my $time = time() - $cache_lifetime + 120; utime $time, $time, $cache_file; } @projects = git_get_projects_details($projlist, $check_forks); - if ($cache_lifetime and open (my $fd, '>'.$cache_file)) { + if ($cache_lifetime && + sysopen(my $fd, "$cache_file.lock", O_WRONLY|O_CREAT|O_EXCL, 0600)) { use Data::Dumper; + $Data::Dumper::Terse = 1; print $fd Dumper(\@projects); close $fd; + rename "$cache_file.lock", $cache_file; } } @@ -3556,7 +3561,7 @@ sub git_project_list_body { $from = 0 unless defined $from; $to = $#projects if (!defined $to || $#projects < $to); - if ($cache_lifetime and $stale) { + if ($cache_lifetime && $stale) { print "<div class=\"stale_info\">Cached version (${stale}s old)</div>\n"; } -- 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