Apache-CVS

 view release on metacpan or  search on metacpan

CVS/HTML.pm  view on Meta::CPAN


use Apache::CVS();
if ($Apache::CVS::Graph) {
    use Graph::Directed();
}

@Apache::CVS::HTML::ISA = ('Apache::CVS');

$Apache::CVS::HTML::VERSION = $Apache::CVS::VERSION;;

my @time_units = ('days', 'hours', 'minutes', 'seconds');
my @directory_headers = ('filename', 'author', 'number of revisions',
                         'latest revision', 'most recent revision date',
                         'revision age');
my %directory_sorting = (
    'filename' => 'f',
    'author' => 'a',
    'number of revisions' => 'n',
    'most recent revision date' => 'm'
);
my @file_headers = ('revision number', 'author', 'state', 'symbol', 'date',
                    'age', 'comment', 'action');
my %file_sorting = (
    'revision number' => 'r',
    'author' => 'a',
    'state' => 's',
    'date' => 'd',
);
my %css_class = (
    # anchors
    'root_link' =>      'root_link',
    'path_link' =>      'path_link',
    'directory_link' => 'directory_link',
    'file_link' =>      'file_link',
    'graph_link' =>     'graph_link',
    'revision_link' =>  'revision_link',
    'diff_link' =>      'diff_link',
    'file_sort_link' =>  'file_sort_link',
    'directory_sort_link' =>  'directory_sort_link',

    # directory table
    'directory_table' =>      'directory_table',
    'directory_header_row' => 'directory_header_row',
    'directory_header' =>     'directory_header',
    'directory_odd_row' =>    'directory_odd_row',
    'directory_even_row' =>   'directory_even_row',
    'directory_data' =>       'directory_data',

    # file table
    'file_table' =>      'file_table',
    'file_header_row' => 'file_header_row',
    'file_header' =>     'file_header',
    'file_odd_row' =>    'file_odd_row',
    'file_even_row' =>   'file_even_row',
    'file_data' =>       'file_data',
);

sub new {
    my $proto = shift;
    my $class = ref($proto) || $proto;
    my $self  = $class->SUPER::new(shift);

    $self->file_sorting_available(1);
    $self->revision_sorting_available(1);
    $self->{css_file} = $self->request()->dir_config('CSSFile');

    bless ($self, $class);
    return $self;
}

sub sort_files {
    my $self = shift;
    my ($files, $sort_criterion, $ascending) = @_;

    # skip if there are no files
    return unless scalar @{ $files };

    my @sorted_files;
    SWITCH: for ($sort_criterion) {
        /$directory_sorting{'filename'}/ && do {
            @sorted_files = sort { $a->name() cmp $b->name() } @{ $files };
            last;
        };
        /$directory_sorting{'author'}/ && do {
            @sorted_files = sort { $a->revision('last')->author() cmp
                                   $b->revision('last')->author() } @{ $files };
            last;
        };
        /$directory_sorting{'number of revisions'}/ && do {
            @sorted_files =
                sort { $a->revision_count() <=> $b->revision_count() }
                    @{ $files };
            last;
        };
        /$directory_sorting{'most recent revision date'}/ && do {
            @sorted_files = sort { $a->revision('last')->date() <=>
                                   $b->revision('last')->date() } @{ $files };
            last;
        };
        @sorted_files = @{ $files };
    }
    @sorted_files = reverse @sorted_files if $ascending;
    return \@sorted_files;
}

sub _split_revision {
    my $revision = shift;
    my @revision_parts;
    while ($revision =~ s#^(\d+)##) {
        push @revision_parts, $1;
        $revision =~ s#^\.##;
    }
    return \@revision_parts;
}

sub _by_revision {
    my $a_number = _split_revision($a->number());
    my $b_number = _split_revision($b->number());

    my $a_max_index = scalar @{ $a_number };
    my $max_index = $a_max_index;



( run in 0.817 second using v1.01-cache-2.11-cpan-8f98c5d2c55 )