diff mbox series

support/download/svn: fix date format for archive creation

Message ID 20210219212154.27107-1-vfazio@xes-inc.com
State Accepted
Headers show
Series support/download/svn: fix date format for archive creation | expand

Commit Message

Vincent Fazio Feb. 19, 2021, 9:21 p.m. UTC
Previously we would use the date provided by:
`svn info --show-item last-changed-date ...`

The date returned from this command could include sub-second precision
which is not compatible with the PAX options we specify to GNU tar.

Now the returned date is massaged to drop the sub-seconds.

Signed-off-by: Vincent Fazio <vfazio@xes-inc.com>
---
 support/download/svn | 3 +++
 1 file changed, 3 insertions(+)

Comments

Yann E. MORIN Feb. 20, 2021, 9:51 a.m. UTC | #1
Vincent, All,

Arnout, question for you toward the end...

On 2021-02-19 15:21 -0600, Vincent Fazio spake thusly:
> Previously we would use the date provided by:
> `svn info --show-item last-changed-date ...`
> 
> The date returned from this command could include sub-second precision
> which is not compatible with the PAX options we specify to GNU tar.
> 
> Now the returned date is massaged to drop the sub-seconds.
> 
> Signed-off-by: Vincent Fazio <vfazio@xes-inc.com>

Thank you for spinning this one right before you sprung on the train to
your holidays!

> ---
>  support/download/svn | 3 +++
>  1 file changed, 3 insertions(+)
> 
> diff --git a/support/download/svn b/support/download/svn
> index 839dccaf62..ea1032267f 100755
> --- a/support/download/svn
> +++ b/support/download/svn
> @@ -52,6 +52,9 @@ _svn export ${verbose} "${@}" "'${uri}@${rev}'" "'${basename}'"
>  # last line (svn outputs everything on stdout)
>  date="$( _svn info --show-item last-changed-date "'${uri}@${rev}'" |tail -n 1 )"
>  
> +# Drop sub-second precision to play nice with GNU tar's valid_timespec check
> +date="$( date -d "${date}" -uIseconds )"

So, I did some checks about when 'date -d' learnt to deal with
sub-second precision. Not sure when, but it is suported in all the
major distributions still maintained (centos 7, debian jessie, ubuntu
trusty), while it was not in some earlier versions (centos 6, debian
squeeze).

So that's fine for me.

But I wonder whether this should be svn-specific, or whether we should
move it into the generic herlper mk_tar_gz()... Arnout, thoughts?

Regards,
Yann E. MORIN.

>  # Generate the archive.
>  # We did a 'svn export' above, so it's not a working copy (there is no .svn
>  # directory or file to ignore).
> -- 
> 2.30.0
>
Arnout Vandecappelle Feb. 22, 2021, 10:58 a.m. UTC | #2
On 20/02/2021 10:51, Yann E. MORIN wrote:
> Vincent, All,
> 
> Arnout, question for you toward the end...
> 
> On 2021-02-19 15:21 -0600, Vincent Fazio spake thusly:
>> Previously we would use the date provided by:
>> `svn info --show-item last-changed-date ...`
>>
>> The date returned from this command could include sub-second precision
>> which is not compatible with the PAX options we specify to GNU tar.
>>
>> Now the returned date is massaged to drop the sub-seconds.
>>
>> Signed-off-by: Vincent Fazio <vfazio@xes-inc.com>
> 
> Thank you for spinning this one right before you sprung on the train to
> your holidays!
> 
>> ---
>>  support/download/svn | 3 +++
>>  1 file changed, 3 insertions(+)
>>
>> diff --git a/support/download/svn b/support/download/svn
>> index 839dccaf62..ea1032267f 100755
>> --- a/support/download/svn
>> +++ b/support/download/svn
>> @@ -52,6 +52,9 @@ _svn export ${verbose} "${@}" "'${uri}@${rev}'" "'${basename}'"
>>  # last line (svn outputs everything on stdout)
>>  date="$( _svn info --show-item last-changed-date "'${uri}@${rev}'" |tail -n 1 )"
>>  
>> +# Drop sub-second precision to play nice with GNU tar's valid_timespec check
>> +date="$( date -d "${date}" -uIseconds )"
> 
> So, I did some checks about when 'date -d' learnt to deal with
> sub-second precision. Not sure when, but it is suported in all the
> major distributions still maintained (centos 7, debian jessie, ubuntu
> trusty), while it was not in some earlier versions (centos 6, debian
> squeeze).

A much simpler solution is

date="$( date -d "${date}" -u +%Y-%m-%dT%T%:z )"

which is fully portable over any POSIX-compliant version of date.

> 
> So that's fine for me.
> 
> But I wonder whether this should be svn-specific, or whether we should
> move it into the generic herlper mk_tar_gz()... Arnout, thoughts?

 I would expect any sane VCS to be able to show the last change date in ISO 8601
format - I'd hope that SVN is the exception rather than the rule...

 Regards,
 Arnout

> 
> Regards,
> Yann E. MORIN.
> 
>>  # Generate the archive.
>>  # We did a 'svn export' above, so it's not a working copy (there is no .svn
>>  # directory or file to ignore).
>> -- 
>> 2.30.0
>>
>
Yann E. MORIN Feb. 22, 2021, 6:28 p.m. UTC | #3
Arnout, All,

On 2021-02-22 11:58 +0100, Arnout Vandecappelle spake thusly:
> On 20/02/2021 10:51, Yann E. MORIN wrote:
> > On 2021-02-19 15:21 -0600, Vincent Fazio spake thusly:
> >> Now the returned date is massaged to drop the sub-seconds.
[--SNIP--]
> A much simpler solution is
> date="$( date -d "${date}" -u +%Y-%m-%dT%T%:z )"
> which is fully portable over any POSIX-compliant version of date.

%:z is not POSIX, it's a GNU extension. However, we do not care about
computing the timezone: it's forcibly +00:00 becasue we do request -u.

Also, %T is OK, but to keep in line with the %Y-%m-%d part, I've
switched to %H:%M:%S.

Eventually, I've settled for: 

> > But I wonder whether this should be svn-specific, or whether we should
> > move it into the generic herlper mk_tar_gz()... Arnout, thoughts?
>  I would expect any sane VCS to be able to show the last change date in ISO 8601
> format - I'd hope that SVN is the exception rather than the rule...

Actually, sub-second precision *is* allowed by ISO8601. ISO8601 even
allows fractional parts after the last time element, eg.: 14:30,5 to
represent 14 hours, 30.5 minutes (i.e. 30min and 30s). The precision of
the fractional part is even left unspecified, with parties agreeing in
advance (or autodetectig, I'd guess):

    https://en.wikipedia.org/wiki/ISO_8601#Times

So, svn *is* ISO8601-compliant.

Regards,
Yann E. MORIN.

>  Regards,
>  Arnout
> 
> > 
> > Regards,
> > Yann E. MORIN.
> > 
> >>  # Generate the archive.
> >>  # We did a 'svn export' above, so it's not a working copy (there is no .svn
> >>  # directory or file to ignore).
> >> -- 
> >> 2.30.0
> >>
> >
Yann E. MORIN Feb. 22, 2021, 8:14 p.m. UTC | #4
Arnout,All,

I was rushing for dinner, so forgot to properly complete my mail before
sending it; here's a complement...

On 2021-02-22 19:28 +0100, Yann E. MORIN spake thusly:
> On 2021-02-22 11:58 +0100, Arnout Vandecappelle spake thusly:
> > On 20/02/2021 10:51, Yann E. MORIN wrote:
> > > On 2021-02-19 15:21 -0600, Vincent Fazio spake thusly:
> > >> Now the returned date is massaged to drop the sub-seconds.
> [--SNIP--]
> > A much simpler solution is
> > date="$( date -d "${date}" -u +%Y-%m-%dT%T%:z )"
> > which is fully portable over any POSIX-compliant version of date.
[--SNIP--]
> Eventually, I've settled for: 

... for: +%Y-%m-%dT%H:%M:%S+00:00

> Actually, sub-second precision *is* allowed by ISO8601. [...]

And so, I still think it is better to have that clamping in the helper.

Regards,
Yann E. MORIN.
Yann E. MORIN Feb. 22, 2021, 10:06 p.m. UTC | #5
Vincent, All,

On 2021-02-19 15:21 -0600, Vincent Fazio spake thusly:
> Previously we would use the date provided by:
> `svn info --show-item last-changed-date ...`
> 
> The date returned from this command could include sub-second precision
> which is not compatible with the PAX options we specify to GNU tar.
> 
> Now the returned date is massaged to drop the sub-seconds.
> 
> Signed-off-by: Vincent Fazio <vfazio@xes-inc.com>

In the end, I did move it to the helper, because:

  - this really is an internal detail on a limitation of the PAX format,

  - we do not really mind what exact timestamp goes in the archive, as
    long as it is reproducible.

Also, as suggested by Arnout, I switched to usig an explicit date-time
POSIX-compliant format string, rather than rely on -Iseconds, which is
a GNU extension.

Applied to master, thanks.

Regards,
Yann E. MORIN.

> ---
>  support/download/svn | 3 +++
>  1 file changed, 3 insertions(+)
> 
> diff --git a/support/download/svn b/support/download/svn
> index 839dccaf62..ea1032267f 100755
> --- a/support/download/svn
> +++ b/support/download/svn
> @@ -52,6 +52,9 @@ _svn export ${verbose} "${@}" "'${uri}@${rev}'" "'${basename}'"
>  # last line (svn outputs everything on stdout)
>  date="$( _svn info --show-item last-changed-date "'${uri}@${rev}'" |tail -n 1 )"
>  
> +# Drop sub-second precision to play nice with GNU tar's valid_timespec check
> +date="$( date -d "${date}" -uIseconds )"
> +
>  # Generate the archive.
>  # We did a 'svn export' above, so it's not a working copy (there is no .svn
>  # directory or file to ignore).
> -- 
> 2.30.0
> 
> _______________________________________________
> buildroot mailing list
> buildroot@busybox.net
> http://lists.busybox.net/mailman/listinfo/buildroot
diff mbox series

Patch

diff --git a/support/download/svn b/support/download/svn
index 839dccaf62..ea1032267f 100755
--- a/support/download/svn
+++ b/support/download/svn
@@ -52,6 +52,9 @@  _svn export ${verbose} "${@}" "'${uri}@${rev}'" "'${basename}'"
 # last line (svn outputs everything on stdout)
 date="$( _svn info --show-item last-changed-date "'${uri}@${rev}'" |tail -n 1 )"
 
+# Drop sub-second precision to play nice with GNU tar's valid_timespec check
+date="$( date -d "${date}" -uIseconds )"
+
 # Generate the archive.
 # We did a 'svn export' above, so it's not a working copy (there is no .svn
 # directory or file to ignore).