Api.pm 1.7 KB
package Copr::Api;
use strict;
use warnings;
use LWP::Simple;
use JSON;
# this package is not available on Debian
use RPM::VersionCompare;

my $copr_base_url = "https://copr.fedorainfracloud.org";

sub get_project_id {
  my ( $user, $repo ) = @_;
  my $project_json = get("$copr_base_url/api_2/projects?owner=$user&name=$repo");
  my $json = JSON->new->allow_nonref;
  my $project_data = $json->decode($project_json);
  return $project_data->{projects}[0]->{project}->{id};
}

sub get_project_builds {
  my ( $user, $repo ) = @_;
  my $project_id = get_project_id($user, $repo);
  my $builds_json = get("$copr_base_url/api_2/builds?limit=0&project_id=$project_id");
  my $json = JSON->new->allow_nonref;
  my $builds_data = $json->decode($builds_json);
  return @{$builds_data->{builds}};
}

# gets all latest builds of each package
sub get_latest_packages {
  my ( $user, $repo ) = @_;
  my %latest_packages;
  my @builds =  get_project_builds($user, $repo);
  foreach my $build (@builds) {
    next if $build->{build}->{state} ne "succeeded";
    my $package_name = $build->{build}->{package_name};
    my $package_version = $build->{build}->{package_version};
    my $package_submitter = $build->{build}->{submitter};
    if(!(defined $latest_packages{$package_name})) {
      $latest_packages{$package_name}{version} = $package_version;
      $latest_packages{$package_name}{submitter} = $package_submitter;
    }
    elsif(RPM::VersionCompare::rpmvercmp($latest_packages{$package_name}{version}, $package_version) == 1) {
      next;
    }
    else {
      $latest_packages{$package_name}{version} = $package_version;
      $latest_packages{$package_name}{submitter} = $package_submitter;
    }
  }

  return %latest_packages;
}

1;