* paging for releases page

[?]
Oct 15, 2009, 11:13 AM
PPJN6SDP3BIWOB5LB3B2F3HEWM4IG7WZMG7JICERVBR7CDMBOPOQC

Dependencies

  • [2] A63IHCMX * Register GC roots properly.
  • [3] T2232OBS * Add some DB indices to make the /releases page much faster.
  • [4] G6HJY2V4
  • [5] NI5BVF2V * In job inputs of type "build", allow the project and jobset names of
  • [6] LQ5QEDVV
  • [7] JFZNAYJX * Showing releases.
  • [8] FHF6IZJQ * Basic release management: releases are now dynamically computed as
  • [9] DR4F6YUT
  • [10] 3E6IP3R3 * Add the name of the jobset to ReleaseSetJobs, otherwise we can't
  • [11] LZO3C2KI * Hack around those SQLite timeouts: just retry the transaction.
  • [12] OIUIYIV2 * Give releases a timestamp.
  • [13] IN272KZW * Automatically keep all builds in the latest successful release in
  • [14] BDSD2JLV * Speed up manifest generation.
  • [15] E6IC7YIK * Release sets: need to include the jobset name to disambiguate
  • [16] ZNFDFJHG * Provide a redirect to the latest successful release in a release set
  • [17] S5PV6IIM * Represent jobs explicitly in the DB.
  • [18] A52HEFHQ * Allow builds to be restarted (if they failed with a transient error,
  • [19] 2GK5DOU7 * Downloading closures.
  • [20] 2T42QGZD * Register builds as GC roots so they don't get deleted.
  • [*] J5UVLXOK * Start of a basic Catalyst web interface.

Change contents

  • replacement in src/lib/Hydra/Controller/Root.pm at line 140
    [4.844][4.32:84]()
    if (defined $subcommand && $subcommand ne "") {
    [4.844]
    [4.927]
    my $resultsPerPage = 10;
    my $page = 1;
    if (defined $subcommand && $subcommand =~ /^\d+$/ ) {
    $page = int($subcommand)
    }
    elsif (defined $subcommand && $subcommand ne "") {
  • replacement in src/lib/Hydra/Controller/Root.pm at line 175
    [4.1496][4.250:354]()
    push @releases, getRelease($_, $jobs) foreach getPrimaryBuildsForReleaseSet($project, $primaryJob);
    [4.1496]
    [4.2079]
    push @releases, getRelease($_, $jobs) foreach getPrimaryBuildsForReleaseSet($project, $primaryJob, $page, $resultsPerPage);
    $c->stash->{baseUri} = $c->uri_for($self->action_for("releases"), $projectName, $releaseSetName);
  • edit in src/lib/Hydra/Controller/Root.pm at line 179
    [4.2120]
    [4.2120]
    $c->stash->{page} = $page;
    $c->stash->{totalReleases} = getPrimaryBuildTotal($project, $primaryJob);
    $c->stash->{resultsPerPage} = $resultsPerPage;
  • replacement in src/lib/Hydra/Helper/Nix.pm at line 13
    [4.48][4.675:750](),[2.706][4.675:750](),[4.675][4.675:750]()
    getPrimaryBuildsForReleaseSet getRelease getLatestSuccessfulRelease );
    [2.706]
    [4.486]
    getPrimaryBuildsForReleaseSet
    getPrimaryBuildTotal
    getRelease getLatestSuccessfulRelease );
  • edit in src/lib/Hydra/Helper/Nix.pm at line 151
    [4.1406]
    [4.1406]
    sub allPrimaryBuilds {
    my ($project, $primaryJob) = @_;
    my $allPrimaryBuilds = $project->builds->search(
    { jobset => $primaryJob->get_column('jobset'), job => $primaryJob->get_column('job'), finished => 1 },
    { join => 'resultInfo', order_by => "timestamp DESC"
    , '+select' => ["resultInfo.releasename", "resultInfo.buildstatus"]
    , '+as' => ["releasename", "buildstatus"]
    , where => \ attrsToSQL($primaryJob->attrs, "me.id")
    });
    return $allPrimaryBuilds;
    }
  • replacement in src/lib/Hydra/Helper/Nix.pm at line 163
    [4.1407][4.1407:1443]()
    sub getPrimaryBuildsForReleaseSet {
    [4.1407]
    [4.1443]
    sub getPrimaryBuildTotal {
  • replacement in src/lib/Hydra/Helper/Nix.pm at line 165
    [4.1480][4.1480:1530](),[4.1530][4.495:606](),[4.114][4.1587:1648](),[4.358][4.1587:1648](),[4.606][4.1587:1648](),[4.1587][4.1587:1648](),[4.1648][3.1418:1544](),[3.1544][4.1724:1785](),[4.1724][4.1724:1785]()
    my @primaryBuilds = $project->builds->search(
    { jobset => $primaryJob->get_column('jobset'), job => $primaryJob->get_column('job'), finished => 1 },
    { join => 'resultInfo', order_by => "timestamp DESC"
    , '+select' => ["resultInfo.releasename", "resultInfo.buildstatus"]
    , '+as' => ["releasename", "buildstatus"]
    , where => \ attrsToSQL($primaryJob->attrs, "me.id")
    [4.1480]
    [4.1785]
    return scalar(allPrimaryBuilds($project, $primaryJob)) ;
    }
    sub getPrimaryBuildsForReleaseSet {
    my ($project, $primaryJob, $page, $resultsPerPage) = @_;
    $page = (defined $page ? int($page) : 1) || 1;
    $resultsPerPage = (defined $resultsPerPage ? int($resultsPerPage) : 20) || 20;
    my @primaryBuilds = allPrimaryBuilds($project, $primaryJob)->search( {},
    { rows => $resultsPerPage
    , page => $page
  • edit in src/lib/Hydra/Helper/Nix.pm at line 177
    [4.1797]
    [4.1797]
  • edit in src/lib/Hydra/Helper/Nix.pm at line 181
    [4.1827]
    [4.1827]
    sub findLastJobForBuilds {
    my ($builds, $job) = @_;
    my $thisBuild;
  • edit in src/lib/Hydra/Helper/Nix.pm at line 185
    [4.1828]
    [4.1828]
    # Find a build of this job that had the primary build
    # as input. If there are multiple, prefer successful
    # ones, and then oldest. !!! order_by buildstatus is hacky
    ($thisBuild) = $builds->search(
    { project => $job->get_column('project'), jobset => $job->get_column('jobset')
    , job => $job->get_column('job'), finished => 1
    }
    , { join => 'resultInfo', rows => 1
    , order_by => ["buildstatus", "timestamp"]
    , where => \ attrsToSQL($job->attrs, "build.id")
    , '+select' => ["resultInfo.buildstatus"], '+as' => ["buildstatus"]
    });
    return $thisBuild ;
    }
    sub findLastJobForPrimaryBuild {
    my ($primaryBuild, $job) = @_;
    my $thisBuild;
    my $depBuilds;
    $depBuilds = $primaryBuild->dependentBuilds;
    $thisBuild = findLastJobForBuilds($depBuilds, $job) ;
    # don't do recursive yet
    # if (!defined $thisBuild) {
    #
    # foreach my $build ($depBuilds->all) {
    # $thisBuild = findLastJobForPrimaryBuild($build, $job) ;
    # if (defined $thisBuild) {
    # last ;
    # }
    # }
    # }
    return $thisBuild;
    }
  • replacement in src/lib/Hydra/Helper/Nix.pm at line 239
    [4.2207][4.2207:2478](),[4.2478][3.1545:1707](),[4.182][4.2536:2710](),[4.412][4.2536:2710](),[4.712][4.2536:2710](),[3.1707][4.2536:2710](),[4.2536][4.2536:2710](),[4.2710][3.1708:1792](),[3.1792][4.2710:2730](),[4.2710][4.2710:2730]()
    # Find a build of this job that had the primary build
    # as input. If there are multiple, prefer successful
    # ones, and then oldest. !!! order_by buildstatus is hacky
    ($thisBuild) = $primaryBuild->dependentBuilds->search(
    { project => $job->get_column('project'), jobset => $job->get_column('jobset')
    , job => $job->get_column('job'), finished => 1 },
    { join => 'resultInfo', rows => 1
    , order_by => ["buildstatus", "timestamp"]
    , where => \ attrsToSQL($job->attrs, "build.id")
    , '+select' => ["resultInfo.buildstatus"], '+as' => ["buildstatus"]
    });
    [4.2207]
    [4.2730]
    $thisBuild = findLastJobForPrimaryBuild($primaryBuild, $job) ;
  • edit in src/root/releases.tt at line 11
    [4.1263]
    [4.8594]
    <p>Showing releases [% (page - 1) * resultsPerPage + 1 %] - [% (page - 1) * resultsPerPage + releases.size %] out of [% totalReleases %].</p>
  • edit in src/root/releases.tt at line 66
    [4.10051]
    [4.10051]
    [% IF page > 1 %]
    [<a href="[% "$baseUri/"; (page - 1) %]">Prev</a>]
    [% END %]
    [% IF page * resultsPerPage < totalReleases %]
    [<a href="[% "$baseUri/"; (page + 1) %]">Next</a>]
    [% END %]
    [<a href="[% "$baseUri/"; (totalReleases - 1) div resultsPerPage + 1 %]">Last</a>]