diff --git a/Makefile b/Makefile index c8491ab..0a6b287 100644 --- a/Makefile +++ b/Makefile @@ -14,4 +14,5 @@ append: clean: rm -f index.html + rm -f *.bak diff --git a/pr-status.pl b/pr-status.pl index c864e2d..8eaceb5 100755 --- a/pr-status.pl +++ b/pr-status.pl @@ -12,6 +12,7 @@ use Git; use JSON qw( from_json ); use Mojolicious::Lite -signatures; use Mojo::IOLoop; +use Mojo::Exception qw(check raise); use Time::HiRes qw( time ); my $VERSION = 'v0.0.1'; @@ -47,7 +48,8 @@ Mojo::IOLoop->recurring( sub get_commit { 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" ); my $commit = $repo->command( 'rev-parse', 'HEAD' ); my $log = $repo->command( 'log', '-n', '1', '--pretty=format:%s' ); @@ -169,7 +171,12 @@ get '/:pr' => sub ($c) { 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 $list = check_nixpkg_branches $commit; @@ -184,7 +191,8 @@ get '/:pr' => sub ($c) { status => $status->{state}, release => $release, status_info => $status->{info}, - queryTime => sprintf( "%2f", $end - $start ) + 0.0 + queryTime => sprintf( "%2f", $end - $start ) + 0.0, + error => $error }; $c->render( json => $result ); @@ -994,11 +1002,11 @@ function _Debug_crash_UNUSED(identifier, fact1, fact2, fact3, fact4) 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); currNode = nextNode; _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 $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$none = $elm$core$Platform$Cmd$batch(_List_Nil); 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$int = _Json_decodeInt; 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 $elm$json$Json$Decode$andThen = _Json_andThen; var $elm$json$Json$Decode$fail = _Json_fail; @@ -6395,11 +6403,11 @@ var $author$project$Main$statusDecoder = A2( } }, $elm$json$Json$Decode$string); -var $author$project$Main$resultDecoder = A6( - $elm$json$Json$Decode$map5, - F5( - function (pull_request, release, status, title, branches) { - return {aM: branches, aa: '', aA: false, P: pull_request, aU: release, aY: status, ao: title}; +var $author$project$Main$resultDecoder = A7( + $elm$json$Json$Decode$map6, + F6( + function (pull_request, release, status, title, branches, error) { + 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, 'release', $elm$json$Json$Decode$string), @@ -6408,7 +6416,8 @@ var $author$project$Main$resultDecoder = A6( A2( $elm$json$Json$Decode$field, '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) { return $elm$http$Http$get( { @@ -6416,6 +6425,23 @@ var $author$project$Main$getResult = function (model) { 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( function (msg, model) { switch (msg.$) { @@ -6423,14 +6449,18 @@ var $author$project$Main$update = F2( return _Utils_Tuple2( _Utils_update( model, - {aA: true}), + {ai: true}), $author$project$Main$getResult(model)); case 1: if (msg.a.$ === 1) { + var err = msg.a.a; return _Utils_Tuple2( _Utils_update( model, - {aa: 'Can\'t load data!'}), + { + aa: 'Error: ' + $author$project$Main$httpErr(err), + ai: false + }), $elm$core$Platform$Cmd$none); } else { 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 $robinheghan$murmur3$Murmur3$HashData = F4( 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$c2 = 461845907; @@ -7337,17 +7367,17 @@ var $robinheghan$murmur3$Murmur3$mix = F2( }); var $robinheghan$murmur3$Murmur3$hashFold = F2( function (c, data) { - var res = data.ad | ((255 & $elm$core$Char$toCode(c)) << data.aj); - var _v0 = data.aj; + var res = data.ad | ((255 & $elm$core$Char$toCode(c)) << data.ak); + var _v0 = data.ak; if (_v0 === 24) { return { Y: data.Y + 1, ad: 0, R: A2($robinheghan$murmur3$Murmur3$mix, data.R, res), - aj: 0 + ak: 0 }; } 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( @@ -8259,7 +8289,7 @@ var $rtfeldman$elm_css$Css$Internal$lengthConverter = F3( bo: 0, ab: 0, l: 0, - ay: 0, + az: 0, ae: 0, E: 0, af: 0, @@ -8269,8 +8299,8 @@ var $rtfeldman$elm_css$Css$Internal$lengthConverter = F3( x: 0, ah: 0, G: numericValue, - am: 0, - ap: unitLabel, + an: 0, + aq: unitLabel, aI: units, z: _Utils_ap( $elm$core$String$fromFloat(numericValue), @@ -8293,10 +8323,10 @@ var $rtfeldman$elm_css$Css$cssFunction = F2( var $rtfeldman$elm_css$Css$rgb = F3( function (r, g, b) { return { - as: 1, - au: b, + at: 1, + av: b, w: 0, - ax: g, + ay: g, aD: r, z: A2( $rtfeldman$elm_css$Css$cssFunction, @@ -8436,6 +8466,16 @@ var $rtfeldman$elm_css$Html$Styled$Attributes$stringProperty = F2( $elm$json$Json$Encode$string(string)); }); 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) { 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$ul = $rtfeldman$elm_css$Html$Styled$node('ul'); 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 _v0 = data.ao; + var _v0 = data.ap; if (_v0 === '') { return $rtfeldman$elm_css$Html$Styled$text(''); } else { @@ -9168,7 +9198,7 @@ var $author$project$Main$viewResult = function (data) { ]), _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'; } }()), - $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) - ])); - } - }() + $author$project$Main$viewBranches(data.aM) ])); } }; @@ -9265,7 +9278,7 @@ var $author$project$Main$view = function (model) { $rtfeldman$elm_css$Html$Styled$span, _List_fromArray( [ - $rtfeldman$elm_css$Html$Styled$Attributes$hidden(!model.aA) + $rtfeldman$elm_css$Html$Styled$Attributes$hidden(!model.ai) ]), _List_fromArray( [$author$project$Main$loading])) @@ -9277,10 +9290,27 @@ var $author$project$Main$view = function (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( diff --git a/src/Main.elm b/src/Main.elm index 12b2554..9ccc27d 100644 --- a/src/Main.elm +++ b/src/Main.elm @@ -2,12 +2,12 @@ module Main exposing (Branches, Model, Status, main, resultDecoder, statusDecode import Browser exposing (Document) import Css exposing (..) -import Css.Animations exposing (keyframes, property) +import Css.Animations exposing (keyframes) 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 Http -import Json.Decode as Decode exposing (Decoder, field, int, list, map5, string) +import Http exposing (..) +import Json.Decode as Decode exposing (Decoder, field, list, map6, string) 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 = case msg of RunSearch -> ( { model | loading = True }, getResult model ) - GotResult (Err _) -> - ( { model | error = "Can't load data!" }, Cmd.none ) + GotResult (Err err) -> + ( { model | error = "Error: " ++ httpErr err, loading = False }, Cmd.none ) GotResult (Ok pr) -> ( pr, Cmd.none ) @@ -135,6 +154,12 @@ view model = [ viewResult model ] ] + , case model.error of + "" -> + text "" + + _ -> + span [ style "color" "red" ] [ text model.error ] ] ) ] @@ -183,12 +208,6 @@ viewResult data = "open" ) , 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 = - map5 - (\pull_request release status title branches -> + map6 + (\pull_request release status title branches error -> { pull_request = pull_request , release = release , status = status , title = title , branches = branches - , error = "" + , error = error , loading = False } ) @@ -242,6 +261,7 @@ resultDecoder = (field "status" statusDecoder) (field "title" string) (field "branches" (list string)) + (field "error" string) statusDecoder : Decoder Status