37 lines
1.7 KiB
Common Lisp
37 lines
1.7 KiB
Common Lisp
#-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)
|