diff options
author | Junio C Hamano <gitster@pobox.com> | 2013-01-10 14:04:21 -0800 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2013-01-10 14:04:21 -0800 |
commit | 2601298f43a9375ae996b4b3c9afeeb29ba5d597 (patch) | |
tree | 0c78755909f00be215d303bddf82c54fb2333768 | |
parent | c12a978a354634f53cec757d387bc024b6d56142 (diff) | |
parent | 28dae1812bc70f06079cb7d3fd4cdbfa9e59cbeb (diff) | |
download | git-2601298f43a9375ae996b4b3c9afeeb29ba5d597.tar.gz |
Merge branch 'md/gitweb-sort-by-age' into maint
* md/gitweb-sort-by-age:
gitweb: Sort projects with undefined ages last
-rwxr-xr-x | gitweb/gitweb.perl | 35 |
1 files changed, 21 insertions, 14 deletions
diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl index 0f207f2e20..656b324fb7 100755 --- a/gitweb/gitweb.perl +++ b/gitweb/gitweb.perl @@ -5528,23 +5528,30 @@ sub fill_project_list_info { sub sort_projects_list { my ($projlist, $order) = @_; - my @projects; - 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}; - return @$projlist unless defined $oi; - if ($oi->{'type'} eq 'str') { - @projects = sort {$a->{$oi->{'key'}} cmp $b->{$oi->{'key'}}} @$projlist; - } else { - @projects = sort {$a->{$oi->{'key'}} <=> $b->{$oi->{'key'}}} @$projlist; + sub order_str { + my $key = shift; + return sub { $a->{$key} cmp $b->{$key} }; } - return @projects; + sub order_num_then_undef { + my $key = shift; + return sub { + defined $a->{$key} ? + (defined $b->{$key} ? $a->{$key} <=> $b->{$key} : -1) : + (defined $b->{$key} ? 1 : 0) + }; + } + + my %orderings = ( + project => order_str('path'), + descr => order_str('descr_long'), + owner => order_str('owner'), + age => order_num_then_undef('age'), + ); + + my $ordering = $orderings{$order}; + return defined $ordering ? sort $ordering @$projlist : @$projlist; } # returns a hash of categories, containing the list of project |