{"thread":{"id":"43396","subject":"[PATCH] gitweb: Make RSS feed output prettier","startedAt":"2006-11-15T00:10:36Z","lastAt":"2006-11-17T09:01:05Z","messageCount":4,"participants":["asf@boinkor.net","Jakub Narebski","Junio C Hamano","Andreas Fuchs"],"isPatch":true,"patchVersion":1,"patchTotal":null},"messages":[{"id":"294611","messageId":"11635494363452-git-send-email-asf@boinkor.net","threadId":"43396","inReplyTo":null,"subject":"[PATCH] gitweb: Make RSS feed output prettier","fromName":"","fromEmail":"asf@boinkor.net","sentAt":"2006-11-15T00:10:36Z","receivedAt":"2006-11-15T00:10:36Z","isPatch":true,"sender":{"key":"asf@boinkor.net","avatar":"https://gravatar.com/avatar/665d98c9d9370d4fa7033ea20955b4ae35e3c982fc6101810be59d38638d1f3d?d=mp&s=160"},"body":"From: Andreas Fuchs <asf@boinkor.net>\n\n* Wrap the commit message in <pre>\n* Make file names into an unordered list\n* Add links (diff, conditional blame, history) to the file list.\n---\n gitweb/gitweb.perl |   22 ++++++++++++++++------\n 1 files changed, 16 insertions(+), 6 deletions(-)\n\ndiff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl\nindex e54a29e..2a79895 100755\n--- a/gitweb/gitweb.perl\n+++ b/gitweb/gitweb.perl\n@@ -4134,20 +4134,30 @@ XML\n \t\t      \"<content:encoded>\" .\n \t\t      \"<![CDATA[\\n\";\n \t\tmy $comment = $co{'comment'};\n+\t\tprint \"<pre>\\n\";\n \t\tforeach my $line (@$comment) {\n-\t\t\t$line = to_utf8($line);\n-\t\t\tprint \"$line<br/>\\n\";\n+\t\t\t$line = to_utf8(esc_html($line));\n+\t\t\tprint \"$line\\n\";\n \t\t}\n-\t\tprint \"<br/>\\n\";\n+\t\tprint \"</pre><ul>\\n\";\n \t\tforeach my $line (@difftree) {\n \t\t\tif (!($line =~ m/^:([0-7]{6}) ([0-7]{6}) ([0-9a-fA-F]{40}) ([0-9a-fA-F]{40}) (.)([0-9]{0,3})\\t(.*)$/)) {\n \t\t\t\tnext;\n \t\t\t}\n-\t\t\tmy $file = esc_path(unquote($7));\n+\t\t\tmy $file_name = unquote($7);\n+\t\t\tmy $file = esc_html($file_name);\n+\t\t\tmy $parent = $co{'parent'};\n+\t\t\tmy $hash = git_get_hash_by_path($commit, $file_name);\n+\t\t\tmy $hashparent = git_get_hash_by_path($parent, $file_name);\n+\n \t\t\t$file = to_utf8($file);\n-\t\t\tprint \"$file<br/>\\n\";\n+\t\t\tprint \"<li>$file \";\n+\t\t\tprint \"[<a href=\\\"\". esc_html(\"$my_url?p=$project;a=blobdiff;f=$file;h=$hash;hp=$hashparent;hb=$commit;hpb=$parent\") .\"\\\">diff</a>] \";\n+\t\t\tprint \"[<a href=\\\"\". esc_html(\"$my_url?p=$project;a=blame;f=$file;hb=$commit\") .\"\\\">blame</a>] \" if gitweb_check_feature('blame');\n+\t\t\tprint \"[<a href=\\\"\". esc_html(\"$my_url?p=$project;a=history;f=$file;h=$commit\") .\"\\\">history</a>] \";\n+\t\t\tprint \"</li>\\n\";\n \t\t}\n-\t\tprint \"]]>\\n\" .\n+\t\tprint \"</ul>]]>\\n\" .\n \t\t      \"</content:encoded>\\n\" .\n \t\t      \"</item>\\n\";\n \t}\n-- \n1.4.3.2\n"},{"id":"295406","messageId":"ejdmlb$77s$1@sea.gmane.org","threadId":"43396","inReplyTo":"11635494363452-git-send-email-asf@boinkor.net","subject":"Re: [PATCH] gitweb: Make RSS feed output prettier","fromName":"Jakub Narebski","fromEmail":"jnareb@gmail.com","sentAt":"2006-11-15T00:24:23Z","receivedAt":"2006-11-15T00:24:23Z","isPatch":true,"sender":{"key":"jnareb@gmail.com","avatar":"https://avatars.githubusercontent.com/u/2706?v=4"},"body":"Andreas Fuchs <asf@boinkor.net> wrote:\n\n> * Wrap the commit message in <pre>\nWe use <div class=\"pre\"> in \"commit\" view if I remember correctly.\n\n> * Make file names into an unordered list\nGood idea.\n\n> * Add links (diff, conditional blame, history) to the file list.\nI'd rather keep RSS output as simple as possible, no frills.\n\n> ---\n>  gitweb/gitweb.perl |   22 ++++++++++++++++------\n>  1 files changed, 16 insertions(+), 6 deletions(-)\n> \n> diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl\n> index e54a29e..2a79895 100755\n> --- a/gitweb/gitweb.perl\n> +++ b/gitweb/gitweb.perl\n> @@ -4134,20 +4134,30 @@ XML\n>                     \"<content:encoded>\" .\n>                     \"<![CDATA[\\n\";\n>               my $comment = $co{'comment'};\n> +             print \"<pre>\\n\";\n>               foreach my $line (@$comment) {\n> -                     $line = to_utf8($line);\n> -                     print \"$line<br/>\\n\";\n> +                     $line = to_utf8(esc_html($line));\nesc_html does to_utf8, so to_utf8 is unnecessary (and spurious).\nBut it is a good catch: esc_html is certainly needed.\n\n> +                     print \"$line\\n\";\n>               }\n> -             print \"<br/>\\n\";\n> +             print \"</pre><ul>\\n\";\n>               foreach my $line (@difftree) {\n>                       if (!($line =~ m/^:([0-7]{6}) ([0-7]{6}) ([0-9a-fA-F]{40}) ([0-9a-fA-F]{40}) (.)([0-9]{0,3})\\t(.*)$/)) {\n>                               next;\n>                       }\n> -                     my $file = esc_path(unquote($7));\n> +                     my $file_name = unquote($7);\n> +                     my $file = esc_html($file_name);\nWe have introduced esc_path for escaping pathnames. Use it!\n\n> +                     my $parent = $co{'parent'};\n> +                     my $hash = git_get_hash_by_path($commit, $file_name);\n> +                     my $hashparent = git_get_hash_by_path($parent, $file_name);\nTwo unnecessary calls to git command. Use \n     my %difftree = parse_difftree_raw_line($line)\ninstead. The conditions would probably be \n     next if (!$difftree{'from_id'});\n(or equivalent).\n\n> +\n>                       $file = to_utf8($file);\n> -                     print \"$file<br/>\\n\";\n> +                     print \"<li>$file \";\n> +                     print \"[<a href=\\\"\". esc_html(\"$my_url?p=$project;a=blobdiff;f=$file;h=$hash;hp=$hashparent;hb=$commit;hpb=$parent\") .\"\\\">diff</a>] \";\n> +                     print \"[<a href=\\\"\". esc_html(\"$my_url?p=$project;a=blame;f=$file;hb=$commit\") .\"\\\">blame</a>] \" if gitweb_check_feature('blame');\n> +                     print \"[<a href=\\\"\". esc_html(\"$my_url?p=$project;a=history;f=$file;h=$commit\") .\"\\\">history</a>] \";\n> +                     print \"</li>\\n\";\nesc_url, not esc_html here. Or use the href() subroutine with -full=>1\noption (after applying the patch I send which added this to href()).\n\nP.S. Please reply also to git mailing list.\n-- \nJakub Narebski\nWarsaw, Poland\nShadeHawk on #git\n\n"},{"id":"298605","messageId":"ejim5q$31b$1@sea.gmane.org","threadId":"43396","inReplyTo":"ejdmlb$77s$1@sea.gmane.org","subject":"[PATCH] gitweb: Atom feeds (was: gitweb: Make RSS feed output prettier)","fromName":"Andreas Fuchs","fromEmail":"asf@boinkor.net","sentAt":"2006-11-16T21:45:25Z","receivedAt":"2006-11-16T21:45:25Z","isPatch":true,"sender":{"key":"asf@boinkor.net","avatar":"https://gravatar.com/avatar/665d98c9d9370d4fa7033ea20955b4ae35e3c982fc6101810be59d38638d1f3d?d=mp&s=160"},"body":"Jakub Narebski wrote:\n> Andreas Fuchs <asf@boinkor.net> wrote:\n> \n>> * Wrap the commit message in <pre>\n> We use <div class=\"pre\"> in \"commit\" view if I remember correctly.\n\nThat's ok for rendered HTML output, but in my experience, the way feed\nreaders interpret that ranges from \"badly\" to \"not at all\"; it's better\nto stick to explicit structure hints only in feeds. /-:\n\nSo, this is the only thing I haven't fixed in the attached patch (:\n\n>> * Make file names into an unordered list\n> Good idea.\n> \n>> * Add links (diff, conditional blame, history) to the file list.\n> I'd rather keep RSS output as simple as possible, no frills.\n\nI can see that, but it would be very useful on aggregation sites like\nhttp://planet.sbcl.org/. You mentioned on IRC that you'd prefer to\nforward-port the current RSS generation to a more modern feed format\nlike Atom 1.0.\n\nI took the liberty to back out that change from the RSS generator, and\nimplement Atom 1.0 output that is more fully featured. For testing, I\nleft both in. Both feeds validate at feedvalidator.org for me, the\nchoice is yours (:\n\n> esc_html does to_utf8, so to_utf8 is unnecessary (and spurious).\n> But it is a good catch: esc_html is certainly needed.\n\nThe attached patch doesn't use to_utf8 on already-escaped strings anymore.\n\n> We have introduced esc_path for escaping pathnames. Use it!\n\nI changed that, too.\n\n> Two unnecessary calls to git command. Use \n>      my %difftree = parse_difftree_raw_line($line)\n> instead. The conditions would probably be \n>      next if (!$difftree{'from_id'});\n> (or equivalent).\n\nThanks for the hint; I included that in the Atom output and re-worked\nthe RSS generator to not use the hideous regexp anymore.\n\n> esc_url, not esc_html here. Or use the href() subroutine with -full=>1\n> option (after applying the patch I send which added this to href()).\n\nOkay; I changed all occurrences of esc_html where URLs are escaped to\nuse esc_url.\n\nIn addition to the above points, the attached patch emits a\nLast-Changed: HTTP response header field, and doesn't compute the feed\nbody if the HTTP request type was HEAD. This helps keep the web server\nload down for well-behaved feed readers that check if the feed needs\nupdating.\n\nHope you like it,\n-- \nAndreas Fuchs, (http://|im:asf@|mailto:asf@)boinkor.net, antifuchs\n\n\ndiff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl\nindex e54a29e..b39dc65 100755\n--- a/gitweb/gitweb.perl\n+++ b/gitweb/gitweb.perl\n@@ -425,6 +425,7 @@ my %actions = (\n \t\"history\" => \\&git_history,\n \t\"log\" => \\&git_log,\n \t\"rss\" => \\&git_rss,\n+        \"atom\" => \\&git_atom,\n \t\"search\" => \\&git_search,\n \t\"search_help\" => \\&git_search_help,\n \t\"shortlog\" => \\&git_shortlog,\n@@ -1180,7 +1181,9 @@ sub parse_date {\n \t                   $days[$wday], $mday, $months[$mon], 1900+$year, $hour ,$min, $sec;\n \t$date{'mday-time'} = sprintf \"%d %s %02d:%02d\",\n \t                     $mday, $months[$mon], $hour ,$min;\n-\n+        $date{'iso-8601'} = sprintf \"%04d-%02d-%02dT%02d:%02d:%02dZ\",\n+\t                   1900+$year, $mon, $mday, $hour ,$min, $sec;\n+        \n \t$tz =~ m/^([+\\-][0-9][0-9])([0-9][0-9])$/;\n \tmy $local = $epoch + ((int $1 + ($2/60)) * 3600);\n \t($sec, $min, $hour, $mday, $mon, $year, $wday, $yday) = gmtime($local);\n@@ -1653,6 +1656,9 @@ #provides backwards capability for those\n \t\tprintf('<link rel=\"alternate\" title=\"%s log\" '.\n \t\t       'href=\"%s\" type=\"application/rss+xml\"/>'.\"\\n\",\n \t\t       esc_param($project), href(action=>\"rss\"));\n+                printf('<link rel=\"alternate\" title=\"%s log\" '.\n+\t\t       'href=\"%s\" type=\"application/atom+xml\"/>'.\"\\n\",\n+\t\t       esc_param($project), href(action=>\"atom\"));\n \t} else {\n \t\tprintf('<link rel=\"alternate\" title=\"%s projects list\" '.\n \t\t       'href=\"%s\" type=\"text/plain; charset=utf-8\"/>'.\"\\n\",\n@@ -1724,6 +1730,8 @@ sub git_footer_html {\n \t\t}\n \t\tprint $cgi->a({-href => href(action=>\"rss\"),\n \t\t              -class => \"rss_logo\"}, \"RSS\") . \"\\n\";\n+\t\tprint $cgi->a({-href => href(action=>\"atom\"),\n+\t\t              -class => \"rss_logo\"}, \"Atom\") . \"\\n\";\n \t} else {\n \t\tprint $cgi->a({-href => href(project=>undef, action=>\"opml\"),\n \t\t              -class => \"rss_logo\"}, \"OPML\") . \" \";\n@@ -4097,14 +4105,29 @@ sub git_rss {\n \t\tor die_error(undef, \"Open git-rev-list failed\");\n \tmy @revlist = map { chomp; $_ } <$fd>;\n \tclose $fd or die_error(undef, \"Reading git-rev-list failed\");\n-\tprint $cgi->header(-type => 'text/xml', -charset => 'utf-8');\n+\n+        my %latest_commit;\n+        my %latest_date;\n+        if (defined($revlist[0])) {\n+                %latest_commit = parse_commit($revlist[0]);\n+        \t%latest_date = parse_date($latest_commit{'committer_epoch'});\n+                print $cgi->header(-type => 'application/atom+xml', -charset => 'utf-8',\n+        \t                  -last_modified => $latest_date{'rfc2822'});\n+        } else {\n+\t\tprint $cgi->header(-type => 'application/atom+xml', -charset => 'utf-8');\n+        }\n+\n+        # Optimization: skip generating the body if client asks only\n+        # for Last-Modified date.\n+        return if ($cgi->request_method() eq 'HEAD');\n+\n \tprint <<XML;\n <?xml version=\"1.0\" encoding=\"utf-8\"?>\n <rss version=\"2.0\" xmlns:content=\"http://purl.org/rss/1.0/modules/content/\">\n <channel>\n-<title>$project $my_uri $my_url</title>\n-<link>${\\esc_html(\"$my_url?p=$project;a=summary\")}</link>\n-<description>$project log</description>\n+<title>${\\esc_html(\"$project $my_uri $my_url\")}</title>\n+<link>${\\esc_url(\"$my_url?p=$project;a=summary\")}</link>\n+<description>${\\esc_html($project)} log</description>\n <language>en</language>\n XML\n \n@@ -4128,32 +4151,138 @@ XML\n \t\t      \"</title>\\n\" .\n \t\t      \"<author>\" . esc_html($co{'author'}) . \"</author>\\n\" .\n \t\t      \"<pubDate>$cd{'rfc2822'}</pubDate>\\n\" .\n-\t\t      \"<guid isPermaLink=\\\"true\\\">\" . esc_html(\"$my_url?p=$project;a=commit;h=$commit\") . \"</guid>\\n\" .\n-\t\t      \"<link>\" . esc_html(\"$my_url?p=$project;a=commit;h=$commit\") . \"</link>\\n\" .\n+\t\t      \"<guid isPermaLink=\\\"true\\\">\" . esc_url(\"$my_url?p=$project;a=commit;h=$commit\") . \"</guid>\\n\" .\n+\t\t      \"<link>\" . esc_url(\"$my_url?p=$project;a=commit;h=$commit\") . \"</link>\\n\" .\n \t\t      \"<description>\" . esc_html($co{'title'}) . \"</description>\\n\" .\n \t\t      \"<content:encoded>\" .\n \t\t      \"<![CDATA[\\n\";\n \t\tmy $comment = $co{'comment'};\n+\t\tprint \"<pre>\\n\";\n \t\tforeach my $line (@$comment) {\n-\t\t\t$line = to_utf8($line);\n-\t\t\tprint \"$line<br/>\\n\";\n+\t\t\t$line = esc_html($line);\n+\t\t\tprint \"$line\\n\";\n \t\t}\n-\t\tprint \"<br/>\\n\";\n+\t\tprint \"</pre><ul>\\n\";\n \t\tforeach my $line (@difftree) {\n-\t\t\tif (!($line =~ m/^:([0-7]{6}) ([0-7]{6}) ([0-9a-fA-F]{40}) ([0-9a-fA-F]{40}) (.)([0-9]{0,3})\\t(.*)$/)) {\n-\t\t\t\tnext;\n-\t\t\t}\n-\t\t\tmy $file = esc_path(unquote($7));\n-\t\t\t$file = to_utf8($file);\n-\t\t\tprint \"$file<br/>\\n\";\n+\t\t\tmy %difftree = parse_difftree_raw_line($line);\n+\t\t\tnext if !$difftree{'from_id'};\n+                        \n+\t\t\tmy $file_name = $difftree{'file'};\n+\t\t\tmy $file = esc_path($file_name);\n+\n+\t\t\tprint \"<li>$file</li>\\n\";\n \t\t}\n-\t\tprint \"]]>\\n\" .\n+\t\tprint \"</ul>]]>\\n\" .\n \t\t      \"</content:encoded>\\n\" .\n \t\t      \"</item>\\n\";\n \t}\n \tprint \"</channel></rss>\";\n }\n \n+sub git_atom {\n+\topen my $fd, \"-|\", git_cmd(), \"rev-list\", \"--max-count=150\",\n+\t\tgit_get_head_hash($project), \"--\"\n+\t\tor die_error(undef, \"Open git-rev-list failed\");\n+\tmy @revlist = map { chomp; $_ } <$fd>;\n+\tclose $fd or die_error(undef, \"Reading git-rev-list failed\");\n+\n+        my %latest_commit;\n+        my %latest_date;\n+        if (defined($revlist[0])) {\n+                %latest_commit = parse_commit($revlist[0]);\n+        \t%latest_date = parse_date($latest_commit{'committer_epoch'});\n+                print $cgi->header(-type => 'application/atom+xml', -charset => 'utf-8',\n+        \t                  -last_modified => $latest_date{'rfc2822'});\n+        } else {\n+\t\tprint $cgi->header(-type => 'application/atom+xml', -charset => 'utf-8');\n+        }\n+\n+        # Optimization: skip generating the body if client asks only\n+        # for Last-Modified date.\n+        return if ($cgi->request_method() eq 'HEAD');\n+        \n+\tprint <<XML;\n+<?xml version=\"1.0\" encoding=\"utf-8\"?>\n+<feed xmlns=\"http://www.w3.org/2005/Atom\">\n+<title type=\"html\">${\\esc_html(\"$project $my_uri $my_url\")}</title>\n+<link rel=\"alternate\" type=\"text/html\" href=\"${\\esc_url(\"$my_url?p=$project;a=summary\")}\" />\n+<link rel=\"self\" type=\"application/atom+xml\" href=\"${\\esc_url(\"$my_url?p=$project;a=atom\")}\" />\n+<subtitle>$project log</subtitle>\n+<id>${\\esc_url(\"$my_url?p=$project\")}</id>\n+XML\n+        if (!defined(%latest_date)) {\n+        \t# dummy date to keep the feed valid until commits trickle in:\n+\t        print \"<updated>1970-01-01T00:00:00Z</updated>\";  \n+        } else {\n+                print \"<updated>\".$latest_date{'iso-8601'}.\"</updated>\\n\";\n+        }\n+        \n+\tfor (my $i = 0; $i <= $#revlist; $i++) {\n+\t\tmy $commit = $revlist[$i];\n+\t\tmy %co = parse_commit($commit);\n+\t\t# we read 150, we always show 30 and the ones more recent than 48 hours\n+\t\tif (($i >= 20) && ((time - $co{'committer_epoch'}) > 48*60*60)) {\n+\t\t\tlast;\n+\t\t}\n+\t\tmy %cd = parse_date($co{'committer_epoch'});\n+\n+\t\topen $fd, \"-|\", git_cmd(), \"diff-tree\", '-r', @diff_opts,\n+\t\t\t$co{'parent'}, $co{'id'}, \"--\"\n+\t\t\tor next;\n+\t\tmy @difftree = map { chomp; $_ } <$fd>;\n+\t\tclose $fd\n+\t\t\tor next;\n+\t\tprint \"<entry>\\n\" .\n+\t\t      \"<title type=\\\"html\\\">\" .\n+\t\t      esc_html($co{'author_name'}) . \": \" . esc_html($co{'title'}) .\n+\t\t      \"</title>\\n\" .\n+                      \"<updated>$cd{'iso-8601'}</updated>\\n\" .\n+\t\t      \"<author><name>\" . esc_html($co{'author_name'}) . \"</name></author>\\n\" .\n+\t\t      \"<published>$cd{'iso-8601'}</published>\\n\" .\n+\t\t      \"<link rel=\\\"alternate\\\" type=\\\"text/html\\\" href=\\\"\" .\n+                        esc_url(\"$my_url?p=$project;a=commit;h=$commit\") . \"\\\" />\\n\" .\n+\t\t      \"<id>\" . esc_url(\"$my_url?p=$project;a=commit;h=$co{'id'}\") . \"</id>\\n\" .\n+\t\t      \"<content type=\\\"html\\\" xml:base=\\\"\".esc_url($my_url).\"\\\">\" .\n+\t\t      \"<![CDATA[\\n\";\n+\t\tmy $comment = $co{'comment'};\n+\t\tprint \"<pre>\\n\";\n+\t\tforeach my $line (@$comment) {\n+\t\t\t$line = to_utf8(esc_html($line));\n+\t\t\tprint \"$line\\n\";\n+\t\t}\n+\t\tprint \"</pre><ul>\\n\";\n+\t\tforeach my $line (@difftree) {\n+                        my %difftree = parse_difftree_raw_line($line);\n+\t\t\tnext if !$difftree{'from_id'};\n+                        \n+\t\t\tmy $file_name = $difftree{'file'};\n+\t\t\tmy $file = esc_path($file_name);\n+\t\t\tmy $parent = $co{'parent'};\n+\t\t\tmy $hash = $difftree{'to_id'};\n+\t\t\tmy $hashparent = $difftree{'from_id'};\n+\n+                        print \"<li>[\";\n+\t\t\tprint \"<a title=\\\"diff\\\" href=\\\"\".\n+                              esc_url(\"$my_url?p=$project;a=blobdiff;f=$file;h=$hash;hp=$hashparent;hb=$commit;hpb=$parent\") .\n+                              \"\\\">D</a>\";\n+\t\t\tif (gitweb_check_feature('blame')) {\n+                        \tprint \"<a title=\\\"blame\\\" href=\\\"\".\n+                                      esc_url(\"$my_url?p=$project;a=blame;f=$file;hb=$commit\") .\n+                                      \"\\\">B</a>\";\n+                        }\n+\t\t\tprint \"<a title=\\\"history\\\" href=\\\"\".\n+                              esc_url(\"?p=$project;a=history;f=$file;h=$commit\") .\n+                              \"\\\">H</a>\";\n+\t\t\tprint \"] $file\";\n+\t\t\tprint \"</li>\\n\";\n+\t\t}\n+\t\tprint \"</ul>]]>\\n\" .\n+\t\t      \"</content>\\n\" .\n+\t\t      \"</entry>\\n\";\n+\t}\n+\tprint \"</feed>\";\n+}\n+\n sub git_opml {\n \tmy @list = git_get_projects_list();\n \n"},{"id":"296957","messageId":"7v4psysazy.fsf@assigned-by-dhcp.cox.net","threadId":"43396","inReplyTo":"ejim5q$31b$1@sea.gmane.org","subject":"Re: [PATCH] gitweb: Atom feeds","fromName":"Junio C Hamano","fromEmail":"junkio@cox.net","sentAt":"2006-11-17T09:01:05Z","receivedAt":"2006-11-17T09:01:05Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Andreas Fuchs <asf@boinkor.net> writes:\n\n> Jakub Narebski wrote:\n>> Andreas Fuchs <asf@boinkor.net> wrote:\n>> \n>>> * Wrap the commit message in <pre>\n>> We use <div class=\"pre\"> in \"commit\" view if I remember correctly.\n>\n> That's ok for rendered HTML output, but in my experience, the way feed\n> readers interpret that ranges from \"badly\" to \"not at all\"; it's better\n> to stick to explicit structure hints only in feeds. /-:\n>\n> So, this is the only thing I haven't fixed in the attached patch (:\n> ...\n> In addition to the above points, the attached patch emits a\n> Last-Changed: HTTP response header field, and doesn't compute the feed\n> body if the HTTP request type was HEAD. This helps keep the web server\n> load down for well-behaved feed readers that check if the feed needs\n> updating.\n>\n> Hope you like it,\n\nSeems sane to me.  Jakub, how do you like this one?  If it looks\nOk to you, please arrange to include your one-liner that this\ndepends on and forward a readily applicable patch with\nappropriate commit log message.\n\n\n"}]}