Improve mailman analysis.

This commit is contained in:
Dominik Pantůček 2023-04-08 17:48:45 +02:00
parent 6cf1cd66d1
commit 902ca13189
2 changed files with 46 additions and 13 deletions

View file

@ -29,13 +29,27 @@
mailman
(
*mailman-bin*
list-mailman-lists
list-mailman-list-members
load-mailman-list
load-mailman-lists
find-mailman-list
mailman-list-name
mailman-list-members
email-in-mailman-list?
add-email-to-mailman-list
remove-email-from-mailman-list
mailman-ensure-member
mailman-ensure-not-member
mailman-compare-members
mailman-sync-members
)
@ -153,20 +167,24 @@
(when (email-in-mailman-list? ml email)
(remove-email-from-mailman-list (mailman-list-name ml) email)))
;; Returns two values - missing members and surplus list members
(define (mailman-compare-members ml emails)
(let* ((mlemails (list->lset (mailman-list-members ml)))
(emails (list->lset emails))
(surplus (lset-subtract mlemails emails))
(missing (lset-subtract emails mlemails)))
(values missing surplus)))
;; Ensures given ML subscribers are exactly what is in emails list
(define (mailman-sync-members ml emails)
;; Ensure all emails in ml
(let loop ((emails emails))
(when (not (null? emails))
(let ((email (car emails)))
(mailman-ensure-member ml email)
(loop (cdr emails)))))
;; Go through all emails in ml and remove all not in emails list
(let loop ((ml-emails (mailman-list-members ml)))
(when (not (null? ml-emails))
(let ((email (car ml-emails)))
(when (not (member email emails))
(mailman-ensure-not-member ml email))
(loop (cdr ml-emails))))))
(define-values (missing surplus)
(mailman-compare-members ml emails))
(define listname (mailman-list-name ml))
(let loop ((emails missing))
(add-emails-to-mailman-list listname (car emails))
(loop (cdr emails)))
(let loop ((emails surplus))
(remove-email-from-mailman-list listname (car emails))
(loop (cdr loop))))
)