From aedd9425ce211d132f8671bc3d94623ab9595f02 Mon Sep 17 00:00:00 2001 From: Jakub Narebski Date: Sat, 17 Jun 2006 11:23:56 +0200 Subject: [PATCH 1/5] Move gitweb style to gitweb.css Move gitweb style from embedded EOF diff --git a/gitweb/gitweb.css b/gitweb/gitweb.css new file mode 100644 index 0000000000..6b1fd23370 --- /dev/null +++ b/gitweb/gitweb.css @@ -0,0 +1,54 @@ +a { color:#0000cc; } +a:hover, a:visited, a:active { color:#880000; } +div.page_header { height:25px; padding:8px; font-size:18px; font-weight:bold; background-color:#d9d8d1; } +div.page_header a:visited, a.header { color:#0000cc; } +div.page_header a:hover { color:#880000; } +div.page_nav { padding:8px; } +div.page_nav a:visited { color:#0000cc; } +div.page_path { padding:8px; border:solid #d9d8d1; border-width:0px 0px 1px} +div.page_footer { height:17px; padding:4px 8px; background-color: #d9d8d1; } +div.page_footer_text { float:left; color:#555555; font-style:italic; } +div.page_body { padding:8px; } +div.title, a.title { + display:block; padding:6px 8px; + font-weight:bold; background-color:#edece6; text-decoration:none; color:#000000; +} +a.title:hover { background-color: #d9d8d1; } +div.title_text { padding:6px 0px; border: solid #d9d8d1; border-width:0px 0px 1px; } +div.log_body { padding:8px 8px 8px 150px; } +span.age { position:relative; float:left; width:142px; font-style:italic; } +div.log_link { + padding:0px 8px; + font-size:10px; font-family:sans-serif; font-style:normal; + position:relative; float:left; width:136px; +} +div.list_head { padding:6px 8px 4px; border:solid #d9d8d1; border-width:1px 0px 0px; font-style:italic; } +a.list { text-decoration:none; color:#000000; } +a.list:hover { text-decoration:underline; color:#880000; } +a.text { text-decoration:none; color:#0000cc; } +a.text:visited { text-decoration:none; color:#880000; } +a.text:hover { text-decoration:underline; color:#880000; } +table { padding:8px 4px; } +th { padding:2px 5px; font-size:12px; text-align:left; } +tr.light:hover { background-color:#edece6; } +tr.dark { background-color:#f6f6f0; } +tr.dark:hover { background-color:#edece6; } +td { padding:2px 5px; font-size:12px; vertical-align:top; } +td.link { padding:2px 5px; font-family:sans-serif; font-size:10px; } +div.pre { font-family:monospace; font-size:12px; white-space:pre; } +div.diff_info { font-family:monospace; color:#000099; background-color:#edece6; font-style:italic; } +div.index_include { border:solid #d9d8d1; border-width:0px 0px 1px; padding:12px 8px; } +div.search { margin:4px 8px; position:absolute; top:56px; right:12px } +a.linenr { color:#999999; text-decoration:none } +a.rss_logo { + float:right; padding:3px 0px; width:35px; line-height:10px; + border:1px solid; border-color:#fcc7a5 #7d3302 #3e1a01 #ff954e; + color:#ffffff; background-color:#ff6600; + font-weight:bold; font-family:sans-serif; font-size:10px; + text-align:center; text-decoration:none; +} +a.rss_logo:hover { background-color:#ee5500; } +span.tag { + padding:0px 4px; font-size:10px; font-weight:normal; + background-color:#ffffaa; border:1px solid; border-color:#ffffcc #ffee00 #ffee00 #ffffcc; +} From f5aa79d909f8c4838bf500c22fa5f7967d219925 Mon Sep 17 00:00:00 2001 From: Jakub Narebski Date: Sat, 17 Jun 2006 13:32:15 +0200 Subject: [PATCH 2/5] gitweb: safely output binary files for 'blob_plain' action gitweb tries now to output correct Content-Type header for 'blob_plain' action; for now text/plain for text files, appropriate image MIME type for *.png, *.gif and *.jpg/*.jpeg files, and application/octet-stream for other binary files. Introduced new configuration variables: $default_blob_plain_mimetype and $default_text_plain_charset (only 'utf-8' is guaranteed to work for the latter). binmode changed to ':raw' in git_blob_plain for output of non-text files. Signed-off-by: Junio C Hamano --- gitweb/gitweb.cgi | 43 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 39 insertions(+), 4 deletions(-) diff --git a/gitweb/gitweb.cgi b/gitweb/gitweb.cgi index 736d1068d2..b61b6ccbe6 100755 --- a/gitweb/gitweb.cgi +++ b/gitweb/gitweb.cgi @@ -39,12 +39,16 @@ my $home_link = $my_uri; my $home_text = "indextext.html"; # URI of default stylesheet -my $stylesheet = "gitweb.css"; +my $stylesheet = "gitweb.css"; # source of projects list #my $projects_list = $projectroot; my $projects_list = "index/index.aux"; +# default blob_plain mimetype and default charset for text/plain blob +my $default_blob_plain_mimetype = 'text/plain'; +my $default_text_plain_charset = 'utf-8'; # can be undefined + # input validation and dispatch my $action = $cgi->param('a'); if (defined $action) { @@ -1482,15 +1486,46 @@ sub git_blob { git_footer_html(); } +sub git_blob_plain_mimetype { + my $fd = shift; + my $filename = shift; + + # just in case + return $default_blob_plain_mimetype unless $fd; + + if (-T $fd) { + return 'text/plain' . + ($default_text_plain_charset ? '; charset='.$default_text_plain_charset : ''); + } elsif (! $filename) { + return 'application/octet-stream'; + } elsif ($filename =~ m/\.png$/i) { + return 'image/png'; + } elsif ($filename =~ m/\.gif$/i) { + return 'image/gif'; + } elsif ($filename =~ m/\.jpe?g$/i) { + return 'image/jpeg'; + } else { + return 'application/octet-stream'; + } +} + sub git_blob_plain { - my $save_as = "$hash.txt"; + open my $fd, "-|", "$gitbin/git-cat-file blob $hash" or return; + my $type = git_blob_plain_mimetype($fd, $file_name); + + # save as filename, even when no $file_name is given + my $save_as = "$hash"; if (defined $file_name) { $save_as = $file_name; + } elsif ($type =~ m/^text\//) { + $save_as .= '.txt'; } - print $cgi->header(-type => "text/plain", -charset => 'utf-8', '-content-disposition' => "inline; filename=\"$save_as\""); - open my $fd, "-|", "$gitbin/git-cat-file blob $hash" or return; + + print $cgi->header(-type => "$type", '-content-disposition' => "inline; filename=\"$save_as\""); undef $/; + binmode STDOUT, ':raw' unless $type =~ m/^text\//; print <$fd>; + binmode STDOUT, ':utf8' unless $type =~ m/^text\//; $/ = "\n"; close $fd; } From ad14e9317513f132293406e570f0b9360704371e Mon Sep 17 00:00:00 2001 From: Jakub Narebski Date: Sat, 17 Jun 2006 18:07:24 +0200 Subject: [PATCH 3/5] gitweb: text files for 'blob_plain' action without charset by default $default_text_plain_charset is undefined (no specified charset) by default. Additionally ':raw' layer for binmode is used for outputting file content. Signed-off-by: Junio C Hamano --- gitweb/gitweb.cgi | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gitweb/gitweb.cgi b/gitweb/gitweb.cgi index b61b6ccbe6..8fde1c8833 100755 --- a/gitweb/gitweb.cgi +++ b/gitweb/gitweb.cgi @@ -47,7 +47,7 @@ my $projects_list = "index/index.aux"; # default blob_plain mimetype and default charset for text/plain blob my $default_blob_plain_mimetype = 'text/plain'; -my $default_text_plain_charset = 'utf-8'; # can be undefined +my $default_text_plain_charset = undef; # input validation and dispatch my $action = $cgi->param('a'); @@ -1523,9 +1523,9 @@ sub git_blob_plain { print $cgi->header(-type => "$type", '-content-disposition' => "inline; filename=\"$save_as\""); undef $/; - binmode STDOUT, ':raw' unless $type =~ m/^text\//; + binmode STDOUT, ':raw'; print <$fd>; - binmode STDOUT, ':utf8' unless $type =~ m/^text\//; + binmode STDOUT, ':utf8'; # as set at the beginning of gitweb.cgi $/ = "\n"; close $fd; } From 2d00737489b8c61ed616b261c7c9bd314e2b0b41 Mon Sep 17 00:00:00 2001 From: Petr Baudis Date: Sun, 18 Jun 2006 00:01:06 +0200 Subject: [PATCH 4/5] Support for the standard mime.types map in gitweb gitweb will try to look up the filename mimetype in /etc/mime.types and optionally a user-configured mime.types map as well. Signed-off-by: Petr Baudis Signed-off-by: Junio C Hamano --- gitweb/gitweb.cgi | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/gitweb/gitweb.cgi b/gitweb/gitweb.cgi index 8fde1c8833..fa90c51a4d 100755 --- a/gitweb/gitweb.cgi +++ b/gitweb/gitweb.cgi @@ -49,6 +49,11 @@ my $projects_list = "index/index.aux"; my $default_blob_plain_mimetype = 'text/plain'; my $default_text_plain_charset = undef; +# file to use for guessing MIME types before trying /etc/mime.types +# (relative to the current git repository) +my $mimetypes_file = undef; + + # input validation and dispatch my $action = $cgi->param('a'); if (defined $action) { @@ -1486,6 +1491,40 @@ sub git_blob { git_footer_html(); } +sub mimetype_guess_file { + my $filename = shift; + my $mimemap = shift; + -r $mimemap or return undef; + + my %mimemap; + open(MIME, $mimemap) or return undef; + while () { + my ($mime, $exts) = split(/\t+/); + my @exts = split(/\s+/, $exts); + foreach my $ext (@exts) { + $mimemap{$ext} = $mime; + } + } + close(MIME); + + $filename =~ /\.(.*?)$/; + return $mimemap{$1}; +} + +sub mimetype_guess { + my $filename = shift; + my $mime; + $filename =~ /\./ or return undef; + + if ($mimetypes_file) { + my $file = $mimetypes_file; + $file =~ m#^/# or $file = "$projectroot/$path/$file"; + $mime = mimetype_guess_file($filename, $file); + } + $mime ||= mimetype_guess_file($filename, '/etc/mime.types'); + return $mime; +} + sub git_blob_plain_mimetype { my $fd = shift; my $filename = shift; @@ -1493,6 +1532,11 @@ sub git_blob_plain_mimetype { # just in case return $default_blob_plain_mimetype unless $fd; + if ($filename) { + my $mime = mimetype_guess($filename); + $mime and return $mime; + } + if (-T $fd) { return 'text/plain' . ($default_text_plain_charset ? '; charset='.$default_text_plain_charset : ''); From c729127ca745d25df1e6bddb265d03166931f49a Mon Sep 17 00:00:00 2001 From: Jakub Narebski Date: Sat, 17 Jun 2006 23:45:03 -0700 Subject: [PATCH 5/5] Fix gitweb stylesheet An earlier commit forgot to move some piece from the CGI script to the external stylesheet. Signed-off-by: Junio C Hamano --- gitweb/gitweb.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/gitweb/gitweb.css b/gitweb/gitweb.css index 6b1fd23370..bf95e38496 100644 --- a/gitweb/gitweb.css +++ b/gitweb/gitweb.css @@ -1,3 +1,7 @@ +body { + font-family: sans-serif; font-size: 12px; border:solid #d9d8d1; border-width:1px; + margin:10px; background-color:#ffffff; color:#000000; +} a { color:#0000cc; } a:hover, a:visited, a:active { color:#880000; } div.page_header { height:25px; padding:8px; font-size:18px; font-weight:bold; background-color:#d9d8d1; }