aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHugo Hörnquist <hugo@lysator.liu.se>2020-08-13 10:36:47 +0200
committerHugo Hörnquist <hugo@lysator.liu.se>2020-08-13 10:36:47 +0200
commit4ffab9225cd618c2c9d2e95c06ef7b71c2dd5b11 (patch)
tree340ff56abbb289f9c1993500b307ec6ba21823f5
parento != a (diff)
downloadcalp-4ffab9225cd618c2c9d2e95c06ef7b71c2dd5b11.tar.gz
calp-4ffab9225cd618c2c9d2e95c06ef7b71c2dd5b11.tar.xz
Changing calendar now unlinks old file.
-rw-r--r--module/output/vdir.scm23
-rw-r--r--module/server/routes.scm27
2 files changed, 44 insertions, 6 deletions
diff --git a/module/output/vdir.scm b/module/output/vdir.scm
index cf4f6c8d..f23e0062 100644
--- a/module/output/vdir.scm
+++ b/module/output/vdir.scm
@@ -22,12 +22,29 @@
[(vdir)
(let* ((uid (or (prop event 'UID) (uuidgen))))
- (set! (prop event 'UID) uid)
- (with-atomic-output-to-file
- (string-append (prop calendar '-X-HNH-DIRECTORY) / uid ".ics")
+ (set! (prop event 'UID) uid
+ ;; TODO use existing filename if present?
+ (prop event '-X-HNH-FILENAME) (string-append
+ (prop calendar '-X-HNH-DIRECTORY)
+ / uid ".ics"))
+ (with-atomic-output-to-file (prop event '-X-HNH-FILENAME)
(lambda () (print-components-with-fake-parent (list event))))
uid)]
[else
(error "Source of calendar unknown, aborting.")
]))
+
+
+(define-public (remove-event event)
+ (define calendar (parent event))
+ (case (prop calendar '-X-HNH-SOURCETYPE)
+ [(file)
+ (error "Removing events from large files unsupported")]
+
+ [(vdir)
+ (delete-file (prop event '-X-HNH-FILENAME))]
+
+ [else
+ (error "Source of calendar unknown, aborting.")
+ ]))
diff --git a/module/server/routes.scm b/module/server/routes.scm
index 3c03ae14..8d51fc22 100644
--- a/module/server/routes.scm
+++ b/module/server/routes.scm
@@ -219,6 +219,10 @@
[(get-event-by-uid global-event-object (prop event 'UID))
=> (lambda (old-event)
+ ;; procedure to run after save.
+ ;; used as hook to remove old event from disk below
+ (define after-save (const #f))
+
(if (eq? calendar (parent old-event))
(begin (vcomponent-update! old-event event)
;; for save below
@@ -226,9 +230,25 @@
;; change calendar
(begin
- ;; (remove-from-calendar! old-event)
- ;; TODO remove the old event from disk here
- (remove-event global-event-object old-event)
+
+ (format (current-error-port)
+ "Calendar change~%")
+
+ ;; remove from runtime
+ ((@ (vcomponent instance methods) remove-event)
+ global-event-object old-event)
+
+ ;; Actually puring the old event should be safe,
+ ;; since we first make sure we write the new event to disk.
+ ;; Currently the whole transaction isn't atomic, so a duplicate
+ ;; event can still be created.
+ (set! after-save
+ ;; remove from disk
+ (lambda ()
+ (format (current-error-port)
+ "Unlinking old event from ~a~%"
+ (prop old-event '-X-HNH-FILENAME))
+ ((@ (output vdir) remove-event) old-event)))
(parameterize ((warnings-are-errors #t))
(catch 'warning
@@ -244,6 +264,7 @@
(return (build-response code: 500)
"Saving event to disk failed."))
+ (after-save)
(format (current-error-port)
"Event updated ~a~%" (prop event 'UID)))]