The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
package Arepa::Web::Repository;

use strict;
use warnings;

use base 'Arepa::Web::Base';

use Parse::Debian::PackageDesc;
use Arepa::Config;
use Arepa::Repository;
use Arepa::BuilderFarm;

sub index {
    my ($self) = @_;

    my $repository = Arepa::Repository->new($self->config_path);
    my $pdb = Arepa::PackageDb->new($self->config->get_key('package_db'));

    my %packages = $repository->get_package_list;
    my %comments = ();
    foreach my $pkg (keys %packages) {
        foreach my $comp (keys %{$packages{$pkg}}) {
            foreach my $version (keys %{$packages{$pkg}->{$comp}}) {
                if (grep { $_ eq 'source' }
                         @{$packages{$pkg}->{$comp}->{$version}}) {
                    my $id = $pdb->get_source_package_id($pkg, $version);
                    my %source_pkg = $pdb->get_source_package_by_id($id);
                    $comments{$pkg}->{$version} = $source_pkg{comments};
                }
            }
        }
    }

    $self->show_view({ packages => \%packages,
                       comments => \%comments });
}

sub view {
    my ($self) = @_;

    if ($self->config->key_exists('repository:url')) {
        my $repo_url = $self->config->get_key('repository:url');
        my @url_parts = @{$self->tx->req->url->path->parts};
        my $package_name = $url_parts[$#url_parts];
        my $package_dir = ($package_name =~ /^lib/) ?
          substr($package_name, 0, 4) :
          substr($package_name, 0, 1);
        my $package_in_repo_url = $repo_url . "/pool/main/" . $package_dir .
                                              "/" . $package_name;
        $self->redirect_to($package_in_repo_url);
    }
    else {
        $self->_add_error("No 'repository:url' configuration key found. Please make it point to your repository URL to use this feature");
        $self->vars(errors => [$self->_error_list]);
        $self->render('error');
    }
}

sub sync {
    my ($self) = @_;

    $self->_only_if_admin(sub {
        if ($self->config->key_exists('repository:remote_path')) {
            my $cmd = "sudo -H -u arepa-master arepa sync";
            if (system("$cmd >/dev/null") != 0) {
                $self->_add_error("Couldn't synchronize the repository with the command '$cmd'");
            }
        }
        if ($self->_error_list) {
            $self->vars(errors => [$self->_error_list]);
            $self->render('error');
        }
        else {
            $self->redirect_to('home');
        }
    });
}

1;