add better error handling / reporting

This commit is contained in:
Aaron Bieber 2023-06-08 09:48:10 -06:00
parent 068f2ad179
commit f152755c96
No known key found for this signature in database
3 changed files with 127 additions and 76 deletions

View File

@ -14,4 +14,5 @@ append:
clean: clean:
rm -f index.html rm -f index.html
rm -f *.bak

View File

@ -12,6 +12,7 @@ use Git;
use JSON qw( from_json ); use JSON qw( from_json );
use Mojolicious::Lite -signatures; use Mojolicious::Lite -signatures;
use Mojo::IOLoop; use Mojo::IOLoop;
use Mojo::Exception qw(check raise);
use Time::HiRes qw( time ); use Time::HiRes qw( time );
my $VERSION = 'v0.0.1'; my $VERSION = 'v0.0.1';
@ -47,7 +48,8 @@ Mojo::IOLoop->recurring(
sub get_commit { sub get_commit {
my $pr = shift; my $pr = shift;
$repo->command( 'fetch', '-f', 'origin', "pull/${pr}/head:pr-status-${pr}" ); $repo->command( 'fetch', '-f', 'origin',
"pull/${pr}/head:pr-status-${pr}" );
$repo->command( 'checkout', '-f', "pr-status-$pr" ); $repo->command( 'checkout', '-f', "pr-status-$pr" );
my $commit = $repo->command( 'rev-parse', 'HEAD' ); my $commit = $repo->command( 'rev-parse', 'HEAD' );
my $log = $repo->command( 'log', '-n', '1', '--pretty=format:%s' ); my $log = $repo->command( 'log', '-n', '1', '--pretty=format:%s' );
@ -169,7 +171,12 @@ get '/:pr' => sub ($c) {
return unless $pr =~ m/^\d+$/; return unless $pr =~ m/^\d+$/;
my ( $title, $commit ) = get_commit($pr); my $title = "";
my $commit = "";
my $error = "";
eval { ( $title, $commit ) = get_commit($pr); };
check $@ => [ qr/command returned error/ =>
sub { say "Git command failed: $_"; $error = $_; } ];
my $start = time; my $start = time;
my $list = check_nixpkg_branches $commit; my $list = check_nixpkg_branches $commit;
@ -184,7 +191,8 @@ get '/:pr' => sub ($c) {
status => $status->{state}, status => $status->{state},
release => $release, release => $release,
status_info => $status->{info}, status_info => $status->{info},
queryTime => sprintf( "%2f", $end - $start ) + 0.0 queryTime => sprintf( "%2f", $end - $start ) + 0.0,
error => $error
}; };
$c->render( json => $result ); $c->render( json => $result );
@ -994,11 +1002,11 @@ function _Debug_crash_UNUSED(identifier, fact1, fact2, fact3, fact4)
function _Debug_regionToString(region) function _Debug_regionToString(region)
{ {
if (region.bb.az === region.bt.az) if (region.bb.aA === region.bt.aA)
{ {
return 'on line ' + region.bb.az; return 'on line ' + region.bb.aA;
} }
return 'on lines ' + region.bb.az + ' through ' + region.bt.az; return 'on lines ' + region.bb.aA + ' through ' + region.bt.aA;
} }
@ -4207,7 +4215,7 @@ var _Browser_document = _Debugger_document || F4(function(impl, flagDecoder, deb
bodyNode = _VirtualDom_applyPatches(bodyNode, currNode, patches, sendToApp); bodyNode = _VirtualDom_applyPatches(bodyNode, currNode, patches, sendToApp);
currNode = nextNode; currNode = nextNode;
_VirtualDom_divertHrefToApp = 0; _VirtualDom_divertHrefToApp = 0;
(title !== doc.ao) && (_VirtualDom_doc.title = title = doc.ao); (title !== doc.ap) && (_VirtualDom_doc.title = title = doc.ap);
}); });
} }
); );
@ -5576,7 +5584,7 @@ var $elm$core$Task$perform = F2(
}); });
var $elm$browser$Browser$document = _Browser_document; var $elm$browser$Browser$document = _Browser_document;
var $author$project$Main$Open = 1; var $author$project$Main$Open = 1;
var $author$project$Main$initialModel = {aM: _List_Nil, aa: '', aA: false, P: 0, aU: '', aY: 1, ao: ''}; var $author$project$Main$initialModel = {aM: _List_Nil, aa: '', ai: false, P: 0, aU: '', aY: 1, ap: ''};
var $elm$core$Platform$Cmd$batch = _Platform_batch; var $elm$core$Platform$Cmd$batch = _Platform_batch;
var $elm$core$Platform$Cmd$none = $elm$core$Platform$Cmd$batch(_List_Nil); var $elm$core$Platform$Cmd$none = $elm$core$Platform$Cmd$batch(_List_Nil);
var $author$project$Main$init = function (_v0) { var $author$project$Main$init = function (_v0) {
@ -6377,7 +6385,7 @@ var $elm$http$Http$get = function (r) {
var $elm$json$Json$Decode$field = _Json_decodeField; var $elm$json$Json$Decode$field = _Json_decodeField;
var $elm$json$Json$Decode$int = _Json_decodeInt; var $elm$json$Json$Decode$int = _Json_decodeInt;
var $elm$json$Json$Decode$list = _Json_decodeList; var $elm$json$Json$Decode$list = _Json_decodeList;
var $elm$json$Json$Decode$map5 = _Json_map5; var $elm$json$Json$Decode$map6 = _Json_map6;
var $author$project$Main$Complete = 0; var $author$project$Main$Complete = 0;
var $elm$json$Json$Decode$andThen = _Json_andThen; var $elm$json$Json$Decode$andThen = _Json_andThen;
var $elm$json$Json$Decode$fail = _Json_fail; var $elm$json$Json$Decode$fail = _Json_fail;
@ -6395,11 +6403,11 @@ var $author$project$Main$statusDecoder = A2(
} }
}, },
$elm$json$Json$Decode$string); $elm$json$Json$Decode$string);
var $author$project$Main$resultDecoder = A6( var $author$project$Main$resultDecoder = A7(
$elm$json$Json$Decode$map5, $elm$json$Json$Decode$map6,
F5( F6(
function (pull_request, release, status, title, branches) { function (pull_request, release, status, title, branches, error) {
return {aM: branches, aa: '', aA: false, P: pull_request, aU: release, aY: status, ao: title}; return {aM: branches, aa: error, ai: false, P: pull_request, aU: release, aY: status, ap: title};
}), }),
A2($elm$json$Json$Decode$field, 'pull_request', $elm$json$Json$Decode$int), A2($elm$json$Json$Decode$field, 'pull_request', $elm$json$Json$Decode$int),
A2($elm$json$Json$Decode$field, 'release', $elm$json$Json$Decode$string), A2($elm$json$Json$Decode$field, 'release', $elm$json$Json$Decode$string),
@ -6408,7 +6416,8 @@ var $author$project$Main$resultDecoder = A6(
A2( A2(
$elm$json$Json$Decode$field, $elm$json$Json$Decode$field,
'branches', 'branches',
$elm$json$Json$Decode$list($elm$json$Json$Decode$string))); $elm$json$Json$Decode$list($elm$json$Json$Decode$string)),
A2($elm$json$Json$Decode$field, 'error', $elm$json$Json$Decode$string));
var $author$project$Main$getResult = function (model) { var $author$project$Main$getResult = function (model) {
return $elm$http$Http$get( return $elm$http$Http$get(
{ {
@ -6416,6 +6425,23 @@ var $author$project$Main$getResult = function (model) {
cH: '/' + $elm$core$String$fromInt(model.P) cH: '/' + $elm$core$String$fromInt(model.P)
}); });
}; };
var $author$project$Main$httpErr = function (error) {
switch (error.$) {
case 0:
var url = error.a;
return 'Bad url: ' + url;
case 1:
return 'Timed out..';
case 2:
return 'Network error.. are you connected?';
case 3:
var status = error.a;
return 'Bad status: ' + $elm$core$String$fromInt(status);
default:
var body = error.a;
return 'Bad body: \'' + (body + '\'');
}
};
var $author$project$Main$update = F2( var $author$project$Main$update = F2(
function (msg, model) { function (msg, model) {
switch (msg.$) { switch (msg.$) {
@ -6423,14 +6449,18 @@ var $author$project$Main$update = F2(
return _Utils_Tuple2( return _Utils_Tuple2(
_Utils_update( _Utils_update(
model, model,
{aA: true}), {ai: true}),
$author$project$Main$getResult(model)); $author$project$Main$getResult(model));
case 1: case 1:
if (msg.a.$ === 1) { if (msg.a.$ === 1) {
var err = msg.a.a;
return _Utils_Tuple2( return _Utils_Tuple2(
_Utils_update( _Utils_update(
model, model,
{aa: 'Can\'t load data!'}), {
aa: 'Error: ' + $author$project$Main$httpErr(err),
ai: false
}),
$elm$core$Platform$Cmd$none); $elm$core$Platform$Cmd$none);
} else { } else {
var pr = msg.a.a; var pr = msg.a.a;
@ -7287,7 +7317,7 @@ var $rtfeldman$elm_css$Css$Structure$concatMapLastStyleBlock = F2(
var $elm$core$String$cons = _String_cons; var $elm$core$String$cons = _String_cons;
var $robinheghan$murmur3$Murmur3$HashData = F4( var $robinheghan$murmur3$Murmur3$HashData = F4(
function (shift, seed, hash, charsProcessed) { function (shift, seed, hash, charsProcessed) {
return {Y: charsProcessed, ad: hash, R: seed, aj: shift}; return {Y: charsProcessed, ad: hash, R: seed, ak: shift};
}); });
var $robinheghan$murmur3$Murmur3$c1 = 3432918353; var $robinheghan$murmur3$Murmur3$c1 = 3432918353;
var $robinheghan$murmur3$Murmur3$c2 = 461845907; var $robinheghan$murmur3$Murmur3$c2 = 461845907;
@ -7337,17 +7367,17 @@ var $robinheghan$murmur3$Murmur3$mix = F2(
}); });
var $robinheghan$murmur3$Murmur3$hashFold = F2( var $robinheghan$murmur3$Murmur3$hashFold = F2(
function (c, data) { function (c, data) {
var res = data.ad | ((255 & $elm$core$Char$toCode(c)) << data.aj); var res = data.ad | ((255 & $elm$core$Char$toCode(c)) << data.ak);
var _v0 = data.aj; var _v0 = data.ak;
if (_v0 === 24) { if (_v0 === 24) {
return { return {
Y: data.Y + 1, Y: data.Y + 1,
ad: 0, ad: 0,
R: A2($robinheghan$murmur3$Murmur3$mix, data.R, res), R: A2($robinheghan$murmur3$Murmur3$mix, data.R, res),
aj: 0 ak: 0
}; };
} else { } else {
return {Y: data.Y + 1, ad: res, R: data.R, aj: data.aj + 8}; return {Y: data.Y + 1, ad: res, R: data.R, ak: data.ak + 8};
} }
}); });
var $robinheghan$murmur3$Murmur3$hashString = F2( var $robinheghan$murmur3$Murmur3$hashString = F2(
@ -8259,7 +8289,7 @@ var $rtfeldman$elm_css$Css$Internal$lengthConverter = F3(
bo: 0, bo: 0,
ab: 0, ab: 0,
l: 0, l: 0,
ay: 0, az: 0,
ae: 0, ae: 0,
E: 0, E: 0,
af: 0, af: 0,
@ -8269,8 +8299,8 @@ var $rtfeldman$elm_css$Css$Internal$lengthConverter = F3(
x: 0, x: 0,
ah: 0, ah: 0,
G: numericValue, G: numericValue,
am: 0, an: 0,
ap: unitLabel, aq: unitLabel,
aI: units, aI: units,
z: _Utils_ap( z: _Utils_ap(
$elm$core$String$fromFloat(numericValue), $elm$core$String$fromFloat(numericValue),
@ -8293,10 +8323,10 @@ var $rtfeldman$elm_css$Css$cssFunction = F2(
var $rtfeldman$elm_css$Css$rgb = F3( var $rtfeldman$elm_css$Css$rgb = F3(
function (r, g, b) { function (r, g, b) {
return { return {
as: 1, at: 1,
au: b, av: b,
w: 0, w: 0,
ax: g, ay: g,
aD: r, aD: r,
z: A2( z: A2(
$rtfeldman$elm_css$Css$cssFunction, $rtfeldman$elm_css$Css$cssFunction,
@ -8436,6 +8466,16 @@ var $rtfeldman$elm_css$Html$Styled$Attributes$stringProperty = F2(
$elm$json$Json$Encode$string(string)); $elm$json$Json$Encode$string(string));
}); });
var $rtfeldman$elm_css$Html$Styled$Attributes$placeholder = $rtfeldman$elm_css$Html$Styled$Attributes$stringProperty('placeholder'); var $rtfeldman$elm_css$Html$Styled$Attributes$placeholder = $rtfeldman$elm_css$Html$Styled$Attributes$stringProperty('placeholder');
var $elm$virtual_dom$VirtualDom$style = _VirtualDom_style;
var $rtfeldman$elm_css$VirtualDom$Styled$style = F2(
function (key, val) {
return A3(
$rtfeldman$elm_css$VirtualDom$Styled$Attribute,
A2($elm$virtual_dom$VirtualDom$style, key, val),
false,
'');
});
var $rtfeldman$elm_css$Html$Styled$Attributes$style = $rtfeldman$elm_css$VirtualDom$Styled$style;
var $rtfeldman$elm_css$VirtualDom$Styled$UnscopedStyles = function (a) { var $rtfeldman$elm_css$VirtualDom$Styled$UnscopedStyles = function (a) {
return {$: 0, a: a}; return {$: 0, a: a};
}; };
@ -9073,16 +9113,6 @@ var $author$project$Main$makeRow = F2(
])) ]))
])); ]));
}); });
var $elm$virtual_dom$VirtualDom$style = _VirtualDom_style;
var $rtfeldman$elm_css$VirtualDom$Styled$style = F2(
function (key, val) {
return A3(
$rtfeldman$elm_css$VirtualDom$Styled$Attribute,
A2($elm$virtual_dom$VirtualDom$style, key, val),
false,
'');
});
var $rtfeldman$elm_css$Html$Styled$Attributes$style = $rtfeldman$elm_css$VirtualDom$Styled$style;
var $rtfeldman$elm_css$Html$Styled$table = $rtfeldman$elm_css$Html$Styled$node('table'); var $rtfeldman$elm_css$Html$Styled$table = $rtfeldman$elm_css$Html$Styled$node('table');
var $rtfeldman$elm_css$Html$Styled$ul = $rtfeldman$elm_css$Html$Styled$node('ul'); var $rtfeldman$elm_css$Html$Styled$ul = $rtfeldman$elm_css$Html$Styled$node('ul');
var $rtfeldman$elm_css$Html$Styled$li = $rtfeldman$elm_css$Html$Styled$node('li'); var $rtfeldman$elm_css$Html$Styled$li = $rtfeldman$elm_css$Html$Styled$node('li');
@ -9127,7 +9157,7 @@ var $author$project$Main$viewBranches = function (blist) {
])); ]));
}; };
var $author$project$Main$viewResult = function (data) { var $author$project$Main$viewResult = function (data) {
var _v0 = data.ao; var _v0 = data.ap;
if (_v0 === '') { if (_v0 === '') {
return $rtfeldman$elm_css$Html$Styled$text(''); return $rtfeldman$elm_css$Html$Styled$text('');
} else { } else {
@ -9168,7 +9198,7 @@ var $author$project$Main$viewResult = function (data) {
]), ]),
_List_fromArray( _List_fromArray(
[ [
$rtfeldman$elm_css$Html$Styled$text(data.ao) $rtfeldman$elm_css$Html$Styled$text(data.ap)
])) ]))
])) ]))
])), ])),
@ -9184,24 +9214,7 @@ var $author$project$Main$viewResult = function (data) {
return 'open'; return 'open';
} }
}()), }()),
$author$project$Main$viewBranches(data.aM), $author$project$Main$viewBranches(data.aM)
function () {
var _v2 = data.aa;
if (_v2 === '') {
return $rtfeldman$elm_css$Html$Styled$text('');
} else {
return A2(
$rtfeldman$elm_css$Html$Styled$span,
_List_fromArray(
[
A2($rtfeldman$elm_css$Html$Styled$Attributes$style, 'color', 'red')
]),
_List_fromArray(
[
$rtfeldman$elm_css$Html$Styled$text(data.aa)
]));
}
}()
])); ]));
} }
}; };
@ -9265,7 +9278,7 @@ var $author$project$Main$view = function (model) {
$rtfeldman$elm_css$Html$Styled$span, $rtfeldman$elm_css$Html$Styled$span,
_List_fromArray( _List_fromArray(
[ [
$rtfeldman$elm_css$Html$Styled$Attributes$hidden(!model.aA) $rtfeldman$elm_css$Html$Styled$Attributes$hidden(!model.ai)
]), ]),
_List_fromArray( _List_fromArray(
[$author$project$Main$loading])) [$author$project$Main$loading]))
@ -9277,10 +9290,27 @@ var $author$project$Main$view = function (model) {
[ [
$author$project$Main$viewResult(model) $author$project$Main$viewResult(model)
])) ]))
])) ])),
function () {
var _v0 = model.aa;
if (_v0 === '') {
return $rtfeldman$elm_css$Html$Styled$text('');
} else {
return A2(
$rtfeldman$elm_css$Html$Styled$span,
_List_fromArray(
[
A2($rtfeldman$elm_css$Html$Styled$Attributes$style, 'color', 'red')
]),
_List_fromArray(
[
$rtfeldman$elm_css$Html$Styled$text(model.aa)
]));
}
}()
]))) ])))
]), ]),
ao: 'pr-status' ap: 'pr-status'
}; };
}; };
var $author$project$Main$main = $elm$browser$Browser$document( var $author$project$Main$main = $elm$browser$Browser$document(

View File

@ -2,12 +2,12 @@ module Main exposing (Branches, Model, Status, main, resultDecoder, statusDecode
import Browser exposing (Document) import Browser exposing (Document)
import Css exposing (..) import Css exposing (..)
import Css.Animations exposing (keyframes, property) import Css.Animations exposing (keyframes)
import Html.Styled exposing (..) import Html.Styled exposing (..)
import Html.Styled.Attributes exposing (css, disabled, hidden, href, placeholder, style) import Html.Styled.Attributes exposing (css, href, placeholder, style)
import Html.Styled.Events exposing (onClick, onInput) import Html.Styled.Events exposing (onClick, onInput)
import Http import Http exposing (..)
import Json.Decode as Decode exposing (Decoder, field, int, list, map5, string) import Json.Decode as Decode exposing (Decoder, field, list, map6, string)
type Status type Status
@ -46,14 +46,33 @@ main =
} }
httpErr : Http.Error -> String
httpErr error =
case error of
BadUrl url ->
"Bad url: " ++ url
Timeout ->
"Timed out.."
NetworkError ->
"Network error.. are you connected?"
BadStatus status ->
"Bad status: " ++ String.fromInt status
BadBody body ->
"Bad body: '" ++ body ++ "'"
update : Msg -> Model -> ( Model, Cmd Msg ) update : Msg -> Model -> ( Model, Cmd Msg )
update msg model = update msg model =
case msg of case msg of
RunSearch -> RunSearch ->
( { model | loading = True }, getResult model ) ( { model | loading = True }, getResult model )
GotResult (Err _) -> GotResult (Err err) ->
( { model | error = "Can't load data!" }, Cmd.none ) ( { model | error = "Error: " ++ httpErr err, loading = False }, Cmd.none )
GotResult (Ok pr) -> GotResult (Ok pr) ->
( pr, Cmd.none ) ( pr, Cmd.none )
@ -135,6 +154,12 @@ view model =
[ viewResult model [ viewResult model
] ]
] ]
, case model.error of
"" ->
text ""
_ ->
span [ style "color" "red" ] [ text model.error ]
] ]
) )
] ]
@ -183,12 +208,6 @@ viewResult data =
"open" "open"
) )
, viewBranches data.branches , viewBranches data.branches
, case data.error of
"" ->
text ""
_ ->
span [ style "color" "red" ] [ text data.error ]
] ]
@ -226,14 +245,14 @@ getResult model =
resultDecoder : Decoder Model resultDecoder : Decoder Model
resultDecoder = resultDecoder =
map5 map6
(\pull_request release status title branches -> (\pull_request release status title branches error ->
{ pull_request = pull_request { pull_request = pull_request
, release = release , release = release
, status = status , status = status
, title = title , title = title
, branches = branches , branches = branches
, error = "" , error = error
, loading = False , loading = False
} }
) )
@ -242,6 +261,7 @@ resultDecoder =
(field "status" statusDecoder) (field "status" statusDecoder)
(field "title" string) (field "title" string)
(field "branches" (list string)) (field "branches" (list string))
(field "error" string)
statusDecoder : Decoder Status statusDecoder : Decoder Status