* [PATCH 1/2] gitweb: rename parse_date() to format_date() @ 2011-03-19 5:39 Kevin Cernekee 2011-03-19 5:39 ` [PATCH v4 2/2] gitweb: introduce localtime feature Kevin Cernekee ` (2 more replies) 0 siblings, 3 replies; 36+ messages in thread From: Kevin Cernekee @ 2011-03-19 5:39 UTC (permalink / raw) To: Junio C Hamano, Jakub Narebski; +Cc: git One might reasonably expect a function named parse_date() to be used for something along these lines: $unix_time_t = parse_date("2011-03-19"); But instead, gitweb's parse_date works more like: &parse_date(1300505805) = { 'hour' => 3, 'minute' => 36, ... 'rfc2822' => 'Sat, 19 Mar 2011 03:36:45 +0000', ... } Rename the function to improve clarity. No change to functionality. Signed-off-by: Kevin Cernekee <cernekee@gmail.com> --- gitweb/gitweb.perl | 18 +++++++++--------- 1 files changed, 9 insertions(+), 9 deletions(-) diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl index b04ab8c..57ef08c 100755 --- a/gitweb/gitweb.perl +++ b/gitweb/gitweb.perl @@ -2893,7 +2893,7 @@ sub git_get_rev_name_tags { ## ---------------------------------------------------------------------- ## parse to hash functions -sub parse_date { +sub format_date { my $epoch = shift; my $tz = shift || "-0000"; @@ -3953,7 +3953,7 @@ sub git_print_authorship { my $tag = $opts{-tag} || 'div'; my $author = $co->{'author_name'}; - my %ad = parse_date($co->{'author_epoch'}, $co->{'author_tz'}); + my %ad = format_date($co->{'author_epoch'}, $co->{'author_tz'}); print "<$tag class=\"author_date\">" . format_search_author($author, "author", esc_html($author)) . " [$ad{'rfc2822'}"; @@ -3973,7 +3973,7 @@ sub git_print_authorship_rows { my @people = @_; @people = ('author', 'committer') unless @people; foreach my $who (@people) { - my %wd = parse_date($co->{"${who}_epoch"}, $co->{"${who}_tz"}); + my %wd = format_date($co->{"${who}_epoch"}, $co->{"${who}_tz"}); print "<tr><td>$who</td><td>" . format_search_author($co->{"${who}_name"}, $who, esc_html($co->{"${who}_name"})) . " " . @@ -4906,7 +4906,7 @@ sub git_log_body { next if !%co; my $commit = $co{'id'}; my $ref = format_ref_marker($refs, $commit); - my %ad = parse_date($co{'author_epoch'}); + my %ad = format_date($co{'author_epoch'}); git_print_header_div('commit', "<span class=\"age\">$co{'age_string'}</span>" . esc_html($co{'title'}) . $ref, @@ -5369,7 +5369,7 @@ sub git_project_index { sub git_summary { my $descr = git_get_project_description($project) || "none"; my %co = parse_commit("HEAD"); - my %cd = %co ? parse_date($co{'committer_epoch'}, $co{'committer_tz'}) : (); + my %cd = %co ? format_date($co{'committer_epoch'}, $co{'committer_tz'}) : (); my $head = $co{'id'}; my $remote_heads = gitweb_check_feature('remote_heads'); @@ -5674,7 +5674,7 @@ sub git_blame_common { my $short_rev = substr($full_rev, 0, 8); my $author = $meta->{'author'}; my %date = - parse_date($meta->{'author-time'}, $meta->{'author-tz'}); + format_date($meta->{'author-time'}, $meta->{'author-tz'}); my $date = $date{'iso-tz'}; if ($group_size) { $current_color = ($current_color + 1) % $num_colors; @@ -6702,7 +6702,7 @@ sub git_commitdiff { -charset => 'utf-8', -expires => $expires, -content_disposition => 'inline; filename="' . "$filename" . '"'); - my %ad = parse_date($co{'author_epoch'}, $co{'author_tz'}); + my %ad = format_date($co{'author_epoch'}, $co{'author_tz'}); print "From: " . to_utf8($co{'author'}) . "\n"; print "Date: $ad{'rfc2822'} ($ad{'tz_local'})\n"; print "Subject: " . to_utf8($co{'title'}) . "\n"; @@ -7064,7 +7064,7 @@ sub git_feed { if (defined($commitlist[0])) { %latest_commit = %{$commitlist[0]}; my $latest_epoch = $latest_commit{'committer_epoch'}; - %latest_date = parse_date($latest_epoch); + %latest_date = format_date($latest_epoch); my $if_modified = $cgi->http('IF_MODIFIED_SINCE'); if (defined $if_modified) { my $since; @@ -7195,7 +7195,7 @@ XML if (($i >= 20) && ((time - $co{'author_epoch'}) > 48*60*60)) { last; } - my %cd = parse_date($co{'author_epoch'}); + my %cd = format_date($co{'author_epoch'}); # get list of changed files open my $fd, "-|", git_cmd(), "diff-tree", '-r', @diff_opts, -- 1.7.4.1 ^ permalink raw reply related [flat|nested] 36+ messages in thread
* [PATCH v4 2/2] gitweb: introduce localtime feature 2011-03-19 5:39 [PATCH 1/2] gitweb: rename parse_date() to format_date() Kevin Cernekee @ 2011-03-19 5:39 ` Kevin Cernekee 2011-03-19 15:18 ` Jakub Narebski ` (4 more replies) 2011-03-19 10:33 ` [PATCH 1/2] gitweb: rename parse_date() to format_date() Jakub Narebski 2011-03-19 18:00 ` Junio C Hamano 2 siblings, 5 replies; 36+ messages in thread From: Kevin Cernekee @ 2011-03-19 5:39 UTC (permalink / raw) To: Junio C Hamano, Jakub Narebski; +Cc: git With this feature enabled, all timestamps are shown in the local timezone instead of GMT. The timezone is taken from the appropriate timezone string stored in the commit object. This improves usability if the majority of a project's contributors are based in a single office, all within the same timezone. It also makes the interface more friendly to non-developers who may need to track updates, such as program managers and supervisors. This change does not affect relative timestamps (e.g. "5 hours ago"), nor does it affect 'patch' and 'patches' views which already use localtime because they are generated by "git format-patch". Affected views include: * 'summary' view, "last change" field (commit time from latest change) * 'log' view, author time * 'commit' and 'commitdiff' views, author/committer time * 'tag' view, tagger time In the case of 'commit', 'commitdiff' and 'tag' views, gitweb used to print both GMT time and time in timezone of author/tagger/committer: Fri, 18 Mar 2011 01:28:57 +0000 (18:28 -0700) With localtime enabled, the times will be swapped: Thu, 17 Mar 2011 18:28:57 -0700 (01:28 +0000) Local times between 00:00 and 05:59, inclusive, will still be printed in red ("atnight" style) in these views. Signed-off-by: Kevin Cernekee <cernekee@gmail.com> Signed-off-by: Jakub Narebski <jnareb@gmail.com> --- gitweb/gitweb.perl | 87 ++++++++++++++++++++++++++++++++++++++------------- 1 files changed, 65 insertions(+), 22 deletions(-) diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl index 57ef08c..b3b7f3f 100755 --- a/gitweb/gitweb.perl +++ b/gitweb/gitweb.perl @@ -504,6 +504,19 @@ our %feature = ( 'sub' => sub { feature_bool('remote_heads', @_) }, 'override' => 0, 'default' => [0]}, + + # Use the author/commit localtime rather than GMT for all timestamps. + # Disabled by default. + + # To enable system wide have in $GITWEB_CONFIG + # $feature{'localtime'}{'default'} = [1]; + # To have project specific config enable override in $GITWEB_CONFIG + # $feature{'localtime'}{'override'} = 1; + # and in project config gitweb.localtime = 0|1; + 'localtime' => { + 'sub' => sub { feature_bool('localtime', @_) }, + 'override' => 0, + 'default' => [0]}, ); sub gitweb_get_feature { @@ -2919,6 +2932,10 @@ sub format_date { $date{'hour_local'} = $hour; $date{'minute_local'} = $min; $date{'tz_local'} = $tz; + $date{'rfc2822_local'} = sprintf "%s, %d %s %4d %02d:%02d:%02d $tz", + $days[$wday], $mday, $months[$mon], + 1900+$year, $hour ,$min, $sec; + $date{'iso-tz'} = sprintf("%04d-%02d-%02d %02d:%02d:%02d %s", 1900+$year, $mon+1, $mday, $hour, $min, $sec, $tz); @@ -3928,22 +3945,48 @@ sub git_print_section { print $cgi->end_div; } -sub print_local_time { - print format_local_time(@_); -} - -sub format_local_time { - my $localtime = ''; - my %date = @_; - if ($date{'hour_local'} < 6) { - $localtime .= sprintf(" (<span class=\"atnight\">%02d:%02d</span> %s)", - $date{'hour_local'}, $date{'minute_local'}, $date{'tz_local'}); +# Returns an RFC 2822 timestamp string, which may contain HTML. +# If $use_localtime is 0, don't do anything special. +# If $use_localtime is 1, add an alternate HH:MM timestamp in parentheses at +# the end. If $feature{'localtime'} is enabled this looks like: +# Thu, 17 Mar 2011 18:28:57 -0700 (01:28 +0000) +# Otherwise, it looks like: +# Fri, 18 Mar 2011 01:28:57 +0000 (18:28 -0700) +# If $use_localtime is 1, this will also apply the "atnight" style to +# local times between 00:00 and 05:59. +sub timestamp_html { + my %date = %{$_[0]}; + my $use_localtime = $_[1]; + my $timestamp; + my $alt_time; + + if (gitweb_check_feature('localtime')) { + $timestamp = $date{'rfc2822_local'}; + if ($use_localtime && $date{'hour_local'} < 6) { + $timestamp = "<span class=\"atnight\">" . + $timestamp . + "</span>"; + } + $alt_time = sprintf(" (%02d:%02d %s)", + $date{'hour'}, $date{'minute'}, "+0000"); } else { - $localtime .= sprintf(" (%02d:%02d %s)", - $date{'hour_local'}, $date{'minute_local'}, $date{'tz_local'}); + $timestamp = $date{'rfc2822'}; + $alt_time = sprintf(" (%02d:%02d %s)", + $date{'hour_local'}, + $date{'minute_local'}, + $date{'tz_local'}); + if ($use_localtime && $date{'hour_local'} < 6) { + $alt_time = "<span class=\"atnight\">" . + $alt_time . + "</span>"; + } } - return $localtime; + if ($use_localtime) { + $timestamp .= $alt_time; + } + + return $timestamp; } # Outputs the author name and date in long form @@ -3956,10 +3999,9 @@ sub git_print_authorship { my %ad = format_date($co->{'author_epoch'}, $co->{'author_tz'}); print "<$tag class=\"author_date\">" . format_search_author($author, "author", esc_html($author)) . - " [$ad{'rfc2822'}"; - print_local_time(%ad) if ($opts{-localtime}); - print "]" . git_get_avatar($co->{'author_email'}, -pad_before => 1) - . "</$tag>\n"; + " [" . timestamp_html(\%ad, 0) . "] ". + git_get_avatar($co->{'author_email'}, -pad_before => 1) . + "</$tag>\n"; } # Outputs table rows containing the full author or committer information, @@ -3983,9 +4025,9 @@ sub git_print_authorship_rows { git_get_avatar($co->{"${who}_email"}, -size => 'double') . "</td></tr>\n" . "<tr>" . - "<td></td><td> $wd{'rfc2822'}"; - print_local_time(%wd); - print "</td>" . + "<td></td><td> " . + timestamp_html(\%wd, 1) . + "</td>" . "</tr>\n"; } } @@ -5395,8 +5437,9 @@ sub git_summary { print "<table class=\"projects_list\">\n" . "<tr id=\"metadata_desc\"><td>description</td><td>" . esc_html($descr) . "</td></tr>\n" . "<tr id=\"metadata_owner\"><td>owner</td><td>" . esc_html($owner) . "</td></tr>\n"; - if (defined $cd{'rfc2822'}) { - print "<tr id=\"metadata_lchange\"><td>last change</td><td>$cd{'rfc2822'}</td></tr>\n"; + if (keys %cd) { + print "<tr id=\"metadata_lchange\"><td>last change</td><td>" . + timestamp_html(\%cd, 0) . "</td></tr>\n"; } # use per project git URL list in $projectroot/$project/cloneurl -- 1.7.4.1 ^ permalink raw reply related [flat|nested] 36+ messages in thread
* Re: [PATCH v4 2/2] gitweb: introduce localtime feature 2011-03-19 5:39 ` [PATCH v4 2/2] gitweb: introduce localtime feature Kevin Cernekee @ 2011-03-19 15:18 ` Jakub Narebski 2011-03-19 17:56 ` Junio C Hamano ` (3 subsequent siblings) 4 siblings, 0 replies; 36+ messages in thread From: Jakub Narebski @ 2011-03-19 15:18 UTC (permalink / raw) To: Kevin Cernekee; +Cc: Junio C Hamano, git On Sat, 19 Mar 2011, Kevin Cernekee wrote: > With this feature enabled, all timestamps are shown in the local > timezone instead of GMT. The timezone is taken from the appropriate > timezone string stored in the commit object. [...] > In the case of 'commit', 'commitdiff' and 'tag' views, gitweb used to > print both GMT time and time in timezone of author/tagger/committer: > > Fri, 18 Mar 2011 01:28:57 +0000 (18:28 -0700) > > With localtime enabled, the times will be swapped: > > Thu, 17 Mar 2011 18:28:57 -0700 (01:28 +0000) First, currently the localtime part is needed only to have "atnight" warning. I wonder if with 'localtime' feature enabled gitweb should show GMT time, or is it not necessary. With 'localtime' it could simply be Thu, 17 Mar 2011 18:28:57 -0700 either marked with "atnight" as whole, or only time (see below). > Local times between 00:00 and 05:59, inclusive, will still be printed > in red ("atnight" style) in these views. Second, from above description it is not clear which part of date is marked with "atnight" style when 'localtime' feature is enabled. Is the whole localtime part marked, and GMT left not marked: Thu, 17 Mar 2011 18:28:57 -0700 (01:28 +0000) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Or perhaps only the local _time_ is marked with "atnight" style: Thu, 17 Mar 2011 18:28:57 -0700 (01:28 +0000) ^^^^^^^^ Or perhaps whole date now uses "atnight" style: Thu, 17 Mar 2011 18:28:57 -0700 (01:28 +0000) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [...] > @@ -3928,22 +3945,48 @@ sub git_print_section { > print $cgi->end_div; > } > > -sub print_local_time { > - print format_local_time(@_); > -} > - > -sub format_local_time { > - my $localtime = ''; > - my %date = @_; > - if ($date{'hour_local'} < 6) { > - $localtime .= sprintf(" (<span class=\"atnight\">%02d:%02d</span> %s)", > - $date{'hour_local'}, $date{'minute_local'}, $date{'tz_local'}); > +# Returns an RFC 2822 timestamp string, which may contain HTML. I'm not sure if we need to write about it being RFC2822-like format; it is just implementation detail. Perhaps +# Returns formatted date and time, outputs HTML. It is important if it is HTML or not, to know if it needs to be esc_html or not. > +# If $use_localtime is 0, don't do anything special. > +# If $use_localtime is 1, add an alternate HH:MM timestamp in parentheses at > +# the end. See comment below. > If $feature{'localtime'} is enabled this looks like: > +# Thu, 17 Mar 2011 18:28:57 -0700 (01:28 +0000) > +# Otherwise, it looks like: > +# Fri, 18 Mar 2011 01:28:57 +0000 (18:28 -0700) > +# If $use_localtime is 1, this will also apply the "atnight" style to > +# local times between 00:00 and 05:59. I would really prefer to split this patch in two: first refactor date-printing code, introducing and using timestamp_html subroutine, with no changes in output, and leave introducing 'localtime' feature for a second patch. > +sub timestamp_html { > + my %date = %{$_[0]}; > + my $use_localtime = $_[1]; Why not use my ($date, $use_localtime) = @_; and $date->{'rfc2822_local'} instead of $date{'rfc2822_local'}? Also with current code the calling convention for timestamp_html (or format_timestamp_html, or format_date_html) looks like this: print " [" . timestamp_html(\%ad, 0) . "] " or print timestamp_html(\%wd, 1) This would require anyone who stumbles upon on a calling site to have to refer to definition of this function to understand it. In many other places we use "named parameters" for such boolean flags; then the calling convention could be timestamp_html(\%date) or timestamp_html(\%date, -long=>1) (or -localtime=>1, or -atnight=>1, etc.). We can also/instead provide timestamp_short_html and timestamp_long_html so one can write timestamp_short_html(%date) and timestamp_long_html(%date) -- Jakub Narebski Poland ^ permalink raw reply [flat|nested] 36+ messages in thread
* Re: [PATCH v4 2/2] gitweb: introduce localtime feature 2011-03-19 5:39 ` [PATCH v4 2/2] gitweb: introduce localtime feature Kevin Cernekee 2011-03-19 15:18 ` Jakub Narebski @ 2011-03-19 17:56 ` Junio C Hamano 2011-03-19 19:49 ` Kevin Cernekee 2011-03-20 22:38 ` J.H. ` (2 subsequent siblings) 4 siblings, 1 reply; 36+ messages in thread From: Junio C Hamano @ 2011-03-19 17:56 UTC (permalink / raw) To: Kevin Cernekee; +Cc: Jakub Narebski, git Kevin Cernekee <cernekee@gmail.com> writes: > -sub format_local_time { > - my $localtime = ''; > - my %date = @_; > - if ($date{'hour_local'} < 6) { > - $localtime .= sprintf(" (<span class=\"atnight\">%02d:%02d</span> %s)", > - $date{'hour_local'}, $date{'minute_local'}, $date{'tz_local'}); Looks like we used to only paint HH:MM part but... > +# Returns an RFC 2822 timestamp string, which may contain HTML. > +# If $use_localtime is 0, don't do anything special. > +# If $use_localtime is 1, add an alternate HH:MM timestamp in parentheses at > +# the end. If $feature{'localtime'} is enabled this looks like: > +# Thu, 17 Mar 2011 18:28:57 -0700 (01:28 +0000) > +# Otherwise, it looks like: > +# Fri, 18 Mar 2011 01:28:57 +0000 (18:28 -0700) > +# If $use_localtime is 1, this will also apply the "atnight" style to > +# local times between 00:00 and 05:59. > +sub timestamp_html { > + my %date = %{$_[0]}; > + my $use_localtime = $_[1]; > + my $timestamp; > + my $alt_time; > + > + if (gitweb_check_feature('localtime')) { > + $timestamp = $date{'rfc2822_local'}; > + if ($use_localtime && $date{'hour_local'} < 6) { > + $timestamp = "<span class=\"atnight\">" . > + $timestamp . > + "</span>"; > + } > + $alt_time = sprintf(" (%02d:%02d %s)", > + $date{'hour'}, $date{'minute'}, "+0000"); > } else { > - $localtime .= sprintf(" (%02d:%02d %s)", > - $date{'hour_local'}, $date{'minute_local'}, $date{'tz_local'}); > + $timestamp = $date{'rfc2822'}; > + $alt_time = sprintf(" (%02d:%02d %s)", > + $date{'hour_local'}, > + $date{'minute_local'}, > + $date{'tz_local'}); > + if ($use_localtime && $date{'hour_local'} < 6) { > + $alt_time = "<span class=\"atnight\">" . > + $alt_time . > + "</span>"; > + } ... we now paint the whole line, which I personally think is a friendly move for color challenged people (me included---a larger span of text painted in different colors tends to help you still notice it better using value/brightness difference, even if your hue perception is weaker than other people). But it is a change from the old behaviour and might be worth stating in the log message. > - return $localtime; > + if ($use_localtime) { > + $timestamp .= $alt_time; > + } You kept -localtime nobody uses? If you dig the history, you would notice that it is merely a remnant of f88bafa (gitweb: uniform author info for commit and commitdiff, 2009-06-30) that forgot to remove the feature while removing the last callsite, and I don't think anybody even was against such a change. I'd suggest to remove $alt_time codepath from this function. Nobody will notice. > # Outputs the author name and date in long form > @@ -3956,10 +3999,9 @@ sub git_print_authorship { > my %ad = format_date($co->{'author_epoch'}, $co->{'author_tz'}); > print "<$tag class=\"author_date\">" . > format_search_author($author, "author", esc_html($author)) . > - " [$ad{'rfc2822'}"; > - print_local_time(%ad) if ($opts{-localtime}); > - print "]" . git_get_avatar($co->{'author_email'}, -pad_before => 1) > - . "</$tag>\n"; > + " [" . timestamp_html(\%ad, 0) . "] ". > ... > # Outputs table rows containing the full author or committer information, > @@ -3983,9 +4025,9 @@ sub git_print_authorship_rows { > - print "</td>" . > + "<td></td><td> " . > + timestamp_html(\%wd, 1) . > + "</td>" . While I don't agree with Jakub about the presense / absence of "[]" around it (that is not a part of "timestamp", but is how the caller wants to prepare the space to plug a timestamp string in), I do agree that the second parameter "use-localtime" looks funny, not because it is an unnamed parameter (which I personally think is fine) but because it isn't about the localness of the displayed time anymore. Your 'localtime' feature alone controls in which timezone the timestamp is shown, and this only controls the use of 'atnight' highlighting. The parameter needs to be renamed, and perhaps you may clarify it further by making it a keyword argument as Jakub suggests. Other than that, I think this round is very nicely done. This is a complete tangent, but I wonder if it makes sense to keep the output from print_authorship plain (no atnight markings) while painting the output from print_authorship_rows. I would understand it if the design _were_ to paint late-nite commits differently when we list multiple commits in a row (e.g. summary view) to make them easier to stand out (for amusement purposes), and not to paint the timestamp when we show only one commit to avoid distraction. But that doesn't seem to be the case. ^ permalink raw reply [flat|nested] 36+ messages in thread
* Re: [PATCH v4 2/2] gitweb: introduce localtime feature 2011-03-19 17:56 ` Junio C Hamano @ 2011-03-19 19:49 ` Kevin Cernekee 2011-03-19 21:09 ` Jakub Narebski 0 siblings, 1 reply; 36+ messages in thread From: Kevin Cernekee @ 2011-03-19 19:49 UTC (permalink / raw) To: Junio C Hamano; +Cc: Jakub Narebski, git On Sat, Mar 19, 2011 at 10:56 AM, Junio C Hamano <gitster@pobox.com> wrote: > Looks like we used to only paint HH:MM part but... > ... we now paint the whole line, which I personally think is a friendly > move for color challenged people (me included---a larger span of text > painted in different colors tends to help you still notice it better using > value/brightness difference, even if your hue perception is weaker than > other people). But it is a change from the old behaviour and might be > worth stating in the log message. For the $feature{'localtime'} disabled case, the coloring is the same as before. I will paint the whole line in the next spin, and mention it in the commit message. > >> - return $localtime; >> + if ($use_localtime) { >> + $timestamp .= $alt_time; >> + } > > You kept -localtime nobody uses? > While I don't agree with Jakub about the presense / absence of "[]" around > it (that is not a part of "timestamp", but is how the caller wants to > prepare the space to plug a timestamp string in), I do agree that the > second parameter "use-localtime" looks funny, not because it is an unnamed > parameter (which I personally think is fine) but because it isn't about > the localness of the displayed time anymore. Your 'localtime' feature > alone controls in which timezone the timestamp is shown, and this only > controls the use of 'atnight' highlighting. The parameter needs to be > renamed, and perhaps you may clarify it further by making it a keyword > argument as Jakub suggests. $use_localtime indicates whether or not to add the " (hh:mm -zzzz)" at the end. This also enables the atnight coloring. This argument name was suggested in an earlier post and I guess I took it a little too literally... Do you think it would be a good idea to take two separate options: -atnight for the variable coloring, and -alt_time (or some other name) to show " (hh:mm -zzzz)" after the RFC 2822 string? Or maybe take one option, named something like "-commitpage", to indicate that it is a format specific to that view? If it is not specified, the caller gets back an uncolored RFC 2822 date. Also, is there a cleaner way of writing this? sub timestamp_html { my %date = %{$_[0]}; shift; my %opts = @_; Or should I pass in the options as a hash reference, more like $cgi->a(): sub timestamp_html { my %date = %{$_[0]}; my %opts = %{$_[1]}; Thanks. ^ permalink raw reply [flat|nested] 36+ messages in thread
* Re: [PATCH v4 2/2] gitweb: introduce localtime feature 2011-03-19 19:49 ` Kevin Cernekee @ 2011-03-19 21:09 ` Jakub Narebski 2011-03-19 21:22 ` Kevin Cernekee 0 siblings, 1 reply; 36+ messages in thread From: Jakub Narebski @ 2011-03-19 21:09 UTC (permalink / raw) To: Kevin Cernekee; +Cc: Junio C Hamano, git On Sat, 19 Mar 2011, Kevin Cernekee wrote: > On Sat, Mar 19, 2011 at 10:56 AM, Junio C Hamano <gitster@pobox.com> wrote: > > Looks like we used to only paint HH:MM part but... > > ... we now paint the whole line, which I personally think is a friendly > > move for color challenged people (me included---a larger span of text > > painted in different colors tends to help you still notice it better using > > value/brightness difference, even if your hue perception is weaker than > > other people). But it is a change from the old behaviour and might be > > worth stating in the log message. > > For the $feature{'localtime'} disabled case, the coloring is the same as before. No, it is not the same. It used to be Wed, 16 Mar 2011 07:02:42 +0000 (02:02 -0500) ^^^^^ and now it is Wed, 16 Mar 2011 07:02:42 +0000 (02:02 -0500) ^^^^^^^^^^^^^ which is I also think improvement,... but should be mentioned in the commit message. > I will paint the whole line in the next spin, and mention it in the > commit message. I think current solution of using Wed, 16 Mar 2011 02:02:42 -0500 (07:02:42 +0000) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ when 'localtime' feature is enabled is better than painting the whole: you are now painting the _local_ part, i.e the part responsible for "atnight" warning. [...] > $use_localtime indicates whether or not to add the " (hh:mm -zzzz)" at > the end. This also enables the atnight coloring. > > This argument name was suggested in an earlier post and I guess I took > it a little too literally... > > Do you think it would be a good idea to take two separate options: > -atnight for the variable coloring, and -alt_time (or some other name) > to show " (hh:mm -zzzz)" after the RFC 2822 string? Perhaps name this parameter -long. Or simply always use the long form. > Or maybe take one option, named something like "-commitpage", to > indicate that it is a format specific to that view? If it is not > specified, the caller gets back an uncolored RFC 2822 date. > > Also, is there a cleaner way of writing this? > > sub timestamp_html { > my %date = %{$_[0]}; > shift; > my %opts = @_; sub timestamp_html { my %date = %{ shift }; my %opts = @_; > > Or should I pass in the options as a hash reference, more like $cgi->a(): > > sub timestamp_html { > my %date = %{$_[0]}; > my %opts = %{$_[1]}; Or just use hash reference for $date: sub timestamp_html { my ($date, %opts) = @_; and use $date->{'sth'}. -- Jakub Narebski Poland ^ permalink raw reply [flat|nested] 36+ messages in thread
* Re: [PATCH v4 2/2] gitweb: introduce localtime feature 2011-03-19 21:09 ` Jakub Narebski @ 2011-03-19 21:22 ` Kevin Cernekee 2011-03-19 21:41 ` Jakub Narebski 0 siblings, 1 reply; 36+ messages in thread From: Kevin Cernekee @ 2011-03-19 21:22 UTC (permalink / raw) To: Jakub Narebski; +Cc: Junio C Hamano, git On Sat, Mar 19, 2011 at 2:09 PM, Jakub Narebski <jnareb@gmail.com> wrote: >> For the $feature{'localtime'} disabled case, the coloring is the same as before. > > No, it is not the same. It used to be > > Wed, 16 Mar 2011 07:02:42 +0000 (02:02 -0500) > ^^^^^ > > and now it is > > Wed, 16 Mar 2011 07:02:42 +0000 (02:02 -0500) > ^^^^^^^^^^^^^ > which is I also think improvement,... but should be mentioned in the > commit message. Oh OK, I did not notice this or intend to change the formatting. My bad. >> I will paint the whole line in the next spin, and mention it in the >> commit message. > > I think current solution of using > > Wed, 16 Mar 2011 02:02:42 -0500 (07:02:42 +0000) > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > > when 'localtime' feature is enabled is better than painting the whole: > you are now painting the _local_ part, i.e the part responsible for > "atnight" warning. I can fix up v4 if Junio thinks this is a better way to go... It does make the code a little more complicated, though. If we paint the entire string, it can be done once toward the end of the function, rather than twice (two different ways) inside the localtime / no-localtime clauses. I am largely indifferent to how "atnight" is handled but it would be good to arrive at a consensus. >> Also, is there a cleaner way of writing this? >> >> sub timestamp_html { >> my %date = %{$_[0]}; >> shift; >> my %opts = @_; > > sub timestamp_html { > my %date = %{ shift }; > my %opts = @_; This did not work for me. It interprets "shift" as a variable name. > Or just use hash reference for $date: > > sub timestamp_html { > my ($date, %opts) = @_; > > and use $date->{'sth'}. That is what I did on the latest 3/3 (change "atnight" highlighting) patch. Seemed to work OK. Thanks. ^ permalink raw reply [flat|nested] 36+ messages in thread
* Re: [PATCH v4 2/2] gitweb: introduce localtime feature 2011-03-19 21:22 ` Kevin Cernekee @ 2011-03-19 21:41 ` Jakub Narebski 0 siblings, 0 replies; 36+ messages in thread From: Jakub Narebski @ 2011-03-19 21:41 UTC (permalink / raw) To: Kevin Cernekee; +Cc: Junio C Hamano, git Kevin Cernekee wrote: > On Sat, Mar 19, 2011 at 2:09 PM, Jakub Narebski <jnareb@gmail.com> wrote: > > sub timestamp_html { > > my %date = %{ shift }; > > my %opts = @_; > > This did not work for me. It interprets "shift" as a variable name. Damn autoquoting ('shift' is taken as bareword here). Either my %date = %{ shift @_ }; or my %date = %{ +shift }; works. Not that it matter much... -- Jakub Narebski Poland ^ permalink raw reply [flat|nested] 36+ messages in thread
* Re: [PATCH v4 2/2] gitweb: introduce localtime feature 2011-03-19 5:39 ` [PATCH v4 2/2] gitweb: introduce localtime feature Kevin Cernekee 2011-03-19 15:18 ` Jakub Narebski 2011-03-19 17:56 ` Junio C Hamano @ 2011-03-20 22:38 ` J.H. 2011-03-20 23:44 ` Kevin Cernekee 2011-03-21 0:20 ` Jakub Narebski 2011-03-24 0:08 ` [PATCH 0/1] Gitweb: Change timezone John 'Warthog9' Hawley 2011-03-24 0:08 ` [PATCH 1/1] gitweb: javascript ability to adjust time based on timezone John 'Warthog9' Hawley 4 siblings, 2 replies; 36+ messages in thread From: J.H. @ 2011-03-20 22:38 UTC (permalink / raw) To: Kevin Cernekee; +Cc: Junio C Hamano, Jakub Narebski, git Hey all, Sorry for not jumping in on this earlier, too much travel / real world going on here the past couple of weeks. > With this feature enabled, all timestamps are shown in the local > timezone instead of GMT. The timezone is taken from the appropriate > timezone string stored in the commit object. I'd argue there are two types of "local" time that anyone using gitweb would be looking for (particularly if this is called local time) 1) Time Local to the observer: Specifically I don't care where every other commit has taken place, I want to know what time it was in my preferred time zone (local time zone likely) 2) Time local to the project: There will be instances where a project is based in a specific time zone (home office perhaps?) and you will want to see the commits from that perspective. The patch itself (as a commit in gitweb) shows the time + TZ (which is somewhat useful), but there is something quite useful about the rest of gitweb only handling a single timezone (GMT/UTC) from the backend (I'll come back to this point), if for no other reason it makes for uniform handling of time overall. > This improves usability if the majority of a project's contributors are > based in a single office, all within the same timezone. It also makes > the interface more friendly to non-developers who may need to track > updates, such as program managers and supervisors. I'd agree, having multiple different timezones, or trying to think in UTC/GMT when your not used to it is a pain, and is a valid use case of gitweb. > This change does not affect relative timestamps (e.g. "5 hours ago"), > nor does it affect 'patch' and 'patches' views which already use > localtime because they are generated by "git format-patch". Agreed. > > Affected views include: > * 'summary' view, "last change" field (commit time from latest change) > * 'log' view, author time > * 'commit' and 'commitdiff' views, author/committer time > * 'tag' view, tagger time > > In the case of 'commit', 'commitdiff' and 'tag' views, gitweb used to > print both GMT time and time in timezone of author/tagger/committer: > > Fri, 18 Mar 2011 01:28:57 +0000 (18:28 -0700) > > With localtime enabled, the times will be swapped: > > Thu, 17 Mar 2011 18:28:57 -0700 (01:28 +0000) > > Local times between 00:00 and 05:59, inclusive, will still be printed > in red ("atnight" style) in these views. Ok, while I agree with the use case(s) I think the solution is barking up completely the wrong tree. My basic complaint is that this is a change that effects the backend and ties the backend to a specific TZ, when this is a front facing / client issue. While I don't always like JavaScript, this is a situation where I think it would be a much better solution than doing some extensive changes to time handling in gitweb. Basically the change would leave things alone should this be disabled (you are already doing this, which is good), however should this be enabled a couple of minor things change: 1) By default gitweb will continue to display things in UTC. This is a good fallback, and a reasonably safe thing to do should someone have JavaScript disabled. The reality is most users with it disabled will know or understand what to do with UTC times 2) Keep the original TZ marked in the html, somewhere hidden on the page is fine 3) Once a page is loaded attempt to execute the Javascript, which will just cycle through the page and update the Date / Times based on a set of possible (though user choosable options): - Local Time (could easily default to this and JavaScript can detect that from the browser) - Specific Timezone - Default / UTC - Original Timezone (from author / commit) Could easily include the original timestamp / utc if Javascript modifies it. Easy enough to just automatically store the choice (should one be made) in a cookie in the browser, and give the maintainer of the site and easy way to set a rational default given their specific environment. The obvious advantages: - Doesn't give weird data to people behind caching proxies - Ability for people working diverse timezones to see things in their local time zone pretty trivially - If a site is using gitweb-caching they can take advantage of the feature - Won't break bots / scripts that may be crawling the pages or reading the rss feeds (because the timestamps will all be the same assuming it doesn't try to render the javascript) If you are interested I can bang that out tomorrow (shouldn't take long), but I would *MUCH* rather see this done via JavaScript than to muddy up the backend with multiple timezones and such. - John 'Warthog9' Hawley ^ permalink raw reply [flat|nested] 36+ messages in thread
* Re: [PATCH v4 2/2] gitweb: introduce localtime feature 2011-03-20 22:38 ` J.H. @ 2011-03-20 23:44 ` Kevin Cernekee 2011-03-21 0:20 ` Jakub Narebski 1 sibling, 0 replies; 36+ messages in thread From: Kevin Cernekee @ 2011-03-20 23:44 UTC (permalink / raw) To: J.H.; +Cc: Junio C Hamano, Jakub Narebski, git On Sun, Mar 20, 2011 at 3:38 PM, J.H. <warthog9@eaglescrag.net> wrote: > I'd argue there are two types of "local" time that anyone using gitweb > would be looking for (particularly if this is called local time) > > 1) Time Local to the observer: Specifically I don't care where every > other commit has taken place, I want to know what time it was in my > preferred time zone (local time zone likely) > > 2) Time local to the project: There will be instances where a project > is based in a specific time zone (home office perhaps?) and you will > want to see the commits from that perspective. That is probably true for distributed projects, but many software projects are handled entirely at one location so there is only one timezone of interest. My goal was to make it easy to support this case. I have no particular objection to implementing a more comprehensive solution, but my gut feeling is that it would be harder to push the changes upstream (and would have no direct benefit for my local gitweb installation). I also figured that if nobody had done this by now, the demand is weak and it maybe doesn't warrant a huge amount of effort. > - Local Time (could easily default to this and > JavaScript can detect that from the browser) In my case it would be best to have a way to default to the browser's local time. Would there be a way to set this default on the server side? My group has switched to Git, but most other groups in the company are using other SCM systems. I frequently send gitweb links to non-Git users, and want to make their experience as intuitive as possible. So, it would be best if the correct timezone was automatically selected. > - Won't break bots / scripts that may be crawling the pages or > reading the rss feeds (because the timestamps will all be the > same assuming it doesn't try to render the javascript) FWIW, my latest patches did not change the format of the RSS/Atom feeds. If we are worried about breaking bots that scrape the regular HTML pages, that ties our hands in a lot of other ways. > If you are interested I can bang that out tomorrow (shouldn't take > long), but I would *MUCH* rather see this done via JavaScript than to > muddy up the backend with multiple timezones and such. OK. I can help test/improve the implementation if you post a prototype. Thanks. ^ permalink raw reply [flat|nested] 36+ messages in thread
* Re: [PATCH v4 2/2] gitweb: introduce localtime feature 2011-03-20 22:38 ` J.H. 2011-03-20 23:44 ` Kevin Cernekee @ 2011-03-21 0:20 ` Jakub Narebski 2011-03-21 2:35 ` J.H. 1 sibling, 1 reply; 36+ messages in thread From: Jakub Narebski @ 2011-03-21 0:20 UTC (permalink / raw) To: J.H.; +Cc: Kevin Cernekee, Junio C Hamano, git On Sun, 20 Mar 2011, J.H. wrote: > > With this feature enabled, all timestamps are shown in the local > > timezone instead of GMT. The timezone is taken from the appropriate > > timezone string stored in the commit object. > > I'd argue there are two types of "local" time that anyone using gitweb > would be looking for (particularly if this is called local time) > > 1) Time Local to the observer: Specifically I don't care where every > other commit has taken place, I want to know what time it was in my > preferred time zone (local time zone likely) This can be done only via JavaScript, otherwise how would you get user's timezone? Well, you could specify timezone via a form, save it in a cookie and do conversion to timezone from cookie on server... but this means more code, and would screw up with output caching if/where implemented. > 2) Time local to the project: There will be instances where a project > is based in a specific time zone (home office perhaps?) and you will > want to see the commits from that perspective. Kevin's patch assumes that geographically concentrated project means all or almost all commits are generated "in office" and use the same timezone, which is a timezone of a project. Currently there is no way to specify _project_ timezone. Perhaps instead of 'localtime' feature, which since v2 means also per-project `gitweb.localtime' configuration variable, we would allow for `gitweb.timezone' configuration variable, which can be "gmt", "utc", or "localtime" (meaning local to author / committer / tagger). What do you think? > The patch itself (as a commit in gitweb) shows the time + TZ (which is > somewhat useful), but there is something quite useful about the rest of > gitweb only handling a single timezone (GMT/UTC) from the backend (I'll > come back to this point), if for no other reason it makes for uniform > handling of time overall. Single timezone (currently GMT/UTC, perhaps made configurable, perhaps made client local via JavaScript) is good to compare dates. Author local time is good to notice "atnight" commits. [...] > > This change does not affect relative timestamps (e.g. "5 hours ago"), > > nor does it affect 'patch' and 'patches' views which already use > > localtime because they are generated by "git format-patch". > > Agreed. [...] > Ok, while I agree with the use case(s) I think the solution is barking > up completely the wrong tree. My basic complaint is that this is a > change that effects the backend and ties the backend to a specific TZ, > when this is a front facing / client issue. > > While I don't always like JavaScript, this is a situation where I think > it would be a much better solution than doing some extensive changes to > time handling in gitweb. > > Basically the change would leave things alone should this be disabled > (you are already doing this, which is good), however should this be > enabled a couple of minor things change: > > 1) By default gitweb will continue to display things in UTC. > This is a good fallback, and a reasonably safe thing to do > should someone have JavaScript disabled. The reality is > most users with it disabled will know or understand what to > do with UTC times > > 2) Keep the original TZ marked in the html, somewhere hidden on > the page is fine We can use what microformats use for date, i.e. 1997-07-16T19:20:30+01:00 or 1997-07-16T19:20:30+0100, in 'date' or 'title' attribute (with appropriate microformat class)... or we can use raw git date, i.e. epoch plus numerical timezone. Note that JavaScript mangling of dates is quite independent on whether dates are displayed in GMT/UTC or in author / committer / tagger timezone like for current 'localtime' feature. > 3) Once a page is loaded attempt to execute the Javascript, > which will just cycle through the page and update the Date / > Times based on a set of possible (though user choosable > options): > - Local Time (could easily default to this and > JavaScript can detect that from the browser) > - Specific Timezone > - Default / UTC > - Original Timezone (from author / commit) Hmmm... we could also automatically update relative dates to reflect passing of time ;-) > Could easily include the original timestamp / utc if > Javascript modifies it. Easy enough to just automatically > store the choice (should one be made) in a cookie in the > browser, and give the maintainer of the site and easy way > to set a rational default given their specific environment. > > The obvious advantages: > - Doesn't give weird data to people behind caching proxies > - Ability for people working diverse timezones to see things > in their local time zone pretty trivially > - If a site is using gitweb-caching they can take advantage > of the feature > - Won't break bots / scripts that may be crawling the pages or > reading the rss feeds (because the timestamps will all be the > same assuming it doesn't try to render the javascript) > > If you are interested I can bang that out tomorrow (shouldn't take > long), but I would *MUCH* rather see this done via JavaScript than to > muddy up the backend with multiple timezones and such. Note that we would have to write this JavaScript code... -- Jakub Narebski Poland ^ permalink raw reply [flat|nested] 36+ messages in thread
* Re: [PATCH v4 2/2] gitweb: introduce localtime feature 2011-03-21 0:20 ` Jakub Narebski @ 2011-03-21 2:35 ` J.H. 2011-03-21 16:01 ` Jakub Narebski 0 siblings, 1 reply; 36+ messages in thread From: J.H. @ 2011-03-21 2:35 UTC (permalink / raw) To: Jakub Narebski; +Cc: Kevin Cernekee, Junio C Hamano, git On 03/20/2011 05:20 PM, Jakub Narebski wrote: > On Sun, 20 Mar 2011, J.H. wrote: > >>> With this feature enabled, all timestamps are shown in the local >>> timezone instead of GMT. The timezone is taken from the appropriate >>> timezone string stored in the commit object. >> >> I'd argue there are two types of "local" time that anyone using gitweb >> would be looking for (particularly if this is called local time) >> >> 1) Time Local to the observer: Specifically I don't care where every >> other commit has taken place, I want to know what time it was in my >> preferred time zone (local time zone likely) > > This can be done only via JavaScript, otherwise how would you get user's > timezone? Well, you could specify timezone via a form, save it in > a cookie and do conversion to timezone from cookie on server... but this > means more code, and would screw up with output caching if/where > implemented. I think this would screw up less caching vs. more caching w/ Javascript. Without doing this with Javascript having any hard coded timezone like what's proposed here is bad, particularly if for some reason two people can select different time zones for whatever reason (not an unreasonable extension of what's been proposed) >> 2) Time local to the project: There will be instances where a project >> is based in a specific time zone (home office perhaps?) and you will >> want to see the commits from that perspective. > > Kevin's patch assumes that geographically concentrated project means all > or almost all commits are generated "in office" and use the same timezone, > which is a timezone of a project. > > Currently there is no way to specify _project_ timezone. Perhaps instead > of 'localtime' feature, which since v2 means also per-project > `gitweb.localtime' configuration variable, we would allow for > `gitweb.timezone' configuration variable, which can be "gmt", "utc", or > "localtime" (meaning local to author / committer / tagger). > > What do you think? Not specifically thinking of setting a per-repo timezone, when I was thinking of "project" I was thinking of the entire gitweb install (I.E. git.kernel.org as a project or pkgs.fedoraproject.org or drupal.org as a project) I would think, if we are doing this in JavaScript, that this is an over complication to do on a per-repo basis. I would guess setting a generic default and letting people deviate makes more sense. Just my thought anyway, but I think there's a lot of extra per-repo configurations that add complexity with minimal gain. >> The patch itself (as a commit in gitweb) shows the time + TZ (which is >> somewhat useful), but there is something quite useful about the rest of >> gitweb only handling a single timezone (GMT/UTC) from the backend (I'll >> come back to this point), if for no other reason it makes for uniform >> handling of time overall. > > Single timezone (currently GMT/UTC, perhaps made configurable, perhaps > made client local via JavaScript) is good to compare dates. Author local > time is good to notice "atnight" commits. > > [...] >>> This change does not affect relative timestamps (e.g. "5 hours ago"), >>> nor does it affect 'patch' and 'patches' views which already use >>> localtime because they are generated by "git format-patch". >> >> Agreed. > > [...] >> Ok, while I agree with the use case(s) I think the solution is barking >> up completely the wrong tree. My basic complaint is that this is a >> change that effects the backend and ties the backend to a specific TZ, >> when this is a front facing / client issue. >> >> While I don't always like JavaScript, this is a situation where I think >> it would be a much better solution than doing some extensive changes to >> time handling in gitweb. >> >> Basically the change would leave things alone should this be disabled >> (you are already doing this, which is good), however should this be >> enabled a couple of minor things change: >> >> 1) By default gitweb will continue to display things in UTC. >> This is a good fallback, and a reasonably safe thing to do >> should someone have JavaScript disabled. The reality is >> most users with it disabled will know or understand what to >> do with UTC times >> >> 2) Keep the original TZ marked in the html, somewhere hidden on >> the page is fine > > We can use what microformats use for date, i.e. 1997-07-16T19:20:30+01:00 > or 1997-07-16T19:20:30+0100, in 'date' or 'title' attribute (with > appropriate microformat class)... or we can use raw git date, i.e. epoch > plus numerical timezone. Well we already have the time in the html, it's just the original TZ that would need to get added. Though it's still likely easier to store the timestamp + tz than use the microformats in the JS. > Note that JavaScript mangling of dates is quite independent on whether > dates are displayed in GMT/UTC or in author / committer / tagger timezone > like for current 'localtime' feature. I wasn't intending to change the current formatting of the times we have in place currently. Just allowing people to change what time was being displayed. >> 3) Once a page is loaded attempt to execute the Javascript, >> which will just cycle through the page and update the Date / >> Times based on a set of possible (though user choosable >> options): >> - Local Time (could easily default to this and >> JavaScript can detect that from the browser) >> - Specific Timezone >> - Default / UTC >> - Original Timezone (from author / commit) > > Hmmm... we could also automatically update relative dates to reflect > passing of time ;-) Yup, which could also go into changing the "22 minutes ago" kind of stuff in real time (beyond just dates). Bonus to cached pages. >> Could easily include the original timestamp / utc if >> Javascript modifies it. Easy enough to just automatically >> store the choice (should one be made) in a cookie in the >> browser, and give the maintainer of the site and easy way >> to set a rational default given their specific environment. >> >> The obvious advantages: >> - Doesn't give weird data to people behind caching proxies >> - Ability for people working diverse timezones to see things >> in their local time zone pretty trivially >> - If a site is using gitweb-caching they can take advantage >> of the feature >> - Won't break bots / scripts that may be crawling the pages or >> reading the rss feeds (because the timestamps will all be the >> same assuming it doesn't try to render the javascript) >> >> If you are interested I can bang that out tomorrow (shouldn't take >> long), but I would *MUCH* rather see this done via JavaScript than to >> muddy up the backend with multiple timezones and such. > > Note that we would have to write this JavaScript code... I'll mock something up tomorrow. - John 'Warthog9' Hawley ^ permalink raw reply [flat|nested] 36+ messages in thread
* Re: [PATCH v4 2/2] gitweb: introduce localtime feature 2011-03-21 2:35 ` J.H. @ 2011-03-21 16:01 ` Jakub Narebski 2011-03-21 18:39 ` Piotr Krukowiecki 2011-03-21 18:39 ` J.H. 0 siblings, 2 replies; 36+ messages in thread From: Jakub Narebski @ 2011-03-21 16:01 UTC (permalink / raw) To: J.H.; +Cc: Kevin Cernekee, Junio C Hamano, git On Mon, 21 Mar 2011 at 03:35, J.H. wrote: > On 03/20/2011 05:20 PM, Jakub Narebski wrote: >> On Sun, 20 Mar 2011, J.H. wrote: >> >>>> With this feature enabled, all timestamps are shown in the local >>>> timezone instead of GMT. The timezone is taken from the appropriate >>>> timezone string stored in the commit object. >>> >>> I'd argue there are two types of "local" time that anyone using gitweb >>> would be looking for (particularly if this is called local time) >>> >>> 1) Time Local to the observer: Specifically I don't care where every >>> other commit has taken place, I want to know what time it was in my >>> preferred time zone (local time zone likely) >> >> This can be done only via JavaScript, otherwise how would you get user's >> timezone? Well, you could specify timezone via a form, save it in >> a cookie and do conversion to timezone from cookie on server... but this >> means more code, and would screw up with output caching if/where >> implemented. > > I think this would screw up less caching vs. more caching w/ Javascript. > Without doing this with Javascript having any hard coded timezone like > what's proposed here is bad, particularly if for some reason two people > can select different time zones for whatever reason (not an unreasonable > extension of what's been proposed) First, it would complicate caching, as output would depend not only purely on URL, but can also depend on cookies. Cache key would have to take it into account. Second, it would reduce effectiveness of cache, as single page would have to have multiple versions (up to 24, one per timezone, I guess). >>> 2) Time local to the project: There will be instances where a project >>> is based in a specific time zone (home office perhaps?) and you will >>> want to see the commits from that perspective. >> >> Kevin's patch assumes that geographically concentrated project means all >> or almost all commits are generated "in office" and use the same timezone, >> which is a timezone of a project. >> >> Currently there is no way to specify _project_ timezone. Perhaps instead >> of 'localtime' feature, which since v2 means also per-project >> `gitweb.localtime' configuration variable, we would allow for >> `gitweb.timezone' configuration variable, which can be "gmt", "utc", or >> "localtime" (meaning local to author / committer / tagger). >> >> What do you think? > > Not specifically thinking of setting a per-repo timezone, when I was > thinking of "project" I was thinking of the entire gitweb install (I.E. > git.kernel.org as a project or pkgs.fedoraproject.org or drupal.org as a > project) Well, if we are doing it on server side, then by having 'timezone' feature rather than 'localtime' one from Kevin patches, we would have per-repo configuration "for free". > I would think, if we are doing this in JavaScript, that this is an over > complication to do on a per-repo basis. I would guess setting a generic > default and letting people deviate makes more sense. Just my thought > anyway, but I think there's a lot of extra per-repo configurations that > add complexity with minimal gain. It it is set _by client_, then of course it doesn't make much sense to make it configurable per-repository. Besides it would be difficult to implement and store in JavaScript, I think. Per-repository settings makes sense for _server-side_; different repositories may have different character: some might be geographically distributed, some might have all contributors in single timezone. [...] >>> Basically the change would leave things alone should this be disabled >>> (you are already doing this, which is good), however should this be >>> enabled a couple of minor things change: >>> >>> 1) By default gitweb will continue to display things in UTC. >>> This is a good fallback, and a reasonably safe thing to do >>> should someone have JavaScript disabled. The reality is >>> most users with it disabled will know or understand what to >>> do with UTC times >>> >>> 2) Keep the original TZ marked in the html, somewhere hidden on >>> the page is fine >> >> We can use what microformats use for date, i.e. 1997-07-16T19:20:30+01:00 >> or 1997-07-16T19:20:30+0100, in 'date' or 'title' attribute (with >> appropriate microformat class)... or we can use raw git date, i.e. epoch >> plus numerical timezone. > > Well we already have the time in the html, it's just the original TZ > that would need to get added. Though it's still likely easier to store > the timestamp + tz than use the microformats in the JS. I agree that epoch + timezone should be easier to manipulate in JavaScript than ISO-8601 or similar format... I think. Note that at least with epoch timezone is necessary only if you want to display date in author etc. zone; if you want to use client (web browser) timezone, it is not necessary. Note that _where and how_ timestamp is stored for JavaScript manipulation would become gitweb API as much as its links are. I wonder if HTML5 says anything on attribute values used for machine-readable data; microformats site says that using "title" for non human-readable stuff is deprecated for accessibility reasons. >> Note that JavaScript mangling of dates is quite independent on whether >> dates are displayed in GMT/UTC or in author / committer / tagger timezone >> like for current 'localtime' feature. > > I wasn't intending to change the current formatting of the times we have > in place currently. Just allowing people to change what time was being > displayed. I wanted to say that JavaScript post-processing of dates is a bit orthogonal to David's server-side localtime (or similar) feature. >>> 3) Once a page is loaded attempt to execute the Javascript, >>> which will just cycle through the page and update the Date / >>> Times based on a set of possible (though user choosable >>> options): >>> - Local Time (could easily default to this and >>> JavaScript can detect that from the browser) >>> - Specific Timezone >>> - Default / UTC >>> - Original Timezone (from author / commit) >> >> Hmmm... we could also automatically update relative dates to reflect >> passing of time ;-) > > Yup, which could also go into changing the "22 minutes ago" kind of > stuff in real time (beyond just dates). Bonus to cached pages. ...though this should probably made it into separate commit. -- Jakub Narebski Poland ^ permalink raw reply [flat|nested] 36+ messages in thread
* Re: [PATCH v4 2/2] gitweb: introduce localtime feature 2011-03-21 16:01 ` Jakub Narebski @ 2011-03-21 18:39 ` Piotr Krukowiecki 2011-03-21 18:39 ` J.H. 1 sibling, 0 replies; 36+ messages in thread From: Piotr Krukowiecki @ 2011-03-21 18:39 UTC (permalink / raw) To: Jakub Narebski; +Cc: J.H., Kevin Cernekee, Junio C Hamano, git On Mon, Mar 21, 2011 at 5:01 PM, Jakub Narebski <jnareb@gmail.com> wrote: > On Mon, 21 Mar 2011 at 03:35, J.H. wrote: >> On 03/20/2011 05:20 PM, Jakub Narebski wrote: >>> On Sun, 20 Mar 2011, J.H. wrote: >>> >>>>> With this feature enabled, all timestamps are shown in the local >>>>> timezone instead of GMT. The timezone is taken from the appropriate >>>>> timezone string stored in the commit object. >>>> >>>> I'd argue there are two types of "local" time that anyone using gitweb >>>> would be looking for (particularly if this is called local time) >>>> >>>> 1) Time Local to the observer: Specifically I don't care where every >>>> other commit has taken place, I want to know what time it was in my >>>> preferred time zone (local time zone likely) >>> >>> This can be done only via JavaScript, otherwise how would you get user's >>> timezone? Well, you could specify timezone via a form, save it in >>> a cookie and do conversion to timezone from cookie on server... but this >>> means more code, and would screw up with output caching if/where >>> implemented. >> >> I think this would screw up less caching vs. more caching w/ Javascript. >> Without doing this with Javascript having any hard coded timezone like >> what's proposed here is bad, particularly if for some reason two people >> can select different time zones for whatever reason (not an unreasonable >> extension of what's been proposed) > > First, it would complicate caching, as output would depend not only purely > on URL, but can also depend on cookies. Cache key would have to take it > into account. > > Second, it would reduce effectiveness of cache, as single page would have > to have multiple versions (up to 24, one per timezone, I guess). It would reduce the effectiveness only if it's really needed. If everyone works from one timezone, the cache have only one version. Only if there are users from multiple timezones, which means the feature is really required, the cache would have multiple versions. In my case we have main office in one place, but we get commits from several other timezones. So although the "one timezone for project" would benefit most people, some might still not be very happy. -- Piotr Krukowiecki ^ permalink raw reply [flat|nested] 36+ messages in thread
* Re: [PATCH v4 2/2] gitweb: introduce localtime feature 2011-03-21 16:01 ` Jakub Narebski 2011-03-21 18:39 ` Piotr Krukowiecki @ 2011-03-21 18:39 ` J.H. 2011-03-21 22:20 ` Jakub Narebski 1 sibling, 1 reply; 36+ messages in thread From: J.H. @ 2011-03-21 18:39 UTC (permalink / raw) To: Jakub Narebski; +Cc: Kevin Cernekee, Junio C Hamano, git On 03/21/2011 09:01 AM, Jakub Narebski wrote: > On Mon, 21 Mar 2011 at 03:35, J.H. wrote: >> On 03/20/2011 05:20 PM, Jakub Narebski wrote: >>> On Sun, 20 Mar 2011, J.H. wrote: >>> >>>>> With this feature enabled, all timestamps are shown in the local >>>>> timezone instead of GMT. The timezone is taken from the appropriate >>>>> timezone string stored in the commit object. >>>> >>>> I'd argue there are two types of "local" time that anyone using gitweb >>>> would be looking for (particularly if this is called local time) >>>> >>>> 1) Time Local to the observer: Specifically I don't care where every >>>> other commit has taken place, I want to know what time it was in my >>>> preferred time zone (local time zone likely) >>> >>> This can be done only via JavaScript, otherwise how would you get user's >>> timezone? Well, you could specify timezone via a form, save it in >>> a cookie and do conversion to timezone from cookie on server... but this >>> means more code, and would screw up with output caching if/where >>> implemented. >> >> I think this would screw up less caching vs. more caching w/ Javascript. >> Without doing this with Javascript having any hard coded timezone like >> what's proposed here is bad, particularly if for some reason two people >> can select different time zones for whatever reason (not an unreasonable >> extension of what's been proposed) > > First, it would complicate caching, as output would depend not only purely > on URL, but can also depend on cookies. Cache key would have to take it > into account. > > Second, it would reduce effectiveness of cache, as single page would have > to have multiple versions (up to 24, one per timezone, I guess). The implementation I have running in the back of my head would be completely independent, so I'm not sure what implementation you are thinking of that would cause this. One of the reasons I'm suggesting Javascript at all is to avoid exactly this problem. >>>> 2) Time local to the project: There will be instances where a project >>>> is based in a specific time zone (home office perhaps?) and you will >>>> want to see the commits from that perspective. >>> >>> Kevin's patch assumes that geographically concentrated project means all >>> or almost all commits are generated "in office" and use the same timezone, >>> which is a timezone of a project. >>> >>> Currently there is no way to specify _project_ timezone. Perhaps instead >>> of 'localtime' feature, which since v2 means also per-project >>> `gitweb.localtime' configuration variable, we would allow for >>> `gitweb.timezone' configuration variable, which can be "gmt", "utc", or >>> "localtime" (meaning local to author / committer / tagger). >>> >>> What do you think? >> >> Not specifically thinking of setting a per-repo timezone, when I was >> thinking of "project" I was thinking of the entire gitweb install (I.E. >> git.kernel.org as a project or pkgs.fedoraproject.org or drupal.org as a >> project) > > Well, if we are doing it on server side, then by having 'timezone' feature > rather than 'localtime' one from Kevin patches, we would have per-repo > configuration "for free". Doing it on the server overly complicates things, breaks web caches, gitweb-caching and generally I'd argue is not what we want. It would work for small installations, in particular those not using gitweb-caching, but honestly this is a useful enough feature for a more distributed audience it needs to work with gitweb-caching, without putting undue burden on the caching engine (as a whole). Javascript is the obvious, and simple answer to that. Won't add any substantial complexity to the backend, and will allow for more complex choices and instant changes (without involving the backend at all). That pretty much sounds like a win to me anyway... >> I would think, if we are doing this in JavaScript, that this is an over >> complication to do on a per-repo basis. I would guess setting a generic >> default and letting people deviate makes more sense. Just my thought >> anyway, but I think there's a lot of extra per-repo configurations that >> add complexity with minimal gain. > > It it is set _by client_, then of course it doesn't make much sense to > make it configurable per-repository. Besides it would be difficult to > implement and store in JavaScript, I think. Cookies solve the problem, and those are basically trivial to deal with in Javascript. > Per-repository settings makes sense for _server-side_; different > repositories may have different character: some might be geographically > distributed, some might have all contributors in single timezone. Agreed, since I've been arguing for the client side work, I think we are on the same page here. > [...] >>>> Basically the change would leave things alone should this be disabled >>>> (you are already doing this, which is good), however should this be >>>> enabled a couple of minor things change: >>>> >>>> 1) By default gitweb will continue to display things in UTC. >>>> This is a good fallback, and a reasonably safe thing to do >>>> should someone have JavaScript disabled. The reality is >>>> most users with it disabled will know or understand what to >>>> do with UTC times >>>> >>>> 2) Keep the original TZ marked in the html, somewhere hidden on >>>> the page is fine >>> >>> We can use what microformats use for date, i.e. 1997-07-16T19:20:30+01:00 >>> or 1997-07-16T19:20:30+0100, in 'date' or 'title' attribute (with >>> appropriate microformat class)... or we can use raw git date, i.e. epoch >>> plus numerical timezone. >> >> Well we already have the time in the html, it's just the original TZ >> that would need to get added. Though it's still likely easier to store >> the timestamp + tz than use the microformats in the JS. > > I agree that epoch + timezone should be easier to manipulate in JavaScript > than ISO-8601 or similar format... I think. Note that at least with epoch > timezone is necessary only if you want to display date in author etc. zone; > if you want to use client (web browser) timezone, it is not necessary. > > Note that _where and how_ timestamp is stored for JavaScript manipulation > would become gitweb API as much as its links are. I wonder if HTML5 says > anything on attribute values used for machine-readable data; microformats > site says that using "title" for non human-readable stuff is deprecated > for accessibility reasons. I wouldn't entirely agree with that. While I'd say sticking the hidden data into a commonly accepted and suggested place would be ideal, looking back over the wonderful world of Javascript indicates it's a giant messy jungle as ever. Since what I'm also thinking will be just about completely independent of the backend, I wouldn't call what I'm doing / suggesting here an API, and in particular one I would not declare as externally usable - I.E. if we have to change this to be more compliant in a year or two (particularly once microformats are more generally agreed upon) I don't think it would break anyone or anything. That said from what I can find of microformats (today) the most widely agreed upon date formatting is either to use a full hCalendar (this would be completely unweildly and if that's the "right" way to do it, I would suggest we ignore it), or to use a date time element, of which there are no specific ones for commit / applied / etc (I see no reason why we can't just start using them to define the standard fundamentally) <span class="dtcommit" title="YYYY-MM-DDTHH:MM:SSZ"></span> or <span class="dtcommit"> <abbr class="value" title="2011-03-11">March 21st, 2011</abbr> <span class="value"> 18:30 </span> </span> But to be clear all that is currently accpeted (as far as I can tell) for microformats with respect to this are dtstart (to specify the start of an event, more specifically like I'm having a party at dtstart) and dtend - when the event ends. There, as far as I can tell, isn't the idea of a single point microformat which would be more useful to us, and doing the start/end properly would bloat the page a lot (for index pages it would be substantial) Also keeping in mind that miroformats are almost explicitly for the benefit of search engines, which I'm not sure if a majority of gitweb installations care about, it may not be worthwhile to actually go down that road. >>> Note that JavaScript mangling of dates is quite independent on whether >>> dates are displayed in GMT/UTC or in author / committer / tagger timezone >>> like for current 'localtime' feature. >> >> I wasn't intending to change the current formatting of the times we have >> in place currently. Just allowing people to change what time was being >> displayed. > > I wanted to say that JavaScript post-processing of dates is a bit > orthogonal to David's server-side localtime (or similar) feature. It's a different direction, yes, but it's definitely not orthogonal. If you do this on the server side, as David originally suggested, you can create a mess in other places (external proxies, external web caches, gitweb-caching, etc). I like his idea, just not where it's implemented at current. If you leave the server side alone, and deal with the processing of the dates on the client side you alleviate all of the server side gotchas, while only introducing one or two gotchas to the client side. This isn't an orthogonal discussion, it's a discussion of where the right place / right solution to accomplish the same goal is. >>>> 3) Once a page is loaded attempt to execute the Javascript, >>>> which will just cycle through the page and update the Date / >>>> Times based on a set of possible (though user choosable >>>> options): >>>> - Local Time (could easily default to this and >>>> JavaScript can detect that from the browser) >>>> - Specific Timezone >>>> - Default / UTC >>>> - Original Timezone (from author / commit) >>> >>> Hmmm... we could also automatically update relative dates to reflect >>> passing of time ;-) >> >> Yup, which could also go into changing the "22 minutes ago" kind of >> stuff in real time (beyond just dates). Bonus to cached pages. > > ...though this should probably made it into separate commit. I'd agree. - John 'Warthog9' Hawley ^ permalink raw reply [flat|nested] 36+ messages in thread
* Re: [PATCH v4 2/2] gitweb: introduce localtime feature 2011-03-21 18:39 ` J.H. @ 2011-03-21 22:20 ` Jakub Narebski 0 siblings, 0 replies; 36+ messages in thread From: Jakub Narebski @ 2011-03-21 22:20 UTC (permalink / raw) To: J.H.; +Cc: Kevin Cernekee, Junio C Hamano, git J.H. wrote: > On 03/21/2011 09:01 AM, Jakub Narebski wrote: > > First, it would complicate caching, as output would depend not only purely > > on URL, but can also depend on cookies. Cache key would have to take it > > into account. > > > > Second, it would reduce effectiveness of cache, as single page would have > > to have multiple versions (up to 24, one per timezone, I guess). > > The implementation I have running in the back of my head would be > completely independent, so I'm not sure what implementation you are > thinking of that would cause this. One of the reasons I'm suggesting > Javascript at all is to avoid exactly this problem. Well, of course if output is the same, only post-processed by JavaScript (and no server-side fallback), then there is no interference between timezones and output caching. N.B. caching of git output, or of parsed data, allows to generate multiple outputs from one cached value... but OTOH output caching is simpler. [...] > > Well, if we are doing it on server side, then by having 'timezone' feature > > rather than 'localtime' one from Kevin patches, we would have per-repo > > configuration "for free". > > Doing it on the server overly complicates things, breaks web caches, > gitweb-caching and generally I'd argue is not what we want. It would > work for small installations, in particular those not using > gitweb-caching, but honestly this is a useful enough feature for a more > distributed audience it needs to work with gitweb-caching, without > putting undue burden on the caching engine (as a whole). Javascript is > the obvious, and simple answer to that. Won't add any substantial > complexity to the backend, and will allow for more complex choices and > instant changes (without involving the backend at all). > > That pretty much sounds like a win to me anyway... Note that proposed "on server" solution, like the one in Kevin's patches, would not include a way to select a way of presenting dates by client: it all would be set on server, and not interfere with output caching. As to complexity: you would either have complexity in backend, or complexity in JavaScript... But I agree that JavaScript enhancement solution is better. > > > I would think, if we are doing this in JavaScript, that this is an over > > > complication to do on a per-repo basis. I would guess setting a generic > > > default and letting people deviate makes more sense. Just my thought > > > anyway, but I think there's a lot of extra per-repo configurations that > > > add complexity with minimal gain. > > > > It it is set _by client_, then of course it doesn't make much sense to > > make it configurable per-repository. Besides it would be difficult to > > implement and store in JavaScript, I think. > > Cookies solve the problem, and those are basically trivial to deal with > in Javascript. I was talking about difficulty of _per-repo_ configuration with _client-side_ scripting. For each [visited] repository we would have to store config: too much for a cookie (well, perhaps localStorage... ;-)). > > Per-repository settings makes sense for _server-side_; different > > repositories may have different character: some might be geographically > > distributed, some might have all contributors in single timezone. > > Agreed, since I've been arguing for the client side work, I think we are > on the same page here. [...] > Also keeping in mind that miroformats are almost explicitly for the > benefit of search engines, which I'm not sure if a majority of gitweb > installations care about, it may not be worthwhile to actually go down > that road. Right. > > > > Note that JavaScript mangling of dates is quite independent on whether > > > > dates are displayed in GMT/UTC or in author / committer / tagger timezone > > > > like for current 'localtime' feature. > > > > > > I wasn't intending to change the current formatting of the times we have > > > in place currently. Just allowing people to change what time was being > > > displayed. > > > > I wanted to say that JavaScript post-processing of dates is a bit > > orthogonal to David's server-side localtime (or similar) feature. > > It's a different direction, yes, but it's definitely not orthogonal. If > you do this on the server side, as David originally suggested, you can > create a mess in other places (external proxies, external web caches, > gitweb-caching, etc). I like his idea, just not where it's implemented > at current. If you leave the server side alone, and deal with the > processing of the dates on the client side you alleviate all of the > server side gotchas, while only introducing one or two gotchas to the > client side. > > This isn't an orthogonal discussion, it's a discussion of where the > right place / right solution to accomplish the same goal is. Well, perhaps it is not orthogonal discussion, but you can those two _slightly different_ solutions: * server-side, per-repository config, no client choice * client-side, JavaScript enhancements, global per-client choice, client choice stored in cookie might work together... though it probably doesn't make much sense. -- Jakub Narebski Poland ^ permalink raw reply [flat|nested] 36+ messages in thread
* [PATCH 0/1] Gitweb: Change timezone 2011-03-19 5:39 ` [PATCH v4 2/2] gitweb: introduce localtime feature Kevin Cernekee ` (2 preceding siblings ...) 2011-03-20 22:38 ` J.H. @ 2011-03-24 0:08 ` John 'Warthog9' Hawley 2011-03-24 0:08 ` [PATCH 1/1] gitweb: javascript ability to adjust time based on timezone John 'Warthog9' Hawley 4 siblings, 0 replies; 36+ messages in thread From: John 'Warthog9' Hawley @ 2011-03-24 0:08 UTC (permalink / raw) To: git; +Cc: jnareb, cernekee, gitster, John 'Warthog9' Hawley This is just a javascript implementation of Kevin's localtime feature. It's pretty straight forward, though date handling in Javascript is, special (head bangingly so). This should be good to run on any browser, with the safe fallback of UTC being the default output should Javascript not work / be available. John 'Warthog9' Hawley (1): gitweb: javascript ability to adjust time based on timezone gitweb/gitweb.perl | 64 +++++++++++++++- gitweb/static/js/common-defs.js | 12 +++ gitweb/static/js/common-lib.js | 32 ++++++++ gitweb/static/js/cookies.js | 35 +++++++++ gitweb/static/js/date.js | 160 +++++++++++++++++++++++++++++++++++++++ 5 files changed, 300 insertions(+), 3 deletions(-) create mode 100644 gitweb/static/js/common-defs.js create mode 100644 gitweb/static/js/common-lib.js create mode 100644 gitweb/static/js/cookies.js create mode 100644 gitweb/static/js/date.js -- 1.7.2.3 ^ permalink raw reply [flat|nested] 36+ messages in thread
* [PATCH 1/1] gitweb: javascript ability to adjust time based on timezone 2011-03-19 5:39 ` [PATCH v4 2/2] gitweb: introduce localtime feature Kevin Cernekee ` (3 preceding siblings ...) 2011-03-24 0:08 ` [PATCH 0/1] Gitweb: Change timezone John 'Warthog9' Hawley @ 2011-03-24 0:08 ` John 'Warthog9' Hawley 2011-03-24 5:23 ` Kevin Cernekee 2011-03-24 15:17 ` Jakub Narebski 4 siblings, 2 replies; 36+ messages in thread From: John 'Warthog9' Hawley @ 2011-03-24 0:08 UTC (permalink / raw) To: git; +Cc: jnareb, cernekee, gitster, John 'Warthog9' Hawley This patch is based on Kevin Cernekee's <cernekee@gmail.com> patch series entitled "gitweb: introduce localtime feature". While Kevin's patch changed the server side output so that the timezone was output from gitweb itself, this has a number of drawbacks, in particular with respect to gitweb-caching. This patch takes the same basic goal, display the appropriate times in a given timezone, and implements it in Javascript. This requires adding / using a new class, dtcommit, which is based on the dtstart/dtend microformats. Appropriate commit dates are wrapped in a span with this class, and a title of the time in ISO8601 format. enabling this will then add several javascript files to be loaded, a default timezone to be selected and a single onloadTZSetup() function to be called. This will place a "+" to the right of an appropriate time and clicking on it will give you a drop down to choose the timezone to change to. All changes are saved to a Javascript cookie, so page changes and browser closure / reopening retains the last known setting used. Fallback (should Javascript not be enabled) is to treat dates as they have been and display them, only, in UTC. Valid timezones, currently, are: utc local -1200 -1100 ... +1100 +1200 With each timezone being +1hr to the previous. The code is capable of handling fractional timezones, but those have not been added. Pages Affected: * 'summary' view, "last change" field (commit time from latest change) * 'log' view, author time * 'commit' and 'commitdiff' views, author/committer time Based-on-code-from: Kevin Cernekee <cernekee@gmail.com> Signed-off-by: John 'Warthog9' Hawley <warthog9@eaglescrag.net> --- gitweb/gitweb.perl | 64 +++++++++++++++- gitweb/static/js/common-defs.js | 12 +++ gitweb/static/js/common-lib.js | 32 ++++++++ gitweb/static/js/cookies.js | 35 +++++++++ gitweb/static/js/date.js | 160 +++++++++++++++++++++++++++++++++++++++ 5 files changed, 300 insertions(+), 3 deletions(-) create mode 100644 gitweb/static/js/common-defs.js create mode 100644 gitweb/static/js/common-lib.js create mode 100644 gitweb/static/js/cookies.js create mode 100644 gitweb/static/js/date.js diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl index 9dccfb0..2a662d8 100755 --- a/gitweb/gitweb.perl +++ b/gitweb/gitweb.perl @@ -261,6 +261,49 @@ our %highlight_ext = ( map { $_ => 'xml' } qw(xhtml html htm), ); + +# Enable / Disable the ability for gitweb to use a small amount of +# javascript, along with a javascript cookie, to display commit +# times in the preffered timezone. Time zones can be pre-set +# by specifying it in $jslocaltime with one of the following: +# +# utc +# local +# -1200 +# -1100 +# -1000 +# -0900 +# -0800 +# -0700 +# -0600 +# -0500 +# -0400 +# -0300 +# -0200 +# -0100 +# +0000 +# +0100 +# +0200 +# +0300 +# +0400 +# +0500 +# +0600 +# +0700 +# +0800 +# +0900 +# +1000 +# +1100 +# +1200 +# +# utc is identical to +0000, and local will use the +# timezone that the browser thinks it is in. +# +# Enabled by default. +# +# To disable set to null or '' + +our $jslocaltime = 'local'; + # You define site-wide feature defaults here; override them with # $GITWEB_CONFIG as necessary. our %feature = ( @@ -504,6 +547,7 @@ our %feature = ( 'sub' => sub { feature_bool('remote_heads', @_) }, 'override' => 0, 'default' => [0]}, + ); sub gitweb_get_feature { @@ -3728,6 +3772,19 @@ sub git_footer_html { qq!</script>\n!; } + print "<!-- jslocaltime: $jslocaltime -->"; + if( $jslocaltime ne '' ){ + my $js_path = File::Basename::dirname($javascript); + print qq!<script type="text/javascript" src="!. esc_url( $js_path ."/js/common-defs.js" ) .qq!"></script>\n!; + print qq!<script type="text/javascript" src="!. esc_url( $js_path ."/js/common-lib.js" ) .qq!"></script>\n!; + print qq!<script type="text/javascript" src="!. esc_url( $js_path ."/js/date.js" ) .qq!"></script>\n!; + print qq!<script type="text/javascript" src="!. esc_url( $js_path ."/js/cookies.js" ) .qq!"></script>\n!; + print "<script type=\"text/javascript\">\n". + "var tzDefault = \"$jslocaltime\";\n". + "onloadTZSetup();\n". + "</script>"; + } + print "</body>\n" . "</html>"; } @@ -3956,7 +4013,7 @@ sub git_print_authorship { my %ad = parse_date($co->{'author_epoch'}, $co->{'author_tz'}); print "<$tag class=\"author_date\">" . format_search_author($author, "author", esc_html($author)) . - " [$ad{'rfc2822'}"; + " [<span class=\"dtcommit\" title=\"$ad{'iso-8601'}\">$ad{'rfc2822'}</span>"; print_local_time(%ad) if ($opts{-localtime}); print "]" . git_get_avatar($co->{'author_email'}, -pad_before => 1) . "</$tag>\n"; @@ -3983,7 +4040,7 @@ sub git_print_authorship_rows { git_get_avatar($co->{"${who}_email"}, -size => 'double') . "</td></tr>\n" . "<tr>" . - "<td></td><td> $wd{'rfc2822'}"; + "<td></td><td> <span class=\"dtcommit\" title=\"$wd{'iso-8601'}\">$wd{'rfc2822'}</span>"; print_local_time(%wd); print "</td>" . "</tr>\n"; @@ -5395,7 +5452,8 @@ sub git_summary { "<tr id=\"metadata_desc\"><td>description</td><td>" . esc_html($descr) . "</td></tr>\n" . "<tr id=\"metadata_owner\"><td>owner</td><td>" . esc_html($owner) . "</td></tr>\n"; if (defined $cd{'rfc2822'}) { - print "<tr id=\"metadata_lchange\"><td>last change</td><td>$cd{'rfc2822'}</td></tr>\n"; + print "<tr id=\"metadata_lchange\"><td>last change</td>\n"; + print "<td><span class=\"dtcommit\" title=\"$cd{'iso-8601'}\">$cd{'rfc2822'}</span></td></tr>\n"; } # use per project git URL list in $projectroot/$project/cloneurl diff --git a/gitweb/static/js/common-defs.js b/gitweb/static/js/common-defs.js new file mode 100644 index 0000000..23a1cc2 --- /dev/null +++ b/gitweb/static/js/common-defs.js @@ -0,0 +1,12 @@ +// Copyright (C) 2011, John 'Warthog9' Hawley <warthog9@eaglescrag.net> +// +// +// JavaScript common globals for gitweb (git web interface). +// @license GPLv2 or later +// + +// Common universal values get set here +// Things like cookie names, and other just +// basic global variables. + +getwebCookieTZOffset = "tzOffset"; diff --git a/gitweb/static/js/common-lib.js b/gitweb/static/js/common-lib.js new file mode 100644 index 0000000..2ce65ec --- /dev/null +++ b/gitweb/static/js/common-lib.js @@ -0,0 +1,32 @@ +// Copyright (C) 2011, John 'Warthog9' Hawley <warthog9@eaglescrag.net> +// +// +// JavaScript date handling code for gitweb (git web interface). +// @license GPLv2 or later +// +// +function findElementsByClassName( className ) { + if( document.getElementsByClassName == undefined) { + var hasClassName = new RegExp("(?:^|\\s)" + className + "(?:$|\\s)"); + var allElements = document.getElementsByTagName("*"); + var foundElements = []; + + var element = null; + for (var x = 0; (element = allElements[x]) != null; x++) { + var curClass = element.className; + if( + curClass // If we've actually got something + && + curClass.indexOf(className) != -1 // And it has a valid index, I.E. not -1 + && + hasClassName.test(curClass) // and the regex passes + ) { + foundElements.push(element); // push it onto the results stack + } + } + + return foundElements; + }else{ + return document.getElementsByClassName( className ); + } +} diff --git a/gitweb/static/js/cookies.js b/gitweb/static/js/cookies.js new file mode 100644 index 0000000..8c8f7aa --- /dev/null +++ b/gitweb/static/js/cookies.js @@ -0,0 +1,35 @@ +// Copyright (C) 2011, John 'Warthog9' Hawley <warthog9@eaglescrag.net> +// +// +// JavaScript cookie handling code for gitweb (git web interface). +// @license GPLv2 or later +// + +function setCookieExp( name, value, expires ){ + var expDate = new Date( expires.toString() ); + expires = expDate.toUTCString; + document.cookie = escape(name) +"="+ escape(value) +";"+ expDate.toUTCString() +";path=/"; +} + +function setCookie( name, value ){ + var txtCookie = name +"=\""+ value +"\";path=/"; + document.cookie = txtCookie; +} + +function getCookie( name ){ + var allCookies = document.cookie.split(";"); + var value = ""; + + for( var x = 0; x < allCookies.length; x++ ){ + var brokenCookie = allCookies[x].split("=",2); + var hasName = new RegExp("^\\s*" + name + "\\s*$"); + if( + hasName.test(brokenCookie[0]) // Check for the name of the cookie based on the regex + && + brokenCookie.length == 2 // Just making sure there is something to actually return here + ){ + return unescape(brokenCookie[1]); + } + } + return null; +} diff --git a/gitweb/static/js/date.js b/gitweb/static/js/date.js new file mode 100644 index 0000000..a6d6f81 --- /dev/null +++ b/gitweb/static/js/date.js @@ -0,0 +1,160 @@ +// Copyright (C) 2011, John 'Warthog9' Hawley <warthog9@eaglescrag.net> +// +// +// JavaScript date handling code for gitweb (git web interface). +// @license GPLv2 or later +// + +function onloadTZSetup(){ + addChangeTZ(); + tzChangeNS( tzDefault ); + checkTZCookie(); +} + +function addChangeTZ() { + var txtClassesFound = ""; + var classesFound = findElementsByClassName( "dtcommit" ); + txtClassesFound += "Length: "+ classesFound.length +"<br>\n"; + for ( x = 0; x < classesFound.length; x++){ + curElement = classesFound[x]; + txtClassesFound += "<br>\n"+ x +" - "+ curElement.nodeName +" - "+ curElement.title +" - "+ curElement.innerHTML +"<br>\n"; + var strExtra = " <span onclick=\"clickDate(event.target);\" title=\"+\">+</span>" + curElement.innerHTML = curElement.innerHTML + strExtra; + } +} + +function checkTZCookie(){ + var preSetTZ = getCookie( getwebCookieTZOffset ); + if( + preSetTZ != null + && + preSetTZ.length != 0 + ){ + tzChange( preSetTZ ); + } +} + +function formatTZ( tzOffset ) { + var posNeg = "+"; + if( tzOffset < 0 ){ + posNeg = "-"; + } + tzOffset = Math.sqrt( Math.pow( tzOffset, 2 ) ); + if( tzOffset < 100 ){ + tzOffset = tzOffset * 100; + } + for( y = tzOffset.toString().length + 1; y <= 4; y++ ){ + tzOffset = "0"+ tzOffset; + } + return posNeg + tzOffset; +} + +function dateOutput( objDate ) { + return dateOutputTZ( objDate, "0" ); +} + +function dateOutputTZ( objDate, tzOffset ) { + var strDate = ""; + var daysOfWeek = [ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ]; + var monthsOfYr = [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ]; + + if( tzOffset == "utc" ){ + tzOffset = 0; + }else if( tzOffset == "local" ){ + var tempDate = new Date(); + tzOffset = tempDate.getTimezoneOffset() * -1 / 60 * 100; + tzOffset = formatTZ( tzOffset ); + } + + var msPerHr = 1000 * 60 * 60; // 1000ms/sec * 60sec/min * 60sec/hr + var toDateTime = new Date(); + toDateTime.setTime( objDate.getTime() + ( tzOffset / 100 * msPerHr ) ); + + // Current Date Formatting: + // Fri, 19 Dec 2008 11:35:33 +0000 + strDate += daysOfWeek[ toDateTime.getUTCDay() ] +", "; + strDate += toDateTime.getUTCDate() +" "; + strDate += monthsOfYr[ toDateTime.getUTCMonth() ] +" "; + strDate += toDateTime.getUTCFullYear() +" "; + strDate += toDateTime.getUTCHours() +":"; + strDate += toDateTime.getUTCMinutes() +":"; + strDate += toDateTime.getUTCSeconds() +" "; + + strDate += tzOffset; + + return strDate; +} + +function tzChange( tzOffset ){ + return tzChangeSNS( tzOffset, true ); +} + +function tzChangeNS( tzOffset ){ + return tzChangeSNS( tzOffset, false ); +} + +function tzChangeSNS( tzOffset, set ){ + var txtClassesFound = ""; + var classesFound = findElementsByClassName( "dtcommit" ); + for ( x = 0; x < classesFound.length; x++){ + curElement = classesFound[x]; + var origDateTime = new Date( curElement.title ); + curElement.innerHTML = dateOutputTZ(origDateTime, tzOffset); + } + var tzExpDate = new Date(); + tzExpDate.setDate( tzExpDate.getDate() + 180 ); + if( set == true ){ + setCookieExp( getwebCookieTZOffset, tzOffset, tzExpDate.toUTCString() ); + } + addChangeTZ(); +} + +function clickDate( clkEvent ) { + if( clkEvent.title == "+" ){ + clkEvent.title="-"; + + var preSetTZ = getCookie( getwebCookieTZOffset ); + + var arrSelected = new Array(); + var offsetArr = 14; + arrSelected[0] = " "; + arrSelected[1] = " "; + if( preSetTZ == "utc" ) { + arrSelected[0] = " selected=\"selected\" "; + } else if( preSetTZ == "local" ){ + arrSelected[1] = " selected=\"selected\" "; + } + for( x = -12; x <= 12; x++){ + arrSelected[x + offsetArr] = ""; + if( ( x * 100 ) == preSetTZ ){ + arrSelected[x + offsetArr] = " selected=\"selected\" "; + } + } + var txtTzSelect = " \ +<span style=\"width: 10%;background-color: grey;\">- \ +<table border=\"1\">\ + <tr>\ + <td>\ + Time Zone:\ + </td>\ + <td>\ + <select name=\"tzoffset\" onchange=\"tzChange(this.value);\">\ + <option "+ arrSelected[0] +" value=\"utc\">UTC/GMT</option>\ + <option "+ arrSelected[1] +" value=\"local\">Local (per browser)</option>"; + for( x = -12; x <= 12; x++){ + var tzOffset = formatTZ( x ); + txtTzSelect +=" <option "+ arrSelected[x + offsetArr] +"value=\""+ tzOffset +"\">"+ tzOffset +"</option>"; + } + txtTzSelect += "\ + </select>\ + </td>\ + </tr>\ +</table>\ +</span>"; + clkEvent.innerHTML = txtTzSelect; + }else{ + clkEvent.parentNode.title="+"; + clkEvent.parentNode.innerHTML = "+"; + } +} + -- 1.7.2.3 ^ permalink raw reply related [flat|nested] 36+ messages in thread
* Re: [PATCH 1/1] gitweb: javascript ability to adjust time based on timezone 2011-03-24 0:08 ` [PATCH 1/1] gitweb: javascript ability to adjust time based on timezone John 'Warthog9' Hawley @ 2011-03-24 5:23 ` Kevin Cernekee 2011-03-24 7:21 ` J.H. 2011-03-24 20:19 ` Jakub Narebski 2011-03-24 15:17 ` Jakub Narebski 1 sibling, 2 replies; 36+ messages in thread From: Kevin Cernekee @ 2011-03-24 5:23 UTC (permalink / raw) To: John 'Warthog9' Hawley; +Cc: git, jnareb, gitster [-- Attachment #1: Type: text/plain, Size: 2801 bytes --] On Wed, Mar 23, 2011 at 5:08 PM, John 'Warthog9' Hawley <warthog9@eaglescrag.net> wrote: > This patch takes the same basic goal, display the appropriate times > in a given timezone, and implements it in Javascript. This requires > adding / using a new class, dtcommit, which is based on the > dtstart/dtend microformats. Appropriate commit dates are wrapped in > a span with this class, and a title of the time in ISO8601 format. John, Thanks for coding this up. I tested it on a couple of different browsers and wanted to share my observations with you. First, the easy stuff: 1) "git am" complains about whitespace violations 2) HH:MM:SS times need zero padding; otherwise you see: Tue, 8 Mar 2011 20:29:9 -0700 3) Some of the Javascript functions are double-indented, others single-indented. 4) IE6 does not seem to like ISO 8601 format: x = new Date("2011-03-09T03:29:09Z"); This sets all fields to NaN. I suspect that getTime() values (milliseconds since 1970-01-01) are more portable. I have attached a trivial patch for these four items; it applies on top of your original submission. Some other things that popped up: 5) Some timezone offsets are not a whole number of hours. Bangalore time is GMT +0530, for instance. 6) Most U.S. timezones honor daylight savings, so they could be something like -0700 for part of the year, and -0800 for the rest of the year. Picking the "local" option would automatically adjust for this, but DST limits the usefulness of permanently storing a fixed TZ offset in the cookie. 7) Looking at a pre-DST commit after DST (or vice versa) can be a little confusing: Tue, 8 Mar 2011 20:29:09 -0700 + (19:29 -0800) I'm not sure which time to believe. (Although it's likely that a few weeks after a commit, the exact hour doesn't matter.) 8) The " + " popup menu is a little quirky. On FF 3.6 it partially collapses after selecting a value from the dropdown. On IE6 it shows "Error in parsing value for 'display'" and does not render. On Opera 11 it seemed to work OK. Firefox breakage: http://img217.imageshack.us/f/firefoxa.png/ I'm wondering if there might be a better place on the page to put the TZ selection. It isn't immediately obvious to the user what the extra " + " does, and it seems to cause some issues. If you decide to keep it where it is, you might want to consider absolute or fixed positioning so that other elements do not wrap around it. IOW it would work more like the dropdown menus on many sites. The timezone fixup javascript seemed to work reasonably well, except for the hiccup with IE6. Maybe it would be worth splitting this into two patches: one to rewrite the timestamps, and a second one to add the TZ selection interface. [-- Attachment #2: 0001-gitweb-minor-fixups-to-javascript-localtime-feature.patch --] [-- Type: application/octet-stream, Size: 6656 bytes --] From fe8d5ba1d3922cd368691d47bb5f605b9e2bed58 Mon Sep 17 00:00:00 2001 From: Kevin Cernekee <cernekee@gmail.com> Date: Wed, 23 Mar 2011 22:00:31 -0700 Subject: [PATCH] gitweb: minor fixups to javascript localtime feature Fix whitespace, indentation, HH:MM:SS zero padding, IE6 compatibility. Signed-off-by: Kevin Cernekee <cernekee@gmail.com> --- gitweb/gitweb.perl | 11 ++++--- gitweb/static/js/date.js | 63 +++++++++++++++++++++++++-------------------- 2 files changed, 41 insertions(+), 33 deletions(-) diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl index dfceaf6..1d5e970 100755 --- a/gitweb/gitweb.perl +++ b/gitweb/gitweb.perl @@ -262,9 +262,9 @@ our %highlight_ext = ( ); -# Enable / Disable the ability for gitweb to use a small amount of +# Enable / Disable the ability for gitweb to use a small amount of # javascript, along with a javascript cookie, to display commit -# times in the preffered timezone. Time zones can be pre-set +# times in the preferred timezone. Time zones can be pre-set # by specifying it in $jslocaltime with one of the following: # # utc @@ -2956,6 +2956,7 @@ sub parse_date { $mday, $months[$mon], $hour ,$min; $date{'iso-8601'} = sprintf "%04d-%02d-%02dT%02d:%02d:%02dZ", 1900+$year, 1+$mon, $mday, $hour ,$min, $sec; + $date{'getTime'} = $epoch * 1000; $tz =~ m/^([+\-][0-9][0-9])([0-9][0-9])$/; my $local = $epoch + ((int $1 + ($2/60)) * 3600); @@ -4013,7 +4014,7 @@ sub git_print_authorship { my %ad = parse_date($co->{'author_epoch'}, $co->{'author_tz'}); print "<$tag class=\"author_date\">" . format_search_author($author, "author", esc_html($author)) . - " [<span class=\"dtcommit\" title=\"$ad{'iso-8601'}\">$ad{'rfc2822'}</span>"; + " [<span class=\"dtcommit\" title=\"$ad{'getTime'}\">$ad{'rfc2822'}</span>"; print_local_time(%ad) if ($opts{-localtime}); print "]" . git_get_avatar($co->{'author_email'}, -pad_before => 1) . "</$tag>\n"; @@ -4040,7 +4041,7 @@ sub git_print_authorship_rows { git_get_avatar($co->{"${who}_email"}, -size => 'double') . "</td></tr>\n" . "<tr>" . - "<td></td><td> <span class=\"dtcommit\" title=\"$wd{'iso-8601'}\">$wd{'rfc2822'}</span>"; + "<td></td><td> <span class=\"dtcommit\" title=\"$wd{'getTime'}\">$wd{'rfc2822'}</span>"; print_local_time(%wd); print "</td>" . "</tr>\n"; @@ -5454,7 +5455,7 @@ sub git_summary { "<tr id=\"metadata_owner\"><td>owner</td><td>" . esc_html($owner) . "</td></tr>\n"; if (defined $cd{'rfc2822'}) { print "<tr id=\"metadata_lchange\"><td>last change</td>\n"; - print "<td><span class=\"dtcommit\" title=\"$cd{'iso-8601'}\">$cd{'rfc2822'}</span></td></tr>\n"; + print "<td><span class=\"dtcommit\" title=\"$cd{'getTime'}\">$cd{'rfc2822'}</span></td></tr>\n"; } # use per project git URL list in $projectroot/$project/cloneurl diff --git a/gitweb/static/js/date.js b/gitweb/static/js/date.js index a6d6f81..1728bda 100644 --- a/gitweb/static/js/date.js +++ b/gitweb/static/js/date.js @@ -12,15 +12,15 @@ function onloadTZSetup(){ } function addChangeTZ() { - var txtClassesFound = ""; - var classesFound = findElementsByClassName( "dtcommit" ); - txtClassesFound += "Length: "+ classesFound.length +"<br>\n"; - for ( x = 0; x < classesFound.length; x++){ - curElement = classesFound[x]; - txtClassesFound += "<br>\n"+ x +" - "+ curElement.nodeName +" - "+ curElement.title +" - "+ curElement.innerHTML +"<br>\n"; - var strExtra = " <span onclick=\"clickDate(event.target);\" title=\"+\">+</span>" - curElement.innerHTML = curElement.innerHTML + strExtra; - } + var txtClassesFound = ""; + var classesFound = findElementsByClassName( "dtcommit" ); + txtClassesFound += "Length: "+ classesFound.length +"<br>\n"; + for ( x = 0; x < classesFound.length; x++){ + curElement = classesFound[x]; + txtClassesFound += "<br>\n"+ x +" - "+ curElement.nodeName +" - "+ curElement.title +" - "+ curElement.innerHTML +"<br>\n"; + var strExtra = " <span onclick=\"clickDate(event.target);\" title=\"+\">+</span>" + curElement.innerHTML = curElement.innerHTML + strExtra; + } } function checkTZCookie(){ @@ -35,18 +35,26 @@ function checkTZCookie(){ } function formatTZ( tzOffset ) { - var posNeg = "+"; - if( tzOffset < 0 ){ - posNeg = "-"; - } - tzOffset = Math.sqrt( Math.pow( tzOffset, 2 ) ); - if( tzOffset < 100 ){ - tzOffset = tzOffset * 100; - } - for( y = tzOffset.toString().length + 1; y <= 4; y++ ){ - tzOffset = "0"+ tzOffset; - } - return posNeg + tzOffset; + var posNeg = "+"; + if( tzOffset < 0 ){ + posNeg = "-"; + } + tzOffset = Math.sqrt( Math.pow( tzOffset, 2 ) ); + if( tzOffset < 100 ){ + tzOffset = tzOffset * 100; + } + for( y = tzOffset.toString().length + 1; y <= 4; y++ ){ + tzOffset = "0"+ tzOffset; + } + return posNeg + tzOffset; +} + +function padTime( val ) { + if( val < 10 ){ + return "0" + val.toString(); + } else { + return val.toString(); + } } function dateOutput( objDate ) { @@ -62,7 +70,7 @@ function dateOutputTZ( objDate, tzOffset ) { tzOffset = 0; }else if( tzOffset == "local" ){ var tempDate = new Date(); - tzOffset = tempDate.getTimezoneOffset() * -1 / 60 * 100; + tzOffset = tempDate.getTimezoneOffset() * -1 / 60 * 100; tzOffset = formatTZ( tzOffset ); } @@ -76,9 +84,9 @@ function dateOutputTZ( objDate, tzOffset ) { strDate += toDateTime.getUTCDate() +" "; strDate += monthsOfYr[ toDateTime.getUTCMonth() ] +" "; strDate += toDateTime.getUTCFullYear() +" "; - strDate += toDateTime.getUTCHours() +":"; - strDate += toDateTime.getUTCMinutes() +":"; - strDate += toDateTime.getUTCSeconds() +" "; + strDate += padTime(toDateTime.getUTCHours()) +":"; + strDate += padTime(toDateTime.getUTCMinutes()) +":"; + strDate += padTime(toDateTime.getUTCSeconds()) +" "; strDate += tzOffset; @@ -98,7 +106,7 @@ function tzChangeSNS( tzOffset, set ){ var classesFound = findElementsByClassName( "dtcommit" ); for ( x = 0; x < classesFound.length; x++){ curElement = classesFound[x]; - var origDateTime = new Date( curElement.title ); + var origDateTime = new Date( parseInt(curElement.title) ); curElement.innerHTML = dateOutputTZ(origDateTime, tzOffset); } var tzExpDate = new Date(); @@ -114,7 +122,7 @@ function clickDate( clkEvent ) { clkEvent.title="-"; var preSetTZ = getCookie( getwebCookieTZOffset ); - + var arrSelected = new Array(); var offsetArr = 14; arrSelected[0] = " "; @@ -157,4 +165,3 @@ function clickDate( clkEvent ) { clkEvent.parentNode.innerHTML = "+"; } } - -- 1.7.4.1 ^ permalink raw reply related [flat|nested] 36+ messages in thread
* Re: [PATCH 1/1] gitweb: javascript ability to adjust time based on timezone 2011-03-24 5:23 ` Kevin Cernekee @ 2011-03-24 7:21 ` J.H. 2011-03-24 21:23 ` Jakub Narebski 2011-03-24 20:19 ` Jakub Narebski 1 sibling, 1 reply; 36+ messages in thread From: J.H. @ 2011-03-24 7:21 UTC (permalink / raw) To: Kevin Cernekee; +Cc: git, jnareb, gitster Going to make some quick comments on this, try and get things more along tomorrow (mainly just wanted to get this out today so the commentary could start) On 03/23/2011 10:23 PM, Kevin Cernekee wrote: > On Wed, Mar 23, 2011 at 5:08 PM, John 'Warthog9' Hawley > <warthog9@eaglescrag.net> wrote: >> This patch takes the same basic goal, display the appropriate times >> in a given timezone, and implements it in Javascript. This requires >> adding / using a new class, dtcommit, which is based on the >> dtstart/dtend microformats. Appropriate commit dates are wrapped in >> a span with this class, and a title of the time in ISO8601 format. > > John, > > Thanks for coding this up. I tested it on a couple of different > browsers and wanted to share my observations with you. > > First, the easy stuff: > > 1) "git am" complains about whitespace violations I'll take a look at that, there wasn't any when I created it... > 2) HH:MM:SS times need zero padding; otherwise you see: > > Tue, 8 Mar 2011 20:29:9 -0700 That's a bit more exciting, the specs I have say that shouldn't happen (but then again this is Javascript so all bets are off). Ok I see what's wrong, the documentation isn't quite as clear - yeah may just need to add a proper lpad() function to the common-lib.js, why that isn't standard in Javascript... > 3) Some of the Javascript functions are double-indented, others single-indented. I'm not sure what you are seeing here, all of the javascript files I have on my machine, "function" starts in column 0 of a new line, if you are seeing anything other than that you've got something wrong somewhere (mail client adding random spaces?) for the record: $ sha1sum * 56eefe528306bfa9d8e3aad9c6a379227e8d9c72 common-defs.js c2379d9440fa471879e99317c0bfdc1607759927 common-lib.js 901c3705d0629b3836f4fab56694c4e2120cb036 cookies.js cb220d94a5e762d2bd53af47040769e22ebf513b date.js If you aren't getting that, you have something wrong. > 4) IE6 does not seem to like ISO 8601 format: > > x = new Date("2011-03-09T03:29:09Z"); > > This sets all fields to NaN. I suspect that getTime() values > (milliseconds since 1970-01-01) are more portable. That's actually an issue, my understanding (as well as the understanding of all of the microformats that are out there) is that ISO 8601 is the "correct" format that these things should be in. If IE6 can't handle that (and I'll admit I don't have trivial access to older IEs for testing right now), then there is a *LOT* of Javascript out there that is just broken. Going a bit further, I would draw the line in the sand for gitweb supporting IE as a browser somewhere around IE 7 or 8 at this point as well: http://www.w3schools.com/browsers/browsers_explorer.asp IE 5, 6 & 7 look to have negligible market share at best as it is, and I'm not sure it's worth trying to go back and support IE6 or anything prior. > I have attached a trivial patch for these four items; it applies on > top of your original submission. I'll dig into that tomorrow. > Some other things that popped up: > > 5) Some timezone offsets are not a whole number of hours. Bangalore > time is GMT +0530, for instance. The code is capable of handling this, it's mainly an issue of interface, which I'll bring up in response to 6 & 7 > > 6) Most U.S. timezones honor daylight savings, so they could be > something like -0700 for part of the year, and -0800 for the rest of > the year. Picking the "local" option would automatically adjust for > this, but DST limits the usefulness of permanently storing a fixed TZ > offset in the cookie. If you choose local, you will always get the local that the machine is set at. More on that in #7 answer. > > 7) Looking at a pre-DST commit after DST (or vice versa) can be a > little confusing: > > Tue, 8 Mar 2011 20:29:09 -0700 + (19:29 -0800) > > I'm not sure which time to believe. (Although it's likely that a few > weeks after a commit, the exact hour doesn't matter.) Ok this is a bit of an answer to questions 5, 6 & 7 - the simple thing is, time zones are unbelievably complicated, esoteric and just a freaking nightmare. In the US alone there are 4 time zones + DST + a pile of exceptions that don't follow DST or follow DST in weird ways (like it starts an hour later, or earlier, etc). Trying to encompass all of those rules, which change on a frequently enough basis that I'm not sure we want to spend all of our time fixing and updating timezone issues, but this makes things: 1) going to be impossible (see 3) 2) going to require a *MUCH* more complicated user interface 3) going to require that Javascript have a date library that can actually handle timezones in some sane manor. I would wager that the most used / useful setting for most people will be to select 'local' and run with that (which is what the default is set to) since that can take advantage of the system's inbuilt idea of what the correct utc offset should be. What I've provided now is the obvious and simple interface, and while it ignores the more esoteric situations (and dst all together), the core of the algorithm will happily take any offset you want and it will work. Heck at one point in my testing I accidentally was using a 5 minute offset, which was slightly amusing. Adding in the 1/2hr offsets would not be hard, and it was something I had thought about earlier today in fact. Basically in the for loop that creates the drop down add in some special cases to get the correct half hour offsets, but at it's core you are still choosing the offset manually. The only way you could get all of the timezones is to more or less mimic the interface that every OS uses to select your time zones: provide a clickable map, or a very long list of cities to choose from. However even if we made the user interface significantly better (I'll admit I kinda like it's simplicity and straightforwardness) we have the problem that Javascript's inbuilt date class is woefully inadequate, and we would either have to build our own, or go to a 3rd party and make this feature dependent on outside javascript libraries. I'm ok with the later, but I'm not keen on doing the former if we can help it. Why? I'm not prepared to deal with the 1722 timezones that exist, each with their own exciting rules. > 8) The " + " popup menu is a little quirky. On FF 3.6 it partially > collapses after selecting a value from the dropdown. On IE6 it shows > "Error in parsing value for 'display'" and does not render. On Opera > 11 it seemed to work OK. > > Firefox breakage: http://img217.imageshack.us/f/firefoxa.png/ I hadn't seen it that badly in Chrome (what I've been testing with), but I'll admit the way I've implemented the onclick with that can be messy. I need to look around and find a few more ways to handle that and see what I can come up with. > I'm wondering if there might be a better place on the page to put the > TZ selection. It isn't immediately obvious to the user what the extra > " + " does, and it seems to cause some issues. I haven't really come up with a better place, there's no settings dialogue for gitweb, and I wold agree that the + isn't really indicative (just seemed like a good way to get it in there for now). I had thought of using a graphical icon, maybe like the (i) for information perhaps, but yeah, not sure how to handle that currently. > If you decide to keep it where it is, you might want to consider > absolute or fixed positioning so that other elements do not wrap > around it. IOW it would work more like the dropdown menus on many > sites. That actually gives me an idea on how to handle that better, well at least one possible way. I'm open to suggestions on how to improve that interface, I'm a backend server person for the most part, not a UI designer or HCI expert. I'm happy to mock things up or try things out, but I don't have any better suggestions for how to handle that :-/ > The timezone fixup javascript seemed to work reasonably well, except > for the hiccup with IE6. Maybe it would be worth splitting this into > two patches: one to rewrite the timestamps, and a second one to add > the TZ selection interface. Dunno, this is a pretty small and self contained set of patches as it is and separating the selection interface only really removes two functions from the first commit. I'll look into it though, see if there's a reasonably logical way to break this up into smaller pieces. - John ^ permalink raw reply [flat|nested] 36+ messages in thread
* Re: [PATCH 1/1] gitweb: javascript ability to adjust time based on timezone 2011-03-24 7:21 ` J.H. @ 2011-03-24 21:23 ` Jakub Narebski 0 siblings, 0 replies; 36+ messages in thread From: Jakub Narebski @ 2011-03-24 21:23 UTC (permalink / raw) To: J.H.; +Cc: Kevin Cernekee, git, gitster On Thu, 24 Mar 2011, J.H. wrote: > On 03/23/2011 10:23 PM, Kevin Cernekee wrote: > > On Wed, Mar 23, 2011 at 5:08 PM, John 'Warthog9' Hawley > > <warthog9@eaglescrag.net> wrote: > > > This patch takes the same basic goal, display the appropriate times > > > in a given timezone, and implements it in Javascript. This requires > > > adding / using a new class, dtcommit, which is based on the > > > dtstart/dtend microformats. Appropriate commit dates are wrapped in > > > a span with this class, and a title of the time in ISO8601 format. [...] > > 4) IE6 does not seem to like ISO 8601 format: > > > > x = new Date("2011-03-09T03:29:09Z"); > > > > This sets all fields to NaN. I suspect that getTime() values > > (milliseconds since 1970-01-01) are more portable. > > That's actually an issue, my understanding (as well as the understanding > of all of the microformats that are out there) is that ISO 8601 is the > "correct" format that these things should be in. If IE6 can't handle > that (and I'll admit I don't have trivial access to older IEs for > testing right now), then there is a *LOT* of Javascript out there that > is just broken. > > Going a bit further, I would draw the line in the sand for gitweb > supporting IE as a browser somewhere around IE 7 or 8 at this point as well: > > http://www.w3schools.com/browsers/browsers_explorer.asp > > IE 5, 6 & 7 look to have negligible market share at best as it is, and > I'm not sure it's worth trying to go back and support IE6 or anything prior. Another solution would be check if browser supports required JavaScript features, and if not behave as if JavaScript was disabled (graceful degradation). [...] > > Some other things that popped up: > > > > 5) Some timezone offsets are not a whole number of hours. Bangalore > > time is GMT +0530, for instance. > > The code is capable of handling this, it's mainly an issue of interface, > which I'll bring up in response to 6 & 7 This is not issue of only interface: date.js has 'tzOffset / 100 * msPerHr' and this do not support fractional offsets. +0530 is 5.5 hours, not 5.3. -- Jakub Narebski Poland ^ permalink raw reply [flat|nested] 36+ messages in thread
* Re: [PATCH 1/1] gitweb: javascript ability to adjust time based on timezone 2011-03-24 5:23 ` Kevin Cernekee 2011-03-24 7:21 ` J.H. @ 2011-03-24 20:19 ` Jakub Narebski 2011-03-24 22:00 ` Kevin Cernekee 2011-03-24 23:04 ` J.H. 1 sibling, 2 replies; 36+ messages in thread From: Jakub Narebski @ 2011-03-24 20:19 UTC (permalink / raw) To: Kevin Cernekee; +Cc: John 'Warthog9' Hawley, git, Junio Hamano On Thu, 24 Mar 2011, Kevin Cernekee wrote: > On Wed, Mar 23, 2011 at 5:08 PM, John 'Warthog9' Hawley > <warthog9@eaglescrag.net> wrote: > > This patch takes the same basic goal, display the appropriate times > > in a given timezone, and implements it in Javascript. This requires > > adding / using a new class, dtcommit, which is based on the > > dtstart/dtend microformats. Appropriate commit dates are wrapped in > > a span with this class, and a title of the time in ISO8601 format. > > John, > > Thanks for coding this up. I tested it on a couple of different > browsers and wanted to share my observations with you. I wonder if there is any site that allows to check JavaScript for compatibility with different browsers... > > First, the easy stuff: > > 1) "git am" complains about whitespace violations It would be more helpful if you wrote here what are those whitespace violations. > > 2) HH:MM:SS times need zero padding; otherwise you see: > > Tue, 8 Mar 2011 20:29:9 -0700 There is even padLeft function in gitweb.js ready to be (re)used... [...] > 4) IE6 does not seem to like ISO 8601 format: > > x = new Date("2011-03-09T03:29:09Z"); > > This sets all fields to NaN. I suspect that getTime() values > (milliseconds since 1970-01-01) are more portable. Do you mean using epoch in title attribute, or fallback to parsing ISO 8601 UTC format with regexps? > I have attached a trivial patch for these four items; it applies on > top of your original submission. It would be much, much easier to review your patch if you either put it inline at the end of your email, separating it from the rest of email with e.g. "-- >8 --" separator (so called 'scissors'), or at least using 'text/plain' as mimetype, '8bit' and not 'base64' encoding, and perhaps 'disposition=inline' rather than 'disposition=attachement'. [...] > 6) Most U.S. timezones honor daylight savings, so they could be > something like -0700 for part of the year, and -0800 for the rest of > the year. Picking the "local" option would automatically adjust for > this, but DST limits the usefulness of permanently storing a fixed TZ > offset in the cookie. Dealing with DST (zoneinfo library) is simply too hard for JavaScript IMHO. What we could do is to store "local" in cookie, not a fixed TZ offset (or perhaps store both as to not recalculate it). > 8) The " + " popup menu is a little quirky. On FF 3.6 it partially > collapses after selecting a value from the dropdown. On IE6 it shows > "Error in parsing value for 'display'" and does not render. On Opera > 11 it seemed to work OK. > > Firefox breakage: http://img217.imageshack.us/f/firefoxa.png/ > > I'm wondering if there might be a better place on the page to put the > TZ selection. It isn't immediately obvious to the user what the extra > " + " does, and it seems to cause some issues. Hmmm... perhaps a 'config' page? -- Jakub Narebski Poland ^ permalink raw reply [flat|nested] 36+ messages in thread
* Re: [PATCH 1/1] gitweb: javascript ability to adjust time based on timezone 2011-03-24 20:19 ` Jakub Narebski @ 2011-03-24 22:00 ` Kevin Cernekee 2011-03-24 22:29 ` J.H. 2011-03-24 23:04 ` J.H. 1 sibling, 1 reply; 36+ messages in thread From: Kevin Cernekee @ 2011-03-24 22:00 UTC (permalink / raw) To: Jakub Narebski; +Cc: John 'Warthog9' Hawley, git, Junio Hamano 2011/3/24 Jakub Narebski <jnareb@gmail.com>: >> 4) IE6 does not seem to like ISO 8601 format: >> >> x = new Date("2011-03-09T03:29:09Z"); >> >> This sets all fields to NaN. I suspect that getTime() values >> (milliseconds since 1970-01-01) are more portable. > > Do you mean using epoch in title attribute, or fallback to parsing > ISO 8601 UTC format with regexps? getTime() format is $epoch * 1000. When I switched to that format, all 3 of my browsers were able to handle it. I really don't think relying on "new Date(iso8601_timestamp)" is a good idea, but I guess the string parsing approach would work: http://webcloud.se/log/JavaScript-and-ISO-8601/ > Dealing with DST (zoneinfo library) is simply too hard for JavaScript > IMHO. What we could do is to store "local" in cookie, not a fixed TZ > offset (or perhaps store both as to not recalculate it). I agree, and I do not have a comprehensive solution for handling non-local timezones. > Hmmm... perhaps a 'config' page? Any thoughts on what other user-configurable items might get added in the future, and whether they will be on the client side or server side? ^ permalink raw reply [flat|nested] 36+ messages in thread
* Re: [PATCH 1/1] gitweb: javascript ability to adjust time based on timezone 2011-03-24 22:00 ` Kevin Cernekee @ 2011-03-24 22:29 ` J.H. 0 siblings, 0 replies; 36+ messages in thread From: J.H. @ 2011-03-24 22:29 UTC (permalink / raw) To: Kevin Cernekee; +Cc: Jakub Narebski, git, Junio Hamano On 03/24/2011 03:00 PM, Kevin Cernekee wrote: > 2011/3/24 Jakub Narebski <jnareb@gmail.com>: >>> 4) IE6 does not seem to like ISO 8601 format: >>> >>> x = new Date("2011-03-09T03:29:09Z"); >>> >>> This sets all fields to NaN. I suspect that getTime() values >>> (milliseconds since 1970-01-01) are more portable. >> >> Do you mean using epoch in title attribute, or fallback to parsing >> ISO 8601 UTC format with regexps? > > getTime() format is $epoch * 1000. When I switched to that format, > all 3 of my browsers were able to handle it. > > I really don't think relying on "new Date(iso8601_timestamp)" is a > good idea, but I guess the string parsing approach would work: > > http://webcloud.se/log/JavaScript-and-ISO-8601/ Looking at that, MS provides VM images for compatability testing with older IEs so I'm at least able to see the problem directly. There's also badness in using epoch directly, screen readers will handle that particularly badly (which is one of the reasons the microformats generally shifted to a slightly, if more painful to read from Javascript, method) >> Dealing with DST (zoneinfo library) is simply too hard for JavaScript >> IMHO. What we could do is to store "local" in cookie, not a fixed TZ >> offset (or perhaps store both as to not recalculate it). > > I agree, and I do not have a comprehensive solution for handling > non-local timezones. > >> Hmmm... perhaps a 'config' page? > > Any thoughts on what other user-configurable items might get added in > the future, and whether they will be on the client side or server > side? Any configurations that would happen there will all be client side, for a lot of reasons gitweb will not be able to have anything user level configurable from the server side (well at least any of the larger gitweb installs, which is what I'm primarily focused on). That said there's a lot we could do with Javascript from the client side, and that was one way of handling to change I had thought of - just didn't seem useful since we currently would only have this. I'm fine with the idea however (I envisioned it as some larger drop down that more or less filled the whole page and set various cookies for it's storage of things). But moving in this direction should be a conscious and definitive move that these kinds of changes will be client side, and will involve more and more Javascript. Assuming that our fallback non-javascript version of the page still works fine, and is usable, this is a good plan overall but it is a shift from where we have been with respect to Gitweb. - John 'Warthog9' Hawley ^ permalink raw reply [flat|nested] 36+ messages in thread
* Re: [PATCH 1/1] gitweb: javascript ability to adjust time based on timezone 2011-03-24 20:19 ` Jakub Narebski 2011-03-24 22:00 ` Kevin Cernekee @ 2011-03-24 23:04 ` J.H. 2011-03-24 23:36 ` Jakub Narebski 1 sibling, 1 reply; 36+ messages in thread From: J.H. @ 2011-03-24 23:04 UTC (permalink / raw) To: Jakub Narebski; +Cc: Kevin Cernekee, git, Junio Hamano On 03/24/2011 01:19 PM, Jakub Narebski wrote: > On Thu, 24 Mar 2011, Kevin Cernekee wrote: >> On Wed, Mar 23, 2011 at 5:08 PM, John 'Warthog9' Hawley >> <warthog9@eaglescrag.net> wrote: > >>> This patch takes the same basic goal, display the appropriate times >>> in a given timezone, and implements it in Javascript. This requires >>> adding / using a new class, dtcommit, which is based on the >>> dtstart/dtend microformats. Appropriate commit dates are wrapped in >>> a span with this class, and a title of the time in ISO8601 format. >> >> John, >> >> Thanks for coding this up. I tested it on a couple of different >> browsers and wanted to share my observations with you. > > I wonder if there is any site that allows to check JavaScript for > compatibility with different browsers... Not that I know of, would be useful but probably horrifically complicated. When I was doing Javascript and web stuff as my day job, about half of what you would write were wrappers to work around the brokenness on various browsers (mostly IE - ohhh IE...) >> First, the easy stuff: >> >> 1) "git am" complains about whitespace violations > > It would be more helpful if you wrote here what are those whitespace > violations. > >> >> 2) HH:MM:SS times need zero padding; otherwise you see: >> >> Tue, 8 Mar 2011 20:29:9 -0700 > > There is even padLeft function in gitweb.js ready to be (re)used... I'd rather use one that exists than recreate it, probably worth moving that to common-lib.js, but that is a separate commit. Sorry about that, didn't notice it in testing (it took me a while to find one of my local repos with a commit i nthe first 10 minutes or so), and the documentation I was reading implied that should have been padded. > [...] >> 4) IE6 does not seem to like ISO 8601 format: >> >> x = new Date("2011-03-09T03:29:09Z"); >> >> This sets all fields to NaN. I suspect that getTime() values >> (milliseconds since 1970-01-01) are more portable. > > Do you mean using epoch in title attribute, or fallback to parsing > ISO 8601 UTC format with regexps? Parsing it with regexps is doable if completely inelegant, that said this is Javascript... Looky that MS provides Virtual PC images for compat testing for IE6 http://www.microsoft.com/downloads/en/details.aspx?FamilyID=21eabb90-958f-4b64-b5f1-73d0a413c8ef&displaylang=en Ok reading through the documentation I can find for MS and their Date.parse ( http://msdn.microsoft.com/en-us/library/dctx55bc(v=VS7.1).aspx ) and some quick experimentation: 2011-03-09 - breaks 2011/03/09 - works 2011/03/09T01:01:01 - works, sorta - the hour comes out as 10 vs. 01 2011/03/09 01:01:01 - works, hour is correct 2011/03/09 01:01:01Z - works and seems to get the TZ correct 2011/03/09T01:01:01Z - breaks Not really sure what the "right" way to fix this is going to end up being. Suppose our options are: 1) Try and find a format that is generally accepted and parseable on all the browsers 2) Declare IE6 an unsupported browser 3) Trap what browser we are on and do a regex parsing of the string and do appropriate sets or a more verbose format that works everywhere 4) Use a regex and sets for every browser. 5) Switch all the embedded times over to epochs in the title=""'s 4 is probably the "most" right that I can see of those options, and avoids possible other browser inconsistencies with respect to date parsing. I'm going to code that up (it shouldn't be terribly complicated), unless someone likes one of the other ideas better. Suppose we could even go down the more complicate microformat route and just write some code to parse that, just more complicated all the way around. 5 has the appeal that everything handles the epoch correctly, but it does have the downside of being less readable in the html code (and shifts us slightly further away from the accepted "standard" of the microcode formats) [...] >> 6) Most U.S. timezones honor daylight savings, so they could be >> something like -0700 for part of the year, and -0800 for the rest of >> the year. Picking the "local" option would automatically adjust for >> this, but DST limits the usefulness of permanently storing a fixed TZ >> offset in the cookie. > > Dealing with DST (zoneinfo library) is simply too hard for JavaScript > IMHO. What we could do is to store "local" in cookie, not a fixed TZ > offset (or perhaps store both as to not recalculate it). I already provide the option for "local" in the cookie, the other fixed timesets are more for people wanting to be more explicit or look at time zones from a different location. >> 8) The " + " popup menu is a little quirky. On FF 3.6 it partially >> collapses after selecting a value from the dropdown. On IE6 it shows >> "Error in parsing value for 'display'" and does not render. On Opera >> 11 it seemed to work OK. >> >> Firefox breakage: http://img217.imageshack.us/f/firefoxa.png/ >> >> I'm wondering if there might be a better place on the page to put the >> TZ selection. It isn't immediately obvious to the user what the extra >> " + " does, and it seems to cause some issues. > > Hmmm... perhaps a 'config' page? Already made my comments on that in the other e-mail. - John 'Warthog9' Hawley ^ permalink raw reply [flat|nested] 36+ messages in thread
* Re: [PATCH 1/1] gitweb: javascript ability to adjust time based on timezone 2011-03-24 23:04 ` J.H. @ 2011-03-24 23:36 ` Jakub Narebski 0 siblings, 0 replies; 36+ messages in thread From: Jakub Narebski @ 2011-03-24 23:36 UTC (permalink / raw) To: J.H.; +Cc: Kevin Cernekee, git, Junio Hamano On Fri, 25 Mar 2011, J.H. wrote: > On 03/24/2011 01:19 PM, Jakub Narebski wrote: >> On Thu, 24 Mar 2011, Kevin Cernekee wrote: >>> 4) IE6 does not seem to like ISO 8601 format: >>> >>> x = new Date("2011-03-09T03:29:09Z"); >>> >>> This sets all fields to NaN. I suspect that getTime() values >>> (milliseconds since 1970-01-01) are more portable. >> >> Do you mean using epoch in title attribute, or fallback to parsing >> ISO 8601 UTC format with regexps? > > Parsing it with regexps is doable if completely inelegant, that said > this is Javascript... > > Looky that MS provides Virtual PC images for compat testing for IE6 > http://www.microsoft.com/downloads/en/details.aspx?FamilyID=21eabb90-958f-4b64-b5f1-73d0a413c8ef&displaylang=en > > Ok reading through the documentation I can find for MS and their > Date.parse ( > http://msdn.microsoft.com/en-us/library/dctx55bc(v=VS7.1).aspx ) and > some quick experimentation: > > 2011-03-09 - breaks > 2011/03/09 - works I really don't like using '/' as a separator; not only this is not ISO-8601, but it is easy to confuse with insane American way of writing dates with MM/DD/YYYY (day in the middle). > 2011/03/09T01:01:01 - works, sorta - the hour comes out as 10 vs. 01 > 2011/03/09 01:01:01 - works, hour is correct > 2011/03/09 01:01:01Z - works and seems to get the TZ correct > 2011/03/09T01:01:01Z - breaks If it worked in all (or almost all) web browsers with 2011-03-09 01:01:01Z - works and seems to get the TZ correct then I would say go for it - this variant of ISO-8601 with ' ' instead of 'T' to separate date part from time part is more human-readable. > Not really sure what the "right" way to fix this is going to end up > being. Suppose our options are: > > 1) Try and find a format that is generally accepted and parseable on all > the browsers > 2) Declare IE6 an unsupported browser > 3) Trap what browser we are on and do a regex parsing of the string and > do appropriate sets or a more verbose format that works everywhere If web browser returned undefined value if they can't parse date, then we could do regexp parsing based on this, not on user-string (which is in most cases wrong solution). > 4) Use a regex and sets for every browser. > 5) Switch all the embedded times over to epochs in the title=""'s > > 4 is probably the "most" right that I can see of those options, and > avoids possible other browser inconsistencies with respect to date > parsing. I'm going to code that up (it shouldn't be terribly > complicated), unless someone likes one of the other ideas better. > Suppose we could even go down the more complicate microformat route and > just write some code to parse that, just more complicated all the way > around. Right. > 5 has the appeal that everything handles the epoch correctly, but it > does have the downside of being less readable in the html code (and > shifts us slightly further away from the accepted "standard" of the > microcode formats) Well, we could always use non-standard 'epoch' attribute, or something... -- Jakub Narebski Poland ^ permalink raw reply [flat|nested] 36+ messages in thread
* Re: [PATCH 1/1] gitweb: javascript ability to adjust time based on timezone 2011-03-24 0:08 ` [PATCH 1/1] gitweb: javascript ability to adjust time based on timezone John 'Warthog9' Hawley 2011-03-24 5:23 ` Kevin Cernekee @ 2011-03-24 15:17 ` Jakub Narebski 2011-03-25 15:20 ` [PATCH (BUGFIX)] gitweb: Fix handling of fractional timezones in parse_date Jakub Narebski 1 sibling, 1 reply; 36+ messages in thread From: Jakub Narebski @ 2011-03-24 15:17 UTC (permalink / raw) To: John 'Warthog9' Hawley; +Cc: git, Kevin Cernekee, Junio Hamano On Thu, 24 Mar 2011, John 'Warthog9' Hawley wrote: > This patch is based on Kevin Cernekee's <cernekee@gmail.com> > patch series entitled "gitweb: introduce localtime feature". While > Kevin's patch changed the server side output so that the timezone > was output from gitweb itself, this has a number of drawbacks, in > particular with respect to gitweb-caching. Excuse me, but the above is not true, Kevin Cernekee's patches, _as they are implemented_, would not interfere with [future] gitweb caching. What might and probably would interfere with output caching is hypothetical vaguely proposed series that would implement on server choosing of timezone on client stored in a cookie. But Kevin's patches do not do this. Any server-side implemented feature that depends only on server-side configuration, and always create exactly the same view for the same URL (assuming that repository didn't change), wouldn't interfere with gitweb-caching. I agree that implementing what this patch does on server-side would make gitweb-caching implementation harder, and reduce gains from caching output. > This patch takes the same basic goal, display the appropriate times > in a given timezone, and implements it in Javascript. This requires > adding / using a new class, dtcommit, which is based on the > dtstart/dtend microformats. Appropriate commit dates are wrapped in > a span with this class, and a title of the time in ISO8601 format. Is it ISO8601 format with timezone, or in UTC? Note that currently this pattern is discouraged for accesibility reasons; http://microformats.org/wiki/datetime-design-pattern says: Note: Some accessibility-issues have been raised with Datetime Design Pattern, that have been addressed with the completion of the value-class-pattern. But using value-class-pattern would make it harder for JavaScript to handle, and at least in short form does not provide us with original timezone. > > Enabling this will then add several javascript files to be loaded, While I agree that for maintenance reasons JavaScript files should be split, most web best practice pages[1][2][3] recommends to combine JavaScript files for performance. [1]: http://developer.yahoo.com/performance/rules.html "Minimize HTTP Requests" section [2]: http://code.google.com/speed/articles/include-scripts-properly.html "1. Combine external JavaScript files" [3]: http://javascript-reference.info/speed-up-your-javascript-load-time.htm "Combine Your Files" section. See also comments below. But as an RFC / weatherballoon patch it is all right. > a default timezone to be selected and a single onloadTZSetup() > function to be called. What about 'window.onload = fixLinks;' that gitweb used to use to be able to detect by server-side code if JavaScript-only views (such as 'blame_incremental') should/could be used in place of non-JavaScript ones? Ah, I see that it is solved in different way: instead of window.onload, embedded JavaScript snippet is used. > > This will place a "+" to the right of an appropriate time and clicking > on it will give you a drop down to choose the timezone to change to. User interface part would probably be bikeshedded to death... ;-P > > All changes are saved to a Javascript cookie, so page changes and > browser closure / reopening retains the last known setting used. Good... assuming that we respect user's choice to not allow cookies. > > Fallback (should Javascript not be enabled) is to treat dates as > they have been and display them, only, in UTC. That is sane solution. > > Valid timezones, currently, are: > > utc > local > -1200 > -1100 > ... > +1100 > +1200 I guess that it would be difficult to support 'original' / 'asis' timezone, i.e. the timezone that author / committer / tagger used, and which is saved in git object... and it wouldn't be more useful than 'local', I guess. > > With each timezone being +1hr to the previous. The code is capable of > handling fractional timezones, but those have not been added. NOTE: I think that current gitweb code (parse_date / format_date) doesn't handle negative fractional timezones correctly. $tz =~ m/^([+\-][0-9][0-9])([0-9][0-9])$/; my $local = $epoch + ((int $1 + ($2/60)) * 3600); Though git.git repository doesn't contain negative fractional timezones... it does contain positive fractional timezones however. $ git log --pretty='%ai%n%ci' --all | cut -d' ' -f 3 | sort -n | uniq Could anyone check it e.g. on Linux kernel repository? > > Pages Affected: > * 'summary' view, "last change" field (commit time from latest change) > * 'log' view, author time > * 'commit' and 'commitdiff' views, author/committer time I guess other pages (like e.g. feed pages, i.e. 'rss' and 'atom' views) are not affected? > > Based-on-code-from: Kevin Cernekee <cernekee@gmail.com> Is it Based-on-code-from, or Idea-by / Inspired-by? ;-) > Signed-off-by: John 'Warthog9' Hawley <warthog9@eaglescrag.net> > --- > gitweb/gitweb.perl | 64 +++++++++++++++- > gitweb/static/js/common-defs.js | 12 +++ > gitweb/static/js/common-lib.js | 32 ++++++++ > gitweb/static/js/cookies.js | 35 +++++++++ > gitweb/static/js/date.js | 160 +++++++++++++++++++++++++++++++++++++++ > 5 files changed, 300 insertions(+), 3 deletions(-) > create mode 100644 gitweb/static/js/common-defs.js > create mode 100644 gitweb/static/js/common-lib.js > create mode 100644 gitweb/static/js/cookies.js > create mode 100644 gitweb/static/js/date.js [...] > @@ -3728,6 +3772,19 @@ sub git_footer_html { > qq!</script>\n!; > } > > + print "<!-- jslocaltime: $jslocaltime -->"; Is the above line leftover debugging? > + if( $jslocaltime ne '' ){ > + my $js_path = File::Basename::dirname($javascript); > + print qq!<script type="text/javascript" src="!. esc_url( $js_path ."/js/common-defs.js" ) .qq!"></script>\n!; > + print qq!<script type="text/javascript" src="!. esc_url( $js_path ."/js/common-lib.js" ) .qq!"></script>\n!; > + print qq!<script type="text/javascript" src="!. esc_url( $js_path ."/js/date.js" ) .qq!"></script>\n!; > + print qq!<script type="text/javascript" src="!. esc_url( $js_path ."/js/cookies.js" ) .qq!"></script>\n!; > + print "<script type=\"text/javascript\">\n". > + "var tzDefault = \"$jslocaltime\";\n". > + "onloadTZSetup();\n". > + "</script>"; > + } First, it is recommended for better performance to consolidate JavaScript files into single file (or load them dynamically). gitweb/Makefile could do this, though it would mean that installing gitweb by hand would be even more difficult. But this can be left for later commit. Second, I guess that some of functions from current gitweb.js could be moved to js/common-lib.js. But that can be left for later commit. Third, I wonder if instead of creating our own library, it wouldn't be better if gitweb used (perhaps loaded from external source, like Google) some JavaScript library, like e.g. jQuery. > > diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl > index 9dccfb0..2a662d8 100755 > --- a/gitweb/gitweb.perl > +++ b/gitweb/gitweb.perl > @@ -261,6 +261,49 @@ our %highlight_ext = ( > map { $_ => 'xml' } qw(xhtml html htm), > ); > > + > +# Enable / Disable the ability for gitweb to use a small amount of > +# javascript, along with a javascript cookie, to display commit > +# times in the preffered timezone. Time zones can be pre-set > +# by specifying it in $jslocaltime with one of the following: > +# > +# utc > +# local See above about lack of 'original' / 'asis' here. > +# -1200 > +# -1100 > +# -1000 > +# -0900 > +# -0800 > +# -0700 > +# -0600 > +# -0500 > +# -0400 > +# -0300 > +# -0200 > +# -0100 > +# +0000 > +# +0100 > +# +0200 > +# +0300 > +# +0400 > +# +0500 > +# +0600 > +# +0700 > +# +0800 > +# +0900 > +# +1000 > +# +1100 > +# +1200 Must we list all those timezones explicitely? > +# > +# utc is identical to +0000, and local will use the > +# timezone that the browser thinks it is in. > +# > +# Enabled by default. > +# > +# To disable set to null or '' I guess it is "To disable set to undef or ''", isn't it? BTW. would any false-ish value (undef, '', 0, 0.0, ()) work? > + > +our $jslocaltime = 'local'; Hmmm... I wonder if it wouldn't be better to use non-overridable %feature for this, instead of introducing yet another [global] variable... > @@ -504,6 +547,7 @@ our %feature = ( > 'sub' => sub { feature_bool('remote_heads', @_) }, > 'override' => 0, > 'default' => [0]}, > + > ); > > sub gitweb_get_feature { > + > print "</body>\n" . > "</html>"; > } Stray change? > - " [$ad{'rfc2822'}"; > + " [<span class=\"dtcommit\" title=\"$ad{'iso-8601'}\">$ad{'rfc2822'}</span>"; [...] > - "<td></td><td> $wd{'rfc2822'}"; > + "<td></td><td> <span class=\"dtcommit\" title=\"$wd{'iso-8601'}\">$wd{'rfc2822'}</span>"; [...] > - print "<tr id=\"metadata_lchange\"><td>last change</td><td>$cd{'rfc2822'}</td></tr>\n"; > + print "<tr id=\"metadata_lchange\"><td>last change</td>\n"; > + print "<td><span class=\"dtcommit\" title=\"$cd{'iso-8601'}\">$cd{'rfc2822'}</span></td></tr>\n"; This code repetition just begs for a helper subroutine, like e.g. - " [$ad{'rfc2822'}"; + " [" . format_timestamp($ad, 'rfc2822'); or + " [" . format_timestamp($ad, -format=>'rfc2822'); > diff --git a/gitweb/static/js/common-defs.js b/gitweb/static/js/common-defs.js > new file mode 100644 > index 0000000..23a1cc2 > --- /dev/null > +++ b/gitweb/static/js/common-defs.js > @@ -0,0 +1,12 @@ > +// Copyright (C) 2011, John 'Warthog9' Hawley <warthog9@eaglescrag.net> > +// > +// > +// JavaScript common globals for gitweb (git web interface). > +// @license GPLv2 or later > +// > + > +// Common universal values get set here > +// Things like cookie names, and other just > +// basic global variables. > + > +getwebCookieTZOffset = "tzOffset"; ^^^^^^ \- typo, probably should be "gitweb" here Is it really worth adding extra JavaScript file? > diff --git a/gitweb/static/js/common-lib.js b/gitweb/static/js/common-lib.js > new file mode 100644 > index 0000000..2ce65ec > --- /dev/null > +++ b/gitweb/static/js/common-lib.js > @@ -0,0 +1,32 @@ > +// Copyright (C) 2011, John 'Warthog9' Hawley <warthog9@eaglescrag.net> > +// > +// > +// JavaScript date handling code for gitweb (git web interface). > +// @license GPLv2 or later > +// > +// > +function findElementsByClassName( className ) { > + if( document.getElementsByClassName == undefined) { > + var hasClassName = new RegExp("(?:^|\\s)" + className + "(?:$|\\s)"); > + var allElements = document.getElementsByTagName("*"); > + var foundElements = []; > + > + var element = null; > + for (var x = 0; (element = allElements[x]) != null; x++) { > + var curClass = element.className; > + if( > + curClass // If we've actually got something > + && > + curClass.indexOf(className) != -1 // And it has a valid index, I.E. not -1 > + && > + hasClassName.test(curClass) // and the regex passes > + ) { > + foundElements.push(element); // push it onto the results stack > + } > + } > + > + return foundElements; > + }else{ > + return document.getElementsByClassName( className ); > + } > +} Hmmm... this really begs for some JavaScript library, like e.g. jQuery. Is there any sane web browser that doesn't support getElementsByTagName? BTW. is it your own code? > diff --git a/gitweb/static/js/cookies.js b/gitweb/static/js/cookies.js > new file mode 100644 > index 0000000..8c8f7aa > --- /dev/null > +++ b/gitweb/static/js/cookies.js > @@ -0,0 +1,35 @@ > +// Copyright (C) 2011, John 'Warthog9' Hawley <warthog9@eaglescrag.net> > +// > +// > +// JavaScript cookie handling code for gitweb (git web interface). > +// @license GPLv2 or later > +// > + > +function setCookieExp( name, value, expires ){ > + var expDate = new Date( expires.toString() ); > + expires = expDate.toUTCString; > + document.cookie = escape(name) +"="+ escape(value) +";"+ expDate.toUTCString() +";path=/"; Shouldn't it be + document.cookie = escape(name) +"="+ escape(value) +";expires="+ expDate.toUTCString() +";path=/"; > +} > + > +function setCookie( name, value ){ > + var txtCookie = name +"=\""+ value +"\";path=/"; > + document.cookie = txtCookie; > +} Hmmm... why setCookie doesn't escape name and value, but surrounds value with doublequotes '"', contrary to what setCookieExp does? Should we set 'path' to anything in a cookie? > + > +function getCookie( name ){ > + var allCookies = document.cookie.split(";"); > + var value = ""; > + > + for( var x = 0; x < allCookies.length; x++ ){ > + var brokenCookie = allCookies[x].split("=",2); > + var hasName = new RegExp("^\\s*" + name + "\\s*$"); Note: I am not sure if using '/regex/' instead of 'new RegExp("regex")' isn't preferred way of dealing with regular expressions in JavaScript. > + if( > + hasName.test(brokenCookie[0]) // Check for the name of the cookie based on the regex > + && > + brokenCookie.length == 2 // Just making sure there is something to actually return here > + ){ > + return unescape(brokenCookie[1]); > + } > + } > + return null; > +} Please do not use RegExp where string comparison would be enough. Also, escape cookie name first (or unescape what you got from browser): +function getCookie(name) +{ + var allCookies = document.cookie.split("; "); + + for (var x = 0; x < allCookies.length; x++ ) { + var oneCookie = allCookies[x].split("=", 2); + if (oneCookie[0] == escape(name)) { + return unescape(oneCookie[1]); + } + } + return null; +} > diff --git a/gitweb/static/js/date.js b/gitweb/static/js/date.js > new file mode 100644 > index 0000000..a6d6f81 > --- /dev/null > +++ b/gitweb/static/js/date.js > @@ -0,0 +1,160 @@ > +// Copyright (C) 2011, John 'Warthog9' Hawley <warthog9@eaglescrag.net> > +// > +// > +// JavaScript date handling code for gitweb (git web interface). > +// @license GPLv2 or later > +// > + > +function onloadTZSetup(){ > + addChangeTZ(); > + tzChangeNS( tzDefault ); > + checkTZCookie(); > +} Shouldn't we check cookie first, so that we can pre-select current choice of timezone? > + > +function addChangeTZ() { A bit of bikeshedding: perhaps there is a better name for adding UI to change timezone used in all timestamps than addChangeTZ? > + var txtClassesFound = ""; Leftover debugging aid? > + var classesFound = findElementsByClassName( "dtcommit" ); > + txtClassesFound += "Length: "+ classesFound.length +"<br>\n"; > + for ( x = 0; x < classesFound.length; x++){ > + curElement = classesFound[x]; > + txtClassesFound += "<br>\n"+ x +" - "+ curElement.nodeName +" - "+ curElement.title +" - "+ curElement.innerHTML +"<br>\n"; > + var strExtra = " <span onclick=\"clickDate(event.target);\" title=\"+\">+</span>" Errr... shouldn't 'title' attribute explain what this "+" is about instead? > + curElement.innerHTML = curElement.innerHTML + strExtra; > + } > +} Note for the future: instead of using 'onclick' handler for each event, perhaps a better solution, though requiring more JavaScript knowledge, is to make use of event bubbling? But I think, user interface considerations aside, that is a good enough solution for this/first commit. > + > +function checkTZCookie(){ > + var preSetTZ = getCookie( getwebCookieTZOffset ); "preSetTZ", not "presetTZ"? "getwebCookieTZOffset", not "gitwebCookieTZOffset"? > + if( > + preSetTZ != null > + && > + preSetTZ.length != 0 > + ){ > + tzChange( preSetTZ ); > + } > +} > + > +function formatTZ( tzOffset ) { What does this function _do_; what are the arguments and what it returns? There is no comment describing this function. I guess that it converts timezone offset as number to string. > + var posNeg = "+"; > + if( tzOffset < 0 ){ > + posNeg = "-"; > + } "posNeg" and not e.g. "sign"? > + tzOffset = Math.sqrt( Math.pow( tzOffset, 2 ) ); Uhhh? Using something like this for abs? WTF? > + if( tzOffset < 100 ){ > + tzOffset = tzOffset * 100; > + } > + for( y = tzOffset.toString().length + 1; y <= 4; y++ ){ > + tzOffset = "0"+ tzOffset; > + } Why not use padLeft from gitweb.js here (perhaps moved to js/common-lib.js), i.e. + tzOffset = padLeft(tzOffset, 4, '0'); > + return posNeg + tzOffset; > +} > + > +function dateOutput( objDate ) { > + return dateOutputTZ( objDate, "0" ); > +} Do we really need this offset function? > + > +function dateOutputTZ( objDate, tzOffset ) { > + var strDate = ""; > + var daysOfWeek = [ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ]; > + var monthsOfYr = [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ]; > + > + if( tzOffset == "utc" ){ > + tzOffset = 0; > + }else if( tzOffset == "local" ){ > + var tempDate = new Date(); > + tzOffset = tempDate.getTimezoneOffset() * -1 / 60 * 100; > + tzOffset = formatTZ( tzOffset ); I think it might be good idea to keep return value of getTimezoneOffset, to not recalculate it again and again. But it might be not good because those two values (string timezone and offset in minutes) must be kept in sync... > + } We probably should extract getting local timezone to separate function, and save its result somewhere so that we don't have to do this calculation for each date, only once per invocation. > + > + var msPerHr = 1000 * 60 * 60; // 1000ms/sec * 60sec/min * 60sec/hr > + var toDateTime = new Date(); Perhaps "offsetDate" or "dateWithOffset" would be a better name for this variable? > + toDateTime.setTime( objDate.getTime() + ( tzOffset / 100 * msPerHr ) ); This doesn't deal with fractional timezones, contrary what you said in the commit message, isn't it? > + > + // Current Date Formatting: > + // Fri, 19 Dec 2008 11:35:33 +0000 > + strDate += daysOfWeek[ toDateTime.getUTCDay() ] +", "; > + strDate += toDateTime.getUTCDate() +" "; > + strDate += monthsOfYr[ toDateTime.getUTCMonth() ] +" "; > + strDate += toDateTime.getUTCFullYear() +" "; > + strDate += toDateTime.getUTCHours() +":"; > + strDate += toDateTime.getUTCMinutes() +":"; > + strDate += toDateTime.getUTCSeconds() +" "; Don't you need to '0'-pad hours, minutes and seconds? > + > + strDate += tzOffset; Note for the future: composing a string by repeated concatenation is not the best solution - it is faster to create array and join it to single string at the end. But this could be left for late commit. Also I'd prefer if formatting of RFC2822 date was put in a separate function. > + > + return strDate; > +} > + > +function tzChange( tzOffset ){ > + return tzChangeSNS( tzOffset, true ); > +} > + > +function tzChangeNS( tzOffset ){ > + return tzChangeSNS( tzOffset, false ); > +} What are those wrappers needed for? > + > +function tzChangeSNS( tzOffset, set ){ > + var txtClassesFound = ""; > + var classesFound = findElementsByClassName( "dtcommit" ); > + for ( x = 0; x < classesFound.length; x++){ > + curElement = classesFound[x]; > + var origDateTime = new Date( curElement.title ); I wonder if using 'new Date( Date.parse(curElement.title) )' would make it more portable... ...or perhaps use regexp to parse date as fallback. > + curElement.innerHTML = dateOutputTZ(origDateTime, tzOffset); > + } > + var tzExpDate = new Date(); > + tzExpDate.setDate( tzExpDate.getDate() + 180 ); Why magic 180? > + if( set == true ){ > + setCookieExp( getwebCookieTZOffset, tzOffset, tzExpDate.toUTCString() ); > + } > + addChangeTZ(); Do we need, and should we set expiration date for this cookie? > +} > + > +function clickDate( clkEvent ) { > + if( clkEvent.title == "+" ){ > + clkEvent.title="-"; Nice trick to allow expansion and contracting... > + > + var preSetTZ = getCookie( getwebCookieTZOffset ); > + > + var arrSelected = new Array(); I think the preferred way is to use + var arrSelected = []; > + var offsetArr = 14; > + arrSelected[0] = " "; > + arrSelected[1] = " "; > + if( preSetTZ == "utc" ) { > + arrSelected[0] = " selected=\"selected\" "; > + } else if( preSetTZ == "local" ){ > + arrSelected[1] = " selected=\"selected\" "; > + } > + for( x = -12; x <= 12; x++){ > + arrSelected[x + offsetArr] = ""; > + if( ( x * 100 ) == preSetTZ ){ > + arrSelected[x + offsetArr] = " selected=\"selected\" "; > + } > + } > + var txtTzSelect = " \ > +<span style=\"width: 10%;background-color: grey;\">- \ Probably needs some absolute or relative positioning, to avoid reflow. > +<table border=\"1\">\ > + <tr>\ > + <td>\ > + Time Zone:\ > + </td>\ > + <td>\ > + <select name=\"tzoffset\" onchange=\"tzChange(this.value);\">\ > + <option "+ arrSelected[0] +" value=\"utc\">UTC/GMT</option>\ > + <option "+ arrSelected[1] +" value=\"local\">Local (per browser)</option>"; > + for( x = -12; x <= 12; x++){ > + var tzOffset = formatTZ( x ); > + txtTzSelect +=" <option "+ arrSelected[x + offsetArr] +"value=\""+ tzOffset +"\">"+ tzOffset +"</option>"; > + } > + txtTzSelect += "\ > + </select>\ > + </td>\ > + </tr>\ > +</table>\ > +</span>"; > + clkEvent.innerHTML = txtTzSelect; > + }else{ > + clkEvent.parentNode.title="+"; > + clkEvent.parentNode.innerHTML = "+"; > + } > +} All right, probably using innerHTML instead of constructing DOM is a better solution, or at least more portable. Well, easier anyway. -- Jakub Narebski Poland ^ permalink raw reply [flat|nested] 36+ messages in thread
* [PATCH (BUGFIX)] gitweb: Fix handling of fractional timezones in parse_date 2011-03-24 15:17 ` Jakub Narebski @ 2011-03-25 15:20 ` Jakub Narebski 2011-03-25 16:26 ` Kevin Cernekee 0 siblings, 1 reply; 36+ messages in thread From: Jakub Narebski @ 2011-03-25 15:20 UTC (permalink / raw) To: John 'Warthog9' Hawley; +Cc: git, Kevin Cernekee, Junio Hamano Fractional timezones, like -0330 (NST used in Canada) or +0430 (Afghanistan, Iran DST), were not handled properly in parse_date; this means values such as 'minute_local' and 'iso-tz' were not generated correctly. This was caused by two mistakes: * sign of timezone was applied only to hour part of offset, and not as it should be also to minutes part (this affected only negative fractional timezones). * 'int $h + $m/60' is 'int($h + $m/60)' and not 'int($h) + $m/60', so fractional part was discarded altogether ($h is hours, $m is minutes, which is always less than 60). Note that positive fractional timezones +0430, +0530 and +1030 can be found as authortime in git.git repository itself. For example http://repo.or.cz/w/git.git/commit/88d50e7 had authortime of "Fri, 8 Jan 2010 18:48:07 +0000 (23:48 +0530)", which is not marked with 'atnight', when "git show 88d50e7" gives correct author date of "Sat Jan 9 00:18:07 2010 +0530". Signed-off-by: Jakub Narebski <jnareb@gmail.com> --- On Thu, 24 Mar 2011, Jakub Narebski wrote: > On Thu, 24 Mar 2011, John 'Warthog9' Hawley wrote: > > With each timezone being +1hr to the previous. The code is capable of > > handling fractional timezones, but those have not been added. No, it isn't (see my other email). > NOTE: I think that current gitweb code (parse_date / format_date) doesn't > handle negative fractional timezones correctly. > > $tz =~ m/^([+\-][0-9][0-9])([0-9][0-9])$/; > my $local = $epoch + ((int $1 + ($2/60)) * 3600); This patch fixed this bug (actually two bugs ;-)). > Though git.git repository doesn't contain negative fractional timezones... > it does contain positive fractional timezones however. > > $ git log --pretty='%ai%n%ci' --all | cut -d' ' -f 3 | sort -n | uniq > > Could anyone check it e.g. on Linux kernel repository? Anyone? gitweb/gitweb.perl | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl index 0178633..256062e 100755 --- a/gitweb/gitweb.perl +++ b/gitweb/gitweb.perl @@ -2921,8 +2921,10 @@ sub parse_date { $date{'iso-8601'} = sprintf "%04d-%02d-%02dT%02d:%02d:%02dZ", 1900+$year, 1+$mon, $mday, $hour ,$min, $sec; - $tz =~ m/^([+\-][0-9][0-9])([0-9][0-9])$/; - my $local = $epoch + ((int $1 + ($2/60)) * 3600); + my ($tz_sign, $tz_hour, $tz_min) = + ($tz =~ m/^([+\-])([0-9][0-9])([0-9][0-9])$/); + $tz_sign = ($tz_sign eq '-' ? -1 : +1); + my $local = $epoch + $tz_sign*($tz_hour + ($tz_min/60.0))*3600; ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday) = gmtime($local); $date{'hour_local'} = $hour; $date{'minute_local'} = $min; -- 1.7.3 ^ permalink raw reply related [flat|nested] 36+ messages in thread
* Re: [PATCH (BUGFIX)] gitweb: Fix handling of fractional timezones in parse_date 2011-03-25 15:20 ` [PATCH (BUGFIX)] gitweb: Fix handling of fractional timezones in parse_date Jakub Narebski @ 2011-03-25 16:26 ` Kevin Cernekee 2011-03-25 16:50 ` [PATCH (BUGFIX) v2] " Jakub Narebski 2011-03-25 17:15 ` [PATCH (BUGFIX)] " Junio C Hamano 0 siblings, 2 replies; 36+ messages in thread From: Kevin Cernekee @ 2011-03-25 16:26 UTC (permalink / raw) To: Jakub Narebski; +Cc: John 'Warthog9' Hawley, git, Junio Hamano 2011/3/25 Jakub Narebski <jnareb@gmail.com>: > @@ -2921,8 +2921,10 @@ sub parse_date { > $date{'iso-8601'} = sprintf "%04d-%02d-%02dT%02d:%02d:%02dZ", > 1900+$year, 1+$mon, $mday, $hour ,$min, $sec; > > - $tz =~ m/^([+\-][0-9][0-9])([0-9][0-9])$/; > - my $local = $epoch + ((int $1 + ($2/60)) * 3600); > + my ($tz_sign, $tz_hour, $tz_min) = > + ($tz =~ m/^([+\-])([0-9][0-9])([0-9][0-9])$/); It's just a matter of personal preference, but I would find this regexp slightly easier to read: + ($tz =~ m/^([+\-])([0-9]{2})([0-9]{2})$/); > + $tz_sign = ($tz_sign eq '-' ? -1 : +1); > + my $local = $epoch + $tz_sign*($tz_hour + ($tz_min/60.0))*3600; If you wanted to avoid floats, you could do something like: + my $local = $epoch + $tz_sign * ($tz_hour * 3600 + $tz_min * 60); ^ permalink raw reply [flat|nested] 36+ messages in thread
* [PATCH (BUGFIX) v2] gitweb: Fix handling of fractional timezones in parse_date 2011-03-25 16:26 ` Kevin Cernekee @ 2011-03-25 16:50 ` Jakub Narebski 2011-03-25 17:15 ` [PATCH (BUGFIX)] " Junio C Hamano 1 sibling, 0 replies; 36+ messages in thread From: Jakub Narebski @ 2011-03-25 16:50 UTC (permalink / raw) To: Kevin Cernekee; +Cc: John 'Warthog9' Hawley, git, Junio Hamano On Fri, 25 Mar 2011, Kevin Cernekee wrote: > 2011/3/25 Jakub Narebski <jnareb@gmail.com>: > > @@ -2921,8 +2921,10 @@ sub parse_date { > > $date{'iso-8601'} = sprintf "%04d-%02d-%02dT%02d:%02d:%02dZ", > > 1900+$year, 1+$mon, $mday, $hour ,$min, $sec; > > > > - $tz =~ m/^([+\-][0-9][0-9])([0-9][0-9])$/; > > - my $local = $epoch + ((int $1 + ($2/60)) * 3600); > > + my ($tz_sign, $tz_hour, $tz_min) = > > + ($tz =~ m/^([+\-])([0-9][0-9])([0-9][0-9])$/); > > It's just a matter of personal preference, but I would find this > regexp slightly easier to read: > > + ($tz =~ m/^([+\-])([0-9]{2})([0-9]{2})$/); I went for minimal changes, same as with the change below. > > + $tz_sign = ($tz_sign eq '-' ? -1 : +1); > > + my $local = $epoch + $tz_sign*($tz_hour + ($tz_min/60.0))*3600; > > If you wanted to avoid floats, you could do something like: > > + my $local = $epoch + $tz_sign * ($tz_hour * 3600 + $tz_min * 60); Note that because valid $tz_min can be only 00, 30 or 45, see e.g. http://en.wikipedia.org/wiki/List_of_time_zones_by_UTC_offset therefore version using floats would not introduce any rounding errors: 0, 0.5 and 0.75 can be represented exactly as 2-base float. Anyway below is patch with above changes: -- >8 -- Subject: [PATCH] gitweb: Fix handling of fractional timezones in parse_date Fractional timezones, like -0330 (NST used in Canada) or +0430 (Afghanistan, Iran DST), were not handled properly in parse_date; this means values such as 'minute_local' and 'iso-tz' were not generated correctly. This was caused by two mistakes: * sign of timezone was applied only to hour part of offset, and not as it should be also to minutes part (this affected only negative fractional timezones). * 'int $h + $m/60' is 'int($h + $m/60)' and not 'int($h) + $m/60', so fractional part was discarded altogether ($h is hours, $m is minutes, which is always less than 60). Note that positive fractional timezones +0430, +0530 and +1030 can be found as authortime in git.git repository itself. For example http://repo.or.cz/w/git.git/commit/88d50e7 had authortime of "Fri, 8 Jan 2010 18:48:07 +0000 (23:48 +0530)", which is not marked with 'atnight', when "git show 88d50e7" gives correct author date of "Sat Jan 9 00:18:07 2010 +0530". Signed-off-by: Jakub Narebski <jnareb@gmail.com> --- gitweb/gitweb.perl | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl index 0178633..7b9f90b 100755 --- a/gitweb/gitweb.perl +++ b/gitweb/gitweb.perl @@ -2921,8 +2921,10 @@ sub parse_date { $date{'iso-8601'} = sprintf "%04d-%02d-%02dT%02d:%02d:%02dZ", 1900+$year, 1+$mon, $mday, $hour ,$min, $sec; - $tz =~ m/^([+\-][0-9][0-9])([0-9][0-9])$/; - my $local = $epoch + ((int $1 + ($2/60)) * 3600); + my ($tz_sign, $tz_hour, $tz_min) = + ($tz =~ m/^([+\-])([0-9]{2})([0-9]{2})$/); + $tz_sign = ($tz_sign eq '-' ? -1 : +1); + my $local = $epoch + $tz_sign*($tz_hour*3600 + $tz_min*60); ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday) = gmtime($local); $date{'hour_local'} = $hour; $date{'minute_local'} = $min; -- 1.7.3 ^ permalink raw reply related [flat|nested] 36+ messages in thread
* Re: [PATCH (BUGFIX)] gitweb: Fix handling of fractional timezones in parse_date 2011-03-25 16:26 ` Kevin Cernekee 2011-03-25 16:50 ` [PATCH (BUGFIX) v2] " Jakub Narebski @ 2011-03-25 17:15 ` Junio C Hamano 2011-03-25 17:47 ` Jakub Narebski 2011-03-25 19:20 ` [PATCH (BUGFIX) v3] " Jakub Narebski 1 sibling, 2 replies; 36+ messages in thread From: Junio C Hamano @ 2011-03-25 17:15 UTC (permalink / raw) To: Kevin Cernekee; +Cc: Jakub Narebski, John 'Warthog9' Hawley, git Kevin Cernekee <cernekee@gmail.com> writes: > It's just a matter of personal preference, but I would find this > regexp slightly easier to read: > > + ($tz =~ m/^([+\-])([0-9]{2})([0-9]{2})$/); I'd say "^([-+])(\d\d)(\d\d)$" makes it the most clear. >> + $tz_sign = ($tz_sign eq '-' ? -1 : +1); >> + my $local = $epoch + $tz_sign*($tz_hour + ($tz_min/60.0))*3600; > > If you wanted to avoid floats, you could do something like: > > + my $local = $epoch + $tz_sign * ($tz_hour * 3600 + $tz_min * 60); That is not just float-avoidance, but is much more logical. (($h * 60) + $m) * 60 may be even more logical and more readable, though. Care to re-roll the patch? ^ permalink raw reply [flat|nested] 36+ messages in thread
* Re: [PATCH (BUGFIX)] gitweb: Fix handling of fractional timezones in parse_date 2011-03-25 17:15 ` [PATCH (BUGFIX)] " Junio C Hamano @ 2011-03-25 17:47 ` Jakub Narebski 2011-03-25 19:20 ` [PATCH (BUGFIX) v3] " Jakub Narebski 1 sibling, 0 replies; 36+ messages in thread From: Jakub Narebski @ 2011-03-25 17:47 UTC (permalink / raw) To: Junio C Hamano; +Cc: Kevin Cernekee, John 'Warthog9' Hawley, git Junio C Hamano wrote: > Kevin Cernekee <cernekee@gmail.com> writes: > > > It's just a matter of personal preference, but I would find this > > regexp slightly easier to read: > > > > + ($tz =~ m/^([+\-])([0-9]{2})([0-9]{2})$/); > > I'd say "^([-+])(\d\d)(\d\d)$" makes it the most clear. But what does 'digit character' mean? Is "\d" Unicode-aware, because if it is it might match other digits than 0-9? #perl says: <rindolf> ShadeHawk: hi. <rindolf> ShadeHawk: \d matches Unicode digits in unicode contexts I think. <rindolf> ShadeHawk: like the ones used for Written Arabic. <rindolf> ShadeHawk: let's see. <rindolf> perlbot: eval: ["٣" =~ /\d/ ? "Match" : "Nomatch"] <perlbot> rindolf: ["Match"] <rindolf> Yay! <rindolf> That's three in http://en.wikipedia.org/wiki/Hindu%E2%80%93Arabic_numeral_system Anyway gitweb uses \d in various regexps, so it shouldn't be worse than it is now. [...] > Care to re-roll the patch? Will do. -- Jakub Narebski ShadeHawk on #git and #perl Poland ^ permalink raw reply [flat|nested] 36+ messages in thread
* [PATCH (BUGFIX) v3] gitweb: Fix handling of fractional timezones in parse_date 2011-03-25 17:15 ` [PATCH (BUGFIX)] " Junio C Hamano 2011-03-25 17:47 ` Jakub Narebski @ 2011-03-25 19:20 ` Jakub Narebski 1 sibling, 0 replies; 36+ messages in thread From: Jakub Narebski @ 2011-03-25 19:20 UTC (permalink / raw) To: Junio C Hamano; +Cc: Kevin Cernekee, John 'Warthog9' Hawley, git Fractional timezones, like -0330 (NST used in Canada) or +0430 (Afghanistan, Iran DST), were not handled properly in parse_date; this means values such as 'minute_local' and 'iso-tz' were not generated correctly. This was caused by two mistakes: * sign of timezone was applied only to hour part of offset, and not as it should be also to minutes part (this affected only negative fractional timezones). * 'int $h + $m/60' is 'int($h + $m/60)' and not 'int($h) + $m/60', so fractional part was discarded altogether ($h is hours, $m is minutes, which is always less than 60). Note that positive fractional timezones +0430, +0530 and +1030 can be found as authortime in git.git repository itself. For example http://repo.or.cz/w/git.git/commit/88d50e7 had authortime of "Fri, 8 Jan 2010 18:48:07 +0000 (23:48 +0530)", which is not marked with 'atnight', when "git show 88d50e7" gives correct author date of "Sat Jan 9 00:18:07 2010 +0530". Signed-off-by: Jakub Narebski <jnareb@gmail.com> --- Junio C Hamano wrote: > Kevin Cernekee <cernekee@gmail.com> writes: > > > It's just a matter of personal preference, but I would find this > > regexp slightly easier to read: > > > > + ($tz =~ m/^([+\-])([0-9]{2})([0-9]{2})$/); > > I'd say "^([-+])(\d\d)(\d\d)$" makes it the most clear. > > > > + $tz_sign = ($tz_sign eq '-' ? -1 : +1); > > > + my $local = $epoch + $tz_sign*($tz_hour + ($tz_min/60.0))*3600; > > > > If you wanted to avoid floats, you could do something like: > > > > + my $local = $epoch + $tz_sign * ($tz_hour * 3600 + $tz_min * 60); > > That is not just float-avoidance, but is much more logical. > > (($h * 60) + $m) * 60 > > may be even more logical and more readable, though. > > Care to re-roll the patch? Re-rolled. gitweb/gitweb.perl | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl index 0178633..ee69ea6 100755 --- a/gitweb/gitweb.perl +++ b/gitweb/gitweb.perl @@ -2921,8 +2921,10 @@ sub parse_date { $date{'iso-8601'} = sprintf "%04d-%02d-%02dT%02d:%02d:%02dZ", 1900+$year, 1+$mon, $mday, $hour ,$min, $sec; - $tz =~ m/^([+\-][0-9][0-9])([0-9][0-9])$/; - my $local = $epoch + ((int $1 + ($2/60)) * 3600); + my ($tz_sign, $tz_hour, $tz_min) = + ($tz =~ m/^([-+])(\d\d)(\d\d)$/); + $tz_sign = ($tz_sign eq '-' ? -1 : +1); + my $local = $epoch + $tz_sign*((($tz_hour*60) + $tz_min)*60); ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday) = gmtime($local); $date{'hour_local'} = $hour; $date{'minute_local'} = $min; -- 1.7.3 ^ permalink raw reply related [flat|nested] 36+ messages in thread
* Re: [PATCH 1/2] gitweb: rename parse_date() to format_date() 2011-03-19 5:39 [PATCH 1/2] gitweb: rename parse_date() to format_date() Kevin Cernekee 2011-03-19 5:39 ` [PATCH v4 2/2] gitweb: introduce localtime feature Kevin Cernekee @ 2011-03-19 10:33 ` Jakub Narebski 2011-03-19 11:50 ` Jon Seymour 2011-03-19 18:00 ` Junio C Hamano 2 siblings, 1 reply; 36+ messages in thread From: Jakub Narebski @ 2011-03-19 10:33 UTC (permalink / raw) To: Kevin Cernekee; +Cc: Junio C Hamano, git On Sat, 19 Mar 2011, Kevin Cernekee wrote: > One might reasonably expect a function named parse_date() to be used > for something along these lines: > > $unix_time_t = parse_date("2011-03-19"); First, one would expect parse_date() to return either list of year, month, etc., e.g. [2011, 3, 19, ...], or a hash with named date fragments, e.g. {'year' => 2011, 'month' => 3, ...}. Almost all other parse_* subroutines in gitweb (parse_commit, parse_tag, parse_difftree_raw_line, parse_ls_tree_line, with the sole exception of parse_from_to_diffinfo with perhaps a bit misleading name) return hash of parsed and pre-formatted fragments. So if parse_date(1300505805) returned ( 'hour' => 3, 'minute' => 36, ... ) _without_ the 'rfc2822', 'mday-time' (unused), 'iso-8601', 'iso-tz', it would be not misnamed parse_*. Second, it is _date_ because it parses / processes dates in git internal format. Perhaps it should be called *_raw_date, or *_git_date, or *_epoch, or *_timestamp and not *_date. > But instead, gitweb's parse_date works more like: > > &parse_date(1300505805) = { Note: parse_date takes second argument, which is numeric timezone (defaults to '-0000'), so one usually uses parse_date(1300505805, '+0200') > 'hour' => 3, > 'minute' => 36, > ... > 'rfc2822' => 'Sat, 19 Mar 2011 03:36:45 +0000', > ... > } What I would like to see is to split parsing date from generating formatted dates into e.g. parse_date and formatted_date, and replace calls to parse_date with calls to formatted_date (which uses parse_date internally). > Rename the function [to format_date] to improve clarity. > No change to functionality. But name *format_date* is _not_ a good name. All other format_* subroutines in gitweb return _formatted string_, not a hash which contains many formatted strings. It is hard to come up with really good name, but perhaps one from the ;ist below would be good idea: - formatted_date - process_date, process_raw_date, process_git_date - process_epoch, process_timestamp - date_formats - from_epoch, date_from_epoch Any other ideas? > Signed-off-by: Kevin Cernekee <cernekee@gmail.com> > --- > gitweb/gitweb.perl | 18 +++++++++--------- > 1 files changed, 9 insertions(+), 9 deletions(-) > @@ -4906,7 +4906,7 @@ sub git_log_body { > next if !%co; > my $commit = $co{'id'}; > my $ref = format_ref_marker($refs, $commit); > - my %ad = parse_date($co{'author_epoch'}); > + my %ad = format_date($co{'author_epoch'}); > git_print_header_div('commit', > "<span class=\"age\">$co{'age_string'}</span>" . > esc_html($co{'title'}) . $ref, Hmm, we should probably fix it so it reads - my %ad = parse_date($co{'author_epoch'}); + my %ad = formatted_date($co{'author_epoch'}, $co{'author_tz'}); Especially when preparing for 'localtime' feature. > @@ -7064,7 +7064,7 @@ sub git_feed { > if (defined($commitlist[0])) { > %latest_commit = %{$commitlist[0]}; > my $latest_epoch = $latest_commit{'committer_epoch'}; > - %latest_date = parse_date($latest_epoch); > + %latest_date = format_date($latest_epoch); > my $if_modified = $cgi->http('IF_MODIFIED_SINCE'); > if (defined $if_modified) { > my $since; Similarly here. > @@ -7195,7 +7195,7 @@ XML > if (($i >= 20) && ((time - $co{'author_epoch'}) > 48*60*60)) { > last; > } > - my %cd = parse_date($co{'author_epoch'}); > + my %cd = format_date($co{'author_epoch'}); > > # get list of changed files > open my $fd, "-|", git_cmd(), "diff-tree", '-r', @diff_opts, Same here. -- Jakub Narebski Poland ^ permalink raw reply [flat|nested] 36+ messages in thread
* Re: [PATCH 1/2] gitweb: rename parse_date() to format_date() 2011-03-19 10:33 ` [PATCH 1/2] gitweb: rename parse_date() to format_date() Jakub Narebski @ 2011-03-19 11:50 ` Jon Seymour 0 siblings, 0 replies; 36+ messages in thread From: Jon Seymour @ 2011-03-19 11:50 UTC (permalink / raw) To: Jakub Narebski; +Cc: Kevin Cernekee, Junio C Hamano, git On Sat, Mar 19, 2011 at 9:33 PM, Jakub Narebski <jnareb@gmail.com> wrote: > On Sat, 19 Mar 2011, Kevin Cernekee wrote: > > - formatted_date > - process_date, process_raw_date, process_git_date > - process_epoch, process_timestamp > - date_formats > - from_epoch, date_from_epoch > How about: decompose_date? jon. ^ permalink raw reply [flat|nested] 36+ messages in thread
* Re: [PATCH 1/2] gitweb: rename parse_date() to format_date() 2011-03-19 5:39 [PATCH 1/2] gitweb: rename parse_date() to format_date() Kevin Cernekee 2011-03-19 5:39 ` [PATCH v4 2/2] gitweb: introduce localtime feature Kevin Cernekee 2011-03-19 10:33 ` [PATCH 1/2] gitweb: rename parse_date() to format_date() Jakub Narebski @ 2011-03-19 18:00 ` Junio C Hamano 2 siblings, 0 replies; 36+ messages in thread From: Junio C Hamano @ 2011-03-19 18:00 UTC (permalink / raw) To: Kevin Cernekee; +Cc: Jakub Narebski, git Kevin Cernekee <cernekee@gmail.com> writes: > One might reasonably expect a function named parse_date() to be used > for something along these lines: > > $unix_time_t = parse_date("2011-03-19"); > > But instead, gitweb's parse_date works more like: > > &parse_date(1300505805) = { > 'hour' => 3, > 'minute' => 36, > ... > 'rfc2822' => 'Sat, 19 Mar 2011 03:36:45 +0000', > ... > } > > Rename the function to improve clarity. No change to functionality. Except for a small detail that the function also takes the "-0800" timezone string, I think this is a good change. The word "parse" makes the readers expect that its input is something "format" would have produced for use by others (often humans, but there are functions that parse xml ;-). ^ permalink raw reply [flat|nested] 36+ messages in thread
end of thread, other threads:[~2011-03-25 19:21 UTC | newest] Thread overview: 36+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2011-03-19 5:39 [PATCH 1/2] gitweb: rename parse_date() to format_date() Kevin Cernekee 2011-03-19 5:39 ` [PATCH v4 2/2] gitweb: introduce localtime feature Kevin Cernekee 2011-03-19 15:18 ` Jakub Narebski 2011-03-19 17:56 ` Junio C Hamano 2011-03-19 19:49 ` Kevin Cernekee 2011-03-19 21:09 ` Jakub Narebski 2011-03-19 21:22 ` Kevin Cernekee 2011-03-19 21:41 ` Jakub Narebski 2011-03-20 22:38 ` J.H. 2011-03-20 23:44 ` Kevin Cernekee 2011-03-21 0:20 ` Jakub Narebski 2011-03-21 2:35 ` J.H. 2011-03-21 16:01 ` Jakub Narebski 2011-03-21 18:39 ` Piotr Krukowiecki 2011-03-21 18:39 ` J.H. 2011-03-21 22:20 ` Jakub Narebski 2011-03-24 0:08 ` [PATCH 0/1] Gitweb: Change timezone John 'Warthog9' Hawley 2011-03-24 0:08 ` [PATCH 1/1] gitweb: javascript ability to adjust time based on timezone John 'Warthog9' Hawley 2011-03-24 5:23 ` Kevin Cernekee 2011-03-24 7:21 ` J.H. 2011-03-24 21:23 ` Jakub Narebski 2011-03-24 20:19 ` Jakub Narebski 2011-03-24 22:00 ` Kevin Cernekee 2011-03-24 22:29 ` J.H. 2011-03-24 23:04 ` J.H. 2011-03-24 23:36 ` Jakub Narebski 2011-03-24 15:17 ` Jakub Narebski 2011-03-25 15:20 ` [PATCH (BUGFIX)] gitweb: Fix handling of fractional timezones in parse_date Jakub Narebski 2011-03-25 16:26 ` Kevin Cernekee 2011-03-25 16:50 ` [PATCH (BUGFIX) v2] " Jakub Narebski 2011-03-25 17:15 ` [PATCH (BUGFIX)] " Junio C Hamano 2011-03-25 17:47 ` Jakub Narebski 2011-03-25 19:20 ` [PATCH (BUGFIX) v3] " Jakub Narebski 2011-03-19 10:33 ` [PATCH 1/2] gitweb: rename parse_date() to format_date() Jakub Narebski 2011-03-19 11:50 ` Jon Seymour 2011-03-19 18:00 ` Junio C Hamano
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 NNTP newsgroup(s).