From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-4.2 required=3.0 tests=ALL_TRUSTED,AWL,BAYES_00, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF, T_SCC_BODY_TEXT_LINE shortcircuit=no autolearn=ham autolearn_force=no version=3.4.6 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id DD49F1F51A for ; Wed, 13 Dec 2023 00:50:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=80x24.org; s=selector1; t=1702428620; bh=pPAcNYfdFHz10pSJB9EIvW/mZ0AAG2uPnoKj+t2e4Q0=; h=From:To:Subject:Date:In-Reply-To:References:From; b=kSnIyk7fyQJoZKxXXzUpu5UCtSCVIg3qeZdNQkG+OjjRnWL5tAg1VybFNJEPAcCu3 qtqGzzXUscGagNjH/JJ1J/UV1pdI6CfpHNVv2jlkBVsBb33YKa35A3sKgcXXWmhpTz JzFOcZGR8+pG7vM26E9oNCScTgCYlWvLVbLVUrEg= From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 06/14] treewide: avoid strftime %k for portability Date: Wed, 13 Dec 2023 00:50:11 +0000 Message-ID: <20231213005019.26912-7-e@80x24.org> In-Reply-To: <20231213005019.26912-1-e@80x24.org> References: <20231213005019.26912-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: The musl strftime(3) implementation on AlpineLinux 3.19.0 doesn't support `%k' and `%k' isn't in POSIX, either. So we fall back to using the `sprintf' perlop in the user-facing UI since leading zeroes require needless overhead for my eyes and brain to parse in the time. --- lib/PublicInbox/Admin.pm | 10 +++++++++- lib/PublicInbox/ExtSearchIdx.pm | 4 ++-- lib/PublicInbox/Hval.pm | 6 +++++- lib/PublicInbox/LeiMirror.pm | 4 ++-- lib/PublicInbox/LeiXSearch.pm | 3 ++- lib/PublicInbox/WwwStatic.pm | 5 ++--- xt/msgtime_cmp.t | 2 +- 7 files changed, 23 insertions(+), 11 deletions(-) diff --git a/lib/PublicInbox/Admin.pm b/lib/PublicInbox/Admin.pm index cc9d2171..a1b1fc07 100644 --- a/lib/PublicInbox/Admin.pm +++ b/lib/PublicInbox/Admin.pm @@ -6,7 +6,7 @@ package PublicInbox::Admin; use v5.12; use parent qw(Exporter); -our @EXPORT_OK = qw(setup_signals); +our @EXPORT_OK = qw(setup_signals fmt_localtime); use PublicInbox::Config; use PublicInbox::Inbox; use PublicInbox::Spawn qw(run_qx); @@ -381,4 +381,12 @@ sub do_chdir ($) { } } +sub fmt_localtime ($) { + require POSIX; + my @lt = localtime $_[0]; + my (undef, $M, $H, $d, $m, $Y) = @lt; + sprintf('%u-%02u-%02u % 2u:%02u ', $Y + 1900, $m + 1, $d, $H, $M) + .POSIX::strftime('%z', @lt); +} + 1; diff --git a/lib/PublicInbox/ExtSearchIdx.pm b/lib/PublicInbox/ExtSearchIdx.pm index 7b7436ea..53078124 100644 --- a/lib/PublicInbox/ExtSearchIdx.pm +++ b/lib/PublicInbox/ExtSearchIdx.pm @@ -20,7 +20,6 @@ use parent qw(PublicInbox::ExtSearch PublicInbox::Umask PublicInbox::Lock); use Carp qw(croak carp); use Scalar::Util qw(blessed); use Sys::Hostname qw(hostname); -use POSIX qw(strftime); use File::Glob qw(bsd_glob GLOB_NOSORT); use PublicInbox::MultiGit; use PublicInbox::Search; @@ -34,6 +33,7 @@ use PublicInbox::ContentHash qw(content_hash); use PublicInbox::Eml; use PublicInbox::DS qw(now add_timer); use DBI qw(:sql_types); # SQL_BLOB +use PublicInbox::Admin qw(fmt_localtime); sub new { my (undef, $dir, $opt) = @_; @@ -749,7 +749,7 @@ sub eidxq_lock_acquire ($) { return $locked if $locked eq $cur; } my ($pid, $time, $euid, $ident) = split(/-/, $cur, 4); - my $t = strftime('%Y-%m-%d %k:%M %z', localtime($time)); + my $t = fmt_localtime($time); local $self->{current_info} = 'eidxq'; if ($euid == $> && $ident eq host_ident) { kill(0, $pid) and warn <{chg}->{fp_mismatch}; if ($mis) { - my $t = (stat($ft))[9]; - $t = strftime('%F %k:%M:%S %z', localtime($t)); + my $t = fmt_localtime((stat($ft))[9]); warn <qerr("# $uri limiting to ". - strftime('%Y-%m-%d %k:%M %z', localtime($lr)). ' and newer'); + PublicInbox::Admin::fmt_localtime($lr).' and newer'); # this should really be rt: (received-time), but no stable # public-inbox releases support it, yet. my $dt = 'dt:'.strftime('%Y%m%d%H%M%S', gmtime($lr)).'..'; diff --git a/lib/PublicInbox/WwwStatic.pm b/lib/PublicInbox/WwwStatic.pm index 1c1a3d38..d8902193 100644 --- a/lib/PublicInbox/WwwStatic.pm +++ b/lib/PublicInbox/WwwStatic.pm @@ -12,13 +12,12 @@ use strict; use v5.10.1; use parent qw(Exporter); use Fcntl qw(SEEK_SET O_RDONLY O_NONBLOCK); -use POSIX qw(strftime); use HTTP::Date qw(time2str); use HTTP::Status qw(status_message); use Errno qw(EACCES ENOTDIR ENOENT); use URI::Escape qw(uri_escape_utf8); use PublicInbox::GzipFilter qw(gzf_maybe); -use PublicInbox::Hval qw(ascii_html); +use PublicInbox::Hval qw(ascii_html fmt_ts); use Plack::MIME; our @EXPORT_OK = qw(@NO_CACHE r path_info_raw); @@ -299,7 +298,7 @@ sub dir_response ($$$) { $pad = 1 if $pad <= 0; $entry = qq(\n$name) . (' ' x $pad) . - strftime('%Y-%m-%d %k:%M', gmtime($mtime)) . + fmt_ts($mtime) . sprintf('% 8s', $hsize); } diff --git a/xt/msgtime_cmp.t b/xt/msgtime_cmp.t index a7ef5245..c63f785e 100644 --- a/xt/msgtime_cmp.t +++ b/xt/msgtime_cmp.t @@ -36,7 +36,7 @@ sub quiet_is_deeply ($$$$$) { ($old->[0] != $cur->[0]) || ($old->[1] != $cur->[1]))) { for ($cur, $old) { - $_->[2] = strftime('%Y-%m-%d %k:%M:%S', gmtime($_->[0])) + $_->[2] = strftime('%F %T', gmtime($_->[0])) } is_deeply($cur, $old, "$func $oid"); diag('got: ', explain($cur));