Ticket #4279 (new defect)

Opened 10 months ago

Last modified 10 months ago

FISH download, file modification and access times truncated

Reported by: opty Owned by:
Priority: major Milestone: Future Releases
Component: mc-vfs Version: 4.8.27
Keywords: Cc:
Blocked By: Blocking:
Branch state: no branch Votes for changeset:

Description

When downloading a file using FISH, it doesn't preserve (nano)seconds and even the whole time when copying from OpenWrt 19.07.7. Should FISH use ls --full-time?

Workaround: Use upload (if possible).

Change History

comment:1 Changed 10 months ago by opty

ls --full-time without Perl (like OpenWrt), %S in strftime() with Perl and D instead of d in both.

Unfortunately, Perl's nanoseconds support through Time::HiRes seems problematic (floating point representation), so prefer ls over Perl?

comment:2 Changed 10 months ago by opty

Trying to use %S with D in Perl leads to timezone (DST in my case) problem due to mktime(3) in C but just adding :%S to strftime() and keeping the d seems to work.

comment:3 Changed 10 months ago by opty

So far (seconds):

  • usr/libexec/mc/fish/ls

    old new  
    55fish_list_lsq () 
    66{ 
    77FISH_DIR="$1" 
    8 ls -Qlan "${FISH_DIR}" 2>/dev/null | grep '^[^cbt]' | ( 
    9 while read p l u g s m d y n; do 
     8ls -Qan --full-time "${FISH_DIR}" 2>/dev/null | grep '^[^cbt]' | ( 
     9while read p l u g s d t z n; do 
    1010    echo "P$p $u.$g" 
    1111    echo "S$s" 
    12     echo "d$m $d $y" 
     12    echo "d${d#*-}-${d%%-*} ${t%.*}" 
    1313    echo ":$n" 
    1414    echo 
    1515done 
    1616) 
    1717 
    18 ls -Qlan "${FISH_DIR}" 2>/dev/null | grep '^[cb]' | ( 
    19 while read p l u g a i m d y n; do 
     18ls -Qan --full-time "${FISH_DIR}" 2>/dev/null | grep '^[cb]' | ( 
     19while read p l u g a i d t z n; do 
    2020    echo "P$p $u.$g" 
    2121    echo "E$a$i" 
    22     echo "d$m $d $y" 
     22    echo "d${d#*-}-${d%%-*} ${t%.*}" 
    2323    echo ":$n" 
    2424    echo 
    2525done 
     
    130130if (opendir (DIR, $dirname)) { 
    131131while((my $filename = readdir (DIR))){ 
    132132    my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = lstat("$dirname/$filename"); 
    133     my $mloctime= strftime("%m-%d-%Y %H:%M", localtime $mtime); 
     133    my $mloctime= strftime("%m-%d-%Y %H:%M:%S", localtime $mtime); 
    134134    my $strutils_shell_escape_regex = s/([;<>\*\|`&\$!#\(\)\[\]\{\}:'\''"\ \\])/\\$1/g; 
    135135    my $e_filename = $filename; 
    136136    $e_filename =~ $strutils_shell_escape_regex; 

comment:4 Changed 10 months ago by andrew_b

ls --full-time is not portable. GNU ls has this option, but BSD hasn't.

comment:5 Changed 10 months ago by zaytsev

Well, BSD doesn't seem to have -Q either - on my Mac:

zaytsev@Yurys-MBP ~ % ls -Qlan
ls: illegal option -- Q
usage: ls [-@ABCFGHLOPRSTUWabcdefghiklmnopqrstuwx1%] [file ...]

BSD has -T though, which shows at least seconds, but GNU uses it for something else :-(

I think that the helpers are named in a very confusing way:

  • fish_list_lsq should be probably called fish_list_gnu
  • fish_list_sed should be probably called fish_list_bsd
  • fish_list_poor_ls should be probably called fish_list_busybox

This way the logic is more clear - Perl is used for maximal portability wherever it's available to ensure consistent results - otherwise use plain ls and POSIX stuff for three major userland types... At least this would be my logic if I tried to come up with helpers myself :-)

Also it's very annoying that each block is copy & pasted twice... so much for the use of functions.

Note: See TracTickets for help on using tickets.