gitweb: Great subroutine renaming + task separation into subroutines + improvements
cover gitweb: Great subroutine renaming + task separation into subroutines + improvements
This series of patches is based on the 'next' branch, commit 10a6653c818f78c6032d45e1d4da544085e1f28b (v1.4.2-g10a6653)
It begins with:
* [PATCH 1/9] gitweb: Great subroutines renaming
Then there is series of patches which separate task into subroutine; 'refactor' in patch subject here means that we use new subroutine in more than one place, 'separate' here means that new subroutine is (for now) used only in one place
* [PATCH 2/9] gitweb: Separate ref parsing in git_get_refs_list into parse_ref
* [PATCH 3/9] gitweb: Refactor printing shortened title
in git_shortlog_body and git_tags_body
* [PATCH 4/9] gitweb: Separate main part of git_history into git_history_body
* [PATCH 5/9] gitweb: Separate finding project owner
into git_get_project_owner
Then there is couple of improvements
* [PATCH 6/9] gitweb: Change appereance of marker of refs pointing to given object
* [PATCH 7/9] gitweb: Skip comments in mime.types like file
* [PATCH 8/9] gitweb: True fix: Support for the standard mime.types map in gitweb
And finally yet another separation of task into subroutine, with small improvements (and perhaps to be reused)
* [PATCH 9/9] gitweb: Separate printing difftree in git_commit into git_difftree_body
Signature · 2 lines
Jakub Narebski Poland
PATCH 1/9 gitweb: Great subroutines renaming
Rename some of subroutines to better reflect what they do. Some renames were not performed because subroutine name reflects hash key.
Subroutines name guideline:
* git_ prefix for subroutines related to git commands,
git repository, or to gitweb actions
* git_get_ prefix for inner subroutines calling git command or reading some file in the repository and returning some output
* parse_ prefix for subroutines parsing some text (or reading and parsing some text) into hash or list
* format_ prefix for subroutines formatting, post-processing or generating some HTML/text fragment
* _get_ infix for subroutines which return result
* _print_ infix for subroutines which print fragment of output
* _body suffix for subroutines which outputs main part (body) of related action (usually table)
* _nav suffix for subroutines related to navigation bars
* _div suffix for subroutines returning or printing div element
* subroutine names should not be based on how the result is obtained, as this might change easily
Renames performed:
- git_get_referencing => format_ref_marker
- git_get_paging_nav => format_paging_nav
- git_read_head => git_get_head_hash
- git_read_hash => git_get_hash_by_ref
- git_read_description => git_get_project_description
- git_read_projects => git_get_projects_list
- read_info_ref => git_get_references
- git_read_refs => git_get_refs_list
- date_str => parse_date
- git_read_tag => parse_tag
- git_read_commit => parse_commit
- git_blob_plain_mimetype => blob_mimetype
- git_page_nav => git_print_page_nav
- git_header_div => git_print_header_div
---
I'm not sure if to add script used to create this commit, and to port changes to be "post-rename". Here it is:
#!/bin/bash
if test -z "$1"; then
FILE=`git rev-parse --show-cdup`gitweb/gitweb.perl else FILE=$1 fi echo "Great subroutine renaming: $FILE" perl -s -p -i.re~ \ -e 's/\bgit_get_referencing\b/format_ref_marker/;' \ -e 's/\bgit_get_paging_nav\b/format_paging_nav/;' \ \ -e 's/\bgit_read_head\b/git_get_head_hash/;' \ -e 's/\bgit_read_hash\b/git_get_hash_by_ref/;' \ -e 's/\bgit_read_description\b/git_get_project_description/;' \ -e 's/\bgit_read_projects\b/git_get_projects_list/;' \ -e 's/\bread_info_ref\b/git_get_references/;' \ -e 's/\bgit_read_refs\b/git_get_refs_list/;' \ \ -e 's/\bdate_str\b/parse_date/;' \ -e 's/\bgit_read_tag\b/parse_tag/;' \ -e 's/\bgit_read_commit\b/parse_commit/;' \ \ -e 's/\bgit_blob_plain_mimetype\b/blob_mimetype/;' \ \ -e 's/\bgit_page_nav\b/git_print_page_nav/;' \ -e 's/\bgit_header_div\b/git_print_header_div/;' \ "$FILE" # end of gitweb-rename.sh
gitweb/gitweb.perl | 250 ++++++++++++++++++++++++++-------------------------- 1 files changed, 125 insertions(+), 125 deletions(-)
gitweb/gitweb.perl +125 -125
@@ -362,7 +362,7 @@ sub format_log_line_html { } # format marker of refs pointing to given object -sub git_get_referencing { +sub format_ref_marker { my ($refs, $id) = @_; if (defined $refs->{$id}) {
@@ -376,7 +376,7 @@ ## ------------------------------------- ## git utility subroutines, invoking git commands # get HEAD ref of given project as hash -sub git_read_head { +sub git_get_head_hash { my $project = shift; my $oENV = $ENV{'GIT_DIR'}; my $retval = undef;
@@ -445,7 +445,7 @@ ## ..................................... ## git utility functions, directly accessing git repository # assumes that PATH is not symref -sub git_read_hash { +sub git_get_hash_by_ref { my $path = shift; open my $fd, "$projectroot/$path" or return undef;
@@ -457,7 +457,7 @@ sub git_read_hash { } } -sub git_read_description { +sub git_get_project_description { my $path = shift; open my $fd, "$projectroot/$path/description" or return undef;
@@ -467,7 +467,7 @@ sub git_read_description { return $descr; } -sub git_read_projects { +sub git_get_projects_list { my @list; if (-d $projects_list) {
@@ -511,7 +511,7 @@ sub git_read_projects { return @list; } -sub read_info_ref { +sub git_get_references { my $type = shift || ""; my %refs; # 5dc01c595e6c6ec9ccda4f6f69c131c0dd945f8c refs/tags/v2.6.11
@@ -536,7 +536,7 @@ sub read_info_ref { ## ---------------------------------------------------------------------- ## parse to hash functions -sub date_str { +sub parse_date { my $epoch = shift; my $tz = shift || "-0000";
@@ -561,7 +561,7 @@ sub date_str { return %date; } -sub git_read_tag { +sub parse_tag { my $tag_id = shift; my %tag; my @comment;
@@ -596,7 +596,7 @@ sub git_read_tag { return %tag } -sub git_read_commit { +sub parse_commit { my $commit_id = shift; my $commit_text = shift;
@@ -693,7 +693,7 @@ sub git_read_commit { ## ...................................................................... ## parse to array of hashes functions -sub git_read_refs { +sub git_get_refs_list { my $ref_dir = shift; my @reflist;
@@ -707,7 +707,7 @@ sub git_read_refs { }, "$projectroot/$project/$ref_dir"); foreach my $ref_file (@refs) { - my $ref_id = git_read_hash("$project/$ref_dir/$ref_file"); + my $ref_id = git_get_hash_by_ref("$project/$ref_dir/$ref_file"); my $type = git_get_type($ref_id) || next; my %ref_item; my %co;
@@ -716,10 +716,10 @@ sub git_read_refs { $ref_item{'epoch'} = 0; $ref_item{'age'} = "unknown"; if ($type eq "tag") { - my %tag = git_read_tag($ref_id); + my %tag = parse_tag($ref_id); $ref_item{'comment'} = $tag{'comment'}; if ($tag{'type'} eq "commit") { - %co = git_read_commit($tag{'object'}); + %co = parse_commit($tag{'object'}); $ref_item{'epoch'} = $co{'committer_epoch'}; $ref_item{'age'} = $co{'age_string'}; } elsif (defined($tag{'epoch'})) {
@@ -731,7 +731,7 @@ sub git_read_refs { $ref_item{'name'} = $tag{'name'}; $ref_item{'refid'} = $tag{'object'}; } elsif ($type eq "commit"){ - %co = git_read_commit($ref_id); + %co = parse_commit($ref_id); $ref_item{'reftype'} = "commit"; $ref_item{'name'} = $ref_file; $ref_item{'title'} = $co{'title'};
@@ -806,7 +806,7 @@ sub mimetype_guess { return $mime; } -sub git_blob_plain_mimetype { +sub blob_mimetype { my $fd = shift; my $filename = shift;
@@ -925,7 +925,7 @@ EOF sub git_footer_html { print "<div class=\"page_footer\">\n"; if (defined $project) { - my $descr = git_read_description($project); + my $descr = git_get_project_description($project); if (defined $descr) { print "<div class=\"page_footer_text\">" . esc_html($descr) . "</div>\n"; }
@@ -955,7 +955,7 @@ sub die_error { ## ---------------------------------------------------------------------- ## functions printing or outputting HTML: navigation -sub git_page_nav { +sub git_print_page_nav { my ($current, $suppress, $head, $treehead, $treebase, $extra) = @_; $extra = '' if !defined $extra; # pager or formats
@@ -989,7 +989,7 @@ sub git_page_nav { "</div>\n"; } -sub git_get_paging_nav { +sub format_paging_nav { my ($action, $hash, $head, $page, $nrevs) = @_; my $paging_nav;
@@ -1022,7 +1022,7 @@ sub git_get_paging_nav { ## ...................................................................... ## functions printing or outputting HTML: div -sub git_header_div { +sub git_print_header_div { my ($action, $title, $hash, $hash_base) = @_; my $rest = '';
@@ -1062,9 +1062,9 @@ sub git_shortlog_body { my $alternate = 0; for (my $i = $from; $i <= $to; $i++) { my $commit = $revlist->[$i]; - #my $ref = defined $refs ? git_get_referencing($refs, $commit) : ''; - my $ref = git_get_referencing($refs, $commit); - my %co = git_read_commit($commit); + #my $ref = defined $refs ? format_ref_marker($refs, $commit) : ''; + my $ref = format_ref_marker($refs, $commit); + my %co = parse_commit($commit); if ($alternate) { print "<tr class=\"dark\">\n"; } else {
@@ -1282,24 +1282,24 @@ sub git_project_list { die_error(undef, "Unknown order parameter"); } - my @list = git_read_projects(); + my @list = git_get_projects_list(); my @projects; if (!@list) { die_error(undef, "No projects found"); } foreach my $pr (@list) { - my $head = git_read_head($pr->{'path'}); + my $head = git_get_head_hash($pr->{'path'}); if (!defined $head) { next; } $ENV{'GIT_DIR'} = "$projectroot/$pr->{'path'}"; - my %co = git_read_commit($head); + my %co = parse_commit($head); if (!%co) { next; } $pr->{'commit'} = \%co; if (!defined $pr->{'descr'}) { - my $descr = git_read_description($pr->{'path'}) || ""; + my $descr = git_get_project_description($pr->{'path'}) || ""; $pr->{'descr'} = chop_str($descr, 25, 5); } if (!defined $pr->{'owner'}) {
@@ -1383,10 +1383,10 @@ sub git_project_list { } sub git_summary { - my $descr = git_read_description($project) || "none"; - my $head = git_read_head($project); - my %co = git_read_commit($head); - my %cd = date_str($co{'committer_epoch'}, $co{'committer_tz'}); + my $descr = git_get_project_description($project) || "none"; + my $head = git_get_head_hash($project); + my %co = parse_commit($head); + my %cd = parse_date($co{'committer_epoch'}, $co{'committer_tz'}); my $owner; if (-f $projects_list) {
@@ -1407,9 +1407,9 @@ sub git_summary { $owner = get_file_owner("$projectroot/$project"); } - my $refs = read_info_ref(); + my $refs = git_get_references(); git_header_html(); - git_page_nav('summary','', $head); + git_print_page_nav('summary','', $head); print "<div class=\"title\"> </div>\n"; print "<table cellspacing=\"0\">\n" .
@@ -1418,24 +1418,24 @@ sub git_summary { "<tr><td>last change</td><td>$cd{'rfc2822'}</td></tr>\n" . "</table>\n"; - open my $fd, "-|", $GIT, "rev-list", "--max-count=17", git_read_head($project) + open my $fd, "-|", $GIT, "rev-list", "--max-count=17", git_get_head_hash($project) or die_error(undef, "Open git-rev-list failed"); my @revlist = map { chomp; $_ } <$fd>; close $fd; - git_header_div('shortlog'); + git_print_header_div('shortlog'); git_shortlog_body(\@revlist, 0, 15, $refs, $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=shortlog")}, "...")); - my $taglist = git_read_refs("refs/tags"); + my $taglist = git_get_refs_list("refs/tags"); if (defined @$taglist) { - git_header_div('tags'); + git_print_header_div('tags'); git_tags_body($taglist, 0, 15, $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=tags")}, "...")); } - my $headlist = git_read_refs("refs/heads"); + my $headlist = git_get_refs_list("refs/heads"); if (defined @$headlist) { - git_header_div('heads'); + git_print_header_div('heads'); git_heads_body($headlist, $head, 0, 15, $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=heads")}, "...")); }
@@ -1444,11 +1444,11 @@ sub git_summary { } sub git_tag { - my $head = git_read_head($project); + my $head = git_get_head_hash($project); git_header_html(); - git_page_nav('','', $head,undef,$head); - my %tag = git_read_tag($hash); - git_header_div('commit', esc_html($tag{'name'}), $hash); + git_print_page_nav('','', $head,undef,$head); + my %tag = parse_tag($hash); + git_print_header_div('commit', esc_html($tag{'name'}), $hash); print "<div class=\"title_text\">\n" . "<table cellspacing=\"0\">\n" . "<tr>\n" .
@@ -1457,7 +1457,7 @@ sub git_tag { "<td class=\"link\">" . $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=$tag{'type'};h=$tag{'object'}")}, $tag{'type'}) . "</td>\n" . "</tr>\n"; if (defined($tag{'author'})) { - my %ad = date_str($tag{'epoch'}, $tag{'tz'}); + my %ad = parse_date($tag{'epoch'}, $tag{'tz'}); print "<tr><td>author</td><td>" . esc_html($tag{'author'}) . "</td></tr>\n"; print "<tr><td></td><td>" . $ad{'rfc2822'} . sprintf(" (%02d:%02d %s)", $ad{'hour_local'}, $ad{'minute_local'}, $ad{'tz_local'}) . "</td></tr>\n"; }
@@ -1477,9 +1477,9 @@ sub git_blame2 { my $ftype; die_error(undef, "Permission denied") if (!git_get_project_config_bool ('blame')); die_error('404 Not Found', "File name not defined") if (!$file_name); - $hash_base ||= git_read_head($project); + $hash_base ||= git_get_head_hash($project); die_error(undef, "Couldn't find base commit") unless ($hash_base); - my %co = git_read_commit($hash_base) + my %co = parse_commit($hash_base) or die_error(undef, "Reading commit failed"); if (!defined $hash) { $hash = git_get_hash_by_path($hash_base, $file_name, "blob")
@@ -1495,8 +1495,8 @@ sub git_blame2 { my $formats_nav = $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=blob;h=$hash;hb=$hash_base;f=$file_name")}, "blob") . " | " . $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=blame;f=$file_name")}, "head"); - git_page_nav('','', $hash_base,$co{'tree'},$hash_base, $formats_nav); - git_header_div('commit', esc_html($co{'title'}), $hash_base); + git_print_page_nav('','', $hash_base,$co{'tree'},$hash_base, $formats_nav); + git_print_header_div('commit', esc_html($co{'title'}), $hash_base); git_print_page_path($file_name, $ftype); my @rev_color = (qw(light2 dark2)); my $num_colors = scalar(@rev_color);
@@ -1535,9 +1535,9 @@ sub git_blame { my $fd; die_error('403 Permission denied', "Permission denied") if (!git_get_project_config_bool ('blame')); die_error('404 Not Found', "File name not defined") if (!$file_name); - $hash_base ||= git_read_head($project); + $hash_base ||= git_get_head_hash($project); die_error(undef, "Couldn't find base commit") unless ($hash_base); - my %co = git_read_commit($hash_base) + my %co = parse_commit($hash_base) or die_error(undef, "Reading commit failed"); if (!defined $hash) { $hash = git_get_hash_by_path($hash_base, $file_name, "blob")
@@ -1549,8 +1549,8 @@ sub git_blame { my $formats_nav = $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=blob;h=$hash;hb=$hash_base;f=$file_name")}, "blob") . " | " . $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=blame;f=$file_name")}, "head"); - git_page_nav('','', $hash_base,$co{'tree'},$hash_base, $formats_nav); - git_header_div('commit', esc_html($co{'title'}), $hash_base); + git_print_page_nav('','', $hash_base,$co{'tree'},$hash_base, $formats_nav); + git_print_header_div('commit', esc_html($co{'title'}), $hash_base); git_print_page_path($file_name, 'blob'); print "<div class=\"page_body\">\n"; print <<HTML;
@@ -1618,12 +1618,12 @@ HTML } sub git_tags { - my $head = git_read_head($project); + my $head = git_get_head_hash($project); git_header_html(); - git_page_nav('','', $head,undef,$head); - git_header_div('summary', $project); + git_print_page_nav('','', $head,undef,$head); + git_print_header_div('summary', $project); - my $taglist = git_read_refs("refs/tags"); + my $taglist = git_get_refs_list("refs/tags"); if (defined @$taglist) { git_tags_body($taglist); }
@@ -1631,12 +1631,12 @@ sub git_tags { } sub git_heads { - my $head = git_read_head($project); + my $head = git_get_head_hash($project); git_header_html(); - git_page_nav('','', $head,undef,$head); - git_header_div('summary', $project); + git_print_page_nav('','', $head,undef,$head); + git_print_header_div('summary', $project); - my $taglist = git_read_refs("refs/heads"); + my $taglist = git_get_refs_list("refs/heads"); if (defined @$taglist) { git_heads_body($taglist, $head); }
@@ -1646,7 +1646,7 @@ sub git_heads { sub git_blob_plain { if (!defined $hash) { if (defined $file_name) { - my $base = $hash_base || git_read_head($project); + my $base = $hash_base || git_get_head_hash($project); $hash = git_get_hash_by_path($base, $file_name, "blob") or die_error(undef, "Error lookup file"); } else {
@@ -1657,7 +1657,7 @@ sub git_blob_plain { open my $fd, "-|", $GIT, "cat-file", "blob", $hash or die_error(undef, "Couldn't cat $file_name, $hash"); - $type ||= git_blob_plain_mimetype($fd, $file_name); + $type ||= blob_mimetype($fd, $file_name); # save as filename, even when no $file_name is given my $save_as = "$hash";
@@ -1679,7 +1679,7 @@ sub git_blob_plain { sub git_blob { if (!defined $hash) { if (defined $file_name) { - my $base = $hash_base || git_read_head($project); + my $base = $hash_base || git_get_head_hash($project); $hash = git_get_hash_by_path($base, $file_name, "blob") or die_error(undef, "Error lookup file"); } else {
@@ -1689,14 +1689,14 @@ sub git_blob { my $have_blame = git_get_project_config_bool ('blame'); open my $fd, "-|", $GIT, "cat-file", "blob", $hash or die_error(undef, "Couldn't cat $file_name, $hash"); - my $mimetype = git_blob_plain_mimetype($fd, $file_name); + my $mimetype = blob_mimetype($fd, $file_name); if ($mimetype !~ m/^text\//) { close $fd; return git_blob_plain($mimetype); } git_header_html(); my $formats_nav = ''; - if (defined $hash_base && (my %co = git_read_commit($hash_base))) { + if (defined $hash_base && (my %co = parse_commit($hash_base))) { if (defined $file_name) { if ($have_blame) { $formats_nav .= $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=blame;h=$hash;hb=$hash_base;f=$file_name")}, "blame") . " | ";
@@ -1707,8 +1707,8 @@ sub git_blob { } else { $formats_nav .= $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=blob_plain;h=$hash")}, "plain"); } - git_page_nav('','', $hash_base,$co{'tree'},$hash_base, $formats_nav); - git_header_div('commit', esc_html($co{'title'}), $hash_base); + git_print_page_nav('','', $hash_base,$co{'tree'},$hash_base, $formats_nav); + git_print_header_div('commit', esc_html($co{'title'}), $hash_base); } else { print "<div class=\"page_nav\">\n" . "<br/><br/></div>\n" .
@@ -1730,7 +1730,7 @@ sub git_blob { sub git_tree { if (!defined $hash) { - $hash = git_read_head($project); + $hash = git_get_head_hash($project); if (defined $file_name) { my $base = $hash_base || $hash; $hash = git_get_hash_by_path($base, $file_name, "tree");
@@ -1746,16 +1746,16 @@ sub git_tree { close $fd or die_error(undef, "Reading tree failed"); $/ = "\n"; - my $refs = read_info_ref(); - my $ref = git_get_referencing($refs, $hash_base); + my $refs = git_get_references(); + my $ref = format_ref_marker($refs, $hash_base); git_header_html(); my $base_key = ""; my $base = ""; my $have_blame = git_get_project_config_bool ('blame'); - if (defined $hash_base && (my %co = git_read_commit($hash_base))) { + if (defined $hash_base && (my %co = parse_commit($hash_base))) { $base_key = ";hb=$hash_base"; - git_page_nav('tree','', $hash_base); - git_header_div('commit', esc_html($co{'title'}) . $ref, $hash_base); + git_print_page_nav('tree','', $hash_base); + git_print_header_div('commit', esc_html($co{'title'}) . $ref, $hash_base); } else { print "<div class=\"page_nav\">\n"; print "<br/><br/></div>\n";
@@ -1811,14 +1811,14 @@ sub git_tree { } sub git_log { - my $head = git_read_head($project); + my $head = git_get_head_hash($project); if (!defined $hash) { $hash = $head; } if (!defined $page) { $page = 0; } - my $refs = read_info_ref(); + my $refs = git_get_references(); my $limit = sprintf("--max-count=%i", (100 * ($page+1))); open my $fd, "-|", $GIT, "rev-list", $limit, $hash
@@ -1826,24 +1826,24 @@ sub git_log { my @revlist = map { chomp; $_ } <$fd>; close $fd; - my $paging_nav = git_get_paging_nav('log', $hash, $head, $page, $#revlist); + my $paging_nav = format_paging_nav('log', $hash, $head, $page, $#revlist); git_header_html(); - git_page_nav('log','', $hash,undef,undef, $paging_nav); + git_print_page_nav('log','', $hash,undef,undef, $paging_nav); if (!@revlist) { - my %co = git_read_commit($hash); + my %co = parse_commit($hash); - git_header_div('summary', $project); + git_print_header_div('summary', $project); print "<div class=\"page_body\"> Last change $co{'age_string'}.<br/><br/></div>\n"; } for (my $i = ($page * 100); $i <= $#revlist; $i++) { my $commit = $revlist[$i]; - my $ref = git_get_referencing($refs, $commit); - my %co = git_read_commit($commit); + my $ref = format_ref_marker($refs, $commit); + my %co = parse_commit($commit); next if !%co; - my %ad = date_str($co{'author_epoch'}); - git_header_div('commit', + my %ad = parse_date($co{'author_epoch'}); + git_print_header_div('commit', "<span class=\"age\">$co{'age_string'}</span>" . esc_html($co{'title'}) . $ref, $commit);
@@ -1881,12 +1881,12 @@ sub git_log { } sub git_commit { - my %co = git_read_commit($hash); + my %co = parse_commit($hash); if (!%co) { die_error(undef, "Unknown commit object"); } - my %ad = date_str($co{'author_epoch'}, $co{'author_tz'}); - my %cd = date_str($co{'committer_epoch'}, $co{'committer_tz'}); + my %ad = parse_date($co{'author_epoch'}, $co{'author_tz'}); + my %cd = parse_date($co{'committer_epoch'}, $co{'committer_tz'}); my $parent = $co{'parent'}; if (!defined $parent) {
@@ -1902,22 +1902,22 @@ sub git_commit { if ($hash =~ m/^[0-9a-fA-F]{40}$/) { $expires = "+1d"; } - my $refs = read_info_ref(); - my $ref = git_get_referencing($refs, $co{'id'}); + my $refs = git_get_references(); + my $ref = format_ref_marker($refs, $co{'id'}); my $formats_nav = ''; if (defined $file_name && defined $co{'parent'}) { my $parent = $co{'parent'}; $formats_nav .= $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=blame;hb=$parent;f=$file_name")}, "blame"); } git_header_html(undef, $expires); - git_page_nav('commit', defined $co{'parent'} ? '' : 'commitdiff', + git_print_page_nav('commit', defined $co{'parent'} ? '' : 'commitdiff', $hash, $co{'tree'}, $hash, $formats_nav); if (defined $co{'parent'}) { - git_header_div('commitdiff', esc_html($co{'title'}) . $ref, $hash); + git_print_header_div('commitdiff', esc_html($co{'title'}) . $ref, $hash); } else { - git_header_div('tree', esc_html($co{'title'}) . $ref, $co{'tree'}, $hash); + git_print_header_div('tree', esc_html($co{'title'}) . $ref, $co{'tree'}, $hash); } print "<div class=\"title_text\">\n" . "<table cellspacing=\"0\">\n";
@@ -2079,11 +2079,11 @@ sub git_commit { sub git_blobdiff { mkdir($git_temp, 0700); git_header_html(); - if (defined $hash_base && (my %co = git_read_commit($hash_base))) { + if (defined $hash_base && (my %co = parse_commit($hash_base))) { my $formats_nav = $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=blobdiff_plain;h=$hash;hp=$hash_parent")}, "plain"); - git_page_nav('','', $hash_base,$co{'tree'},$hash_base, $formats_nav); - git_header_div('commit', esc_html($co{'title'}), $hash_base); + git_print_page_nav('','', $hash_base,$co{'tree'},$hash_base, $formats_nav); + git_print_header_div('commit', esc_html($co{'title'}), $hash_base); } else { print "<div class=\"page_nav\">\n" . "<br/><br/></div>\n" .
@@ -2109,7 +2109,7 @@ sub git_blobdiff_plain { sub git_commitdiff { mkdir($git_temp, 0700); - my %co = git_read_commit($hash); + my %co = parse_commit($hash); if (!%co) { die_error(undef, "Unknown commit object"); }
@@ -2126,13 +2126,13 @@ sub git_commitdiff { if ($hash =~ m/^[0-9a-fA-F]{40}$/) { $expires = "+1d"; } - my $refs = read_info_ref(); - my $ref = git_get_referencing($refs, $co{'id'}); + my $refs = git_get_references(); + my $ref = format_ref_marker($refs, $co{'id'}); my $formats_nav = $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=commitdiff_plain;h=$hash;hp=$hash_parent")}, "plain"); git_header_html(undef, $expires); - git_page_nav('commitdiff','', $hash,$co{'tree'},$hash, $formats_nav); - git_header_div('commit', esc_html($co{'title'}) . $ref, $hash); + git_print_page_nav('commitdiff','', $hash,$co{'tree'},$hash, $formats_nav); + git_print_header_div('commit', esc_html($co{'title'}) . $ref, $hash); print "<div class=\"page_body\">\n"; my $comment = $co{'comment'}; my $empty = 0;
@@ -2200,7 +2200,7 @@ sub git_commitdiff { sub git_commitdiff_plain { mkdir($git_temp, 0700); - my %co = git_read_commit($hash); + my %co = parse_commit($hash); if (!%co) { die_error(undef, "Unknown commit object"); }
@@ -2214,7 +2214,7 @@ sub git_commitdiff_plain { # try to figure out the next tag after this commit my $tagname; - my $refs = read_info_ref("tags"); + my $refs = git_get_references("tags"); open $fd, "-|", $GIT, "rev-list", "HEAD"; my @commits = map { chomp; $_ } <$fd>; close $fd;
@@ -2228,7 +2228,7 @@ sub git_commitdiff_plain { } print $cgi->header(-type => "text/plain", -charset => 'utf-8', '-content-disposition' => "inline; filename=\"git-$hash.patch\""); - my %ad = date_str($co{'author_epoch'}, $co{'author_tz'}); + my %ad = parse_date($co{'author_epoch'}, $co{'author_tz'}); my $comment = $co{'comment'}; print "From: $co{'author'}\n" . "Date: $ad{'rfc2822'} ($ad{'tz_local'})\n".
@@ -2264,17 +2264,17 @@ sub git_commitdiff_plain { sub git_history { if (!defined $hash_base) { - $hash_base = git_read_head($project); + $hash_base = git_get_head_hash($project); } my $ftype; - my %co = git_read_commit($hash_base); + my %co = parse_commit($hash_base); if (!%co) { die_error(undef, "Unknown commit object"); } - my $refs = read_info_ref(); + my $refs = git_get_references(); git_header_html(); - git_page_nav('','', $hash_base,$co{'tree'},$hash_base); - git_header_div('commit', esc_html($co{'title'}), $hash_base); + git_print_page_nav('','', $hash_base,$co{'tree'},$hash_base); + git_print_header_div('commit', esc_html($co{'title'}), $hash_base); if (!defined $hash && defined $file_name) { $hash = git_get_hash_by_path($hash_base, $file_name); }
@@ -2290,11 +2290,11 @@ sub git_history { while (my $line = <$fd>) { if ($line =~ m/^([0-9a-fA-F]{40})/){ my $commit = $1; - my %co = git_read_commit($commit); + my %co = parse_commit($commit); if (!%co) { next; } - my $ref = git_get_referencing($refs, $commit); + my $ref = format_ref_marker($refs, $commit); if ($alternate) { print "<tr class=\"dark\">\n"; } else {
@@ -2330,9 +2330,9 @@ sub git_search { die_error(undef, "Text field empty"); } if (!defined $hash) { - $hash = git_read_head($project); + $hash = git_get_head_hash($project); } - my %co = git_read_commit($hash); + my %co = parse_commit($hash); if (!%co) { die_error(undef, "Unknown commit object"); }
@@ -2351,8 +2351,8 @@ sub git_search { $pickaxe_search = 1; } git_header_html(); - git_page_nav('','', $hash,$co{'tree'},$hash); - git_header_div('commit', esc_html($co{'title'}), $hash); + git_print_page_nav('','', $hash,$co{'tree'},$hash); + git_print_header_div('commit', esc_html($co{'title'}), $hash); print "<table cellspacing=\"0\">\n"; my $alternate = 0;
@@ -2370,7 +2370,7 @@ sub git_search { next; } my @commit_lines = split "\n", $commit_text; - my %co = git_read_commit(undef, \@commit_lines); + my %co = parse_commit(undef, \@commit_lines); if (!%co) { next; }
@@ -2451,7 +2451,7 @@ sub git_search { print "</td>\n" . "</tr>\n"; } - %co = git_read_commit($1); + %co = parse_commit($1); } } close $fd;
@@ -2461,14 +2461,14 @@ sub git_search { } sub git_shortlog { - my $head = git_read_head($project); + my $head = git_get_head_hash($project); if (!defined $hash) { $hash = $head; } if (!defined $page) { $page = 0; } - my $refs = read_info_ref(); + my $refs = git_get_references(); my $limit = sprintf("--max-count=%i", (100 * ($page+1))); open my $fd, "-|", $GIT, "rev-list", $limit, $hash
@@ -2476,7 +2476,7 @@ sub git_shortlog { my @revlist = map { chomp; $_ } <$fd>; close $fd; - my $paging_nav = git_get_paging_nav('shortlog', $hash, $head, $page, $#revlist); + my $paging_nav = format_paging_nav('shortlog', $hash, $head, $page, $#revlist); my $next_link = ''; if ($#revlist >= (100 * ($page+1)-1)) { $next_link =
@@ -2486,8 +2486,8 @@ sub git_shortlog { git_header_html(); - git_page_nav('shortlog','', $hash,$hash,$hash, $paging_nav); - git_header_div('summary', $project); + git_print_page_nav('shortlog','', $hash,$hash,$hash, $paging_nav); + git_print_header_div('summary', $project); git_shortlog_body(\@revlist, ($page * 100), $#revlist, $refs, $next_link);
@@ -2499,7 +2499,7 @@ ## feeds (RSS, OPML) sub git_rss { # http://www.notestips.com/80256B3A007F2692/1/NAMO5P9UPQ - open my $fd, "-|", $GIT, "rev-list", "--max-count=150", git_read_head($project) + open my $fd, "-|", $GIT, "rev-list", "--max-count=150", git_get_head_hash($project) or die_error(undef, "Open git-rev-list failed"); my @revlist = map { chomp; $_ } <$fd>; close $fd or die_error(undef, "Reading git-rev-list failed");
@@ -2514,12 +2514,12 @@ sub git_rss { for (my $i = 0; $i <= $#revlist; $i++) { my $commit = $revlist[$i]; - my %co = git_read_commit($commit); + 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)) { last; } - my %cd = date_str($co{'committer_epoch'}); + my %cd = parse_date($co{'committer_epoch'}); open $fd, "-|", $GIT, "diff-tree", '-r', $co{'parent'}, $co{'id'} or next; my @difftree = map { chomp; $_ } <$fd>; close $fd or next;
@@ -2556,7 +2556,7 @@ sub git_rss { } sub git_opml { - my @list = git_read_projects(); + my @list = git_get_projects_list(); print $cgi->header(-type => 'text/xml', -charset => 'utf-8'); print "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n".
@@ -2569,12 +2569,12 @@ sub git_opml { foreach my $pr (@list) { my %proj = %$pr; - my $head = git_read_head($proj{'path'}); + my $head = git_get_head_hash($proj{'path'}); if (!defined $head) { next; } $ENV{'GIT_DIR'} = "$projectroot/$proj{'path'}"; - my %co = git_read_commit($head); + my %co = parse_commit($head); if (!%co) { next; }
Signature · 1 line
1.4.1.1
Re: [PATCH 1/9] gitweb: Great subroutines renaming
Quoted 5 lines · Jakub Narebski
I'm not sure if to add script used to create this commit, and to port changes to be "post-rename". Here it is:
#!/bin/bash
if test -z "$1"; then
Quoted 7 lines
FILE=`git rev-parse --show-cdup`gitweb/gitweb.perl else FILE=$1 fi echo "Great subroutine renaming: $FILE" perl -s -p -i.re~ \ -e 's/\bgit_get_referencing\b/format_ref_marker/;' \
Will apply, but I suspect all of these need g at the end as in "s/foo/bar/g;".
PATCH 2/9 gitweb: Separate ref parsing in git_get_refs_list into parse_ref
In reply to Jakub NarebskiNote that for each ref there are usually two calls to git subroutines:
first to get the type of ref, second to parse ref if ref is of commit or tag type.
--- gitweb/gitweb.perl | 80 +++++++++++++++++++++++++++++----------------------- 1 files changed, 45 insertions(+), 35 deletions(-)
gitweb/gitweb.perl +45 -35
@@ -690,6 +690,49 @@ sub parse_commit { return %co; } +# parse ref from ref_file, given by ref_id, with given type +sub parse_ref { + my $ref_file = shift; + my $ref_id = shift; + my $type = shift || git_get_type($ref_id); + my %ref_item; + + $ref_item{'type'} = $type; + $ref_item{'id'} = $ref_id; + $ref_item{'epoch'} = 0; + $ref_item{'age'} = "unknown"; + if ($type eq "tag") { + my %tag = parse_tag($ref_id); + $ref_item{'comment'} = $tag{'comment'}; + if ($tag{'type'} eq "commit") { + my %co = parse_commit($tag{'object'}); + $ref_item{'epoch'} = $co{'committer_epoch'}; + $ref_item{'age'} = $co{'age_string'}; + } elsif (defined($tag{'epoch'})) { + my $age = time - $tag{'epoch'}; + $ref_item{'epoch'} = $tag{'epoch'}; + $ref_item{'age'} = age_string($age); + } + $ref_item{'reftype'} = $tag{'type'}; + $ref_item{'name'} = $tag{'name'}; + $ref_item{'refid'} = $tag{'object'}; + } elsif ($type eq "commit"){ + my %co = parse_commit($ref_id); + $ref_item{'reftype'} = "commit"; + $ref_item{'name'} = $ref_file; + $ref_item{'title'} = $co{'title'}; + $ref_item{'refid'} = $ref_id; + $ref_item{'epoch'} = $co{'committer_epoch'}; + $ref_item{'age'} = $co{'age_string'}; + } else { + $ref_item{'reftype'} = $type; + $ref_item{'name'} = $ref_file; + $ref_item{'refid'} = $ref_id; + } + + return %ref_item; +} + ## ...................................................................... ## parse to array of hashes functions
@@ -709,44 +752,11 @@ sub git_get_refs_list { foreach my $ref_file (@refs) { my $ref_id = git_get_hash_by_ref("$project/$ref_dir/$ref_file"); my $type = git_get_type($ref_id) || next; - my %ref_item; - my %co; - $ref_item{'type'} = $type; - $ref_item{'id'} = $ref_id; - $ref_item{'epoch'} = 0; - $ref_item{'age'} = "unknown"; - if ($type eq "tag") { - my %tag = parse_tag($ref_id); - $ref_item{'comment'} = $tag{'comment'}; - if ($tag{'type'} eq "commit") { - %co = parse_commit($tag{'object'}); - $ref_item{'epoch'} = $co{'committer_epoch'}; - $ref_item{'age'} = $co{'age_string'}; - } elsif (defined($tag{'epoch'})) { - my $age = time - $tag{'epoch'}; - $ref_item{'epoch'} = $tag{'epoch'}; - $ref_item{'age'} = age_string($age); - } - $ref_item{'reftype'} = $tag{'type'}; - $ref_item{'name'} = $tag{'name'}; - $ref_item{'refid'} = $tag{'object'}; - } elsif ($type eq "commit"){ - %co = parse_commit($ref_id); - $ref_item{'reftype'} = "commit"; - $ref_item{'name'} = $ref_file; - $ref_item{'title'} = $co{'title'}; - $ref_item{'refid'} = $ref_id; - $ref_item{'epoch'} = $co{'committer_epoch'}; - $ref_item{'age'} = $co{'age_string'}; - } else { - $ref_item{'reftype'} = $type; - $ref_item{'name'} = $ref_file; - $ref_item{'refid'} = $ref_id; - } + my %ref_item = parse_ref($ref_file, $ref_id, $type); push @reflist, \%ref_item; } - # sort tags by age + # sort refs by age @reflist = sort {$b->{'epoch'} <=> $a->{'epoch'}} @reflist; return \@reflist; }
Signature · 1 line
1.4.1.1
Re: [PATCH 2/9] gitweb: Separate ref parsing in git_get_refs_list into parse_ref
Quoted 14 lines · Jakub Narebski
Note that for each ref there are usually two calls to git subroutines:
first to get the type of ref, second to parse ref if ref is of commit or tag type.Signed-off-by Jakub Narebski <[email protected]>--- gitweb/gitweb.perl | 80 +++++++++++++++++++++++++++++----------------------- 1 files changed, 45 insertions(+), 35 deletions(-)gitweb/gitweb.perl +0
-0
gitweb/gitweb.perl sub parse_commit { · line 697
Quoted 8 lines
gitweb/gitweb.perl +5
-0@@ -690,6 +690,49 @@ sub parse_commit { return %co; } +# parse ref from ref_file, given by ref_id, with given type +sub parse_ref { + my $ref_file = shift; + my $ref_id = shift; + my $type = shift || git_get_type($ref_id);
This git_get_type() is additional from the original. Future-proofing yourself for other new callers?
Re: [PATCH 2/9] gitweb: Separate ref parsing in git_get_refs_list into parse_ref
Quoted 5 lines · Junio C Hamano
Quoted 3 lines · Jakub Narebski
Note that for each ref there are usually two calls to git subroutines:
first to get the type of ref, second to parse ref if ref is of commit or tag type.
[...]
Quoted 8 lines
gitweb/gitweb.perl sub parse_commit { · line 697
Quoted 5 lines
gitweb/gitweb.perl +5
-0+# parse ref from ref_file, given by ref_id, with given type +sub parse_ref { + my $ref_file = shift; + my $ref_id = shift; + my $type = shift || git_get_type($ref_id);This
git_get_type()is additional from the original. Future-proofing yourself for other new callers?
Yes, just in case.
Signature · 3 lines
Jakub Narebski Warsaw, Poland ShadeHawk on #git
PATCH 3/9 gitweb: Refactor printing shortened title in git_shortlog_body and git_tags_body
In reply to Jakub NarebskiSeparate printing of perhaps shortened title (subject) in git_shortlog_body and git_tags_body into format_subject_html.
While at it, remove presentation element <b>...</b> used to format title (subject) and move formatting to CSS.
---
CSS is used in such a way as to not change output
gitweb/gitweb.css | 5 +++++ gitweb/gitweb.perl | 34 ++++++++++++++++++---------------- 2 files changed, 23 insertions(+), 16 deletions(-)
gitweb/gitweb.css +5 -0
@@ -117,9 +117,14 @@ div.list_head { a.list { text-decoration: none; + font-weight: bold; color: #000000; } +table.tags a.list { + font-weight: normal; +} + a.list:hover { text-decoration: underline; color: #880000;
gitweb/gitweb.perl +18 -16
@@ -372,6 +372,22 @@ sub format_ref_marker { } } +# format, perhaps shortened and with markers, title line +sub format_subject_html { + my ($long, $short, $query, $extra) = @_; + $extra = '' unless defined($extra); + + if (length($short) < length($long)) { + return $cgi->a({-href => "$my_uri?" . esc_param($query), + -class => "list", -title => $long}, + esc_html($short) . $extra); + } else { + return $cgi->a({-href => "$my_uri?" . esc_param($query), + -class => "list"}, + esc_html($long) . $extra); + } +} + ## ---------------------------------------------------------------------- ## git utility subroutines, invoking git commands
@@ -1085,15 +1101,7 @@ sub git_shortlog_body { print "<td title=\"$co{'age_string_age'}\"><i>$co{'age_string_date'}</i></td>\n" . "<td><i>" . esc_html(chop_str($co{'author_name'}, 10)) . "</i></td>\n" . "<td>"; - if (length($co{'title_short'}) < length($co{'title'})) { - print $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=commit;h=$commit"), - -class => "list", -title => "$co{'title'}"}, - "<b>" . esc_html($co{'title_short'}) . "$ref</b>"); - } else { - print $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=commit;h=$commit"), - -class => "list"}, - "<b>" . esc_html($co{'title'}) . "$ref</b>"); - } + print format_subject_html($co{'title'}, $co{'title_short'}, "p=$project;a=commit;h=$commit", $ref); print "</td>\n" . "<td class=\"link\">" . $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=commit;h=$commit")}, "commit") . " | " .
@@ -1139,13 +1147,7 @@ sub git_tags_body { "</td>\n" . "<td>"; if (defined $comment) { - if (length($comment_short) < length($comment)) { - print $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=tag;h=$tag{'id'}"), - -class => "list", -title => $comment}, $comment_short); - } else { - print $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=tag;h=$tag{'id'}"), - -class => "list"}, $comment); - } + print format_subject_html($comment, $comment_short, "p=$project;a=tag;h=$tag{'id'}"); } print "</td>\n" . "<td class=\"selflink\">";
Signature · 1 line
1.4.1.1
Re: [PATCH 3/9] gitweb: Refactor printing shortened title in git_shortlog_body and git_tags_body
Beautiful.
PATCH 4/9 gitweb: Separate main part of git_history into git_history_body
In reply to Jakub NarebskiSeparates main part of git_history into git_history_body subroutine, and makes output more similar to git_shortlog. Adds "diff to current" link only for history of regular file (blob).
--- gitweb/gitweb.perl | 96 +++++++++++++++++++++++++++++++++------------------- 1 files changed, 60 insertions(+), 36 deletions(-)
gitweb/gitweb.perl +60 -36
@@ -1117,6 +1117,64 @@ sub git_shortlog_body { print "</table>\n"; } +sub git_history_body { + # Warning: assumes constant type (blob or tree) during history + my ($fd, $refs, $hash_base, $ftype, $extra) = @_; + + print "<table class=\"history\" cellspacing=\"0\">\n"; + my $alternate = 0; + while (my $line = <$fd>) { + if ($line !~ m/^([0-9a-fA-F]{40})/) { + next; + } + + my $commit = $1; + my %co = parse_commit($commit); + if (!%co) { + next; + } + + my $ref = format_ref_marker($refs, $commit); + + if ($alternate) { + print "<tr class=\"dark\">\n"; + } else { + print "<tr class=\"light\">\n"; + } + $alternate ^= 1; + print "<td title=\"$co{'age_string_age'}\"><i>$co{'age_string_date'}</i></td>\n" . + # shortlog uses chop_str($co{'author_name'}, 10) + "<td><i>" . esc_html(chop_str($co{'author_name'}, 15, 3)) . "</i></td>\n" . + "<td>"; + # originally git_history used chop_str($co{'title'}, 50) + print format_subject_html($co{'title'}, $co{'title_short'}, "p=$project;a=commit;h=$commit", $ref); + print "</td>\n" . + "<td class=\"link\">" . + $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=commit;h=$commit")}, "commit") . " | " . + $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=commitdiff;h=$commit")}, "commitdiff") . " | " . + $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=$ftype;hb=$commit;f=$file_name")}, $ftype); + + if ($ftype eq 'blob') { + my $blob_current = git_get_hash_by_path($hash_base, $file_name); + my $blob_parent = git_get_hash_by_path($commit, $file_name); + if (defined $blob_current && defined $blob_parent && + $blob_current ne $blob_parent) { + print " | " . + $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=blobdiff;h=$blob_current;hp=$blob_parent;hb=$commit;f=$file_name")}, + "diff to current"); + } + } + print "</td>\n" . + "</tr>\n"; + } + if (defined $extra) { + print "<tr>\n" . + "<td colspan=\"4\">$extra</td>\n" . + "</tr>\n"; + } + print "</table>\n"; +} + sub git_tags_body { # uses global variable $project my ($taglist, $from, $to, $extra) = @_;
@@ -2297,42 +2355,8 @@ sub git_history { open my $fd, "-|", $GIT, "rev-list", "--full-history", $hash_base, "--", $file_name; - print "<table cellspacing=\"0\">\n"; - my $alternate = 0; - while (my $line = <$fd>) { - if ($line =~ m/^([0-9a-fA-F]{40})/){ - my $commit = $1; - my %co = parse_commit($commit); - if (!%co) { - next; - } - my $ref = format_ref_marker($refs, $commit); - if ($alternate) { - print "<tr class=\"dark\">\n"; - } else { - print "<tr class=\"light\">\n"; - } - $alternate ^= 1; - print "<td title=\"$co{'age_string_age'}\"><i>$co{'age_string_date'}</i></td>\n" . - "<td><i>" . esc_html(chop_str($co{'author_name'}, 15, 3)) . "</i></td>\n" . - "<td>" . $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=commit;h=$commit"), -class => "list"}, "<b>" . - esc_html(chop_str($co{'title'}, 50)) . "$ref</b>") . "</td>\n" . - "<td class=\"link\">" . - $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=commit;h=$commit")}, "commit") . - " | " . $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=commitdiff;h=$commit")}, "commitdiff") . - " | " . $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=$ftype;hb=$commit;f=$file_name")}, $ftype); - my $blob = git_get_hash_by_path($hash_base, $file_name); - my $blob_parent = git_get_hash_by_path($commit, $file_name); - if (defined $blob && defined $blob_parent && $blob ne $blob_parent) { - print " | " . - $cgi->a({-href => "$my_uri?" . esc_param("p=$project;a=blobdiff;h=$blob;hp=$blob_parent;hb=$commit;f=$file_name")}, - "diff to current"); - } - print "</td>\n" . - "</tr>\n"; - } - } - print "</table>\n"; + git_history_body($fd, $refs, $hash_base, $ftype); + close $fd; git_footer_html(); }
Signature · 1 line
1.4.1.1
PATCH 5/9 gitweb: Separate finding project owner into git_get_project_owner
In reply to Jakub Narebski---
And added some comments, while at it.
gitweb/gitweb.perl | 50 ++++++++++++++++++++++++++++++++------------------ 1 files changed, 32 insertions(+), 18 deletions(-)
gitweb/gitweb.perl +32 -18
@@ -527,6 +527,37 @@ sub git_get_projects_list { return @list; } +sub git_get_project_owner { + my $project = shift; + my $owner; + + return undef unless $project; + + # read from file (url-encoded): + # 'git%2Fgit.git Linus+Torvalds' + # 'libs%2Fklibc%2Fklibc.git H.+Peter+Anvin' + # 'linux%2Fhotplug%2Fudev.git Greg+Kroah-Hartman' + if (-f $projects_list) { + open (my $fd , $projects_list); + while (my $line = <$fd>) { + chomp $line; + my ($pr, $ow) = split ' ', $line; + $pr = unescape($pr); + $ow = unescape($ow); + if ($pr eq $project) { + $owner = decode("utf8", $ow, Encode::FB_DEFAULT); + last; + } + } + close $fd; + } + if (!defined $owner) { + $owner = get_file_owner("$projectroot/$project"); + } + + return $owner; +} + sub git_get_references { my $type = shift || ""; my %refs;
@@ -1458,24 +1489,7 @@ sub git_summary { my %co = parse_commit($head); my %cd = parse_date($co{'committer_epoch'}, $co{'committer_tz'}); - my $owner; - if (-f $projects_list) { - open (my $fd , $projects_list); - while (my $line = <$fd>) { - chomp $line; - my ($pr, $ow) = split ' ', $line; - $pr = unescape($pr); - $ow = unescape($ow); - if ($pr eq $project) { - $owner = decode("utf8", $ow, Encode::FB_DEFAULT); - last; - } - } - close $fd; - } - if (!defined $owner) { - $owner = get_file_owner("$projectroot/$project"); - } + my $owner = git_get_project_owner($project); my $refs = git_get_references(); git_header_html();
Signature · 1 line
1.4.1.1
PATCH 6/9 gitweb: Change appereance of marker of refs pointing to given object
In reply to Jakub NarebskiChange git_get_references to include type of ref in the %refs value, which means putting everything after 'refs/' as a ref name, not only last part of the name. Instead of separating refs pointing to the same object by " / " separator, use anonymous array reference to store all refs pointing to given object.
Use 'git-ls-remote .' if $projectroot/$project/info/refs does not exist. (Perhaps it should be used always.)
Refs are now in separate span elements. Class is dependent on the ref
type: currently known classes are 'tag', 'head', 'remote', and 'ref' (last one for HEAD and other refs in the main directory). There is encompassing span element of class refs, just in case of unknown ref type.
This might be considered cleaner separating of git_get_references into filling %refs hash only, and not taking part in formatting ref marker.
---
Alternate solution to the one proposed by Thomas Kolejka in
"[PATCH] gitweb: Different colours for tags and heads"
Message-Id: <[email protected]>
CSS and format_ref_marker is conservative: as of now it should not be "ref" (generic) type of references.
gitweb/gitweb.css | 19 +++++++++++++++++-- gitweb/gitweb.perl | 37 ++++++++++++++++++++++++++++++------- 2 files changed, 47 insertions(+), 9 deletions(-)
gitweb/gitweb.css +17 -2
@@ -326,15 +326,30 @@ a.rss_logo:hover { background-color: #ee5500; } -span.tag { +span.refs span { padding: 0px 4px; font-size: 10px; font-weight: normal; - background-color: #ffffaa; border: 1px solid; + background-color: #ffaaff; + border-color: #ffccff #ff00ee #ff00ee #ffccff; +} + +span.refs span.ref { + background-color: #aaaaff; + border-color: #ccccff #0033cc #0033cc #ccccff; +} + +span.refs span.tag { + background-color: #ffffaa; border-color: #ffffcc #ffee00 #ffee00 #ffffcc; } +span.refs span.head { + background-color: #aaffaa; + border-color: #ccffcc #00cc33 #00cc33 #ccffcc; +} + span.atnight { color: #cc0000; }
gitweb/gitweb.perl +30 -7
@@ -364,9 +364,26 @@ sub format_log_line_html { # format marker of refs pointing to given object sub format_ref_marker { my ($refs, $id) = @_; + my $markers = ''; if (defined $refs->{$id}) { - return ' <span class="tag">' . esc_html($refs->{$id}) . '</span>'; + foreach my $ref (@{$refs->{$id}}) { + my ($type, $name) = qw(); + # e.g. tags/v2.6.11 or heads/next + if ($ref =~ m!^(.*?)s?/(.*)$!) { + $type = $1; + $name = $2; + } else { + $type = "ref"; + $name = $ref; + } + + $markers .= " <span class=\"$type\">" . esc_html($name) . "</span>"; + } + } + + if ($markers) { + return ' <span class="refs">'. $markers . '</span>'; } else { return ""; }
@@ -561,18 +578,24 @@ sub git_get_project_owner { sub git_get_references { my $type = shift || ""; my %refs; + my $fd; # 5dc01c595e6c6ec9ccda4f6f69c131c0dd945f8c refs/tags/v2.6.11 # c39ae07f393806ccf406ef966e9a15afc43cc36a refs/tags/v2.6.11^{} - open my $fd, "$projectroot/$project/info/refs" or return; + if (-f "$projectroot/$project/info/refs") { + open $fd, "$projectroot/$project/info/refs" + or return; + } else { + open $fd, "-|", $GIT, "ls-remote", "." + or return; + } + while (my $line = <$fd>) { chomp $line; - # attention: for $type == "" it saves only last path part of ref name - # e.g. from 'refs/heads/jn/gitweb' it would leave only 'gitweb' - if ($line =~ m/^([0-9a-fA-F]{40})\t.*$type\/([^\^]+)/) { + if ($line =~ m/^([0-9a-fA-F]{40})\trefs\/($type\/?[^\^]+)/) { if (defined $refs{$1}) { - $refs{$1} .= " / $2"; + push @{$refs{$1}}, $2; } else { - $refs{$1} = $2; + $refs{$1} = [ $2 ]; } } }
Signature · 1 line
1.4.1.1
Re: [PATCH 6/9] gitweb: Change appereance of marker of refs pointing to given object
Quoted 5 lines · Jakub Narebski
Change
git_get_referencesto include type of ref in the %refs value, which means putting everything after 'refs/' as a ref name, not only last part of the name. Instead of separating refs pointing to the same object by " / " separator, use anonymous array reference to store all refs pointing to given object.
Earlier version of the patch used ':' (instead of ' / ') to concatenate multiple refs pointing to the same object, then split on ':'. Character ':' was used because it cannot be part of valid ref name (as of git-check-ref-name).
Note that usually there is at most one ref pointing to given object; multiple refs are quite rare (usually when starting new branch, or just tagged a branch).
Signature · 2 lines
Jakub Narebski Poland
Re: [PATCH 6/9] gitweb: Change appereance of marker of refs pointing to given object
In reply to Jakub NarebskiQuoted 6 lines · Jakub Narebski
Change
git_get_referencesto include type of ref in the %refs value, which means putting everything after 'refs/' as a ref name, not only last part of the name. Instead of separating refs pointing to the same object by " / " separator, use anonymous array reference to store all refs pointing to given object.
Quoted 8 lines
Use 'git-ls-remote .' if $projectroot/$project/info/refs does not exist. (Perhaps it should be used always.)
Refs are now in separate span elements. Class is dependent on the ref
type: currently known classes are 'tag', 'head', 'remote', and 'ref' (last one for HEAD and other refs in the main directory). There is encompassing span element of class refs, just in case of unknown ref type.
I do not see definition that matches "span.refs span.remote" in the CSS, though.
Quoted 5 lines
gitweb/gitweb.perl +0
-0
gitweb/gitweb.perl sub format_log_line_html { · line 371
Quoted 9 lines
gitweb/gitweb.perl +3
-1@@ -364,9 +364,26 @@ sub format_log_line_html { # format marker of refs pointing to given object sub format_ref_marker { my ($refs, $id) = @_; + my $markers = ''; if (defined $refs->{$id}) { - return ' <span class="tag">' . esc_html($refs->{$id}) . '</span>'; + foreach my $ref (@{$refs->{$id}}) { + my ($type, $name) = qw();
Just () -- qw() is not needed.
gitweb/gitweb.perl sub format_log_line_html { · line 379
Quoted 8 lines
gitweb/gitweb.perl +8
-0+ # e.g. tags/v2.6.11 or heads/next + if ($ref =~ m!^(.*?)s?/(.*)$!) { + $type = $1; + $name = $2; + } else { + $type = "ref"; + $name = $ref; + }
Hmph. Maybe have a hash that defines the ones you know how to handle, and do something like:
if ($ref =~ m|^([^/]+)/(.*)$| && exists $i_know_this_class{$1}) {
$type = $1;
$name = $2;
}
else {
$type = 'ref';
$name = $ref;
}gitweb/gitweb.perl sub git_get_project_owner { · line 600
Quoted 11 lines
gitweb/gitweb.perl +3
-2@@ -561,18 +578,24 @@ sub git_get_project_owner { + if ($line =~ m/^([0-9a-fA-F]{40})\trefs\/($type\/?[^\^]+)/) { if (defined $refs{$1}) { - $refs{$1} .= " / $2"; + push @{$refs{$1}}, $2; } else { - $refs{$1} = $2; + $refs{$1} = [ $2 ]; } }
It would work as in your patch, but I would have preferred to see "exists $refs{$1}" there instead of "defined".
Or lose the if() and do it like this, which would be cleaner?
if ($line =~ ...) {
push @{$refs{$1}}, $2;
}Re: [PATCH 6/9] gitweb: Change appereance of marker of refs pointing to given object
Quoted 11 lines · Junio C Hamano
Quoted 9 lines · Jakub Narebski
Change
git_get_referencesto include type of ref in the %refs value, which means putting everything after 'refs/' as a ref name, not only last part of the name. Instead of separating refs pointing to the same object by " / " separator, use anonymous array reference to store all refs pointing to given object.Use 'git-ls-remote .' if $projectroot/$project/info/refs does not exist. (Perhaps it should be used always.)
Quoted 8 lines
Quoted 5 lines
Refs are now in separate span elements. Class is dependent on the ref
type: currently known classes are 'tag', 'head', 'remote', and 'ref' (last one for HEAD and other refs in the main directory). There is encompassing span element of class refs, just in case of unknown ref type.I do not see definition that matches "span.refs span.remote" in the CSS, though.
It get's default style "span.refs span" (and fefault colors).
Quoted 12 lines
gitweb/gitweb.perl sub format_log_line_html { · line 379
Quoted 8 lines
gitweb/gitweb.perl +8
-0+ # e.g. tags/v2.6.11 or heads/next + if ($ref =~ m!^(.*?)s?/(.*)$!) { + $type = $1; + $name = $2; + } else { + $type = "ref"; + $name = $ref; + }Hmph. Maybe have a hash that defines the ones you know how to handle, and do something like:
Quoted 8 lines
if ($ref =~ m|^([^/]+)/(.*)$| && exists $i_know_this_class{$1}) {
$type = $1;
$name = $2;
}
else {
$type = 'ref';
$name = $ref;
}But what types are known is defined in CSS, not in gitweb.perl. The rule is that type is defined by first component of the ref name, in singular form (so with optional final s removed, refs -> ref, tags -> tag, remotes -> remote). All unknown types get default "span.refs span" format, thanks to encompassing span element.
"ref" class is for refs directly in $GIT_DIR, like HEAD or ORIG_HEAD (as of now you cannot get such a ref due to the regexp used in git_get_references, and the fact that you have no such refs in $GIT_DIR/info/refs file, and 'git-ls-remote .' gives only HEAD; but we could add them 'by hand').
Quoted 15 lines
gitweb/gitweb.perl sub git_get_project_owner { · line 600
Quoted 11 lines
gitweb/gitweb.perl +3
-2@@ -561,18 +578,24 @@ sub git_get_project_owner { + if ($line =~ m/^([0-9a-fA-F]{40})\trefs\/($type\/?[^\^]+)/) { if (defined $refs{$1}) { - $refs{$1} .= " / $2"; + push @{$refs{$1}}, $2; } else { - $refs{$1} = $2; + $refs{$1} = [ $2 ]; } }It would work as in your patch, but I would have preferred to see "exists $refs{$1}" there instead of "defined".
Quoted 5 lines
Or lose the
if()and do it like this, which would be cleaner?if ($line =~ ...) { push @{$refs{$1}}, $2; }
That's even better.
Signature · 3 lines
Jakub Narebski Warsaw, Poland ShadeHawk on #git
PATCH 7/9 gitweb: Skip comments in mime.types like file
In reply to Jakub Narebski--- gitweb/gitweb.perl | 1 + 1 files changed, 1 insertions(+), 0 deletions(-)
gitweb/gitweb.perl +1 -0
@@ -858,6 +858,7 @@ sub mimetype_guess_file { my %mimemap; open(MIME, $mimemap) or return undef; while (<MIME>) { + next if m/^#/; # skip comments my ($mime, $exts) = split(/\t+/); if (defined $exts) { my @exts = split(/\s+/, $exts);
Signature · 1 line
1.4.1.1
PATCH 8/9 gitweb: True fix: Support for the standard mime.types map in gitweb
In reply to Jakub NarebskiTrue fix for error in mimetype_guess, error introduced in original commit 2d00737489b8c61ed616b261c7c9bd314e2b0b41 and later fixed temporarily by commenting out the line that caused error in commit 57bd4d3523efecf60197040cad34154aff4ddf80.
Gitweb now supports mime.types map $mimetypes_file relative to project.
---
Perhaps commit message should consist only of:
gitweb: Gitweb now supports mime.types map $mimetypes_file relative to project.
gitweb/gitweb.perl | 5 ++++- 1 files changed, 4 insertions(+), 1 deletions(-)
gitweb/gitweb.perl +4 -1
@@ -880,7 +880,10 @@ sub mimetype_guess { if ($mimetypes_file) { my $file = $mimetypes_file; - #$file =~ m#^/# or $file = "$projectroot/$path/$file"; + if ($file !~ m!^/!) { # if it is relative path + # it is relative to project + $file = "$projectroot/$project/$file"; + } $mime = mimetype_guess_file($filename, $file); } $mime ||= mimetype_guess_file($filename, '/etc/mime.types');
Signature · 1 line
1.4.1.1
Re: [PATCH 8/9] gitweb: True fix: Support for the standard mime.types map in gitweb
Quoted 6 lines · Jakub Narebski
True fix for error in
mimetype_guess, error introduced in original commit2d00737489b8c61ed616b261c7c9bd314e2b0b41and later fixed temporarily by commenting out the line that caused error in commit57bd4d3523efecf60197040cad34154aff4ddf80.Gitweb now supports mime.types map $mimetypes_file relative to project.
Care to explain what that commenting out was about?
gitweb/gitweb.perl sub mimetype_guess { · line 887
Quoted 8 lines
gitweb/gitweb.perl +4
-1if ($mimetypes_file) { my $file = $mimetypes_file; - #$file =~ m#^/# or $file = "$projectroot/$path/$file"; + if ($file !~ m!^/!) { # if it is relative path + # it is relative to project + $file = "$projectroot/$project/$file"; + } $mime = mimetype_guess_file($filename, $file);
Are $project and $file always defined when we take this new codepath?
Re: [PATCH 8/9] gitweb: True fix: Support for the standard mime.types map in gitweb
Quoted 20 lines · Junio C Hamano
Quoted 6 lines · Jakub Narebski
True fix for error in
mimetype_guess, error introduced in original commit2d00737489b8c61ed616b261c7c9bd314e2b0b41and later fixed temporarily by commenting out the line that caused error in commit57bd4d3523efecf60197040cad34154aff4ddf80.Gitweb now supports mime.types map $mimetypes_file relative to project.
Care to explain what that commenting out was about?
gitweb/gitweb.perl sub mimetype_guess { · line 887
Quoted 8 lines
if ($mimetypes_file) { my $file = $mimetypes_file;gitweb/gitweb.perl +4
-1- #$file =~ m#^/# or $file = "$projectroot/$path/$file"; + if ($file !~ m!^/!) { # if it is relative path + # it is relative to project + $file = "$projectroot/$project/$file"; + } $mime = mimetype_guess_file($filename, $file);
Quoted 2 lines
Are $project and $file always defined when we take this new codepath?
$project is defined always in the "input validation and dispatch" part.
"my $file = $mimetypes_file;", and only if $mimetypes_file is true (so it must be defined). $mimetypes_file is undef by default, and it is one of the configuration variables which are not set from Makefile in "make gitweb/gitweb.cgi".
$path was never defined; I guess that was copy'n'paste error, copying from other subroutine that used $path as one of arguments.
I don't know why I didn't fix this error correctly, only patched it up the first time...
Signature · 3 lines
Jakub Narebski Warsaw, Poland ShadeHawk on #git
PATCH 9/9 gitweb: Separate printing difftree in git_commit into git_difftree_body
In reply to Jakub NarebskiSeparate printing difftree in git_commit into separate git_difftree_body subroutine. Add support for "C" (copied) status. For "M" and "C" add parameter 'fp' (filename parent) to the "diff" link; currently not supported by git_blobdiff ("blobdiff" action).
Reindented, realigned, added comments.
--- gitweb/gitweb.css | 4 + gitweb/gitweb.perl | 237 +++++++++++++++++++++++++++++++--------------------- 2 files changed, 146 insertions(+), 95 deletions(-)
gitweb/gitweb.css +4 -0
@@ -226,6 +226,10 @@ table.diff_tree span.file_status.mode_ch color: #777777; } +table.diff_tree span.file_status.copied { + color: #70a070; +} + /* age2: 60*60*24*2 <= age */ table.project_list td.age2, table.blame td.age2 { font-style: italic;
gitweb/gitweb.perl +142 -95
249 lines not on this page · raw message
Signature · 1 line
1.4.1.1
Re: [PATCH 9/9] gitweb: Separate printing difftree in git_commit into git_difftree_body
gitweb/gitweb.perl sub git_print_page_path { · line 1272
Quoted 11 lines · Jakub Narebski
gitweb/gitweb.perl +6
-0+ if ($status eq "A") { # created + } elsif ($status eq "D") { # deleted + } elsif ($status eq "M" || $status eq "T") { # modified, or type changed + } elsif ($status eq "R") { # renamed + } elsif ($status eq "C") { # copied + } # we should not encounter Unmerged (U) or Unknown (X) status
The body of these still seem to have quite a lot of similarities. Maybe further refactoring is in the works?
Re: [PATCH 9/9] gitweb: Separate printing difftree in git_commit into git_difftree_body
Quoted 14 lines · Junio C Hamano
gitweb/gitweb.perl sub git_print_page_path { · line 1272
Quoted 11 lines · Jakub Narebski
gitweb/gitweb.perl +6
-0+ if ($status eq "A") { # created + } elsif ($status eq "D") { # deleted + } elsif ($status eq "M" || $status eq "T") { # modified, or type changed + } elsif ($status eq "R") { # renamed + } elsif ($status eq "C") { # copied + } # we should not encounter Unmerged (U) or Unknown (X) status
Quoted 2 lines
The body of these still seem to have quite a lot of similarities. Maybe further refactoring is in the works?
Probably. For now I only separated the difftree printing part into separate subroutine, and added $status eq "C" case (I don't know if we might encounter it at all, due to current set of options to diff-tree).
Signature · 3 lines
Jakub Narebski Warsaw, Poland ShadeHawk on #git
Quoted 2 lines · Jakub Narebski
This series of patches is based on the 'next' branch, commit
10a6653c818f78c6032d45e1d4da544085e1f28b(v1.4.2-g10a6653)
But it rebases without problem on top of current master
460cccd3ba1d38fd64c9e83e40d58bcf3e9d7d2c (v1.4.2-g460cccd)
('git rebase --onto master next' rebases without errors)
Signature · 3 lines
Jakub Narebski Warsaw, Poland ShadeHawk on #git
Quoted 8 lines · Jakub Narebski
Quoted 2 lines · Jakub Narebski
This series of patches is based on the 'next' branch, commit
10a6653c818f78c6032d45e1d4da544085e1f28b(v1.4.2-g10a6653)But it rebases without problem on top of current master
460cccd3ba1d38fd64c9e83e40d58bcf3e9d7d2c(v1.4.2-g460cccd)
('git rebase --onto master next' rebases without errors)
I sent a few comments, some suggesting further improvements and others expressing my puzzlement, but I'll be applying all of them, so please base your further work on all of the 9 series.