summaryrefslogtreecommitdiff
path: root/lisp
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2015-07-26 00:01:34 -0700
committerPaul Eggert <eggert@cs.ucla.edu>2015-07-26 12:44:54 -0700
commitaf32fa956267af40db61051c248597144d41521c (patch)
treeafd650b9f9805474df149081e51cc8abae3bdb87 /lisp
parent4c55786d9b2a5d571f3e543cc261ce0702c7341e (diff)
downloademacs-af32fa956267af40db61051c248597144d41521c.tar.gz
New optional ZONE arg for format-time-string etc.
This simplifies time conversions in other time zones. It also prevents display-time-world tampering with TZ (Bug#21020). * admin/admin.el (add-release-logs): Use improved add-log-time-format API. * admin/merge-gnulib (GNULIB_MODULES): Add time_rz, timegm. (GNULIB_TOOL_FLAGS): Avoid flexmember, setenv, unsetenv. * configure.ac (tzalloc): Remove test for this, since Emacs no longer uses HAVE_TZALLOC directly. * doc/lispref/os.texi (Time of Day, Time Conversion) (Time Parsing): * etc/NEWS: Document the new behavior. Merge from gnulib, incorporating: 2015-07-25 strftime: fix newly-introduced bug on Solaris 2015-07-23 fprintftime, strftime: use timezone_t args * lib/gnulib.mk, m4/gnulib-comp.m4: Regenerate. * lib/strftime.c, lib/strftime.h, lib/time.in.h, m4/sys_time_h.m4: * m4/time_h.m4: Update from gnulib. * lib/time_rz.c, lib/timegm.c, m4/time_rz.m4, m4/timegm.m4: New files from gnulib. * lisp/time-stamp.el (time-stamp-string): * lisp/time.el (display-time-world-list) (display-time-world-display): Use new API, with time zone arg. * lisp/time.el (display-time-world-display): Fix race when current-time advances while we're running. * lisp/vc/add-log.el (add-log-iso8601-time-zone) (add-log-iso8601-time-string): Accept optional time zone arg. * lisp/vc/add-log.el (add-change-log-entry): * lisp/vc/log-edit.el (log-edit-changelog-ours-p): Use new arg. * nt/gnulib.mk: Propagate lib/gnulib.mk changes here. Add rules for the time module, since they're now needed for tzalloc etc. * src/conf_post.h (getenv_TZ, setenv_TZ): New macros. (emacs_getenv_TZ, emacs_setenv_TZ): New decls. * src/editfns.c: Include errno.h. (set_time_zone_rule): Omit unnecessary forward decl. (initial_tz): Remove, replacing with ... (local_tz, wall_clock_tz, utc_tz): New static vars and constants. (tzeqlen): New constant; prefer it to (sizeof "TZ=" - 1). (emacs_localtime_rz, emacs_mktime_z, xtzalloc, xtzfree) (tzlookup): New static functions. (init_editfns): New arg DUMPING. All uses changed. (init_editfns): Omit most initialization if dumping, not if !initialized. Initialize wall_clock_tz and local_tz. (emacs_nmemftime, format_time_string): Time zone argument can now be any time zone, not just a boolean for UTC or local time. All callers changed. (Fformat_time_string, Fencode_time, Fcurrent_time_string) (Fcurrent_time_zone): New optional arg ZONE. (Fdecode_time, Fset_time_zone_rule): ZONE arg can now also take the same form as with the other new additions. (decode_time_zone): Remove; no longer needed. (tzvalbuf): Now file-scope. (emacs_getenv_TZ, emacs_setenv_TZ): New functions. (syms_of_editfns): Define Qwall. * src/editfns.c (mktime_z) [!HAVE_TZALLOC]: * src/systime.h (mktime_z, timezone_t, tzalloc, tzfree) [!HAVE_TZALLOC]: Remove; now supplied by gnulib. * src/emacs.c (main): * src/lisp.h (init_editfns): Adjust to init_editfns API change.
Diffstat (limited to 'lisp')
-rw-r--r--lisp/time-stamp.el12
-rw-r--r--lisp/time.el33
-rw-r--r--lisp/vc/add-log.el23
-rw-r--r--lisp/vc/log-edit.el3
4 files changed, 24 insertions, 47 deletions
diff --git a/lisp/time-stamp.el b/lisp/time-stamp.el
index 24e5ef47d29..1e0fe9919d2 100644
--- a/lisp/time-stamp.el
+++ b/lisp/time-stamp.el
@@ -420,16 +420,8 @@ format the string."
(or ts-format
(setq ts-format time-stamp-format))
(if (stringp ts-format)
- (if (stringp time-stamp-time-zone)
- (let ((ts-real-time-zone (getenv "TZ")))
- (unwind-protect
- (progn
- (setenv "TZ" time-stamp-time-zone)
- (format-time-string
- (time-stamp-string-preprocess ts-format)))
- (setenv "TZ" ts-real-time-zone)))
- (format-time-string
- (time-stamp-string-preprocess ts-format)))
+ (format-time-string (time-stamp-string-preprocess ts-format)
+ nil time-stamp-time-zone)
;; handle version 1 compatibility
(cond ((or (eq time-stamp-old-format-warn 'error)
(and (eq time-stamp-old-format-warn 'ask)
diff --git a/lisp/time.el b/lisp/time.el
index ae0e598b64c..d35f5b93964 100644
--- a/lisp/time.el
+++ b/lisp/time.el
@@ -160,15 +160,8 @@ LABEL is a string to display as the label of that TIMEZONE's time."
(defcustom display-time-world-list
;; Determine if zoneinfo style timezones are supported by testing that
;; America/New York and Europe/London return different timezones.
- (let ((old-tz (getenv "TZ"))
- gmt nyt)
- (unwind-protect
- (progn
- (setenv "TZ" "America/New_York")
- (setq nyt (format-time-string "%z"))
- (setenv "TZ" "Europe/London")
- (setq gmt (format-time-string "%z")))
- (setenv "TZ" old-tz))
+ (let ((nyt (format-time-string "%z" nil "America/New_York"))
+ (gmt (format-time-string "%z" nil "Europe/London")))
(if (string-equal nyt gmt)
legacy-style-world-list
zoneinfo-style-world-list))
@@ -523,21 +516,19 @@ See `display-time-world'."
"Replace current buffer text with times in various zones, based on ALIST."
(let ((inhibit-read-only t)
(buffer-undo-list t)
- (old-tz (getenv "TZ"))
+ (now (current-time))
(max-width 0)
result fmt)
(erase-buffer)
- (unwind-protect
- (dolist (zone alist)
- (let* ((label (cadr zone))
- (width (string-width label)))
- (setenv "TZ" (car zone))
- (push (cons label
- (format-time-string display-time-world-time-format))
- result)
- (when (> width max-width)
- (setq max-width width))))
- (setenv "TZ" old-tz))
+ (dolist (zone alist)
+ (let* ((label (cadr zone))
+ (width (string-width label)))
+ (push (cons label
+ (format-time-string display-time-world-time-format
+ now (car zone)))
+ result)
+ (when (> width max-width)
+ (setq max-width width))))
(setq fmt (concat "%-" (int-to-string max-width) "s %s\n"))
(dolist (timedata (nreverse result))
(insert (format fmt (car timedata) (cdr timedata))))
diff --git a/lisp/vc/add-log.el b/lisp/vc/add-log.el
index eb7e5bfdfad..c90413c42c2 100644
--- a/lisp/vc/add-log.el
+++ b/lisp/vc/add-log.el
@@ -581,8 +581,8 @@ If t, use universal time.")
(put 'add-log-time-zone-rule 'safe-local-variable
(lambda (x) (or (booleanp x) (stringp x))))
-(defun add-log-iso8601-time-zone (&optional time)
- (let* ((utc-offset (or (car (current-time-zone time)) 0))
+(defun add-log-iso8601-time-zone (&optional time zone)
+ (let* ((utc-offset (or (car (current-time-zone time zone)) 0))
(sign (if (< utc-offset 0) ?- ?+))
(sec (abs utc-offset))
(ss (% sec 60))
@@ -596,12 +596,11 @@ If t, use universal time.")
(defvar add-log-iso8601-with-time-zone nil)
-(defun add-log-iso8601-time-string ()
- (let ((time (format-time-string "%Y-%m-%d"
- nil (eq t add-log-time-zone-rule))))
+(defun add-log-iso8601-time-string (&optional time zone)
+ (let ((date (format-time-string "%Y-%m-%d" time zone)))
(if add-log-iso8601-with-time-zone
- (concat time " " (add-log-iso8601-time-zone))
- time)))
+ (concat date " " (add-log-iso8601-time-zone time zone))
+ date)))
(defun change-log-name ()
"Return (system-dependent) default name for a change log file."
@@ -848,14 +847,8 @@ non-nil, otherwise in local time."
(let ((new-entries
(mapcar (lambda (addr)
(concat
- (if (stringp add-log-time-zone-rule)
- (let ((tz (getenv "TZ")))
- (unwind-protect
- (progn
- (setenv "TZ" add-log-time-zone-rule)
- (funcall add-log-time-format))
- (setenv "TZ" tz)))
- (funcall add-log-time-format))
+ (funcall add-log-time-format
+ nil add-log-time-zone-rule)
" " full-name
" <" addr ">"))
(if (consp mailing-address)
diff --git a/lisp/vc/log-edit.el b/lisp/vc/log-edit.el
index d59549772c0..acbd9c0cd9f 100644
--- a/lisp/vc/log-edit.el
+++ b/lisp/vc/log-edit.el
@@ -872,7 +872,8 @@ Return non-nil if it is."
(and (boundp 'user-mail-address) user-mail-address)))
(time (or (and (boundp 'add-log-time-format)
(functionp add-log-time-format)
- (funcall add-log-time-format))
+ (funcall add-log-time-format
+ nil add-log-time-zone-rule))
(format-time-string "%Y-%m-%d"))))
(if (null log-edit-changelog-use-first)
(looking-at (regexp-quote (format "%s %s <%s>" time name mail)))