messages: Add download-mbox.
[software/mumi.git] / mumi / messages.scm
index a1b88051bf395adb1d31135a816e290f5b513d82..a93bd2b9e935147e5e924fcc5e43593378e903df 100644 (file)
@@ -184,6 +184,41 @@ symbol 'email)."
                           '()))))
     (http-get uri #:streaming? #t #:headers headers)))
 
+(define* (download-mbox bug-id)
+  "Download the mbox of bug BUG-ID and store it in the mail directory
+if it's not already there.  If the file already exists only download
+the difference by providing the current file size as an offset."
+  (let* ((file-name (bug-id->mbox-file bug-id))
+         (offset (and (file-exists? file-name)
+                      (stat:size (stat file-name))))
+         (mtime  (and (file-exists? file-name)
+                      (stat:mtime (stat file-name)))))
+    (format (current-error-port)
+            "downloading ~a~%" file-name)
+    (call-with-values
+        (lambda ()
+          (fetch-mbox* (%config 'debbugs)
+                       bug-id
+                       ;; TODO: This doesn't work when
+                       ;; using Guile's web client, but
+                       ;; it works with wget.  #:offset
+                       ;; offset
+                       #:mdate
+                       (and mtime
+                            (time-monotonic->date
+                             (make-time time-monotonic 0 mtime)))))
+      (lambda (response port)
+        (if port
+            (begin
+              ;; TODO: append when using offset
+              (with-output-to-file file-name
+                (lambda ()
+                  (put-bytevector (current-output-port)
+                                  (get-bytevector-all port))))
+              (close-port port)
+              file-name)
+            #f)))))
+
 
 ;; We would like to use get-bug-log here, but it often returns
 ;; truncated messages.  This is a known bug upstream.