;;; Copyright © 2015 David Thompson ;;; ;;; This program is free software; you can redistribute it and/or ;;; modify it under the terms of the GNU General Public License as ;;; published by the Free Software Foundation; either version 3 of the ;;; License, or (at your option) any later version. ;;; ;;; This program is distributed in the hope that it will be useful, ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ;;; General Public License for more details. ;;; ;;; You should have received a copy of the GNU General Public License ;;; along with this program. If not, see ;;; . (define-module (dotfiles) #:use-module (ice-9 ftw) #:use-module (ice-9 i18n) #:use-module (ice-9 match) #:use-module (ice-9 regex) #:use-module (srfi srfi-1) #:use-module (srfi srfi-11) #:use-module (srfi srfi-26) #:export (install-dotfiles)) (define (recursive-scandir dir) "Return a list of all the file names in DIR, recursively." (define (components file) (string-split file #\/)) (define suffix (let ((prefix-length (length (components dir)))) (lambda (file) (string-join (drop (components file) prefix-length) "/")))) (define enter? (const #t)) ;; Ignore the backup files that Emacs makes. (define ignore? (let ((patterns (map make-regexp '("~$" "^\\.#" "^#")))) (lambda (file) (let ((base (basename file))) (any (cut regexp-exec <> base) patterns))))) (define (leaf name stat result) (if (ignore? name) result (cons (suffix name) result))) ;; No-op (define (down name stat result) result) (define (up name stat result) result) (define (skip name stat result) result) (define (error name stat errno result) result) (let-values (((files discard) (file-system-fold enter? leaf down up skip error '() dir))) (sort files string-locale