From cf96c5880f1ba0694298d7541fedce47c8c99051 Mon Sep 17 00:00:00 2001 From: Moritz Bunkus Date: Mon, 16 Nov 2020 17:02:38 +0100 Subject: [PATCH] CSS/JS: Git-Revision von HEAD als GET-Parameter verwenden MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Webbrowser cachen CSS & JS sehr aggressiv. Das ist während der Entwicklung störend, weshalb es bereits seit langem die Konfigurationsoption `auto_reload_resources` gibt. Ist diese an, so wird an alle CSS- und JS-URLs ein GET-Parameter `?rand=` angehängt wird, um das Cachen auszuhebeln. Dieser Commit führt etwas Ähnliches ein, das für den Produktivbetrieb ohne `auto_reload_resources` gedacht ist. Wenn kivitendo erkennt, dass es aus git heraus läuft (also ein `.git`-Verzeichnis existiert), so parset es die Revision von `HEAD` und nimmt das als GET-Parameter `?rand=`. Der Vorteil ist, dass nach Updates einer Produktivinstallation die Webbrowser der Anwender*innen genau einmal alle Ressourcen neu laden, weil sich ja die Git-Revisionsnummer geändert hat. Anschließend können sie die Ressourcen aber wieder normal cachen, bis das nächste Update kommt. Es wird hierfür übrigens kein installiertes git-Executable benötigt; die Infos werden zwecks Performance direkt aus den Dateien gelesen, anstatt bei jedem Request ein Programm auszuführen. Zukünftig könnte man ein analoges Verfahren anwenden, wenn es kein `.git`-Verzeichnis gibt, und dann zumindest die kivitendo-Versionsnummer verwenden. --- SL/Layout/Base.pm | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/SL/Layout/Base.pm b/SL/Layout/Base.pm index df9c00852..8e6acfc74 100644 --- a/SL/Layout/Base.pm +++ b/SL/Layout/Base.pm @@ -3,6 +3,7 @@ package SL::Layout::Base; use strict; use parent qw(Rose::Object); +use File::Slurp qw(read_file); use List::MoreUtils qw(uniq); use Time::HiRes qw(); @@ -19,6 +20,7 @@ use Rose::Object::MakeMethods::Generic ( use SL::Menu; use SL::Presenter; +use SL::System::Process; my %menu_cache; @@ -42,8 +44,21 @@ sub get { } sub init_auto_reload_resources_param { - return '' unless $::lx_office_conf{debug}->{auto_reload_resources}; - return sprintf('?rand=%d-%d-%d', Time::HiRes::gettimeofday(), int(rand 1000000000000)); + return sprintf('?rand=%d-%d-%d', Time::HiRes::gettimeofday(), int(rand 1000000000000)) if $::lx_office_conf{debug}->{auto_reload_resources}; + + my $git_dir = SL::System::Process::exe_dir() . '/.git'; + + return '' unless -d $git_dir; + + my $content = eval { scalar(read_file($git_dir . '/HEAD')) }; + + return '' unless ($content // '') =~ m{\Aref: ([^\r\n]+)}; + + $content = eval { scalar(read_file($git_dir . '/' . $1)) }; + + return '' unless ($content // '') =~ m{\A([0-9a-fA-F]+)}; + + return '?rand=' . $1; } ########################################## -- 2.20.1