diff options
Diffstat (limited to 'patches')
| -rw-r--r-- | patches/gitweb.patch | 138 |
1 files changed, 0 insertions, 138 deletions
diff --git a/patches/gitweb.patch b/patches/gitweb.patch deleted file mode 100644 index 0422081..0000000 --- a/patches/gitweb.patch +++ /dev/null @@ -1,138 +0,0 @@ -# https://stackoverflow.com/questions/8321649/gitweb-how-to-display-markdown-file-in-html-format-automatically-like-github ---- gitweb.cgi.orig 2020-10-06 10:13:45.621810025 +0100 -+++ gitweb.cgi 2020-10-06 10:08:21.651823286 +0100 -@@ -18,9 +18,10 @@ - use Encode; - use Fcntl ':mode'; - use File::Find qw(); --use File::Basename qw(basename); -+use File::Basename qw(basename dirname); - use Time::HiRes qw(gettimeofday tv_interval); - use Digest::MD5 qw(md5_hex); -+use File::Spec; # hack - - binmode STDOUT, ':utf8'; - -@@ -6644,6 +6645,20 @@ - print "\n</div>\n"; # class="readme" - } - -+ # hack -+ if (!$prevent_xss) { -+ $file_name = "README.md"; -+ my $proj_head_hash = git_get_head_hash($project); -+ my $readme_blob_hash = git_get_hash_by_path($proj_head_hash, "README.md", "blob"); -+ -+ if ($readme_blob_hash) { # if README.md exists -+ print "<div class=\"header\">$file_name</div>\n"; -+ print "<div class=\"readme page_body\">"; # TODO find/create a better CSS class than page_body -+ print get_markdown($file_name, $readme_blob_hash); -+ print "</div>"; -+ } -+ } -+ - # we need to request one more than 16 (0..15) to check if - # those 16 are all - my @commitlist = $head ? parse_commits($head, 17) : (); -@@ -7117,6 +7132,9 @@ - my $syntax = guess_file_syntax($highlight, $file_name); - $fd = run_highlighter($fd, $highlight, $syntax); - -+ # hack -+ my $ismarkdown = ($file_name =~ /md$/); -+ - git_header_html(undef, $expires); - my $formats_nav = ''; - if (defined $hash_base && (my %co = parse_commit($hash_base))) { -@@ -7160,6 +7178,10 @@ - esc_attr(href(action=>"blob_plain", hash=>$hash, - hash_base=>$hash_base, file_name=>$file_name)) . - qq!" />\n!; -+ } elsif ($ismarkdown) { -+ print qq!<div class="readme page_body">\n!; -+ print get_markdown($file_name, $hash); -+ print qq!</div>\n!; # $cmd_markdownify - } else { - my $nr; - while (my $line = <$fd>) { -@@ -7177,6 +7199,79 @@ - git_footer_html(); - } - -+# hack -+sub get_norm_rel_path { # http://www.perlmonks.org/bare/?node_id=11907 -+ my $unnormpath = shift; -+ while ($unnormpath =~ m!/\.!) { -+ $unnormpath =~ s!/[^\/]+/\.\.!!; -+ # print "Path is now -+$unnormpath+-\n"; -+ } -+ return $unnormpath; -+} -+sub get_markdown { -+ my $tfilename = shift; -+ my $thash = shift; -+ my $rethtmlstr = ""; -+ use open ":encoding(utf8)"; # needed to have utf8 survive through the shell pipe -+ my $cmd_markdownify = $GIT . " " . git_cmd() . " cat-file blob " . $thash . " | perl -e 'my \$str = do { local \$/; <STDIN> }; \$str =~ s/<!--.*?--\s*>//gs; print \$str;' | markdown |"; -+ open (FOO, $cmd_markdownify) or die_error(500, "Open git-cat-file blob '$thash' failed"); -+ while (<FOO>) { -+ if ($_ =~ /(<img[^>]src=")(.*?)"/) { -+ my $origcut = "".$2; -+ my $testcut = "".$2; -+ my $is_anchor = ($testcut =~ /^#/); -+ my $is_absolute = ($testcut =~ /^http/); -+ my $is_relative_up = ($testcut =~ /^\.\./); -+ my $is_local_link = ((!$is_anchor) and (!$is_absolute)); -+ my $tdir = dirname($tfilename); -+ my $is_tdir_proper = (($tdir ne "") and ($tdir ne ".")); -+ #print "XX: $origcut ($is_anchor, $is_absolute - $is_local_link) ($is_relative_up, $is_tdir_proper, $tdir, $tfilename)\n"; # dbg -+ if ($is_local_link) { -+ if ($is_relative_up) { # normalize -+ if ($is_tdir_proper) { -+ # cheat with absolute path here: -+ my $resolved = get_norm_rel_path( File::Spec->rel2abs ("$origcut", "/$tdir" ) ); -+ $resolved = substr $resolved, 1; -+ #print "YY: $resolved\n"; -+ $_ =~ s!(<img[^>]src=")(.*?)"!$1?p=$project;a=blob_plain;f=$resolved"!gi; -+ } -+ } else { -+ $_ =~ s!(<img[^>]src=")(.*?)"!$1?p=$project;a=blob_plain;f=$2"!gi; -+ #print "ZZ: $_\n"; -+ } -+ } -+ } -+ if ($_ =~ /(<a[^>]href=")(.*?)"/) { -+ my $origcut = "".$2; -+ my $testcut = "".$2; -+ my $is_anchor = ($testcut =~ /^#/); -+ my $is_absolute = ($testcut =~ /^http/); -+ my $is_relative_up = ($testcut =~ /^\.\./); -+ my $is_local_link = ((!$is_anchor) and (!$is_absolute)); -+ my $tdir = dirname($tfilename); -+ my $is_tdir_proper = (($tdir ne "") and ($tdir ne ".")); -+ #print "XX: $origcut ($is_anchor, $is_absolute - $is_local_link) ($is_relative_up, $is_tdir_proper, $tdir, $tfilename)\n"; # dbg -+ if ($is_local_link) { -+ if ($is_relative_up) { # normalize -+ if ($is_tdir_proper) { -+ # cheat with absolute path here: -+ my $resolved = get_norm_rel_path( File::Spec->rel2abs ("$origcut", "/$tdir" ) ); -+ $resolved = substr $resolved, 1; -+ #print "YY: $resolved\n"; -+ $_ =~ s!(<a[^>]href=")(.*?)"!$1?p=$project;a=blob;f=$resolved"!gi; -+ } -+ } else { -+ $_ =~ s!(<a[^>]href=")(.*?)"!$1?p=$project;a=blob;f=$2"!gi; -+ #print "ZZ: $_\n"; -+ } -+ } -+ } -+ $rethtmlstr .= $_; -+ } -+ close(FOO); -+ return $rethtmlstr; -+} -+ - sub git_tree { - if (!defined $hash_base) { - $hash_base = "HEAD"; - |
