From d5fdb1b1f6335da2a1dd60430b7521910dacab68 Mon Sep 17 00:00:00 2001 From: Robert Pluim Date: Thu, 22 Oct 2020 16:49:10 +0200 Subject: [PATCH 1/3] ; fix docstring typo in last commit --- lisp/ffap.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lisp/ffap.el b/lisp/ffap.el index 575821bdeaa..94aba5e5fb5 100644 --- a/lisp/ffap.el +++ b/lisp/ffap.el @@ -1051,8 +1051,8 @@ out of NAME." (defcustom ffap-rfc-path "https://www.rfc-editor.org/in-notes/rfc%s.txt" "A `format' string making a filename for RFC documents. -This can be an URL, and ange-ftp or Tramp remote filename to -download, or a local filename if you have full set of RFCs +This can be an URL, an ange-ftp or Tramp remote filename to +download, or a local filename if you have the full set of RFCs locally. See also `ffap-rfc-directories'." :type 'string :version "28.1") From 8dffe61a9c461506311027c99374246440bd97fe Mon Sep 17 00:00:00 2001 From: Mauro Aranda Date: Thu, 22 Oct 2020 16:55:03 +0200 Subject: [PATCH 2/3] Make State button interaction less confusing * lisp/cus-edit.el (custom-variable-current-value): New function. (custom-variable-backup-value): Use it. (custom-variable-set, custom-variable-mark-to-reset-standard): Check that old value is different than the new one. If it is, make a backup. This way, we avoid offering the Set to Backup Value unnecesarily. (custom-variable-reset-saved): Reset the variable-comment property for the variable, to help custom-variable-state be more correct. Also check if we should backup old value. (custom-variable-state): If a variable was set to the standard value, say its state is standard rather than set, which is more correct. Getting the right variable state is important for menu options to be enabled/disabled, and for displaying the right message to the user (bug#12864). --- lisp/cus-edit.el | 59 ++++++++++++++++++++++++++++++++---------------- 1 file changed, 40 insertions(+), 19 deletions(-) diff --git a/lisp/cus-edit.el b/lisp/cus-edit.el index 510c6e3b4c4..85c197b400f 100644 --- a/lisp/cus-edit.el +++ b/lisp/cus-edit.el @@ -2789,7 +2789,9 @@ Possible return values are `standard', `saved', `set', `themed', (and (equal value (eval (car tmp))) (equal comment temp)) (error nil)) - 'set + (if (equal value (eval (car (get symbol 'standard-value)))) + 'standard + 'set) 'changed)) ((progn (setq tmp (get symbol 'theme-value)) (setq temp (get symbol 'saved-variable-comment)) @@ -2859,6 +2861,18 @@ otherwise." (defun custom-variable-standard-value (widget) (get (widget-value widget) 'standard-value)) +(defun custom-variable-current-value (widget) + "Return the current value of the variable edited by WIDGET. + +WIDGET should be a custom-variable widget." + (let* ((symbol (widget-value widget)) + (get (or (get symbol 'custom-get) 'default-value)) + (type (custom-variable-type symbol)) + (conv (widget-convert type))) + (if (default-boundp symbol) + (funcall get symbol) + (widget-get conv :value)))) + (defvar custom-variable-menu nil "If non-nil, an alist of actions for the `custom-variable' widget. @@ -2989,10 +3003,12 @@ Optional EVENT is the location for the menu." (setq comment nil) ;; Make the comment invisible by hand if it's empty (custom-comment-hide comment-widget)) - (custom-variable-backup-value widget) + (setq val (widget-value child)) + (unless (equal (eval val) (custom-variable-current-value widget)) + (custom-variable-backup-value widget)) (custom-push-theme 'theme-value symbol 'user - 'set (custom-quote (widget-value child))) - (funcall set symbol (eval (setq val (widget-value child)))) + 'set (custom-quote val)) + (funcall set symbol (eval val)) (put symbol 'customized-value (list val)) (put symbol 'variable-comment comment) (put symbol 'customized-variable-comment comment)) @@ -3001,10 +3017,12 @@ Optional EVENT is the location for the menu." (setq comment nil) ;; Make the comment invisible by hand if it's empty (custom-comment-hide comment-widget)) - (custom-variable-backup-value widget) + (setq val (widget-value child)) + (unless (equal val (custom-variable-current-value widget)) + (custom-variable-backup-value widget)) (custom-push-theme 'theme-value symbol 'user - 'set (custom-quote (widget-value child))) - (funcall set symbol (setq val (widget-value child))) + 'set (custom-quote val)) + (funcall set symbol val) (put symbol 'customized-value (list (custom-quote val))) (put symbol 'variable-comment comment) (put symbol 'customized-variable-comment comment))) @@ -3073,17 +3091,23 @@ before this operation becomes the backup value." (let* ((symbol (widget-value widget)) (saved-value (get symbol 'saved-value)) (comment (get symbol 'saved-variable-comment)) + (old-value (custom-variable-current-value widget)) value) - (custom-variable-backup-value widget) (if (not (or saved-value comment)) - ;; If there is no saved value, remove the setting. - (custom-push-theme 'theme-value symbol 'user 'reset) + (progn + (setq value (car (get symbol 'standard-value))) + ;; If there is no saved value, remove the setting. + (custom-push-theme 'theme-value symbol 'user 'reset) + ;; And reset this property too. + (put symbol 'variable-comment nil)) (setq value (car-safe saved-value)) (custom-push-theme 'theme-value symbol 'user 'set value) (put symbol 'variable-comment comment)) + (unless (equal (eval value) old-value) + (custom-variable-backup-value widget)) (ignore-errors (funcall (or (get symbol 'custom-set) #'set-default) symbol - (eval (or value (car (get symbol 'standard-value)))))) + (eval value))) (put symbol 'customized-value nil) (put symbol 'customized-variable-comment nil) (widget-put widget :custom-state 'unknown) @@ -3096,7 +3120,9 @@ If `custom-reset-standard-variables-list' is nil, save, reset and redraw the widget immediately." (let* ((symbol (widget-value widget))) (if (get symbol 'standard-value) - (custom-variable-backup-value widget) + (unless (equal (custom-variable-current-value widget) + (eval (car (get symbol 'standard-value)))) + (custom-variable-backup-value widget)) (user-error "No standard setting known for %S" symbol)) (put symbol 'variable-comment nil) (put symbol 'customized-value nil) @@ -3133,13 +3159,8 @@ becomes the backup value, so you can get it again." (defun custom-variable-backup-value (widget) "Back up the current value for WIDGET's variable. The backup value is kept in the car of the `backup-value' property." - (let* ((symbol (widget-value widget)) - (get (or (get symbol 'custom-get) 'default-value)) - (type (custom-variable-type symbol)) - (conv (widget-convert type)) - (value (if (default-boundp symbol) - (funcall get symbol) - (widget-get conv :value)))) + (let ((symbol (widget-value widget)) + (value (custom-variable-current-value widget))) (put symbol 'backup-value (list value)))) (defun custom-variable-reset-backup (widget) From 997ebf91dd6b1f586af44843c37aaad4708011c3 Mon Sep 17 00:00:00 2001 From: Stefan Kangas Date: Thu, 22 Oct 2020 16:34:11 +0200 Subject: [PATCH 3/3] Use lexical-binding in time-date.el and expand tests * lisp/calendar/time-date.el: Use lexical-binding. * test/lisp/calendar/time-date-tests.el (test-obsolete-with-decoded-time-value) (test-obsolete-encode-time-value, test-format-seconds) (test-days-to-time, test-seconds-to-string): New tests. (test-days-in-month, test-time-since, test-time-decoded-period): Expand test with a few more values. --- lisp/calendar/time-date.el | 2 +- test/lisp/calendar/time-date-tests.el | 52 ++++++++++++++++++++++++++- 2 files changed, 52 insertions(+), 2 deletions(-) diff --git a/lisp/calendar/time-date.el b/lisp/calendar/time-date.el index 638d8c1f884..f60c9c2ffd3 100644 --- a/lisp/calendar/time-date.el +++ b/lisp/calendar/time-date.el @@ -1,4 +1,4 @@ -;;; time-date.el --- Date and time handling functions +;;; time-date.el --- Date and time handling functions -*- lexical-binding: t -*- ;; Copyright (C) 1998-2020 Free Software Foundation, Inc. diff --git a/test/lisp/calendar/time-date-tests.el b/test/lisp/calendar/time-date-tests.el index 233d43cd01a..3f8954a8ff9 100644 --- a/test/lisp/calendar/time-date-tests.el +++ b/test/lisp/calendar/time-date-tests.el @@ -22,19 +22,67 @@ (require 'ert) (require 'time-date) +(ert-deftest test-obsolete-with-decoded-time-value () + (with-suppressed-warnings ((obsolete with-decoded-time-value)) + (with-decoded-time-value ((high low micro pico type '(1 2 3 4 5 6 8 8))) + (should (equal (list high low micro pico type) '(1 2 3 4 3)))))) + +(ert-deftest test-obsolete-encode-time-value () + (should (equal (with-suppressed-warnings ((obsolete encode-time-value)) + (encode-time-value 1 2 3 4 0)) + '(1 . 2))) + (should (equal (with-suppressed-warnings ((obsolete encode-time-value)) + (encode-time-value 1 2 3 4 1)) + '(1 2))) + (should (equal (with-suppressed-warnings ((obsolete encode-time-value)) + (encode-time-value 1 2 3 4 2)) + '(1 2 3))) + (should (equal (with-suppressed-warnings ((obsolete encode-time-value)) + (encode-time-value 1 2 3 4 3)) + '(1 2 3 4)))) + (ert-deftest test-leap-year () (should-not (date-leap-year-p 1999)) (should-not (date-leap-year-p 1900)) (should (date-leap-year-p 2000)) (should (date-leap-year-p 2004))) +(ert-deftest test-days-to-time () + (should (equal (days-to-time 0) '(0 0))) + (should (equal (days-to-time 1) '(1 20864))) + (should (equal (days-to-time 999) '(1317 2688))) + (should (equal (days-to-time 0.0) '(0 0 0 0))) + (should (equal (days-to-time 0.5) '(0 43200 0 0))) + (should (equal (days-to-time 1.0) '(1 20864 0 0))) + (should (equal (days-to-time 999.0) '(1317 2688 0 0)))) + +(ert-deftest test-seconds-to-string () + (should (equal (seconds-to-string 0) "0s")) + (should (equal (seconds-to-string 9) "9.00s")) + (should (equal (seconds-to-string 99) "99.00s")) + (should (equal (seconds-to-string 999) "16.65m")) + (should (equal (seconds-to-string 9999) "2.78h")) + (should (equal (seconds-to-string 99999) "27.78h")) + (should (equal (seconds-to-string 999999) "11.57d")) + (should (equal (seconds-to-string 9999999) "115.74d")) + (should (equal (seconds-to-string 99999999) "3.17y")) + (should (equal (seconds-to-string 999999999) "31.69y"))) + (ert-deftest test-days-in-month () (should (= (date-days-in-month 2004 2) 29)) (should (= (date-days-in-month 2004 3) 31)) + (should (= (date-days-in-month 2019 2) 28)) + (should (= (date-days-in-month 2020 12) 31)) (should-not (= (date-days-in-month 1900 3) 28)) + (should-error (date-days-in-month 2020 0)) (should-error (date-days-in-month 2020 15)) (should-error (date-days-in-month 2020 'foo))) +(ert-deftest test-format-seconds () + (should (equal (format-seconds "%y %d %h %m %s %%" 0) "0 0 0 0 0 %")) + (should (equal (format-seconds "%y %d %h %m %s %%" 9999999) "0 115 17 46 39 %")) + (should (equal (format-seconds "%y %d %h %m %z %s %%" 1) " 1 %"))) + (ert-deftest test-ordinal () (should (equal (date-ordinal-to-time 2008 271) '(nil nil nil 27 9 2008 nil nil nil))) @@ -107,7 +155,8 @@ '(12 15 14 8 7 2019 1 t 7200))))) (ert-deftest test-time-since () - (should (time-equal-p 0 (time-since nil)))) + (should (time-equal-p 0 (time-since nil))) + (should (= (cadr (time-since (time-subtract (current-time) 1))) 1))) (ert-deftest test-time-decoded-period () (should (equal (decoded-time-period '(nil nil 1 nil nil nil nil nil nil)) @@ -119,6 +168,7 @@ (should (equal (decoded-time-period '(0 0 0 1 0 0 nil nil nil)) 86400)) (should (equal (decoded-time-period '(0 0 0 0 1 0 nil nil nil)) 2592000)) (should (equal (decoded-time-period '(0 0 0 0 0 1 nil nil nil)) 31536000)) + (should (equal (decoded-time-period '(1 2 3 4 5 6 nil nil nil)) 202532521)) (should (equal (decoded-time-period '((135 . 10) 0 0 0 0 0 nil nil nil)) 13.5)))