From: Jakub Narebski <jnareb@gmail.com>
To: git@vger.kernel.org
Cc: Petr Baudis <pasky@suse.cz>, "J.H." <warthog19@eaglescrag.net>,
Frank Lichtenheld <frank@lichtenheld.de>,
Jakub Narebski <jnareb@gmail.com>
Subject: [PATCH 0/3 v2] gitweb: Support caching projects list
Date: Mon, 17 Mar 2008 16:09:27 +0100 [thread overview]
Message-ID: <1205766570-13550-1-git-send-email-jnareb@gmail.com> (raw)
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";
}
next reply other threads:[~2008-03-17 15:10 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-03-17 15:09 Jakub Narebski [this message]
2008-03-17 15:09 ` [PATCH 1/3] gitweb: Separate @projects population into git_get_projects_details() Jakub Narebski
2008-03-17 15:09 ` [RFC/PATCH 2/3] gitweb: Support caching projects list Jakub Narebski
2008-03-17 16:54 ` Frank Lichtenheld
2008-03-17 18:52 ` Jakub Narebski
2008-03-17 19:10 ` Frank Lichtenheld
2008-03-17 20:25 ` Jakub Narebski
2008-03-17 15:09 ` [RFC/PATCH 3/3] gitweb: Fill project details lazily when caching Jakub Narebski
2008-03-18 3:14 ` Petr Baudis
2008-03-18 9:12 ` Jakub Narebski
2008-03-18 9:52 ` Frank Lichtenheld
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1205766570-13550-1-git-send-email-jnareb@gmail.com \
--to=jnareb@gmail.com \
--cc=frank@lichtenheld.de \
--cc=git@vger.kernel.org \
--cc=pasky@suse.cz \
--cc=warthog19@eaglescrag.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).