bug-cvs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Patch for timezone handling in cvs log


From: Derek Robert Price
Subject: Re: Patch for timezone handling in cvs log
Date: Thu, 06 May 2004 22:21:47 -0400
User-agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040413

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Bart Robinson wrote:

>On 2004-5-6 Derek Robert Price <address@hidden> wrote:
> > Bart Robinson wrote:
> > >Yeah, I unfortunately noticed %z after I sent my mail...  That
> > >would certainly be cleaner.
> > >
> > >Do you want me to take strftime stuff from GNULIB?  I'm not too
> > >familiar with what is involved there, dependencies, etc.  If
> > >that part is easy for you, I can resend my diffs with #ifdef
> > >HAVE_STRFTIME_Z or something you can remove once the GNULIB
> > >strftime is available.
> >
> >
> > Basically, importing the GNULIB strftime will mean we can assume it
> > without #ifdefing HAVE_STRFTIME or even HAVE_STRFTIME_Z.  If your
> > wouldn't mind regenerating the patch just using strftime, that would
> > be great!  I can do the GNULIB import quickly myself later if it
> > appears necessary.
>
>Sure, here is the new patch using strftime.  main.c is the only
>different diff.
>
>Thanks
>-- bart
>
>Index: ChangeLog
>===================================================================
>RCS file: /cvsroot/ccvs/ChangeLog,v
>retrieving revision 1.1003
>diff -u -p -r1.1003 ChangeLog
>--- ChangeLog    3 May 2004 14:59:41 -0000    1.1003
>+++ ChangeLog    6 May 2004 20:22:08 -0000
>@@ -1,3 +1,7 @@
>+2004-05-06  Bart Robinson  <address@hidden>
>+
>+    * TODO (224): Remove completed item.
>+
> 2004-05-03  Derek Price  <address@hidden>
>
>     * srclist.txt: Note bison.m4 forked from GNULIB.
>Index: TODO
>===================================================================
>RCS file: /cvsroot/ccvs/TODO,v
>retrieving revision 1.80
>diff -u -p -r1.80 TODO
>--- TODO    7 Apr 2004 00:54:52 -0000    1.80
>+++ TODO    6 May 2004 20:22:08 -0000
>@@ -855,19 +855,6 @@ administrative file interfaces do not.)
> of universal character set (ISO 10646?) internally and converting on
> input and output, which opens the locale can of worms.
>
>-224.  Better timezone handling.  Many people would like to see times
>-output in local time rather than UTC, but that's tricky since the
>-conversion from internal form is currently done by the server who has no
>-idea what the user's timezone even is, let alone the rules for
>-converting to it.
>-
>-   -  On the contrary, I think the MT server response should be
easily adaptable
>-for this purpose.  It is defined in cvsclient.texi as processed by
the client
>-if it knows how and printed to stdout otherwise.  A "time" tag or
the like
>-could be the usual CVS server UTC time string.  An old client could
just print
>-the time in UTC and a new client would know that it could convert
the time to a
>-local time string according to the localization settings before
printing it.
>-
> 225.  Add support for --allow-root to server command.
>
> 227.  'cvs release' should use the CVS/Root in the directory being
released
>Index: doc/ChangeLog
>===================================================================
>RCS file: /cvsroot/ccvs/doc/ChangeLog,v
>retrieving revision 1.841
>diff -u -p -r1.841 ChangeLog
>--- doc/ChangeLog    5 May 2004 16:19:03 -0000    1.841
>+++ doc/ChangeLog    6 May 2004 20:22:09 -0000
>@@ -1,3 +1,9 @@
>+2004-05-06  Bart Robinson  <address@hidden>
>+
>+    * cvs.texinfo (log): Updated since we display in local time now.
>+    Also added some examples.
>+    * cvs.1: Regenerated.
>+    
> 2004-05-04  Derek Price  <address@hidden>
>
>     * cvs.man.header, cvs.man.footer: Reference `info CVS' rather than
>Index: doc/cvs.1
>===================================================================
>RCS file: /cvsroot/ccvs/doc/cvs.1,v
>retrieving revision 1.7
>diff -u -p -r1.7 cvs.1
>--- doc/cvs.1    5 May 2004 16:19:03 -0000    1.7
>+++ doc/cvs.1    6 May 2004 20:22:10 -0000
>@@ -2852,10 +2852,12 @@ The output includes the location of the
> the \fIhead\fP revision (the latest revision on the
> trunk), all symbolic names (tags) and some other
> things.  For each revision, the revision number, the
>+date, the
> author, the number of lines added/deleted and the log
>-message are printed.  All times are displayed in
>-Coordinated Universal Time (UTC).  (Other parts of
>-\fBcvs\fP print times in the local timezone).
>+message are printed.  All dates are displayed in local
>+time at the client.  This is typically specified in the
>+\fB$TZ\fP environment variable, which can be set to
>+govern how \fBlog\fP displays dates.
> .SP
> \fBNote: \fBlog\fP uses @samp{-R\fP in a way that conflicts
> with the normal use inside \fBcvs\fP (see node \`Common options\(aq
in the CVS manual).}
>@@ -3044,7 +3046,25 @@ selected by \fB-b\fP and \fB-r\fP.
> .SP
> \.SH "log examples"
> .SP
>-Contributed examples are gratefully accepted.
>+.IX "Timezone, in output"
>+.IX "Zone, time, in output"
>+Since \fBlog\fP shows dates in local time,
>+you might want to see them in Coordinated Universal Time (UTC) or
>+some other timezone.
>+To do this you can set your \fB$TZ\fP environment
>+variable before invoking \fBcvs\fP:
>+.SP
>+.PD 0
>+.IP "" 2
>+$ TZ=UTC cvs log foo.c
>+.IP "" 2
>+$ TZ=EST cvs log bar.c
>+
>+.PD
>+.IP "" 0
>+.SP
>+(If you are using a \fBcsh\fP-style shell, like \fBtcsh\fP,
>+you would need to prefix the examples above with \fBenv\fP.)
> .SP
> \.SH "ls & rls"
> .IX "ls (subcommand)"
>Index: doc/cvs.texinfo
>===================================================================
>RCS file: /cvsroot/ccvs/doc/cvs.texinfo,v
>retrieving revision 1.603
>diff -u -p -r1.603 cvs.texinfo
>--- doc/cvs.texinfo    30 Apr 2004 18:23:38 -0000    1.603
>+++ doc/cvs.texinfo    6 May 2004 20:22:13 -0000
>@@ -10489,27 +10489,16 @@ commands.
>
> @cindex Timezone, in output
> @cindex Zone, time, in output
>address@hidden Kind of a funny place to document the timezone used
>address@hidden in output from commands other than @code{log}.
>address@hidden There is also more we need to say about this,
>address@hidden including what happens in a client/server environment.
> The output includes the location of the @sc{rcs} file,
> the @dfn{head} revision (the latest revision on the
> trunk), all symbolic names (tags) and some other
> things.  For each revision, the revision number, the
>+date, the
> author, the number of lines added/deleted and the log
>-message are printed.  All times are displayed in
>-Coordinated Universal Time (UTC).  (Other parts of
>address@hidden print times in the local timezone).
>address@hidden FIXCVS: need a better way to control the timezone
>address@hidden used in output.  Previous/current versions of CVS did/do
>address@hidden sometimes support -z in RCSINIT, and/or an
>address@hidden undocumented (except by reference to 'rlog') -z option
>address@hidden to cvs log, but this has not been a consistent,
>address@hidden documented feature.  Perhaps a new global option,
>address@hidden where LT means the client's timezone, which the
>address@hidden client then communicates to the server, is the
>address@hidden right solution.
>+message are printed.  All dates are displayed in local
>+time at the client.  This is typically specified in the
>address@hidden environment variable, which can be set to
>+govern how @code{log} displays dates.
>
> @strong{Note: @code{log} uses @samp{-R} in a way that conflicts
> with the normal use inside @sc{cvs} (@pxref{Common options}).}
>@@ -10677,7 +10666,21 @@ selected by @samp{-b} and @samp{-r}.
> @node log examples
> @appendixsubsec log examples
>
>-Contributed examples are gratefully accepted.
>address@hidden Timezone, in output
>address@hidden Zone, time, in output
>+Since @code{log} shows dates in local time,
>+you might want to see them in Coordinated Universal Time (UTC) or
>+some other timezone.
>+To do this you can set your @code{$TZ} environment
>+variable before invoking @sc{cvs}:
>+
>address@hidden
>+$ TZ=UTC cvs log foo.c
>+$ TZ=EST cvs log bar.c
>address@hidden example
>+
>+(If you are using a @code{csh}-style shell, like @code{tcsh},
>+you would need to prefix the examples above with @code{env}.)
>
> @c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
> @node ls & rls
>Index: src/ChangeLog
>===================================================================
>RCS file: /cvsroot/ccvs/src/ChangeLog,v
>retrieving revision 1.2804
>diff -u -p -r1.2804 ChangeLog
>--- src/ChangeLog    5 May 2004 21:26:51 -0000    1.2804
>+++ src/ChangeLog    6 May 2004 20:22:16 -0000
>@@ -1,3 +1,11 @@
>+2004-05-06  Bart Robinson  <address@hidden>
>+
>+    * client.c (handle_mt): Handle the new "date" MT response
>+    * server.c (cvs_output_tagged): Likewise
>+    * cvs.h: Proto for format_date_alloc
>+    * main.c (format_date_alloc, tm_diff): Added.
>+    * log.c (log_version): Use MT response to tag date output.
>+    
> 2004-05-05  Derek Price  <address@hidden>
>
>     * sanity.sh: Wait a second and retry if cvs-serv* directories are
>Index: src/client.c
>===================================================================
>RCS file: /cvsroot/ccvs/src/client.c,v
>retrieving revision 1.371
>diff -u -p -r1.371 client.c
>--- src/client.c    28 Apr 2004 04:20:33 -0000    1.371
>+++ src/client.c    6 May 2004 20:22:17 -0000
>@@ -2735,6 +2735,12 @@ handle_mt( char *args, int len )
>         }
>         else if (strcmp (tag, "newline") == 0)
>         printf ("\n");
>+        else if (strcmp (tag, "date") == 0)
>+        {
>+        char *date = format_date_alloc (text);
>+        printf ("%s", date);
>+        free (date);
>+        }
>         else if (text != NULL)
>         printf ("%s", text);
>     }
>Index: src/cvs.h
>===================================================================
>RCS file: /cvsroot/ccvs/src/cvs.h,v
>retrieving revision 1.291
>diff -u -p -r1.291 cvs.h
>--- src/cvs.h    28 Apr 2004 04:20:33 -0000    1.291
>+++ src/cvs.h    6 May 2004 20:22:17 -0000
>@@ -431,6 +431,7 @@ char *date_from_time_t (time_t);
> void date_to_internet (char *, const char *);
> void date_to_tm (struct tm *, const char *);
> void tm_to_internet (char *, const struct tm *);
>+char *format_date_alloc (const char *text);
>
> char *Name_Repository (const char *dir, const char *update_dir);
> const char *Short_Repository (const char *repository);
>Index: src/log.c
>===================================================================
>RCS file: /cvsroot/ccvs/src/log.c,v
>retrieving revision 1.94
>diff -u -p -r1.94 log.c
>--- src/log.c    2 Apr 2004 19:56:22 -0000    1.94
>+++ src/log.c    6 May 2004 20:22:18 -0000
>@@ -1566,22 +1566,23 @@ log_version (struct log_data *log_data,
>     cvs_output (p->data, 0);
>     cvs_output (";", 1);
>     }
>+    cvs_output ("\n", 1);
>
>-    cvs_output ("\ndate: ", 0);
>+    cvs_output_tagged ("text", "date: ");
>     (void)sscanf (ver->date, SDATEFORM, &year, &mon, &mday, &hour, &min,
>           &sec);
>     if (year < 1900)
>     year += 1900;
>-    sprintf (buf, "%04d/%02d/%02d %02d:%02d:%02d", year, mon, mday,
>+    sprintf (buf, "%04d-%02d-%02d %02d:%02d:%02d", year, mon, mday,
>          hour, min, sec);
>-    cvs_output (buf, 0);
>+    cvs_output_tagged ("date", buf);
>
>-    cvs_output (";  author: ", 0);
>-    cvs_output (ver->author, 0);
>+    cvs_output_tagged ("text", ";  author: ");
>+    cvs_output_tagged ("text", ver->author);
>
>-    cvs_output (";  state: ", 0);
>-    cvs_output (ver->state, 0);
>-    cvs_output (";", 1);
>+    cvs_output_tagged ("text", ";  state: ");
>+    cvs_output_tagged ("text", ver->state);
>+    cvs_output_tagged ("text", ";");
>
>     if (! trunk)
>     {
>@@ -1609,20 +1610,20 @@ log_version (struct log_data *log_data,
>
>     if (padd != NULL)
>     {
>-    cvs_output ("  lines: +", 0);
>-    cvs_output (padd->data, 0);
>-    cvs_output (" -", 2);
>-    cvs_output (pdel->data, 0);
>+    cvs_output_tagged ("text", "  lines: +");
>+    cvs_output_tagged ("text", padd->data);
>+    cvs_output_tagged ("text", " -");
>+    cvs_output_tagged ("text", pdel->data);
>     }
>+    cvs_output_tagged ("newline", NULL);
>
>     if (ver->branches != NULL)
>     {
>-    cvs_output ("\nbranches:", 0);
>+    cvs_output ("branches:", 0);
>     walklist (ver->branches, log_branch, NULL);
>+    cvs_output ("\n", 1);
>     }
>
>-    cvs_output ("\n", 1);
>-
>     p = findnode (ver->other, "log");
>     /* The p->date == NULL case is the normal one for an empty log
>        message (rcs-14 in sanity.sh).  I don't think the case where
>Index: src/main.c
>===================================================================
>RCS file: /cvsroot/ccvs/src/main.c,v
>retrieving revision 1.208
>diff -u -p -r1.208 main.c
>--- src/main.c    28 Apr 2004 04:20:33 -0000    1.208
>+++ src/main.c    6 May 2004 20:22:18 -0000
>@@ -1190,6 +1190,41 @@ tm_to_internet (char *dest, const struct
>          source->tm_year + 1900, source->tm_hour, source->tm_min,
source->tm_sec);
> }
>
>+/*
>+ * Format a date for the current locale.
>+ *
>+ * Input looks like
>+ *    2004-04-29 20:24:22
>+ * Output looks the same (for GMT) or with +/-HHMM added to the end,
like
>+ *    2004-04-29 13:24:22-0700
>+ */
>+char *
>+format_date_alloc (const char *datestr)
>+{
>+    struct timespec ts;
>+    struct tm ltm;
>+    char buf[sizeof ("yyyy-mm-dd hh:mm:ss-hhhh")];
>+    size_t len;
>+
>+    /* Get the date string as a local struct tm. */
>+    (void) snprintf (buf, sizeof (buf), "%s GMT", datestr);
>+    if (! get_date (&ts, buf, NULL))
>+    goto as_is;
>+    ltm = *(localtime (&ts.tv_sec));
>+
>+    if ((len = strftime (buf, sizeof (buf), "%Y-%m-%d %H:%M:%S%z",
&ltm)) == 0)


Is there a reason you choose to leave out the space between %S & %z?
I've usually seen it with a space.  The space doesn't appear to be
part of the ISO8601 specification, but I think it makes the timespec a
little more readable.

Derek

- --
                *8^)

Email: address@hidden

Get CVS support at <http://ximbiot.com>!
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.1 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD8DBQFAmvK5LD1OTBfyMaQRApE2AKDn/kAh36RSAuW9Lm5FvWuW8x5YCgCfWq6t
+Lmb0rSqtNXOSrgUnzngNq4=
=06z5
-----END PGP SIGNATURE-----





reply via email to

[Prev in Thread] Current Thread [Next in Thread]