X-Git-Url: https://git.chrismorgan.info/gitweb/blobdiff_plain/a21510b946408b22da99ab135f676e9972ca9455..5166394508950033584da34385aa24f9065b7a60:/gitweb.cgi diff --git a/gitweb.cgi b/gitweb.cgi index f8d82f7..ef15a70 100755 --- a/gitweb.cgi +++ b/gitweb.cgi @@ -887,7 +887,6 @@ our %actions = ( "patch" => \&git_patch, "patches" => \&git_patches, "remotes" => \&git_remotes, - "rss" => \&git_rss, "atom" => \&git_atom, "search" => \&git_search, "search_help" => \&git_search_help, @@ -907,7 +906,7 @@ our %actions = ( # finally, we have the hash of allowed extra_options for the commands that # allow them our %allowed_options = ( - "--no-merges" => [ qw(rss atom log shortlog history) ], + "--no-merges" => [ qw(atom log shortlog history) ], ); # fill %input_params with the CGI parameters. All values except for 'opt' @@ -4027,40 +4026,36 @@ sub run_highlighter { ## functions printing HTML: header, footer, error page sub get_page_title { - my $title = to_utf8($site_name); - + # Formats: + # SITE_NAME + # SITE_NAME - projects in FILTER + # PROJECT - SITE_NAME + # PROJECT ACTION - SITE_NAME + # FILENAME - PROJECT ACTION - SITE_NAME + my $title; unless (defined $project) { + $title = to_utf8($site_name); if (defined $project_filter) { $title .= " - projects in '" . esc_path($project_filter) . "'"; } return $title; } - $title .= " - " . to_utf8($project); - - return $title unless (defined $action); - $title .= "/$action"; # $action is US-ASCII (7bit ASCII) + $title = to_utf8($project); - return $title unless (defined $file_name); - $title .= " - " . esc_path($file_name); - if ($action eq "tree" && $file_name !~ m|/$|) { - $title .= "/"; + if (defined $action) { + $title .= " $action"; # $action is US-ASCII (7bit ASCII) + if (defined $file_name) { + $title = " - " . $title; + if ($action eq "tree" && $file_name !~ m|/$|) { + $title = "/" . $title; + } + $title = esc_path($file_name) . $title; + } } - return $title; -} + $title .= " - " . to_utf8($site_name); -sub get_content_type_html { - # require explicit support from the UA if we are to send the page as - # 'application/xhtml+xml', otherwise send it as plain old 'text/html'. - # we have to do this because MSIE sometimes globs '*/*', pretending to - # support xhtml+xml but choking when it gets what it asked for. - if (defined $cgi->http('HTTP_ACCEPT') && - $cgi->http('HTTP_ACCEPT') =~ m/(,|;|\s|^)application\/xhtml\+xml(,|;|\s|$)/ && - $cgi->Accept('application/xhtml+xml') != 0) { - return 'application/xhtml+xml'; - } else { - return 'text/html'; - } + return $title; } sub print_feed_meta { @@ -4070,7 +4065,7 @@ sub print_feed_meta { $href_params{'-title'} = 'log'; } - foreach my $format (qw(RSS Atom)) { + foreach my $format (qw(Atom)) { my $type = lc($format); my %link_attr = ( '-rel' => 'alternate', @@ -4117,17 +4112,17 @@ sub print_header_links { # print out each stylesheet that exist, providing backwards capability # for those people who defined $stylesheet in a config file if (defined $stylesheet) { - print ''."\n"; + print ''."\n"; } else { foreach my $stylesheet (@stylesheets) { next unless $stylesheet; - print ''."\n"; + print ''."\n"; } } print_feed_meta() if ($status eq '200 OK'); if (defined $favicon) { - print qq(\n); + print qq(\n); } } @@ -4188,8 +4183,7 @@ sub print_search_form { if ($use_pathinfo) { $action .= "/".esc_url($project); } - print $cgi->start_form(-method => "get", -action => $action) . - "
\n" . + print $cgi->start_form(-method => "get", -action => $action, -role => "search") . (!$use_pathinfo && $cgi->input({-name=>"p", -value=>$project, -type=>"hidden"}) . "\n") . $cgi->input({-name=>"a", -value=>"search", -type=>"hidden"}) . "\n" . @@ -4203,7 +4197,6 @@ sub print_search_form { $cgi->checkbox(-name => 'sr', -value => 1, -label => 're', -checked => $search_use_regexp) . "" . - "
" . $cgi->end_form() . "\n"; } @@ -4213,27 +4206,25 @@ sub git_header_html { my %opts = @_; my $title = get_page_title(); - my $content_type = get_content_type_html(); - print $cgi->header(-type=>$content_type, -charset => 'utf-8', + # I wanted to switch to text/html, but it uses nested in a couple of places (e.g. log refs are links inside the commit summary link), which is invalid but works in the XML syntax. Pity. + # (Various other invalid HTML is produced that HTML would have fixed but XHTML allows to be broken, like table > tr, lacking tbody.) + # TODO: reduce the doctype to , but that takes replacing entities like ⋅ with ⋅. + print $cgi->header(-type => 'application/xhtml+xml', -charset => 'utf-8', -status=> $status, -expires => $expires) unless ($opts{'-no_http_header'}); - my $mod_perl_version = $ENV{'MOD_PERL'} ? " $ENV{'MOD_PERL'}" : ''; print < - - - + - - + $title EOF # the stylesheet, favicon etc urls won't work correctly with path_info # unless we set the appropriate base URL if ($ENV{'PATH_INFO'}) { - print "\n"; + print "\n"; } print_header_links($status); @@ -4241,14 +4232,11 @@ EOF print to_utf8($site_html_head_string); } - print "\n" . - "\n"; - if (defined $site_header && -f $site_header) { insert_file($site_header); } - print "
\n"; + print "\n\n
\n"; if (defined $logo) { print $cgi->a({-href => esc_url($logo_url), -title => $logo_label}, @@ -4258,18 +4246,23 @@ EOF -class => "logo"})); } print_nav_breadcrumbs(%opts); - print "
\n"; + print "\n"; + print "\n"; } sub git_footer_html { my $feed_class = 'rss_logo'; - print "
\n"; + print "
\n"; if (defined $project) { my $descr = git_get_project_description($project); if (defined $descr) { @@ -4282,7 +4275,7 @@ sub git_footer_html { } $href_params{'-title'} ||= 'log'; - foreach my $format (qw(RSS Atom)) { + foreach my $format (qw(Atom)) { $href_params{'action'} = lc($format); print $cgi->a({-href => href(%href_params), -title => "$href_params{'-title'} $format feed", @@ -4297,7 +4290,7 @@ sub git_footer_html { project_filter => $project_filter), -class => $feed_class}, "TXT") . "\n"; } - print "
\n"; # class="page_footer" + print "\n"; # class="page_footer" if (defined $t0 && gitweb_check_feature('timed')) { print "
\n"; @@ -4310,7 +4303,7 @@ sub git_footer_html { $number_of_git_cmds. ' git commands '. " to generate.\n"; - print "
\n"; # class="page_footer" + print "\n"; } if (defined $site_footer && -f $site_footer) { @@ -4372,6 +4365,7 @@ sub die_error { 503 => '503 Service Unavailable', ); git_header_html($http_responses{$status}, undef, %opts); + git_end_subhead_html(); print <

@@ -4394,7 +4388,6 @@ EOF sub git_print_page_nav { my ($current, $suppress, $head, $treehead, $treebase, $extra) = @_; - $extra = '' if !defined $extra; # pager or formats my @navs = qw(summary shortlog log commit commitdiff tree); if ($suppress) { @@ -4438,8 +4431,9 @@ sub git_print_page_nav { map { $_ eq $current ? $_ : $cgi->a({-href => ($arg{$_}{_href} ? $arg{$_}{_href} : href(%{$arg{$_}}))}, "$_") } @navs); - print "
\n$extra
\n" . - "\n"; + print "
\n$extra" if defined $extra; # pager or formats + print "\n"; + git_end_subhead_html(); } # returns a submenu for the navigation of the refs views (tags, heads, @@ -4589,7 +4583,7 @@ sub git_print_authorship_rows { @people = ('author', 'committer') unless @people; foreach my $who (@people) { my %wd = parse_date($co->{"${who}_epoch"}, $co->{"${who}_tz"}); - print "$who" . + print "$who" . format_search_author($co->{"${who}_name"}, $who, esc_html($co->{"${who}_name"})) . " " . format_search_author($co->{"${who}_email"}, $who, @@ -6445,8 +6439,8 @@ sub git_search_files { } print "
" . $cgi->a({-href => $file_href.'#l'.$lno, - -class => "linenr"}, sprintf('%4i', $lno)) . - ' ' . $ltext . "
\n"; + -class => "linenr"}, sprintf('%4i ', $lno)) . + $ltext . "\n"; } } if ($lastfile) { @@ -6540,6 +6534,7 @@ sub git_project_list { } git_header_html(); + git_end_subhead_html(); if (defined $home_text && -f $home_text) { print "
\n"; insert_file($home_text); @@ -6629,14 +6624,13 @@ sub git_summary { git_header_html(); git_print_page_nav('summary','', $head); - print "
 
\n"; print "\n" . - "\n"; + "\n"; if ($owner and not $omit_owner) { - print "\n"; + print "\n"; } if (defined $cd{'rfc2822'}) { - print "" . + print "" . "\n"; } @@ -6659,7 +6653,7 @@ sub git_summary { # without ability to add tags, don't show if there are none my $cloud = git_populate_project_tagcloud($ctags); print "" . - "" . + "" . "" . "\n"; } @@ -6730,7 +6724,7 @@ sub git_tag { print "
\n" . "
description" . esc_html($descr) . "
description" . esc_html($descr) . "
owner" . esc_html($owner) . "
owner" . esc_html($owner) . "
last change
last change".format_timestamp_html(\%cd)."
content tagscontent tags".git_show_project_tagcloud($cloud, 48)."
\n" . "\n" . - "\n" . + "\n" . "\n" . "
objectobject" . $cgi->a({-class => "list", -href => href(action=>$tag{'type'}, hash=>$tag{'object'})}, $tag{'object'}) . "" . $cgi->a({-href => href(action=>$tag{'type'}, hash=>$tag{'object'})}, @@ -7178,9 +7172,8 @@ sub git_blob { git_print_page_nav('','', $hash_base,$co{'tree'},$hash_base, $formats_nav); git_print_header_div('commit', esc_html($co{'title'}), $hash_base); } else { - print "
\n" . - "

\n" . - "
".esc_html($hash)."
\n"; + git_end_subhead_html(); + print "
".esc_html($hash)."
\n"; } git_print_page_path($file_name, "blob", $hash_base); print "
\n"; @@ -7199,7 +7192,7 @@ sub git_blob { chomp $line; $nr++; $line = untabify($line); - printf qq!
%4i %s
\n!, + printf qq!\n!, $nr, esc_attr(href(-replay => 1)), $nr, $nr, $highlight ? sanitize($line) : esc_html($line, -nbsp=>1); } @@ -7261,8 +7254,7 @@ sub git_tree { git_print_header_div('commit', esc_html($co{'title'}) . $ref, $hash_base); } else { undef $hash_base; - print "
\n"; - print "

\n"; + git_end_subhead_html(); print "
".esc_html($hash)."
\n"; } if (defined $file_name) { @@ -7609,9 +7601,9 @@ sub git_commit { print "
\n" . "\n"; git_print_authorship_rows(\%co); - print "\n"; + print "\n"; print "" . - "" . + "" . "" . - "" . + "" . "
commit$co{'id'}
commit$co{'id'}
treetree" . $cgi->a({-href => href(action=>"tree", hash=>$co{'tree'}, hash_base=>$hash), class => "list"}, $co{'tree'}) . @@ -7628,7 +7620,7 @@ sub git_commit { foreach my $par (@$parents) { print "
parentparent" . $cgi->a({-href => href(action=>"commit", hash=>$par), class => "list"}, $par) . @@ -7786,7 +7778,8 @@ sub git_blobdiff { git_print_page_nav('','', $hash_base,$co{'tree'},$hash_base, $formats_nav); git_print_header_div('commit', esc_html($co{'title'}), $hash_base); } else { - print "

$formats_nav
\n"; + print "

$formats_nav
\n"; + git_end_subhead_html(); print "
".esc_html("$hash vs $hash_parent")."
\n"; } if (defined $file_name) { @@ -8202,15 +8195,14 @@ sub git_shortlog { } ## ...................................................................... -## feeds (RSS, Atom; OPML) +## feeds (Atom; OPML) sub git_feed { my $format = shift || 'atom'; my $have_blame = gitweb_check_feature('blame'); # Atom: http://www.atomenabled.org/developers/syndication/ - # RSS: http://www.notestips.com/80256B3A007F2692/1/NAMO5P9UPQ - if ($format ne 'rss' && $format ne 'atom') { + if ($format ne 'atom') { die_error(400, "Unknown web feed format"); } @@ -8262,9 +8254,7 @@ sub git_feed { if (defined $descr) { $descr = esc_html($descr); } else { - $descr = "$project " . - ($format eq 'rss' ? 'RSS' : 'Atom') . - " feed"; + $descr = "$project Atom feed"; } my $owner = git_get_project_owner($project); $owner = esc_html($owner); @@ -8280,60 +8270,32 @@ sub git_feed { } $alt_url = esc_attr($alt_url); print qq!\n!; - if ($format eq 'rss') { - print < - -XML - print "$title\n" . - "$alt_url\n" . - "$descr\n" . - "en\n" . - # project owner is responsible for 'editorial' content - "$owner\n"; - if (defined $logo || defined $favicon) { - # prefer the logo to the favicon, since RSS - # doesn't allow both - my $img = esc_url($logo || $favicon); - print "\n" . - "$img\n" . - "$title\n" . - "$alt_url\n" . - "\n"; - } - if (%latest_date) { - print "$latest_date{'rfc2822'}\n"; - print "$latest_date{'rfc2822'}\n"; - } - print "gitweb v.$version/$git_version\n"; - } elsif ($format eq 'atom') { - print < XML - print "$title\n" . - "$descr\n" . - '' . "\n" . - '' . "\n" . - "" . esc_url(href(-full=>1)) . "\n" . - # use project owner for feed author - "$owner\n"; - if (defined $favicon) { - print "" . esc_url($favicon) . "\n"; - } - if (defined $logo) { - # not twice as wide as tall: 72 x 27 pixels - print "" . esc_url($logo) . "\n"; - } - if (! %latest_date) { - # dummy date to keep the feed valid until commits trickle in: - print "1970-01-01T00:00:00Z\n"; - } else { - print "$latest_date{'iso-8601'}\n"; - } - print "gitweb\n"; + print "$title\n" . + "$descr\n" . + '' . "\n" . + '' . "\n" . + "" . esc_url(href(-full=>1)) . "\n" . + # use project owner for feed author + "$owner\n"; + if (defined $favicon) { + print "" . esc_url($favicon) . "\n"; + } + if (defined $logo) { + # not twice as wide as tall: 72 x 27 pixels + print "" . esc_url($logo) . "\n"; } + if (! %latest_date) { + # dummy date to keep the feed valid until commits trickle in: + print "1970-01-01T00:00:00Z\n"; + } else { + print "$latest_date{'iso-8601'}\n"; + } + print "gitweb\n"; # contents for (my $i = 0; $i <= $#commitlist; $i++) { @@ -8356,39 +8318,27 @@ XML # print element (entry, item) my $co_url = href(-full=>1, action=>"commitdiff", hash=>$commit); - if ($format eq 'rss') { - print "\n" . - "" . esc_html($co{'title'}) . "\n" . - "" . esc_html($co{'author'}) . "\n" . - "$cd{'rfc2822'}\n" . - "$co_url\n" . - "" . esc_html($co_url) . "\n" . - "" . esc_html($co{'title'}) . "\n" . - "" . - "\n" . - "" . esc_html($co{'title'}) . "\n" . - "$cd{'iso-8601'}\n" . - "\n" . - " " . esc_html($co{'author_name'}) . "\n"; - if ($co{'author_email'}) { - print " " . esc_html($co{'author_email'}) . "\n"; - } - print "\n" . - # use committer for contributor - "\n" . - " " . esc_html($co{'committer_name'}) . "\n"; - if ($co{'committer_email'}) { - print " " . esc_html($co{'committer_email'}) . "\n"; - } - print "\n" . - "$cd{'iso-8601'}\n" . - "\n" . - "" . esc_html($co_url) . "\n" . - "\n" . - "
\n"; - } + print "\n" . + "" . esc_html($co{'title'}) . "\n" . + "$cd{'iso-8601'}\n" . + "\n" . + " " . esc_html($co{'author_name'}) . "\n"; + if ($co{'author_email'}) { + print " " . esc_html($co{'author_email'}) . "\n"; + } + print "\n" . + # use committer for contributor + "\n" . + " " . esc_html($co{'committer_name'}) . "\n"; + if ($co{'committer_email'}) { + print " " . esc_html($co{'committer_email'}) . "\n"; + } + print "\n" . + "$cd{'iso-8601'}\n" . + "\n" . + "" . esc_html($co_url) . "\n" . + "\n" . + "
\n"; my $comment = $co{'comment'}; print "
\n";
 		foreach my $line (@$comment) {
@@ -8424,27 +8374,13 @@ XML
 			print "] ".
 			      "$file\n";
 		}
-		if ($format eq 'rss') {
-			print "]]>\n" .
-			      "\n" .
-			      "\n";
-		} elsif ($format eq 'atom') {
-			print "\n
\n" . - "
\n" . - "
\n"; - } + print "\n
\n" . + "
\n" . + "\n"; } # end of feed - if ($format eq 'rss') { - print "
\n\n"; - } elsif ($format eq 'atom') { - print "\n"; - } -} - -sub git_rss { - git_feed('rss'); + print "\n"; } sub git_atom { @@ -8476,7 +8412,7 @@ sub git_opml { $title OPML Export$filter - + XML foreach my $pr (@list) { @@ -8492,9 +8428,9 @@ XML } my $path = esc_html(chop_str($proj{'path'}, 25, 5)); - my $rss = esc_attr(href('project' => $proj{'path'}, 'action' => 'rss', -full => 1)); + my $atom = esc_attr(href('project' => $proj{'path'}, 'action' => 'atom', -full => 1)); my $html = esc_attr(href('project' => $proj{'path'}, 'action' => 'summary', -full => 1)); - print "\n"; + print "\n"; } print <