From c60b7b34759f866549752a97a83c12f04f8a903e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20H=C3=B6rnquist?= Date: Mon, 27 Jul 2020 00:06:31 +0200 Subject: Crash properly on overflow on remove event. --- module/entry-points/server.scm | 6 +++++- module/vcomponent.scm | 29 ++++++++++++++--------------- static/script.js | 12 +++++++----- 3 files changed, 26 insertions(+), 21 deletions(-) diff --git a/module/entry-points/server.scm b/module/entry-points/server.scm index 711119e4..5c3108cc 100644 --- a/module/entry-points/server.scm +++ b/module/entry-points/server.scm @@ -117,12 +117,16 @@ ;; It's hard to properly remove a file. I also want a way to undo accidental ;; deletions. Therefore I simply save the X-HNH-REMOVED flag to the file, and ;; then simple don't use those events when loading. + (catch 'stack-overflow (lambda () (remove-event it)) + (lambda _ + (display "It overflew...\n" (current-error-port)) + (return (build-response code: 500) + "It overflew again..."))) (set! (prop it 'X-HNH-REMOVED) #t) (set! (param (prop* it 'X-HNH-REMOVED) 'VALUE) "BOOLEAN") (unless ((@ (output vdir) save-event) it) (return (build-response code: 500) "Saving event to disk failed.")) - (remove-event it) (return (build-response code: 204) "")) (return (build-response code: 400) (format #f "No event with UID '~a'" uid)))) diff --git a/module/vcomponent.scm b/module/vcomponent.scm index 215ab984..2e13f1c8 100644 --- a/module/vcomponent.scm +++ b/module/vcomponent.scm @@ -105,23 +105,22 @@ (define-public (remove-event event) - - (let ((events (getf 'events))) - (setf 'events (delete event events))) + (let ((events (delete event (getf 'events)))) + (setf 'events events)) (if (repeating? event) - (let ((repeating (getf 'repeating-events))) - (setf 'repeating-events (delete event repeating))) - (let ((regular (getf 'fixed-events))) - (setf 'fixed-events (delete event regular)))) - - (let ((event-set (getf 'event-set))) - (setf 'event-set - (stream-remove - (lambda (ev) - (equal? (prop ev 'UID) - (prop event 'UID))) - event-set))) + (let ((repeating (delete event (getf 'repeating-events)))) + (setf 'repeating-events repeating)) + (let ((regular (delete event (getf 'fixed-events)))) + (setf 'fixed-events regular))) + + (let ((event-set + (stream-remove + (lambda (ev) + (equal? (prop ev 'UID) + (prop event 'UID))) + (getf 'event-set)))) + (setf 'event-set event-set)) (hash-set! (getf 'uid-map) (prop event 'UID) #f)) diff --git a/static/script.js b/static/script.js index 0f0775fb..35e927f5 100644 --- a/static/script.js +++ b/static/script.js @@ -151,6 +151,7 @@ class EventCreator { /* [0, 1) -- where are we in the container */ /* Ronud to force steps of quarters */ + /* TODO possibly have floor_time instead */ let time = round_time(pos_in(this, e), round_to); event.dataset.time1 = time; @@ -246,13 +247,14 @@ async function remove_event (element) { }); console.log(response); + toggle_child_popup(element); + if (response.status < 200 || response.status >= 300) { - alert(`Error removing event ${response.status}\n${response.statusText}`) + let body = await response.text(); + alert(`HTTP error ${response.status}\n${body}`) + } else { + element.remove(); } - - toggle_child_popup(element); - element.style.background = "black !important"; - element.style.color = "black !important"; } var bar_object = false -- cgit v1.2.3