unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* bug#34315: [PATCH] icalendar.el: DURATION fix + more robust timezone handling
@ 2019-02-04 11:48 Thomas Plass
  2019-02-12 18:57 ` Ulf Jasper
  0 siblings, 1 reply; 51+ messages in thread
From: Thomas Plass @ 2019-02-04 11:48 UTC (permalink / raw)
  To: 34315

[-- Attachment #1: message body text --]
[-- Type: text/plain, Size: 2051 bytes --]

The attached patch contains a fix for what looks like a clerical error
in icalendar--decode-isoduration(), test case: P1DT2H.

But the real point of this post is to propose a few improvements to
handling timezones.

I use icalendar.el as a library for dealing with raw VCALENDAR data.
Also, I'm on Windows where the OS makes Emacs' timezone handling a
bit tricky.  Meaning that, unless precautions are taken, datetime
conversions by icalendar.el sometimes are incorrect, in particular
around DST transitions.

Changes in the patch:

 - add an optional argument to icalendar--decode-isodatetime() which
   is passed to decode-time().

   So, both encode-time() and decode-time() get to have their
   respective timezones which makes datetime conversions predictable.
   I know, I could do a (setenv "TZ" (icalendar--convert-tz-offset
   ...))  before I call icalendar--decode-isodatetime() but that +
   restoring the environment variable afterwards looks clumsy.

 - handle RDATE in icalendar--convert-tz-offset() in a rudimentary
   fashion.

   RDATE handling is required for those VTIMEZONEs that do not specify
   RRULE, otherwise there will be no datetime conversions at all.

 - identify the latest oberservance for DAYLIGHT and STANDARD
   specifications within one VTIMEZONE, again supporting RDATE.

   As is, icalendar.el handles multiple such specifications
   indiscriminately, resulting in conversions that may be relative to
   a date centuries in the past.

   The relevance of this change is this: when a VCALENDAR does not
   contain a VTIMEZONE section or e.g. the popular nonstandard
   X-WR-TIMEZONE property, my application goes and fetches one from a
   tzdata database such as tzurl.org.  Standard tzurl.org responses
   contain lots of historical records.  Yes, tzurl.org also returns
   "Outlook-style" VTIMEZONEs which icalendar.el is quite happy with
   but that doesn't help me with complex VTIMEZONEs contained in
   incoming VCALENDARs.


The patch is not a --git diff.  Is that tolerable at all?

Best regards

Thomas



[-- Attachment #2: icalendar.el.patch --]
[-- Type: application/x-diff, Size: 5712 bytes --]

^ permalink raw reply	[flat|nested] 51+ messages in thread

* bug#34315: [PATCH] icalendar.el: DURATION fix + more robust timezone handling
  2019-02-04 11:48 bug#34315: [PATCH] icalendar.el: DURATION fix + more robust timezone handling Thomas Plass
@ 2019-02-12 18:57 ` Ulf Jasper
  2019-02-15 17:17   ` Ulf Jasper
  0 siblings, 1 reply; 51+ messages in thread
From: Ulf Jasper @ 2019-02-12 18:57 UTC (permalink / raw)
  To: Thomas Plass; +Cc: 34315

Thanks for the patch.  I'll have a look.

Ulf





^ permalink raw reply	[flat|nested] 51+ messages in thread

* bug#34315: [PATCH] icalendar.el: DURATION fix + more robust timezone handling
  2019-02-12 18:57 ` Ulf Jasper
@ 2019-02-15 17:17   ` Ulf Jasper
  2019-02-18  9:36     ` Thomas Plass
  2020-08-10 11:48     ` Lars Ingebrigtsen
  0 siblings, 2 replies; 51+ messages in thread
From: Ulf Jasper @ 2019-02-15 17:17 UTC (permalink / raw)
  To: Thomas Plass; +Cc: 34315

Thomas,

the patch looks good so far.  Could you please provide some testcases so
that I can add some unit tests?

Best,
ulf





^ permalink raw reply	[flat|nested] 51+ messages in thread

* bug#34315: [PATCH] icalendar.el: DURATION fix + more robust timezone handling
  2019-02-15 17:17   ` Ulf Jasper
@ 2019-02-18  9:36     ` Thomas Plass
  2019-02-18 15:59       ` Eli Zaretskii
  2020-08-10 11:48     ` Lars Ingebrigtsen
  1 sibling, 1 reply; 51+ messages in thread
From: Thomas Plass @ 2019-02-18  9:36 UTC (permalink / raw)
  To: Ulf Jasper; +Cc: 34315

[-- Attachment #1: message body text --]
[-- Type: text/plain, Size: 5275 bytes --]

[specific Emacs behaviour/bug question at end, list subscribers please read on]

Ulf Jasper wrote at 18:17 on February 15, 2019:
: the patch looks good so far.  Could you please provide some testcases

thanks.  A set of iCalendar files is in the attached archive
along with a README and a slightly cleaner version of the patch.
However, for unit testing, you'd need to not only consider the
data but the OS, too.  What follows is not only meant as a reply
to your request but is also a question for the Emacs maintainers.

The date-time that prompted me to look at this in detail is Sat,
Nov 3 2018 20:15 Europe/Berlin local time, the OS is Windows (7).
I made tests with two pre-built binaries, the official GNU 26.1:

(emacs-version)
"GNU Emacs 26.1 (build 1, x86_64-w64-mingw32)
 of 2018-05-30"

and an older "SourceForge" 25.3 build.

I don't know what makes Sat, Nov 3 2018 (and the weekdays preceding
it) so peculiar, but my hunch is its proximity to the DST transition
that occured on the Sunday six days earlier, the "fifth week" of Oct.

The decode/encode combo in the forms below is essentially the
guts of icalendar--decode-isodatetime(), old and patched.  The
zone rule for Europe/Berlin is the current standard one, also
computed by icalendar--convert-tz-offset().

The point of these examples is to see how time zone rules
missing/supplied/in environment affect date-time conversions.

Here's code for a same-zone scenario, note the two TZ setenv()s:

(let ((Europe/Berlin "STD-01:00DST-02:00,M3.5.0/02:00:00,M10.5.0/03:00:00"))
  ;; force Windows behaviour, usually no TZ set 
  (setenv "TZ")                   
  (print (decode-time (encode-time 0 15 20 3 11 2018                            )))
  (print (decode-time (encode-time 0 15 20 3 11 2018 Europe/Berlin)              ))
  (print (decode-time (encode-time 0 15 20 3 11 2018 Europe/Berlin) Europe/Berlin))
  ;; force Unixoid/POSIX? behaviour
  (setenv "TZ" Europe/Berlin)
  (print (decode-time (encode-time 0 15 20 3 11 2018                            )))
  (print (decode-time (encode-time 0 15 20 3 11 2018 Europe/Berlin)              ))
  (print (decode-time (encode-time 0 15 20 3 11 2018 Europe/Berlin) Europe/Berlin))
  nil)


Official Windows-26.1 evals to (comments by me):

(0 15 20 3 11 2018 6 nil 3600)          ; correct, no-brainer

(0 15 19 3 11 2018 6 nil 3600)          ; wrong: 19:15?!

(0 15 20 3 11 2018 6 t 7200)            ; "less" wrong: DST is on?!

(0 15 20 3 11 2018 6 t 7200)            ; "less" wrong: DST is on?!

(0 15 20 3 11 2018 6 t 7200)            ; "less" wrong: DST is on?!

(0 15 20 3 11 2018 6 t 7200)            ; "less" wrong: DST is on?!


SourceForge 25.3 performs slightly better:

(0 15 20 3 11 2018 6 nil 3600)          ; correct

(0 15 19 3 11 2018 6 nil 3600)          ; wrong: 19:15?!

(0 15 20 3 11 2018 6 t 7200)            ; "less" wrong: DST is on?!

(0 15 20 3 11 2018 6 nil 3600)          ; correct

(0 15 20 3 11 2018 6 nil 3600)          ; correct

(0 15 20 3 11 2018 6 nil 3600)          ; correct


Never mind the DST weirdness, I can live with this behaviour as
producing the desired 20:15 is possible in a predictable fashion.

But it get's even weirder.

Consider the following different-zone conversion.
America/Creston is UTC-7, adding UTC+1 for Europe/Berlin makes an
8 hour difference.  So, Berlin 20:15 is Creston 12:15, see also
https://www.timeanddate.com/worldclock/converter.html?iso=20181103T191500&p1=37&p2=2274

Let's check:

(let ((Europe/Berlin "STD-01:00DST-02:00,M3.5.0/02:00:00,M10.5.0/03:00:00")
      (America/Creston "STD+07:00"))
  ;; force Windows behaviour
  (setenv "TZ")                   
  (print (decode-time (encode-time 0 15 12 3 11 2018)))
  (print (decode-time (encode-time 0 15 12 3 11 2018 America/Creston)))
  (print (decode-time (encode-time 0 15 12 3 11 2018 America/Creston) Europe/Berlin))
  ;; force Unixoid/POSIX? behaviour
  (setenv "TZ" Europe/Berlin)
  (print (decode-time (encode-time 0 15 12 3 11 2018)))
  (print (decode-time (encode-time 0 15 12 3 11 2018 America/Creston)))
  (print (decode-time (encode-time 0 15 12 3 11 2018 America/Creston) Europe/Berlin))
  nil)


Eval says (Official Windows-26.1):

(0 15 12 3 11 2018 6 nil 3600)  ; correct (no conversion possible)

(0 15 20 3 11 2018 6 nil 3600)  ; correct 20:15 with "their-zone" conversion only

(0 15 21 3 11 2018 6 t 7200)    ; wrong: 21:15 with "their zone" + "my zone" conversion 

(0 15 12 3 11 2018 6 nil 3600)  ; correct (TZ in env applicable for decoding only)

(0 15 21 3 11 2018 6 t 7200)    ; wrong time 21:15 + wrong DST=on

(0 15 21 3 11 2018 6 t 7200)    ; wrong time 21:15 + wrong DST=on


SourceForge 25.3 is slightly different:

(0 15 12 3 11 2018 6 t 7200)

(0 15 20 3 11 2018 6 nil 3600)

(0 15 21 3 11 2018 6 t 7200)

(0 15 12 3 11 2018 6 nil 3600)

(0 15 21 3 11 2018 6 t 7200)

(0 15 21 3 11 2018 6 t 7200)


Things are fine again for dates following (Nov 4 etc.), ie.
when October's "fifth week" comes to an end.

If I remember correctly, Arch Linux pre-built 26.1 is always correct.

So, getting the desired 20:15 is dependent on - what?  Is it possible
to drive decode-time/encode-time to always convert between time zones
correctly and if so, how?  Is this a bug in Emacs or am I just
uninformed?

Thomas


[-- Attachment #2: icalendar019-patch+testcases.zip --]
[-- Type: application/zip, Size: 6169 bytes --]

^ permalink raw reply	[flat|nested] 51+ messages in thread

* bug#34315: [PATCH] icalendar.el: DURATION fix + more robust timezone handling
  2019-02-18  9:36     ` Thomas Plass
@ 2019-02-18 15:59       ` Eli Zaretskii
  2019-02-18 19:15         ` Thomas Plass
  0 siblings, 1 reply; 51+ messages in thread
From: Eli Zaretskii @ 2019-02-18 15:59 UTC (permalink / raw)
  To: Thomas Plass; +Cc: 34315

> Date: Mon, 18 Feb 2019 10:36:29 +0100
> From: thunk2@arcor.de (Thomas Plass)
> Cc: 34315@debbugs.gnu.org
> 
> I don't know what makes Sat, Nov 3 2018 (and the weekdays preceding
> it) so peculiar, but my hunch is its proximity to the DST transition
> that occured on the Sunday six days earlier, the "fifth week" of Oct.
> 
> The decode/encode combo in the forms below is essentially the
> guts of icalendar--decode-isodatetime(), old and patched.  The
> zone rule for Europe/Berlin is the current standard one, also
> computed by icalendar--convert-tz-offset().
> 
> The point of these examples is to see how time zone rules
> missing/supplied/in environment affect date-time conversions.
> 
> Here's code for a same-zone scenario, note the two TZ setenv()s:
> 
> (let ((Europe/Berlin "STD-01:00DST-02:00,M3.5.0/02:00:00,M10.5.0/03:00:00"))

You cannot expect MS-Windows to support Posix DST rules such as above
in the C runtime functions like mktime, localtime, etc.  Windows
support for DST rules in C runtime is very rudimentary, and is limited
to the likes of EST-5DST, without any specification of when the DST
transitions happen (the transition dates are hard-coded in the Windows
C runtime).

I think this factoid goes a long way towards explaining why you get
wrong results for the timezone offset around the DST transition date.

To make myself clear: modern Windows systems do have database of DST
transition rules, and they do apply these rules both for setting the
system clock and in APIs such as GetTimeZoneInformation.  But the
rules are not in Posix format (although the information is of course
equivalent), and these capabilities are not propagated to C runtime
functions which Emacs uses.





^ permalink raw reply	[flat|nested] 51+ messages in thread

* bug#34315: [PATCH] icalendar.el: DURATION fix + more robust timezone handling
  2019-02-18 15:59       ` Eli Zaretskii
@ 2019-02-18 19:15         ` Thomas Plass
  2019-02-18 19:30           ` Eli Zaretskii
  0 siblings, 1 reply; 51+ messages in thread
From: Thomas Plass @ 2019-02-18 19:15 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 34315

Eli Zaretskii wrote at 17:59 on February 18, 2019:
: these capabilities are not propagated to C runtime
: functions which Emacs uses.

I take it then, Windows pre-built users have no way to work around
this in Elisp?

What about the C source?  Is there any way for a total C-dummy like me
to tweak/hard wire a rule for my local zone into the source?  Could
you point me at the file(s)/place(s) in the Git that I'd need to look
at?

It'll be daunting to do this on Windows.  The last time I built an
emacs must have been jwz's lemacs under SunOS back in '93...

Thomas





^ permalink raw reply	[flat|nested] 51+ messages in thread

* bug#34315: [PATCH] icalendar.el: DURATION fix + more robust timezone handling
  2019-02-18 19:15         ` Thomas Plass
@ 2019-02-18 19:30           ` Eli Zaretskii
  2019-02-18 20:03             ` Thomas Plass
  0 siblings, 1 reply; 51+ messages in thread
From: Eli Zaretskii @ 2019-02-18 19:30 UTC (permalink / raw)
  To: Thomas Plass; +Cc: 34315

> Date: Mon, 18 Feb 2019 20:15:19 +0100
> From: thunk2@arcor.de (Thomas Plass)
> Cc: 34315@debbugs.gnu.org
> 
> Eli Zaretskii wrote at 17:59 on February 18, 2019:
> : these capabilities are not propagated to C runtime
> : functions which Emacs uses.
> 
> I take it then, Windows pre-built users have no way to work around
> this in Elisp?

Not in Lisp, no.

> What about the C source?  Is there any way for a total C-dummy like me
> to tweak/hard wire a rule for my local zone into the source?  Could
> you point me at the file(s)/place(s) in the Git that I'd need to look
> at?

I don't understand what kind of C-level change do you have in mind.
AFAIU, any change to support this stuff would involve writing (or
importing from a free source) a parser for such DST rules, and then
using APIs like SetDynamicTimeZoneInformation to make the parsed rule
in effect.  It would probably also mean replacing localtime and its
ilk with versions that actually access the DST data set by the above
APIs.  Is that what you had in mind?





^ permalink raw reply	[flat|nested] 51+ messages in thread

* bug#34315: [PATCH] icalendar.el: DURATION fix + more robust timezone handling
  2019-02-18 19:30           ` Eli Zaretskii
@ 2019-02-18 20:03             ` Thomas Plass
  2019-02-18 20:16               ` Eli Zaretskii
  0 siblings, 1 reply; 51+ messages in thread
From: Thomas Plass @ 2019-02-18 20:03 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 34315


Eli Zaretskii wrote at 21:30 on February 18, 2019:
: 
: I don't understand what kind of C-level change do you have in mind.

To be frank, I have no idea whatsoever.  If this is something that
hasn't bothered any maintainer enough to fix it, then it's probably no
use for a non-C+non-Windows-API guy like me to try.

All I could do is to lobby?





^ permalink raw reply	[flat|nested] 51+ messages in thread

* bug#34315: [PATCH] icalendar.el: DURATION fix + more robust timezone handling
  2019-02-18 20:03             ` Thomas Plass
@ 2019-02-18 20:16               ` Eli Zaretskii
  0 siblings, 0 replies; 51+ messages in thread
From: Eli Zaretskii @ 2019-02-18 20:16 UTC (permalink / raw)
  To: Thomas Plass; +Cc: 34315

> Date: Mon, 18 Feb 2019 21:03:15 +0100
> From: thunk2@arcor.de (Thomas Plass)
> Cc: 34315@debbugs.gnu.org
> 
> All I could do is to lobby?

You could also file a wishlist bug report.  Maybe someone will be
interested enough to do something like that, who knows.





^ permalink raw reply	[flat|nested] 51+ messages in thread

* bug#34315: [PATCH] icalendar.el: DURATION fix + more robust timezone handling
  2019-02-15 17:17   ` Ulf Jasper
  2019-02-18  9:36     ` Thomas Plass
@ 2020-08-10 11:48     ` Lars Ingebrigtsen
  2020-08-10 16:08       ` Ulf Jasper
  1 sibling, 1 reply; 51+ messages in thread
From: Lars Ingebrigtsen @ 2020-08-10 11:48 UTC (permalink / raw)
  To: Ulf Jasper; +Cc: 34315, Thomas Plass

Ulf Jasper <ulf.jasper@web.de> writes:

> Thomas,
>
> the patch looks good so far.  Could you please provide some testcases so
> that I can add some unit tests?

This was over a year ago.

As far as I understand it, the patch itself is good and fixes a real
problem in icalendar date parsing?  But then the thread turned towards
questions about daylight savings time handling in Windows, and the patch
itself wasn't applied?

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





^ permalink raw reply	[flat|nested] 51+ messages in thread

* bug#34315: [PATCH] icalendar.el: DURATION fix + more robust timezone handling
  2020-08-10 11:48     ` Lars Ingebrigtsen
@ 2020-08-10 16:08       ` Ulf Jasper
  2020-08-10 16:45         ` Eli Zaretskii
  0 siblings, 1 reply; 51+ messages in thread
From: Ulf Jasper @ 2020-08-10 16:08 UTC (permalink / raw)
  To: Lars Ingebrigtsen, Eli Zaretskii; +Cc: 34315, Thomas Plass

It seems that I lost track of this issue.  Sorry.

Am 10.08.2020 um 13:48 (+0200) schrieb Lars Ingebrigtsen:

> As far as I understand it, the patch itself is good and fixes a real
> problem in icalendar date parsing?

IIRC the patch looked good insofar as it appeared to address only the
observed problem and to be properly documented and formatted although I
was not able to reproduce the problem.

> But then the thread turned towards questions about daylight savings
> time handling in Windows, and the patch itself wasn't applied?

Right, the patch was not applied.

Eli pointed out that the root cause lies in the dst handling in
ms-windows (and not in newsticker). That makes the patch more of a
work-around than a fix.

I admit that I am not very much inclined to check and apply the patch as
I do not have a ms-windows box to run tests on.

Eli, what do you think?







^ permalink raw reply	[flat|nested] 51+ messages in thread

* bug#34315: [PATCH] icalendar.el: DURATION fix + more robust timezone handling
  2020-08-10 16:08       ` Ulf Jasper
@ 2020-08-10 16:45         ` Eli Zaretskii
  2020-08-10 17:04           ` Thomas Plass
  0 siblings, 1 reply; 51+ messages in thread
From: Eli Zaretskii @ 2020-08-10 16:45 UTC (permalink / raw)
  To: Ulf Jasper; +Cc: larsi, 34315, thunk2

> From: Ulf Jasper <ulf.jasper@web.de>
> Cc: thunk2@arcor.de (Thomas Plass),  34315@debbugs.gnu.org
> Date: Mon, 10 Aug 2020 18:08:34 +0200
> 
> IIRC the patch looked good insofar as it appeared to address only the
> observed problem and to be properly documented and formatted although I
> was not able to reproduce the problem.
> 
> > But then the thread turned towards questions about daylight savings
> > time handling in Windows, and the patch itself wasn't applied?
> 
> Right, the patch was not applied.
> 
> Eli pointed out that the root cause lies in the dst handling in
> ms-windows (and not in newsticker). That makes the patch more of a
> work-around than a fix.
> 
> I admit that I am not very much inclined to check and apply the patch as
> I do not have a ms-windows box to run tests on.
> 
> Eli, what do you think?

My comments were not about the patch (which I admit I don't really
understand, as I don't use icalendar), but about the attempts to see
what happens with time under different TZ settings.

As for the patch, I've looked at it again now, and I don't think it's
specific to MS-Windows, is it?  If so, and if you think it's good,
feel free to install.

Thanks.





^ permalink raw reply	[flat|nested] 51+ messages in thread

* bug#34315: [PATCH] icalendar.el: DURATION fix + more robust timezone handling
  2020-08-10 16:45         ` Eli Zaretskii
@ 2020-08-10 17:04           ` Thomas Plass
  2020-08-11 11:01             ` Lars Ingebrigtsen
  0 siblings, 1 reply; 51+ messages in thread
From: Thomas Plass @ 2020-08-10 17:04 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: larsi, 34315

Eli Zaretskii wrote at 19:45 on August 10, 2020:
: 
: As for the patch, I've looked at it again now, and I don't think it's
: specific to MS-Windows, is it?

Exactly, the patch has nothing to do with MS-Windows' DST handling
(though incidentally, it was developed while dealing with that issue).

It fixes general issues with icalendar.el's handling of timezones as
commonly used in ical data and the standard tzurl.org repo.  It is
also completely backwards-compatible as far as I can make out.

Here's the README for the testcases I provided to Ulf along with the patch:

  This ZIP contains a patch for icalendar.el 0.19 and a set of iCalendar test files.
  VTIMEZONE sections contained therein were retrieved from http://tzurl.org.
  
   - Europe_Berlin-20181103T201500_no_in-calendar_VTIMEZONE.ics
     no VTIMEZONE, so no TZID references for DTSTART/DTEND, contains
     non-standard property X-WR-TIMEZONE which is invisible to icalendar.el
  
   - Europe_Berlin-20181103T201500_in-calendar_VTIMEZONE_tzurl_standard.ics
     standard VTIMEZONE ("Outlook-style")
  
   - Europe_Berlin-20181103T201500_in-calendar_VTIMEZONE_tzurl_historical.ics
     comprehensive VTIMEZONE including historical records
  
   - America_Creston-20181103T121500_in-calendar_VTIMEZONE_tzurl_standard.ics
     standard ("Outlook-style") VTIMEZONE
  
   - America_Creston-20181103T121500_in-calendar_VTIMEZONE_tzurl_historical_RDATE.ics
     comprehensive VTIMEZONE including historical records which use RDATE, not RRULE






^ permalink raw reply	[flat|nested] 51+ messages in thread

* bug#34315: [PATCH] icalendar.el: DURATION fix + more robust timezone handling
  2020-08-10 17:04           ` Thomas Plass
@ 2020-08-11 11:01             ` Lars Ingebrigtsen
  2020-08-11 15:14               ` Ulf Jasper
  0 siblings, 1 reply; 51+ messages in thread
From: Lars Ingebrigtsen @ 2020-08-11 11:01 UTC (permalink / raw)
  To: Thomas Plass; +Cc: Thomas Plass, 34315

thunk2@arcor.de (Thomas Plass) writes:

> It fixes general issues with icalendar.el's handling of timezones as
> commonly used in ical data and the standard tzurl.org repo.  It is
> also completely backwards-compatible as far as I can make out.
>
> Here's the README for the testcases I provided to Ulf along with the patch:

Can you respin the patch and add the test cases to
test/lisp/calendar/icalendar-tests.el?  The icalendar test files should
go to a new test/data/icalendar directory, I guess.

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





^ permalink raw reply	[flat|nested] 51+ messages in thread

* bug#34315: [PATCH] icalendar.el: DURATION fix + more robust timezone handling
  2020-08-11 11:01             ` Lars Ingebrigtsen
@ 2020-08-11 15:14               ` Ulf Jasper
  2020-08-11 15:19                 ` Lars Ingebrigtsen
  2020-08-12 13:08                 ` Thomas Plass
  0 siblings, 2 replies; 51+ messages in thread
From: Ulf Jasper @ 2020-08-11 15:14 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: Thomas Plass, 34315, Thomas Plass

Am 11.08.2020 um 13:01 (+0200) schrieb Lars Ingebrigtsen:
> thunk2@arcor.de (Thomas Plass) writes:
>
>> It fixes general issues with icalendar.el's handling of timezones as
>> commonly used in ical data and the standard tzurl.org repo.  It is
>> also completely backwards-compatible as far as I can make out.
>>
>> Here's the README for the testcases I provided to Ulf along with the patch:
>
> Can you respin the patch and add the test cases to
> test/lisp/calendar/icalendar-tests.el?  The icalendar test files should
> go to a new test/data/icalendar directory, I guess.

IIRC icalendar-tests.el does not make use of the testdata directory.

Thomas, could you please provide the expected results for the test files,
one for each ics file?  Thanks!





^ permalink raw reply	[flat|nested] 51+ messages in thread

* bug#34315: [PATCH] icalendar.el: DURATION fix + more robust timezone handling
  2020-08-11 15:14               ` Ulf Jasper
@ 2020-08-11 15:19                 ` Lars Ingebrigtsen
  2020-08-11 15:45                   ` Ulf Jasper
  2020-08-12 13:08                 ` Thomas Plass
  1 sibling, 1 reply; 51+ messages in thread
From: Lars Ingebrigtsen @ 2020-08-11 15:19 UTC (permalink / raw)
  To: Ulf Jasper; +Cc: Thomas Plass, 34315, Thomas Plass

Ulf Jasper <ulf.jasper@web.de> writes:

> IIRC icalendar-tests.el does not make use of the testdata directory.

No, but I think it should.  :-)  At least when adding new tests -- it's
easier to be sure that we're really testing the right thing when we've
not stringified the icalendar data into a Lisp string...

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





^ permalink raw reply	[flat|nested] 51+ messages in thread

* bug#34315: [PATCH] icalendar.el: DURATION fix + more robust timezone handling
  2020-08-11 15:19                 ` Lars Ingebrigtsen
@ 2020-08-11 15:45                   ` Ulf Jasper
  0 siblings, 0 replies; 51+ messages in thread
From: Ulf Jasper @ 2020-08-11 15:45 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: Thomas Plass, 34315, Thomas Plass

Am 11.08.2020 um 17:19 (+0200) schrieb Lars Ingebrigtsen:
> Ulf Jasper <ulf.jasper@web.de> writes:
>
>> IIRC icalendar-tests.el does not make use of the testdata directory.
>
> No, but I think it should.  :-)  At least when adding new tests -- it's
> easier to be sure that we're really testing the right thing when we've
> not stringified the icalendar data into a Lisp string...

Agree.  icalendar-tests are hard to read.  sigh.






^ permalink raw reply	[flat|nested] 51+ messages in thread

* bug#34315: [PATCH] icalendar.el: DURATION fix + more robust timezone handling
  2020-08-11 15:14               ` Ulf Jasper
  2020-08-11 15:19                 ` Lars Ingebrigtsen
@ 2020-08-12 13:08                 ` Thomas Plass
  2020-08-12 13:12                   ` Lars Ingebrigtsen
  1 sibling, 1 reply; 51+ messages in thread
From: Thomas Plass @ 2020-08-12 13:08 UTC (permalink / raw)
  To: Ulf Jasper; +Cc: Lars Ingebrigtsen, 34315, Thomas Plass

[-- Attachment #1: message body text --]
[-- Type: text/plain, Size: 2440 bytes --]

Attached is an updated ZIP containing the respun patch and the
unmodified samples. The patch is against
https://git.savannah.gnu.org/cgit/emacs.git/tree/lisp/calendar/icalendar.el
blob: d76c11050312b4a04ac1cbda436b3c08fc6f2cc5

Hopefully, this is OK as it is.

I also extended the README in the ZIP to clarify what the patch is about:

  The aim of the patch is to support robust date-time conversions based
  on the VTIMEZONE sections in the iCalendar data.  VTIMEZONE specifies
  the source timezone while the target timezone is supplied externally
  (by the OS, environment, user, etc).
  
  Assuming a target timezone of Europe/Berlin, the local start time of
  all events defined in the sample files is November 3, 2018 20:15h
  (20181103T201500).

Aside: the clerical (?) error in `icalendar--decode-isoduration' is
also part of the patch but has nothing to do with conversions.

Ulf Jasper wrote at 17:14 on August 11, 2020:
: Am 11.08.2020 um 13:01 (+0200) schrieb Lars Ingebrigtsen:
: 
: Thomas, could you please provide the expected results for the test files,
: one for each ics file?  Thanks!

Well, the expected result depends on:

 - The local timezone of the person running the code.  Where I'm
   sitting, it is November 3, 2018 20:15h for all samples.  

   Europe_Berlin-20181103T201500_no_in-calendar_VTIMEZONE.ics contains
   no VTIMEZONE and thus has a somewhat undefined result.  The user
   agent is assumed to do the right thing based on OS/environment/user/AI.

   Note: this particular date+time is carefully chosen as it is
         subject to DST adjustments.  Under MS-Windows, it exercises
         Emacs' buggy DST handling.  But this fact is just incidental
         and not addressed by the patch.

 - Expectations as to how the conversion result is to be rendered.  In
   my case rendering of the iCal data is done by a MIME handler I
   cooked up for VM.  This is mainly used for rendering incoming
   meeting requests necessitating accurate date calculations.

Technical note: The concept of "target zone" is implemented by an
additional optional argument to `icalendar--decode-isodatetime'.  My
VM plugin's function for getting the event dates (inspired by
`icalendar--convert-ical-to-diary') says:

  (icalendar--decode-isodatetime dtstart nil dtstart-zone local-zone)

where there is a lot of apparatus for computing 'dtstart-zone and
'local-zone.  If you'd like to know more, I can send the code.




[-- Attachment #2: icalendar-patch+testcases_20200812.zip --]
[-- Type: application/zip, Size: 6457 bytes --]

^ permalink raw reply	[flat|nested] 51+ messages in thread

* bug#34315: [PATCH] icalendar.el: DURATION fix + more robust timezone handling
  2020-08-12 13:08                 ` Thomas Plass
@ 2020-08-12 13:12                   ` Lars Ingebrigtsen
  2020-08-12 13:30                     ` Thomas Plass
  0 siblings, 1 reply; 51+ messages in thread
From: Lars Ingebrigtsen @ 2020-08-12 13:12 UTC (permalink / raw)
  To: Thomas Plass; +Cc: 34315

thunk2@arcor.de (Thomas Plass) writes:

> Attached is an updated ZIP containing the respun patch and the
> unmodified samples. The patch is against
> https://git.savannah.gnu.org/cgit/emacs.git/tree/lisp/calendar/icalendar.el
> blob: d76c11050312b4a04ac1cbda436b3c08fc6f2cc5
>
> Hopefully, this is OK as it is.

It would be better to add the test cases in the test/data directory and
add the tests as code to icalendar-tests.el...

> : Thomas, could you please provide the expected results for the test files,
> : one for each ics file?  Thanks!
>
> Well, the expected result depends on:
>
>  - The local timezone of the person running the code.  Where I'm
>    sitting, it is November 3, 2018 20:15h for all samples.  

(etc)

This is why the test cases should bind the time zone to whatever it is
it's testing -- that way we can easily ensure that the code continues to
work.

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





^ permalink raw reply	[flat|nested] 51+ messages in thread

* bug#34315: [PATCH] icalendar.el: DURATION fix + more robust timezone handling
  2020-08-12 13:12                   ` Lars Ingebrigtsen
@ 2020-08-12 13:30                     ` Thomas Plass
  2020-08-12 15:06                       ` Ulf Jasper
  0 siblings, 1 reply; 51+ messages in thread
From: Thomas Plass @ 2020-08-12 13:30 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: 34315

Lars Ingebrigtsen wrote at 15:12 on August 12, 2020:
: 
: It would be better to add the test cases in the test/data directory and
: add the tests as code to icalendar-tests.el...

Certainly.  But apparently I'm too stupid to find that file and the
test/data dir.  Can someone send it to me?  As I have no commit
privileges and also am unable to build Emacs, I haven't checked out
the git.  So if the maintainer(s) could assist or extend the tests,
I'd be grateful.






^ permalink raw reply	[flat|nested] 51+ messages in thread

* bug#34315: [PATCH] icalendar.el: DURATION fix + more robust timezone handling
  2020-08-12 13:30                     ` Thomas Plass
@ 2020-08-12 15:06                       ` Ulf Jasper
  2020-09-02 18:05                         ` Ulf Jasper
  0 siblings, 1 reply; 51+ messages in thread
From: Ulf Jasper @ 2020-08-12 15:06 UTC (permalink / raw)
  To: Thomas Plass; +Cc: Lars Ingebrigtsen, 34315

Am 12.08.2020 um 15:30 (+0200) schrieb Thomas Plass:
> Lars Ingebrigtsen wrote at 15:12 on August 12, 2020:
> :
> : It would be better to add the test cases in the test/data directory and
> : add the tests as code to icalendar-tests.el...
>
> Certainly.  But apparently I'm too stupid to find that file and the
> test/data dir.  Can someone send it to me?  As I have no commit
> privileges and also am unable to build Emacs, I haven't checked out
> the git.  So if the maintainer(s) could assist or extend the tests,
> I'd be grateful.

Don't worry.  I shall write or enhance the tests for the
icalendar-functions that you changed.  I shall also write tests that
check import of the ics files that you supplied.






^ permalink raw reply	[flat|nested] 51+ messages in thread

* bug#34315: [PATCH] icalendar.el: DURATION fix + more robust timezone handling
  2020-08-12 15:06                       ` Ulf Jasper
@ 2020-09-02 18:05                         ` Ulf Jasper
  2020-09-03  8:38                           ` Thomas Plass
  0 siblings, 1 reply; 51+ messages in thread
From: Ulf Jasper @ 2020-09-02 18:05 UTC (permalink / raw)
  To: Thomas Plass; +Cc: Lars Ingebrigtsen, 34315

Just pushed two commits containing 1) unit tests and 2) your patch and
more tests.

I had to make a small change in the patched version of
`icalendar--decode-isodatetime' regarding input data in utc zone.
Please have a look.






^ permalink raw reply	[flat|nested] 51+ messages in thread

* bug#34315: [PATCH] icalendar.el: DURATION fix + more robust timezone handling
  2020-09-02 18:05                         ` Ulf Jasper
@ 2020-09-03  8:38                           ` Thomas Plass
  2020-09-03 14:28                             ` Ulf Jasper
  0 siblings, 1 reply; 51+ messages in thread
From: Thomas Plass @ 2020-09-03  8:38 UTC (permalink / raw)
  To: Ulf Jasper; +Cc: Lars Ingebrigtsen, 34315

Thanks, approved.  Defaulting to local time when decoding seems
reasonable.

Ulf Jasper wrote at 20:05 on September 2, 2020:
: I had to make a small change in the patched version of
: `icalendar--decode-isodatetime' regarding input data in utc zone.







^ permalink raw reply	[flat|nested] 51+ messages in thread

* bug#34315: [PATCH] icalendar.el: DURATION fix + more robust timezone handling
  2020-09-03  8:38                           ` Thomas Plass
@ 2020-09-03 14:28                             ` Ulf Jasper
  2020-09-12  8:01                               ` Thomas Plass
  2020-09-29 10:05                               ` Thomas Plass
  0 siblings, 2 replies; 51+ messages in thread
From: Ulf Jasper @ 2020-09-03 14:28 UTC (permalink / raw)
  To: Thomas Plass; +Cc: Lars Ingebrigtsen, 34315

Thomas,

after committing your changes I learned that your contribution counts as
a non-trivial change that is sufficiently large to make a copyright
assignment necessary.

So, would you please assign the copyright for your contribution(s) to
the FSF?

In order to do this, please ask on emacs-devel@gnu.org, and we will send
you the necessary form together with the instructions to fill and email
it, in order to start this legal paperwork.

I should have asked you to assign copyright before I incorporated your
changes.  My mistake.  Sorry!

All the best,
Ulf





^ permalink raw reply	[flat|nested] 51+ messages in thread

* bug#34315: [PATCH] icalendar.el: DURATION fix + more robust timezone handling
  2020-09-03 14:28                             ` Ulf Jasper
@ 2020-09-12  8:01                               ` Thomas Plass
  2020-09-12  8:11                                 ` Eli Zaretskii
  2020-09-13  4:07                                 ` Richard Stallman
  2020-09-29 10:05                               ` Thomas Plass
  1 sibling, 2 replies; 51+ messages in thread
From: Thomas Plass @ 2020-09-12  8:01 UTC (permalink / raw)
  To: Ulf Jasper; +Cc: Lars Ingebrigtsen, 34315

In case anyone is waiting:

Ulf Jasper wrote at 16:28 on September 3, 2020:
: 
: So, would you please assign the copyright for your contribution(s) to
: the FSF?

Seven days ago I returned the signed agreement to assign@gnu.org
cc'ing the FSF copyright clerk.  No reply since.  Presumably, the
assignment ("GNU EMACS") is in effect.





^ permalink raw reply	[flat|nested] 51+ messages in thread

* bug#34315: [PATCH] icalendar.el: DURATION fix + more robust timezone handling
  2020-09-12  8:01                               ` Thomas Plass
@ 2020-09-12  8:11                                 ` Eli Zaretskii
  2020-09-13  4:07                                 ` Richard Stallman
  1 sibling, 0 replies; 51+ messages in thread
From: Eli Zaretskii @ 2020-09-12  8:11 UTC (permalink / raw)
  To: Thomas Plass; +Cc: larsi, 34315

> Date: Sat, 12 Sep 2020 10:01:41 +0200
> From: thunk2@arcor.de (Thomas Plass)
> Cc: Lars Ingebrigtsen <larsi@gnus.org>,
>     Eli Zaretskii <eliz@gnu.org>,
>     34315@debbugs.gnu.org
> 
> In case anyone is waiting:
> 
> Ulf Jasper wrote at 16:28 on September 3, 2020:
> : 
> : So, would you please assign the copyright for your contribution(s) to
> : the FSF?
> 
> Seven days ago I returned the signed agreement to assign@gnu.org
> cc'ing the FSF copyright clerk.  No reply since.  Presumably, the
> assignment ("GNU EMACS") is in effect.

Not yet, AFAICT.  if you get no responses in another week, please ping
them and CC me.

Thanks.





^ permalink raw reply	[flat|nested] 51+ messages in thread

* bug#34315: [PATCH] icalendar.el: DURATION fix + more robust timezone handling
  2020-09-12  8:01                               ` Thomas Plass
  2020-09-12  8:11                                 ` Eli Zaretskii
@ 2020-09-13  4:07                                 ` Richard Stallman
  1 sibling, 0 replies; 51+ messages in thread
From: Richard Stallman @ 2020-09-13  4:07 UTC (permalink / raw)
  To: Thomas Plass; +Cc: larsi, 34315

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > Seven days ago I returned the signed agreement to assign@gnu.org
  > cc'ing the FSF copyright clerk.  No reply since.  Presumably, the
  > assignment ("GNU EMACS") is in effect.

It ought to be, but we should wait for confirmation.
-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)







^ permalink raw reply	[flat|nested] 51+ messages in thread

* bug#34315: [PATCH] icalendar.el: DURATION fix + more robust timezone handling
  2020-09-03 14:28                             ` Ulf Jasper
  2020-09-12  8:01                               ` Thomas Plass
@ 2020-09-29 10:05                               ` Thomas Plass
  2020-10-01  1:45                                 ` Lars Ingebrigtsen
  1 sibling, 1 reply; 51+ messages in thread
From: Thomas Plass @ 2020-09-29 10:05 UTC (permalink / raw)
  To: Ulf Jasper; +Cc: Lars Ingebrigtsen, 34315

[-- Attachment #1: message body text --]
[-- Type: text/plain, Size: 676 bytes --]

Two pieces of news:

 - as of yesterday, my assignment/disclaimer process with the FSF has
   been completed

 - in celebration, I'd like to submit yet another patch that extends
   icalendar.el's timezone handling, this one intended to support
   regions that at some point in the past made a permanent switch from
   a DST/STD scheme to STD-only/DST-only.  Cases in point are China
   and Turkey,
   cf. https://en.wikipedia.org/wiki/Daylight_saving_time_in_Asia.

   Ulf, would you care to review the code and the included test cases?


Ulf Jasper wrote at 16:28 on September 3, 2020:
: 
: So, would you please assign the copyright for your contribution(s) to
: the FSF?



[-- Attachment #2: icalendar-patch2+testcases_20200924.zip --]
[-- Type: application/zip, Size: 6044 bytes --]

^ permalink raw reply	[flat|nested] 51+ messages in thread

* bug#34315: [PATCH] icalendar.el: DURATION fix + more robust timezone handling
  2020-09-29 10:05                               ` Thomas Plass
@ 2020-10-01  1:45                                 ` Lars Ingebrigtsen
  2020-10-01  1:50                                   ` Lars Ingebrigtsen
  2020-10-01 13:38                                   ` Thomas Plass
  0 siblings, 2 replies; 51+ messages in thread
From: Lars Ingebrigtsen @ 2020-10-01  1:45 UTC (permalink / raw)
  To: Thomas Plass; +Cc: 34315, Jan Tatarik

[-- Attachment #1: Type: text/plain, Size: 1080 bytes --]

thunk2@arcor.de (Thomas Plass) writes:

>  - in celebration, I'd like to submit yet another patch that extends
>    icalendar.el's timezone handling, this one intended to support
>    regions that at some point in the past made a permanent switch from
>    a DST/STD scheme to STD-only/DST-only.  Cases in point are China
>    and Turkey,
>    cf. https://en.wikipedia.org/wiki/Daylight_saving_time_in_Asia.
>
>    Ulf, would you care to review the code and the included test cases?

Thanks for the code.  It was in slightly inconvenient format -- we
prefer just simple patches, so I've reformatted it as such below.

However, the code makes two tests fail:

2 unexpected results:
   FAILED  icalendar--convert-tz-offset
   FAILED  icalendar--parse-vtimezone

I haven't actually looked at the failing cases, though.

In addition, the test cases included aren't actually used?  Could you
propose some code to use them?  (It should go in
test/lisp/calendar/icalendar-tests.el.)

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: icalendar.patch --]
[-- Type: text/x-diff, Size: 18249 bytes --]

diff --git a/lisp/calendar/icalendar.el b/lisp/calendar/icalendar.el
index dab277487e..e4760db3e4 100644
--- a/lisp/calendar/icalendar.el
+++ b/lisp/calendar/icalendar.el
@@ -519,46 +519,56 @@ icalendar--convert-tz-offset
 	 (dtstart (car (cddr (assq 'DTSTART alist))))
 	 (no-dst (or rdate-p (equal offsetto offsetfrom))))
     ;; FIXME: the presence of an RDATE is assumed to denote the first day of the year
-    (when (and offsetto dtstart (or rrule-value no-dst))
-      (let* ((rrule (icalendar--split-value rrule-value))
-	     (freq (cadr (assq 'FREQ rrule)))
-	     (bymonth (cadr (assq 'BYMONTH rrule)))
-	     (byday (cadr (assq 'BYDAY rrule))))
-	;; FIXME: we don't correctly handle WKST here.
-	(if (or no-dst (and (string= freq "YEARLY") bymonth))
-	    (cons
-	     (concat
-	      ;; Fake a name.
-	      (if dst-p "DST" "STD")
-	      ;; For TZ, OFFSET is added to the local time.  So,
-	      ;; invert the values.
-	      (if (eq (aref offsetto 0) ?-) "+" "-")
-	      (substring offsetto 1 3)
-	      ":"
-	      (substring offsetto 3 5))
-	     ;; The start time.
-             (let* ((day (if no-dst
-                             1
-                           (icalendar--get-weekday-number (substring byday -2))))
-                    (week (if no-dst
-                              "1"
-                            (if (eq day -1)
-				byday
-			      (substring byday 0 -2)))))
-		 ;; "Translate" the iCalendar way to specify the last
-		 ;; (sun|mon|...)day in month to the tzset way.
-		 (if (string= week "-1")  ; last day as iCalendar calls it
+    (if (and offsetto dtstart (or rrule-value no-dst))
+        (let* ((rrule (icalendar--split-value rrule-value))
+	       (freq (cadr (assq 'FREQ rrule)))
+	       (bymonth (cadr (assq 'BYMONTH rrule)))
+	       (byday (cadr (assq 'BYDAY rrule))))
+	  ;; FIXME: we don't correctly handle WKST here.
+	  (if (or no-dst (and (string= freq "YEARLY") bymonth))
+	      (cons
+	       (concat
+	        ;; Fake a name.
+	        (if dst-p "DST" "STD")
+	        ;; For TZ, OFFSET is added to the local time.  So,
+	        ;; invert the values.
+	        (if (eq (aref offsetto 0) ?-) "+" "-")
+	        (substring offsetto 1 3)
+	        ":"
+	        (substring offsetto 3 5))
+	       ;; The start time.
+               (let* ((day (if no-dst
+                               1
+                             (icalendar--get-weekday-number (substring byday -2))))
+                      (week (if no-dst
+                                "1"
+                              (if (eq day -1)
+				  byday
+			        (substring byday 0 -2)))))
+	         ;; "Translate" the iCalendar way to specify the last
+	         ;; (sun|mon|...)day in month to the tzset way.
+	         (if (string= week "-1")  ; last day as iCalendar calls it
 		     (setq week "5"))     ; last day as tzset calls it
                  (when no-dst (setq bymonth "1"))
 		 (concat "M" bymonth "." week "." (if (eq day -1) "0"
 						    (int-to-string day))
-			 ;; Start time.
-			 "/"
-			 (substring dtstart -6 -4)
-			 ":"
-			 (substring dtstart -4 -2)
-			 ":"
-			 (substring dtstart -2)))))))))
+		         ;; Start time.
+		         "/"
+		         (substring dtstart -6 -4)
+		         ":"
+		         (substring dtstart -4 -2)
+		         ":"
+		         (substring dtstart -2))))))
+      ;; neither RRULE nor RDATE present: return the offset and a placeholder
+      (cons
+       (concat
+	;; Fake a name.
+	(if dst-p "DST" "STD")
+	(if (eq (aref offsetto 0) ?-) "+" "-")
+	(substring offsetto 1 3)
+	":"
+	(substring offsetto 3 5))
+       dtstart))))
 
 (defun icalendar--parse-vtimezone (alist)
   "Turn a VTIMEZONE ALIST into a cons (ID . TZ-STRING).
@@ -571,34 +581,59 @@ icalendar--parse-vtimezone
 	 (standard (cadr (cdar (icalendar--get-most-recent-observance alist 'STANDARD))))
 	 (std (and standard (icalendar--convert-tz-offset standard nil))))
     (if (and tz-id std)
-	(cons tz-id
-	      (if day
-		  (concat (car std) (car day)
-			  "," (cdr day) "," (cdr std))
-		(car std))))))
+        (cons tz-id
+              (if (and (not (assq 'RRULE daylight))
+                       (not (assq 'RRULE standard)))
+                  (let ((daylight-rdate (and (assq 'RDATE daylight)
+                                             (icalendar--get-most-recent-observance-from-sub-comp
+                                              daylight
+                                              '(RDATE))))
+                        (standard-rdate (and (assq 'RDATE standard)
+                                             (icalendar--get-most-recent-observance-from-sub-comp
+                                              standard
+                                              '(RDATE)))))
+                    (if (and daylight-rdate
+                             standard-rdate
+                             (string-greaterp daylight-rdate standard-rdate))
+                        (car day)
+                      (car std)))
+	        (if day
+		    (concat (car std) (car day)
+			    "," (cdr day) "," (cdr std))
+		  (car std)))))))
 
 (defun icalendar--get-most-recent-observance (alist sub-comp)
-  "Return the latest observance for SUB-COMP DAYLIGHT or STANDARD.
+  "Return the latest observance of all SUB-COMPs DAYLIGHT or STANDARD.
 ALIST is a VTIMEZONE potentially containing historical records."
-;FIXME?: "most recent" should be relative to a given date
+;FIXME: "most recent" should be relative to a given date and
+;       avoid selecting a SUB-COMP valid for dates in the future.
   (let ((components (icalendar--get-children alist sub-comp)))
     (list
      (car
       (sort components
             #'(lambda (a b)
-                (let* ((get-recent (lambda (n)
-                                     (car
-                                      (sort
-                                       (delq nil
-                                             (mapcar (lambda (p)
-                                                       (and (memq (car p) '(DTSTART RDATE))
-                                                            (car (cddr p))))
-                                                     n))
-                                       'string-greaterp))))
-                       (a-recent (funcall get-recent (car (cddr a))))
-                       (b-recent (funcall get-recent (car (cddr b)))))
+                (let* ((a-recent (icalendar--get-most-recent-observance-from-sub-comp
+                                  (car (cddr a))
+                                  '(DTSTART RDATE)))
+                       (b-recent (icalendar--get-most-recent-observance-from-sub-comp
+                                  (car (cddr b))
+                                  '(DTSTART RDATE))))
                   (string-greaterp a-recent b-recent))))))))
 
+(defun icalendar--get-most-recent-observance-from-sub-comp (alist sym-list)
+  "Return the latest observance for ALIST DAYLIGHT or STANDARD.
+ALIST is an individual DAYLIGHT or STANDARD.
+SYM-LIST is a list of property names DTSTART and/or RDATE
+for filtering ALIST."
+  (car
+   (sort
+    (delq nil
+          (mapcar (lambda (p)
+                    (when (memq (car p) sym-list)
+                      (car (cddr p))))
+                  alist))
+    'string-greaterp)))
+
 (defun icalendar--convert-all-timezones (icalendar)
   "Convert all timezones in the ICALENDAR into an alist.
 Each element of the alist is a cons (ID . TZ-STRING),
diff --git a/test/lisp/calendar/icalendar-resources/Asia_Istanbul_20200924T120000_in-calendar_VTIMEZONE_tzurl_org.ics b/test/lisp/calendar/icalendar-resources/Asia_Istanbul_20200924T120000_in-calendar_VTIMEZONE_tzurl_org.ics
new file mode 100644
index 0000000000..6425909be6
--- /dev/null
+++ b/test/lisp/calendar/icalendar-resources/Asia_Istanbul_20200924T120000_in-calendar_VTIMEZONE_tzurl_org.ics
@@ -0,0 +1,219 @@
+BEGIN:VCALENDAR

+PRODID:manual

+VERSION:2.0

+BEGIN:VTIMEZONE

+TZID:Asia/Istanbul

+TZURL:http://tzurl.org/zoneinfo/Asia/Istanbul

+X-LIC-LOCATION:Asia/Istanbul

+BEGIN:STANDARD

+TZOFFSETFROM:+015552

+TZOFFSETTO:+015656

+TZNAME:IMT

+DTSTART:18800101T000000

+RDATE:18800101T000000

+END:STANDARD

+BEGIN:STANDARD

+TZOFFSETFROM:+015656

+TZOFFSETTO:+0200

+TZNAME:EET

+DTSTART:19101001T000000

+RDATE:19101001T000000

+END:STANDARD

+BEGIN:DAYLIGHT

+TZOFFSETFROM:+0200

+TZOFFSETTO:+0300

+TZNAME:EEST

+DTSTART:19160501T000000

+RDATE:19160501T000000

+RDATE:19200328T000000

+RDATE:19210403T000000

+RDATE:19220326T000000

+RDATE:19240513T000000

+RDATE:19250501T000000

+RDATE:19400630T000000

+RDATE:19401201T000000

+RDATE:19420401T000000

+RDATE:19450402T000000

+RDATE:19460601T000000

+RDATE:19470420T000000

+RDATE:19480418T000000

+RDATE:19490410T000000

+RDATE:19500419T000000

+RDATE:19510422T000000

+RDATE:19620715T000000

+RDATE:19640515T000000

+RDATE:19700503T000000

+RDATE:19710502T000000

+RDATE:19720507T000000

+RDATE:19730603T010000

+RDATE:19740331T020000

+RDATE:19750330T000000

+RDATE:19760601T000000

+RDATE:19770403T000000

+RDATE:19780402T000000

+RDATE:19860330T010000

+RDATE:19870329T010000

+RDATE:19880327T010000

+RDATE:19890326T010000

+RDATE:19900325T010000

+RDATE:19910331T010000

+RDATE:19920329T010000

+RDATE:19930328T010000

+RDATE:19940320T010000

+RDATE:19950326T010000

+RDATE:19960331T010000

+RDATE:19970330T010000

+RDATE:19980329T010000

+RDATE:19990328T010000

+RDATE:20000326T010000

+RDATE:20010325T010000

+RDATE:20020331T010000

+RDATE:20030330T010000

+RDATE:20040328T010000

+RDATE:20050327T010000

+RDATE:20060326T010000

+RDATE:20070325T030000

+RDATE:20080330T030000

+RDATE:20090329T030000

+RDATE:20100328T030000

+RDATE:20110328T030000

+RDATE:20120325T030000

+RDATE:20130331T030000

+RDATE:20140331T030000

+RDATE:20150329T030000

+RDATE:20160327T030000

+END:DAYLIGHT

+BEGIN:STANDARD

+TZOFFSETFROM:+0300

+TZOFFSETTO:+0200

+TZNAME:EET

+DTSTART:19161001T000000

+RDATE:19161001T000000

+RDATE:19201025T000000

+RDATE:19211003T000000

+RDATE:19221008T000000

+RDATE:19241001T000000

+RDATE:19251001T000000

+RDATE:19401005T000000

+RDATE:19410921T000000

+RDATE:19421101T000000

+RDATE:19451008T000000

+RDATE:19461001T000000

+RDATE:19471005T000000

+RDATE:19481003T000000

+RDATE:19491002T000000

+RDATE:19501008T000000

+RDATE:19511008T000000

+RDATE:19621008T000000

+RDATE:19641001T000000

+RDATE:19701004T000000

+RDATE:19711003T000000

+RDATE:19721008T000000

+RDATE:19731104T030000

+RDATE:19741103T050000

+RDATE:19751026T000000

+RDATE:19761031T000000

+RDATE:19771016T000000

+RDATE:19850928T000000

+RDATE:19860928T020000

+RDATE:19870927T020000

+RDATE:19880925T020000

+RDATE:19890924T020000

+RDATE:19900930T020000

+RDATE:19910929T020000

+RDATE:19920927T020000

+RDATE:19930926T020000

+RDATE:19940925T020000

+RDATE:19950924T020000

+RDATE:19961027T020000

+RDATE:19971026T020000

+RDATE:19981025T020000

+RDATE:19991031T020000

+RDATE:20001029T020000

+RDATE:20011028T020000

+RDATE:20021027T020000

+RDATE:20031026T020000

+RDATE:20041031T020000

+RDATE:20051030T020000

+RDATE:20061029T020000

+RDATE:20071028T040000

+RDATE:20081026T040000

+RDATE:20091025T040000

+RDATE:20101031T040000

+RDATE:20111030T040000

+RDATE:20121028T040000

+RDATE:20131027T040000

+RDATE:20141026T040000

+END:STANDARD

+BEGIN:DAYLIGHT

+TZOFFSETFROM:+0300

+TZOFFSETTO:+0400

+TZNAME:+04

+DTSTART:19781015T000000

+RDATE:19781015T000000

+RDATE:19800406T030000

+RDATE:19810329T030000

+RDATE:19820328T030000

+RDATE:19830731T000000

+END:DAYLIGHT

+BEGIN:DAYLIGHT

+TZOFFSETFROM:+0400

+TZOFFSETTO:+0400

+TZNAME:+04

+DTSTART:19790401T030000

+RDATE:19790401T030000

+END:DAYLIGHT

+BEGIN:STANDARD

+TZOFFSETFROM:+0400

+TZOFFSETTO:+0300

+TZNAME:+03

+DTSTART:19791015T000000

+RDATE:19791015T000000

+RDATE:19801013T000000

+RDATE:19811012T000000

+RDATE:19821011T000000

+RDATE:19831002T000000

+END:STANDARD

+BEGIN:DAYLIGHT

+TZOFFSETFROM:+0300

+TZOFFSETTO:+0300

+TZNAME:EEST

+DTSTART:19850420T000000

+RDATE:19850420T000000

+RDATE:20151025T040000

+END:DAYLIGHT

+BEGIN:STANDARD

+TZOFFSETFROM:+0200

+TZOFFSETTO:+0200

+TZNAME:EET

+DTSTART:20070101T000000

+RDATE:20070101T000000

+RDATE:20110327T030000

+RDATE:20140330T030000

+END:STANDARD

+BEGIN:STANDARD

+TZOFFSETFROM:+0300

+TZOFFSETTO:+0200

+DTSTART:20151108T040000

+RDATE:20151108T040000

+END:STANDARD

+BEGIN:STANDARD

+TZOFFSETFROM:+0300

+TZOFFSETTO:+0300

+TZNAME:+03

+DTSTART:20160907T000000

+RDATE:20160907T000000

+END:STANDARD

+END:VTIMEZONE

+BEGIN:VEVENT

+CLASS:PUBLIC

+DTSTART;TZID=Asia/Istanbul:20200924T120000

+DTEND;TZID=Asia/Istanbul:20200924T130000

+UID:Asia_Istanbul_20200924T120000_in-calendar_VTIMEZONE_tzurl_org.ics

+DTSTAMP:20190127T140400

+DESCRIPTION:date 2020-09-24, Istanbul local time 12:00 UTC+3, in-calendar

+  VTIMEZONE as returned by http://tzurl.org/zoneinfo/Asia/Istanbul

+SUMMARY:date 2020-09-24, Istanbul local time 12:00 UTC+3, in-calendar

+  VTIMEZONE as returned by http://tzurl.org/zoneinfo/Asia/Istanbul

+END:VEVENT

+END:VCALENDAR

diff --git a/test/lisp/calendar/icalendar-resources/Asia_Shanghai_20200916T070000_in-calendar_VTIMEZONE_multi_DAYLIGHT_STANDARD.ics b/test/lisp/calendar/icalendar-resources/Asia_Shanghai_20200916T070000_in-calendar_VTIMEZONE_multi_DAYLIGHT_STANDARD.ics
new file mode 100644
index 0000000000..26dd3cbfb8
--- /dev/null
+++ b/test/lisp/calendar/icalendar-resources/Asia_Shanghai_20200916T070000_in-calendar_VTIMEZONE_multi_DAYLIGHT_STANDARD.ics
@@ -0,0 +1,116 @@
+BEGIN:VCALENDAR

+PRODID:manual

+VERSION:2.0

+CALSCALE:GREGORIAN

+METHOD:PUBLISH

+BEGIN:VTIMEZONE

+TZID:Asia/Shanghai

+X-LIC-LOCATION:Asia/Shanghai

+BEGIN:STANDARD

+TZNAME:CST

+DTSTART:19411001T000000

+TZOFFSETFROM:+0900

+TZOFFSETTO:+0800

+END:STANDARD

+BEGIN:DAYLIGHT

+TZNAME:CDT

+DTSTART:19860504T000000

+TZOFFSETFROM:+0800

+TZOFFSETTO:+0900

+END:DAYLIGHT

+BEGIN:STANDARD

+TZNAME:CST

+DTSTART:19860914T000000

+TZOFFSETFROM:+0900

+TZOFFSETTO:+0800

+END:STANDARD

+BEGIN:DAYLIGHT

+TZNAME:CDT

+DTSTART:19870412T000000

+TZOFFSETFROM:+0800

+TZOFFSETTO:+0900

+END:DAYLIGHT

+BEGIN:STANDARD

+TZNAME:CST

+DTSTART:19870913T000000

+TZOFFSETFROM:+0900

+TZOFFSETTO:+0800

+END:STANDARD

+BEGIN:DAYLIGHT

+TZNAME:CDT

+DTSTART:19880410T000000

+TZOFFSETFROM:+0800

+TZOFFSETFROM:+0800

+TZOFFSETTO:+0900

+END:DAYLIGHT

+BEGIN:STANDARD

+TZNAME:CST

+DTSTART:19880911T000000

+TZOFFSETFROM:+0900

+TZOFFSETTO:+0800

+END:STANDARD

+BEGIN:DAYLIGHT

+TZNAME:CDT

+DTSTART:19890416T000000

+TZOFFSETFROM:+0800

+TZOFFSETTO:+0900

+END:DAYLIGHT

+BEGIN:STANDARD

+TZNAME:CST

+DTSTART:19890917T000000

+TZOFFSETFROM:+0900

+TZOFFSETTO:+0800

+END:STANDARD

+BEGIN:DAYLIGHT

+TZNAME:CDT

+DTSTART:19900415T000000

+TZOFFSETFROM:+0800

+TZOFFSETTO:+0900

+END:DAYLIGHT

+BEGIN:STANDARD

+TZNAME:CST

+DTSTART:19900916T000000

+TZOFFSETFROM:+0900

+TZOFFSETTO:+0800

+END:STANDARD

+BEGIN:DAYLIGHT

+TZNAME:CDT

+DTSTART:19910414T000000

+TZOFFSETFROM:+0800

+TZOFFSETTO:+0900

+END:DAYLIGHT

+BEGIN:STANDARD

+TZNAME:CST

+DTSTART:19910915T000000

+TZOFFSETFROM:+0900

+TZOFFSETTO:+0800

+END:STANDARD

+END:VTIMEZONE

+BEGIN:VTIMEZONE

+TZID:Etc/UTC

+X-LIC-LOCATION:Etc/UTC

+BEGIN:STANDARD

+TZNAME:UTC

+DTSTART:19700101T000000

+TZOFFSETFROM:+0000

+TZOFFSETTO:+0000

+END:STANDARD

+END:VTIMEZONE

+BEGIN:VEVENT

+CLASS:PUBLIC

+DTSTART;TZID=Asia/Shanghai:20200916T070000

+DTEND;TZID=Asia/Shanghai:20200916T080000

+UID:Asia_Shanghai_20200916T070000_in-calendar_VTIMEZONE_multi_DAYLIGHT_STANDARD.ics

+DTSTAMP:20190127T140400

+DESCRIPTION:date 2020-09-16, Shanghai local time 07:00 UTC+8, in-calendar

+  VTIMEZONE with multiple DAYLIGHT and STANDARD sub-components, cf.

+ https://techcommunity.microsoft.com/t5/office-365/import-ics-to-office-365

+ -calendar-but-the-event-time-is-wrong/td-p/215332

+SUMMARY:date 2020-09-16, Shanghai local time 07:00 UTC+8, in-calendar

+  VTIMEZONE with multiple DAYLIGHT and STANDARD sub-components, cf.

+ https://techcommunity.microsoft.com/t5/office-365/import-ics-to-office-365

+ -calendar-but-the-event-time-is-wrong/td-p/215332

+END:VEVENT

+END:VCALENDAR

+

+ 

diff --git a/test/lisp/calendar/icalendar-resources/Asia_Shanghai_20200916T070000_in-calendar_VTIMEZONE_tzurl_org.ics b/test/lisp/calendar/icalendar-resources/Asia_Shanghai_20200916T070000_in-calendar_VTIMEZONE_tzurl_org.ics
new file mode 100644
index 0000000000..ccd39bd114
--- /dev/null
+++ b/test/lisp/calendar/icalendar-resources/Asia_Shanghai_20200916T070000_in-calendar_VTIMEZONE_tzurl_org.ics
@@ -0,0 +1,65 @@
+BEGIN:VCALENDAR

+PRODID:manual

+VERSION:2.0

+BEGIN:VTIMEZONE

+TZID:Asia/Shanghai

+TZURL:http://tzurl.org/zoneinfo/Asia/Shanghai

+X-LIC-LOCATION:Asia/Shanghai

+BEGIN:STANDARD

+TZOFFSETFROM:+080543

+TZOFFSETTO:+0800

+TZNAME:CST

+DTSTART:19010101T000000

+RDATE:19010101T000000

+END:STANDARD

+BEGIN:DAYLIGHT

+TZOFFSETFROM:+0800

+TZOFFSETTO:+0900

+TZNAME:CDT

+DTSTART:19400601T000000

+RDATE:19400601T000000

+RDATE:19410315T000000

+RDATE:19420131T000000

+RDATE:19460515T000000

+RDATE:19470415T000000

+RDATE:19480501T000000

+RDATE:19490501T000000

+RDATE:19860504T020000

+RDATE:19870412T020000

+RDATE:19880417T020000

+RDATE:19890416T020000

+RDATE:19900415T020000

+RDATE:19910414T020000

+END:DAYLIGHT

+BEGIN:STANDARD

+TZOFFSETFROM:+0900

+TZOFFSETTO:+0800

+TZNAME:CST

+DTSTART:19401012T235959

+RDATE:19401012T235959

+RDATE:19411101T235959

+RDATE:19450901T235959

+RDATE:19460930T235959

+RDATE:19471031T235959

+RDATE:19480930T235959

+RDATE:19490528T000000

+RDATE:19860914T020000

+RDATE:19870913T020000

+RDATE:19880911T020000

+RDATE:19890917T020000

+RDATE:19900916T020000

+RDATE:19910915T020000

+END:STANDARD

+END:VTIMEZONE

+BEGIN:VEVENT

+CLASS:PUBLIC

+DTSTART;TZID=Asia/Shanghai:20200916T070000

+DTEND;TZID=Asia/Shanghai:20200916T080000

+UID:Asia_Shanghai_20200916T070000_in-calendar_VTIMEZONE_tzurl_org.ics

+DTSTAMP:20190127T140400

+DESCRIPTION:date 2020-09-16, Shanghai local time 07:00 UTC+8, in-calendar

+  VTIMEZONE as returned by http://tzurl.org/zoneinfo/Asia/Shanghai

+SUMMARY:date 2020-09-16, Shanghai local time 07:00 UTC+8, in-calendar

+  VTIMEZONE as returned by http://tzurl.org/zoneinfo/Asia/Shanghai

+END:VEVENT

+END:VCALENDAR


^ permalink raw reply related	[flat|nested] 51+ messages in thread

* bug#34315: [PATCH] icalendar.el: DURATION fix + more robust timezone handling
  2020-10-01  1:45                                 ` Lars Ingebrigtsen
@ 2020-10-01  1:50                                   ` Lars Ingebrigtsen
  2020-10-01 13:38                                   ` Thomas Plass
  1 sibling, 0 replies; 51+ messages in thread
From: Lars Ingebrigtsen @ 2020-10-01  1:50 UTC (permalink / raw)
  To: Thomas Plass; +Cc: 34315, Jan Tatarik

Oops, the example files didn't survive sending like this -- the CRLF was
translated into two newlines?  

+  VTIMEZONE as returned by http://tzurl.org/zoneinfo/Asia/Shanghai

+END:VEVENT

+END:VCALENDAR

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no






^ permalink raw reply	[flat|nested] 51+ messages in thread

* bug#34315: [PATCH] icalendar.el: DURATION fix + more robust timezone handling
  2020-10-01  1:45                                 ` Lars Ingebrigtsen
  2020-10-01  1:50                                   ` Lars Ingebrigtsen
@ 2020-10-01 13:38                                   ` Thomas Plass
  2020-10-01 16:19                                     ` Ulf Jasper
  1 sibling, 1 reply; 51+ messages in thread
From: Thomas Plass @ 2020-10-01 13:38 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: 34315, Jan Tatarik

Lars Ingebrigtsen wrote at 03:45 on October 1, 2020:
: 
: However, the code makes two tests fail:

Like with the previous patch, I hoped to get away with offloading the
testing part to the maintainer... But the failures prompted me to get
familiar with the test setup for the two culprits.

: 2 unexpected results:
:    FAILED  icalendar--convert-tz-offset
:    FAILED  icalendar--parse-vtimezone

My latest patch requires some test definitions to be modified as well
as existing commented out code to be commented in.

Background: In light of the way an abandonment of daylight saving time
is expressed in VTIMEZONE, my patch will always make sure that - when
no recurrence rules RRULE are specified - the (most recent) UTC offset
of the most recent DAYLIGHT or STANDARD is returned.  This offset is
what counts, IMHO.  Computing and using a TZ spec - even a default one
- seems inappropriate for theses cases.

: In addition, the test cases included aren't actually used?

Implicitly, they are when my patch to icalendar-tests.el (below, not a
--git, sorry) is applied.  The raw ICS data seem rather large for
incorporation into the Lisp code.

But I'd rather let Ulf have the final say about the patches and how
the data is to be tested.


----------------------------------------------------------------------
diff -Naur icalendar-tests.el.bce7de769e0c024b26729c45c2c27c7f3749c499 icalendar-tests.el
--- icalendar-tests.el.bce7de769e0c024b26729c45c2c27c7f3749c499	2020-10-01 12:59:40.051753100 +0200
+++ icalendar-tests.el	2020-10-01 14:04:42.106937900 +0200
@@ -248,7 +248,7 @@
     (setq result (icalendar--parse-vtimezone vtimezone))
     (should (string= "Kolkata, Chennai, Mumbai, New Delhi" (car result)))
     (message (cdr result))
-    (should (string= "STD-05:30DST-05:30,M1.1.1/00:00:00,M1.1.1/00:00:00"
+    (should (string= "STD-05:30"
                      (cdr result)))
 
     ;; FIXME: add testcase that covers changes for fix of bug#34315
@@ -557,28 +557,29 @@
                             (RRULE nil "FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU"))
                           t)))
 
-          ;; testcase: dtstart is mandatory
-          (should (null (icalendar--convert-tz-offset
+          ;; testcase: dtstart is mandatory but if not set return at least the offset
+          (should (equal '("DST-02:00")
+                         (icalendar--convert-tz-offset
                           '((TZOFFSETFROM nil "+0100")
                             (TZOFFSETTO nil "+0200")
                             (RRULE nil "FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU"))
                           t)))
 
-          ;; FIXME: rrule and rdate are NOT mandatory!  Must fix code
-          ;; before activating these testcases
-          ;; ;; testcase: no rrule and no rdate => no result
-          ;; (should (null (icalendar--convert-tz-offset
-          ;;                 '((TZOFFSETFROM nil "+0100")
-          ;;                   (TZOFFSETTO nil "+0200")
-          ;;                   (DTSTART nil "19700329T020000"))
-          ;;                 t)))
-          ;; ;; testcase: no rrule with rdate => no result
-          ;; (should (null (icalendar--convert-tz-offset
-          ;;                 '((TZOFFSETFROM nil "+0100")
-          ;;                   (TZOFFSETTO nil "+0200")
-          ;;                   (DTSTART nil "18840101T000000")
-          ;;                   (RDATE nil "18840101T000000"))
-          ;;                 t)))
+          ;; rrule and rdate are NOT mandatory: return the offset and a placeholder
+          (should (equal '("DST-02:00" . "19700329T020000")
+                         (icalendar--convert-tz-offset
+                          '((TZOFFSETFROM nil "+0100")
+                            (TZOFFSETTO nil "+0200")
+                            (DTSTART nil "19700329T020000"))
+                          t)))
+          ;; ;; testcase: no rrule with rdate => return offset and a default TZ spec
+          (should (equal '("DST-02:00" . "M1.1.1/00:00:00")
+                         (icalendar--convert-tz-offset
+                          '((TZOFFSETFROM nil "+0100")
+                            (TZOFFSETTO nil "+0200")
+                            (DTSTART nil "18840101T000000")
+                            (RDATE nil "18840101T000000"))
+                          t)))
           )
       ;; restore time-zone even if something went terribly wrong
       (setenv "TZ" tz))))





^ permalink raw reply	[flat|nested] 51+ messages in thread

* bug#34315: [PATCH] icalendar.el: DURATION fix + more robust timezone handling
  2020-10-01 13:38                                   ` Thomas Plass
@ 2020-10-01 16:19                                     ` Ulf Jasper
  2020-10-01 16:22                                       ` Lars Ingebrigtsen
  0 siblings, 1 reply; 51+ messages in thread
From: Ulf Jasper @ 2020-10-01 16:19 UTC (permalink / raw)
  To: Thomas Plass; +Cc: Lars Ingebrigtsen, 34315, Jan Tatarik

Am 01.10.2020 um 16:38 (+0300) schrieb Thomas Plass:

> But I'd rather let Ulf have the final say about the patches and how
> the data is to be tested.

I agree with Lars here. (Thank you, Lars, for your investigation!)

When patching icalendar.el (or any other file) one must make sure that
the corresponding unit tests do not fail.  If necessary the unit tests
need to be adjusted.  If possible one should add unit tests so that all
code changes get covered.  (And so on -- the usual ideas behind unit
tests.)

It looks like your patch of 'icalendar-tests.el' does not contain
the samples from the ics files.  Could you please add these?







^ permalink raw reply	[flat|nested] 51+ messages in thread

* bug#34315: [PATCH] icalendar.el: DURATION fix + more robust timezone handling
  2020-10-01 16:19                                     ` Ulf Jasper
@ 2020-10-01 16:22                                       ` Lars Ingebrigtsen
  2020-10-01 16:54                                         ` Ulf Jasper
  0 siblings, 1 reply; 51+ messages in thread
From: Lars Ingebrigtsen @ 2020-10-01 16:22 UTC (permalink / raw)
  To: Ulf Jasper; +Cc: Thomas Plass, 34315, Jan Tatarik

Ulf Jasper <ulf.jasper@web.de> writes:

> It looks like your patch of 'icalendar-tests.el' does not contain
> the samples from the ics files.  Could you please add these?

I think putting the sample .ics files in a separate icalendar-resources
directory is the way forward...

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





^ permalink raw reply	[flat|nested] 51+ messages in thread

* bug#34315: [PATCH] icalendar.el: DURATION fix + more robust timezone handling
  2020-10-01 16:22                                       ` Lars Ingebrigtsen
@ 2020-10-01 16:54                                         ` Ulf Jasper
  2020-10-01 16:59                                           ` Lars Ingebrigtsen
  2020-10-01 18:49                                           ` Thomas Plass
  0 siblings, 2 replies; 51+ messages in thread
From: Ulf Jasper @ 2020-10-01 16:54 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: Thomas Plass, 34315, Jan Tatarik

Am 01.10.2020 um 18:22 (+0200) schrieb Lars Ingebrigtsen:
> Ulf Jasper <ulf.jasper@web.de> writes:
>
>> It looks like your patch of 'icalendar-tests.el' does not contain
>> the samples from the ics files.  Could you please add these?
>
> I think putting the sample .ics files in a separate icalendar-resources
> directory is the way forward...

Currently there is no way to use ics files in icalendar-tests.  In the
past we've extracted the relevant handful of lines from such a file and
constructed a testcase from such files.  ics files might be useful for
the "real world tests" though.





^ permalink raw reply	[flat|nested] 51+ messages in thread

* bug#34315: [PATCH] icalendar.el: DURATION fix + more robust timezone handling
  2020-10-01 16:54                                         ` Ulf Jasper
@ 2020-10-01 16:59                                           ` Lars Ingebrigtsen
  2020-10-01 18:40                                             ` Ulf Jasper
  2020-10-01 18:49                                           ` Thomas Plass
  1 sibling, 1 reply; 51+ messages in thread
From: Lars Ingebrigtsen @ 2020-10-01 16:59 UTC (permalink / raw)
  To: Ulf Jasper; +Cc: Thomas Plass, 34315, Jan Tatarik

Ulf Jasper <ulf.jasper@web.de> writes:

> Currently there is no way to use ics files in icalendar-tests.  In the
> past we've extracted the relevant handful of lines from such a file and
> constructed a testcase from such files.  ics files might be useful for
> the "real world tests" though.

Why can't ics files be used from icalendar-tests?

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





^ permalink raw reply	[flat|nested] 51+ messages in thread

* bug#34315: [PATCH] icalendar.el: DURATION fix + more robust timezone handling
  2020-10-01 16:59                                           ` Lars Ingebrigtsen
@ 2020-10-01 18:40                                             ` Ulf Jasper
  2020-10-01 18:47                                               ` Lars Ingebrigtsen
  0 siblings, 1 reply; 51+ messages in thread
From: Ulf Jasper @ 2020-10-01 18:40 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: Thomas Plass, 34315, Jan Tatarik

Am 01.10.2020 um 18:59 (+0200) schrieb Lars Ingebrigtsen:

> Why can't ics files be used from icalendar-tests?

Because it has not been implemented.

Right now 'icalendar-tests.el' contains input data together with the
corresponding expected results.  When we move input data into separate
files, we should do the same for the expected results.  For each ics
file there should be a corresponding expected-result file.  That's not a
big deal.  It just has not been done yet.






^ permalink raw reply	[flat|nested] 51+ messages in thread

* bug#34315: [PATCH] icalendar.el: DURATION fix + more robust timezone handling
  2020-10-01 18:40                                             ` Ulf Jasper
@ 2020-10-01 18:47                                               ` Lars Ingebrigtsen
  2020-10-01 19:00                                                 ` Ulf Jasper
  0 siblings, 1 reply; 51+ messages in thread
From: Lars Ingebrigtsen @ 2020-10-01 18:47 UTC (permalink / raw)
  To: Ulf Jasper; +Cc: Thomas Plass, 34315, Jan Tatarik

Ulf Jasper <ulf.jasper@web.de> writes:

> Am 01.10.2020 um 18:59 (+0200) schrieb Lars Ingebrigtsen:
>
>> Why can't ics files be used from icalendar-tests?
>
> Because it has not been implemented.
>
> Right now 'icalendar-tests.el' contains input data together with the
> corresponding expected results.  When we move input data into separate
> files, we should do the same for the expected results.  For each ics
> file there should be a corresponding expected-result file.  That's not a
> big deal.  It just has not been done yet.

Oh, OK, I thought you meant there was something somehow fundamentally
precluding putting the ics data into files.

But surely not all the tests are transforms in this way.  Reading an ics
file and having a test that says "what's the meeting time in this file?"
should be a fine test, right?

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





^ permalink raw reply	[flat|nested] 51+ messages in thread

* bug#34315: [PATCH] icalendar.el: DURATION fix + more robust timezone handling
  2020-10-01 16:54                                         ` Ulf Jasper
  2020-10-01 16:59                                           ` Lars Ingebrigtsen
@ 2020-10-01 18:49                                           ` Thomas Plass
  2020-10-01 18:53                                             ` Thomas Plass
  2020-10-01 19:14                                             ` Ulf Jasper
  1 sibling, 2 replies; 51+ messages in thread
From: Thomas Plass @ 2020-10-01 18:49 UTC (permalink / raw)
  To: Ulf Jasper; +Cc: Lars Ingebrigtsen, Thomas Plass, Jan Tatarik, 34315

I'd like to get some guidance from people involved on the following proposal:

Ulf Jasper wrote at 18:54 on October 1, 2020:

: Currently there is no way to use ics files in icalendar-tests.

Would it be acceptable to:

  - create a directory root/test/lisp/calendar/icalendar-resources

  - extend icalendar-tests.el with the following:

    (defvar icalendar-resources-directory "icalendar-resources"
      "Name of directory containing ICS files.
    This directory is relative to icalendar-tests.el.")
    
    (defun icalendar-tests--get-ical-from-file (ics-file &optional component)
      "Return iCalendar data structures from ICS-FILE.
    Optional symbol COMPONENT names a top-level component like 'VTIMEZONE."
      (let (ical)
        (if (file-exists-p ics-file)
            (save-excursion
              (with-temp-buffer
                (insert-file-contents ics-file)
                (goto-char (point-min))
                (setq ical (car (icalendar--read-element nil nil)))
                (if component
                    (setq res (car (icalendar--get-children ical component)))
                  (setq res ical))))
          (error "Can't find ICS file %s" ics-file))))


Which could be used thusly in the definition of 'icalendar--parse-vtimezone:

(ert-deftest icalendar--parse-vtimezone ()
  "Test method for `icalendar--parse-vtimezone'."
  (let (vtimezone result)

    (setq vtimezone (icalendar-tests--get-ical-from-file
                     (concat (file-name-as-directory icalendar-resources-directory)
                             "Asia_Shanghai_20200916T070000_in-calendar_VTIMEZONE_tzurl_org.ics")
                     'VTIMEZONE))
    (setq result (icalendar--parse-vtimezone vtimezone))
    (should (string= "Asia/Shanghai" (car result)))
    (message (cdr result))
    (should (string= "STD-08:00"
                        (cdr result)))     


  ...
  ))


I have no idea how the test code is run, in particular how

  (concat (file-name-as-directory icalendar-resources-directory)
          "Asia_Shanghai_20200916T070000_in-calendar_VTIMEZONE_tzurl_org.ics")

could be made to resolve.

Also, I cannot alter the git.

Please advise.






^ permalink raw reply	[flat|nested] 51+ messages in thread

* bug#34315: [PATCH] icalendar.el: DURATION fix + more robust timezone handling
  2020-10-01 18:49                                           ` Thomas Plass
@ 2020-10-01 18:53                                             ` Thomas Plass
  2020-10-01 19:14                                             ` Ulf Jasper
  1 sibling, 0 replies; 51+ messages in thread
From: Thomas Plass @ 2020-10-01 18:53 UTC (permalink / raw)
  To: Thomas Plass; +Cc: Lars Ingebrigtsen, 34315, Jan Tatarik

Cleaned up version:

(defun icalendar-tests--get-ical-from-file (ics-file &optional component)
  "Return iCalendar data structures from ICS-FILE.
Optional symbol COMPONENT names a top-level component like 'VTIMEZONE."
  (let (ical)
    (if (file-exists-p ics-file)
        (save-excursion
          (with-temp-buffer
            (insert-file-contents ics-file)
            (goto-char (point-min))
            (setq ical (car (icalendar--read-element nil nil)))
            (if component
                (car (icalendar--get-children ical component))
              ical)))
      (error "Can't find ICS file %s" ics-file))))



Thomas Plass wrote at 21:49 on October 1, 2020:
: 
:   - extend icalendar-tests.el with the following:
: 
:     (defvar icalendar-resources-directory "icalendar-resources"
:       "Name of directory containing ICS files.
:     This directory is relative to icalendar-tests.el.")
:     
:     (defun icalendar-tests--get-ical-from-file (ics-file &optional component)
:       "Return iCalendar data structures from ICS-FILE.
:     Optional symbol COMPONENT names a top-level component like 'VTIMEZONE."
:       (let (ical)
:         (if (file-exists-p ics-file)
:             (save-excursion
:               (with-temp-buffer
:                 (insert-file-contents ics-file)
:                 (goto-char (point-min))
:                 (setq ical (car (icalendar--read-element nil nil)))
:                 (if component
:                     (setq res (car (icalendar--get-children ical component)))
:                   (setq res ical))))
:           (error "Can't find ICS file %s" ics-file))))





^ permalink raw reply	[flat|nested] 51+ messages in thread

* bug#34315: [PATCH] icalendar.el: DURATION fix + more robust timezone handling
  2020-10-01 18:47                                               ` Lars Ingebrigtsen
@ 2020-10-01 19:00                                                 ` Ulf Jasper
  0 siblings, 0 replies; 51+ messages in thread
From: Ulf Jasper @ 2020-10-01 19:00 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: Thomas Plass, 34315, Jan Tatarik

Am 01.10.2020 um 20:47 (+0200) schrieb Lars Ingebrigtsen:

> But surely not all the tests are transforms in this way.  Reading an ics
> file and having a test that says "what's the meeting time in this file?"
> should be a fine test, right?

Basically icalendar.el just does transformations from ics to Emacs diary
and vice versa.  Correspondingly icalendar-tests consist of import and
export tests plus tests of lower-level functions.  The file based
approach would apply to the im-/export tests only.






^ permalink raw reply	[flat|nested] 51+ messages in thread

* bug#34315: [PATCH] icalendar.el: DURATION fix + more robust timezone handling
  2020-10-01 18:49                                           ` Thomas Plass
  2020-10-01 18:53                                             ` Thomas Plass
@ 2020-10-01 19:14                                             ` Ulf Jasper
  2020-10-10 20:06                                               ` Lars Ingebrigtsen
  1 sibling, 1 reply; 51+ messages in thread
From: Ulf Jasper @ 2020-10-01 19:14 UTC (permalink / raw)
  To: Thomas Plass; +Cc: Lars Ingebrigtsen, 34315, Jan Tatarik

Am 01.10.2020 um 21:49 (+0300) schrieb Thomas Plass:
> I'd like to get some guidance from people involved on the following
> proposal:

That is close to what I have in mind.  When we out-source test input
data, we should do the same with the corresponding expected results.  A
unit test case would look something like this.

- read input data from ics file
- read expected result from corresponding file
- perform action under test on input data
- compare result with previously read expected result

I could write the necessary helper functions and then, for a start,
apply this scheme to the "real world" tests in icalendar-tests.el.





^ permalink raw reply	[flat|nested] 51+ messages in thread

* bug#34315: [PATCH] icalendar.el: DURATION fix + more robust timezone handling
  2020-10-01 19:14                                             ` Ulf Jasper
@ 2020-10-10 20:06                                               ` Lars Ingebrigtsen
  2020-10-22 15:50                                                 ` Ulf Jasper
  2023-10-01  2:12                                                 ` Stefan Kangas
  0 siblings, 2 replies; 51+ messages in thread
From: Lars Ingebrigtsen @ 2020-10-10 20:06 UTC (permalink / raw)
  To: Ulf Jasper; +Cc: Thomas Plass, 34315, Jan Tatarik

Ulf Jasper <ulf.jasper@web.de> writes:

> - read input data from ics file
> - read expected result from corresponding file
> - perform action under test on input data
> - compare result with previously read expected result
>
> I could write the necessary helper functions and then, for a start,
> apply this scheme to the "real world" tests in icalendar-tests.el.

Sounds like a good plan to me.

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





^ permalink raw reply	[flat|nested] 51+ messages in thread

* bug#34315: [PATCH] icalendar.el: DURATION fix + more robust timezone handling
  2020-10-10 20:06                                               ` Lars Ingebrigtsen
@ 2020-10-22 15:50                                                 ` Ulf Jasper
  2021-05-11 14:10                                                   ` Lars Ingebrigtsen
  2023-10-01  2:12                                                 ` Stefan Kangas
  1 sibling, 1 reply; 51+ messages in thread
From: Ulf Jasper @ 2020-10-22 15:50 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: Thomas Plass, 34315, Jan Tatarik

Sorry for the long delays on my side.

I moved the test data out of icalendar-tests.el into separate files.
The first step is done.





^ permalink raw reply	[flat|nested] 51+ messages in thread

* bug#34315: [PATCH] icalendar.el: DURATION fix + more robust timezone handling
  2020-10-22 15:50                                                 ` Ulf Jasper
@ 2021-05-11 14:10                                                   ` Lars Ingebrigtsen
  2021-07-29 14:55                                                     ` Ulf Jasper
  0 siblings, 1 reply; 51+ messages in thread
From: Lars Ingebrigtsen @ 2021-05-11 14:10 UTC (permalink / raw)
  To: Ulf Jasper; +Cc: 34315, Jan Tatarik, Thomas Plass

Ulf Jasper <ulf.jasper@web.de> writes:

> Sorry for the long delays on my side.
>
> I moved the test data out of icalendar-tests.el into separate files.
> The first step is done.

Looks good.

Re-skimming this thread, it seems to me that the reported problem hasn't
been fixed?  (But I may be completely wrong about that.)  If that's the
case, has there been any progress on integrating Thomas' patch?

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





^ permalink raw reply	[flat|nested] 51+ messages in thread

* bug#34315: [PATCH] icalendar.el: DURATION fix + more robust timezone handling
  2021-05-11 14:10                                                   ` Lars Ingebrigtsen
@ 2021-07-29 14:55                                                     ` Ulf Jasper
  2021-07-30 11:37                                                       ` Lars Ingebrigtsen
  0 siblings, 1 reply; 51+ messages in thread
From: Ulf Jasper @ 2021-07-29 14:55 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: 34315, Jan Tatarik, Thomas Plass

Am 11.05.2021 um 16:10 (+0200) schrieb Lars Ingebrigtsen:
> Ulf Jasper <ulf.jasper@web.de> writes:
>> I moved the test data out of icalendar-tests.el into separate files.
>> The first step is done.
>
> Looks good.
>
> Re-skimming this thread, it seems to me that the reported problem hasn't
> been fixed?  (But I may be completely wrong about that.)  If that's the
> case, has there been any progress on integrating Thomas' patch?

IIRC the next step would be to add test files, i.e. ics files holding
input files and diary files holding expected output data.  But maybe I
am mistaken.






^ permalink raw reply	[flat|nested] 51+ messages in thread

* bug#34315: [PATCH] icalendar.el: DURATION fix + more robust timezone handling
  2021-07-29 14:55                                                     ` Ulf Jasper
@ 2021-07-30 11:37                                                       ` Lars Ingebrigtsen
  0 siblings, 0 replies; 51+ messages in thread
From: Lars Ingebrigtsen @ 2021-07-30 11:37 UTC (permalink / raw)
  To: Ulf Jasper; +Cc: 34315, Jan Tatarik, Thomas Plass

Ulf Jasper <ulf.jasper@web.de> writes:

>> Re-skimming this thread, it seems to me that the reported problem hasn't
>> been fixed?  (But I may be completely wrong about that.)  If that's the
>> case, has there been any progress on integrating Thomas' patch?
>
> IIRC the next step would be to add test files, i.e. ics files holding
> input files and diary files holding expected output data.  But maybe I
> am mistaken.

That's also my understanding.

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





^ permalink raw reply	[flat|nested] 51+ messages in thread

* bug#34315: [PATCH] icalendar.el: DURATION fix + more robust timezone handling
  2020-10-10 20:06                                               ` Lars Ingebrigtsen
  2020-10-22 15:50                                                 ` Ulf Jasper
@ 2023-10-01  2:12                                                 ` Stefan Kangas
  2023-10-12 14:49                                                   ` Ulf Jasper
  1 sibling, 1 reply; 51+ messages in thread
From: Stefan Kangas @ 2023-10-01  2:12 UTC (permalink / raw)
  To: Lars Ingebrigtsen
  Cc: Ulf Jasper, Eli Zaretskii, Thomas Plass, 34315, Jan Tatarik

Lars Ingebrigtsen <larsi@gnus.org> writes:

> Ulf Jasper <ulf.jasper@web.de> writes:
>
>> - read input data from ics file
>> - read expected result from corresponding file
>> - perform action under test on input data
>> - compare result with previously read expected result
>>
>> I could write the necessary helper functions and then, for a start,
>> apply this scheme to the "real world" tests in icalendar-tests.el.
>
> Sounds like a good plan to me.

The last update here was 2 years ago.

Ulf, did you get any further with this?





^ permalink raw reply	[flat|nested] 51+ messages in thread

* bug#34315: [PATCH] icalendar.el: DURATION fix + more robust timezone handling
  2023-10-01  2:12                                                 ` Stefan Kangas
@ 2023-10-12 14:49                                                   ` Ulf Jasper
  2023-10-15 14:28                                                     ` Stefan Kangas
  0 siblings, 1 reply; 51+ messages in thread
From: Ulf Jasper @ 2023-10-12 14:49 UTC (permalink / raw)
  To: Stefan Kangas
  Cc: Lars Ingebrigtsen, Thomas Plass, Eli Zaretskii, Jan Tatarik,
	34315

Am 30.09.2023 um 19:12 (-0700) schrieb Stefan Kangas:

> The last update here was 2 years ago.
>
> Ulf, did you get any further with this?

Sorry, I lost track of this bug.  I also lost track of icalendar.el
itself.  I stopped using it some years ago.  I think it is time to step
back from maintaining icalendar.el.

Best,
ulf







^ permalink raw reply	[flat|nested] 51+ messages in thread

* bug#34315: [PATCH] icalendar.el: DURATION fix + more robust timezone handling
  2023-10-12 14:49                                                   ` Ulf Jasper
@ 2023-10-15 14:28                                                     ` Stefan Kangas
  2023-10-19 14:11                                                       ` Ulf Jasper
  0 siblings, 1 reply; 51+ messages in thread
From: Stefan Kangas @ 2023-10-15 14:28 UTC (permalink / raw)
  To: Ulf Jasper
  Cc: Lars Ingebrigtsen, Thomas Plass, Eli Zaretskii, Jan Tatarik,
	34315

Ulf Jasper <ulf.jasper@web.de> writes:

> Am 30.09.2023 um 19:12 (-0700) schrieb Stefan Kangas:
>
>> The last update here was 2 years ago.
>>
>> Ulf, did you get any further with this?
>
> Sorry, I lost track of this bug.  I also lost track of icalendar.el
> itself.  I stopped using it some years ago.  I think it is time to step
> back from maintaining icalendar.el.

Noted.  Feel free to update the Maintainer header to reflect that
decision (or let me know, and I'll do it for you).

Thanks for all your work on icalendar.el over the years.





^ permalink raw reply	[flat|nested] 51+ messages in thread

* bug#34315: [PATCH] icalendar.el: DURATION fix + more robust timezone handling
  2023-10-15 14:28                                                     ` Stefan Kangas
@ 2023-10-19 14:11                                                       ` Ulf Jasper
  2023-12-24 14:02                                                         ` Stefan Kangas
  0 siblings, 1 reply; 51+ messages in thread
From: Ulf Jasper @ 2023-10-19 14:11 UTC (permalink / raw)
  To: Stefan Kangas
  Cc: Lars Ingebrigtsen, Thomas Plass, Eli Zaretskii, Jan Tatarik,
	34315

Am 15.10.2023 um 07:28 (-0700) schrieb Stefan Kangas:
> Ulf Jasper <ulf.jasper@web.de> writes:
>
>> Am 30.09.2023 um 19:12 (-0700) schrieb Stefan Kangas:
>>
>>> The last update here was 2 years ago.
>>>
>>> Ulf, did you get any further with this?
>>
>> Sorry, I lost track of this bug.  I also lost track of icalendar.el
>> itself.  I stopped using it some years ago.  I think it is time to step
>> back from maintaining icalendar.el.
>
> Noted.  Feel free to update the Maintainer header to reflect that
> decision (or let me know, and I'll do it for you).

Removed myself from MAINTAINERS (for icalendar).  There is no maintainer
header in the el-files, BTW.

Best,
ulf









^ permalink raw reply	[flat|nested] 51+ messages in thread

* bug#34315: [PATCH] icalendar.el: DURATION fix + more robust timezone handling
  2023-10-19 14:11                                                       ` Ulf Jasper
@ 2023-12-24 14:02                                                         ` Stefan Kangas
  0 siblings, 0 replies; 51+ messages in thread
From: Stefan Kangas @ 2023-12-24 14:02 UTC (permalink / raw)
  To: Ulf Jasper
  Cc: Lars Ingebrigtsen, Thomas Plass, Eli Zaretskii, Jan Tatarik,
	34315

Ulf Jasper <ulf.jasper@web.de> writes:

> Am 15.10.2023 um 07:28 (-0700) schrieb Stefan Kangas:
>> Ulf Jasper <ulf.jasper@web.de> writes:
>>
>>> Sorry, I lost track of this bug.  I also lost track of icalendar.el
>>> itself.  I stopped using it some years ago.  I think it is time to step
>>> back from maintaining icalendar.el.
>>
>> Noted.  Feel free to update the Maintainer header to reflect that
>> decision (or let me know, and I'll do it for you).
>
> Removed myself from MAINTAINERS (for icalendar).  There is no maintainer
> header in the el-files, BTW.

According to our conventions, the maintainer of a file without any
explicit "Maintainer" is whoever is marked as "Author".  I'm not
necessarily a fan of this convention, myself.  I'd prefer being
explicit.

However, this being the case, I think the correct thing to do in this
case is to add a header that points to emacs-devel.

So I did that.

Thanks.





^ permalink raw reply	[flat|nested] 51+ messages in thread

end of thread, other threads:[~2023-12-24 14:02 UTC | newest]

Thread overview: 51+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-02-04 11:48 bug#34315: [PATCH] icalendar.el: DURATION fix + more robust timezone handling Thomas Plass
2019-02-12 18:57 ` Ulf Jasper
2019-02-15 17:17   ` Ulf Jasper
2019-02-18  9:36     ` Thomas Plass
2019-02-18 15:59       ` Eli Zaretskii
2019-02-18 19:15         ` Thomas Plass
2019-02-18 19:30           ` Eli Zaretskii
2019-02-18 20:03             ` Thomas Plass
2019-02-18 20:16               ` Eli Zaretskii
2020-08-10 11:48     ` Lars Ingebrigtsen
2020-08-10 16:08       ` Ulf Jasper
2020-08-10 16:45         ` Eli Zaretskii
2020-08-10 17:04           ` Thomas Plass
2020-08-11 11:01             ` Lars Ingebrigtsen
2020-08-11 15:14               ` Ulf Jasper
2020-08-11 15:19                 ` Lars Ingebrigtsen
2020-08-11 15:45                   ` Ulf Jasper
2020-08-12 13:08                 ` Thomas Plass
2020-08-12 13:12                   ` Lars Ingebrigtsen
2020-08-12 13:30                     ` Thomas Plass
2020-08-12 15:06                       ` Ulf Jasper
2020-09-02 18:05                         ` Ulf Jasper
2020-09-03  8:38                           ` Thomas Plass
2020-09-03 14:28                             ` Ulf Jasper
2020-09-12  8:01                               ` Thomas Plass
2020-09-12  8:11                                 ` Eli Zaretskii
2020-09-13  4:07                                 ` Richard Stallman
2020-09-29 10:05                               ` Thomas Plass
2020-10-01  1:45                                 ` Lars Ingebrigtsen
2020-10-01  1:50                                   ` Lars Ingebrigtsen
2020-10-01 13:38                                   ` Thomas Plass
2020-10-01 16:19                                     ` Ulf Jasper
2020-10-01 16:22                                       ` Lars Ingebrigtsen
2020-10-01 16:54                                         ` Ulf Jasper
2020-10-01 16:59                                           ` Lars Ingebrigtsen
2020-10-01 18:40                                             ` Ulf Jasper
2020-10-01 18:47                                               ` Lars Ingebrigtsen
2020-10-01 19:00                                                 ` Ulf Jasper
2020-10-01 18:49                                           ` Thomas Plass
2020-10-01 18:53                                             ` Thomas Plass
2020-10-01 19:14                                             ` Ulf Jasper
2020-10-10 20:06                                               ` Lars Ingebrigtsen
2020-10-22 15:50                                                 ` Ulf Jasper
2021-05-11 14:10                                                   ` Lars Ingebrigtsen
2021-07-29 14:55                                                     ` Ulf Jasper
2021-07-30 11:37                                                       ` Lars Ingebrigtsen
2023-10-01  2:12                                                 ` Stefan Kangas
2023-10-12 14:49                                                   ` Ulf Jasper
2023-10-15 14:28                                                     ` Stefan Kangas
2023-10-19 14:11                                                       ` Ulf Jasper
2023-12-24 14:02                                                         ` Stefan Kangas

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).