initial
This commit is contained in:
commit
aa16335095
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
.direnv
|
||||||
|
*.bak
|
||||||
|
result
|
||||||
|
.pls_cache
|
15
LICENSE
Normal file
15
LICENSE
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2023 Aaron Bieber <aaron@bolddaemon.com>
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and distribute this software for any
|
||||||
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
|
* copyright notice and this permission notice appear in all copies.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
24
Makefile.PL
Normal file
24
Makefile.PL
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
use ExtUtils::MakeMaker;
|
||||||
|
|
||||||
|
WriteMakefile(
|
||||||
|
NAME => 'pr-status',
|
||||||
|
VERSION_FROM => 'pr-status.pl',
|
||||||
|
EXE_FILES => [qw(pr-status.pl)],
|
||||||
|
LICENSE => 'ISC',
|
||||||
|
MIN_PERL_VERSION => '5.006',
|
||||||
|
META_MERGE => {
|
||||||
|
'meta-spec' => { version => 2 },
|
||||||
|
resources => {
|
||||||
|
repository => {
|
||||||
|
type => 'git',
|
||||||
|
url => 'https://github.com/qbit/pr-status.git',
|
||||||
|
web => 'https://github.com/qbit/pr-status',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
PREREQ_PM => {
|
||||||
|
'JSON' => '0',
|
||||||
|
'Mojolicious' => '0',
|
||||||
|
'Git' => '0',
|
||||||
|
},
|
||||||
|
);
|
26
flake.lock
generated
Normal file
26
flake.lock
generated
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
{
|
||||||
|
"nodes": {
|
||||||
|
"nixpkgs": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1684580438,
|
||||||
|
"narHash": "sha256-LUPswmDn6fXP3lEBJFA2Id8PkcYDgzUilevWackYVvQ=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "7dc71aef32e8faf065cb171700792cf8a65c152d",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"id": "nixpkgs",
|
||||||
|
"ref": "nixos-22.11",
|
||||||
|
"type": "indirect"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": "nixpkgs"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": "root",
|
||||||
|
"version": 7
|
||||||
|
}
|
55
flake.nix
Normal file
55
flake.nix
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
{
|
||||||
|
description = "pr-status: a tool to query NixOS/nixpkgs pull request status as they move along the build chain";
|
||||||
|
|
||||||
|
inputs.nixpkgs.url = "nixpkgs/nixos-22.11";
|
||||||
|
|
||||||
|
outputs = { self, nixpkgs }:
|
||||||
|
let
|
||||||
|
supportedSystems =
|
||||||
|
[ "x86_64-linux" "x86_64-darwin" "aarch64-linux" "aarch64-darwin" ];
|
||||||
|
forAllSystems = nixpkgs.lib.genAttrs supportedSystems;
|
||||||
|
nixpkgsFor = forAllSystems (system: import nixpkgs { inherit system; });
|
||||||
|
in {
|
||||||
|
packages = forAllSystems (system:
|
||||||
|
let pkgs = nixpkgsFor.${system};
|
||||||
|
in {
|
||||||
|
pr-status = pkgs.stdenv.mkDerivation {
|
||||||
|
pname = "pr-status";
|
||||||
|
version = "v0.0.1";
|
||||||
|
src = ./.;
|
||||||
|
buildInputs = with pkgs.perlPackages; [ PerlTidy ];
|
||||||
|
nativeBuildInputs = with pkgs.perlPackages; [ perl ];
|
||||||
|
|
||||||
|
propagatedBuildInputs = with pkgs.perlPackages; [
|
||||||
|
Mojolicious
|
||||||
|
JSON
|
||||||
|
Git
|
||||||
|
];
|
||||||
|
|
||||||
|
outputs = [ "out" "dev" ];
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
defaultPackage = forAllSystems (system: self.packages.${system}.pr-status);
|
||||||
|
devShells = forAllSystems (system:
|
||||||
|
let pkgs = nixpkgsFor.${system};
|
||||||
|
in {
|
||||||
|
default = pkgs.mkShell {
|
||||||
|
shellHook = ''
|
||||||
|
PS1='\u@\h:\@; '
|
||||||
|
nix flake run github:qbit/xin#flake-warn
|
||||||
|
echo "Perl `${pkgs.perl}/bin/perl --version`"
|
||||||
|
'';
|
||||||
|
buildInputs = with pkgs.perlPackages; [
|
||||||
|
Git
|
||||||
|
JSON
|
||||||
|
Mojolicious
|
||||||
|
perl
|
||||||
|
PerlCritic
|
||||||
|
PerlTidy
|
||||||
|
];
|
||||||
|
};
|
||||||
|
});
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
139
pr-status.pl
Executable file
139
pr-status.pl
Executable file
@ -0,0 +1,139 @@
|
|||||||
|
#!/usr/bin/env perl
|
||||||
|
|
||||||
|
# vim: set ts=4 sw=4 tw=0:
|
||||||
|
# vim: set expandtab:
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use v5.32;
|
||||||
|
|
||||||
|
use Git;
|
||||||
|
use JSON qw( from_json );
|
||||||
|
use Mojolicious::Lite -signatures;
|
||||||
|
use Time::HiRes qw( time );
|
||||||
|
|
||||||
|
my $VERSION = 'v0.0.1';
|
||||||
|
|
||||||
|
my $repo_dir = "/home/qbit/gostart_nixpkgs";
|
||||||
|
|
||||||
|
$ENV{"GIT_CONFIG_SYSTEM"} = ""; # Ignore insteadOf rules
|
||||||
|
$ENV{"HOME"} = "/tmp"; # Ignore ~/.netrc
|
||||||
|
|
||||||
|
Git::command( 'clone', 'https://github.com/nixos/nixpkgs', $repo_dir )
|
||||||
|
if !-e $repo_dir;
|
||||||
|
my $repo = Git->repository( Directory => $repo_dir );
|
||||||
|
|
||||||
|
my $lock = 0;
|
||||||
|
|
||||||
|
sub get_commit {
|
||||||
|
my $pr = shift;
|
||||||
|
$repo->command( 'fetch', 'origin', "pull/${pr}/head:pr-status-${pr}" );
|
||||||
|
$repo->command( 'checkout', "pr-status-$pr" );
|
||||||
|
my $commit = $repo->command( 'rev-parse', 'HEAD' );
|
||||||
|
$repo->command( 'checkout', 'master' );
|
||||||
|
|
||||||
|
chomp $commit;
|
||||||
|
|
||||||
|
return $commit;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub check_nixpkg_branches {
|
||||||
|
my $commit = shift;
|
||||||
|
my $list = [];
|
||||||
|
|
||||||
|
return $list if $commit eq "";
|
||||||
|
|
||||||
|
my $branches = $repo->command( 'branch', '-r', '--contains', $commit );
|
||||||
|
|
||||||
|
foreach my $b ( split( '\n', $branches ) ) {
|
||||||
|
$b =~ s/^\s+origin\///g;
|
||||||
|
push( @$list, $b ) if $b =~ m/nixos|nixpkgs|staging|master/;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $list;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub figure_status {
|
||||||
|
my $list = shift;
|
||||||
|
my $release = shift;
|
||||||
|
my $status = {
|
||||||
|
state => "complete",
|
||||||
|
info => {}
|
||||||
|
};
|
||||||
|
|
||||||
|
my @unstable =
|
||||||
|
qw/ nixos-unstable nixos-unstable-small nixpkgs-unstable staging staging-next /;
|
||||||
|
my @stable = qw/ release-22.11 nixos-22.11-small nixos-22.11 /;
|
||||||
|
my @other = qw / master /;
|
||||||
|
|
||||||
|
if ( $release eq "stable" ) {
|
||||||
|
foreach my $s (@stable) {
|
||||||
|
$status->{info}->{$s} = grep /$s/, @{$list};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( $release eq "unstable" ) {
|
||||||
|
foreach my $s (@unstable) {
|
||||||
|
$status->{info}->{$s} = grep /^$s$/, @{$list};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach my $b ( keys %{ $status->{info} } ) {
|
||||||
|
if ( !$status->{info}->{$b} ) {
|
||||||
|
$status->{state} = "open";
|
||||||
|
last;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $status;
|
||||||
|
}
|
||||||
|
|
||||||
|
get '/gc' => sub ($c) {
|
||||||
|
my $start = time;
|
||||||
|
$repo->command('gc');
|
||||||
|
my $end = time;
|
||||||
|
$c->render(
|
||||||
|
json => {
|
||||||
|
updateTime => sprintf( "%2f", $end - $start ),
|
||||||
|
action => 'gc'
|
||||||
|
}
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
get '/update' => sub ($c) {
|
||||||
|
my $start = time;
|
||||||
|
$repo->command('fetch');
|
||||||
|
my $end = time;
|
||||||
|
$c->render(
|
||||||
|
json => {
|
||||||
|
updateTime => sprintf( "%2f", $end - $start ),
|
||||||
|
action => 'update'
|
||||||
|
}
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
get '/:release/:pr' => sub ($c) {
|
||||||
|
my $pr = $c->param('pr');
|
||||||
|
my $release = $c->param('release');
|
||||||
|
|
||||||
|
return unless $pr =~ m/^\d+$/;
|
||||||
|
|
||||||
|
my $commit = get_commit($pr);
|
||||||
|
|
||||||
|
my $start = time;
|
||||||
|
my $list = check_nixpkg_branches $commit;
|
||||||
|
my $end = time;
|
||||||
|
|
||||||
|
my $status = figure_status( $list, $release );
|
||||||
|
|
||||||
|
my $result = {
|
||||||
|
branches => $list,
|
||||||
|
pull_request => $pr,
|
||||||
|
status => $status->{state},
|
||||||
|
status_info => $status->{info},
|
||||||
|
queryTime => sprintf( "%2f", $end - $start )
|
||||||
|
};
|
||||||
|
|
||||||
|
$c->render( json => $result );
|
||||||
|
};
|
||||||
|
|
||||||
|
app->start;
|
Loading…
Reference in New Issue
Block a user