]> git.ipfire.org Git - thirdparty/public-inbox.git/commitdiff
treewide: avoid strftime %k for portability
authorEric Wong <e@80x24.org>
Wed, 13 Dec 2023 00:50:11 +0000 (00:50 +0000)
committerEric Wong <e@80x24.org>
Wed, 13 Dec 2023 09:01:50 +0000 (09:01 +0000)
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
lib/PublicInbox/ExtSearchIdx.pm
lib/PublicInbox/Hval.pm
lib/PublicInbox/LeiMirror.pm
lib/PublicInbox/LeiXSearch.pm
lib/PublicInbox/WwwStatic.pm
xt/msgtime_cmp.t

index cc9d21719443388359b8de13847ecb1f69b0b5b0..a1b1fc079f7ec4517d5bc328d3d7b53e981d06c5 100644 (file)
@@ -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;
index 7b7436eaf8bbb7ecc369da9094aa29fae77ca6a9..53078124dec000ad935440db823a48d0e4daa67e 100644 (file)
@@ -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;
index b804254a93be9cce6186c293a15604c0de383fcb..963dbb7150a81b64aa87429a77a014c254558d24 100644 (file)
@@ -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]);
index e048a8070b8147f26c30415ae65c0d83f2e3c524..0c77a8b5f0f347ebe481dfc706ffba58c86c3a01 100644 (file)
@@ -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:
index cee3ad07d6982a878228c043cacb882539bbe0fd..fc95d401e23c921518d8c4a048cdc670b96c7d9a 100644 (file)
@@ -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)).'..';
index 1c1a3d38d6e7c5fd9a8c479b5dc013809b66405b..d89021930373a89835bda84720119b49e1ae289e 100644 (file)
@@ -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);
        }
 
index a7ef5245bd8de4f37343578fcf28d73ed11d7cb9..c63f785e77650f3cbadb139924688b73fcd697ff 100644 (file)
@@ -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));