From: Eric Wong <e@80x24.org>
To: meta@public-inbox.org
Subject: [PATCH 06/14] treewide: avoid strftime %k for portability
Date: Wed, 13 Dec 2023 00:50:11 +0000 [thread overview]
Message-ID: <20231213005019.26912-7-e@80x24.org> (raw)
In-Reply-To: <20231213005019.26912-1-e@80x24.org>
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 <<EOM and return;
diff --git a/lib/PublicInbox/Hval.pm b/lib/PublicInbox/Hval.pm
index b804254a..963dbb71 100644
--- a/lib/PublicInbox/Hval.pm
+++ b/lib/PublicInbox/Hval.pm
@@ -145,7 +145,11 @@ sub to_attr ($) {
sub ts2str ($) { strftime('%Y%m%d%H%M%S', gmtime($_[0])) };
# human-friendly format
-sub fmt_ts ($) { strftime('%Y-%m-%d %k:%M', gmtime($_[0])) }
+sub fmt_ts ($) {
+ # strftime %k is not portable and leading zeros in %H slow me down
+ my (undef, $M, $H, $d, $m, $Y) = gmtime $_[0];
+ sprintf '%u-%02u-%02u % 2u:%02u', $Y + 1900, $m + 1, $d, $H, $M;
+}
sub utf8_maybe ($) {
utf8::decode($_[0]);
diff --git a/lib/PublicInbox/LeiMirror.pm b/lib/PublicInbox/LeiMirror.pm
index e048a807..0c77a8b5 100644
--- a/lib/PublicInbox/LeiMirror.pm
+++ b/lib/PublicInbox/LeiMirror.pm
@@ -21,6 +21,7 @@ use PublicInbox::LeiCurl;
use PublicInbox::OnDestroy;
use PublicInbox::SHA qw(sha256_hex sha_all);
use POSIX qw(strftime);
+use PublicInbox::Admin qw(fmt_localtime);
use autodie qw(chdir chmod close open pipe readlink
seek symlink sysopen sysseek truncate unlink);
@@ -1232,8 +1233,7 @@ EOM
# set by clone_v2_prep/-I/--exclude
my $mis = delete $self->{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 <<EOM;
W: Fingerprints for the following repositories do not match
W: $mf_url @ $t:
diff --git a/lib/PublicInbox/LeiXSearch.pm b/lib/PublicInbox/LeiXSearch.pm
index cee3ad07..fc95d401 100644
--- a/lib/PublicInbox/LeiXSearch.pm
+++ b/lib/PublicInbox/LeiXSearch.pm
@@ -298,8 +298,9 @@ sub fudge_qstr_time ($$$) {
$rft = $diff;
}
$lr -= ($rft || (48 * 60 * 60));
+ require PublicInbox::Admin;
$lei->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<a\nhref="$href">$name</a>) .
(' ' 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));
next prev parent reply other threads:[~2023-12-13 0:50 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-12-13 0:50 [PATCH 00/14] Alpine Linux support Eric Wong
2023-12-13 0:50 ` [PATCH 01/14] t/io: strace is optional on Linux Eric Wong
2023-12-13 0:50 ` [PATCH 02/14] tests: account for missing git-http-backend Eric Wong
2023-12-13 0:50 ` [PATCH 03/14] t/cindex*: skip --join when join(1) is missing Eric Wong
2023-12-13 0:50 ` [PATCH 04/14] tests: attempt compatibility w/ busybox lsof Eric Wong
2023-12-13 0:50 ` [PATCH 05/14] lei inspect: drop unneeded strftime import Eric Wong
2023-12-13 0:50 ` Eric Wong [this message]
2023-12-13 0:50 ` [PATCH 07/14] xap_helper_cxx: decouple from Inline::C Eric Wong
2023-12-13 0:50 ` [PATCH 08/14] xap_helper_cxx: support clang w/o `c++' executable Eric Wong
2023-12-13 0:50 ` [PATCH 09/14] install: updates for Alpine Linux and apk Eric Wong
2023-12-13 0:50 ` [PATCH 10/14] test_common: extract oct_is from search.t Eric Wong
2023-12-13 0:50 ` [PATCH 11/14] t/convert-compact: allow S_ISGID bit Eric Wong
2023-12-13 0:50 ` [PATCH 12/14] www_coderepo: fix read buffering Eric Wong
2023-12-13 0:50 ` [PATCH 13/14] gzip_filter: use OO ->zflush dispatch Eric Wong
2023-12-13 0:50 ` [PATCH 14/14] t/lei-import: relax EIO regexp Eric Wong
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
List information: https://public-inbox.org/README
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20231213005019.26912-7-e@80x24.org \
--to=e@80x24.org \
--cc=meta@public-inbox.org \
/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 read-only IMAP folder(s) and NNTP newsgroup(s).