X-Git-Url: https://git.chrismorgan.info/gitweb/blobdiff_plain/c36a795cb6b387c7bb8ddf103b71d937480c4d21..909abc487e06381c85e05dd6e0136ff5818f6be5:/gitweb.cgi
diff --git a/gitweb.cgi b/gitweb.cgi
index 515d80c..93c8484 100755
--- a/gitweb.cgi
+++ b/gitweb.cgi
@@ -519,18 +519,6 @@ our %feature = (
 		'override' => 0,
 		'default' => [0]},
 
-	# Enable and configure ability to change common timezone for dates
-	# in gitweb output via JavaScript.  Enabled by default.
-	# Project specific override is not supported.
-	'javascript-timezone' => {
-		'override' => 0,
-		'default' => [
-			'local',     # default timezone: 'utc', 'local', or '(-|+)HHMM' format,
-			             # or undef to turn off this feature
-			'gitweb_tz', # name of cookie where to store selected timezone
-			'datetime',  # CSS class used to mark up dates for manipulation
-		]},
-
 	# Syntax highlighting support. This is based on Daniel Svensson's
 	# and Sham Chukoury's work in gitweb-xmms2.git.
 	# It requires the 'highlight' program present in $PATH,
@@ -1874,7 +1862,7 @@ sub esc_html_hl_regions {
 
 		$out .= esc_html(substr($str, $pos, $begin - $pos), %opts)
 			if ($begin - $pos > 0);
-		$out .= $cgi->span({-class => $css_class}, $escaped);
+		$out .= "$escaped ";
 
 		$pos = $end;
 	}
@@ -1904,7 +1892,7 @@ sub esc_html_match_hl {
 	my @matches = matchpos_list($str, $regexp);
 	return esc_html($str) unless @matches;
 
-	return esc_html_hl_regions($str, 'match', @matches);
+	return esc_html_hl_regions($str, undef, @matches);
 }
 
 
@@ -1936,7 +1924,7 @@ sub esc_html_match_hl_chopped {
 		push @filtered, $m;
 	}
 
-	return esc_html_hl_regions($chopped . $tail, 'match', @filtered);
+	return esc_html_hl_regions($chopped . $tail, undef, @filtered);
 }
 
 ## ----------------------------------------------------------------------
@@ -3044,7 +3032,7 @@ sub git_populate_project_tagcloud {
 			$title =~ s/^/ /g;
 			$title =~ s/$/ /g;
 			if (defined $matched && $matched eq $ctag) {
-				$title = qq($title );
+				$title = qq($title );
 			}
 			$cloud->add($title, href(project=>undef, ctag=>$ctag),
 			            $ctags_lc{$ctag}->{count});
@@ -3054,7 +3042,7 @@ sub git_populate_project_tagcloud {
 		foreach my $ctag (keys %ctags_lc) {
 			my $title = esc_html($ctags_lc{$ctag}->{topname}, -nbsp=>1);
 			if (defined $matched && $matched eq $ctag) {
-				$title = qq($title );
+				$title = qq($title );
 			}
 			$cloud->{$ctag}{count} = $ctags_lc{$ctag}->{count};
 			$cloud->{$ctag}{ctag} =
@@ -3594,12 +3582,13 @@ sub parse_commit_text {
 	$co{'age'} = $age;
 	$co{'age_string'} = age_string($age);
 	my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday) = gmtime($co{'committer_epoch'});
+	$co{'age_string_iso8601'} = sprintf "%4i-%02u-%02i %02u:%02u:%02uZ", 1900 + $year, $mon+1, $mday, $hour, $min, $sec;
 	if ($age > 60*60*24*7*2) {
 		$co{'age_string_date'} = sprintf "%4i-%02u-%02i", 1900 + $year, $mon+1, $mday;
-		$co{'age_string_age'} = $co{'age_string'};
+		$co{'age_string_age'} = "$co{'age_string_iso8601'} ($co{'age_string'})";
 	} else {
 		$co{'age_string_date'} = $co{'age_string'};
-		$co{'age_string_age'} = sprintf "%4i-%02u-%02i", 1900 + $year, $mon+1, $mday;
+		$co{'age_string_age'} = $co{'age_string_iso8601'};
 	}
 	return %co;
 }
@@ -4097,11 +4086,11 @@ sub print_feed_meta {
 	} else {
 		printf(' '."\n",
-		       esc_attr($site_name),
+		       esc_attr(to_utf8($site_name)),
 		       esc_attr(href(project=>undef, action=>"project_index")));
 		printf(' '."\n",
-		       esc_attr($site_name),
+		       esc_attr(to_utf8($site_name)),
 		       esc_attr(href(project=>undef, action=>"opml")));
 	}
 }
@@ -4134,19 +4123,24 @@ sub print_nav_breadcrumbs_path {
 		print $cgi->a({-href => href(project => undef,
 		                             project_filter => $dirprefix,
 		                             action => "project_list")},
-			      esc_html($part)) . " / ";
+			      esc_html($part)) . "/";
 	}
 }
 
 sub print_nav_breadcrumbs {
 	my %opts = @_;
+	my $sep = to_utf8("  âºÂ  ");
 
+	my $first = 1;
 	for my $crumb (@extra_breadcrumbs, [ $home_link_str => $home_link ]) {
-		print $cgi->a({-href => esc_url($crumb->[1])}, $crumb->[0]) . " / ";
+		print $sep unless $first;
+		$first = 0;
+		print $cgi->a({-href => esc_url($crumb->[1])}, $crumb->[0]);
 	}
 	if (defined $project) {
 		my @dirname = split '/', $project;
 		my $projectbasename = pop @dirname;
+		print $sep;
 		print_nav_breadcrumbs_path(@dirname);
 		print $cgi->a({-href => href(action=>"summary")}, esc_html($projectbasename));
 		if (defined $action) {
@@ -4155,13 +4149,14 @@ sub print_nav_breadcrumbs {
 				$action_print = $cgi->a({-href => href(action=>$action)},
 					$action);
 			}
-			print " / $action_print";
+			print "$sep$action_print";
 		}
 		if (defined $opts{-action_extra}) {
-			print " / $opts{-action_extra}";
+			print "$sep$opts{-action_extra}";
 		}
 		print "\n";
 	} elsif (defined $project_filter) {
+		print $sep;
 		print_nav_breadcrumbs_path(split '/', $project_filter);
 	}
 }
@@ -4318,20 +4313,13 @@ sub git_footer_html {
 		      qq!           "!. esc_attr(href()) .qq!");\n!.
 		      qq!\n!;
 	} else {
-		my ($jstimezone, $tz_cookie, $datetime_class) =
-			gitweb_get_feature('javascript-timezone');
-
-		if (gitweb_check_feature('javascript-actions') || ($jstimezone && $tz_cookie && $datetime_class)) {
+		if (gitweb_check_feature('javascript-actions')) {
 			print qq!\n!;
 			print qq!\n!;
 		}
@@ -4432,7 +4420,7 @@ sub git_print_page_nav {
 	print "
\n" .
 		(join " | ",
 		 map { $_ eq $current ?
-		       $_ : $cgi->a({-href => ($arg{$_}{_href} ? $arg{$_}{_href} : href(%{$arg{$_}}))}, "$_")
+		       $cgi->span({-class => "current"}, $_) : $cgi->a({-href => ($arg{$_}{_href} ? $arg{$_}{_href} : href(%{$arg{$_}}))}, "$_")
 		 } @navs);
 	print " \n$extra" if defined $extra; # pager or formats
 	print "
\n";
@@ -4497,7 +4485,7 @@ sub git_print_header_div {
 
 sub format_repo_url {
 	my ($name, $url) = @_;
-	return "$name $url  \n";
+	return "$name $url  \n";
 }
 
 # Group output by placing it in a DIV element and adding a header.
@@ -4540,20 +4528,8 @@ sub git_print_section {
 
 sub format_timestamp_html {
 	my $date = shift;
-	my $strtime = $date->{'rfc2822'};
 
-	my (undef, undef, $datetime_class) =
-		gitweb_get_feature('javascript-timezone');
-	if ($datetime_class) {
-		$strtime = qq!$strtime !;
-	}
-
-	my $localtime_format = '(%02d:%02d %s)';
-	$strtime .= ' ' .
-	            sprintf($localtime_format,
-	                    $date->{'hour_local'}, $date->{'minute_local'}, $date->{'tz_local'});
-
-	return $strtime;
+	return qq!$date->{'rfc2822'} !;
 }
 
 # Outputs the author name and date in long form
@@ -4878,11 +4854,11 @@ sub git_difftree_body {
 	my ($difftree, $hash, @parents) = @_;
 	my ($parent) = $parents[0];
 	my $have_blame = gitweb_check_feature('blame');
-	print "\n";
 	if ($#{$difftree} > 10) {
+		print "
\n";
 		print(($#{$difftree} + 1) . " files changed:\n");
+		print "
\n";
 	}
-	print "
 \n";
 
 	print " 1 ? "combined " : "") .
@@ -5907,13 +5883,15 @@ sub git_log_body {
 	$from = 0 unless defined $from;
 	$to = $#{$commitlist} if (!defined $to || $#{$commitlist} < $to);
 
+	print "\n";
 	for (my $i = 0; $i <= $to; $i++) {
 		my %co = %{$commitlist->[$i]};
 		next if !%co;
 		my $commit = $co{'id'};
 		my $ref = format_ref_marker($refs, $commit);
+		print "\n";
 		git_print_header_div('commit',
-		               "$co{'age_string'} " .
+		               "$co{'age_string'} " .
 		               esc_html($co{'title'}) . $ref,
 		               $commit);
 		print "\n" .
@@ -5930,7 +5908,9 @@ sub git_log_body {
 		print "
\n";
 		git_print_log($co{'comment'});
 		print "
\n";
+		print "\n";
 	}
+	print "\n";
 	if ($extra) {
 		print "
\n";
 		print "$extra\n";
@@ -5958,7 +5938,7 @@ sub git_shortlog_body {
 		}
 		$alternate ^= 1;
 		# git_summary() used print "
$co{'age_string'}  \n" .
-		print "$co{'age_string_date'}  \n" .
+		print "$co{'age_string_date'}  \n" .
 		      format_author_html('td', \%co, 10) . "";
 		print format_subject_html($co{'title'}, $co{'title_short'},
 		                          href(action=>"commit", hash=>$commit), $ref);
@@ -6007,7 +5987,7 @@ sub git_history_body {
 			print " \n";
 		}
 		$alternate ^= 1;
-		print "$co{'age_string_date'}  \n" .
+		print "$co{'age_string_date'}  \n" .
 	# shortlog:   format_author_html('td', \%co, 10)
 		      format_author_html('td', \%co, 15, 3) . "";
 		# originally git_history used chop_str($co{'title'}, 50)
@@ -6337,7 +6317,7 @@ sub git_search_changes {
 			$alternate ^= 1;
 			%co = parse_commit($set{'commit'});
 			my $author = chop_and_escape_str($co{'author_name'}, 15, 5);
-			print " $co{'age_string_date'}  \n" .
+			print "$co{'age_string_date'}  \n" .
 			      "$author  \n" .
 			      "" .
 			      $cgi->a({-href => href(action=>"commit", hash=>$co{'id'}),
@@ -6349,7 +6329,7 @@ sub git_search_changes {
 			print $cgi->a({-href => href(action=>"blob", hash_base=>$co{'id'},
 			                             hash=>$set{'to_id'}, file_name=>$set{'to_file'}),
 			              -class => "list"},
-			              "" . esc_path($set{'file'}) . " ") .
+			              "" . esc_path($set{'file'}) . " ") .
 			      " \n";
 		}
 	}
@@ -6424,9 +6404,9 @@ sub git_search_files {
 			$ltext = untabify($ltext);
 			if ($ltext =~ m/^(.*)($search_regexp)(.*)$/i) {
 				$ltext = esc_html($1, -nbsp=>1);
-				$ltext .= '';
+				$ltext .= '';
 				$ltext .= esc_html($2, -nbsp=>1);
-				$ltext .= '  ';
+				$ltext .= '';
 				$ltext .= esc_html($3, -nbsp=>1);
 			} else {
 				$ltext = esc_html($ltext, -nbsp=>1);
@@ -6471,7 +6451,7 @@ sub git_search_grep_body {
 			print "  \n";
 		}
 		$alternate ^= 1;
-		print "$co{'age_string_date'}  \n" .
+		print "$co{'age_string_date'}  \n" .
 		      format_author_html('td', \%co, 15, 5) .
 		      "" .
 		      $cgi->a({-href => href(action=>"commit", hash=>$co{'id'}),
@@ -6491,7 +6471,7 @@ sub git_search_grep_body {
 				$match = esc_html($match);
 				$trail = esc_html($trail);
 
-				print "$lead$match $trail ";
+				print "$lead$match $trail ";
 			}
 		}
 		print " \n" .
@@ -6655,51 +6635,66 @@ sub git_summary {
 
 	print "   
\n";
 
+	print("\n");
+
 	# If XSS prevention is on, we don't include README.html.
 	# TODO: Allow a readme in some safe format.
 	if (!$prevent_xss && -s "$projectroot/$project/README.html") {
+		print("\n");
 		print "readme
\n" .
 		      "\n";
 		insert_file("$projectroot/$project/README.html");
 		print "\n
\n"; # class="readme"
+		print(" \n");
 	}
 
 	# we need to request one more than 16 (0..15) to check if
 	# those 16 are all
 	my @commitlist = $head ? parse_commits($head, 17) : ();
 	if (@commitlist) {
+		print("\n");
 		git_print_header_div('shortlog');
 		git_shortlog_body(\@commitlist, 0, 15, $refs,
 		                  $#commitlist <=  15 ? undef :
 		                  $cgi->a({-href => href(action=>"shortlog")}, "..."));
+		print(" \n");
 	}
 
 	if (@taglist) {
+		print("\n");
 		git_print_header_div('tags');
 		git_tags_body(\@taglist, 0, 15,
 		              $#taglist <=  15 ? undef :
 		              $cgi->a({-href => href(action=>"tags")}, "..."));
+		print(" \n");
 	}
 
 	if (@headlist) {
+		print("\n");
 		git_print_header_div('heads');
 		git_heads_body(\@headlist, $head, 0, 15,
 		               $#headlist <= 15 ? undef :
 		               $cgi->a({-href => href(action=>"heads")}, "..."));
+		print(" \n");
 	}
 
 	if (%remotedata) {
+		print("\n");
 		git_print_header_div('remotes');
 		git_remotes_body(\%remotedata, 15, $head);
+		print(" \n");
 	}
 
 	if (@forklist) {
+		print("\n");
 		git_print_header_div('forks');
 		git_project_list_body(\@forklist, 'age', 0, 15,
 		                      $#forklist <= 15 ? undef :
 		                      $cgi->a({-href => href(action=>"forks")}, "..."),
 		                      'no_header');
+		print(" \n");
 	}
+	print(" \n");
 
 	git_footer_html();
 }
@@ -8229,7 +8224,7 @@ sub git_feed {
 	return if ($cgi->request_method() eq 'HEAD');
 
 	# header variables
-	my $title = "$site_name - $project/$action";
+	my $title = to_utf8($site_name) . " - $project/$action";
 	my $feed_type = 'log';
 	if (defined $hash) {
 		$title .= " - '$hash'";
@@ -8392,7 +8387,7 @@ sub git_opml {
 		-charset => 'utf-8',
 		-content_disposition => 'inline; filename="opml.xml"');
 
-	my $title = esc_html($site_name);
+	my $title = esc_html(to_utf8($site_name));
 	my $filter = " within subdirectory ";
 	if (defined $project_filter) {
 		$filter .= esc_html($project_filter);