* [PATCH v4 1/3] gitweb: Modularized git_get_project_description to be more generic @ 2008-12-11 23:41 Sebastien Cevey 2008-12-11 23:42 ` [PATCH v4 2/3] gitweb: Split git_project_list_body in two functions Sebastien Cevey 0 siblings, 1 reply; 3+ messages in thread From: Sebastien Cevey @ 2008-12-11 23:41 UTC (permalink / raw) To: git; +Cc: Junio C Hamano, Petr Baudis, Gustavo Sverzut Barbieri, seb Introduce a git_get_file_or_project_config utility function to retrieve a repository variable either from a plain text file in the $GIT_DIR or else from 'gitweb.$variable' in the repository config (e.g. 'description'). Signed-off-by: Sebastien Cevey <seb@cine7.net> --- Sorry, screwed up the previous email trying to keep that From line in the header.. This patch (1/3) is still identical to previous version (v3). gitweb/gitweb.perl | 24 ++++++++++++++++-------- 1 files changed, 16 insertions(+), 8 deletions(-) diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl index 6eb370d..f7dc337 100755 --- a/gitweb/gitweb.perl +++ b/gitweb/gitweb.perl @@ -2020,18 +2020,26 @@ sub git_get_path_by_hash { ## ...................................................................... ## git utility functions, directly accessing git repository -sub git_get_project_description { - my $path = shift; +# get the value of a config variable either from a file with the same +# name in the repository, or the gitweb.$name value in the repository +# config file. +sub git_get_file_or_project_config { + my ($name, $path) = @_; $git_dir = "$projectroot/$path"; - open my $fd, "$git_dir/description" - or return git_get_project_config('description'); - my $descr = <$fd>; + open my $fd, "$git_dir/$name" + or return git_get_project_config($name); + my $conf = <$fd>; close $fd; - if (defined $descr) { - chomp $descr; + if (defined $conf) { + chomp $conf; } - return $descr; + return $conf; +} + +sub git_get_project_description { + my $path = shift; + return git_get_file_or_project_config('description', $path); } sub git_get_project_ctags { -- 1.5.6.5 ^ permalink raw reply related [flat|nested] 3+ messages in thread
* [PATCH v4 2/3] gitweb: Split git_project_list_body in two functions 2008-12-11 23:41 [PATCH v4 1/3] gitweb: Modularized git_get_project_description to be more generic Sebastien Cevey @ 2008-12-11 23:42 ` Sebastien Cevey 2008-12-11 23:45 ` [PATCH v4 3/3] gitweb: Optional grouping of projects by category Sebastien Cevey 0 siblings, 1 reply; 3+ messages in thread From: Sebastien Cevey @ 2008-12-11 23:42 UTC (permalink / raw) To: git; +Cc: Junio C Hamano, Petr Baudis, Gustavo Sverzut Barbieri, seb Extract the printing of project rows on the project page into a separate print_project_rows function. This makes it easier to reuse the code to print different subsets of the whole project list. The row printing code is merely moved into a separate function, but note that $projects is passed as a reference now. Signed-off-by: Sebastien Cevey <seb@cine7.net> --- Fixed the patch to apply cleanly on the current HEAD. gitweb/gitweb.perl | 103 +++++++++++++++++++++++++++++----------------------- 1 files changed, 57 insertions(+), 46 deletions(-) diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl index f7dc337..a4bf874 100755 --- a/gitweb/gitweb.perl +++ b/gitweb/gitweb.perl @@ -3996,59 +3996,19 @@ sub print_sort_th { } } -sub git_project_list_body { +# print a row for each project in the given list, using the given +# range and extra display options +sub print_project_rows { # actually uses global variable $project - my ($projlist, $order, $from, $to, $extra, $no_header) = @_; - - my $check_forks = gitweb_check_feature('forks'); - my @projects = fill_project_list_info($projlist, $check_forks); + my ($projects, $from, $to, $check_forks, $show_ctags) = @_; - $order ||= $default_projects_order; $from = 0 unless defined $from; - $to = $#projects if (!defined $to || $#projects < $to); - - my %order_info = ( - project => { key => 'path', type => 'str' }, - descr => { key => 'descr_long', type => 'str' }, - owner => { key => 'owner', type => 'str' }, - age => { key => 'age', type => 'num' } - ); - my $oi = $order_info{$order}; - if ($oi->{'type'} eq 'str') { - @projects = sort {$a->{$oi->{'key'}} cmp $b->{$oi->{'key'}}} @projects; - } else { - @projects = sort {$a->{$oi->{'key'}} <=> $b->{$oi->{'key'}}} @projects; - } + $to = $#$projects if (!defined $to || $#$projects < $to); - my $show_ctags = gitweb_check_feature('ctags'); - if ($show_ctags) { - my %ctags; - foreach my $p (@projects) { - foreach my $ct (keys %{$p->{'ctags'}}) { - $ctags{$ct} += $p->{'ctags'}->{$ct}; - } - } - my $cloud = git_populate_project_tagcloud(\%ctags); - print git_show_project_tagcloud($cloud, 64); - } - - print "<table class=\"project_list\">\n"; - unless ($no_header) { - print "<tr>\n"; - if ($check_forks) { - print "<th></th>\n"; - } - print_sort_th('project', $order, 'Project'); - print_sort_th('descr', $order, 'Description'); - print_sort_th('owner', $order, 'Owner'); - print_sort_th('age', $order, 'Last Change'); - print "<th></th>\n" . # for links - "</tr>\n"; - } my $alternate = 1; my $tagfilter = $cgi->param('by_tag'); for (my $i = $from; $i <= $to; $i++) { - my $pr = $projects[$i]; + my $pr = $projects->[$i]; next if $tagfilter and $show_ctags and not grep { lc $_ eq lc $tagfilter } keys %{$pr->{'ctags'}}; next if $searchtext and not $pr->{'path'} =~ /$searchtext/ @@ -4092,6 +4052,57 @@ sub git_project_list_body { "</td>\n" . "</tr>\n"; } +} + +sub git_project_list_body { + my ($projlist, $order, $from, $to, $extra, $no_header) = @_; + + my ($check_forks) = gitweb_check_feature('forks'); + my @projects = fill_project_list_info($projlist, $check_forks); + + $order ||= $default_projects_order; + + my %order_info = ( + project => { key => 'path', type => 'str' }, + descr => { key => 'descr_long', type => 'str' }, + owner => { key => 'owner', type => 'str' }, + age => { key => 'age', type => 'num' } + ); + my $oi = $order_info{$order}; + if ($oi->{'type'} eq 'str') { + @projects = sort {$a->{$oi->{'key'}} cmp $b->{$oi->{'key'}}} @projects; + } else { + @projects = sort {$a->{$oi->{'key'}} <=> $b->{$oi->{'key'}}} @projects; + } + + my $show_ctags = gitweb_check_feature('ctags'); + if ($show_ctags) { + my %ctags; + foreach my $p (@projects) { + foreach my $ct (keys %{$p->{'ctags'}}) { + $ctags{$ct} += $p->{'ctags'}->{$ct}; + } + } + my $cloud = git_populate_project_tagcloud(\%ctags); + print git_show_project_tagcloud($cloud, 64); + } + + print "<table class=\"project_list\">\n"; + unless ($no_header) { + print "<tr>\n"; + if ($check_forks) { + print "<th></th>\n"; + } + print_sort_th('project', $order, 'Project'); + print_sort_th('descr', $order, 'Description'); + print_sort_th('owner', $order, 'Owner'); + print_sort_th('age', $order, 'Last Change'); + print "<th></th>\n" . # for links + "</tr>\n"; + } + + print_project_rows(\@projects, $from, $to, $check_forks, $show_ctags); + if (defined $extra) { print "<tr>\n"; if ($check_forks) { -- 1.5.6.5 ^ permalink raw reply related [flat|nested] 3+ messages in thread
* [PATCH v4 3/3] gitweb: Optional grouping of projects by category 2008-12-11 23:42 ` [PATCH v4 2/3] gitweb: Split git_project_list_body in two functions Sebastien Cevey @ 2008-12-11 23:45 ` Sebastien Cevey 0 siblings, 0 replies; 3+ messages in thread From: Sebastien Cevey @ 2008-12-11 23:45 UTC (permalink / raw) To: git; +Cc: Junio C Hamano, Petr Baudis, Gustavo Sverzut Barbieri, seb This adds the $projects_list_group_categories option which, if enabled, will result in grouping projects by category on the project list page. The category is specified for each project by the $GIT_DIR/category file or the 'category' variable in its configuration file. By default, projects are put in the $project_list_default_category category. Note: - Categories are always sorted alphabetically, with projects in each category sorted according to the globally selected $order. - When displaying a subset of all the projects (page limiting), the category headers are only displayed for projects present on the page. The feature is inspired from Sham Chukoury's patch for the XMMS2 gitweb, but has been rewritten for the current gitweb development HEAD. The CSS for categories is inspired from Gustavo Sverzut Barbieri's patch to group projects by path. Thanks to Florian Ragwitz for Perl tips. Signed-off-by: Sebastien Cevey <seb@cine7.net> --- Simplified the patch according to Jakub's suggestion to filter $from/$to for categories in build_projlist_by_category (requires @projects to be sorted by category behorehand). gitweb/README | 16 +++++++++++++ gitweb/gitweb.css | 7 ++++++ gitweb/gitweb.perl | 60 +++++++++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 80 insertions(+), 3 deletions(-) diff --git a/gitweb/README b/gitweb/README index 825162a..f8f8872 100644 --- a/gitweb/README +++ b/gitweb/README @@ -188,6 +188,15 @@ not include variables usually directly set during build): full description is available as 'title' attribute (usually shown on mouseover). By default set to 25, which might be too small if you use long project descriptions. + * $projects_list_group_categories + Enables the grouping of projects by category on the project list page. + The category of a project is determined by the $GIT_DIR/category + file or the 'gitweb.category' variable in its repository configuration. + Disabled by default. + * $project_list_default_category + Default category for projects for which none is specified. If set + to the empty string, such projects will remain uncategorized and + listed at the top, above categorized projects. * @git_base_url_list List of git base URLs used for URL to where fetch project from, shown in project summary page. Full URL is "$git_base_url/$project". @@ -269,6 +278,13 @@ You can use the following files in repository: from the template during repository creation. You can use the gitweb.description repo configuration variable, but the file takes precedence. + * category (or gitweb.category) + Singe line category of a project, used to group projects if + $projects_list_group_categories is enabled. By default (file and + configuration variable absent), uncategorized projects are put in + the $project_list_default_category category. You can use the + gitweb.category repo configuration variable, but the file takes + precedence. * cloneurl (or multiple-valued gitweb.url) File with repository URL (used for clone and fetch), one per line. Displayed in the project summary page. You can use multiple-valued diff --git a/gitweb/gitweb.css b/gitweb/gitweb.css index a01eac8..64f2a41 100644 --- a/gitweb/gitweb.css +++ b/gitweb/gitweb.css @@ -264,6 +264,13 @@ td.current_head { text-decoration: underline; } +td.category { + background-color: #d9d8d1; + border-top: 1px solid #000000; + border-left: 1px solid #000000; + font-weight: bold; +} + table.diff_tree span.file_status.new { color: #008000; } diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl index a4bf874..3a58e3d 100755 --- a/gitweb/gitweb.perl +++ b/gitweb/gitweb.perl @@ -87,6 +87,14 @@ our $projects_list = "++GITWEB_LIST++"; # the width (in characters) of the projects list "Description" column our $projects_list_description_width = 25; +# group projects by category on the projects list +# (enabled if this variable evaluates to true) +our $projects_list_group_categories = 0; + +# default category if none specified +# (leave the empty string for no category) +our $project_list_default_category = ""; + # default order of projects list # valid values are none, project, descr, owner, and age our $default_projects_order = "project"; @@ -2042,6 +2050,11 @@ sub git_get_project_description { return git_get_file_or_project_config('description', $path); } +sub git_get_project_category { + my $path = shift; + return git_get_file_or_project_config('category', $path); +} + sub git_get_project_ctags { my $path = shift; my $ctags = {}; @@ -3939,8 +3952,9 @@ sub git_patchset_body { # . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . -# fills project list info (age, description, owner, forks) for each -# project in the list, removing invalid projects from returned list +# fills project list info (age, description, owner, category, forks) +# for each project in the list, removing invalid projects from +# returned list # NOTE: modifies $projlist, but does not remove entries from it sub fill_project_list_info { my ($projlist, $check_forks) = @_; @@ -3963,6 +3977,11 @@ sub fill_project_list_info { if (!defined $pr->{'owner'}) { $pr->{'owner'} = git_get_project_owner("$pr->{'path'}") || ""; } + if ($projects_list_group_categories && !defined $pr->{'category'}) { + my $cat = git_get_project_category($pr->{'path'}) || + $project_list_default_category; + $pr->{'category'} = to_utf8($cat); + } if ($check_forks) { my $pname = $pr->{'path'}; if (($pname =~ s/\.git$//) && @@ -3980,6 +3999,23 @@ sub fill_project_list_info { return @projects; } +# returns a hash of categories, containing the list of project +# belonging to each category +sub build_projlist_by_category { + my ($projlist, $from, $to) = @_; + my %categories; + + $from = 0 unless defined $from; + $to = $#$projlist if (!defined $to || $#$projlist < $to); + + for my $i ($from .. $to) { + my $pr = $projlist->[$i]; + push @{$categories{ $pr->{'category'} }}, $pr; + } + + return %categories; +} + # print 'sort by' <th> element, generating 'sort by $name' replay link # if that order is not selected sub print_sort_th { @@ -4101,7 +4137,25 @@ sub git_project_list_body { "</tr>\n"; } - print_project_rows(\@projects, $from, $to, $check_forks, $show_ctags); + if ($projects_list_group_categories) { + # only display categories with projects in the $from-$to window + @projects = sort {$a->{'category'} cmp $b->{'category'}} @projects; + my %categories = build_projlist_by_category(\@projects, $from, $to); + foreach my $cat (sort keys %categories) { + unless ($cat eq "") { + print "<tr>\n"; + if ($check_forks) { + print "<td></td>\n"; + } + print "<td class=\"category\" colspan=\"5\">$cat</td>\n"; + print "</tr>\n"; + } + + print_project_rows($categories{$cat}, undef, undef, $check_forks, $show_ctags); + } + } else { + print_project_rows(\@projects, $from, $to, $check_forks, $show_ctags); + } if (defined $extra) { print "<tr>\n"; -- 1.5.6.5 ^ permalink raw reply related [flat|nested] 3+ messages in thread
end of thread, other threads:[~2008-12-11 23:45 UTC | newest] Thread overview: 3+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2008-12-11 23:41 [PATCH v4 1/3] gitweb: Modularized git_get_project_description to be more generic Sebastien Cevey 2008-12-11 23:42 ` [PATCH v4 2/3] gitweb: Split git_project_list_body in two functions Sebastien Cevey 2008-12-11 23:45 ` [PATCH v4 3/3] gitweb: Optional grouping of projects by category Sebastien Cevey
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox