#-quicklisp (let ((quicklisp-init (merge-pathnames "quicklisp/setup.lisp" (user-homedir-pathname)))) (when (probe-file quicklisp-init) (load quicklisp-init))) (ql:quickload :loop :silent t) (in-package #:loop) (defun find-duplicate-mids () "Displays any duplicated message-ids across all group articles." (let ((mid-map (make-hash-table :test 'equal)) (found-dupes nil)) ;; collect all articles and group by message-id (loop for path in (in-groups (directory "**/*")) do (let* ((dir-list (pathname-directory path)) (g (when dir-list (str:trim (first (last dir-list))))) (i (pathname-name path)) (i-str (when i (str:trim i)))) ;; process numeric article files only (when (and g i-str (parse-integer i-str :junk-allowed t)) (let ((mid (ignore-errors (get-mid-from-path path)))) (when (and mid (> (length (str:trim mid)) 0)) ;; push the (group . article-number) pair into the hash map (push (cons g i-str) (gethash mid mid-map))))))) ;; remove duplicates (maphash (lambda (mid locations) (when (> (length locations) 1) (push (cons mid locations) found-dupes))) mid-map) ;; displays (when found-dupes (loop for (mid . locs) in found-dupes do (format t "message-id: ~a~%" mid) ;; sort by group (let ((sorted-locs (sort locs #'string-lessp :key #'car))) (loop for (g . i) in sorted-locs do (format t "~a/~a~%" g i))))))) (find-duplicate-mids)