On Tue, Apr 03, 2007 at 09:26:40PM +0900, Takashi SHIRAI wrote:
> The old lftp could use the un-precise timestamp with the FTP
> site not supporting MDTM, then the mirroring copied the
> updated files only.  While the new lftp cannot work on the
> same environment, trying to copy all the files always.
> This is a big problem for me. 

Catch the patch.

-- 
   Alexander.
Index: ChangeLog
===================================================================
RCS file: /home/lav/cvsroot/lftp/src/ChangeLog,v
retrieving revision 1.1062.2.7
diff -u -p -r1.1062.2.7 ChangeLog
--- ChangeLog   26 Mar 2007 07:26:13 -0000      1.1062.2.7
+++ ChangeLog   5 Apr 2007 13:10:40 -0000
@@ -1,3 +1,10 @@
+2007-04-05  Alexander V. Lukyanov <[EMAIL PROTECTED]>
+
+       * FileAccess.h, FileCopy.cc, FileCopy.h, FileSet.cc, FileSet.h,
+         FileSetOutput.cc, Filter.cc, Filter.h, MirrorJob.cc, NetAccess.cc:
+         (FileTimestamp) new struct; use it where needed; submit even
+         imprecise timestamp from MirrorJob to CopyJob.
+
 2007-03-26  Alexander V. Lukyanov <[EMAIL PROTECTED]>
 
        * LocalAccess.cc: prevent double-delete of args in LocalDirList
Index: FileAccess.h
===================================================================
RCS file: /home/lav/cvsroot/lftp/src/FileAccess.h,v
retrieving revision 1.93
diff -u -p -r1.93 FileAccess.h
--- FileAccess.h        27 Jul 2006 07:22:39 -0000      1.93
+++ FileAccess.h        5 Apr 2007 13:10:04 -0000
@@ -43,10 +43,6 @@
 #include "FileSet.h"
 #include "LsCache.h"
 
-#define NO_SIZE             ((off_t)-1L)
-#define NO_SIZE_YET  ((off_t)-2L)
-#define NO_DATE             ((time_t)-1L)
-#define NO_DATE_YET  ((time_t)-2L)
 #define FILE_END     ((off_t)-1L)
 #define UNKNOWN_POS  ((off_t)-1L)
 
@@ -143,7 +139,7 @@ protected:
    off_t real_pos;
    off_t limit;
 
-   time_t *opt_date;
+   FileTimestamp *opt_date;
    off_t  *opt_size;
 
    static void NonBlock(int fd);
@@ -248,7 +244,7 @@ public:
    void SetLimit(off_t lim) { limit=lim; }
    void SetSize(off_t s) { entity_size=s; }
    void SetDate(time_t d) { entity_date=d; }
-   void WantDate(time_t *d) { opt_date=d; }
+   void WantDate(FileTimestamp *d) { opt_date=d; }
    void WantSize(off_t *s) { opt_size=s; }
    void AsciiTransfer() { ascii=true; }
    virtual void Close();
Index: FileCopy.cc
===================================================================
RCS file: /home/lav/cvsroot/lftp/src/FileCopy.cc,v
retrieving revision 1.126
diff -u -p -r1.126 FileCopy.cc
--- FileCopy.cc 25 Jul 2006 08:38:31 -0000      1.126
+++ FileCopy.cc 5 Apr 2007 13:10:04 -0000
@@ -637,10 +637,10 @@ void FileCopyPeer::SetSize(off_t s)
         seek_pos=0;
    }
 }
-void FileCopyPeer::SetDate(time_t d)
+void FileCopyPeer::SetDate(time_t d,int p)
 {
-   date=d;
-   if(date==NO_DATE || date==NO_DATE_YET)
+   date.set(d,p);
+   if(d==NO_DATE || d==NO_DATE_YET)
       date_set=true;
    else
       date_set=false;
@@ -680,7 +680,6 @@ FileCopyPeer::FileCopyPeer(dir_t m) : IO
    start_transfer=true;
    size=NO_SIZE_YET;
    e_size=NO_SIZE;
-   date=NO_DATE_YET;
    seek_pos=0;
    can_seek=false;
    can_seek0=false;
@@ -961,7 +960,7 @@ void FileCopyPeerFA::OpenSession()
       session->AsciiTransfer();
    if(want_size && size==NO_SIZE_YET)
       session->WantSize(&size);
-   if(want_date && date==NO_DATE_YET)
+   if(want_date && (date==NO_DATE_YET || date.ts_prec>1))
       session->WantDate(&date);
    if(mode==GET)
    {
Index: FileCopy.h
===================================================================
RCS file: /home/lav/cvsroot/lftp/src/FileCopy.h,v
retrieving revision 1.69
diff -u -p -r1.69 FileCopy.h
--- FileCopy.h  4 Jul 2006 05:15:36 -0000       1.69
+++ FileCopy.h  5 Apr 2007 13:10:05 -0000
@@ -47,7 +47,7 @@ protected:
    bool start_transfer;
    off_t size;
    off_t e_size;
-   time_t date;
+   FileTimestamp date;
 
    off_t seek_pos;
    bool can_seek;
@@ -89,7 +89,7 @@ public:
    time_t GetDate() { return date; }
    off_t  GetSize() { if(size>=0 && pos>size) WantSize(); return size; }
 
-   void SetDate(time_t d);
+   void SetDate(time_t d,int p=0);
    void SetSize(off_t s);
    void SetEntitySize(off_t s) { e_size=s; }
 
@@ -225,7 +225,8 @@ public:
    off_t GetBytesCount() { return bytes_count; }
    double GetTimeSpent();
 
-   void SetDate(time_t t) { get->SetDate(t); }
+   void SetDate(time_t t,int p=0) { get->SetDate(t,p); }
+   void SetDate(const FileTimestamp &t) { SetDate(t.ts,t.ts_prec); }
    void SetSize(off_t  s) { get->SetSize(s); }
 
    bool Done() { return state==ALL_DONE; }
Index: FileSet.cc
===================================================================
RCS file: /home/lav/cvsroot/lftp/src/FileSet.cc,v
retrieving revision 1.52
diff -u -p -r1.52 FileSet.cc
--- FileSet.cc  29 Aug 2006 07:25:26 -0000      1.52
+++ FileSet.cc  5 Apr 2007 13:10:05 -0000
@@ -42,11 +42,6 @@
 #include "IdNameCache.h"
 #include "PatternSet.h"
 
-#define NO_SIZE             (-1L)
-#define NO_SIZE_YET  (-2L)
-#define NO_DATE             ((time_t)-1L)
-#define NO_DATE_YET  ((time_t)-2L)
-
 void  FileInfo::Merge(const FileInfo& f)
 {
    if(strcmp(name,f.name))
@@ -55,8 +50,8 @@ void  FileInfo::Merge(const FileInfo& f)
    int dif=(~defined)&f.defined;
    if(dif&MODE)
       SetMode(f.mode);
-   if(dif&DATE || (defined&DATE && f.defined&DATE && f.date_prec<date_prec))
-      SetDate(f.date,f.date_prec);
+   if(dif&DATE || (defined&DATE && f.defined&DATE && 
f.date.ts_prec<date.ts_prec))
+      SetDate(f.date,f.date.ts_prec);
    if(dif&TYPE)
       SetType(f.filetype);
    if(dif&SYMLINK)
@@ -421,9 +416,9 @@ bool  FileInfo::SameAs(const FileInfo *f
 
    if(defined&DATE && fi->defined&DATE && !(ignore&DATE))
    {
-      time_t p=date_prec;
-      if(p<fi->date_prec)
-        p=fi->date_prec;
+      time_t p=date.ts_prec;
+      if(p<fi->date.ts_prec)
+        p=fi->date.ts_prec;
       if(!(ignore&IGNORE_DATE_IF_OLDER && date<fi->date)
       && labs(date-fi->date)>p)
         return false;
@@ -588,7 +583,7 @@ void FileSet::LocalUtime(const char *dir
         struct stat st;
         ut.actime=ut.modtime=file->date;
 
-        if(stat(local_name,&st)!=-1 && st.st_mtime!=file->date)
+        if(stat(local_name,&st)!=-1 && 
labs(st.st_mtime-file->date)>file->date.ts_prec)
            utime(local_name,&ut);
       }
    }
@@ -689,7 +684,6 @@ void FileInfo::Init()
    filetype=UNKNOWN;
    mode=(mode_t)-1;
    date=NO_DATE;
-   date_prec=0;
    size=NO_SIZE;
    nlinks=0;
    name=0;
@@ -712,7 +706,6 @@ FileInfo::FileInfo(const FileInfo &fi)
    filetype=fi.filetype;
    mode=fi.mode;
    date=fi.date;
-   date_prec=fi.date_prec;
    size=fi.size;
    nlinks=fi.nlinks;
    longname=xstrdup(fi.longname);
Index: FileSet.h
===================================================================
RCS file: /home/lav/cvsroot/lftp/src/FileSet.h,v
retrieving revision 1.38
diff -u -p -r1.38 FileSet.h
--- FileSet.h   29 Aug 2006 07:25:26 -0000      1.38
+++ FileSet.h   5 Apr 2007 13:10:05 -0000
@@ -31,13 +31,28 @@
 class TimeInterval;
 class Range;
 
+#define NO_SIZE             ((off_t)-1L)
+#define NO_SIZE_YET  ((off_t)-2L)
+#define NO_DATE             ((time_t)-1L)
+#define NO_DATE_YET  ((time_t)-2L)
+
+struct FileTimestamp
+{
+   time_t ts;
+   int ts_prec;
+   FileTimestamp() : ts(NO_DATE_YET), ts_prec(0) {}
+   void set(time_t ts1,int ts1_prec) { ts=ts1; ts_prec=ts1_prec; }
+   bool is_set() { return ts!=NO_DATE && ts!=NO_DATE_YET; }
+   operator time_t() const { return ts; }
+   time_t operator=(time_t t) { set(t,0); return t; }
+};
+
 class FileInfo
 {
 public:
    char            *name;
    mode_t   mode;
-   time_t   date;
-   int     date_prec;
+   FileTimestamp date;
    off_t    size;
    void            *data;
    const char *user, *group;
@@ -82,7 +97,7 @@ public:
    static FileInfo *parse_ls_line(const char *line,const char *tz);
 
    void SetMode(mode_t m) { mode=m; defined|=MODE; }
-   void SetDate(time_t t,int prec) { date=t; defined|=DATE; date_prec=prec; }
+   void SetDate(time_t t,int prec) { date.set(t,prec); defined|=DATE; }
    void SetType(type t) { filetype=t; defined|=TYPE; }
    void SetSymlink(const char *s) { xfree(symlink); symlink=xstrdup(s);
       filetype=SYMLINK; defined|=TYPE|SYMLINK_DEF; }
Index: FileSetOutput.cc
===================================================================
RCS file: /home/lav/cvsroot/lftp/src/FileSetOutput.cc,v
retrieving revision 1.41
diff -u -p -r1.41 FileSetOutput.cc
--- FileSetOutput.cc    7 Aug 2006 08:55:20 -0000       1.41
+++ FileSetOutput.cc    5 Apr 2007 13:10:05 -0000
@@ -144,7 +144,7 @@ void FileSetOutput::print(FileSet &fs, O
         if(!use_fmt || !*use_fmt)
            use_fmt="%b %e  %Y\n%b %e %H:%M";
 
-        char *dt_mem = xstrftime(use_fmt, localtime (&f->date));
+        char *dt_mem = xstrftime(use_fmt, localtime (&f->date.ts));
         char *dt=strtok(dt_mem,"\n|");
         if(recent) {
            char *dt1=strtok(NULL,"\n|");
Index: Filter.cc
===================================================================
RCS file: /home/lav/cvsroot/lftp/src/Filter.cc,v
retrieving revision 1.39
diff -u -p -r1.39 Filter.cc
--- Filter.cc   6 Feb 2006 10:57:24 -0000       1.39
+++ Filter.cc   5 Apr 2007 13:10:05 -0000
@@ -34,6 +34,7 @@
 #include "SignalHook.h"
 #include "ArgV.h"
 #include "misc.h"
+#include "FileSet.h"
 
 #ifndef O_BINARY
 # define O_BINARY 0
@@ -345,11 +346,17 @@ bool OutputFilter::usesfd(int n_fd)
    return n_fd<=2;
 }
 
-void FileStream::setmtime(time_t t)
+void FileStream::setmtime(const FileTimestamp &ts)
 {
    getfd(); // this might create the file... But can fail retriably. FIXME.
+
+   // skip the time update if the timestamp is already accurate enough.
+   struct stat st;
+   if(fstat(fd,&st)!=-1 && labs(st.st_mtime-ts)<=ts.ts_prec)
+      return;
+
    struct utimbuf ut;
-   ut.actime=ut.modtime=t;
+   ut.actime=ut.modtime=ts;
    utime(full_name,&ut);
 }
 FileStream::FileStream(const char *fname,int new_mode) : FDStream(-1,fname)
Index: Filter.h
===================================================================
RCS file: /home/lav/cvsroot/lftp/src/Filter.h,v
retrieving revision 1.23
diff -u -p -r1.23 Filter.h
--- Filter.h    21 Jun 2005 14:30:04 -0000      1.23
+++ Filter.h    5 Apr 2007 13:10:05 -0000
@@ -26,6 +26,7 @@
 #include "ProcWait.h"
 
 class ArgV;
+class FileTimestamp;
 
 class FDStream
 {
@@ -57,7 +58,7 @@ public:
    const char *GetCwd() const { return cwd; }
 
    virtual off_t get_size() { return -1; }
-   virtual void setmtime(time_t) {}
+   virtual void setmtime(const FileTimestamp &) {}
    virtual bool can_setmtime() { return false; }
    virtual void remove_if_empty() {}
    virtual void remove() {}
@@ -136,7 +137,7 @@ public:
    FileStream(const char *fname,int open_mode);
    ~FileStream();
 
-   void setmtime(time_t t);
+   void setmtime(const FileTimestamp &);
    bool can_setmtime() { return true; }
    void remove_if_empty();
    void remove();
Index: MirrorJob.cc
===================================================================
RCS file: /home/lav/cvsroot/lftp/src/MirrorJob.cc,v
retrieving revision 1.139.2.1
diff -u -p -r1.139.2.1 MirrorJob.cc
--- MirrorJob.cc        6 Jan 2007 06:39:33 -0000       1.139.2.1
+++ MirrorJob.cc        5 Apr 2007 13:10:05 -0000
@@ -228,7 +228,7 @@ void  MirrorJob::HandleFile(FileInfo *fi
            && (old->defined&file->TYPE) && old->filetype==old->NORMAL
            && (flags&IGNORE_TIME ||
                ((file->defined&file->DATE) && (old->defined&old->DATE)
-               && file->date + file->date_prec < old->date - old->date_prec))
+               && file->date + file->date.ts_prec < old->date - 
old->date.ts_prec))
            && (file->defined&file->SIZE) && (old->defined&old->SIZE)
            && file->size >= old->size
            && !use_pget)
@@ -297,7 +297,7 @@ void  MirrorJob::HandleFile(FileInfo *fi
               c->RemoveTargetFirst();
            CopyJob *cp=
               new CopyJob(c,file->name,"mirror");
-           if((file->defined&file->DATE) && file->date_prec<=1)
+           if(file->defined&file->DATE)
               cp->SetDate(file->date);
            if(file->defined&file->SIZE)
               cp->SetSize(file->size);
Index: NetAccess.cc
===================================================================
RCS file: /home/lav/cvsroot/lftp/src/NetAccess.cc,v
retrieving revision 1.87
diff -u -p -r1.87 NetAccess.cc
--- NetAccess.cc        27 Jul 2006 07:44:54 -0000      1.87
+++ NetAccess.cc        5 Apr 2007 13:10:06 -0000
@@ -871,7 +871,7 @@ do_again:
         cur->time=NO_DATE;
         cur->get_size = need_size && !(file->defined & file->SIZE);
         cur->get_time = need_time && (!(file->defined & file->DATE)
-                                || (file->date_prec>0 && can_get_prec_time));
+                                || (file->date.ts_prec>0 && 
can_get_prec_time));
         cur->file=0;
 
         if(file->defined & file->TYPE)

Reply via email to