Function: nnir-run-find-grep
nnir-run-find-grep is a byte-compiled function defined in nnir.el.gz.
Signature
(nnir-run-find-grep QUERY SERVER &optional GROUPLIST)
Documentation
Run find and grep to QUERY GROUPLIST on SERVER for matching articles.
Source Code
;; Defined in /usr/src/emacs/lisp/obsolete/nnir.el.gz
(defun nnir-run-find-grep (query server &optional grouplist)
"Run find and grep to QUERY GROUPLIST on SERVER for matching articles."
(let* ((method (gnus-server-to-method server))
(sym (intern
(concat (symbol-name (car method)) "-directory")))
(directory (cadr (assoc sym (cddr method))))
(regexp (cdr (assoc 'query query)))
(grep-options (cdr (assoc 'grep-options query)))
(grouplist
(or grouplist (gnus-server-get-active server nnir-ignored-newsgroups))))
(unless directory
(error "No directory found in method specification of server %s"
server))
(apply
#'vconcat
(mapcar (lambda (x)
(let ((group x)
artlist)
(message "Searching %s using find-grep..."
(or group server))
(save-window-excursion
(set-buffer (gnus-get-buffer-create nnir-tmp-buffer))
(if (> gnus-verbose 6)
(pop-to-buffer (current-buffer)))
(cd directory) ; Using relative paths simplifies
; postprocessing.
(let ((group
(if (not group)
"."
;; Try accessing the group literally as
;; well as interpreting dots as directory
;; separators so the engine works with
;; plain nnml as well as the Gnus Cache.
(let ((group (gnus-group-real-name group)))
;; Replace cl-func find-if.
(if (file-directory-p group)
group
(if (file-directory-p
(setq group
(string-replace
"." "/"
group)))
group))))))
(unless group
(error "Cannot locate directory for group"))
(save-excursion
(apply
#'call-process "find" nil t
"find" group "-maxdepth" "1" "-type" "f"
"-name" "[0-9]*" "-exec"
"grep"
`("-l" ,@(and grep-options
(split-string grep-options "\\s-" t))
"-e" ,regexp "{}" "+"))))
;; Translate relative paths to group names.
(while (not (eobp))
(let* ((path (split-string
(buffer-substring
(point)
(line-end-position))
"/" t))
(art (string-to-number (car (last path)))))
(while (string= "." (car path))
(setq path (cdr path)))
(let ((group (mapconcat #'identity
;; Replace cl-func:
;; (subseq path 0 -1)
(let ((end (1- (length path)))
res)
(while
(>= (setq end (1- end)) 0)
(push (pop path) res))
(nreverse res))
".")))
(push
(vector (gnus-group-full-name group server) art 0)
artlist))
(forward-line 1)))
(message "Searching %s using find-grep...done"
(or group server))
artlist)))
grouplist))))