]> git.eshelyaron.com Git - emacs.git/commitdiff
Avoid unnecessary rounding errors in timestamps
authorPaul Eggert <eggert@cs.ucla.edu>
Sun, 22 Oct 2017 08:04:36 +0000 (01:04 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Sun, 22 Oct 2017 08:07:32 +0000 (01:07 -0700)
Avoid the rounding errors of float-time when it’s easy.  E.g.,
replace (< (float-time a) (float-time b)) with (time-less-p a b).
* lisp/desktop.el (desktop-save):
* lisp/ecomplete.el (ecomplete-add-item):
* lisp/epg.el (epg-wait-for-completion):
* lisp/files.el (dir-locals-find-file, dir-locals-read-from-dir):
* lisp/image-dired.el (image-dired-get-thumbnail-image)
(image-dired-create-thumb-1):
* lisp/info.el (info-insert-file-contents):
* lisp/ls-lisp.el (ls-lisp-format-time):
* lisp/net/ange-ftp.el (ange-ftp-file-newer-than-file-p)
(ange-ftp-verify-visited-file-modtime):
* lisp/net/rcirc.el (rcirc-ctcp-sender-PING):
* lisp/textmodes/remember.el (remember-store-in-mailbox):
* lisp/url/url-cookie.el (url-cookie-expired-p):
Bypass float-time to avoid rounding errors.

* lisp/files.el (dir-locals-find-file):

lisp/desktop.el
lisp/ecomplete.el
lisp/epg.el
lisp/files.el
lisp/image-dired.el
lisp/info.el
lisp/ls-lisp.el
lisp/net/ange-ftp.el
lisp/net/rcirc.el
lisp/textmodes/remember.el
lisp/url/url-cookie.el

index 73228ce040b809f622348faae332b283fd4d0421..52cdbaf849d53f405f1bc255aecf47cc51ab424d 100644 (file)
@@ -1046,7 +1046,8 @@ without further confirmation."
          (or (not new-modtime)         ; nothing to overwrite
              (equal desktop-file-modtime new-modtime)
              (yes-or-no-p (if desktop-file-modtime
-                              (if (> (float-time new-modtime) (float-time desktop-file-modtime))
+                              (if (time-less-p desktop-file-modtime
+                                               new-modtime)
                                   "Desktop file is more recent than the one loaded.  Save anyway? "
                                 "Desktop file isn't the one loaded.  Overwrite it? ")
                             "Current desktop was not loaded from a file.  Overwrite this desktop file? "))
index ed23d9f5cc24bdc497f9904b0ff4c4b6f9c2146e..014b4b21122e6e5983a04518c20228269c9ce549 100644 (file)
@@ -55,7 +55,7 @@
 
 (defun ecomplete-add-item (type key text)
   (let ((elems (assq type ecomplete-database))
-       (now (string-to-number (format "%.0f" (float-time))))
+       (now (string-to-number (format-time-string "%s")))
        entry)
     (unless elems
       (push (setq elems (list type)) ecomplete-database))
index 407b0f5d5d33465e650b77ccd3968d50596b8af7..fee6ad751194e2ea47dc4e50b1514cb1bb1848bd 100644 (file)
@@ -757,9 +757,8 @@ callback data (if any)."
   ;; Restore Emacs frame on text terminal, when pinentry-curses has terminated.
   (if (with-current-buffer (process-buffer (epg-context-process context))
        (and epg-agent-file
-            (> (float-time (or (nth 5 (file-attributes epg-agent-file))
-                               '(0 0 0 0)))
-               (float-time epg-agent-mtime))))
+            (time-less-p epg-agent-mtime
+                         (or (nth 5 (file-attributes epg-agent-file)) 0))))
       (redraw-frame))
   (epg-context-set-result-for
    context 'error
index 211457ac7d7725ff38d25f2ce5341e87633aa795..9d46d5f85aa8463881ad3169f6c82d0ed233b053 100644 (file)
@@ -3947,11 +3947,12 @@ This function returns either:
                   ;; The entry MTIME should match the most recent
                   ;; MTIME among matching files.
                   (and cached-files
-                       (= (float-time (nth 2 dir-elt))
-                          (apply #'max (mapcar (lambda (f)
-                                                 (float-time
-                                                  (nth 5 (file-attributes f))))
-                                               cached-files))))))
+                      (equal (nth 2 dir-elt)
+                             (let ((latest 0))
+                               (dolist (f cached-files latest)
+                                 (let ((f-time (nth 5 (file-attributes f))))
+                                   (if (time-less-p latest f-time)
+                                       (setq latest f-time)))))))))
             ;; This cache entry is OK.
             dir-elt
           ;; This cache entry is invalid; clear it.
@@ -3973,10 +3974,15 @@ Return the new class name, which is a symbol named DIR."
   (let* ((class-name (intern dir))
          (files (dir-locals--all-files dir))
          (read-circle nil)
-         (success nil)
+        ;; If there was a problem, use the values we could get but
+        ;; don't let the cache prevent future reads.
+        (latest 0) (success 0)
          (variables))
     (with-demoted-errors "Error reading dir-locals: %S"
       (dolist (file files)
+       (let ((file-time (nth 5 (file-attributes file))))
+         (if (time-less-p latest file-time)
+           (setq latest file-time)))
         (with-temp-buffer
           (insert-file-contents file)
           (condition-case-unless-debug nil
@@ -3985,18 +3991,9 @@ Return the new class name, which is a symbol named DIR."
                                     variables
                                     (read (current-buffer))))
             (end-of-file nil))))
-      (setq success t))
+      (setq success latest))
     (dir-locals-set-class-variables class-name variables)
-    (dir-locals-set-directory-class
-     dir class-name
-     (seconds-to-time
-      (if success
-          (apply #'max (mapcar (lambda (file)
-                                 (float-time (nth 5 (file-attributes file))))
-                               files))
-        ;; If there was a problem, use the values we could get but
-        ;; don't let the cache prevent future reads.
-        0)))
+    (dir-locals-set-directory-class dir class-name success)
     class-name))
 
 (define-obsolete-function-alias 'dir-locals-read-from-file
index 30ecc2befc72e503b5eefe778bfd823ced212beb..175d9df5e8ca134040d17c8a2665f38a4dc6f8c3 100644 (file)
@@ -582,10 +582,11 @@ Create the thumbnails directory if it does not exist."
   "Return the image descriptor for a thumbnail of image file FILE."
   (unless (string-match (image-file-name-regexp) file)
     (error "%s is not a valid image file" file))
-  (let ((thumb-file (image-dired-thumb-name file)))
-    (unless (and (file-exists-p thumb-file)
-                (<= (float-time (nth 5 (file-attributes file)))
-                    (float-time (nth 5 (file-attributes thumb-file)))))
+  (let* ((thumb-file (image-dired-thumb-name file))
+        (thumb-attr (file-attributes thumb-file)))
+    (when (or (not thumb-attr)
+             (time-less-p (nth 5 thumb-attr)
+                          (nth 5 (file-attributes file))))
       (image-dired-create-thumb file thumb-file))
     (create-image thumb-file)
 ;;     (list 'image :type 'jpeg
@@ -748,10 +749,8 @@ Increase at own risk.")
    'image-dired-cmd-create-thumbnail-program)
   (let* ((width (int-to-string (image-dired-thumb-size 'width)))
          (height (int-to-string (image-dired-thumb-size 'height)))
-         (modif-time
-          (format "%.0f"
-                  (ffloor (float-time
-                           (nth 5 (file-attributes original-file))))))
+        (modif-time (format-time-string
+                     "%s" (nth 5 (file-attributes original-file))))
          (thumbnail-nq8-file (replace-regexp-in-string ".png\\'" "-nq8.png"
                                                        thumbnail-file))
          (spec
index 6f87adb04e8959bfe3b37621c1246f3c0dd5d3b1..e2f9953f7c7f79dca63f4cd1099575a21fc17701 100644 (file)
@@ -649,7 +649,7 @@ Do the right thing if the file has been compressed or zipped."
           (attribs-new (and (stringp fullname) (file-attributes fullname)))
           (modtime-new (and attribs-new (nth 5 attribs-new))))
       (when (and modtime-old modtime-new
-                (> (float-time modtime-new) (float-time modtime-old)))
+                (time-less-p modtime-old modtime-new))
        (setq Info-index-nodes (remove (assoc (or Info-current-file filename)
                                              Info-index-nodes)
                                       Info-index-nodes))
index 280e7f4bc3e295bcaf1c72956a1d22d6527dc740..66dddbbc17b2f8e21f406f8f4ff579b81c91f9d8 100644 (file)
@@ -861,7 +861,7 @@ Use the same method as ls to decide whether to show time-of-day or year,
 depending on distance between file date and the current time.
 All ls time options, namely c, t and u, are handled."
   (let* ((time (nth (or time-index 5) file-attr)) ; default is last modtime
-        (diff (- (float-time time) (float-time)))
+        (diff (time-subtract time nil))
         ;; Consider a time to be recent if it is within the past six
         ;; months.  A Gregorian year has 365.2425 * 24 * 60 * 60 ==
         ;; 31556952 seconds on the average, and half of that is 15778476.
@@ -878,7 +878,8 @@ All ls time options, namely c, t and u, are handled."
          (if (member locale '("C" "POSIX"))
              (setq locale nil))
          (format-time-string
-          (if (and (<= past-cutoff diff) (<= diff 0))
+          (if (and (not (time-less-p diff past-cutoff))
+                   (not (time-less-p 0 diff)))
               (if (and locale (not ls-lisp-use-localized-time-format))
                   "%m-%d %H:%M"
                 (nth 0 ls-lisp-format-time-list))
index 73f62c85519d85bbc6e7d35854d310f9f15a2472..cf65e10e5105d9080ad38654a6ef9f2977d9dd4f 100644 (file)
@@ -3479,7 +3479,7 @@ system TYPE.")
               (f2-mt (nth 5 (file-attributes f2))))
           (cond ((null f1-mt) nil)
                 ((null f2-mt) t)
-                (t (> (float-time f1-mt) (float-time f2-mt)))))
+               (t (time-less-p f2-mt f1-mt))))
       (ange-ftp-real-file-newer-than-file-p f1 f2))))
 
 (defun ange-ftp-file-writable-p (file)
@@ -3561,7 +3561,7 @@ Value is (0 0) if the modification time cannot be determined."
         (let ((file-mdtm (ange-ftp-file-modtime name))
               (buf-mdtm (with-current-buffer buf (visited-file-modtime))))
           (or (zerop (car file-mdtm))
-              (<= (float-time file-mdtm) (float-time buf-mdtm))))
+             (not (time-less-p buf-mdtm file-mdtm))))
       (ange-ftp-real-verify-visited-file-modtime buf))))
 
 (defun ange-ftp-file-size (file &optional ascii-mode)
index 5c785daa8a20e7cd1b494f0687976d2a2c6472c8..3b6b6c8c807c5ba72b20155070241e80a0c8ba88 100644 (file)
@@ -2333,7 +2333,7 @@ With a prefix arg, prompt for new topic."
 
 (defun rcirc-ctcp-sender-PING (process target _request)
   "Send a CTCP PING message to TARGET."
-  (let ((timestamp (format "%.0f" (float-time))))
+  (let ((timestamp (format-time-string "%s")))
     (rcirc-send-ctcp process target "PING" timestamp)))
 
 (defun rcirc-cmd-me (args &optional process target)
index b20ee8fee8418f28ec03bbc296c33226827f8ae0..730eaecc71c67e9bbafc35d031e7fd037f887356 100644 (file)
@@ -349,7 +349,7 @@ In which case `remember-mailbox' should be the name of the mailbox.
 Each piece of pseudo-mail created will have an `X-Todo-Priority'
 field, for the purpose of appropriate splitting."
   (let ((who (read-string "Who is this item related to? "))
-        (moment (format "%.0f" (float-time)))
+        (moment (format-time-string "%s"))
         (desc (remember-buffer-desc))
         (text (buffer-string)))
     (with-temp-buffer
index 453d4fe5b6fd9767ec2cbc82ee64fb18687ce35b..28dfcedeaca0dffc85c39c978b82f0507f188e8b 100644 (file)
@@ -161,7 +161,7 @@ telling Microsoft that."
   (let ((exp (url-cookie-expires cookie)))
     (and (> (length exp) 0)
         (condition-case ()
-            (> (float-time) (float-time (date-to-time exp)))
+            (time-less-p nil (date-to-time exp))
           (error nil)))))
 
 (defun url-cookie-retrieve (host &optional localpart secure)