Merge branch 'jn/web'
* jn/web: gitweb: Make project description in projects list link to summary view gitweb: Use author_epoch for pubdate in gitweb feeds gitweb: Add author and contributor email to Atom feed gitweb: Add author and committer email extraction to parse_commit gitweb: Use git-show-ref instead of git-peek-remote gitweb: Do not use esc_html in esc_path
This commit is contained in:
commit
9f6db11ac5
@ -585,7 +585,21 @@ sub esc_html ($;%) {
|
||||
return $str;
|
||||
}
|
||||
|
||||
# Make control characterss "printable".
|
||||
# quote control characters and escape filename to HTML
|
||||
sub esc_path {
|
||||
my $str = shift;
|
||||
my %opts = @_;
|
||||
|
||||
$str = to_utf8($str);
|
||||
$str = escapeHTML($str);
|
||||
if ($opts{'-nbsp'}) {
|
||||
$str =~ s/ / /g;
|
||||
}
|
||||
$str =~ s|([[:cntrl:]])|quot_cec($1)|eg;
|
||||
return $str;
|
||||
}
|
||||
|
||||
# Make control characters "printable", using character escape codes (CEC)
|
||||
sub quot_cec {
|
||||
my $cntrl = shift;
|
||||
my %es = ( # character escape codes, aka escape sequences
|
||||
@ -605,22 +619,14 @@ sub quot_cec {
|
||||
return "<span class=\"cntrl\">$chr</span>";
|
||||
}
|
||||
|
||||
# Alternatively use unicode control pictures codepoints.
|
||||
# Alternatively use unicode control pictures codepoints,
|
||||
# Unicode "printable representation" (PR)
|
||||
sub quot_upr {
|
||||
my $cntrl = shift;
|
||||
my $chr = sprintf('&#%04d;', 0x2400+ord($cntrl));
|
||||
return "<span class=\"cntrl\">$chr</span>";
|
||||
}
|
||||
|
||||
# quote control characters and escape filename to HTML
|
||||
sub esc_path {
|
||||
my $str = shift;
|
||||
|
||||
$str = esc_html($str);
|
||||
$str =~ s|([[:cntrl:]])|quot_cec($1)|eg;
|
||||
return $str;
|
||||
}
|
||||
|
||||
# git may return quoted and escaped filenames
|
||||
sub unquote {
|
||||
my $str = shift;
|
||||
@ -1148,14 +1154,15 @@ sub git_get_last_activity {
|
||||
sub git_get_references {
|
||||
my $type = shift || "";
|
||||
my %refs;
|
||||
# 5dc01c595e6c6ec9ccda4f6f69c131c0dd945f8c refs/tags/v2.6.11
|
||||
# c39ae07f393806ccf406ef966e9a15afc43cc36a refs/tags/v2.6.11^{}
|
||||
open my $fd, "-|", $GIT, "peek-remote", "$projectroot/$project/"
|
||||
# 5dc01c595e6c6ec9ccda4f6f69c131c0dd945f8c refs/tags/v2.6.11
|
||||
# c39ae07f393806ccf406ef966e9a15afc43cc36a refs/tags/v2.6.11^{}
|
||||
open my $fd, "-|", git_cmd(), "show-ref", "--dereference",
|
||||
($type ? ("--", "refs/$type") : ()) # use -- <pattern> if $type
|
||||
or return;
|
||||
|
||||
while (my $line = <$fd>) {
|
||||
chomp $line;
|
||||
if ($line =~ m/^([0-9a-fA-F]{40})\trefs\/($type\/?[^\^]+)/) {
|
||||
if ($line =~ m!^([0-9a-fA-F]{40})\srefs/($type/?[^^]+)!) {
|
||||
if (defined $refs{$1}) {
|
||||
push @{$refs{$1}}, $2;
|
||||
} else {
|
||||
@ -1287,8 +1294,9 @@ sub parse_commit {
|
||||
$co{'author'} = $1;
|
||||
$co{'author_epoch'} = $2;
|
||||
$co{'author_tz'} = $3;
|
||||
if ($co{'author'} =~ m/^([^<]+) </) {
|
||||
$co{'author_name'} = $1;
|
||||
if ($co{'author'} =~ m/^([^<]+) <([^>]*)>/) {
|
||||
$co{'author_name'} = $1;
|
||||
$co{'author_email'} = $2;
|
||||
} else {
|
||||
$co{'author_name'} = $co{'author'};
|
||||
}
|
||||
@ -1297,7 +1305,12 @@ sub parse_commit {
|
||||
$co{'committer_epoch'} = $2;
|
||||
$co{'committer_tz'} = $3;
|
||||
$co{'committer_name'} = $co{'committer'};
|
||||
$co{'committer_name'} =~ s/ <.*//;
|
||||
if ($co{'committer'} =~ m/^([^<]+) <([^>]*)>/) {
|
||||
$co{'committer_name'} = $1;
|
||||
$co{'committer_email'} = $2;
|
||||
} else {
|
||||
$co{'committer_name'} = $co{'committer'};
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!defined $co{'tree'}) {
|
||||
@ -2428,6 +2441,7 @@ sub git_project_list_body {
|
||||
($pr->{'age'}, $pr->{'age_string'}) = @aa;
|
||||
if (!defined $pr->{'descr'}) {
|
||||
my $descr = git_get_project_description($pr->{'path'}) || "";
|
||||
$pr->{'descr_long'} = to_utf8($descr);
|
||||
$pr->{'descr'} = chop_str($descr, 25, 5);
|
||||
}
|
||||
if (!defined $pr->{'owner'}) {
|
||||
@ -2463,7 +2477,7 @@ sub git_project_list_body {
|
||||
} else {
|
||||
print "<th>" .
|
||||
$cgi->a({-href => href(project=>undef, order=>'project'),
|
||||
-class => "header"}, "Project") .
|
||||
-class => "header"}, "Project") .
|
||||
"</th>\n";
|
||||
}
|
||||
if ($order eq "descr") {
|
||||
@ -2472,7 +2486,7 @@ sub git_project_list_body {
|
||||
} else {
|
||||
print "<th>" .
|
||||
$cgi->a({-href => href(project=>undef, order=>'descr'),
|
||||
-class => "header"}, "Description") .
|
||||
-class => "header"}, "Description") .
|
||||
"</th>\n";
|
||||
}
|
||||
if ($order eq "owner") {
|
||||
@ -2481,7 +2495,7 @@ sub git_project_list_body {
|
||||
} else {
|
||||
print "<th>" .
|
||||
$cgi->a({-href => href(project=>undef, order=>'owner'),
|
||||
-class => "header"}, "Owner") .
|
||||
-class => "header"}, "Owner") .
|
||||
"</th>\n";
|
||||
}
|
||||
if ($order eq "age") {
|
||||
@ -2490,7 +2504,7 @@ sub git_project_list_body {
|
||||
} else {
|
||||
print "<th>" .
|
||||
$cgi->a({-href => href(project=>undef, order=>'age'),
|
||||
-class => "header"}, "Last Change") .
|
||||
-class => "header"}, "Last Change") .
|
||||
"</th>\n";
|
||||
}
|
||||
print "<th></th>\n" .
|
||||
@ -2515,7 +2529,9 @@ sub git_project_list_body {
|
||||
}
|
||||
print "<td>" . $cgi->a({-href => href(project=>$pr->{'path'}, action=>"summary"),
|
||||
-class => "list"}, esc_html($pr->{'path'})) . "</td>\n" .
|
||||
"<td>" . esc_html($pr->{'descr'}) . "</td>\n" .
|
||||
"<td>" . $cgi->a({-href => href(project=>$pr->{'path'}, action=>"summary"),
|
||||
-class => "list", -title => $pr->{'descr_long'}},
|
||||
esc_html($pr->{'descr'})) . "</td>\n" .
|
||||
"<td><i>" . chop_str($pr->{'owner'}, 15) . "</i></td>\n";
|
||||
print "<td class=\"". age_class($pr->{'age'}) . "\">" .
|
||||
$pr->{'age_string'} . "</td>\n" .
|
||||
@ -4188,7 +4204,7 @@ sub git_feed {
|
||||
}
|
||||
if (defined($revlist[0])) {
|
||||
%latest_commit = parse_commit($revlist[0]);
|
||||
%latest_date = parse_date($latest_commit{'committer_epoch'});
|
||||
%latest_date = parse_date($latest_commit{'author_epoch'});
|
||||
print $cgi->header(
|
||||
-type => $content_type,
|
||||
-charset => 'utf-8',
|
||||
@ -4281,10 +4297,10 @@ XML
|
||||
my $commit = $revlist[$i];
|
||||
my %co = parse_commit($commit);
|
||||
# we read 150, we always show 30 and the ones more recent than 48 hours
|
||||
if (($i >= 20) && ((time - $co{'committer_epoch'}) > 48*60*60)) {
|
||||
if (($i >= 20) && ((time - $co{'author_epoch'}) > 48*60*60)) {
|
||||
last;
|
||||
}
|
||||
my %cd = parse_date($co{'committer_epoch'});
|
||||
my %cd = parse_date($co{'author_epoch'});
|
||||
|
||||
# get list of changed files
|
||||
open $fd, "-|", git_cmd(), "diff-tree", '-r', @diff_opts,
|
||||
@ -4310,9 +4326,19 @@ XML
|
||||
print "<entry>\n" .
|
||||
"<title type=\"html\">" . esc_html($co{'title'}) . "</title>\n" .
|
||||
"<updated>$cd{'iso-8601'}</updated>\n" .
|
||||
"<author><name>" . esc_html($co{'author_name'}) . "</name></author>\n" .
|
||||
"<author>\n" .
|
||||
" <name>" . esc_html($co{'author_name'}) . "</name>\n";
|
||||
if ($co{'author_email'}) {
|
||||
print " <email>" . esc_html($co{'author_email'}) . "</email>\n";
|
||||
}
|
||||
print "</author>\n" .
|
||||
# use committer for contributor
|
||||
"<contributor><name>" . esc_html($co{'committer_name'}) . "</name></contributor>\n" .
|
||||
"<contributor>\n" .
|
||||
" <name>" . esc_html($co{'committer_name'}) . "</name>\n";
|
||||
if ($co{'committer_email'}) {
|
||||
print " <email>" . esc_html($co{'committer_email'}) . "</email>\n";
|
||||
}
|
||||
print "</contributor>\n" .
|
||||
"<published>$cd{'iso-8601'}</published>\n" .
|
||||
"<link rel=\"alternate\" type=\"text/html\" href=\"$co_url\" />\n" .
|
||||
"<id>$co_url</id>\n" .
|
||||
|
Loading…
Reference in New Issue
Block a user