]> gitweb.ps.run Git - flakes/commitdiff
add gitweb patch
authorpatrick-scho <patrick.schoenberger@posteo.de>
Wed, 26 Nov 2025 09:31:37 +0000 (10:31 +0100)
committerpatrick-scho <patrick.schoenberger@posteo.de>
Wed, 26 Nov 2025 09:31:37 +0000 (10:31 +0100)
patches/gitweb.patch [new file with mode: 0644]

diff --git a/patches/gitweb.patch b/patches/gitweb.patch
new file mode 100644 (file)
index 0000000..8372f32
--- /dev/null
@@ -0,0 +1,137 @@
+--- 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";
+